.TITLE LIST - LIST FILE(S) TO THE TERMINAL .IDENT /5.0/ .ENABL LC ;+ ; ; Title: LIST ; Author: Robin Miller ; Date: March 25, 1981 ; ; Original source taken from KMS Software Kit. ; ; Description: ; ; This program will list a file to TI: ; ; Operating procedures: ; ; >LIST ; ; Where: ; may be any legal RSX-11M file specification, and may have ; wildcards (*) for file names. If wildcards are used, the version ; number also defaults to * automatically. ; ; Examples: ; X.MAC, TEST.*, *.PLI. ; ; Modification History: ; ; ; Taskbuild Procedure: ; ; TKB>LIST/CP/-FP=LIST,PNTMRK,CHKCMD ; TKB>/ ; ENTER OPTIONS: ; TKB>UNITS=5 ; TKB>ASG=SY:1:5 ; TKB>ASG=TI:2:3:4 ; TKB>TASK=...LIS ; TKB>UIC=[200,200] ; TKB>LIBR=SYSRES:RO:7 ! Map resident library with APR 7. ; TKB>// ;- .ENABL AMA .MCALL ALUN$, DIR$, EXIT$S, QIO$, QIOW$, QIOW$S .MCALL CSI$, CSI$1, CSI$2, CSI$SW, CSI$SV, CSI$ND, GCMLB$, GCML$ .MCALL FINIT$, FSRSZ$, FDBDF$, FDOP$A, CLOSE$, OFID$R, GET$, PUT$ .MCALL FDBF$R, FDRC$R .MCALL FHDOF$, FDOFF$, NBOFF$, GCMLD$ ; ; Local/Global Equates. ; NULL = 0 ; ASCII FOR NULL LF = 12 ; ASCII FOR LINE FEED FF = 14 ; ASCII FOR FORM FEED CR = 15 ; ASCII FOR CARRIAGE RETURN ESC = 33 ; ASCII FOR ESCAPE SPACE == 40 ; ASCII FOR SPACE DSKLUN == 1 ; LUN FOR DISK INPUT DSKEFN == 1 ; EVENT FLAG FOR DISK INPUT INLUN == 2 ; LUN FOR TERMINAL INPUT INEFN == 2 ; EVENT FLAG FOR INPUT OUTLUN == 3 ; LUN FOR TERMINAL OUTPUT OUTEFN == 3 ; EVENT FLAG FOR OUTPUT CSILUN == 4 ; LUN FOR COMMAND LINE INTERPRETER MRKEFN == 4 ; EVENT FLAG FOR MARK TIME FILLUN == 5 ; LUN FOR OUTPUT FILE FILEFN == 5 ; EFN FOR OUTPUT FILE .IF DF RSX11M MBCT = 1 ; MULTI-BUFFER COUNT (NOT SUPPORTED) MRKLEN == 1000. ; SIZE OF MARK BUFFER MVT52 == 21. ; VT52 MAX # OF LINES .IFF MBCT = 4. ; MULTI-BUFFER COUNT MRKLEN == 2000. ; SIZE OF MARK BUFFER MVT52 == 20. ; VT52 MAX # OF LINES .ENDC BUFSIZ == 512. ; BUFFER SIZE TYOSIZ == 136. ; OUTPUT BUFFER SIZE MRKENT == 3. ; SIZE IF EACH ENTRY MVT100 == 21. ; VT100 MAX # OF LINES MTEKS == 59. ; TEKTRONIX MAX LINES (SMALL) MTEKM == 53. ; TEKTRONIX MAX LINES (MEDIUM) ; ; Switch definitions. ; NASW == 1 ; NARROW LISTING WISW == 2 ; WIDE LISTING SESW == 4 ; SEE-ALL MODE ; ; LIST status bit definitions: ; B.EXIT == 1 ; EXIT FLAG B.NEXT == 2 ; NEXT FILE FLAG B.KILL == 4 ; FILE KILLED (DELETED) ; ; Macro to generate error message. ; .MACRO ERRMSG MSG .NCHR $$$, JSR R0,TYPE .WORD $$$ .ASCII "MSG" .EVEN .ENDM CSI$ ; DEFINE CSI OFFSETS GCMLD$ DEF$L ; DEFINE GCML OFFSETS FDOFF$ DEF$L ; DEFINE FDB OFFSETS FHDOF$ DEF$L ; DEFINE FILE HEADER OFFSETS NBOFF$ DEF$L ; DEFINE NAME BLOCK OFFSETS ; COMMAND LINE MACROS AND DATA BLOCKS GCLBLK: GCMLB$ DSKLUN,LIS,HEADER,CSILUN .EVEN .GLOBL CSIBLK CSIBLK: .BLKB C.SIZE ; CSI BLOCK .EVEN SWTBL: CSI$SW NA,NASW,SWMASK ; /NA - NARROW LISTING CSI$SW WI,WISW,SWMASK ; /WI - WIDE LISTING CSI$SW SE,SESW,SWMASK ; /SE - SEE-ALL MODE CSI$ND SWMASK:: .WORD 0 ; STORE SWITCH MASK HERE .GLOBL HEADER, STAT, WLDFLG HEADER: .BLKB 82. STAT:: .WORD 0 ; FILENAME-BLOCK STATUS WORD .WORD 0 ; SAVE CONTEXT FOR N.NEXT HERE SAVNXT: .WORD 0 ; SAVE LAST N.NEXT FOR VAX DELETE WLDFLG: .WORD 0 ; FLAG FOR WILD CARDS DEV: .ASCII /SY0:/ ; DEFAULT DEVICE (IF NONE SPECIFIED) .EVEN ; I/O MACROS AND DATA BLOCKS FSRSZ$ 1,> ; ONE OPEN FILE FDB:: FDBDF$ ; FDB FOR INPUT FILE FDOP$A DSKLUN,CSIBLK+C.DSDS,,FO.RD!FA.SHR FDB1:: FDBDF$ ; FDB FOR OUTPUT FILE .GLOBL BUFFER, TYOBUF TYOBUF: .BLKB TYOSIZ ; TERMINAL OUTPUT BUFFER BUFFER: .BLKB BUFSIZ ; INPUT BUFFER (IF NEEDED) MARKB:: .BLKW ; MARK EVERY 50TH RECORD MARKP:: .WORD MARKB ; POINTER INTO MARK BUFFER MARKC:: .WORD -1 ; NUMBER OF ENTRIES IN MARKB .EVEN ; ; Directive Parameter Blocks (DPB's). ; .GLOBL QIOR, TIQIO QIOR: QIOW$ IO.RVB,INLUN,INEFN,,TIOSB,, ; READ WITH PROMPT TIQIO: QIOW$ IO.WVB,INLUN,INEFN,,TIOSB,,<0,0,40> ; TERMINAL WRITE DPB TIASN: ALUN$ INLUN,TI,0 ; TERMINAL ASSIGN LUN DPB ATTACH: QIOW$ IO.ATT,OUTLUN,OUTEFN ; ATTACH DPB FOR OUTPUT DEVICE DETACH: QIOW$ IO.DET,OUTLUN,OUTEFN ; DETACH DPB FOR OUTPUT DEVICE SETWID: QIOW$ SF.SMC,OUTLUN,OUTEFN,,TIOSB,, ; SET TERMINAL WIDTH GETCHA: QIOW$ SF.GMC,OUTLUN,OUTEFN,,TIOSB,, ; GET CTRL/O STATUS TIOSB:: .BLKW 2 ; TERMINAL I/O STATUS BLOCK CTRLO: .WORD TC.CTS ; CONTROL/O STATUS ; ; Buffer Space. ; .GLOBL FILNAM FILNAM: .BLKB 100. ; STORAGE FOR ASCII FILE NAME TEMP: .BLKB 40. ; TEMPORARY WORK SPACE INCMD:: .BLKB 80. ; LIST CONTROL INPUT COMMAND .EVEN ; ; Local storage area: ; .GLOBL LINCNT, LINWID, LSTREC, MARGIN, MAXLIN .GLOBL OLDDOT, OLDREC, RECCNT, SETVT1, STATUS .GLOBL CURREC, SKPCNT, TMPREC, WTGREC, SETTEK STATUS: .WORD 0 ; COMMAND STATUS WORD MAXLIN: .WORD 0 ; MAXIMUM # OF LINES PER SCREEN LINCNT: .WORD 0 ; CURRENT LINE COUNT LINWID: .WORD 132. ; # OF CHAR TO OUTPUT ON EACH LINE MARGIN: .WORD 0 ; # OF CHAR TO INDENT MARGIN CURREC: .WORD 0,0 ; CURRENT RECORD NUMBER (HIGH,LOW) RECCNT: .WORD 0,0 ; MAXIMUM RECORD SO FAR (HIGH,LOW) WTGREC: .WORD 0,0 ; WHERE TO GO RECORD NUMBER SKPCNT: .WORD 0,0 ; NUMBER OF RECORDS TO SKIP TMPREC: .WORD 0,0 ; TEMPORARY STORAGE FOR RECORD # LSTREC: .WORD 0,0 ; LAST RECORD MARKED OLDDOT: .WORD 0,0,0 ; LAST END OF PAGE MARKER OLDREC: .WORD 0,0 ; LAST END OF PAGE RECORD SETVT1: .BYTE 0 ; SET VT100 BACK TO 80. COLUMNS SETTEK: .BYTE 0 ; TEKTRONIX WIDE LISTING .EVEN ; ; Strings for messages. ; .NLIST BEX EOFMSG: .ASCIZ %EOF-% .EVEN .ENABL LC CRLF:: .BYTE ,,<0> .EVEN ;+ ; ; Read and decode the command: ; ; A rather sneaky quirk pops up in using CSI$1 and CSI$2. If the ; input command line omits the DEV: and the [UIC], nothing is placed in ; the CSI File Descriptor Block (pointed to by C.DEVD etc.). Now all ; is OK if one just wishes to decode the command line and then open the ; file. OPEN assumes that if the DEV and UIC are missing it should open ; the file using the current terminal UIC and the disk from which the ; task is initially installed. One never notices a problem if the ; utility is run using the RUN $ convention. However, if the utlity is ; installed off of DK0:(ASN SY:=SY:/LOGIN) then a user whose system ; device is different (ASN DKN:=SY:/LOGIN) it is mandatory to put in a ; DEV: in the file specification, because if it is omitted the utility ; can not find the file on his system device. ; ; The matter is further complicated if .PARSE and .FIND are to be ; used. They will not parse and find a file correctly if the command ; line assumes the device will default to SY:. The solution to this is ; to test the command line to see if a DEV: is specified. If not, ; insert an SY: ; ; One nice feature of this quirk, and (using hindsight). A much ; used feature of the command string interpreters, is that once a DEV: ; or [UIC] is specified in a command line, all subsequent file specifiers ; can omit them. ; ;- .GLOBL LIST, START LIST: FINIT$ ; INITIALIZE FSR DIR$ #TIASN ; ASSIGN LUN TO TI0: DIR$ #ATTACH ; ATTACH OUTPUT DEVICE CALL GTTYPE ; GET TERMINAL TYPE START: CLRB FILNAM ; INIT TO NO FILNAM CLR SWMASK ; CLEAR SWITCH MASK GCML$ #GCLBLK ; GET COMMAND LINE BCS 10$ ; ERROR? JMP CONTIN ; NO ERROR, SO SKIP AROUND 10$: CMPB #GE.IOR,GCLBLK+G.ERR ; I/O ERROR? BNE 20$ ; NO ERRMSG JMP EXIT ; THIS IS FATAL 20$: CMPB #GE.OPR,GCLBLK+G.ERR ; OPEN ERROR? BNE 30$ ; NO ERRMSG JMP START ; RE-DO CMD LINE 30$: CMPB #GE.MDE,GCLBLK+G.ERR ; MAX @ DEPTH? BNE 40$ ; NO ERRMSG JMP START 40$: CMPB #GE.BIF,GCLBLK+G.ERR ; SYNTAX ERROR? BNE 50$ ; NO ERRMSG JMP START ; RE-START PGM 50$: CMPB #GE.EOF,GCLBLK+G.ERR ; END-OF-FILE? BEQ EXIT ; YES ERRMSG EXIT: TSTB FLG132 ; WAS TERMINAL WIDTH MODIFIED ? BEQ 60$ ; IF EQ, NO DIR$ #SETWID ; YES, RESET TO ORIGINAL WIDTH 60$: DIR$ #DETACH ; DETACH OUTPUT DEVICE EXIT$S ; NO INPUT SO EXIT SERR: ERRMSG JMP START CONTIN:: CLR WLDFLG ; ASSUME NO WILDCARDS CLR SAVNXT ; INIT SAVE NEXT WORD TST ; WAS ANYTHING INPUT ? BNE 1$ ; IF NE, YES JMP START ; NO, GO TRY AGAIN 1$: CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ; CHECK SYNTAX BCS SERR ; ERROR IN SYNTAX FOUND TST ; JUST IN CASE A BUNCH OF SPACES ; FOLLOWED BY A ^Z WERE TYPED, CHECK ; TO BE SURE >0 PARSED CHARACTER IS ; IN THE CSIBLK. BEQ EXIT ; ONLY ONE CHARACTER EXIT ; ; CHECK TO SEE IF SOME ONE TRIED USING THE FILSPEC=FILESPEC TYPE ; COMMAND LINE. IF SO, THIS IS A SYNTAX ERROR. ; MOV #CSIBLK+C.STAT,R0 ; GET ADDRESS OF STATUS WORD MOV #SWTBL,CSIBLK+C.SWAD ; SET ADDRESS OF SWITCH TABLE MOVB #CS.OUT,CSIBLK+C.TYPR ; SET FOR OUTPUT FILESPEC BITB #CS.EQU,(R0) ; WAS AN EQUAL SIGN SEEN? BNE SERR ; IF NE, EQUAL SIGN SEEN CSI$2 #CSIBLK ; DECODE THE FILE NAME BCS SERR ; SYNTAX ERROR IF NOT OKAY ; ; NOW CHECK TO SEE IF WILD CARDS ARE SPECIFIED ; MOV #CSIBLK+C.STAT,R0 ; GET ADDRESS OF STATUS WORD BITB #CS.WLD,(R0) ; ANY WILD CARDS BEQ 5$ ; IF EQ, NO WILD CARDS INC WLDFLG ; SET WILDCARD FLAG ; ; DO WE NEED TO INSERT A SY:? ; 5$: BITB #CS.DVF,(R0) ; DEVICE SPECIFIER FOUND ? BNE 15$ ; IF NE YES, SO DON'T FILL IN SY: ; NO, SO INITIALIZE THE DEVICE STRING ; IN THE CSIBLK TO BE 'SY0:' MOV #CSIBLK+C.DEVD,R0 ; GET ADDRES OF BYTE COUNT MOV #2,(R0) ; FIRST INSERT NEW BYTE COUNT MOV #CSIBLK+C.DEVD+2,R0 ; GET ADDRESS OF POINTER TO DEVICE ; STRING IN CSIBLK MOV #DEV,(R0) ; INSERT NEW ADDRESS TO DEVICE STRING 15$: MOV #FDB,R0 ; FDB ADRESS IN R0 MOV #FDB+F.FNB,R1 ; FNB ADDRESS IN R1 MOV #CSIBLK+C.DSDS,R2 ; DATASET POINTER IN R2 CLR R3 ; NO DEFAULT FILENAME BLOCK CALL .PARSE ; PARSE THE FDB BCC 20$ ; ALL OK SO SKIP ERROR MESSAGE CALL FERR ; ERROR (FCS) FOUND JMP START ; AND RE-START. 20$: TST WLDFLG ; WILDCARD OPERATION? BEQ RET ; IF EQ NO BIT #NB.VER, ; VERSION # SPECIFIED ? BNE RET ; IF NE, YES BIS #NB.SVR, ; NO, LIST ALL VERSIONS RET: CALL .FIND ; FIND THE FILE BCS OPNERR ; IF CARRY SET, ERROR TST WLDFLG ; IS THIS A WILD CARD ? BEQ OPEN ; IF EQ NO, SO GO DIRECTLY TO OPEN FILE ; CMP , ; DO WE HAVE A NEW FILE? ; BEQ RET ; NO, TRY AGAIN RET1: MOV #FDB+F.FNB,R1 ; ADDRESS OF FNB MOV N.STAT(R1), ; SAVE STATUS MOV N.NEXT(R1), ; SAVE INDEX POINTER CLR N.STAT(R1) ; CLEAR STATUS FOR .DLFNB CLR N.NEXT(R1) ; AND CONTEXT FOR NEXT .FIND ; WILL BE RESTORED FOR NEXT BR OPEN ; TRY AND OPEN FILE OPNERR: CMPB #IE.NSF,FDB+F.ERR ; IS IT NO SUCH FILE? BEQ 5$ ; YES 3$: CALL FERR ; NO, IT MUST BE AN FCS ERROR JMP START ; AND RE-START. 5$: TST WLDFLG ; IS THIS A WILDCARD OPERATION BEQ 3$ ; NO, NSF IS NOT NORMAL ; YES, NSF IS NORMAL. CLR ; RESET INDEX POINTER JMP START ; AND BACK FOR MORE .SBTTL OPEN - OPEN THE INPUT FILE ; ; OPEN THE FILE AND LOOK AT IT. ; OPEN: FDRC$R #FDB,#FD.PLC ; SET LOCATE MODE FDBF$R #FDB,,,#MBCT,#FD.RAH ; AND READ-AHEAD OPERATIONS CALL MAKNAM ; MAKE ASCII FILE NAME OFID$R #FDB ; OPEN THE FILE BY ID BCC LOOK ; FILE OPENED WITHOUT ERRORS CALL FERR ; PRINT FILE ERROR MOVB FDB+F.ERR,R0 ; COPY THE ERROR CODE CMPB #IE.PRI,R0 ; PRIVILEGE VIOLATION ? BEQ NEXT ; IF EQ, YES CMPB #IE.VER,R0 ; PARITY ERROR ON DEVICE? BEQ NEXT ; IF EQ, YES CMPB #IE.BBE,R0 ; BAD BLOCK ON DEVICE? BEQ NEXT ; IF EQ, YES CMPB #IE.FHE,R0 ; FATAL HARDWARE ERROR? BEQ NEXT ; IF EQ, YES CMPB #IE.BCC,R0 ; BLOCK OR CRC ERROR? BEQ NEXT ; IF EQ, YES CMPB #IE.LCK,R0 ; LOCKED FROM WRITE? BEQ NEXT ; IF EQ, YES CMPB #IE.WAC,R0 ; ACCESSED FOR WRITE? BEQ NEXT ; IF EQ, YES CMPB #IE.CKS,R0 ; HEADER CHECKSUM FAILURE? BEQ NEXT ; IF EQ, YES CMPB #IE.RER,R0 ; DEVICE READ ERROR? BEQ NEXT ; IF EQ, YES CMPB #IE.SNC,R0 ; FID, FILE NUMBER CHECK? BEQ NEXT ; IF EQ, YES CMPB #IE.SQC,R0 ; FID, SEQUENCE CHECK? BEQ NEXT ; IF EQ, YES CMPB #IE.CLO,R0 ; NOT PROPERLY CLOSED? BEQ NEXT ; IF EQ, YES CMPB #IE.BHD,R0 ; BAD FILE HEADER? BEQ NEXT ; IF EQ, YES CMPB #IE.EXP,R0 ; EXPIRATION DATE ? BEQ NEXT ; IF EQ, YES JMP START ; SOMETHING WORSE - GIVE UP. NEXT: TST WLDFLG ; IS THIS A WILDCARD OPEN? BGT 10$ ; YES, SO SKIP OVER JMP START ; NO ERRORS, SO CHECK FOR MORE 10$: MOV #FDB,R0 ; FDB ADDRESS IN R0 MOV #FDB+F.FNB,R1 ; FNB ADDRESS IN R1 MOV ,N.NEXT(R1) ; RESET FOR .FIND MOV ,N.STAT(R1) ; JMP RET ; AND LOOP SOMEMORE .SBTTL LOOK - LOOK AT THE CONTENTS OF THE FILE ;+ ; ; LOOK - SUBROUTINE TO LOOK AT THE CONTENTS OF A FILE. ; ;- .ENABL LSB LOOK:: CALL INIT ; DO INITIALIZATION CALL SETUP ; SETUP LIST PARAMETERS ; Check for CTRL/O. Only works on RSX-11M. GETNXT:: CLRB CTRLO+1 ; CLEAR CONTROL/O INDICATOR DIR$ #GETCHA ; GET TERMINAL CHARACTERISTICS BITB #2,CTRLO+1 ; DID USER TYPE CONTROL/O ? BNE 103$ ; IF NE, YES (NEXT FILE) GET$ #FDB,#BUFFER,#BUFSIZ,FILERR DEBUG:: MOV FDB+F.NRBD+2,R0 ; GET THE RECORD ADDRESS MOV FDB+F.NRBD,R1 ; AND THE BYTE COUNT CALL WRTBUF ; GO WRITE THE BUFFER CALL MARKER ; SEE IF RECORD NEEDS MARKED TSTB CRTFLG ; IS THIS A CRT ? BEQ GETNXT ; IF EQ, NO (DON'T WAIT) CMP LINCNT,MAXLIN ; TIME TO WAIT ? BLT GETNXT ; IF LT, NO ; End of screen processing for scopes. MOV #TEMP,R0 ; OUTPUT ADDRESS CALL MAKEPR ; MAKE THE PROMPT MOV #TEMP,R4 ; SET UP PROMPT ADDRESS CALL READ ; WAIT FOR RESPONSE BIT #B.EXIT!B.NEXT!B.KILL,STATUS ; EXIT, NEXT, OR KILL ? BNE 103$ ; IF NE, YES CALL MRKDOT ; MARK CURRENT RECORD 50$: BR GETNXT ; GET NEXT RECORD FILERR:: TST (SP)+ ; POP OFF RETURN ADDR BIT #B.KILL,STATUS ; WAS THE FILE DELETED ? BNE 100$ ; IF NE, YES (NO IE.EOF) CMPB F.ERR(R0),#IE.EOF ; IS IT EOF ? BEQ 100$ ; NO -- ERROR CALL FERR ; SIGNAL ERROR 100$: TSTB CRTFLG ; IS TERMINAL A CRT ? BEQ 110$ ; IF EQ, NO MOV #TEMP,R0 ; SETUP TO CREATE PROMPT MOV #EOFMSG,R1 ; END OF FILE MESSAGE CALL MOVE ; MOVE EOF MESSAGE CALL MAKEPR ; MOVE IN REST OF PROMPT MOV #TEMP,R4 ; FINALLY DO THE PROMPT MOV CURREC,TMPREC ; SAVE RECORD COUNT MOV CURREC+2,TMPREC+2 ; AND THE LOW BITS CALL READ ; WAIT FOR RESPONSE CMP CURREC,TMPREC ; DID WE CHANGE POSITION ? BNE GETNXT ; IF NE, YES CMP CURREC+2,TMPREC+2 ; MAYBE, DID WE REALLY ? BNE GETNXT ; IF NE, YES 103$: CALL WRTEOF ; WRITE EOF SEQUENCE 110$: BIT #B.KILL,STATUS ; WAS THE FILE DELETED ? BEQ 112$ ; IF EQ, NO TSTB VAXFLG ; RUNNING ON VAX/VMS ? BEQ 115$ ; IF EQ, NO MOV SAVNXT, ; RESET FOR NEXT FILE BR 115$ ; AND CONTINUE ... 112$: MOV ,SAVNXT ; SAVE CONTEXT FOR N.NEXT CLOSE$ #FDB ; CLOSE THE FILE. BCS 120$ ; IF CS, ERROR BIT #B.EXIT,STATUS ; USER WANT TO EXIT ? BNE 130$ ; IF NE, YES 115$: JMP NEXT ; OTHERWISE DO NEXT FILE 120$: CALL FERR ; OTHERWISE REPORT ERROR 130$: JMP START ; AND RE-START .DSABL LSB .SBTTL SETUP - SETUP LISTING PARAMETERS ;+ ; ; SETUP - Setup listing parameters. ; ;- SETUP:: ; VT100 Terminal. CLRB SETVT1 ; PRESUME NARROW OUTPUT CMPB #T.V100,TTYPE ; IS THIS A VT100 ? BNE 100$ ; IF NE, NO BIT #WISW,SWMASK ; WIDE LISTING DESIRED ? BNE 10$ ; IF NE, YES BIT #NASW,SWMASK ; NARROW LISTING DESIRED ? BNE 20$ ; IF NE, YES CMP #80.,FDB+F.RSIZ ; IS MAX RECORD > 80. ? BGE 20$ ; IF GE, NO 10$: INCB SETVT1 ; SET TERMINAL BACK TO 80. COLUMNS MOV #132.,LINWID ; SET MAXIMUM LINE WIDTH CMP TERM,#O.VAVO ; ADVANCED VIDEO OPTION ? BEQ 30$ ; IF EQ, YES MOV #11.,MAXLIN ; SET MAXIMUM # OF LINES BR 40$ ; AND CONTINUE ... 20$: MOV #80.,LINWID ; SETUP LINE WIDTH 30$: MOV #MVT100,MAXLIN ; SET MAXIMUM # OF LINES 40$: BR 300$ ; BR TO CONTINUE ; VT52 Terminal. 100$: CMPB #T.VT52,TTYPE ; IS THIS A VT52 ? BNE 200$ ; IF NE, NO MOV #MVT52,MAXLIN ; SET MAXIMUM # OF LINES MOV #80.,LINWID ; SETUP LINE WIDTH BR 300$ ; BR TO CONTINUE ; Tektronix Terminal. 200$: CMPB #T.UNK0,TTYPE ; IS THIS A TEKTRONIX ? BNE 300$ ; IF NE, NO BIT #WISW,SWMASK ; WIDE LISTING DESIRED ? BNE 210$ ; IF NE, YES BIT #NASW,SWMASK ; NARROW LISTING DESIRED ? BNE 220$ ; IF NE, YES CMP #121.,FDB+F.RSIZ ; IS MAX RECORD > 121. ? BGE 220$ ; IF GE, NO (NARROW) ; Tektronix wide listing. 210$: MOV #MTEKS,MAXLIN ; SET MAXIMUM # OF LINE MOV #133.,LINWID ; SETUP LINE WIDTH INCB SETTEK ; TEKTRONIX WIDE LISTING BR 300$ ; AND CONTINUE ... ; Tektronix narrow listing. 220$: MOV #MTEKM,MAXLIN ; SET MAXIMUM # OF LINES MOV #121.,LINWID ; SETUP LINE WIDTH CLRB SETTEK ; TEKTRONIX NARROW LISTING ; Write the file name and return. 300$: CALL WRTHDR ; WRITE THE FILE NAME RETURN .SBTTL UTILITY ROUTINES ;+ ; ; INIT - Initialize counters and flags for next file. ; ;- INIT: CALL $SAVAL ; SAVE RO - R5 CLR CURREC ; INIT CURRENT RECORD CLR CURREC+2 ; AND THE LOW WORD CLR RECCNT ; CLEAR HIGHEST RECORD CLR RECCNT+2 ; AND THE LOW WORD CLR OLDREC ; INIT THE OLD RECORD CLR OLDREC+2 ; AND THE LOW WORD CLR LINCNT ; CLEAR LINE COUNT CLR MARGIN ; START MARGIN AT ZERO CLR STATUS ; CLEAR LIST STATUS WORD MOV #132.,LINWID ; INITIALIZE LINE WIDTH MOV #MARKB,MARKP ; SET UP MARK POINTER MOV #-1,MARKC ; CLEAR MARK COUNTER MOV #OLDDOT,R0 ; SETUP TO CLR (R0)+ ; REWIND MOV #1,(R0)+ ; FILE CLR (R0) ; .... RETURN ;+ ; ; MOVE - Move a string terminated by NULL. ; ; Inputs: ; R0 = Output buffer address. ; R1 = Address of string to move. ; ;- MOVE:: MOVB (R1)+,(R0)+ ; MOVE STRING TO BUFFER BNE MOVE ; IF NE, MORE DEC R0 ; POINT AT NULL RETURN ;+ ; ; MAKEPR- Prompt user using the current record number. ; ; Inputs: ; CURREC = Current record number. ; R0 = Output buffer address. ; ;- MAKEPR:: MOV #CURREC,R1 ; DOUBLE WORD RECORD COUNT CLR R2 ; SUPPRESS LEADING ZEROES CALL $CDDMG ; CONVERT BINARY TO DECIMAL MOVB #'>,(R0)+ ; PUT IN ANGLE BRACKET MOVB #SPACE,(R0)+ ; AND A SPACE CLRB (R0)+ ; TERMINATOR RETURN .END LIST ; TRANSFER ADDRESS