.TITLE INPUT/OUPUT LINES .MCALL ..V2..,.REGDEF ..V2.. .REGDEF .GLOBL DEBUG,FINLIN,LIN,LINPT,EOF,FILLER,LINCTR,PAGE,SRCSYM .GLOBL GETCHR,PUTCHR,LINENO,EOF,OUTLIN,GETLIN,INBUF,INBFPT .GLOBL INBLK,OUTBUF,OTBFPT,OUTBLK,PRTLIN,DECOUT .GLOBL LABL,DEBUG,NOSRC,DATE,TIME,SAVENO .GLOBL VARTYP,STOLBL,NOLINE .CSECT IOLINE .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 3$ CMP #LIN,R2 ;IS IT AN EMPTY LINE BHIS MTLIN ;IF IT IS,IGNORE IT 3$: 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 #20.,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 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 / .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 #'D,LIN BNE EVAL 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 BNE LB2 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 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: JSR PC,PUTCHR ADD (R3)+,R4 DOC: MOV #60,R0 TST (R3) BGT DOA ADD R4,R0 JSR PC,PUTCHR MOV (SP)+,R4 MOV (SP)+,R3 RTS PC .END