WTO MULTILINE

Todo lo relacionado con assembler, macros, etc.
Responder
ashram5885

WTO MULTILINE

Mensaje por ashram5885 » 30 Mar 2009, 06:33

Hola,

no se mucho de Assembler pero necesito realizar un WTO multiline y no acaba de funcionar. He mirado manuales por internet y no consigo que me funcione como yo quiero. La idea es que he de realizar una rutina que recibiendo un texto por parametro realice un WTO(multiline) a consola.
Todos los ejemplos que he visto en internet con WTO multiline lo hcen con un texto conocido, es decir, realizan el WTO del texto sabiendo que serán n lineas conocidas. A mi me gustaría que el WTO fuese dinámico, es decir, sin conocer a priori las lineas que va a ocupar. Bueno os adjunto el programa de test a ver si me podeis hechar una mano.
Bueno para realizar el test y simular que el texto sera variable me he declarado el texto como constantes que voy moviendo a unas variables para realizar el WTO, cuando tenga solucionado esl problema del WTO ya me preocupare del paso de parametros y del loop para hacer el wto multiline de todas las lineas. Por ahora lo único que quiero es soluciona el WTO multiline.

Código: Seleccionar todo

         TITLE 'WTO MULTILINE'
***********************************************************************
*
*
***********************************************************************
         EJECT
*
STSRD7   CEEENTRY PPA=STSPPA,AUTO=WORKSIZE,MAIN=NO,                    *
               BASE=8,PLIST=MVS,EXECOPS=NO
         SPACE 2
         USING WORKAREA,13
*
*----- 1-WTO SIMPLE Y DIRECTO
*
         WTO   'STSRD7I001-TEST WTO SIMPLE POR CONSTANTE.'
*
*----- 2-WTO UTLIZANDO SVC 35 CON TEXTO EN VARIABLE
*
         MVC   TEXTWTO(L'MSGTXT2),MSGTXT2
         LA    3,L'LONGWTO+L'FLAGWTO+L'MSGTXT2
         STH   3,LONGWTO
         LA    1,WTOAREA
         SVC 35
*
*----- 3-WTO UTLIZANDO MACRO WTO CON TEXTO EN VARIABLE
*
         MVC   TEXTWTO(L'MSGTXT3),MSGTXT3        *Move Texto 1
         LA    3,L'LONGWTO+L'FLAGWTO+L'MSGTXT3   *Long var buffer
         STH   3,LONGWTO                         *Move long buf. to var
         WTO   MF=(E,WTOAREA)                    *Wto
*
*----- 4-WTO UTLIZANDO MACRO WTO CON VARIABLE Y MULTILINEA
*
         MVC   TXTTEXT(L'MSGTXT4),MSGTXT4       *Move Texto 1
         LA    3,L'MSGTXT4                      *Long Texto 1
         STH   3,TXTLONG                        *Move long TXT
         SR    0,0                              *Limpia r0
         WTO   TEXT=(TXTAREA,D)
*
         ST    1,MSGID                          *Save ID MSG
         MVC   TXTTEXT(L'MSGTXT5),MSGTXT5       *Move Texto 2
         LA    3,L'MSGTXT5                      *Long Texto 2
         STH   3,TXTLONG                        *Move long TXT
         WTO   TEXT=(TXTAREA,ED),CONNECT=MSGID
*        WTO   (' ',E),CONNECT=MSGID            *Fin MSG
*
TERM     CEETERM RC=0
         EJECT
**********************************************************************
*
*        CONSTANTS DE PROGRAMA.
*
**********************************************************************
         SPACE 2
         DS 0D
MSGTXT2  DC C'STSRD7I002-WTO VIA BUFFER AMB CRIDA A SVC.DIRECTO'
MSGTXT3  DC C'STSRD7I003-WTO VIA MACRO WTO DE LINEA SIMPLE. SIN PARAM._*
               ________________________________________________________*
               _____________________________________________________'
MSGTXT4  DC C'STSRD7I004-WTO MULTILINE. LINEA NUMERO 1.'
MSGTXT5  DC C'CONTINUACIO DEL MSG ID ANTERIOR NUMERO 2.'
MSGTXT6  DC C'CONTINUACIO DEL MSG ID ANTERIOR NUMERO 3.'
         SPACE 2
STSTOKEN DC F'0000'
DEST     DC F'2'
STSPPA   CEEPPA EPNAME=STSRD7,VER=01,REL=01,MOD=00
         LTORG
         EJECT
**********************************************************************
*
*        AREA DE TREBALL I SAVE AREA (DSA).
*
**********************************************************************
         SPACE 2
*
TXTAREA  EQU *
TXTLONG  DS H
TXTTEXT  DS CL72
*
MSGID    DS F
*
WTOAREA  EQU *
LONGWTO  DS H
FLAGWTO  DC H'0'
TEXTWTO  DS CL900
*
WORKAREA DSECT
*
         ORG *+CEEDSASZ
         DC  H'0'
         DS  0D
WORKSIZE EQU *-WORKAREA
         CEEDSA
         CEECAA
         CEEEDB
         EJECT
         END STSRD7
[/color]

Pues la ejecución de este programa me realiza bien los WTO's de los 3 primeros ejemplos pero el 4 que es el que me interesa no funciona, en este caso me abenda. He probado más de una combinación y no consigo que funcione. Si no le pongo el MSGID no abenda pero no me escribe cada linea por separado y no con un único identificador.

En los manuales los WTO que realizan, como he dicho antes, lo hacen en una misma linea de código porque ya saben cuantas lineas quieren escribir:

WTO TEXT=((REMIND1,D),(REMIND2,D),(REMIND3,DE))

Pero a mi no me sirve.

¿Alguien tiene un ejemplo propio que se parezca a lo que necesito?

Mucha Gracias de Antemano.

CarlosB
Usuario
Usuario
Mensajes: 6
Registrado: 19 Mar 2009, 10:41
País: Argentina
Ciudad: Buenos Aires
Ocupación: System Programmer

Re: WTO MULTILINE

Mensaje por CarlosB » 01 Abr 2009, 12:25

http://www.simotime.com/asm4wto1.htm#ExecuteFormat este link contine un ejemplo que creo que puede ayudarte ya que no cuento con ejemplo propio, hace ya mas de 15 años que no toco assembler :roll:

Avatar de Usuario
juancle
Usuario avanzado
Usuario avanzado
Mensajes: 39
Registrado: 15 Dic 2008, 20:32
País: Argentina
Ciudad: Vicente Lopez
Ocupación: System Programmer

Re: WTO MULTILINE

Mensaje por juancle » 04 Abr 2009, 14:09

Tengo un programa que hice ya hace bastante tiempo que hace un WTO multiple Line como en que necesitas.
Lo que no se es como atacharlo al foro en un mensaje.
Estuve viendo en las FAQs que tendria que entrar el el Panel del Usuario a Manejar los Adjuntos, pero no encuentro esa opcion
Si me mostras como hacerlo lo publico
Saludos
Juan

nlacabe

Re: WTO MULTILINE

Mensaje por nlacabe » 04 Abr 2009, 15:48

Hola, me parece que podrías utilizar la facilidad list-execute de las macros para resolver este problema.

Como cultura general, la forma list de la macro (MF=L) te genera un área de memoria con las definiciones "vacías" en un formato tipo Dummy Section, en la parte ejecutable del programa se define el formato execute de la macro (MF=E) que apunta a la dummy definida antes pasandole parametros.

En el problema que planteas creo que podrías definir un WTO MF=L con una cantidad muy grande de lineas predefinidas (por ejemplo 20), durante la ejecución al invocar la WTO MF=E, le pasás los textos y le ponés la "DE" en la linea que quieras, supongo que esto funcionaría, no lo he probado.

Saludos. Nestor.

ashram5885

Re: WTO MULTILINE

Mensaje por ashram5885 » 20 Abr 2009, 08:55

Muchas gracias a todos.
Estoy trabjando en ello, si lo consigo postearé la solución en este foro.
Gracias.

Avatar de Usuario
juancle
Usuario avanzado
Usuario avanzado
Mensajes: 39
Registrado: 15 Dic 2008, 20:32
País: Argentina
Ciudad: Vicente Lopez
Ocupación: System Programmer

Re: WTO MULTILINE

Mensaje por juancle » 26 Abr 2009, 23:02

Hola,
Aca te dejo el programa ejemplo para hacer un WTO multiple line.
Saludos
Juan

Código: Seleccionar todo

         MACRO
&NAME    MLWTO &WTOL,&TEXT=ª
         LCLA &CNT
         LCLA &I
         LCLA &ADR
         LCLC &AR14
         LCLC &A2R14
         AIF   ('&WTOL' EQ '' OR '&TEXT' EQ 'ª').MAL
         AIF   (N'&TEXT GT 10).MAL
&AR14    SETC  '(R14)'
&A2R14   SETC  '(2,R14)'
&CNT     SETA  N'&TEXT
&I       SETA  1
&ADR     SETA  -4
         XR    R0,R0                    CLEAR R0 BEFORE ML
         LA    R1,&WTOL                 LOAD ADDRESS EXECUTE LIST
         LA    R15,&TEXT(1)             LOAD ADDR OF TEXT LINE1
         ST    R15,4(0,R1)              STORE TEXT ADDR INTO PLIST
         LR    R14,R1                   FIRST BYTE OF PARM LIST
         SR    R15,R15                  CLEAR REGISTER 15
         AH    R15,0(R1,0)              ADD LENGTH OF TEXT + 4
         AR    R14,R15                  FIRST BYTE AFTER TEXT
         OI    4(R14),B'00000000'       UPDATE EXTENDED MCS FLAGS
         OI    5(R14),B'10000000'       UPDATE EXTENDED MCS FLAGS2
         XR    R15,R15                  CLEAR INDEX FOR INSERTS
         IC    R15,3(R14)               SET LENGTH OF WPX
         LA    R14,3(R15,R14)           POINT TO MULTILINE COUNTER
         MVI   0(R14),X'&CNT'           NUMERO DE LINEAS
         LA    R14,1(R14)               POINT TO MULTILINE ENTRIES
.LOOP    ANOP
&I       SETA  &I+1
&ADR     SETA  &ADR+8
         LA    R15,&TEXT(&I)              LOAD ADDR OF TEXT FIELD
         ST    R15,&ADR&AR14              STORE TEXT ADDR INTO PLIST
         AIF   (&I EQ &CNT).LAST
&ADR     SETA  &ADR-2
         MVC   &ADR&A2R14,=XL2'2000'      STORE LINE TYPE 'D'
&ADR     SETA  &ADR+2
         AGO   .LOOP
.LAST    ANOP
&ADR     SETA  &ADR-2
         MVC   &ADR&A2R14,=XL2'3000'      STORE LINE TYPE 'DE'
         SVC   35                         ISSUE SVC 35
         AGO   .CHAU
.MAL     ANOP
         MNOTE 12,'Se debe especificar entre 1 y 10 linas.'
.CHAU    ANOP
         MEND
WTOMLINE CSECT
         SAVE  (14,12),T,<<WTOMLINE-JUAN.ERANA-&SYSDATE>>
         BALR  R12,0
         USING *,R12
         LR    R5,R13         R5=Addr(SaveArea anterior)
         LA    R13,SAVE       R13=Addr(Esta SaveArea)
         ST    R13,8(R5)      Guardo Addr(Esta SaveArea) en la anterior
         ST    R5,SAVE+4      Guardo Addr(SaveArea anterior) en esta
*
* BEGIN
*
UNO      MLWTO PEPE,TEXT=(A1,A2,A3)
*
DOS      MLWTO PEPE,TEXT=(A5,A6,A7,A8,A9,A10)
*
* END
*
FIN      LH    R15,RETCODE
         L     13,SAVE+4          APUNTO SAVEAREA ANTERIOR
         RETURN (14,12),RC=(15)   VUELVO CON CODIGO DE RETORNO EN R15
         DS    0D
SAVE     DS    9D                 NUESTRA SAVEAREA
RETCODE  DC    H'0'
****
A1       DC    AL2(L'A1T)
A1T      DC    CL70'Linea 1 de hasta 70 caracteres ********************C
               ************ Fin A1'
A2       DC    AL2(L'A2T)
A2T      DC    CL70'Linea 2 de hasta 70 caracteres ********************C
               ************ Fin A2'
A3       DC    AL2(L'A3T)
A3T      DC    CL70'Linea 3 de hasta 70 caracteres ********************C
               ************ Fin A3'
A4       DC    AL2(L'A4T)
A4T      DC    CL70'Linea 4 de hasta 70 caracteres ********************C
               ************ Fin A4'
A5       DC    AL2(L'A5T)
A5T      DC    CL70'Linea 5 de hasta 70 caracteres ********************C
               ************ Fin A5'
A6       DC    AL2(L'A6T)
A6T      DC    CL70'Linea 6 de hasta 70 caracteres ********************C
               ************ Fin A6'
A7       DC    AL2(L'A7T)
A7T      DC    CL70'Linea 7 de hasta 70 caracteres ********************C
               ************ Fin A7'
A8       DC    AL2(L'A8T)
A8T      DC    CL70'Linea 8 de hasta 70 caracteres ********************C
               ************ Fin A8'
A9       DC    AL2(L'A9T)
A9T      DC    CL70'Linea 9 de hasta 70 caracteres ********************C
               ************ Fin A9'
A10      DC    AL2(L'A10T)
A10T     DC    CL70'Linea 10 de hasta 70 caracteres *******************C
               *********** Fin A10'
*
PEPE     WTO TEXT=((,D),(,D),(,D),(,D),(,D),(,D),(,D),(,D),(,D),(,DE)),C
               ROUTCDE=(2,11),DESC=(12),MF=L
         LTORG
*
R0       EQU   0
R1       EQU   1
R2       EQU   2
R3       EQU   3
R4       EQU   4
R5       EQU   5
R6       EQU   6
R7       EQU   7
R8       EQU   8
R9       EQU   9
R10      EQU   10
R11      EQU   11
R12      EQU   12
R13      EQU   13
R14      EQU   14
R15      EQU   15
*
         END  WTOMLINE

ashram5885

Re: WTO MULTILINE

Mensaje por ashram5885 » 28 Abr 2009, 12:19

Muchas Gracias Jauncle.
He de reconocer que con la macro que expones en tu programa he conseguido que me funcione el WTO Multiline.
Ahora solo he de adaptarlo a mi casuística.

Gracias de nuevo.

Responder