ADDFIELD program
* THIS WAS DEVELOPED ON Z390. TO USE IT IN AN MVS ENVIRONMENT,
* THE DCB'S WILL HAVE TO BE UPDATED. YOU'LL WANT TO TAKE THE
* RECFM + LRECL OFF THE //OUT FILE, SO THAT THE PGM CAN COPY
* THEM FROM THE //IN FILE. (TAKE 'EM OFF SYSIN TOO.)
* IF THERE ARE OTHER QUESTIONS, LET ME KNOW.
*
* YOU'LL ALSO WANT TO:
* REMOVE ALL THE WTO INSTRUCTIONS
* TAKE THE @@PAD STUFF OUT AT THE TNE. IT'S FOR TESTING.
* ADD A DCBD MACRO TO GET IHADCB LABELS.
*
* IN Z390, I NEED TO DO MOVE MODE READS. I THINK YOU CAN
* CHANGE THAT TO MACRF=GL IM MVS. IT SHOULD WORK JUST FINE.
*
* THE PUSH+POP PRINT STATEMENTS WERE SIMPLY TO SKIP THE DCB LABELS.
* YOU CAN REMOVE THEM. I WOULD BECAUSE I WANT TO SEE GENERATED CODE.
*
* OF LATE, I ALWAYS USE REG-13 AS BOTH BASE AND SAVE AREA AT THE
* START OF A PROGRAM. THAT DOES 2 THINGS:
* - SAVES A REG, WHICH ISN'T IMPORTANT TODAY, AND
* - MAKES LABEL OFFSETS MATCH PROGRAMLOCATIONS, WHICH I LIKE.
*
* C:\USERS\LIN\DOCUMENTS\Z390CODE\ADSTRING
*
ADDFIELD START 0
USING *,13
STM 14,12,12(13)
ST 15,8(13)
ST 13,4(15)
LA 13,0(15)
L R2,0(R1)
* PARM='C"DEF",32,X"D1D2D3"'
LH R1,0(R2)
SH R1,=H'1' Q. PARM FIELD?
BNM *+14 YES, GO SAVE IT
MVC PARM(5),=C'SYSIN' NO, ASSUME //SYSIN
B OPENSYSP
*
MVC PARM(0),2(R2)
EX R1,*-6
B OPENSYSP
DW DC D'0'
DC 02F'0' REST OF THE SAVE AREA.
*
PUSH PRINT
PRINT NOGEN
OPENSYSP MVC DCBMSG(8),DCBDDNAM-IHADCB+SYSPRINT
OPEN (SYSPRINT,OUTPUT)
BAL R9,PUTLINE
LA R1,SYSPRINT
BAL R9,LISTDCB
MVC DCBMSG(8),DCBDDNAM-IHADCB+IN
OPEN (IN,INPUT)
LA R1,IN
BAL R9,LISTDCB
POP PRINT
*
LH R3,DCBLRECL-IHADCB+IN
LR R4,R3
SLL R4,1
LA R0,4000(R4)
ST R0,LGETMAIN
*
GETMAIN R,LV=(0) GET A 32K INPUT BUFFER
ST R1,AGETMAIN AND A 32K OUTPUT BUFFER.
LA R14,0(R1,R3)
ST R14,ARECORD
LA R15,2000(R14)
ST R15,ALIST
A R1,LGETMAIN
ST R1,EGETMAIN
*
QSYSIN CLC =C'SYSIN',PARM PARM=SYSIN (OR NO PARM AT ALL)
BNE PARMBEG IMPLIES THAT THE CONTROL CARDS
MVC DCBMSG(8),DCBDDNAM-IHADCB+IN
OPEN (SYSIN,INPUT) WILL BE IN THE //SYSIN FILE.
LA R1,SYSIN
BAL R9,LISTDCB
MVC PARMWTO+4(5),=C'SYSIN'
GETIN1 GET SYSIN,PARM
CLI PARM,C'*'
BNH GETIN1
B PARMBEG OKAY, GO START PARM ANALYSIS
*
PARMBEG LA R8,PARM R8 = PARM
L R7,ALIST R7 = MVC LIST
*
PUT SYSPRINT,PARMWTO+4
B PARMLOOP
*
MORSYSIN TM DCBOFLGS-IHADCB+SYSIN,DCBOFOPN
BZ EOS
GET SYSIN,PARM
CLI PARM,C'*'
BNH MORSYSIN
CLI PARM,C' '
BNH MORSYSIN
*
PARMLOOP CLI 0(R8),C' ' END OF PARM? NOTE THAT THE PARM
BE MORSYSIN YES, TRY TO READ PROCESSING IS THE
CLI 0(R8),C'C' CHARACTER? NOTE THAT THE PARM
BE PARMCHAR YES, GO SAVE IT PROCESSING IS THE
CLI 0(R8),C'X' HEX? SAVE THAT MOST COMPLICATED PART
BE PARMHEX OF THIS PGM
CLI 0(R8),C'9' LENGTH OF
BH WHAT FILE TO COPY WHAT WE'LL DO IS CREATE
CLI 0(R8),C'0' BEFORE ADDING A TABLE THAT CONTAINS
BNL GETNUM FIELD. DATA LENGTH TO COPY,
CLC =C'SKIP=',0(R8)
BE SAVSKIP
WHAT CLC =C', ',0(R8) THIS INDICATES INTERSPERSED WITH
BE MORSYSIN THAT WE NEED SYSIN ENTRIES TO COPY CHAR
*
CLI 0(R8),C',' SOMETIMES WE OR HEX DATA FROM PARM.
BNE *+12 COME BACK AND
LA R8,1(R8) STILL POINT TO
B PARMLOOP THE END OF THE
CLI 1(R8),C',' PRIOR FIELD.
BNE *+12 -- FIX THAT --
LA R8,2(R8)
B PARMLOOP
BAL R14,BADPARM
* -----------------------------------------------
GETNUM LR R1,R8 FROM THE PARM, WE'LL EITHER
BAL R9,GET#1 HAVE A ## OF BYTES TO COPY,
SH R0,=H'1' OR A C"STRING" OR X"..."
BNM *+8
BAL R14,BADPARM
ST R0,0(R7) THIS SECTION DOES THE ## OF
MVI 0(R7),C'R' BYTES, AND WE INDICATE WITH
LA R7,4(R7) "R" THAT IT COMES FROM THE
MVI 0(R7),C'Z' INPUT RECORD, NOT THE PARM.
LA R8,1(R1)
B PARMLOOP
GET#1 SR R0,R0 CRAPPY % CONVERT, BECAUSE
IC R14,0(R1) I'M TOO LAZY TO
N R14,=F'15' WRITE A GOOD ONE.
MH R0,=H'10' IT'S ONLY USED A COUPLE
AR R0,R14 TIMES, SO WHO CARES!!!!
LA R1,1(R1)
CLI 0(R1),C'0'
BNL GET#1+2
BR R9
* -------------------------------------------
SAVSKIP LA R1,5(R8) WE WANT TO SKIP ## BYTES
CLI 0(R1),C'0' FROM THE INPUT FILE
BNL *+8
BAL R14,BADPARM
BAL R14,GET#1
ST R0,0(R7) SAVE THE ## TO SKIP
MVI 0(R7),C'S' AND THE 'SKIP' FLAG
LA R7,4(R7) BUMP REGS
LH R14,LLBB
SR R14,R1
STH R14,LLBB
LA R8,2(R1) AND LOOP.
B PARMLOOP
PARMCHAR CLI 1(R8),C'L'
BNE PARMC09
MVI 1(R7),C' '
PARMC01 MVI 0(R7),C'L' CL22,
LA R1,2(R8)
BAL R9,GET#1
LTR R0,R0
BZ CL00ERR
LH R14,LLBB
AR R14,R0
STH R14,LLBB
SH R0,=H'2'
STH R0,2(R7)
* ---------------------------------------------------------
CLI 0(R1),C',' THIS SECTION ALLOWS USER TO
BE PARMC08 SPECIFY C23, OR C23'R' TO
CLI 0(R1),C' ' SPECIFY THE CHAR TO INIT THE
BE PARMC08 SPACE.
CLI 0(R1),C'"' OR, X32, OR X32'C1' TO SPECIFY
BE PARMC03 THE HEX CHARACTER TO INIT THE
CLI 0(R1),C'''' SPACE.
BE PARMC03
BAL R14,BADPARM
*
PARMC03 CLI 0(R8),C'C' Q. CHAR?
BE PARMC07 YES, GO MOVE THAT CHAR.
TRT 1(2,R1),TESTHEX NO, TEST FOR GOOC HEX
BZ *+8
BAL R14,BADPARM
TR 1(2,R1),MAKEHEX TRANSLATE AND
PACK 12(2,R13),1(3,R1) PACK THE HEX TO 1 BYTE
MVC 1(1,R7),12(R13) AND MOVE TO LIST ENTRY
LA R1,4(R1) X23'AB' POINT TO 2ND QUOTE
B PARMC08 AND FINISH UP
*
PARMC07 MVC 1(1,R7),1(R1) SAVE CHAR
LA R1,3(R1) AND POINT TO 2ND QUOTE
* ---------------------------------------------------------
PARMC08 LA R7,4(R7) BUMP LIST ADDR
MVI 0(R7),C'Z' INDICATE END OF LIST
LA R8,1(R1) BUMP PAST COMMA
AP #FIELDS,=P'1' COUNT THE FIELD
B PARMLOOP AND LOOK FOR MORE.
* ---------------------------------------------------------
PARMC09 LA R3,1(R8) C'ABC' THIS IS THE C"STRING" STUFF.
PARMC10 LA R3,1(R3) WE SAVE IT
CLC SPACES(22),0(R3)
BE BADPARM
CLC 1(1,R8),0(R3)
BNE PARMC10
*
PARMC12 LR R4,R3 CALC LENGTH OF CHAR STRING
SR R4,R8
SH R4,=H'3' SUBT C" AND 1 MORE FOR EX
LA R1,2(R8) POINT TO CHAR STRING
QPSAV LA R14,9(R7,R4)
C R14,EGETMAIN
BNL TOOMANY
ST R4,0(R7) SAVE LENGTH IN LIST TABLE
MVC 4(0,R7),0(R1) SAVE IT
EX R4,*-6 (USE CORRECT LENGTH)
AP #FIELDS,=P'1' COUNT # FIELDS
MVI 0(R7),C'P' INDICATE THIS COMES FROM PARM
LA R8,2(R3) POINT TO NEXT PARM ..
LA R7,5(R7,R4) BUMP LIST POINTER
MVI 0(R7),C'Z' INDICATE END OF LIST
LH R2,LLBB LOAD VB LLBB LENGTH
LA R2,1(R4,R2) ADD LENGTH OF THIS STRING
STH R2,LLBB AND SAVE FOR I/O SECTION
QNEXTP CLC SPACES(12),0(R8) Q. END OF SELECT CRITERIA?
BNE PARMLOOP NO, LOOP.
B MORSYSIN
* --------------------------------------------------
PARMHEX MVI 1(R7),0
CLI 1(R8),C'L'
BE PARMC01
LA R3,2(R8) X"C1C2C3"
LA R4,12(R13)
LA R15,1(R4)
PARMHEXT TRT 0(2,R3),TESTHEX Q. VALID HEX? 2 BYTES AT A TIME
BZ *+8 YES.
BAL R14,BADHEX NO, ERROR
TR 0(2,R3),MAKEHEX MAKE IT HONEXT HEX
PACK 0(2,R4),0(3,R3) PACK IT TO 1 STRING BYTE
LA R3,2(R3) POINT TO NEXT PARM
LA R4,1(R4) AND NEXT DATA LOC
CLC SPACES(12),0(R3) Q. PREMATURE END?
BNE *+8 NO.
BAL R14,BADHEX YES, ERRORL
CLC 1(1,R8),0(R3) Q. END OF STRING?
BNE PARMHEXT NO, LOOP.
*
SR R4,R15 CALC DATA LENGTH-1
LA R1,12(R13)
B QPSAV
*
EOSM DC C'FIELD EXECUTE LIST USED ..... BYTES OF .,,.. AVAILABLE,X
GETMAIN LENGTH ....... '
EOS LR R0,R7
S R0,ALIST
CVD R0,12(R13)
L R0,ALIST
S R0,EGETMAIN
ST R0,LISTUSED
CVD R0,20(R13)
L R0,LGETMAIN
CVD R0,28(R13)
OI 19(R13),X'0F'
OI 27(R13),X'0F'
OI 35(R13),X'0F'
UNPK EOSM+24(5),17(3,R13)
UNPK EOSM+39(5),25(3,R13)
UNPK EOSM+71(7),32(4,R13)
MVC LINE(L'EOSM),EOSM
BAL R9,PUTLINE
*
PUSH PRINT
PRINT NOGEN
MVC DCBMSG(8),DCBDDNAM-IHADCB+OUT
OPEN (OUT,OUTPUT)
LA R1,OUT
BAL R9,LISTDCB
POP PRINT
B GET
* --------------------------------------
PUT L R2,AGETMAIN POINT TO NEW RECORD
TM DCBRECFM-IHADCB+OUT,X'80' RECFM=VB?
BO *+16 NO.
LH R0,0(R2) YES, ADD ## TO REC LEN
AH R0,LLBB
STH R0,0(R2)
*
PUT OUT,(2) WRITE
AP #RECORDS,=P'1' AND COUNT
*
GET L R2,ARECORD INPUT BUFFER
GET IN,(2) AND READ.
LH R5,DCBLRECL-IHADCB+IN LOAD LENGTH
TM DCBRECFM-IHADCB+IN,X'80' VB?
BO *+8 NO.
LH R5,0(R2) YES, LOAD FROM LLBB HEADER
LA R6,0(R2,R5) POIN TO END OF RECORD
*
L R3,AGETMAIN OUTPUT BUFFER
L R7,ALIST EXECUTE LIST TO MOVE FIELDS.
MOVELOOP CLI 0(R7),C'Z' Q. END OF LIST?
BE MOVEREST YES, MOVE THE REST OF THE DATA
CLI 0(R7),C'P' Q. DATA FROM PARM?
BE MOVEP YES, GO MOVE THAT.
CLI 0(R7),C'R' Q. DATA FROM INPUT RECORD?
BE MOVEREC YES, GO MOVE THAT.
CLI 0(R7),C'L'
BE MAKSTR
CLI 0(R7),C'S'
BE *+8
EX 0,* WE CANNOT GET HERE !!!!
*
AH R3,2(R7) NEW FEATURE, WE'RE GOING TO SKIP
LA R7,4(R7) THIS MANY RECORDS FROM THE INPUT
B MOVELOOP FILE. GEE, WASN'T THAT EASY.
*
* THIS SECTION PROCESSES CL## AND XL##, WHERE YOU WANT TO
* ADD A LONG STRING OF EITHER SPACES (CL##)
* OR HEX-ZEROS (XL##). NOTE THAT THE LENGTH THAT WAS SAVED
* IS THE LENGTH SPECIFIED -2. WE MOVE 1 CHAR RIGHT AWAY.
* THEN WE EXECUTE THE MVC. IF WE WANT 3 BYTES, THE LENGTH
* SAVED IS 1. WE MOVE THE FIRST CHAR. THEN WE PROPOGATE
* THAT CHAR 2 MORE TIMES, AND THE MVC INST LENGTH IS 1 LESS THAN
* THE ACTUAL LENGHT TO BE MOVED. YEAH, THIS TWISTS MY HEAD TOO!!
*
MAKSTR MVC 0(1,R3),1(R7)
LH R4,2(R7)
*
LA R0,1(R3,R4)
CR R0,R6
BNH MAKSTR2
LR R0,R5
SR R0,R3 LENGTH REMAINING
SH R0,=H'1' -1 FOR MVC INST
CR R4,R0
BNH MAKSTR2
O R7,=X'80000000'
LR R4,R0
AP #TRUNCAT,=P'1'
CLI DATATRUN,C' '
BE MAKSTR2
OI RC+1,4
MVI DATATRUN,C' '
MVC LINE(L'DATATRUN),DATATRUN
BAL R9,PUTLINE
B MAKSTR2
DATATRUN DC C'DATA WAS TRUNCATED FROM RECORDS'
*
LTR R4,R4
BNM MAKSTR2
*
LA R3,1(R3)
LA R7,4(R7)
*
MAKSTR2 CH R4,=H'255'
BL MAKSTR3
MVC 1(254,R3),0(R3)
LA R3,254(R3)
SH R4,=H'254'
B MAKSTR2
MVC 1(0,R3),0(R3)
MAKSTR3 EX R4,MAKSTR3-6
LA R3,2(R3,R4)
LTR R7,R7
BP PUT
LA R7,4(R7)
B MOVELOOP
*
* NOTE, WHEN WE MOVE FROM PARM DATA, IT'S NEVER LONG, SO WE JUST
* MOVE UP TO 255 BYTES.
* BUT WHEN WE MOVE FROM RECORD, IT CAN BE QUITE LONG, SO WE
* HAVE TO CHECK LENGTH, AND MOVE 256 BYTES AT A TIME, UNTIL
* WE GET DOWN BELOW 256 BYTES REMAINING.
*
MVC 0(0,R3),4(R7)
MOVEP LH R4,2(R7)
L R1,4(R7)
EX R3,MOVEP-6 MOVE PARM DATA
LA R3,1(R4,R3) BUMP OUTPUT RECORD LOC
CLI 8(R7),C'Y' Q. TRUNCATE RECORD?
BE PUT YES, JUST GO WRITE
LA R7,5(R7,R4) NO, BUMP EXECUTE LIST
B MOVELOOP AND MOVE NEXT BLOCK
*
MOVEREST LR R4,R6
SR R4,R2
B MOVEMORE
*
MOVEREC LH R4,2(R7)
*
* MOVEMORE CH R4,=H'12' THIS CODE TESTS MOVING
* BL MOVELAST PARTS OF A LONG RECORD.
* MVC 0(12,R3),0(R2) WE MOVE 12 BTES AT A TIME
* LA R3,12(R3) UNTIL WE HAVE LESS THAN
* LA R2,12(R2) 12 BYTES REMAINING.
* SH R4,=H'12' JUST TO MAKE SURE THAT THE
* BL PUT CODE TO MOVE SECTIONS WORKS RIGHT.
*
MOVEMORE CH R4,=H'256' Q. LESS THAN 256 BYTES?
BL MOVELAST YES, GO MOVE THAT.
MVC 0(256,R3),0(R2) NO, MOVE 256
LA R3,256(R3) BUMP FROM/TO
LA R2,256(R2) LOCATIONS, AND
SH R4,=H'256' DECREMENT LENGTH.
BL PUT Q. LENGTH=0, GO WRITE REC
B MOVEMORE NO, GO MOVE MORE DATA.
*
MVC 0(0,R3),0(R2) MOVE LESS THAN 256 BYTES
MOVELAST EX R4,MOVELAST-6 HERE, WITH EXECUTE INST
LA R3,1(R4,R3) BUMP OUTPUT BUFFER LOC
LA R2,1(R4,R2) BUMP INPUT BUGGER LOC
CLI 0(R7),C'W' Q. MORE DATA?
BH PUT NO, GO WRITE REC
LA R7,4(R7) BUMP EXECUTE LIST POINTER
B MOVELOOP AND GO MOVE MORE STUFF.
* --------------------------------------
DCBLIST DC A(SYSIN,IN,OUT,SYSPRINT),X'FF'
EDIT15 DC X'402020206B2020206B2020206B2020206B212020'
ENDMSG DC C' RECORDS COPIED, ... BYTES ADDED TO EACH, IN ... FIELDS.'
ENDREP MVC LINE(20),EDIT15
ED LINE(20),#RECORDS ALL DONE, WRITE PRETTY
LH R0,LLBB ADVERTISING MESSAGE
CVD R0,12(13) SO THAT THE BOSS
OI 19(13),X'0F' WILL CONTINUE TO PAY US.
UNPK ENDMSG+17(3),18(2,R13)
OI #FIELDS+1,X'0F'
UNPK ENDMSG+45(3),#FIELDS
MVC LINE+20(L'ENDMSG),ENDMSG
B PUTLINE
*
EOD BAL R9,ENDREP GO DO END REPORT
LM R0,R1,LGETMAIN
LTR R1,R1 Q. DID WE DO GETMAIN?
BZ NOFREE NO, DON'T DO FREEMAIN
FREEMAIN R,LV=(0),A=(1)
*
NOFREE LA R2,DCBLIST POINT TO DCB'S,
L R3,0(R2) TEST EACH ONE,
USING IHADCB,3 AND CLOSE THE ONES
TM DCBOFLGS,DCBOFOPN THAT ARE OPEN.
BZ NOCLO
CLOSE ((3))
DROP 3
NOCLO LA R2,4(R2)
CLI 0(R2),0
BE NOFREE+4
*
EXIT LH R15,RC PRETTY NORMAL
L 13,4(13) EXIT STUFF.
L 14,12(13)
LM 0,12,20(13)
BR 14
*
PUTLINE PUT SYSPRINT,LINE WRITE A LINE
* WTO MF=(E,LINE-5) AND WTO IT IN Z390.
MVC LINE,LINE-1
BR R9
*
CL00ERRM DC C'CANNOT SPECIFY CL00 OR XL00. '
CL00ERR MVC LINE+7(L'CL00ERRM),CL00ERRM
LA R1,LINE+7+L'CL00ERRM
B PUTERR
TOOMANYM DC C'TOO MANY ADD STRINGS, LIMIT=256 BYTES. AT='
TOOMANY MVC LINE+7(L'TOOMANYM),TOOMANYM
LA R1,LINE+7+L'TOOMANYM
B PUTERR
BADPARMM DC C'PARM ERROR =' THERE ARE A
BADPARM MVC LINE+7(L'BADPARMM),BADPARMM COUPLE DIFFERENT
LA R1,LINE+7+L'BADPARMM ERROR MSGS
B PUTERR FOR DIFFERENT ERRORS.
BADHEXM DC C'BAD HEX = IN PARM='
BADHEX MVC BADHEXM+9(2),0(R14) THEY ALL COME FROM
MVC LINE+7(L'BADHEXM),BADHEXM PARM/SYSIN STUFF.
LA R1,LINE+7+L'BADHEXM
* B PUTERR
*
PUTERR MVC 0(32,R1),0(R8) WE ALSO PRINT THE PGM LOCATION
LA R14,0(R14) FROM WHICH WE CAME, SO THAT I
SR R14,R13 CAN FIGURE OUT WHERE AN ERROR
ST R14,12(R13) OCCURRED, AND HOW TO FIX IT.
UNPK 20(9,R13),12(5,R13)
TR 20(8,R13),HEX-240
MVI LINE,C'('
MVC LINE+1(4),24(R13)
MVI LINE+5,C')'
BAL R9,PUTLINE
MVI RC+1,12 SET ERROR RETURN CODE
B EOD AND GO TO NORMAL EXIT.
HEX DC C'0123456789ABCDEF'
*
USING IHADCB,1
LISTDCB LH R0,DCBLRECL
CVD R0,DW
OI DW+7,X'0F'
UNPK DCBMSG+15(5),DW+5(3)
LH R0,DCBBLKSI
CVD R0,DW
OI DW+7,X'0F'
UNPK DCBMSG+29(5),DW+5(3)
UNPK DCBMSG+41(3),DCBRECFM(2)
TR DCBMSG+41(2),HEX-240
MVI DCBMSG+43,C' '
MVC LINE(L'DCBMSG),DCBMSG
B PUTLINE
DROP 1
DCBMSG DC C' LRECL=..... BLKSIZE=,,,,. RECFM= '
*
EXLST DC 0F'0',X'85',AL3(EXLST+4) THIS OPEN EXIT
PUSH USING COPIES LRECL
DROP 13 AND RECFM
USING *,15 FROM //IN TO
CLC =H'0',DCBLRECL-IHADCB+OUT //OUT
BNER 14 ADDING THE LENGTH
LH R1,DCBLRECL-IHADCB+IN OF THE FIELDS THAT
AH R1,LLBB WERE SPECIFIED.
STH R1,DCBLRECL-IHADCB+OUT
CLI DCBRECFM-IHADCB+OUT,0
BNER 14
MVC DCBRECFM-IHADCB+OUT,DCBRECFM-IHADCB+IN
BR 14
DROP 15
POP USING
*
PUSH PRINT
PRINT NOGEN
SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,RECFM=FB,LRECL=106
SYSIN DCB DDNAME=SYSIN,DSORG=PS,MACRF=GM,EODAD=EOS
IN DCB DDNAME=IN,DSORG=PS,MACRF=GM,EODAD=EOD
OUT DCB DDNAME=OUT,DSORG=PS,MACRF=PM,EXLST=EXLST
POP PRINT
*
LTORG
*
RC DC H'0'
LLBB DC F'0'
LGETMAIN DC A(32768*2+2000)
AGETMAIN DC F'0'
EGETMAIN DC F'0'
ARECORD DC F'0'
ALIST DC F'0'
LISTUSED DC F'0'
#RECORDS DC PL8'0'
#TRUNCAT DC PL8'0'
#FIELDS DC PL2'0'
*
DC H'90,0',C' '
LINE DC CL133'ADDFIELD, V02.03 ASM &SYSDATE &SYSTIME ADD COLS TOX
SEQ FILE'
*
PARMWTO DC H'90,0',C' PARM='
PARM DC CL101' '
*
* BY DOING STUPID STUFF, LIKE OVERLAPPING THE TR AND TRT TABLES,
* AND OVERLAYING THE CODE STARTING AT GETMAIN, WE KEEP THE
* PROGRAM LENGTH UNDER 3K. THAT'S WHAT US OLD FOLKS DO,
* JUMP THROUGH HOOPS TO SAVE A COUPLE BYTES. :-(
*
SPACES EQU *
TESTHEX EQU *-100
DC CL093' ',XL6'00',CL41' ',XL10'00'
*ESTHEX DC CL193' ',XL6'00',CL41' ',XL10'00'
MAKEHEX EQU *-193
DC AL1(10,11,12,13,14,15),CL41' ',AL1(0,1,2,3,4,5,6,7,8,9)
*
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 ADDFIELD