.TITLE EVF - GLOBAL EVENT FLAG MANIPULATOR .IDENT /2N/ ; ; .MCALL GCMLB$,CSI$,FSRSZ$ .MCALL RCML$,CSI$SW,CSI$SV,CSI$ND .MCALL GCML,CSI1G,CSI2 .MCALL CALL,RETURN .MCALL TINIT,ERROR,PSTR,PDEC .MCALL RDXF$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: RDXF$S #FLAGS ;READ FLAGS MOV $DSW,GGSW ;SAVE GROUP GLOBAL EXISTANCE FLAG 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 OFLUP: MOV (R0)+,R1 ;GET A FLAG NUMBER BEQ RERD ;IF EQ, NO MORE CALL TSTEF ;CHECK FOR VALIDITY BCC 1$ ;IF CC, OK CALL BADMES BR OFLUP 1$: CLEF$S R1 ;CLEAR IT BR OFLUP ;AND ON TO NEXT ; RERD: RDXF$S #FLAGS ;REREAD FLAGS ; ; 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 8. LILUP: MOV (R0)+,R1 ;GET FLAG NUMBER BEQ LN ;NO MORE EXPLICIT LISTINGS CALL PRTBRK PDEC 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 16. PSTR ^*/ON:/* TST FLAGS+4 ;ANY FLAGS ON? BNE 1$ ;YES TST FLAGS+6 ;MAYBE BNE 1$ ;YES BIT #1,GGSW ;IS THERE A GLOBAL SET? BEQ 2$ ;IF EQ NO TST FLAGS+10 ;MAYBE BNE 1$ ;YES TST FLAGS+12 ;MAYBE BNE 1$ ;YES 2$: 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 BIT #1,GGSW ;IS THERE A GG SET BEQ LNLUP ;IF EQ NO MOV #4,R4 ;DO ALL FLAGS LNLUP: BIT R2,(R0) ;TEST CURRENT FLAG BEQ 1$ ;OFF, IGNORE IT CALL PRTBRK ;ON... PRINT IT PDEC 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 16. PSTR ^*/OFF:/* CMP #-1,FLAGS+4 ;ANY OFF BNE 1$ ;YES CMP #-1,FLAGS+6 ;MAYBE... BNE 1$ ;YES BIT #1,GGSW ;IS THERE A GLOBAL SET? BEQ 2$ ;IF EQ NO CMP #-1,FLAGS+10 ;MAYBE BNE 1$ ;YES CMP #-1,FLAGS+12 ;MAYBE BNE 1$ ;YES 2$: 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 BIT #1,GGSW ;IS THERE A GLOBAL SET? BEQ LFLUP ;IF EQ NO MOV #4,R4 ;DO ALL FLAGS LFLUP: BIT R2,(R0) ;FLAG ON? BNE 1$ ;YES CALL PRTBRK ;NO, PRINT IT PDEC 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 BIT #1,GGSW ;IS THERE A GLOBAL SET? BEQ LCMUP ;IF EQ NO MOV #4,R4 ;DO ALL FLAGS 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: MOV #LIVALS,R1 ;CLEAR THE WORLD MOV #ONVALS,R2 ;CLEAR THE WORLD MOV #OFVALS,R3 ;CLEAR THE WORLD MOV #64.,R4 ;.. 3$: CLR (R1)+ CLR (R2)+ CLR (R3)+ SOB R4,3$ CSI2 #CSBLK,,#SWTAB,CS2ERR RETURN ; ; ; ; CALL TSTEF ; TSTEF: CMP #33.,R1 ;TOO LOW? BHI BAD ;YES CMP #96.,R1 ;TOO HIGH? BLO BAD ;YES BIT #1,GGSW ;IS THERE A GLOBAL SET? BNE 1$ ;IF NE YES CMP #64.,R1 ;TOO HIGH? BLO BAD ;YES 1$: CLC ;JUST RIGHT RETURN BAD: SEC RETURN ; ; ; CALL BADMES ; BADMES: PSTR ^*/BAD FLAG: /* PDEC 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 DEC BRKCNT ;COUNT THE NEXT ONE 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 64. CSI$SV DECIMAL,NAME'S+DX,2 DX=DX+2 .ENDR CSI$ND NAME'S: .BLKW 64. .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 6 ;FLAG BUFFER SPSAVE: .BLKW 1 ;SP SAVED HERE AT START GGSW: .BLKW 1 ;0 IFF GLOBAL SET FOR THIS GROUP ; .END START