.TITLE START .IDENT /M03.1/ ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY ; OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE ; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ; AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO AND ; OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION M03 ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; RUNOFF START UP INITIALIZATION ; ; MACRO LIBRARY CALLS ; .MCALL CLOSE$,CSI$,CSI$1,CSI$2,EXIT$S,GCMLD$ .MCALL GCML$,GPRT$S,GTSK$S,OPEN$R,OPEN$W,PRINT$ CSI$ ;DEFINE CSI CONTROL BLOCK OFFSETS GCMLD$ ; ; LOCAL MACROS ; ; ERROR MESSAGE OUTPUT ; ; ; LOCAL DATA ; ; CSI CONTROL BLOCK ; .PSECT $VARS,RW,LCL,D,CON CSIBL: .BLKB C.SIZE ; Block for command line, .REQ input ; ; TASK MEMORY LIMITS ; LIMIT: .LIMIT .PSECT TEXT,RO,LCL,D,CON TOCHD: .ASCII /.TOC/ .PSECT $CODE,RO,I,LCL,CON ; ; $START-START UP INITIALIZATION ; $START::MOV SP,SPSAV ; SAVE INITIAL STACK POINTER OPEN$W #TTBLK ; Open error output file RETURN ; done ; ; Restart after errors or at end of processing ; RESTRT:: ; ; Close all files ; CLOSE$ #LSTBLK ; Close output file CLOSE$ #TOCBLK ; Close TOC file MOVB LUNSTK+1,R4 ; MAX NUMBER OF LUNS*2 15$: CLOSE$ FDBTAB(R4) ; CLOSE INPUT FILE SUB #2,R4 ; NEXT ENTRY? BGE 15$ ; YES ; ; Get a command ; GCML$ #TTIBLK ; Get a command BCC 30$ ; Command ? CMPNEB #GE.EOF,G.ERR(R0),20$ ; Not top level eof ? CLOSE$ #TTBLK ; Close error output CLOSE$ #TTIBLK ; Close command input EXIT$S ; EXIT ********** 20$: MOV #15.,R0 ; Command error message 21$: JMP ILINP ; Process message ; ; Start parsing input command ; 30$: MOV G.CMLD(R0),R1 ; GET BYTE COUNT BEQ RESTRT CSI$1 #CSIBL,TTIBLK+G.CMLD+2,R1 ; CHECK SYNTAX BCS 20$ CMPEQ #CS.EQU,CSIBL+CS.EQU,20$ ; No equals sign? CSI$2 #CSIBL,INPUT,#SWTBL BCC 50$ 40$: MOV #18.,R0 ; Input file error message BR 21$ ; Process it ; ; Parse for input file ; 50$: MOV #TRCBUF+2,TRCBUF ; Set in address CALL TRCGET ; Set up traceback BITNEB #CS.MOR!CS.WLD,C.STAT(R0),40$ ; Wild or multiple files? BITEQB #CS.DVF!CS.NMF,C.STAT(R0),40$ ; No input device or filename? OPEN$R #LUN4,,#CSIBL+C.DSDS BCC 60$ MOV #19.,R0 ; Input file open error BR 21$ ; ; First output file ; 60$: CSI$2 #CSIBL,OUTPUT,#SWTBL ; Get output file spec BCC 80$ ; Ok? 70$: MOV #16.,R0 ; Output file error JMP 21$ 80$: BITNEB #CS.WLD,C.STAT(R0),70$ ; Wild? BITEQB #CS.DVF!CS.NMF,C.STAT(R0),70$ ; No output device or filename? CLRB LSTBLK+F.RATT ; No file attributes BITNEB #CRSW,$SWTCH,81$ ; Imbedded carriage control? MOVB #FD.CR,LSTBLK+F.RATT ; File mode is "CR" MOVB #-1,$HSPSW ; Disable half spacing 81$: OPEN$W #LSTBLK,,#CSIBL+C.DSDS ; Open output file BCC 90$ ; No error? 85$: MOV #17.,R0 ; Output file open error JMP 21$ ; ; Second output file ; 90$: BITEQB #CS.MOR,C.STAT+CSIBL,100$ ; No more files ? CSI$2 #CSIBL,OUTPUT,#SWTBL ; Get output file spec BCS 70$ ; Bad spec BITNEB #CS.MOR!CS.WLD,C.STAT(R0),70$ ; Wild or more files ? BITEQB #CS.DVF!CS.NMF,C.STAT(R0),70$ ; No output device or filename? OPEN$W #TOCBLK,,#CSIBL+C.DSDS ; Open output file BCS 85$ ; Bad output file CLRB $TOCSW ; Set TOC switch MOV #TOCHD,R1 ; TOC header MOV #4,R2 ; Number of char CALL OUTTOC ; Into TOC file ; ; Check switches ; 100$: MOV PRMRG, RMARG ; SET RIGHT MARGIN TST PNLPG ; SEE IF /PS::N GIVEN BNE 105$ MOV #INLPG, PNLPG ; REINITIALIZE 105$: MOV PNLPG, NLPG ; AND PAGE LENGTH MOVB #'_,$ULCH ; Underline char as underscore CMPNEB #'B,ULSWT,110$ ; NOT BACKSPACE MODE? COMB $ULMSW ; SET BACKSPACE MODE BR 130$ 110$: CMPNEB #'S,ULSWT,120$ ; NOT SIMULATE MODE? COMB $ULSSW ; SET SIMULATE SWITCH MOVB #'-,$ULCH ; Set underline char to hyphen BR 130$ 120$: CMPEQB #'L,ULSWT,130$ ; LINE MODE? COMB $UNLSW ; SET NO UNDERLINE SWITCH 130$: CLR R1 ; SET TO CLEAR CASE SHIFT BITEQ #UPCSW,$SWTCH,140$ ; NO UPPER CASE REQUIRED? MOV #401,R1 ; REQUIRED UPPER 140$: MOV R1,CASE ; SET CASE BITNE #HYPSW,$SWTCH,150$ ; HYPHENATION SWITCH? MOVB #-1,$HYPSW ; SET IT PERMENANTLY OFF 150$: GTSK$S #CSIBL ; GET TASK PARAMETERS MOV CSIBL+G.TSTS,R4 ; SIZE OF PARTITION IN BYTES GPRT$S ,#CSIBL ; STARTING VIRTUAL ADDRESS ADD $DSW,R4 ; ENDING VIRTUAL ADDRESS MOV R4,XTOP ; INITIAL INDEX POINTER MOV LIMIT+2,XBOT ; Xbot = top memory location CLR LNKHD ; New linked list of buffers CALL LNKSET ; Set up linked list of buffers CALL LINSET ; SET UP FOR LINE CALL OPRWAT ; WAIT FOR OPERATOR ? CLR TTBLK+F.NRBD ; CLEAR OUTPUT BUFFER JMP LGO ; AND INTO MAIN LOOP ENDFIL:: .IF NDF RSTS BITEQ #SPLSW,$SWTCH,10$ ; DON'T SPOOL TEXT FILE? PRINT$ #LSTBLK ; SUBMIT FILE TO PRINT SYMBIONT .ENDC 10$: JMP RUNOFF ; START AT TOP AGAIN ; ; THIS IS INCLUDED HERE SINCE IT USES CSI$ ; ; REQUIRE command ; REQUR:: CMPB LUNSTK,LUNSTK+1 ; AT END OF STACK? BHIS 50$ ; YES CALL GETFIL ; Get input file MOVB LUNSTK,R0 ; GET POINTER MOV FDBTAB+2(R0),R0 ; GET FDB BLOCK OPEN$R R0,,#CSIBL+C.DSDS ; OPEN FILE BCS BADOP ; NOT OPEN 10$: MOV BUFADD,R3 ; GET OLD BUFFER CLR BF.CNT(R0) ; EMPTY CURRENT INPUT BUFFER MOVB LUNSTK,R0 ; GET STACCK ADD #2,R0 ; NEXT ENTRY MOVB R0,LUNSTK ; SAVE CURRENT STACK ; MOV BUFTAB(R0),R3 ; AND BUFFER ADDRESS ; MOV R3,BUFADD ; SAVE IT MOV BUFADD,R3 ; Current buffer address CALL CLRBF ; CLEAR THE BUFFER MOV #CR,R1 ; GET CARRIAGE RET TO SIGNAL END OF LINE CALL PBYT ; INTO BUFFER MOV #LF,R1 ; PUT LF INTO BUFFER AS END LINE CALL PBYT ; INTO BUFFER CALL BEGBF ; SET TO TOP OF BUFFER ADD #TRCLN,TRCBUF ; Next traceback buffer CALL TRCGET ; Set up traceback RETURN 50$: MOV #20.,R0 ; Too many nested .REQ JMP ILCMA BADOP: MOVB F.ERR(R0),R1 ; GET ERROR CLOSE$ R0 ; CLOSE BAD FILE MOV #19.,R0 ; Open failure JMP ILCMA GETFIL: CALL GETLIT ; GET LITERAL ADDRESS BCS 30$ ; NONE TO GET CSI$1 #CSIBL,R2,R1 ; INIT CSI BLOCK TO PARSE INPUT BCS 40$ ; BAD INPUT CSI$2 #CSIBL,OUTPUT ; GET FILE SPEC BCS 40$ ; BAD FILE BITNEB #CS.MOR!CS.WLD!CS.EQU,C.STAT(R0),40$ ; More,wild, or =? BITEQB #CS.NMF,C.STAT(R0),40$ ; No file name? RETURN 30$: JMP ILCM ; ILLEGAL COMMAND 40$: MOV #18.,R0 ; Illegal file spec JMP ILCMA TRCGET: MOV TRCBUF,R3 ; Buffer to save in CLR (R3)+ ; Set line count MOV #37.,R4 ; Maximum number of bytes MOV #CSIBL,R0 MOV C.DEVD+2(R0),R1 ; File name MOV C.DEVD(R0),R2 ; Byte count BITB #CS.DVF,C.STAT(R0) ; Dir ? CALL 50$ ; Put into buffer MOV C.DIRD+2(R0),R1 ; File name MOV C.DIRD(R0),R2 ; Byte count BITB #CS.DIF,C.STAT(R0) ; Dir ? CALL 50$ ; Put into buffer MOV C.FILD+2(R0),R1 ; File name MOV C.FILD(R0),R2 ; Byte count BITB #CS.NMF,C.STAT(R0) ; Dir ? CALL 50$ ; Put into buffer CLRB (R3)+ ; Final byte RETURN 50$: BEQ 70$ ; Count too small 55$: MOVB (R1)+,(R3)+ ; Save 1 byte DEC R4 BLE 60$ SOB R2,55$ CLRB (R3) ; Terminal byte RETURN 60$: TST (SP)+ ; pop return 70$: RETURN .END