.TITLE OPEN AND CLOSE ROUTINES .IF NDF,RSX .MCALL .CSIGEN,.CLOSE,.PRINT,.READ,.READW .MCALL .WAIT,.WRITW,.LOOKUP,.RCTRLO,.EXIT .GLOBL EXT,INBUF,OUTBUF,IOARA,INBLK,OUTBLK .IFF .MCALL CSI$,CSI$1,CSI$2,CSI$SW,CSI$ND,GET$,GCML$,CLOSE$,EXIT$S,QIOW$S .MCALL GCMLB$,PUT$,OPEN$A,OPEN$R,OPEN$W,EXIT$S,GTIM$S,PRINT$ .GLOBL LSTFIL,IN1FIL,IN2FIL,IN3FIL,IN4FIL,IN5FIL,IN6FIL,IN7FIL .GLOBL TTIBLK,TTOBLK,SUPFIL,INFIL,HLPFIL,IBUFF,SPOOL .ENDC .GLOBL OPEN,CLOSE,TMP,CHRWD,PRSTAT,OPTN,DEBUG .GLOBL LIN,FINLIN,INBFPT,OTBFPT,GLOB,DOFLOW,H1 .GLOBL LOWAV,HIGHAV,LINCTR,NOSRC,TIME,APND,HELP,ICHNO .GLOBL GETLIN,PRTLIN,NAMCTR,ENTCTR,SRCSYM,OUTFLO .GLOBL PUTCHR,SNGCOM,SUPER,OUTSUP,ICHNO,ERRCNT .PAGE .PSECT OPNCLO,I,RO,GBL .IF NDF,RSX .MACRO CKSW LT,LOC CMPB #''LT,R1 BEQ LOC .ENDM .RCTRLO OPEN: MOV SP,TMP 1$: .CSIGEN LOWAV,#EXT,#0,#INSTR ; GET COMMAND STRING FROM CONSOLE DEVICE BCS 1$ ; RETRY ON ERROR MOV R0,LOWAV ; LOC AFTER HNDLER AVAIL FOR BUFFER ADD #20.,R0 CMP R0,HIGHAV ; ENOUGH ROMM FOR SYMBOL TABLE BLO 2$ .PRINT #FULL BISB #10,@#54 INC ERRCNT CLR R0 .EXIT 2$: CALL DOTIME MOV #10,CHRWD ; DEFALT IS TTY MODE FOR OUTPUT(72 COL) ; OR 8 HOW USED PER LINE ; RT-11 SPECIFIC CODE-CHANGE FOR ALLOWING THE ELEIMINATION ; OF THE BLANK FIRST PAGE OF A LISTING WITHOUT BOTHERING ; SUBSEQUENT SOURCES CONCATENATED IN THE SAME FILE ; UNCOMMENT THE FOLLOWING INSTRUCTION ; ; MOVB #12,H1+1 ; ; REPEAT BELOW FOR RSX SPECIFIC CODE AND THE SPECIFIC COMMENTED ; OUT CODE IN FILE IOLINE.MAC CLR PRSTAT ; SET ALL FLAGS TO DEFALT CONDITIONS CLR OPTN CLR DEBUG CLR NOSRC CLR SUPER ; NO SUPER INDEX DEFAULT CLR SNGCOM ; NO SINGLRE COMMON/TYPE DEFAULT CLR GLOB ; SUPER INDEX ALL CLR DOFLOW MOV #LIN+72.,FINLIN TST (SP) ; ANY SWITCHES BNE 77$ JMP NOSWTC ; NO-SKIP NEXT 77$: MOV (SP)+,R0 ; STO NO OF SWITCHES IN R0 SWCK: MOVB (SP),R1 ; GET SWITCH CKSW A,STAT CKSW B,BRKOUT CKSW C,SHORT CKSW D,DBUG CKSW E,COL80 CKSW F,FLOWCH CKSW G,DOGLOB CKSW H,LHELP CKSW I,PRGSPR CKSW L,LPMODE CKSW N,NOSR CKSW O,OPT CKSW S,ISUPER CKSW U,UNUSED CKSW X,NOGLOB JMP VALCK ; UNKNOWN SWITCH-SKIP VALUE IF ANY SWCFT: MOV TMP,SP .PRINT #CONFLT BR OPEN DOGLOB: TST GLOB BNE SWCFT INC GLOB JMP VALCK NOGLOB: TST GLOB BNE SWCFT DEC GLOB BR VALCK UNUSED: TST SNGCOM ; IS THEIR A CONFLICT IN /U AND /C SWITCHES BGT SWCFT ; IF YES EROR OUT OF COMMAND DEC SNGCOM BR VALCK SHORT: TST SNGCOM BLT SWCFT INC SNGCOM ; DELETE UNUSED VARS BR VALCK PRGSPR: TST SUPER BNE SWCFT DEC SUPER ; SIGNAL TO DUMP SUPER INDEX TABEL WHEN SW DOME BR VALCK ISUPER: TST SUPER BNE SWCFT INC SUPER ; PUT INPUT INTO SUPER INDEX BR VALCK DBUG: INC DEBUG VALCK: TST (SP)+ ; SKIP ANY SWITCH VALUE BGE NOVAL TST (SP)+ NOVAL: DEC R0 ; ANY MORE SWITCHES BNE SWCK ; IF YESS GO BACK AND REPEAT BR NOSWTC FLOWCH: CALL OUTFLO MOV TMP,SP JMP OPEN BRKOUT: INC DOFLOW BR VALCK COL80: MOV #LIN+80.,FINLIN BR VALCK LPMODE: MOV #15.,CHRWD BR VALCK ; SET LP MODE 132 COL-15 HOWUSED PER LINE STAT: INC PRSTAT ; PRINT STATISTICS WHEN DONE BR VALCK NOSR: INC NOSRC BR VALCK OPT: INC OPTN ; PRINT OPTINS IN EFFECT BR VALCK LHELP: .LOOKUP #IOARA,#5,#HLPFIL CLR INBLK LBH: .READW #IOARA,#5,#INBUF,#256.,INBLK BCS NDH .PRINT #INBUF INC INBLK BR LBH NDH: .CLOSE #5 MOV TMP,SP GOBAK: JMP OPEN NOSWTC: MOV TMP,SP ; RESET STACK TST DOFLOW BNE 1$ .WAIT #0 ; CHAN 0 OPEN 6$: BCS GOBAK ; NO ERROR 1$: CLR OUTBLK MOV #256.,R1 MOV #OUTBUF,R2 ; ZERO OUTPUT BUFFER CLR: CLR (R2)+ DEC R1 BNE CLR MOV #OUTBUF,OTBFPT TST SUPER BGE 1$ ; IF NO DUMP OF SUPER TABLE-SKIP NEXT CLR LINCTR JSR PC,OUTSUP JMP OPEN ; AND GET NEW COMMAND STRING 1$: .WAIT #3 ; INPUT CHAN OPEN BCS GOBAK ; NO ERROR CLR INBLK MOV #3,ICHNO ; SET DEFAULT INPUT CHAN NUMBER .READ #IOARA,ICHNO,#INBUF,#256.,INBLK ; GET FIRST BUFER FULL OF INPUT MOV #INBUF,INBFPT ; INIT BUFFER POINTERS .WAIT ICHNO CMPB #15,INBUF ; IS FIRST CHR BNE NOCR ; NO SKIP BNEXT INC INBFPT ; SKIP CR NOCR: INC INBLK .IFF CSI$ DEF$G .EVEN CSIBLK::.BLKB C.SIZE .EVEN SWLIST::CSI$SW A,1,PRSTAT,,,,EXACT CSI$SW B,1,DOFLOW,,,,EXACT CSI$SW C,1,SNGCOM,,,,EXACT CSI$SW D,1,DEBUG,,,,EXACT CSI$SW E,,FINLIN,,,,EXACT CSI$SW F,100000,DOFLOW,,,,EXACT CSI$SW G,1,GLOB,,,,EXACT CSI$SW H,1,HELP,,,,EXACT CSI$SW I,100000,SUPER,,,,EXACT CSI$SW L,15.,CHRWD,,,,EXACT CSI$SW M,1,APND,,,,EXACT CSI$SW N,1,NOSRC,,,,EXACT CSI$SW O,1,OPTN,,,,EXACT CSI$SW S,1,SUPER,,,,EXACT CSI$SW SP,1,SPOOL,,,,EXACT CSI$SW U,100000,SNGCOM,,,,EXACT CSI$SW X,100000,GLOB,,,,EXACT CSI$ND ; COMMAND LINE BUFFER COMAND: GCMLB$ 3,IDX,INSTR,10 OPEN: CLR PRSTAT ;CLEAR ALL SWITCH FLAGS CLR OPTN CLR DEBUG CLR NOSRC CLR SUPER CLR SNGCOM CLR FINLIN CLR CHRWD CLR APND CLR HELP CLR SPOOL CLR GLOB CLR DOFLOW ; RSX-11M SPECIFIC CODE-CHANGE FOR ALLOWING THE ELEIMINATION ; OF THE BLANK FIRST PAGE OF A LISTING WITHOUT BOTHERING ; SUBSEQUENT SOURCES CONCATENATED IN THE SAME FILE ; UNCOMMENT THE FOLLOWING INSTRUCTION ; ; MOVB #12,H1+1 ; ; REPEAT ABOVE FOR RT-11 SPECIFIC CODE AND THE SPECIFIC COMMENTED ; OUT CODE IN FILE IOLINE.MAC ; CLOSE ALL I/O FILES CLOSE$ #LSTFIL CLOSE$ #IN1FIL CLOSE$ #IN2FIL CLOSE$ #IN3FIL CLOSE$ #IN4FIL CLOSE$ #IN5FIL CLOSE$ #IN6FIL CLOSE$ #IN7FIL ; SET INPUT FILE POIINTER MOV #INFIL,ICHNO ; GET THE COMMAND LOOP: GCML$ #COMAND BCC 50$ ;GOT COMMAND-NO ERRORS CMPB G.ERR(R0),#GE.EOF ;END OF FILE???? BEQ 60$ ;NO-OTHER ERROR- EXIT WITH A FUSS QIOW$S #IO.WLB,#9.,#1,,,,<#FINERR,#29.,#40> 60$: CLOSE$ #SUPFIL CLOSE$ #TTIBLK CLOSE$ #TTOBLK EXIT$S 50$: MOV G.CMLD(R0),R1 ;GET BYTE COUNT BEQ LOOP ;TRY AGAIN IF EMPTY MOV G.CMLD+2(R0),R2 ;GET START OF LINE CSI$1 #CSIBLK,R2,R1 ;SYNTAX CHECK/COMPRESS BCC 61$ ;ANY ERRORS QIOW$S #IO.WLB,#9.,#1,,,, QIOW$S #IO.WLB,#9.,#1,,,,<#SERR,#29.,#40> BR LOOP 61$: ;GET OUTPUT FILE AND ALL SWITCHES MOV CSIBLK+C.CMLD,R0 ;GET LENGTH OF COMPRESSED INPUT LINE CLRB INSTR(R0) ;TERMINATE VALIDATED COMMAND LINE WITH NULL CSI$2 #CSIBLK,OUTPUT,#SWLIST BCC 62$ QIOW$S #IO.WLB,#9.,#1,,,,<#OFERR,#31.,#40> JMP OPEN ; CHECK THE SWITCHES 62$: CMP #100001,SNGCOM BNE 63$ 71$: QIOW$S #IO.WLB,#9.,#1,,,,<#CONFLT,#30.,#40> JMP OPEN 63$: CMP #100001,SUPER BEQ 71$ CMP #100001,GLOB BEQ 71$ CMP #100001,DOFLOW BEQ 71$ TST FINLIN BNE 64$ ;CHRS/LIN SETTING MOV #LIN+72.,FINLIN 64$: TST CHRWD BNE 65$ MOV #10,CHRWD 65$: TST HELP ;HELP WANTED BEQ NOHELP ;NO HELP OPEN$R #HLPFIL ;FIND HELP 66$: GET$ #HLPFIL,#LIN,#100. ;GET LINE BCS 67$ ;ERROR PUT$ #TTOBLK,,;PRINT HELP BR 66$ ;NEXT LINE 67$: CMPB #IE.EOF,F.ERR(R0) ;EOF BEQ 68$ ;YES-NORMAL EXIT QIOW$S #IO.WLB,#9.,#1,,,,<#HLPERR,#24.,#40>;TELL HIM HE IS HELPLESS 68$: CLOSE$ #HLPFIL JMP OPEN NOHELP: CALL DOTIME TST DOFLOW BGT 4$ TST APND ;TIME TO OPEN OUTPUT FILE-IS IT NEW OR APPEND BNE 1$ OPEN$W #LSTFIL,,#CSIBLK+C.DSDS ;OPEN NEW FILE BR 2$ 1$: OPEN$A #LSTFIL,,#CSIBLK+C.DSDS ;OPEN EXISTING FILE FOR APPEND 2$: BCC 3$ ;IF ERROR ?? QIOW$S #IO.WLB,#9.,#1,,,,<#OOFERR,#31.,#40> JMP OPEN 3$: TST SUPER ;OUTPUT SUPER INDEX ACCUMULATION?? BGE 4$ ;NO CLR LINCTR JSR PC,OUTSUP ;YES JMP OPEN ;AND GET NEXT COMMAND 4$: TST DOFLOW BGE 7$ CALL OUTFLO JMP OPEN 7$: CSI$2 #CSIBLK,INPUT BCC 6$ QIOW$S #IO.WLB,#9.,#1,,,,<#IFERR,#30.,#40> JMP OPEN 6$: OPEN$R #IN1FIL,,#CSIBLK+C.DSDS BCC 5$ ;ANY OPEN ERROR QIOW$S #IO.WLB,#9.,#1,,,,<#OIFERR,#30.,#40> JMP OPEN 5$: MOV #LBUFF,OTBFPT MOV #IBUFF,INBFPT GET$ #IN1FIL,#IBUFF,#132. MOV F.NRBD+2(R0),HIINBP ADD F.NRBD(R0),HIINBP .ENDC PRTOPT: TST OPTN ; PRINT OTIONS IN EFFECT??? BEQ NOOPT ; NO SKIP NEXT TST DOFLOW BNE NOOPT MOV #-63,LINCTR MOV #-1,SRCSYM MOV #M0,R0 JSR PC,PRTLIN MOV #M1,R0 JSR PC,PRTLIN MOV #M2,R0 TST DEBUG BEQ 1$ MOV #M2A,R0 1$: JSR PC,PRTLIN MOV #M3,R0 CMP #LIN+72.,FINLIN BEQ 2$ MOV #M3A,R0 2$: JSR PC,PRTLIN MOV #M4,R0 CMP #10,CHRWD BEQ 3$ MOV #M4A,R0 3$: JSR PC,PRTLIN MOV #M5,R0 TST PRSTAT BEQ 4$ MOV #M5A,R0 4$: JSR PC,PRTLIN MOV #M6,R0 TST NOSRC BEQ 5$ MOV #M6A,R0 5$: JSR PC,PRTLIN CLR R1 TST SNGCOM BEQ 30$ BGT 31$ ADD #2,R1 31$: ADD #2,R1 30$: TST GLOB BEQ 32$ BGT 33$ ADD #6,R1 33$: ADD #6,R1 32$: MOV M7M(R1),R0 JSR PC,PRTLIN MOV #M8,R0 TST SUPER BEQ 7$ MOV #M8A,R0 7$: JSR PC,PRTLIN .IF DF,RSX MOV #M9,R0 TST APND BEQ 20$ MOV #M9A,R0 20$: JSR PC,PRTLIN .ENDC CLR SRCSYM NOOPT: CLR NAMCTR CLR LINCTR CLR ENTCTR CALL GETLIN RETURN .IF NDF,RSX ; THE FOLLOWING IS TAKEN FROM THE SYSLIB ROUTINE 'TIME' DOTIME: MOV #TIME,-(SP) MOV #1,-(SP) MOV SP,R5 JSR PC,TIM CMP (SP)+,(SP)+ RTS PC TIM: CMP -(SP),-(SP) MOV SP,R0 MOV 2(R5),-(SP) MOV R0,-(SP) MOV #10400,-(SP) MOV SP,R0 EMT 375 MOV #2,(SP) MOV SP,R5 JSR PC,TMAS ADD #12,SP RTS PC TMAS: TST (R5)+ MOV (R5)+,R1 MOV (R1)+,R0 MOV (R1),R1 MOV #-1,-(SP) JSR PC,A JSR PC,D MOV R3,-(SP) JSR PC,D MOV R3,-(SP) MOV R1,R3 MOV (R5),R5 BR E F: MOVB #72,(R5)+ E: ADD #366,R3 TSTB R3 BPL E ADD #27472,R3 SWAB R3 MOVB R3,(R5)+ SWAB R3 MOVB R3,(R5)+ MOV (SP)+,R3 BPL F RTS PC A: MOV #62,R4 MOV @#54,R3 BIT #40,300(R3) BNE H D: MOV #74,R4 H: CLR R3 MOV #40,-(SP) C: ASL R1 ROL R0 ROL R3 CMP R3,R4 BLO B SUB R4,R3 INC R1 B: DEC (SP) BNE C TST (SP)+ RTS PC .IFF ; RSX SPECIFIC TIME ROUTINE DOTIME: GTIM$S #LIN ;GET THE TIME MOV #TIME,R5 ;OUTPUT STRING MOV LIN+6,R0 ;GET HOURS CLR R1 50$: SUB #10.,R0 ;GET 10'S OF HOURS BLT 60$ INC R1 BR 50$ 60$: TST R1 ;IF NO 10'S HRS-BLANK FUILL BNE 61$ MOV #<40-60>,R1 61$: ADD #60,R1 MOVB R1,(R5)+ ADD #<60+10.>,R0 MOVB R0,(R5)+ MOVB #':,(R5)+ MOV LIN+10,R0 ;GET MINUTES CLR R1 62$: SUB #10.,R0 BLT 63$ INC R1 BR 62$ 63$: ADD #60,R1 MOVB R1,(R5)+ ADD #<60+10.>,R0 MOVB R0,(R5)+ MOVB #':,(R5)+ MOV LIN+12,R0 ;GET SECONDS CLR R1 64$: SUB #10.,R0 BLT 65$ INC R1 BR 64$ 65$: ADD #60,R1 MOVB R1,(R5)+ ADD #<60+10.>,R0 MOVB R0,(R5) RTS PC .ENDC .PAGE CLOSE: MOV #14,R0 JSR PC,PUTCHR .IF NDF,RSX CMP #OUTBUF,OTBFPT BEQ MTBUF .WRITW #IOARA,#0,#OUTBUF,#256.,OUTBLK MTBUF: .CLOSE #0 .CLOSE #3 .IFF MOV #15,R0 JSR PC,PUTCHR TST SPOOL BEQ 1$ PRINT$ #LSTFIL BR 2$ 1$: CLOSE$ #LSTFIL 2$: CLOSE$ #IN1FIL .ENDC RTS PC .PAGE .IF NDF,RSX EXT: .RAD50 /FOR/ .RAD50 /IDX/ .WORD 0,0,0 HLPFIL: .RAD50 /DK / .RAD50 /IND/ .RAD50 /EX / .RAD50 /HLP/ FULL: .ASCII / INDEX-F-NON-RESIDENT/ .ASCIZ / HANDLERS HAVE USED UP SYMBOL TABLE SPACE-ABORT/ .ENDC CONFLT: .ASCIZ / INDEX-W-SWITCH CONFLICT ERROR/ M1: .ASCIZ / INDEX OPTIONS IN EFFECT/ M2: .ASCIZ / TREAT DEBUG LINES AS COMMENTS/ M2A: .ASCIZ / TREAT DEBUG LINES AS SOURCE CODE/ M3: .ASCIZ / USE FIRST 72 COL OF INPUT RECORD FOR SOURCE/ M3A: .ASCIZ / USE FIRST 80 COL OF INPUT RECORD FOR SOURCE/ M4: .ASCIZ / OUTPUT TO 72 COL DEVICE(TTY MODE)/ M4A: .ASCIZ / OUTPUT TO 132 COL DEVICE(LP MODE)/ M5: .ASCIZ / DO NOT PRINT INDEX STATISTICS/ M5A: .ASCIZ / PRINT INDEX STATISTICS/ M6: .ASCIZ / LIST SOURCE/ M6A: .ASCIZ / DO NOT LIST SOURCE/ M7: .ASCIZ / INDEX ALL VARIABLES/ M7A: .ASCIZ ? DO NOT INDEX COMMON/TYPE DECLARED ONLY VARIABLES? M7B: .ASCIZ ? INDEX COMMON/TYPE DECLARED BUT UNUSED VARIABLES? M7C: .ASCIZ ? INDEX GLOBAL VARIABLES ONLY? M7D: .ASCIZ ? INDEX LOCAL VARIABLES ONLY? M7E: .ASCIZ ? INDEX GLOBALS USED IN MODULE? M7F: .ASCIZ ? INDEX GLOBALS NOT USED IN MODULE? M7G: .ASCIZ ? INDEX LOCAL TYPE DECLARED BUT UNUSED VARIABLES? M7H: .ASCIZ ? INDEX ALL LOCALS EXCEPT UNUSED DECLARED IN TYPES? M8: .ASCIZ / PROGRAM VARIABLES NOT SAVED FOR SUPER INDEX/ M8A: .ASCIZ / PROGRAM VARIABLES SAVED FOR SUPER INDEX/ .IF DF,RSX M9: .ASCIZ / OUTPUT DIRECTED TO NEW FILE/ M9A: .ASCIZ / OUTPUT APPENDED TO EXISTING FILE/ FINERR: .ASCII / INDEX-F-COMMAND INPUT ERROR / SERR: .ASCII / INDEX-W-COMMAND SYNTAX ERROR/ OFERR: .ASCII / INDEX-W-OUTPUT FILE SPEC ERROR/ IFERR: .ASCII / INDEX-W-INPUT FILE SPEC ERROR/ HLPERR: .ASCII / INDEX-W-HELP FILE ERROR/ OOFERR: .ASCII / INDEX-W-OPEN OUTPUT FILE ERROR/ OIFERR: .ASCII / INDEX-W-OPEN INPUT FILE ERROR/ .ENDC .EVEN M7M: .WORD M7,M7A,M7B,M7C,M7E,M7F,M7D,M7H,M7G .PSECT OPNLIN,D,RW,GBL M0: .ASCII <14>/ / INSTR:: .REPT 82. .BYTE 0 .ENDM .END