.NLIST TTM .MCALL FSRSZ$,GCMLB$,GCML$,GTSK$C .MCALL QIO$S,WTSE$C,EXIT$S,UCBDF$ UCBDF$ TAB = 11 SPACE = 40 ;TO CREATE LOG.TSK: COMMA = 54 ;>MAC LOG=[1,1]EXEMC/ML,[307,2]LOG FSRSZ$ 1 ;>TKB @LOGBLD GCL: GCMLB$ 1,LOG LOG: CLR LFLAG GCML$ #GCL BCC 1$ JMP ERROR 1$: MOV GCL+G.CMLD,R4 ;CHAR COUNT BNE DECODE COM LFLAG ;ZERO REQUESTS CURRENT UIC BR LOCATE DECODE: MOV GCL+G.CMLD+2,R2 ;CHAR STRING POINTER CLR R0 MOV #3,R3 ;DIGIT COUNTER 1$: MOVB (R2)+,R1 ;PICK UP 1ST CHAR CMP R1,#TAB ;LEADING TABS WILL BE IGNORED BEQ 2$ CMP R1,#SPACE ;SO WILL LEADING SPACES BNE 5$ 2$: DEC R4 ;REDUCE THE CHAR COUNT BNE 1$ 3$: JMP ERROR 4$: MOVB (R2)+,R1 ;GET THE NEXT CHAR 5$: CMP R1,#COMMA ;IS IT A COMMA? BEQ 6$ ;IF SO, BRANCH JSR PC,DIGIT ;IF NOT, ADD IT TO THE GROUP NUMBER DEC R4 ;COUNT THE CHAR BEQ 3$ ;IF ZERO, ERROR BR 4$ ;IF NOT, CONTINUE 6$: DEC R4 ;COUNT THE COMMA BEQ 3$ ;IF ZERO, ERROR TST R0 ;CHECK THE GROUP NUMBER BEQ 3$ ;ZERO IS ILLEGAL CMP R0,#377 BGT 3$ ;SO IS A BIG NUMBER MOVB R0,UIC+1 ;IF OK, STORE IT CLR R0 MOV R4,R3 ;NO. OF REMAINING CHARS 7$: MOVB (R2)+,R1 ;GET THE NEXT CHAR JSR PC,DIGIT ;ADD IT IN SOB R4,7$ TST R0 ;CHECK THE USER NUMBER BEQ 3$ ;SAME RULES APPLY CMP R0,#377 BGT 3$ MOVB R0,UIC ;UIC IS NOW COMPLETE .PAGE LOCATE: GTSK$C TSKNAM ;GET NAME WHICH "LOG" IS RUNNING UNDER MOV $TSKHD,R0 ;POINTER TO SYSTEM TASK DIRECTORY 1$: CMP 6(R0),TSKNAM ;COMPARE NAME IN TCB TO "LOG" TASKNAME BNE 2$ ;IF NOT THE SAME, BRANCH CMP 10(R0),TSKNAM+2 BEQ NEWUIC ;IF EQUAL, WE'VE FOUND THE RIGHT TCB 2$: MOV 30(R0),R0 ;IF NOT, GET POINTER TO NEXT TCB BNE 1$ JMP ERROR ;ZERO MEANS STD IS EXHAUSTED NEWUIC: MOV 26(R0),R1 ;POINTS TO UCB FOR THIS TERMINAL ADD #U.UIC,R1 ;DEFAULT UIC FOR THIS TERMINAL TST LFLAG ;ARE WE DECLARING A NEW UIC? BMI OLDUIC ;IF NEG, JUST CHECKING OLD ONE MOV UIC,(R1) ;PUT NEW UIC IN TERMINAL UCB EXIT$S ;JOB'S DONE OLDUIC: MOV (R1),UIC ;PICK UP CURRENT UIC MOV #3,R4 ;INITIALIZE CHAR COUNT FOR [,] MOV #UBUF,R3 MOVB #'[,(R3)+ MOVB UIC+1,R1 ;GET GROUP NUMBER JSR PC,ENCODE ;CHANGE IT TO ASCII MOVB #COMMA,(R3)+ ;INSERT THE COMMA MOVB UIC,R1 ;GET THE USER NUMBER JSR PC,ENCODE ;CHANGE THAT TO ASCII ALSO MOVB #'],(R3) MOV #UBUF,R3 MSG: QIO$S #IO.WVB,#1,#1,,,, WTSE$C 1 EXIT$S ERROR: MOV #EMSG,R3 MOV #ECNT,R4 BR MSG .NLIST BIN EMSG: .ASCII /*** ILLEGAL UIC SPECIFICATION ***/ .LIST BIN ECNT= .-EMSG .EVEN .PAGE DIGIT: SUB #'0,R1 BLT ERROR ;MUST BE AN OCTAL DIGIT CMP R1,#7 BGT ERROR DEC R3 ;COUNT THE DIGIT BMI ERROR ;ONLY 3 ALLOWED ASH #3,R0 ;MULTIPLY R0 BY 8 ADD R1,R0 ;ADD THE NEW DIGIT RTS PC ENCODE: SWAB R1 ;MOVE NUMBER TO HIGH BYTE MOV #3,LFLAG ;COUNTER FOR LEADING ZEROS MOV #2,R2 ;ONLY TWO BITS IN TOP DIGIT JSR PC,1$ ;ENCODE TOP DIGIT INC R2 ;3 BITS FOR EACH OF REMAINING DIGITS JSR PC,1$ ;ENCODE SECOND 1$: CLR R0 ;FALL THROUGH TO ENCODE LAST DIGIT ASHC R2,R0 ;SHIFT BITS INTO R0 TST R0 ;IS IT ZERO? BNE 2$ ;IF NOT, CHAR MUST BE STORED DEC LFLAG ;IS IT A LEADING ZERO BLE 2$ ;IF NOT, BRANCH RTS PC ;IF SO, SKIP IT 2$: CLR LFLAG ;FUTURE ZEROS MUST BE PRINTED ADD #'0,R0 ;CONVERT TO ASCII MOVB R0,(R3)+ ;PUT CHAR IN STRING INC R4 ;COUNT IT RTS PC UBUF: .BLKB 10. UIC: 0 LFLAG: 0 TSKNAM: .BLKW 16. .END LOG