.IDENT /1.2X/ ;+ ; ABSTRACT: LIST ; ; THIS PROGRAM WILL LIST A FILE TO TI: ; ; OPERATING PROCEDURES: ; ; MCR>LIST ; ; May be any legal RSX filespec, and may have ; *-file names. If a * is used, the version defaults ; to * automatically. for example, X.MAC, TEST.*, *.PLI. ; ; James G. Downward ; KMS Fusion, Inc ; P.O. Box 1567 ; Ann Arbor, Mich. 48106 ; ; This program is based primarily on GREP modified to remove unneeded ; code. It only handles the carriage control correctly for editable ; files (unlike PIP). ; ; ; MODIFIED: ; 15-JAN-80 OUTPUT CONTROL CHARACTERS ; ; 01-mar-82 Attach so can ^O, also allow ^C,^Y,^Z ; to abort listing. ; VERIFIED: ;- ; .MCALL QIOW$,EXIT$S .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND .MCALL FINIT$,FSRSZ$,FDBDF$,FDOP$A,CLOSE$,OFID$R,GET$ .MCALL FDBF$R,FDRC$R .MCALL FHDOF$,FDOF$L,NBOFF$ .MCALL ASTX$S ; ; MULTI-BUFFER COUNT ; MBCT = 2. ; .MACRO ERRMSG MSG .NCHR $$$, JSR R0,$TYPE .WORD $$$ .ASCII "MSG" .EVEN .ENDM FHDOF$ DEF$L ; DEFNE FILE HEADER OFFSETS NBOFF$ DEF$L ; DEFINE NAME BLOCK OFFSETS LOCALLY ; COMMAND LINE MACROS AND DATA BLOCKS GCLBLK: GCMLB$ 1,LIS,HEADER,2 CSI$ .EVEN CSIBLK: .BLKB C.SIZE ; CSI BLOCK .EVEN ; HEADER: .BLKB 82. STAT: .WORD 0 ; BUFFER FOR STATISTICS BLOCK .WORD 0 .WORD 0 WLDFLG: .WORD 0 ; FLAG FOR WILD CARDS .EVEN DEV: .ASCII /SY:/ .EVEN ; I/O MACROS AND DATA BLOCKS FDOF$L FSRSZ$ 1,MBCT* ; SET UP FOR ONE LUN. FDB: FDBDF$ ; START OF FDB FDOP$A 1,CSIBLK+C.DSDS BUFFER: .BLKB 1000 BUFLEN = .-BUFFER BUFEND: .WORD 0 LINFLG: .WORD 0 STRBUF: .BLKB 80. STRLEN = .-STRBUF ; ; READ AND DECODE THE COMMAND LINE ; ; 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) ; THAT IT IS MANDATORY TO PUT IN A DEV: IN THE FILE SPEC, 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 TST ; THE COMMAND LINE TO SEE IF A DEV: IS SPECIFIED. IF NOT INSERT A 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. ; ; LIST: FINIT$ ; INITIALIZE FSR START: 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 EXIT$S ; 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: EXIT$S ; NO INPUT SO EXIT SERR: ERRMSG JMP START ; CONTIN: CLR WLDFLG ; ASSUME NO WILDCARDS TO START WITH TST ; IS ANYTHING TYPED BNE 1$ ; YES -- INTERPRET IT JMP START ; 1$: CLRB STRBUF ; NUL PAD THE STRING BUFFER. 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 BITB #CS.EQU,(R0) ; WAS AN EQUAL SIGN SEEN? BNE SERR ; IF NE, EQUAL SIGN SEEN CSI$2 #CSIBLK,OUTPUT ; 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) ; WAS A DEVICE SPECIFIER FOUND IN THE CURRENT COMMAND BNE 15$ ; IF NE YES, SO DON'T FILL IN SY: ; NO SO, FIRST 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 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 RETURN ; IF EQ NO BIS #NB.SVR, ; YES, SO ARBITRARILY WE WILL SET THE FLAG BIT ; TO INSURE ANY VERSION WILL BE OPENED RETURN: 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 RETURN ; NO, TRY AGAIN RET1: MOV , ; SAVE INDEX POINTER MOV , ; SAVE STATUS 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 ; ; OPEN THE FILE AND LOOK AT IT. ; OPEN: CLR LINFLG ; CLEAR HEADER PRINT FLAG. FDRC$R #FDB,#FD.PLC FDBF$R #FDB,,,#MBCT,#FD.RAH OFID$R #FDB ; OPEN THE FILE BY ID BCC LOOK ; FILE OPENED WITHOUT ERRORS CALL FERR ; PRINT FILE ERROR CMPB #IE.PRI,FDB+F.ERR ; DID WE PERHAPS HAVE A PRIVLEGE VIOLATION? ; IF SO IGNORE IT AND CONTINUE BECAUSE FILES ; MAY BE ENTERED FROM ONE DIRECTORY INTO ANOTHER BNE 1$ ; PRIVLEGE VIOLATION - DON'T TRY TO OPEN JMP NEXT ; PRIVLEGE VIOLATION. 1$: CMPB #IE.VER,FDB+F.ERR ; PARITY ERROR ON DEVICE? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.BBE,FDB+F.ERR ; BAD BLOCK ON DEVICE? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.FHE,FDB+F.ERR ; FATAL HARDWARE ERROR? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.BCC,FDB+F.ERR ; BLOCK OR CRC ERROR? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.LCK,FDB+F.ERR ; LOCKED FROM WRITE? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.WAC,FDB+F.ERR ; ACCESSED FOR WRITE? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.CKS,FDB+F.ERR ;HEADER CHECKSUM FAILURE? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.RER,FDB+F.ERR ; DEVICE READ ERROR? BEQ NEXT ; YES -- DON'T TRY TO OPEN CMPB #IE.SNC,FDB+F.ERR ; FID, FILE NUMBER CHECK? BEQ NEXT ; YES CMPB #IE.SQC,FDB+F.ERR ; FID, SEQUENCE CHECK? BEQ NEXT ; YES CMPB #IE.CLO,FDB+F.ERR ; NOT PROPERLY CLOSED? BEQ NEXT ; YES CMPB #IE.BHD,FDB+F.ERR ; BAD FILE HEADER? BEQ NEXT ; YES CMPB #IE.EXP,FDB+F.ERR ; EXPIRATION DATE ? BEQ NEXT ; YES JMP START ; SOMETHING WORSE - GIVE UP. LOOK: DIR$ #ATTDPB ; ATTACH TERMINAL 16$: GET$ #FDB,#BUFFER,#BUFLEN,FILERR TST XITFLG ; Should we exit BGT 18$ ; If GT, yes MOV FDB+F.NRBD+2,QIOW+Q.IOPL MOV FDB+F.NRBD,QIOW+Q.IOPL+2 TST QIOW+Q.IOPL+2 ; IS THIS A ZERO LENGTH RECORD BEQ 17$ ; IF EQ YES DIR$ #QIOW ; EXECUTE QIO BR 16$ ; AND LEAVE. 17$: DIR$ #SPACE ; ISSUE A SPACE, LF,CR BR 16$ ; AND READ SOME MORE 18$: MOV #IE.EOF,F.ERR(R0); Requested exit, make it look like EOF DIR$ #DETDPB ; Detach terminal BR EOF ; And skip popping return address FILERR: DIR$ #DETDPB ; DETACH TERMINAL TST (SP)+ ; POP OFF RETURN ADDR EOF: CMPB F.ERR(R0),#IE.EOF ; IS IT EOF? BEQ 10$ ; NO -- ERRPR CALL FERR ; SIGNAL ERROR 10$: CLOSE$ #FDB ; CLOSE THE FILE. BCC NEXT ; FILE COULD BE OPEND AND CLOSED CALL FERR ; FILE COULD EITHER NOT BE OPEND ; OR CLOSED JMP START ; AND RE-START 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 , ; RESET FOR .FIND MOV , ; JMP RETURN ; AND LOOP SOMEMORE FERR: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ; SAVE R3 MOV #M.FCS,R1 ; ADDR OF FCS MSG MOV #L.FCS,R2 ; LENGTH OF FCS MSG CALL .PRFCS ; PRINT FCS MSG FERR1: MOV #DEVMSG,R1 ; POINT TO DEVICE MSG MOV #40.,R0 ;GET MAX LENGTH. MOV CSIBLK+C.DEVD,R2 ; GET DEVICE SPEC LEN BLE 12$ ; NONE? MOV CSIBLK+C.DEVD+2,R3 ; GET DEVICE SPEC ADDR 10$: MOVB (R3)+,(R1)+ ; MOVE IN DEVICE SPEC DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 SOB R2,10$ ; MOVE IN DEVICE SPEC MOVB #':,(R1)+ ; MOVE IN A : DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 12$: MOV CSIBLK+C.DIRD,R2 ; GET UIC SPEC LEN BLE 22$ ; NONE? MOV CSIBLK+C.DIRD+2,R3 ; GET UIC SPEC ADDR 20$: MOVB (R3)+,(R1)+ ; MOVE IN UIC SPEC DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 SOB R2,20$ ; MOVE IN ALL OF UIC 22$: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ; AND R1 MOV #TEMP,R0 ; POINT TO HEADER BUFFER. MOVB #':,(R0)+ ; BASE PTR MOV FDB+F.FNB+N.FNAM,R1 ; CONVERT FNAM TO RAD50 CLR R2 ; CALL $C5TA ; MOV FDB+F.FNB+N.FNAM+2,R1 CALL $C5TA MOV FDB+F.FNB+N.FNAM+4,R1 CALL $C5TA 30$: CMPB #' ,-(R0) ;IS IT A BLANK? BEQ 30$ ;YES INC R0 ; MOV FDB+F.FNB+N.FTYP,R1 BNE 35$ ; PRINT IT IF SPECIFIED CMP R0,#TEMP+1 ;IS THIS THE BEG. OF STRING? BNE 45$ ; NO -- DON'T PRINT THE . 35$: MOVB #'.,(R0)+ ; MOVE IN A . CALL $C5TA ;TYPE FIELD TO ASCII 40$: CMPB #' ,-(R0) ;IS IT A BLANK? BEQ 40$ ;YES INC R0 ; 45$: MOV FDB+F.FNB+N.FVER,R1 ;GET FILE VERSION BEQ 50$ ;NONE? MOVB #';,(R0)+ ;MOVE IN A ';' CLR R2 ; SUPPRESS 0'S CALL $CBOMG ; CONVERT VERSION # 50$: MOV #TEMP+1,R3 ; SAVE ADDR SUB R3,R0 ; COMPUTE LENGTH MOV R0,R2 ;SAVE IN R2 MOV (SP)+,R1 ;RECOVER R1 MOV (SP)+,R0 ;RECOVER R0 60$: MOVB (R3)+,(R1)+ ; MOVE IN FILE DEC R0 ; DEC TOTAL SPACE BLE 80$ ; SKIP OUT ON 0 SOB R2,60$ ; MOVE IN ENTIRE FILE 80$: SUB #DEVMSG,R1 ;COMPUTE LEN OF MSG MOV #DEVMSG,QIOW+Q.IOPL ; PUT IN ADDR OF MSG MOV R1,QIOW+Q.IOPL+2 ; AND LENGTH DIR$ #QIOW ; DO I/O MOV (SP)+,R3 ;RECOVER R3 MOV (SP)+,R2 ; RECOVER R2 MOV (SP)+,R1 ; RECOVER R1 MOV (SP)+,R0 ; RECOVER R0 RTS PC $TYPE: MOV (R0)+,QIOW+Q.IOPL+2 ;MOVE IN QIO LENGTH MOV R0,QIOW+Q.IOPL ;AND ADDRESS DIR$ #QIOW ; EXECUTE WRITE ADD -2(R0),R0 ;ADD IN QIO LENGTH INC R0 ;INC R0 TO GET TO EVEN BOUND. BIC #1,R0 ;CLEAR LOW BIT - RTS TO EVEN BOUND. RTS R0 ;AND RETURN TO CALLER. .SBTTL PRFCS - PRINT FCS ERROR CODE ;+ ; ABSTRACT: .PRFCS ; ; SUBROUTINE TO GET A TEXTUAL EXPLANATION FOR AN FCS ERROR. ; ; CALLING SEQUENCE: ; ; JSR PC,.PRFCS ; ; ARGUMENTS: ; ; R0 ADDRESS OF THE FDB WHICH HAD THE ERROR. ; R1 ADDRESS OF A USER TASKNAME BUFFER. ; R2 SIZE OF THE USER BUFFER. ; ; ON RETURN, ALL REGESTERS ARE UNCHANGED. ; ; WRITTEN: 18-JUN-77, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED: 13-APR-79, -1.0.0-, BRUCE C. WRIGHT ;- ; ; .MCALL QIOW$S,WSIG$S,ALUN$S,GLUN$S .PRFCS:: MOV R3,-(SP) MOV R4,-(SP) ; SAVE R4 ... MOV R5,-(SP) ; ... AND R5 MOVB F.ERR(R0),R5 ; GET ERROR CODE CLR R4 NEG R5 ; MAKE CODE POSITIVE. BLE 10$ ; NO ERROR -- LEAVE. DIV #10.,R4 ; DIVIDE THE CODE BY 10. SWAB R5 ; PUT RESULT IN HIGH BYTE. BIS R5,R4 ; SET THE LOW ORDER. BIS #"00,R4 ; MAKE IT NUMERIC. MOV #BUFER,R3 ; POINT TO BUFFER. MOV R1,-(SP) MOV R2,-(SP) BLE 4$ ; NO 3$: MOVB (R1)+,(R3)+ ; SOB R2,3$ ; MOVE THINGS INTO BUFFER. 4$: MOV (SP)+,R2 MOV (SP)+,R1 MOV #STDSW,R5 ; GET DSW STRING TSTB F.ERR+1(R0) ; IS IT A DSW CODE? BMI 5$ ; YES MOV #STFCS,R5 ; NO 5$: MOVB (R5)+,(R3)+ ; MOVE IN THE STRING. BNE 5$ ; LOOP UNTIL "DONE" MOVB R4,-1(R3) ; MOVE IN LOW ORDER ERROR CODE SWAB R4 ; MOVB R4,(R3)+ ; AND HIGH ORDER ERROR CODE SUB #12.,SP ; GET SPACE FOR GLUN$ BUFFER. MOV SP,R5 ; POINT TO IT. GLUN$S .MOLUN,R5 ; GET LUN INFORMATION. ALUN$S .MOLUN,#"TI,#0 ; ALLOCATE THE LUN. SUB #BUFER,R3 ; COMPUTE LENGTH OF QIO 10$: QIOW$S #IO.WVB,.MOLUN,#30.,,,,<#BUFER,R3,#40> CMP @#$DSW,#-1 ; NO NODES? BNE 20$ ; NO -- OK WSIG$S ; WAIT A BIT BR 10$ ; AND TRY AGAIN. 20$: MOVB 2(R5),R4 ; GET THE UNIT NUMBER. ALUN$S .MOLUN,(R5),R4 ; FIXUP .MOLUN AGAIN. ADD #12.,SP ; POP BUFFER. MOV (SP)+,R5 ; RECOVER R5 MOV (SP)+,R4 ; RECOVER R4 MOV (SP)+,R3 ; RECOVER R3 RETURN ; AND RETURN. ;+ ; INPAST ; Catch an unsolicited input AST. If the user types ; Control_Y or Control-Z, close files and exit. ; Otherwise ignore. ;- CTRLC=3 CTRLY=31 CTRLZ=32 INPAST: BIC #177400,(SP) ; Clear off the high byte CMP (SP),#CTRLC ; Is it control_C BEQ 10$ ; If EQ, yes CMP (SP),#CTRLY ; Is it control_Y? BEQ 10$ ; If EQ, yes CMP (SP),#CTRLZ ; Is it Control_Z BNE 20$ ; If NE, no 10$: INC XITFLG ; Show we should exit 20$: TST (SP)+ ; Otherwise pop stack ASTX$S ; ; STRING DESCRIPTOR FOR GETTING ERROR NAME ; ; ; LUN FOR MO.... ; .MOLUN::.WORD 0 ; ; BUFFER FOR FCS CODE ; BUFER: .BLKB 80. BUFLN = .-BUFFER ; ; STRINGS FOR USE IF MO.... FAILS. ; STFCS: .ASCIZ / -- FCS -/ STDSW: .ASCIZ / -- DSW -/ .EVEN SPA: .ASCII / / .EVEN ; TERMINAL QIO QIOW: QIOW$ IO.WVB,3,1,,,,<0,0,40> SPACE: QIOW$ IO.WVB,3,1,,,, ATTDPB: QIOW$ IO.ATA!TF.XCC,3,1,,,, DETDPB: QIOW$ IO.DET,3,1 XITFLG: .WORD 0 ; If >0, close and exit M.FCS: .ASCII /LIS/ L.FCS = .-M.FCS ; ERROR MESSAGES DEVMSG: .BLKB 40. .EVEN TEMP: .BLKB 40. .END LIST