.TITLE EVF - GLOBAL EVENT FLAG MANIPULATOR ; ; .MCALL GCMLB$,CSI$,FSRSZ$ .MCALL RCML$,CSI$SW,CSI$SV,CSI$ND .MCALL GCML,CSI1G,CSI2 .MCALL CALL,RETURN,ENTER,LEAVE .MCALL TINIT,ERROR,PSTR,POCT .MCALL RDAF$S,SETF$S,CLEF$S .MCALL EXIT$S,ALUN$S ; ; ; EVENT FLAGS ; TTIEVF=1 ; ; ; LOGICAL UNITS ; TTILUN=1 GCLUN=2 TSTLUN=3 ; ; FSRSZ$ 1 ; CR=15 LF=12 HT=11 .SBTTL >INITIALISATION ; ; START: MOV SP,SPSAVE TINIT TTILUN,TTIEVF ;INITIALISE TTYOUT ALUN$S #GCLUN,#"TI,#0 ;ASSIGN GCML LUN TO TTI BR INLUP ;START UP PROGRAM ; TERMIN: PSTR ^** EXIT$S ;RETURN TO RSX ; ; ERRPFX::PSTR ^*/EVF - /* RETURN ; DIE:: RCML$ #GCBLK MOV SPSAVE,SP BR START .SBTTL >MAIN LOOP ; ; ; INLUP: GCML #GCBLK,,,TERMIN,GCERR ;GET A COMMAND CSI1G #CSBLK,GCBLK,CS1ERR ;INITIAL PARSE ; MOVB #CS.OUT,C.TYPR(R0) ;SET TYPE TO OUTPUT BITB #CS.EQU,C.STAT(R0) ;AND CHECK IF ANY OUTPUT SPECS BEQ MESLUP ;NONE. NOTE THAT CSI THINKS ;THAT ALL FILES ARE OUTPUT ;UNLESS TOLD OTHERWISE. ERROR MESLUP: RDAF$S #FLAGS ;READ FLAGS CALL GETMES ;GET A MESSAGE SPEC MOV CSBLK+C.MKW1,R3 ;GET SWITCH MASK BNE ON ;IF NONE ON, LIST JMP LIST ; ; HANDLE /ON'S ; ON: MOV #ONVALS,R0 ONLUP: MOV (R0)+,R1 BEQ OFF CALL TSTEF BCC 1$ CALL BADMES BR ONLUP 1$: SETF$S R1 ;SET FLAG BR ONLUP ;AND ON TO NEXT ONE ; ; NOW HANDLE /OF'S ; OFF: MOV #OFVALS,R0 BEQ LI ;NONE MORE OFLUP: MOV (R0)+,R1 ;GET A FLAG NUMBER BEQ LI CALL TSTEF ;CHECK FOR VALIDITY BCC 1$ CALL BADMES BR OFLUP 1$: CLEF$S R1 ;CLEAR IT BR OFLUP ;AND ON TO NEXT ; ; LISTINGS: FIRST EXPLICIT /LI:VAL'S ; LI: TST LIVALS ;ANY FLAGS TO LIST BEQ LN ;NO, TRY LIST ON'S BIC #LISWF,R3 ;THIS IS NOT A COMPRESSED LIST MOV #LIVALS,R0 ;POINT TO VALUE LIST JSR R5,PRTGO .WORD 10 LILUP: MOV (R0)+,R1 ;GET FLAG NUMBER BEQ LN ;NO MORE EXPLICIT LISTINGS CALL PRTBRK POCT R1 ;PRINT ITS NUMBER PSTR CALL TSTEF ;CHECK FOR VALIDITY BCC 1$ PSTR /BAD/ BR LILUP 1$: DEC R1 ;OFFSET FOR ORIGIN 1 MOV R1,R2 ASH #-3,R1 ;BYTE NUMBER BIC #-10,R2 ;BIT NUMBER MOV #1,R4 ASH R2,R4 ;BIT MASK BITB R4,FLAGS(R1) ;IS FLAG ON? BEQ 2$ ;NO PSTR /ON/ BR LILUP 2$: PSTR /OFF/ BR LILUP ; NOW PROCESS /LN (IF ANY) ; LN: BIT #LNSWF,R3 ;WAS IT REQUESTED? BEQ LFF ;NO, TRY /LF JSR R5,PRTGO .WORD 20 PSTR ^*/ON:/* TST FLAGS+4 ;ANY FLAGS ON? BNE 1$ ;YES TST FLAGS+6 ;MAYBE BNE 1$ ;YES PSTR /NONE/ ;NO BR LFF ;SHOULD WE LIST OFFS? 1$: MOV #FLAGS+4,R0 ;POINT AT GLOBAL FLAGS MOV #41,R1 ;FIRST FLAG NUMBER MOV #1,R2 ;MASK AT FIRST FLAG MOV #2,R4 ;NUMBER OF TIMES THROUGH LOOP LNLUP: BIT R2,(R0) ;TEST CURRENT FLAG BEQ 1$ ;OFF, IGNORE IT CALL PRTBRK ;ON... PRINT IT POCT R1 ;... 1$: INC R1 ;ON TO NEXT FLAG CLC ROL R2 ;MOVE MASK BCC LNLUP ;STILL IN SAME WORD ROL R2 ;NEW WORD, RESTART MASK TST (R0)+ ;INCREMENT MASK SOB R4,LNLUP ;AND ON TO FIRST FLAG ; ; AND /LF (IF ANY) ; LFF: BIT #LFSWF,R3 ;/LF SPECIFIED? BEQ LC ;NO, TRY COMPRESSED LIST JSR R5,PRTGO ;START LINE .WORD 20 PSTR ^*/OFF:/* CMP #-1,FLAGS+4 ;ANY OFF BNE 1$ ;YES CMP #-1,FLAGS+6 ;MAYBE... BNE 1$ ;YES PSTR /NONE/ BR LC ;NO, CHECK FOR COMPRESSED LIST 1$: MOV #FLAGS+4,R0 ;POINT AT FLAGS MOV #41,R1 ;NUMBER OF FIRST FLAG MOV #1,R2 ;MASK FOR FIRST FLAG MOV #2,R4 ;LOOP COUNT LFLUP: BIT R2,(R0) ;FLAG ON? BNE 1$ ;YES CALL PRTBRK ;NO, PRINT IT POCT R1 1$: INC R1 ;ON TO NEXT ONE CLC ROL R2 ;ADVANCE MASK BCC LFLUP ROL R2 ;NEW WORD, RESTART MASK TST (R0)+ ;INCREMENT POINTER SOB R4,LFLUP ;AND CONTINUE ; ; FINALLY, CHECK FOR COMPRESSED LISTING (/LI WITH NO ARG) ; LC: BIT #LISWF,R3 ;(BIT WILL HAVE BEEN TURNED OFF BEQ MESEND ; IF /LI:SW FORM HAS BEEN USED) LIST: JSR R5,PRTGO .WORD 0 PSTR MOV #FLAGS+4,R0 MOV #1,R2 MOV #2,R4 LCMUP: MOV #10,R5 ;NUMBER OF FLAGS PER GROUP PSTR ;SEPARATE GROUPS FROM EACH OTHER LCLUP: BIT R2,(R0) ;TEST FLAG BNE 1$ ;ON PSTR /F/ ;OFF BR 2$ ;GO ON TO NEXT ONE 1$: PSTR /N/ ;ON 2$: CLC ROL R2 ;ADVANCE MASK BCS 3$ ;NEW WORD? SOB R5,LCLUP ;NO, STILL SAME BR LCMUP ;NEW GROUP 3$: ROL R2 ;RESET MASK TST (R0)+ ;INCREMENT POINTER SOB R4,LCMUP ;AND CONTINUE ; ; CHECK IF MORE MESSAGES ; MESEND: BITB #CS.MOR,CSBLK+C.STAT BEQ 1$ JMP MESLUP 1$: JMP INLUP .SBTTL > PARSE INPUT SPEC ; ; GETMES: ENTER R1,R2 MOV #LIVALS,R1 ;CLEAR THE WORLD MOV #40,R2 ;.. 1$: CLR (R1)+ SOB R2,1$ MOV #ONVALS,R1 ;CLEAR THE WORLD MOV #40,R2 ;.. 2$: CLR (R1)+ SOB R2,2$ MOV #OFVALS,R1 ;CLEAR THE WORLD MOV #40,R2 ;.. 3$: CLR (R1)+ SOB R2,3$ CSI2 #CSBLK,,#SWTAB,CS2ERR LEAVE RETURN ; ; ; ; CALL TSTEF ; TSTEF: CMP #41,R1 ;TOO LOW? BHI BAD ;YES CMP #100,R1 ;TOO HIGH? BLO BAD ;YES CLC ;JUST RIGHT RETURN BAD: SEC RETURN ; ; ; CALL BADMES ; BADMES: PSTR ^*/BAD FLAG: /* POCT R1 RETURN .SBTTL > TTY CONTROL ; ; JSR R5,PRTGO ; .WORD NUMBER OF BRK'S PER LINE ; PRTGO: PSTR ^** ;START A NEW LINE CLRB COMMAF MOV (R5),BRKMAX MOV (R5)+,BRKCNT RTS R5 ; ; ; CALL PRTBRK ; PRTBRK: DEC BRKCNT ;NEW LINE? BMI PRTNL ;YES TSTB COMMAF ;COMMA REQUIRED? BEQ 1$ ;NO PSTR ^*/, /* ;YES, PRINT IT RETURN 1$: COMB COMMAF ;NEED COMMA NEXT TIME RETURN PRTNL: PSTR ^** MOV BRKMAX,BRKCNT RETURN .SBTTL >VARIABLES ; ; ; GCML/CSI BLOCKS ; GCBLK: GCMLB$ 2,EVF,,GCLUN ;GCML BLOCK CSI$ ;ESTABLISH CSI DEFINITIONS .EVEN CSBLK: .BLKB C.SIZE ;CSI BLOCK .EVEN ; ; ; CSI SWITCH TABLES ; LISWF=1 LNSWF=2 LFSWF=4 ONSWF=10 OFSWF=20 ; SWTAB: CSI$SW LN,LNSWF ;LIST FLAGS WHICH ARE ON CSI$SW LF,LFSWF ;LIST FLAGS WHICH ARE OFF CSI$SW LI,LISWF,,,,LIVAL ;LIST SELECTED OR ALL FLAGS CSI$SW ON,ONSWF,,,,ONVAL ;TURN ON SELECTED FLAGS CSI$SW OF,OFSWF,,,,OFVAL ;TURN OFF SELECTED FLAGS CSI$ND ; .MACRO TABLE NAME NAME: DX=0 .REPT 40 CSI$SV OCTAL,NAME'S+DX,2 DX=DX+2 .ENDR CSI$ND NAME'S: .BLKW 40 .ENDM ; TABLE LIVAL TABLE ONVAL TABLE OFVAL ; ; ; TTY CONTROL VARIABLES BRKMAX: .WORD 0 ;NUMBER OF BREAKS PRE LINE BRKCNT: .WORD 0 ;NUMBER OF BREAKS LEFT COMMAF: .WORD 0 ;(BYTE) SET IF COMMA REQUIRED BEFORE NEXT ITEM ; ; ; FLAGS ; FLAGS: .BLKW 4 ;FLAG BUFFER SPSAVE: .BLKW 1 ;SP SAVED HERE AT START ; .END START