.TITLE INPUT/OUPUT LINES .GLOBL DEBUG,FINLIN,LIN,LINPT,EOF,FILLER,LINCTR,PAGE,SRCSYM .GLOBL GETCHR,PUTCHR,LINENO,EOF,OUTLIN,INSTR .GLOBL PRTLIN,DECOUT,DOFLOW .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. ; ANY CHARACTERS PAST COL 80 ARE DROPPED BGE NULL ; THIS IS NOT AN ERROR MOVB R0,(R1)+ ; CHR IN R0 OK SO STORE IN LIN BR NULL ; GO BACK FOR NEXT CHR SKTAB: MOV R1,R0 ; FIND OUT WHERE WE ARE SUB #LIN,R0 BIC #177770,R0 ; GET COL -1 NEG R0 ; NEED NO OF COLS TO SKIP ADD #8.,R0 ; SKIP 1 TO 8 COLS 1$: MOVB #40,(R1)+ ; STORE BLANK DEC R0 ; UNTILL TABED OUT BGT 1$ BR NULL ; GET NEXT CHARACTER TAB: CMPB #'C,LIN ; IS THIS A COMMENT BEQ SKTAB ; IF SO-NO TAB CON-JUST PASS IT ON CMPB #<'C+40>,LIN ; SAME TEST-LOWER CASE 'C' BEQ SKTAB CMPB #'*,LIN ; FORTRAN 77 COMMENT ?? BEQ SKTAB 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: ; IT HAS BEEN FOUND THAT THE F4 COMPILER DOES NOT HANDLE THE ; TAB CONVENTION PROOPERLY. IF THE CHAR FOLLOWING THE TAB IS ; ALPHABETICAL THEN IT STARTS IN COLL 7 ELSE IT STARTS IN COL 6 ; WHILE THE FORTRAN REFERENCE SAYS IF IT IS A NUMBER IT STARTS IN 6 ; ELSE IT STARTS IN 7. ; .IF NDF,TABCON ;F4 COMPILLER TAB CONVENTION CMPB R0,#'A ;IS IT LESS THAN A BLT XFRCHR ;YES-PUT IN CONTINUATION LINE COLL CMPB R0,#'Z ;IS IT .LE. 'Z' BLE NTCNT ; NO IT IS NOT A CONTINUATION CMPB R0,#141 ;LOWER CASE A BLT XFRCHR ;NON ALPHA SYMBOL CMPB R0,#172 ;LOWER CASE 'Z' BGT XFRCHR ;NOT ALPHA-CONTINATION .IFF ;F4+ TAB CONVENTION 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 .ENDC 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 BLOS 5$ CLR LIN MOV #LIN,R0 MOVB #40,LIN CALL PRTLIN JMP MTLIN ; IF IT IS PRINT BLANK LINE 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 ; IN RT-11, NULL BYTE MEANS ADD ; TO END OF STRING OUTPUT, A <200> BYTE ; MEANS OUT PUT LINE AS IS- WITH NOTHING ADDED TST DOFLOW ;NO OUTPUT DURING ACCUM OFCALL/CALLING BNE 1$ TST NOSRC BEQ OKSRC TST SRCSYM BNE OKSRC 1$: MOV R1,-(SP) 2$: TSTB (R0) BEQ 20$ CMPB #200,(R0) BEQ 20$ CMPB #141,(R0) ;RESET LOWER CASE TO UPPER CASE BHI 10$ CMPB #172,(R0) ;BETWEEN a AND z BLO 10$ MOVB (R0),R1 SUB #40,R1 MOVB R1,(R0) 10$: INC R0 BR 2$ 20$: MOV (SP)+,R1 RTS PC OKSRC: MOV R1,-(SP) MOV R2,-(SP) MOV R0,-(SP) TST LINCTR BGE 34$ JMP NOHDR ; NO SKIP NEXT 34$: 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$ ; TO ELIMINATE THE FORMFEED AT THE BEGINING OF THE FIRST PAGE OF A ; LISTING BUT NOT THE FIRST PAGE OF CONCATENATED SOURCES IN ; THE SAME SORCE FILE .IIF DF,NOFF, MOVB #14,H1+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 8$ MOV #H2C,R2 BR 2$ 8$: CMP #-3,SRCSYM ; -3=>ENTRY POINT LISTINGING BNE 9$ MOV #H2D,R2 BR 2$ 9$: CMP #-4,SRCSYM ; -4=>INDENTED EP CHART BNE 33$ MOV #H2E,R2 BR 2$ 33$: CMP #-5,SRCSYM ; -5=>INDENTED CALLED BY CHART BNE 2$ MOV #H2F,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 MOV #40,R0 CALL PUTCHR .IF NDF,RSX MOV #INSTR,R1 80$: MOVB (R1)+,R0 BEQ 76$ CALL PUTCHR BR 80$ .IFF MOV #COMAND,R0 MOV G.CMLD+2(R0),R1 MOV G.CMLD(R0),R2 77$: MOVB (R1)+,R0 CALL PUTCHR DEC R2 BGT 77$ .ENDC 76$: MOV #15,R0 JSR PC,PUTCHR MOV #12,R0 JSR PC,PUTCHR MOV #15,R0 JSR PC,PUTCHR MOV #12,R0 JSR PC,PUTCHR ; THIS IS THE POINT WHERE THE LINES PER PAGE IS SET MOV #-,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 .IF NDF,RSX .ASCII / RT-11/ .IFF .IF DF,IAS .ASCII / IAS / .IFF .ASCII / RSX / .ENDC .ENDC .ASCII / INDEX V05.6 / H2: .ASCII / SOURCE LISTING / H2A: .ASCII / CROSS REFERENCE LISTING / H2B: .ASCII / STATISTICS / H2C: .ASCII / SUPER CROSS REFERENCE / H2D: .ASCII / ENTRY POINT LISTING / H2E: .ASCII / INDENTED CALLING TREE / H2F: .ASCII / INDENTED CALLED BY TREE / 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 #'*,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 NOSRC BNE 6$ TST SAVENO BNE 1$ MOV #40,R0 BR 2$ 1$: MOV #'*,R0 2$: JSR PC,PUTCHR 6$: MOV #LIN,R0 JSR PC,PRTLIN JSR PC,GETLIN ; GET NEW LINE BR NLIN ; AND TRY AGAIN EVAL: 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 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