.TITLE INPUT/OUPUT LINES .GLOBL DEBUG,FINLIN,LIN,LINPT,EOF,FILLER,LINCTR,PAGE,SRCSYM .GLOBL GETCHR,PUTCHR,LINENO,EOF,OUTLIN .GLOBL OUTBUF,OTBFPT,OUTBLK,PRTLIN,DECOUT .GLOBL DEBUG,NOSRC,DATE,TIME,SAVENO .GLOBL STOLBL,NOLINE .PSECT IOLINE,I,RO,GBL .PAGE GETLIN: :;GET A LINE OUT OF THE INPUT BUFFER CHR BY CHR ; AND PUT IT INTO INTERMIDIATE BUFFER LIN USEING POINTER LINPT ; TO POINT TO THE NEXT AVAILABLE CHR STORAGE LOCATION. ; THIS ROUTINE FOLLOWS THEBFORTRAN COMPILOR TAB CONVENTION ; THIS IS THE LINE THAT IS ACTUALLY PRINTED OUT IN THE LISTING. MOV R1,-(SP) MOV R2,-(SP) MTLIN: MOV #LIN,LINPT ; RESET POINTER MOV #LIN,R1 ; NULL THE LIN BUFFER MOV #100.,R2 CLRB (R1)+ DEC R2 BNE .-4 MOV LINPT,R1 ; MAKE R1 TMP POINTER NULL: JSR PC,GETCHR ; GET A CHARACTER IN R0 XFRCHR: TST EOF ; EOF FOUND(NO MORE TEXT) BNE ENDLIN ; IF SO NO SENSE DOING UNNESSISARY WORK TSTB R0 ; WAS CHR A NULL BEQ NULL ; IF YESS DONT WANT IT-GO BACK AND TRY AGAIN CMPB #15,R0 ; WAS IT BEQ ENDLIN ; IF YES THEN WE HAVE GOTTEN 1 ENTIRE LINE CMPB #12,R0 ; WAS IT BEQ NULL ; IF YES TREAT LIKE NULL CMPB #11,R0 ; WAS IT A TAB BEQ TAB ; YES THEN THIS TAKES MORE WORK, GO TO TAB ROUTINE CMP R1,#LIN+80. BGE NULL MOVB R0,(R1)+ ; CHR IN R0 OK SO STORE IN LIN BR NULL ; GO BACK FOR NEXT CHR TAB: JSR PC,GETCHR ; WHAT IS NEXT CHR-DETERMINES WHERE ; TABED TO CMP R1,#LIN+6 ; ARE WE PAST COL 6 BLT SKIPTB ; IF NOT IT TAKES MORE WORK MOVB #40,(R1)+ ; YES-BLANK FILL BR XFRCHR ; AND CHECK UP,ON NEW CHR SKIPTB: CMP R1,#LIN+5 ; HAVE WE TABED TO COL 6 YET BGE CNTLIN ; IF YES NO NEED TO GO FURTHER MOVB #40,(R1)+ ; NO-BLANK FILL 1 CHR BR SKIPTB ; AND REPEAT UNTILL YES CNTLIN: CMPB R0,#72 ; IS CHR IN R0 A NUMBER(BETWEEN 60 AND 72 ; ASCII) BGE NTCNT ; YES HER MEANS ABOVE 9 CMPB R0,#60 BGE XFRCHR ; YES HERE MEANS NUMBER NTCNT: MOVB #40,(R1)+ ; NOT CONTINUATION-FILL COL 6 ; WITH BLANK BR XFRCHR ; AND CHEG ON NEW CHR ENDLIN: MOV #LIN+100.,R2 1$: TSTB -(R2) ; REPLACE TRAILING BLANKS WITH NULLS BEQ 1$ CMPB #' ,(R2) BNE 2$ CLRB (R2) BR 1$ 2$: TST EOF BNE 5$ CMP #LIN,R2 ; IS IT AN EMPTY LINE BHIS MTLIN ; IF IT IS,IGNORE IT 5$: MOV (SP)+,R2 MOV (SP)+,R1 RTS PC ; DONE .PAGE PRTLIN: ; PRINTS LINE WHOS ADDREES IS FOUND IN R0 ; TERMINATION CONVENTION IS SAME AS .PRINT TST NOSRC BEQ OKSRC TST SRCSYM BNE OKSRC RTS PC OKSRC: MOV R1,-(SP) MOV R2,-(SP) MOV R0,-(SP) TST LINCTR BLT NOHDR ; NO SKIP NEXT INC PAGE ; NEXT PAGE MOV #21.,R1 MOV #H1,R2 1$: MOVB (R2)+,R0 ; OUTPUT 1ST SEG OH HDR JSR PC,PUTCHR DEC R1 BNE 1$ MOV #25.,R1 ; NEXT SEG 25. CHRS LONG MOV #H2,R2 ; DEFALT IS SORCE LST TST SRCSYM ; WHAT IS IT BEQ 2$ BLT 5$ MOV #H2A,R2 ; .GT. 0 CREF LST BR 2$ 5$: MOV #H2B,R2 ; .LT.0 STAT LST CMP #-2,SRCSYM ; IF -2 THEN SUPER INDEX BNE 2$ MOV #H2C,R2 2$: MOVB (R2)+,R0 JSR PC,PUTCHR DEC R1 BNE 2$ MOV #DATE,R2 MOV #10.,R1 6$: MOVB (R2)+,R0 JSR PC,PUTCHR DEC R1 BNE 6$ MOV #TIME,R2 MOV #9.,R1 7$: MOVB (R2)+,R0 JSR PC,PUTCHR DEC R1 BNE 7$ MOV #5,R1 MOV #H3,R2 3$: MOVB (R2)+,R0 ; OUTPUT 'PAGE' JSR PC,PUTCHR DEC R1 BNE 3$ MOV PAGE,R0 JSR PC,DECOUT MOV #15,R0 JSR PC,PUTCHR MOV #12,R0 JSR PC,PUTCHR JSR PC,PUTCHR MOV #-66,LINCTR NOHDR: MOV (SP)+,R2 NXTCHR: MOVB (R2)+,R0 BEQ OTCRLF CMPB #200,R0 BEQ IMRTN JSR PC,PUTCHR CMPB #141,-1(R2) ;RESET LOWER CASE TO UPPER CASE BHI NXTCHR CMPB #172,-1(R2) ;BETWEEN a AND z BLO NXTCHR MOVB -1(R2),R0 SUB #40,R0 MOVB R0,-1(R2) BR NXTCHR OTCRLF: MOV #15,R0 JSR PC,PUTCHR MOV #12,R0 JSR PC,PUTCHR INC LINCTR IMRTN: MOV (SP)+,R2 MOV (SP)+,R1 RTS PC H1: .BYTE 15,14 .ASCII / RT-11 INDEX V03.2A/ .EVEN H2: .ASCII / SOURCE LISTING / .EVEN H2A: .ASCII / CROSS REFERENCE LISTING / .EVEN H2B: .ASCII / STATISTICS / .EVEN H2C: .ASCII / SUPER CROSS REFERENCE / .EVEN H3: .ASCII /PAGE / .EVEN .PAGE OUTLIN: MOV R3,-(SP) MOV R4,-(SP) NLIN: TST EOF ; DONE? BNE EXIT ; YES-EXIT MOV #NOLINE,R0 JSR PC,PRTLIN CMPB #'C,LIN BEQ COMNT CMPB #<'C+40>,LIN BEQ COMNT CMPB #'D,LIN BEQ 1$ CMPB #<'D+40>,LIN BNE EVAL 1$: TST DEBUG BNE EVAL COMNT: MOV #FILLER,R0 ; COMMENT LINE-PRINT W/O LINE NO JSR PC,PRTLIN TST SAVENO BNE 1$ MOV #40,R0 BR 2$ 1$: MOV #'*,R0 2$: JSR PC,PUTCHR MOV #LIN,R0 JSR PC,PRTLIN JSR PC,GETLIN ; GET NEW LINE BR NLIN ; AND TRY AGAIN EVAL: TST NOSRC BNE LB MOV LINENO,R0 ; PRINT LINE WITH LINE NO JSR PC,DECOUT TST SAVENO BNE 1$ MOV #40,R0 BR 2$ 1$: MOV #'*,R0 2$: JSR PC,PUTCHR LB: MOV #LIN,R0 JSR PC,PRTLIN CMPB #'D,LIN BEQ 1$ CMPB #<'D+40>,LIN BNE LB2 1$: MOVB #' ,LIN LB2: EXIT: MOV (SP)+,R4 MOV (SP)+,R3 RTS PC FILLER: .ASCII / / .BYTE 200 .EVEN .PAGE DECOUT: ; THE NUBER FOUND IN R0 IS CONVERTED TO ; DECIMAL ASCII AND PRINTED OUT TST NOSRC BEQ OKLN TST SRCSYM BNE OKLN RTS PC OKLN: MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) CLR R5 MOV R0,R4 ; STORE NUMBER IN R4 MOV #60,R0 ; R0 CONTAINES EACH DECODED DIGIT MOV PC,R3 CMP (R3)+,(R3)+ BR DOA .WORD 10000.,1000.,100.,10.,0 INCB R0 DOA: SUB (R3),R4 BCC .-4 DOB: TST R5 BNE 2$ CMPB #'0,R0 BNE 1$ MOVB #40,R0 BR 2$ 1$: INC R5 2$: JSR PC,PUTCHR ADD (R3)+,R4 DOC: MOV #60,R0 TST (R3) BGT DOA ADD R4,R0 JSR PC,PUTCHR MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 RTS PC .END