.TITLE PRECIS .IDENT -000500- .NLIST LOC,BIN ;+ ; ABSTRACT: PRECIS ; ; THIS PROGRAM WILL PRINT A DUMP OF THE CONTENTS OF A ; FILE. ITS OUTPUT FORMAT IS IN A MORE READABLE FORMAT ; THAN THAT OF ...DMP, BESIDES BEING ABLE TO HANDLE LARGER ; BLOCKS ON MAGNETIC TAPE THAN ...DMP CAN, AND BEING ABLE ; TO PRINT RECORD-ORIENTED DUMPS FOR DISK FILES. ; ; OPERATING PROCEDURES: ; ; THE PROGRAM IS INITIATED BY A "RUN PRECIS" COMMAND. THE COMMAND ; FORMAT IS: ; ; PRC>LISTFILE=INFILE/SWITCHES ; ---- ; ; LISTFILE IS THE LISTING FILE PRODUCED. ; INFILE IS THE FILE WHICH IS TO BE LISTED. ; ; THE LEGAL SWITCHES ARE: ; ; /EB INTERPRET FILE WITH EBCDIC CHARACTER CODES. ; THIS FORMAT IS USED PRIMARILY BY IBM AND ; THE IBM-COMPATIBLE PEOPLE, AND BY XDS. ; /BC INTERPRET FILE WITH BCD CHARACTER CODES. ; THIS FORMAT IS USED PRIMARILY BY CDC. ; /AS INTERPRET FILE WITH ASCII CHARACTER CODES. ; THIS FORMAT IS USED BY THE REST OF THE WORLD, ; AND IS THE DEFAULT. ; /RC:NN DUMP ONLY NN RECORDS. THIS IS SIMILAR ; TO THE /FI:NN SWITCH, BUT REFERS TO THE ; TOTAL NUMBER OF RECORDS DUMPED. ; /SK:NN SKIP FIRST NN RECORDS ; /RW REWIND THE DEVICE BEFORE DUMPING ; (MAGNETIC TAPE ONLY!) ; /SF:NN SKIP FIRST NN FILES ; (MAGNETIC TAPE ONLY!) ; /NF:NN DUMP ONLY NN FILES (OR /RC:NN RECORDS, ; WHICHEVER IS EXHAUSTED FIRST) ; (MAGNETIC TAPE ONLY!) ; /FI:NN DUMP ONLY FIRST NN RECORDS FOR EACH FILE. ; (MAGNETIC TAPE ONLY!) ; /EO STOP PROCESSING ON END-OF-VOLUME ; (TWO END-OF-FILE MARKERS IN A ROW) ; (DEFAULT) ; (IF NEGATED, WILL ONLY BE STOPPED BY ; /NF: OR /RC: SWITCHES) ; (MAGNETIC TAPE ONLY!) ; /HE GET HELP EXPLANATION OF SWITCHES ; /PS:NN SET PAGE SIZE TO NN ; ; THE SWITCHES ARE PROCESSED FROM THOSE WHICH HAVE THE MOST ; GLOBAL IMPLICATIONS TO THOSE WHICH HAVE THE LEAST GLOBAL ; IMPLICATIONS. THEREFORE, THE ORDER IN WHICH THE SWITCHES ; ARE PROCESSED (ASSUMING, OF COURSE, THAT THEY ARE ; SPECIFIED IN THE USER'S COMMAND LINE), IS: ; ; /RW - REWIND VOLUME ; /SF - SKIP FILES ; /SK - SKIP RECORDS ; /NF, /RC, /FI, /EO - LIMITS ON NUMBER OF RECORDS ; OR FILES TO BE DUMPED. ; ; THUS, IF A COMMAND SPECIFYING ALL OF THE POSITIONING ; SWITCHES IS USED, THE PROGRAM WILL REWIND THE VOLUME, ; THEN SKIP THE SPECIFIED NUMBER OF FILES, THEN SKIP THE ; SPECIFIED NUMBER OF BLOCKS PAST THAT FILE, AND THEN ; DUMP ONLY AS MANY RECORDS (OR FILES) AS ARE SPECIFIED. ; ; WRITTEN: 19-NOV-78, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED: 21-MAY-79, -0.1.0-, BRUCE C. WRIGHT ; ADDED /RC AND /SK SWITCHES ; MODIFIED: 08-JUN-79, -0.2.0-, BRUCE C. WRIGHT ; ADDED /RW, /SF, /EO, /NF, AND /HE SWITCHES ; FIXED BUG INTRODUCED IN 0.1.0 ; MODIFIED: 22-JUL-79, -0.3.0-, BRUCE C. WRIGHT ; ADDED /FI AND /PS SWITCHES ; MODIFIED: 21-FEB-80, -0.4.0-, BRUCE C. WRIGHT ; DIRECT ACCESS DEVICES IN IMAGE MODE ONLY DUMP ; 512. BYTE RECORDS; VARIOUS BUG FIXES ; Modified: 09-Jul-1981, -0.5.0-, Bruce C. Wright ; Changed to use FD.SQD rather than UC.SQD which ; isn't available on all systems. Also changed buffer size. ; Verified: 09-Jul-1981, -0.5.0-, Bruce C. Wright ;- .LIST LOC,BIN ; .SBTTL MACRO CALLS .MCALL EXIT$S,QIOW$,ALUN$S,GTIM$,DIR$,GLUN$S .MCALL OPEN$,CLOSE$,FINIT$ .MCALL PUT$,GET$ .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2,CSI$SW,CSI$ND,CSI$SV .MCALL FDAT$R,FDRC$R,FDOP$R,FDBF$R,FDBK$R .MCALL FSRSZ$,FDBDF$,NMBLK$,BDOFF$ .MACRO ONERR ARG BCC .+6 JMP ARG .ENDM .MACRO PRINT BUF,LEN MOV BUF,-(SP) MOV LEN,-(SP) CALL $PRINT .ENDM .MACRO ERROR STRING,LEN,SEV MOV STRING,R0 MOV LEN,R1 .IF IDN , CLR R2 .IFF MOV #-1,R2 .ENDC JMP CMDQIO .ENDM CMDLUN = 1 INPLUN = 2 OUTLUN = 3 ERRLUN = 4 DIRLUN = 5 ;LUN FOR DIRECTORY I/O .SBTTL PARAMETER SYMBOL DEFINITIONS BDOFF$ DEF$L .SBTTL READ A COMMAND LINE .PSECT CODE,RO,I START: FINIT$ MOV SP,SPSAVE BEGIN: MOV SPSAVE,SP GCML$ #CMLBLK ;GET COMMAND LINE BCC GETOK ;SKIP IF GOTTEN OK. CMPB CMLBLK+G.ERR,#GE.IOR BEQ CMDERR ;I/O ERROR CMPB CMLBLK+G.ERR,#GE.OPR BEQ CMDOPE ;OPEN ERROR CMPB CMLBLK+G.ERR,#GE.BIF BEQ CMDSYN ;SYNTAX ERROR CMPB CMLBLK+G.ERR,#GE.MDE BEQ CMDMAX ;MAX @ FILE DEPTH CMPB CMLBLK+G.ERR,#GE.EOF BNE CMDUNK ;EOF ON COMMAND FILE EXIT$S CMDERR: ERROR #M.ERR,#L.ERR,FATAL CMDOPE: ERROR #M.OPE,#L.OPE,CONT CMDSYN: ERROR #M.SYN,#L.SYN,CONT CMDMAX: ERROR #M.MAX,#L.MAX,CONT CMDPS1: ERROR #M.PS1,#L.PS1,CONT CMDPS2: ERROR #M.PS2,#L.PS2,CONT CMDUNK: ERROR #M.UNK,#L.UNK,FATAL CMDQIO: MOV R0,$QIOW+Q.IOPL+0 MOV R1,$QIOW+Q.IOPL+2 MOV #$QIOW,-(SP) CALL .DIRDL MOV #INFDB,R0 ;GET INPUT FDB CALL CLOSE ;CLOSE IT MOV #OUTFDB,R0 ;GET OUTPUT FDB CALL CLOSE ;CLOSE IT TST R2 ;LEAVE YET? BEQ BEGIN ;NO EXIT$S GETOK: TST CMLBLK+G.CMLD BEQ BEGIN MOV #SW.DEF,SWORD ;SET UP DEFAULT SWITCHES. MOV #55.,PAGESZ ;SET UP DEFAULT PAGESIZE. CSI$1 #CSIBLK,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCS CMDPS1 BITB #CS.EQU,CSIBLK+C.STAT ;WAS AN = SEEN? BNE 7$ ;YES -- PROCESS NORMALLY. CSI$2 #CSIBLK,OUTPUT,#CSITAB ;GET THE OUTPUT SPECIFICATION. BCS CMDPS2 ;ANY ILLEGAL SWITCHES? BIT #SW.HE,SWORD ;WAS /HE SWITCH SPECIFIED? BEQ CMDPS1 ;NO -- SYNTAX ERROR BITB #CS.EQU!CS.NMF!CS.DIF!CS.DVF!CS.WLD!CS.MOR,CSIBLK+C.STAT BNE 2$ ;ERROR TO HAVE ANYTHING BUT /HE BIT #^C,SWORD ;CANNOT SPECIFY ANYTHING BUT /HE BEQ 3$ ;OK 2$: ERROR #M.HLP,#L.HLP,CONT ;ELSE ERROR 3$: MOV #HLPLST,R1 ;GET LIST OF HELP MESSAGES 4$: MOV (R1)+,R2 ;GET A MESSAGE ADDRESS MOV R2,$QIOW+Q.IOPL ;SET THE BUFFER ADDRESS SUB (R1),R2 ;COMPUTE -LENGTH(BUFFER) NEG R2 ;COMPUTE LENGTH (BUFFER) MOV R2,$QIOW+Q.IOPL+2 ;SET BUFFER LENGTH MOV #$QIOW,-(SP) ;DPB TO STACK CALL .DIRDL ;DO THE I/O TST 2(R1) ;TO END OF LIST? BNE 4$ ;NO, KEEP LOOPING JMP BEGIN ;AND LOOP. 7$: CSI$2 #CSIBLK,INPUT,#CSITAB BCS CMDPS2 BITB #CS.WLD,CSIBLK+C.STAT BNE CMDPS1 BITB #CS.MOR,CSIBLK+C.STAT BEQ 9$ ;SKIP ON NO ERRORS JMP CMDPS1 ; 9$: CLR R3 ;ASSUME THAT THIS IS FILE MODE. TST CSIBLK+C.DIRD ;WAS A DIRECTORY SPECIFIED FOR IMAGE MODE? BNE 10$ ;YES -- NOT IMAGE MODE. TST CSIBLK+C.FILD ;HOW ABOUT A FILE NAME? BNE 10$ ;YES -- NOT IMAGE MODE. MOV #1,R3 ;SHOW THAT THIS IS TO BE "IMAGE" MODE. 10$: MOV #INFDB,R0 ;GET INPUT FDB. MOV #FO.RD,R1 ;GET THE DIRECTION MOV #INPLUN,R2 ;GET THE LUN. CALL OPEN ;"OPEN" THE FILE. ; CSI$2 #CSIBLK,OUTPUT,#CSITAB BCC 14$ JMP CMDPS2 14$: BITB #CS.WLD,CSIBLK+C.STAT BEQ 15$ ;SKIP ON NO ERRORS. JMP CMDPS1 ; 15$: BITB #CS.MOR,CSIBLK+C.STAT BEQ 16$ ;SKIP IF NO ERRORS. JMP CMDPS1 ;ERROR - PRINT MESSAGE 16$: BIT #SW.EB!SW.BC,SWORD ;NON-STANDARD TRANSLATIONS GIVEN? BNE 20$ ;YES - SKIP. BIS #SW.AS,SWORD ;NO - SET DEFAULT TRANSLATION. 20$: MOV SWORD,R0 ;GET SWITCHES INTO R0 BIC #^C,R0 ;CLEAN OFF ALL BUT TRANSLATIONS CLR R1 ;CLEAR BIT COUNTER. 30$: CLC ;CLEAR CARRY FOR NEXT INSTRUCTION ROR R0 ;ROTATE A BIT OFF. ADC R1 ;ADD IT INTO R1 TST R0 ;R0 TO 0 YET? BNE 30$ ;NO, KEEP LOOKING. CMP R1,#1 ;IS R1 <= 1? BLE 40$ ;YES, EVERYTHING'S OK ERROR #M.SWS,#L.SWS,CONT ;ERROR -- TOO MANY SWITCHES 40$: CLR R3 ;ASSUME THAT OUTPUT IS FILES-11 MOV #OUTFDB,R0 ;GET OUTPUT FDB MOV #FO.WRT,R1 ;GET THE DIRECTION MOV #OUTLUN,R2 ;GET THE LUN. CALL OPEN ;"OPEN" THE FILE. ; CLR SKPFLG ;SHOW NO SKIPS. MOV #1000.,LINENO ;FORCE A SKIP TO NEW PAGE. CLR PAGENO ;BUT MAKE IT PAGE 1. CLR EOV ;SHOW NOT AT EOV. MOV #FILOFF,R0 ;BLANK OUT THE FILE NAME. 50$: MOVB #' ,(R0)+ ; CMP R0,#FILEND ; BLO 50$ ;LOOP OVER FILE AREA. MOV #FILOFF,R1 ;POINT TO AREA. MOV #INFDB,R0 ;AND FDB. TST -2(R0) ;IS IT AN FCS FDB? BEQ 60$ ;YES, HANDLE WITH SPECIAL ROUTINE. MOV #FILOFF,R0 ;POINT TO FILE OFFSET. MOVB INFDB+F.FNB+N.DVNM,(R0)+ ;MOVE IN DEVICE. MOVB INFDB+F.FNB+N.DVNM+1,(R0)+ ; MOV INFDB+F.FNB+N.UNIT,R1 CLR R2 ;FIX UP TO DO UNIT # CALL $CBOMG ;DO THE UNIT # MOVB #':,(R0)+ ;MOVE IN A :. BR 70$ ;AND SKIP SPECIAL CODE. 60$: MOV #DIRLUN,R2 ;GET THE UNIT # CALL .RFILN ;GET FILENAME. 70$: MOV #PGHDR,R2 ;GET READY TO SET UP TIME OF DAY. CALL PRTIME ;AND PRINT IT. CLR RECCNT ;CLEAR DUMPED RECORD COUNTER. CLR REDCNT ;CLEAR READ RECORD COUNTER. MOV #1,FILCNT ;SET CURRENT FILE NUMBER. CLR FIRCNT ;CLEAR FIRST NN RECORD COUNTER. BIT #SW.PS,SWORD ;WAS /PS (PAGE SIZE) SPECIFIED? BEQ 75$ ;NO, SKIP. CMP PAGESZ,#4. ;WAS A REASONABLE PAGE SIZE GIVEN? BGT 75$ ;YES, JUST ACCEPT IT. ERROR #M.PAG,#L.PAG,CONT ;NO, PRINT NASTY MESSAGE. ; ; ENSURE THAT THE /-EO SWITCH WAS NOT SPECIFIED FOR FILE- ; STRUCTURED DUMPS. ; 75$: BIT #SW.EO,SWORD ;WAS /-EO SPECIFIED? BNE 80$ ;NO -- CONTINUE AS USUAL. MOV #INFDB,R0 ;GET THE INPUT FDB. TST -2(R0) ;IS THE DUMP TO BE FILE STRUCTURED? BNE 80$ ;NO, SKIP ERROR MESSAGE. ERROR #M.EOV,#L.EOV,CONT ;ERROR MESSAGE ABOUT /EO 80$: BIT #SW.HE,SWORD ;/HE SWITCH SPECIFIED? BEQ 90$ ;NO, SKIP. ERROR #M.HLP,#L.HLP,CONT ;ERROR MESSAGE ABOUT /HE 90$: .SBTTL COPY THE FILE PROCES: CLR QIO+Q.IOPL+10 ;CLEAR CURRENT BLOCK # CLR QIO+Q.IOPL+6 ; ; FIRST, REWIND THE DEVICE IF THE /RW SWITCH WAS SPECIFIED. ; ONLY REWIND IF THE DEVICE WAS SPECIFIED IN IMAGE MODE; ; OTHERWISE PRINT OUT AN ERROR MESSAGE. ; BIT #SW.RW,SWORD ;REWIND THE FILE? BEQ 30$ ;NO - SKIP THE REWIND CODE. MOV #INFDB,R0 ;GET INPUT FDB TST -2(R0) ;IS THIS AN IMAGE MODE FILE? BNE 10$ ;YES, PROCESS THE SWITCH ERROR #M.REW,#L.REW,CONT ;ERROR MESSAGE - ILLEGAL /RW SWITCH 10$: MOV #IO.RWD,QIO+Q.IOFN ;GET I/O FUNCTION CODE. MOV #INPLUN,QIO+Q.IOLU ;SET THE LUN CLR QIO+Q.IOPL ;CLEAR BUFFER ADDRESS CLR QIO+Q.IOPL+2 ;AND BUFFER LENGTH MOV #QIO,-(SP) ;DPB TO STACK CALL .DIRDL ;DO THE I/O ONERR MTERR ;ERROR? TSTB IOST ;DRIVER ERROR? BGE 30$ ;NO, CONTINUE PROCESSING JMP MTERR ;YES, SHOW ERROR. ; ; NOW WE SKIP PAST NN FILES IFF THE /SF: SWITCH WAS SPECIFIED. ; LIKEWISE, ONLY ALLOW THIS IN IMAGE MODE, AS IN FILES MODE IT ; IS NOT REALLY LEGAL TO KNOW HOW "FILE-STRUCTURED" VOLUMES ARE ; ORGANISED. ; 30$: BIT #SW.SF,SWORD ;SKIP NN FILES? BEQ 50$ ;NO -- SKIP THE FILES CODE. MOV #INFDB,R0 ;GET INPUT FDB. TST -2(R0) ;IS THIS AN IMAGE MODE FILE? BNE 40$ ;YES, PROCESS THE SWITCH. ERROR #M.FIL,#L.FIL,CONT ;ERROR MESSAGE - ILLEGAL /SF SWITCH 40$: MOV #IO.SPF,QIO+Q.IOFN ;GET I/O FUNCTION CODE. MOV #INPLUN,QIO+Q.IOLU ;SET THE LUN. CLR QIO+Q.IOPL+2 ;CLEAR BUFFER LENGTH. MOV FILMAX,QIO+Q.IOPL ;SET NUMBER OF FILES TO SKIP. MOV #QIO,-(SP) ;DPB TO STACK CALL .DIRDL ;DO THE I/O ONERR MTERR ;ERROR? TSTB IOST ;DRIVER ERROR? BGE 50$ ;NO, CONTINUE PROCESSING. JMP MTERR ;YES, SHOW ERROR. ; ; NOW ENSURE THAT THE /NF: SWITCH WAS NOT SPECIFIED FOR A ; FILE STRUCTURED DUMP. ; 50$: BIT #SW.NF,SWORD ;WAS THE /NF SWITCH SPECIFIED? BEQ 60$ ;NO, SKIP. MOV #INFDB,R0 ;GET INPUT FDB. TST -2(R0) ;IS IT FILE STRUCTURED? BNE 60$ ;NO, EVERYTHING'S OK. ERROR #M.NFI,#L.NFI,CONT ;ILLEGAL SWITCH ; ; IT IS NOW NECESSARY TO COMPUTE THE LENGTH OF THE READ TO BE ; DONE ON THE FILE, IF IT IS TO BE DONE IN IMAGE MODE. THIS ; IS SO THAT, IF WE ARE READING DISKS, THE BLOCK NUMBERS WILL ; COME OUT CORRECTLY ON THE LISTING. THE MECHANISM FOR DOING ; THIS IS THE DIRECT/SEQUENTIAL BIT: IF THE DEVICE IS A DIRECT ; DEVICE, IT IS ASSUMED TO BE A DISK AND THE BLOCK SIZE IS SET ; TO 512. BYTES; IF THE DEVICE IS A SEQUENTIAL DEVICE, IT IS ; ASSUMED TO BE A TAPE AND THE BLOCK SIZE IS SET TO ; BYTES. ; 60$: TST INFDB-2 ; IS THIS AN IMAGE MODE FILE? BEQ READ ; NO, IT'S A NORMAL FILE. GLUN$S #INPLUN,#BUFFER ; GET INFO ON THE FILE. MOV #BUFLEN,BLKSIZ ; SET DEFAULT BLOCK SIZE. BIT #FD.SQD,BUFFER+U.C1 ; IS IT A SEQUENTIAL DEVICE? BNE READ ; YES -- CONTINUE NORMALLY. MOV #1000,BLKSIZ ; SET DIRECT ACCESS BLOCK SIZE. ; ; NOW, WE ARE READY TO READ THE FILE. NOTE THAT ALTHOUGH THE ; MAGNETIC TAPE HAS A QIO FUNCTION CODE IO.SPB, WE DON'T USE ; IT BECAUSE WE WANT TO BE COMPATIBLE WITH THE FILE STRUCTURED ; DEVICES. TRUE, WE COULD DO A SPECIAL CASE CODE FOR SKIPPING ; RECORDS ON THE MT: OR MM: RATHER THAN ON A FILE STRUCTURED ; DEVICE, BUT WE DON'T THINK THE MARGINAL EXTRA SPEED IS ENOUGH ; TO JUSTIFY THE EXTRA TIME REQUIRED TO PROGRAM IN THE FUNCTION ; TWICE IN THIS PROGRAM. ; READ: MOV #INFDB,R0 ;GET INPUT FDB TST -2(R0) ;IS THIS AN IMAGE MODE FILE? BEQ 20$ ;NO, IT'S A NORMAL FILE. MOV #IO.RLB,QIO+Q.IOFN ;GET THE I/O FUNCTION CODE. MOV #INPLUN,QIO+Q.IOLU ;LUN MOV #BUFFER,QIO+Q.IOPL ;GET THE BUFFER. MOV BLKSIZ,QIO+Q.IOPL+2 ;LENGTH MOV #QIO,-(SP) CALL .DIRDL ;DO MAGTAPE I/O ONERR MTERR ;ERROR? TSTB IOST ;ERROR? BGE 10$ ;SKIP IF NOT. CMPB IOST,#IE.VER ;PARITY ERROR? BEQ 10$ ;YES, CONTINUE PROCESSING. INC REDCNT ;INCREMENT THE RECORD COUNT ANYWAY. JMP MTERR ;YES, ANALYSE IT. 10$: CLR EOV ;SHOW NOT AT EOV. MOV IOST+2,R1 ;GET LENGTH TRANSFERRED. ADD #777,R1 ;ROUND UP TO NEXT BLOCK. BIC #777,R1 ; ... ASH #-9.,R1 ;MAKE IT INTO A BLOCK COUNT. ADD R1,QIO+Q.IOPL+10 ;ADD INTO LOW ORDER BLOCK COUNT ADC QIO+Q.IOPL+6 ; ... BR 30$ ;AND SKIP NORMAL CODE. 20$: GET$ R0,#BUFFER,#BUFLEN ;GET A RECORD. MOVB F.ERR(R0),IOST ;SAVE THE ERROR CODE. BCC 25$ ;SKIP ON OK. CMP F.ERR(R0),# ;IS IT A PARITY ERROR? BEQ 25$ ;YES, CONTINUE PROCESSING. JMP EOFMOD ;UNRECOVERABLE ERROR, QUIT. 25$: MOV F.NRBD(R0),IOST+2 ;MOVE IN THE BLOCK LENGTH. ; ; WRITE THE DATA OUT. ; 30$: INC REDCNT ;INCREMENT READ-RECORD COUNT. BIT #SW.SK,SWORD ;/SK (SKIP) SPECIFIED? BEQ 40$ ;NO, CONTINUE AS BEFORE. CMP REDCNT,SKPMAX ;OVER THE MAXIMUM SKIP COUNT? BHI 40$ ;YES, PRINT THE RECORD. JMP READ ;NO, READ THE NEXT RECORD. 40$: INC RECCNT ;INCREMENT THE PRINTED RECORD COUNT. INC FIRCNT ;INCREMENT THE FIRST NN RECORDS COUNT BIT #SW.RC,SWORD ;IS A MAX RECORD COUNT SPECIFIED? BEQ 50$ ;NO CMP RECCNT,RECMAX ;IS CURRENT COUNT OVER MAXIMUM? BLOS 50$ ;NO, KEEP GOING. JMP ENDLOP ;AND END THE DUMP. 50$: BIT #SW.FI,SWORD ;IS A /FI:NN SWITCH GIVEN? BEQ 51$ ;NO, SKIP CHECKING. CMP FIRCNT,FIRMAX ;IS CURRENT COUNT OVER MAXIMUM? BLOS 51$ ;NO, KEEP GOING. JMP READ ;YES, JUST READ (UNTIL NEXT E-O-F). 51$: MOV IOST+2,R1 ;GET THE LENGTH. MOV #1,R2 ;KEEP O'S. MOV #BUFCNT,R0 ;POINT TO BUFFER COUNT NUMBER CALL $CBDMG ;CONVERT TO DECIMAL MAGNITUDE. MOV REDCNT,R1 ;GET READ RECORD COUNT. MOV #RECNUM,R0 ;POINT TO POSITION IN BUFFER CALL $CBDMG ;CONVERT TO RECORD # TST INFDB-2 ;IS THE INPUT FDB NON-FCS? BEQ 55$ ;NO, IT'S JUST AN FCS FILE. MOV FILCNT,R1 ;GET NUMBER OF THE CURRENT FILE. MOV #FILNUM,R0 ;POINT TO FILE NUMBER PART OF MESSAGE. CALL $CBDMG ;CONVERT TO MAGNITUDE DECIMAL. MOV FIRCNT,R1 ;GET COUNT OF RECORD SINCE E-O-F MOV #FIRNUM,R0 ;POINT TO NUMBER CALL $CBDMG ;CONVERT TO DECIMAL MAGNITUDE INC SKPFLG ;SHOW TO SKIP PRINT #BLKBUF,#BLKLEN ;PRINT THE LINE. BR 56$ ;AND SKIP NORMAL CODE 55$: INC SKPFLG ;SHOW TO SKIP. PRINT #RECBUF,#RECLEN ;PRINT HEADER 56$: INC SKPFLG ;AND SKIP AGAIN. ONERR EOFMOD ;CHECK FOR ERRORS CMPB IOST,#IE.VER ;WAS THERE A PARITY ERROR? BNE 60$ ;NO, SKIP PARITY MESSAGE PRINT #PARMSG,#PARLEN INC SKPFLG ;FORCE NEXT LINE TO SKIP. 60$: MOV IOST+2,R4 ;GET # OF CHARS TRANSFERRED. MOV #BUFFER,R5 ;POINT TO THE INPUT BUFFER. WRITE: MOV #BUFOUT,R0 ;POINT TO THE OUTPUT BUFFER. MOV R5,R3 ;GET THE BUFFER ADDRESS SUB #BUFFER,R3 ;COMPUTE CURRENT RECORD OFFSET. MOV #4.,R1 ;GET # OF HEX DIGITS TO PRINT. 1$: CLR R2 ;CLEAR EVEN REGISTER ASHC #4.,R2 ;SHIFT NEXT DIGIT INTO R2 MOVB HEX(R2),(R0)+ ;OUTPUT A HEX DIGIT. SOB R1,1$ ;AND LOOP. MOVB #' ,(R0)+ ;OUTPUT A BLANK. MOV R5,R1 ;GET BUFFER ADDRESS SUB #BUFFER,R1 ;COMPUTE CURRENT BUFFER OFFSET MOV #1,R2 ;DON'T SUPPRESS 0'S CALL $CBDMG ;CONVERT TO DECIMAL MAGNITUDE MOVB #' ,(R0)+ ;OUTPUT ANOTHER BLANK. MOV #16.,R3 ;GET COUNT OF CHARS TO PRINT. CMP R3,R4 ;GREATER THAN MAXIMUM? BLE 5$ ;NO, SKIP. MOV R4,R3 ;YES, MAKE IT THE MAXIMUM. 5$: MOV R3,-(SP) ;SAVE THE NUMBER OF CHARS. BEQ 31$ ;SKIP IF LENGTH OF RECORD = 0. 10$: MOVB (R5)+,R2 ;GET A CHARACTER. BIC #^C377,R2 ;CLEAN THE SIGN EXTEND. BIT #SW.EB,SWORD ;ARE WE DOING EBCDIC TRANSLATION? BEQ 15$ ;NO, CHECK FOR BCD MOVB EBCDIC(R2),R2 ;TRANSLATE THE CHARACTER INTO EBCDIC. BR 30$ ;AND SKIP ASCII TRANSLATION. 15$: BIT #SW.BC,SWORD ;HOW ABOUT BCD TRANSLATION? BEQ 16$ ;NO -- USE STANDARD ASCII MOVB BCD(R2),R2 ;TRANSLATE THE CHARACTER INTO EBCDIC. BR 30$ ;AND SKIP ASCII TRANSLATION. 16$: CMPB #' ,R2 ;IS IT A CONTROL CHARACTER? BHI 20$ ;YES -- MAKE IT A . CMPB #177,R2 ;IS IT ABOVE ASCII? BHI 30$ ;NO -- THEN PRINT IT. 20$: MOV #'.,R2 ;MAKE THE CHARACTER A . 30$: MOVB R2,(R0)+ ;OUTPUT THE CHARACTER. SOB R3,10$ ;AND LOOP OVER CHARACTERS. 31$: MOV #16.,R3 ;GET MAX # OF CHARS. SUB (SP),R3 ;ADJUST FOR NUMBER ACTUAL. BLE 40$ ;SKIP IF NONE REMAIN 35$: MOVB #' ,(R0)+ ;OUTPUT BLANKS. SOB R3,35$ ;UNTIL WE MAKE 16. CHARS. 40$: MOV (SP),R3 ;RECOVER ACTUAL NUMBER OF CHARS. BEQ 60$ ;SKIP IF NO CHARACTERS TO PRINT. SUB R3,R5 ;POINT BACK TO BEGINNING OF LINE. 50$: MOVB (R5)+,R2 ;GET A CHAR. BIC #^C377,R2 ;STRIP THE SIGN EXTEND. MOV R2,R1 ;GET INTO A TEMP. REG. ASH #-4.,R1 ;SHIFT RIGHT 4 BITS. MOVB #' ,(R0)+ ;OUTPUT AN EXTRA BLANK. MOVB HEX(R1),(R0)+ ;OUTPUT THE HIGH HEX DIGIT. BIC #^C17,R2 ;CLEAN TOP BITS. MOVB HEX(R2),(R0)+ ;OUTPUT THE LOW HEX DIGIT. SOB R3,50$ ;AND LOOP OVER ALL CHARACTERS. 60$: MOV R0,R1 ;GET THE BUFFER POINTER. SUB #BUFOUT,R1 ;COMPUTE LENGTH OF BUFFER. PRINT #BUFOUT,R1 ;OUTPUT THE BUFFER. ONERR EOFMOD ;AND CHECK FOR ERROR. SUB (SP)+,R4 ;SUBTRACT NUMBER OF CHARS FROM TOTAL BGT WRITE ;AND LOOP IF MORE. JMP READ ;AND READ THE NEXT ONE. MTERR: MOV @#$DSW,F.ERR(R0) ;GET DSW ERROR BMI 10$ ;SKIP IF THAT'S REALLY IT. MOVB IOST,F.ERR(R0) ;GET IOST ERROR CODE 10$: JMP EOFMOD ; .SBTTL .SBTTL SUBROUTINES .SBTTL .SBTTL OPEN -- OPEN FILES ; ; THIS SUBROUTINE "OPENS" FILES. IT ALSO WILL ASSIGN LUNS TO ; DEVICES MARKED AS IMAGE DEVICES, IN EFFECT ACTING AS A ; PHONY "OPEN" STATEMENT FOR THEM. ; ; ON INPUT, ; ; R0 FDB TO BE OPENED ; R1 THE DIRECTION OF OPEN (INPUT OR OUTPUT) ; R2 THE LUN ON WHICH THE FDB IS TO BE OPENED ; R3 THE TYPE OF FILE TO BE OPENED. ; 0 = NORMAL FILE ; 1 = IMAGE MODE FILE ; OPEN: MOV R1,-(SP) ;SAVE SOME REGISTERS. MOV R0,-(SP) ; MOV #S.FDB/2,R1 ;GET FDB SIZE 1$: CLR (R0)+ ;CLEAR OUT FDB SOB R1,1$ ;AND LOOP. MOV (SP)+,R0 ;RECOVER REGISTERS MOV (SP)+,R1 ; TST R3 ;IS THIS FILE AN IMAGE FILE? BNE 10$ ;YES -- SPECIAL PROCESSING. CLR -2(R0) ;SHOW THAT THIS IS A NORMAL FILE. FDAT$R R0,#R.VAR,#FD.CR,#80. ;SET THE RECORD ATTRIBUTES. FDRC$R R0 ;WE WILL USE READ/WRITE FDBF$R R0 ;GET$/PUT$ I/O MACRO FDOP$R R0,R2,#CSIBLK+C.DSDS,#DFNB,R1 ;SET FILE OPEN ATTRIBUTES OPEN$ R0 ;OPEN THE FILE. ONERR EOFMOD ;LEAVE IF ERROR. RETURN ;AND RETURN TO CALLER. 10$: MOV #1,-2(R0) ;SHOW THAT THIS IS AN IMAGE FILE. MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3. MOVB R2,F.LUN(R0) ;SAVE THE LUN. MOV #CSIBLK+C.DSDS,R2 ;GET THE DATASET DESCRIPTOR. MOV #DFNB,R3 ;GET THE DEFAULT FILENAME BLOCK MOV R0,R1 ;GET FILNAME BLOCK INTO R1 ADD #F.FNB,R1 ;... POINT TO FNB CALL .PRSDV ;PARSE THE DEVICE. ONERR 90$ ;ILLEGAL IMAGE MODE DEVICE MOVB F.LUN(R0),R2 ;RECOVER DEVICE. ALUN$S R2,F.FNB+N.DVNM(R0),F.FNB+N.UNIT(R0) ONERR 90$ ;ILLEGAL IMAGE MODE DEVICE. MOVB R2,F.LUN(R0) ;SAVE THE LUN MOV #IO.STC,QIO+Q.IOFN MOV R2,QIO+Q.IOLU MOV #20100,QIO+Q.IOPL CMP 4(SP),#FO.RD ;IS IT TO BE OPENED FOR READ? BEQ 50$ ;YES -- SKIP MOV #20000,QIO+Q.IOPL ;FIXUP CHAR WORD. 50$: MOV #QIO,-(SP) CALL .DIRDL ;SET CHARACTERISTICS ONERR MTERR ;ERROR? TSTB IOST ;ERROR? BPL 60$ JMP MTERR ;ERROR 60$: MOV (SP)+,R3 ;RECOVER R3 MOV (SP)+,R2 ;RECOVER R2 MOV (SP)+,R1 ;RECOVER R1 MOV (SP)+,R0 ;RECOVER R0 RETURN 90$: ERROR #M.ILD,#L.ILD,CONT ;ILLEGAL IMAGE MODE DEVICE. .SBTTL CLOSE -- CLOSE FILES ; ; THIS IS A GENERALISED FILE-CLOSE ROUTINE. IT WILL CLOSE BOTH ; FILES-11 AND NON-FILES-11 FILES. ; ; ON INPUT, ; ; R0 THE FDB OF THE FILE TO BE CLOSED ; CLOSE: TST -2(R0) ;IS THIS A FILES-11 FILE? BNE 10$ ;NO -- SPECIAL TREATMENT CLOSE$ R0 ;CLOSE THE FILE 10$: RETURN ;AND RETURN .SBTTL PRINT -- PRINT A LINE ;+ ; THIS SUBROUTINE IS USED TO PRINT A LINE TO THE OUTPUT FILE. ; NOTE THAT IT MUST BE RE-ENTRANT. ; ; ON ENTRY, ; ; (SP)+2 LENGTH OF BUFFER TO PRINT ; (SP)+4 ADDRESS OF BUFFER TO PRINT ;- $PRINT: INC LINENO ;INC THE LINE # CMP LINENO,PAGESZ ;GREATER THAN MAX? BLT 5$ ;NO CLR LINENO ;CLEAR THE LINE # PRINT #FFREC,#FFLEN ;PRINT THE FORM-FEED. MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; MOV #PGNUM,R0 ;POINT TO PAGE # INC PAGENO ;INC THE PAGE # MOV PAGENO,R1 ;GET THE PAGE # CLR R2 ;SUPPRESS 0'S. CALL $CBDSG ;CONVERT TO DECIMAL. SUB #PGHDR,R0 ;COMPUTE LENGTH OF LINE. PRINT #PGHDR,R0 ;PRINT PAGE HEADER. MOV (SP)+,R2 ;RECOVER REGISTERS MOV (SP)+,R1 ; MOV (SP)+,R0 ; INC SKPFLG ;FORCE A SKIP. 5$: TST SKPFLG ;ARE WE TO SKIP A LINE? BEQ 10$ ;NO CLR SKPFLG ;SET TO SKIP. PRINT #BUFFER,#0 ;PRINT A BLANK LINE. 10$: PUT$ #OUTFDB,4(SP),2(SP) ;OUTPUT THE LINE. ONERR EOFMOD ;CHECK FOR ERRORS. MOV (SP),4(SP) ;POP STACK CMP (SP)+,(SP)+ ;REMOVE UNNEEDED ARGUMENTS. RETURN ;AND RETURN. .SBTTL EOFMOD -- GENERAL ERROR HANDLING EOFMOD: ; ; THE ERROR HANDLING ROUTINE. ; IF AN END-OF-FILE IS DETECTED, THE PROGRAM JUST EXITS. ; CMPB F.ERR(R0),#IE.EOF BNE CMDOPN ;NO, NOT END-OF-FILE. BIT #SW.EO,SWORD ;NORMAL END-OF-VOLUME PROCESSING? BEQ 1$ ;NO TST EOV ;ARE WE NOW AT EOV? BNE ENDLOP ;YES, TERMINATE US. INC EOV ;IF WE COME HERE AGAIN IT IS EOV 1$: MOV SPSAVE,SP ;RESTORE SP BIT #SW.FI,SWORD ;WAS /FI:NN SPECIFIED? BEQ 2$ ;NO, SKIP. MOV #NUMREC,R0 ;POINT TO NUMBER OF RECORDS MESSAGE MOV FIRCNT,R1 ;GET COUNT OF RECORDS IN THIS FILE. MOV #1,R2 ;SET FOR NO ZERO SUPPRESS CALL $CBDMG ;CONVERT TO DECIMAL INC SKPFLG ;SKIP A LINE PRINT #NUMBUF,#NUMLEN ;PRINT NUMBER OF RECORDS IN FILE LINE 2$: INC SKPFLG ;SKIP A LINE. PRINT #EOFLIN,#EOFLEN ;NOTE THAT THIS IS EOF INC SKPFLG ;AND SKIP ANOTHER LINE. INC FILCNT ;INCREMENT NUMBER OF FILES SEEN. CLR FIRCNT ;CLEAR NUMBER OF RECORDS SINCE E-O-F BIT #SW.NF,SWORD ;/NF (NUMBER OF FILES) SPECIFIED? BEQ 10$ ;NO, SKIP CHECK. CMP FILCNT,NFIMAX ;IS IT >= THE NUMBER OF FILES DESIRED? BHI ENDLOP ;YES, STOP THE LISTING. 10$: JMP READ ;AND CONTINUE READING. ; .SBTTL CMDOPN -- GENERAL ERROR HANDLING ; CMDOPN: MOV #M.IOR,R1 ;GET I/O ERROR MSG MOV #L.IOR,R2 ;AND LENGTH TST @#$DSW ;DSW ERROR? BGT 10$ ;NO MOV @#$DSW,F.ERR(R0) ;MOVE IN ERROR CODE 10$: CALL .PRFCS ; ; .SBTTL ENDLOP -- END THE LISTING .SBTTL ; ENDLOP: MOV #INFDB,R0 ;GET INPUT FILE CALL CLOSE ;CLOSE IT MOV #OUTFDB,R0 ;GET OUTPUT FILE CALL CLOSE ;AND CLOSE IT. JMP BEGIN .SBTTL ERROR MESSAGE AND OTHER STRINGS .PSECT PDATA,RO,D .NLIST BIN M.ERR: .ASCII "PRECIS -- I/O ERROR ON @ FILE" L.ERR = .-M.ERR M.OPE: .ASCII "PRECIS -- OPEN ERROR ON @ FILE" L.OPE = .-M.OPE M.SYN: .ASCII "PRECIS -- SYNTAX ERROR FOR @ FILE" L.SYN = .-M.SYN M.MAX: .ASCII "PRECIS -- MAX @ FILE DEPTH EXCEEDED" L.MAX = .-M.MAX M.UNK: .ASCII "PRECIS -- UNKNOWN COMMAND ERROR" L.UNK = .-M.UNK M.PS1: .ASCII "PRECIS -- SYNTAX ERROR" L.PS1 = .-M.PS1 M.PS2: .ASCII "PRECIS -- ILLEGAL SWITCH" L.PS2 = .-M.PS2 M.ILD: .ASCII "PRECIS -- ILLEGAL IMAGE MODE DEVICE" L.ILD = .-M.ILD M.SWS: .ASCII "PRECIS -- CONFLICTING SWITCHES" L.SWS = .-M.SWS M.REW: .ASCII "PRECIS -- /RW SWITCH ILLEGAL FOR FILE MODE" L.REW = .-M.REW M.FIL: .ASCII "PRECIS -- /SF SWITCH ILLEGAL FOR FILE MODE" L.FIL = .-M.FIL M.NFI: .ASCII "PRECIS -- /NF SWITCH ILLEGAL FOR FILE MODE" L.NFI = .-M.NFI M.EOV: .ASCII "PRECIS -- /-EO SWITCH ILLEGAL FOR FILE MODE" L.EOV = .-M.EOV M.HLP: .ASCII "PRECIS -- /HE SWITCH MUST BE USED ALONE" L.HLP = .-M.HLP M.PAG: .ASCII "PRECIS -- ILLEGAL PAGE SIZE (TOO SMALL)" L.PAG = .-M.PAG M.IOR: .ASCII "PRECIS" L.IOR = .-M.IOR EOFLIN: .ASCII "*** EOF ***" EOFLEN = .-EOFLIN PARMSG: .ASCII "***** THIS BLOCK HAS BAD PARITY *****" PARLEN = .-PARMSG .EVEN .SBTTL HELP MESSAGES ; ; THESE MESSAGES ARE PRINTED IN RESPONSE TO THE "/HE" (HELP) ; SWITCH. THEY ARE IN A TABULAR FORM FOR EASE OF REFERENCE. ; HLPLST: .WORD 1$ .WORD 2$ .WORD 3$ .WORD 4$ .WORD 5$ .WORD 6$ .WORD 7$ .WORD 8$ .WORD 9$ .WORD 10$ .WORD 11$ .WORD 12$ .WORD 13$ .WORD 14$ .WORD 15$ .WORD 16$ .WORD 17$ .WORD 18$ .WORD 19$ .WORD 20$ .WORD 0 ;END OF LIST 1$: .ASCII "COMMANDS ARE OF THE FORM: OUTFILE=INFILE[/SWITCHES]" 2$: .ASCII "LEGAL SWITCHES ARE:" 3$: .ASCII " /AS DUMP FILE IN ASCII" 4$: .ASCII " /BC DUMP FILE IN BCD" 5$: .ASCII " /EB DUMP FILE IN EBCDIC" 6$: .ASCII " /EO USE STANDARD END-OF-VOLUME PROCESSING ON TAPE" 7$: .ASCII " /HE PRINT THIS SUMMARY" 8$: .ASCII " /NF:NN DUMP NN FILES (NON-FILES-11 DEVICES)" 9$: .ASCII " /SF:NN SKIP NN FILES (NON-FILES-11 DEVICES)" 10$: .ASCII " /SK:NN SKIP NN RECORDS" 11$: .ASCII " /RC:NN DUMP NN RECORDS" 12$: .ASCII " /FI:NN DUMP ONLY FIRST NN RECORDS OF EACH FILE" 13$: .ASCII " /PS:NN SET PAGE SIZE TO NN LINES" 14$: .ASCII " /RW REWIND BEFORE DUMP (NON-FILES-11 DEVICES)" 15$: .ASCII "DEFAULTS: /AS/EO/PS:55." 16$: .ASCII "INFILE MAY BE EITHER A FILES-11 FILE OR A FOREIGN DEVICE." 17$: .ASCII "IF THE INPUT FILE IS A FILES-11 FILE, THE FILE IS DUMPED" 18$: .ASCII "A RECORD AT A TIME. IF THE INPUT FILE IS A FORIEGN" 19$: .ASCII "DEVICE, THE FILE IS DUMPED A BLOCK AT A TIME." 20$: .EVEN .SBTTL .SBTTL TRANSLATION TABLES .SBTTL .SBTTL EBCDIC TRANSLATION TABLE .PSECT EBCDIC,RO,I .ENABL LC ; ; ASCII AND EBCDIC ARE NOT COMPLETELY TRANSLATABLE. ; AN ATTEMPT IS MADE FOR ALL PRINTABLE CHARACTERS. THE ONLY ; STRANGE TRANSLATION IN THIS DIRECTION IS THAT ASCII DOES ; NOT HAVE THE EXACT EQUIVALENT OF THE EBCDIC VERTICAL BAR. ; THIS IS TRANSLATED TO "!", SO AT LEAST PL/I PROGRAMS NEED ; NOT BE EDITED AFTER TRANSLATION. ; ANY UNTRANSLATABLE CHARACTERS ARE RETURNED AS "^" ; ;- ; UNPRINTABLE ASCII CHARACTERS (FOR THE ASSEMBLER) ; LBR= 173 ;LEFT BRACKET VBR= 174 ;VERTICAL BAR RBR= 175 ;RIGHT BRACKET TIL= 176 ;TILDA QUO= 140 ;LEFT QUOTE EBCDIC: .ASCII /......../ ;HEX 00 .ASCII /......../ .ASCII /......../ ;HEX 10 .ASCII /......../ .ASCII /......../ ;HEX 20 .ASCII /......../ .ASCII /......../ ;HEX 30 .ASCII /......../ .ASCII / ......./ ;HEX 40 .ASCII /....<(+!/ .ASCII /&......./ ;HEX 50 .ASCII /..!$*);^/ .ASCII '-/......' ;HEX 60 .ASCII /..//,%_>?/ .ASCII /......../ ;HEX 70 .ASCII /.//:#@'="/ .ASCII /.abcdefg/ ;HEX 80 .ASCII /hi.//<(++/ .ASCII /.jklmnop/ ;HEX 90 .ASCII /qr.//.)+./ .ASCII /-//stuvwx/ ;HEX A0 .ASCII /yz...[>./ .ASCII /01234567/ ;HEX B0 .ASCII /89...]=-/ .ASCII /ABCDEFG/ ;HEX C0 .ASCII /HI....../ .ASCII /JKLMNOP/ ;HEX D0 .ASCII /QR....../ .ASCII /\.STUVWX/ ;HEX E0 .ASCII /YZ....../ .ASCII /01234567/ ;HEX F0 .ASCII /89//...../ .SBTTL BCD TRANSLATION TABLE ; ; BCD TABLE ; .PSECT BCD,RO,I BCD: .ASCII /......../ ;HEX 00 .ASCII /......../ .ASCII /......../ ;HEX 10 .ASCII /......../ .ASCII /......../ ;HEX 20 .ASCII /......../ .ASCII /......../ ;HEX 30 .ASCII /......../ .ASCII / ......./ ;HEX 40 .ASCII /....)["/ .ASCII /.abcdefg/ ;HEX 80 .ASCII /hi....../ .ASCII /.jklmnop/ ;HEX 90 .ASCII /qr....../ .ASCII /..stuvwx/ ;HEX A0 .ASCII /yz....../ .ASCII /01234567/ ;HEX B0 .ASCII /89....../ .ASCII /?ABCDEFG/ ;HEX C0 .ASCII /HI....../ .ASCII /!JKLMNOP/ ;HEX D0 .ASCII /QR....../ .ASCII /^.STUVWX/ ;HEX E0 .ASCII /YZ....../ .ASCII /01234567/ ;HEX F0 .ASCII /89....../ .EVEN ; .SBTTL HEXADECIMAL TRANSLATION TABLE .SBTTL ; .PSECT PDATA,RO,D .EVEN HEX: .ASCII /0123456789ABCDEF/ .EVEN .SBTTL DATA AREA .PSECT IDATA,RW,D CMLBLK: GCMLB$ 1,PRC,USRBUF,CMDLUN USRBUF: .BLKB 82. .EVEN CSI$ .EVEN CSIBLK: .BLKB C.SIZE CSITAB: CSI$SW EB,SW.EB,SWORD,SET,NEG CSI$SW BC,SW.BC,SWORD,SET,NEG CSI$SW AS,SW.AS,SWORD,SET,NEG CSI$SW RW,SW.RW,SWORD,SET,NEG CSI$SW EO,SW.EO,SWORD,SET,NEG CSI$SW HE,SW.HE,SWORD,SET,NEG CSI$SW RC,SW.RC,SWORD,SET,,RECSWV CSI$SW SK,SW.SK,SWORD,SET,,SKPSWV CSI$SW SF,SW.SF,SWORD,SET,,FILSWV CSI$SW NF,SW.NF,SWORD,SET,,NFISWV CSI$SW FI,SW.FI,SWORD,SET,,FIRSWV CSI$SW PS,SW.PS,SWORD,SET,,PAGSWV CSI$ND RECSWV: CSI$SV DECIMAL,RECMAX,2 CSI$ND SKPSWV: CSI$SV DECIMAL,SKPMAX,2 CSI$ND FILSWV: CSI$SV DECIMAL,FILMAX,2 CSI$ND NFISWV: CSI$SV DECIMAL,NFIMAX,2 CSI$ND FIRSWV: CSI$SV DECIMAL,FIRMAX,2 CSI$ND PAGSWV: CSI$SV DECIMAL,PAGESZ,2 CSI$ND SWORD: .WORD 0 ;SWITCH WORD. RECMAX: .WORD 0 ;NUMBER OF RECORDS TO DUMP SKPMAX: .WORD 0 ;NUMBER OF RECORDS TO SKIP RECCNT: .WORD 0 ;CURRENT RECORD NUMBER FILMAX: .WORD 0 ;NUMBER OF FILES TO SKIP FILCNT: .WORD 0 ;NUMBER OF FILES DUMPED SO FAR NFIMAX: .WORD 0 ;NUMBER OF FILES TO PRINT FIRMAX: .WORD 0 ;MAX NUMBER OF RECORDS TO DUMP PER FILE FIRCNT: .WORD 0 ;NUMBER OF RECORDS DUMPED THIS FILE PAGESZ: .WORD 0 ;PAGE SIZE FOR THE OUTPUT SW.EB = 000001 ;EBCDIC TRANSLATION SW.BC = 000002 ;BCD TRANSLATION SW.AS = 000004 ;ASCII TRANSLATION (DEFAULT) SW.RC = 000010 ;RECORD NUMBER SPECIFIED. SW.SK = 000020 ;NUMBER OF RECORDS TO SKIP SW.RW = 000040 ;REWIND TAPE BEFORE USE. SW.SF = 000100 ;NUMBER OF FILES TO SKIP. SW.NF = 000200 ;NUMBER OF FILES TO DUMP SW.EO = 000400 ;STANDARD END-OF-VOLUME PROCESSING SW.HE = 001000 ;HELP PRINTOUT DESIRED SW.FI = 002000 ;FIRST NN RECORDS IN EACH FILE ONLY SW.PS = 004000 ;PAGE SIZE SPECIFIED. SW.DEF = SW.EO ;DEFAULT SWITCHES = (SW.EO) FSRSZ$ 2,2* .PSECT IDATA,RW,D .WORD 0 ;FDB TYPE - MUST PRECEDE INFDB INFDB: FDBDF$ .WORD 0 ;FDB TYPE - MUST PRECEDE OUTFDB OUTFDB: FDBDF$ DFNB: NMBLK$ ,LST,,SY,0 .EVEN IOST: .WORD 0,0 SPSAVE: .WORD 0 ;STACK POINTER SAVE WORD PAGENO: .WORD 0 ;CURRENT PAGE # LINENO: .WORD 0 ;CURRENT LINE # SKPFLG: .WORD 0 ;CURRENT SKIP STATUS. EOV: .WORD 0 ;TAPE MARK JUST SEEN. REDCNT: .WORD 0 ;CURRENT READ RECORD # BLKSIZ: .WORD 0 ; BLOCK SIZE FOR IMAGE MODE. BUFFER: .BLKB 40000 BUFLEN = .-BUFFER BUFOUT: .BLKB 120. ;OUTPUT BUFFER NUMBUF: .ASCII "TOTAL NUMBER OF RECORDS IN FILE = " NUMREC:.ASCII " " NUMLEN = .-NUMBUF BLKBUF: .ASCII /FILE / FILNUM:.ASCII / / .ASCII / BLOCK / FIRNUM:.ASCII / / RECBUF: .ASCII /RECORD / RECNUM:.ASCII / / .ASCII / LENGTH / BUFCNT:.ASCII / BYTES/ RECLEN = .-RECBUF BLKLEN = .-BLKBUF .EVEN FFREC: .ASCII <14> FFLEN = .-FFREC .EVEN PGHDR: .ASCII / PRECIS / FILOFF:.ASCII /SY0:[200,200]123456789.123;177777 / FILEND: .ASCII /PAGE / PGNUM: .ASCII / / .EVEN $QIOW: QIOW$ IO.WVB,ERRLUN,ERRLUN,,,,<0,0,40> QIO: QIOW$ IO.RLB,,2,,IOST,, .END START