.TITLE LIST - LIST FILE(S) TO THE TERMINAL .IDENT /6.6/ .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: ; ;- .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, RCML$ .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 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 EBSW == 10 ; EBCDIC TO ASCII ASSW == 20 ; ASCII TO EBCDIC VFSW == 40 ; CONVERT PRINTER VFC FESW == 100 ; FORCE USER TO EXIT FFSW == 200 ; PASS FORMFEEDS VTSW == 400 ; VT100 WITHOUT AVO ; ; LIST status bit definitions: ; B.EXIT == 1 ; EXIT FLAG B.NEXT == 2 ; NEXT FILE FLAG B.KILL == 4 ; FILE KILLED (DELETED) B.EOF == 10 ; END OF FILE B.SRCH == 20 ; SEARCH STRING FOUND B.GBL == 40 ; DOING A GLOBAL SEARCH B.BACK == 100 ; BACKING UP PARTIAL PAGE B.PINV == 200 ; CURRENT PAGE MARK INVALID B.FULL == 400 ; LISTING FULL PAGES (0=HALF) B.FORW == 1000 ; SCROLLING FORWARD (0=BACKWARD) ; ; 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 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$SW EB,EBSW,SWMASK ; /EB - EBCDIC TO ASCII CSI$SW AS,ASSW,SWMASK ; /AS - ASCII TO EBCDIC CSI$SW VF,VFSW,SWMASK,,NEG ; /VF - LINE PRINTER VFU CSI$SW FE,FESW,SWMASK ; /FE - FORCE EXIT CSI$SW FF,FFSW,SWMASK ; /FF - PASS FORMFEEDS CSI$SW VT,VTSW,SWMASK ; /VT - VT100 WITHOUT AVO CSI$ND DEFSW = VFSW ; DEFAULT SWITCH MASK SWMASK:: .WORD 0 ; STORE SWITCH MASK HERE HEADER:: .BLKB 82. ; STORE COMMAND LINE HERE 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 FDB1:: FDBDF$ ; FDB FOR INPUT FILE FDOP$A DSKLUN,CSIBLK+C.DSDS,,FO.RD!FA.SHR FDB2:: FDBDF$ ; FDB FOR 2ND INPUT FILE OUTFDB:: FDBDF$ ; FDB FOR OUTPUT FILE FDBADR:: .WORD FDB1 ; ADDRESS OF CURRENT FDB FNBADR:: .WORD FDB1+F.FNB ; ADDRESS OF CURRENT FNB 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). ; 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!TF.ESQ,OUTLUN,OUTEFN ; ATTACH DPB FOR OUTPUT DEVICE DETACH: QIOW$ IO.DET,OUTLUN,OUTEFN ; DETACH DPB FOR OUTPUT DEVICE 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. ; PROMPT:: .BLKB 40. ; PROMPT STRING BUFFER .EVEN ; ; Local storage area: ; .GLOBL LINCNT, LINWID, LSTREC, MARGIN, MAXLIN, OLDDOT .GLOBL OLDREC, SAVDOT, SAVREC, 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 ; CURRENT PAGE MARKER OLDREC: .WORD 0,0 ; AND THE RECORD NUMBER SAVDOT: .WORD 0,0,0 ; NEXT PAGE MARKER SAVREC: .WORD 0,0 ; AND THE RECORD NUMBER 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. ; ;- ;+ ; ; Start of main line code. ; ;- LIST:: MOV @#.FSRPT,R0 ; GET POINTER TO FSR TST A.DFUI(R0) ; HAS .FINIT BEEN DONE (DDT) BNE 10$ ; IF NE, YES (DO ONLY ONCE) FINIT$ ; INIT FILE STORAGE REGION 10$: DIR$ #TIASN ; ASSIGN LUN TO TI0: DIR$ #ATTACH ; ATTACH OUTPUT DEVICE CALL GTTYPE ; GET TERMINAL TYPE MOV #DEFSW,SWMASK ; SETUP DEFAULT SWITCHES START:: CLRB FILNAM ; INIT TO NO FILNAM MOV #GCLBLK,FDBADR ; SETUP THE FDB ADDRESS GCML$ #GCLBLK ; GET COMMAND LINE BCC CONTIN ; IF CC, NO ERRORS CMPB #GE.EOF,GCLBLK+G.ERR ; END OF FILE DETECTED ? BEQ EXIT ; IF EQ, YES (EXIT) ; For the errors GE.IOR & GE.OPR, F.ERR in the FDB has the error code. CMPB #GE.IOR,GCLBLK+G.ERR ; I/O ERROR DETECTED ? BEQ 100$ ; IF EQ, YES CMPB #GE.OPR,GCLBLK+G.ERR ; FILE OPEN ERROR ? BEQ 100$ ; IF EQ, YES CMPB #GE.BIF,GCLBLK+G.ERR ; SYNTAX ERROR ? BEQ SERR ; IF EQ, YES CMPB #GE.MDE,GCLBLK+G.ERR ; MAX @ DEPTH EXCEEDED ? BNE 100$ ; IF NE, NO (TRY FCS ERROR) ERRMSG <%LIST-F-TOOMANY, maximum @ file depth exceeded> BR START ; RESTART THE PROGRAM ; Report an FCS error code. 100$: CALL FCSERR ; REPORT THE ERROR CODE BR START ; AND RESTART SERR: ERRMSG <%LIST-W-SYNERR, syntax error> BR START ; RESTART THE PROGRAM EXIT: CLRB SETBF+1 ; SET TO DISABLE ESCSEQ DIR$ #SETCHA ; DISABLE ESCAPE SEQUENCES DIR$ #DETACH ; DETACH OUTPUT DEVICE EXIT$S ; NO INPUT SO EXIT CONTIN:: CLR WLDFLG ; ASSUME NO WILDCARDS CLR SAVNXT ; INIT SAVE NEXT WORD MOV #FDB1,FDBADR ; SETUP INPUT FDB ADDRESS MOV #FDB1+F.FNB,FNBADR ; AND THE FNB ADDRESS 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 FDBADR,R0 ; GET THE FDB ADDRESS MOV FNBADR,R1 ; AND THE FNB ADDRESS 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 FCSERR ; 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 FNBADR,R1 ; GET THE FNB ADDRESS 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,FDB1+F.ERR ; IS IT NO SUCH FILE? BEQ 5$ ; YES 3$: CALL FCSERR ; 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 #FDB1,#FD.PLC ; SET LOCATE MODE FDBF$R #FDB1,,,#MBCT,#FD.RAH ; AND READ-AHEAD OPERATIONS CALL MAKNAM ; MAKE ASCII FILE NAME OFID$R #FDB1 ; OPEN THE FILE BY ID BCC LOOK ; FILE OPENED WITHOUT ERRORS CALL FCSERR ; PRINT FILE ERROR MOVB FDB1+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 FDBADR,R0 ; GET THE FDB ADDRESS MOV FNBADR,R1 ; AND THE FNB ADDRESS 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 100$ ; IF NE, YES (NEXT FILE) CALL GET ; GET THE NEXT RECORD BCS FILERR ; IF CS, ERROR CALL MARKER ; SEE IF RECORD NEEDS MARKED CALL WRTBUF ; GO WRITE THE BUFFER TSTB TERM ; IS THIS A HARDCOPY ? BEQ GETNXT ; IF EQ, YES (DON'T WAIT) CMP LINCNT,MAXLIN ; TIME TO WAIT ? BLT GETNXT ; IF LT, NO ; End of screen processing for scopes. CALL MAKEPR ; MAKE THE PROMPT CALL CHKCMD ; GET AND CHECK COMMAND BIT #B.EXIT!B.NEXT!B.KILL,STATUS ; EXIT, NEXT, OR KILL ? BNE 100$ ; IF NE, YES 50$: CALL MRKDOT ; MARK CURRENT RECORD BR GETNXT ; GET NEXT RECORD FILERR:: TSTB TERM ; IS TERMINAL A HARDCOPY ? BEQ 110$ ; IF EQ, YES (NO PROMPT) CALL MAKEPR ; MAKE THE PROMPT MOV CURREC,TMPREC ; SAVE RECORD COUNT MOV CURREC+2,TMPREC+2 ; AND THE LOW BITS BIT #FESW,SWMASK ; USER SPECIFY FORCE EXIT ? BEQ 60$ ; IF EQ, NO BIC #B.FORW!B.EOF,STATUS ; YES, SCROLL BACKWARD 60$: CALL CHKCMD ; GET AND CHECK COMMAND BIT #B.EXIT!B.NEXT!B.KILL,STATUS ; EXIT, NEXT, OR KILL ? BNE 100$ ; IF NE, YES (EXIT) BIT #FESW,SWMASK ; USER SPECIFY FORCE EXIT ? BNE 50$ ; IF NE, YES (DON'T EXIT) CMP CURREC,TMPREC ; DID WE CHANGE POSITION ? BNE 50$ ; IF NE, YES CMP CURREC+2,TMPREC+2 ; MAYBE, DID WE REALLY ? BNE 50$ ; IF NE, YES 100$: 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 MOV FDBADR,R0 ; COPY THE FDB ADDRESS TST F.BDB(R0) ; IS THE FILE OPEN ? BEQ 115$ ; IF EQ, NO (SKIP CLOSE) CLOSE$ R0 ; CLOSE THE INPUT 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 FCSERR ; OTHERWISE REPORT ERROR 130$: MOV FDBADR,R0 ; GET THE FDB ADDRESS BITB #FD.TTY,F.RCTL(R0) ; INPUT FROM THE TERMINAL ? BNE 140$ ; IF NE, YES RCML$ #GCLBLK ; CLOSE THE COMMAND FILE 140$: 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 #VTSW,SWMASK ; VT100 WITHOUT AVO ? BEQ 5$ ; IF EQ, NO MOV #O.V100,TERM ; SET FOR PLAIN VT100 5$: BIT #WISW,SWMASK ; WIDE LISTING DESIRED ? BNE 10$ ; IF NE, YES BIT #NASW,SWMASK ; NARROW LISTING DESIRED ? BNE 20$ ; IF NE, YES CMP #80.,FDB1+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.,FDB1+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 MOV #B.FORW!B.FULL,STATUS ; SETUP DEFAULT FLAGS 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 .SBTTL MAKEPR - MAKE PROMPT STRING FROM RECORD # ;+ ; ; MAKEPR - Make prompt string using the record number. ; ; Inputs: ; CURREC = Current record number. ; ;- MAKEPR: MOV #PROMPT,R0 ; PROMPT STRING BUFFER BIT #B.EOF,STATUS ; ARE WE AT END OF FILE ? BEQ 20$ ; IF EQ, NO MOV #EOFMSG,R1 ; END OF FILE MESSAGE 10$: MOVB (R1)+,(R0)+ ; MOVE STRING TO BUFFER BNE 10$ ; IF NE, MORE DEC R0 ; POINT AT NULL 20$: 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