.TITLE SRILOG .IDENT /V1.0/ ;This program receives messages from the system and processes them, ultimately ;updating the System Accounting Log File (LB:[0,0]LOG.SYS). ; Version V1.0 ; ; Notes: ; 1) In this version, SRILOG receives its commands via the executive ; Send/Receive Data directives. The 13-word data packet looks like ; one of the following: ; ; BOOT LOGIN LOGOUT SHUTUP ;+00) 1 2 3 4 ;+01) 0 term # term # 0 ;+02) 0 uic uic 0 ;+04) 0 project 0 or -1 0 ;+16) 0 lastname 0 0 ; ; where: 1st byte = instruction code ; 2nd byte = terminal number ; 3rd byte = group code ; 4th byte = member code ; next 10. bytes = Ascii project string as typed during login ; (LOGOUT flag = -1 if no error on entry not found) ; next 12. bytes = Ascii user last name (12. out of 14. bytes) ; ; 2) LB:[0,0]LOG.SYS is opened without an explicit version number. ; If it cannot find the file, it will create a new one and issue ; a message to CO:. .MCALL OPEN$W,OPEN$U,FDBDF$,FDRC$A,FDOP$A,FDBF$A,FDAT$A,FSRSZ$ .MCALL PUT$,GET$,OFID$U,CLOSE$ .MCALL QIOW$S,QIOW$C,QIO$S,QIO$C,WTLO$C,WTSE$S,MRKT$C,EXIT$S,GTIM$C .MCALL CMKT$S,DSCP$S,ENCP$S,RCVD$C,RCVX$C,ALUN$C LOGLUN=1 ;LUN FOR LOGFILE LOGEFN=1 COLUN=2 ;LUN FOR CONSOLE MESSAGES COEFN=2 COEFNM=2 ;= 2**(COEFN-10....EVENT FLAG MASK TMEFN=6 ;MARK TIME EVENT FLAG TMEFNM=40 ;= 2**(TMEFN-1)....EVENT FLAG MASK CR=15 LF=12 BEL=7 .NLIST BEX ; FILE DESCRIPTORS FOR LOG-FILE $LOGFL: FDBDF$ FDRC$A FD.RAN,LOGBUF,64. FDOP$A LOGLUN,LOGDSD,,,FA.ENB!FA.DLK FDBF$A LOGEFN FDAT$A R.FIX,FD.CR!FD.BLK,64.,-1,-1 FSRSZ$ 1 LOGDSD: .WORD 4,LOGDEV ;LOG.SYS FILE DESCRIPTOR .WORD 5,ZERODR .WORD 7,LOGSYS LOGDEV: .ASCII /LB0:/ ZERODR: .ASCII /[0,0]/ LOGSYS: .ASCII /LOG.SYS/ LL.TT=4 LL.UIC=8. LL.LNM=16. ;OFFSETS INTO LOG LINES LL.PRJ=31. LL.DAT=42. LL.ON=51. LL.TTL=57. HELLIN: .ASCII *HEL T## ###,### LASTNAMEHERE PROJECT### * .ASCII *MO/DA/YR TI:ME LOGON* LOGBUF: TOPLIN: .ASCII /* TT UIC LAST NAME PROJ # / .ASCII /DATE TIME TOTAL/ BSTBL: .WORD BOOT,LOGIN,LOGOUT,SHUT BOOT: .ASCII /*BOOT*/ LOGIN: .ASCII /*LOGIN/ LOGOUT: .ASCII /LOGOUT/ SHUT: .ASCII /SHUTUP/ BSSIZ=.-SHUT BSLIN: .ASCII /** ** / .ASCII *DA/TE/UP TI:ME * BSINS=BSLIN+2 ;INSERT POINT FOR BOOT/SHUTUP STRING .NLIST BEX ER0M: .ASCII /~~~LOGGER~~~INITIALIZE FAILURE~~~/ ER0S=.-ER0M ER1M: .ASCII /~~~LOGGER~~~NO COMMAND~~~/ ER1S=.-ER1M ER2M: .ASCII /~~~LOGGER~~~BAD COMMAND:/ ER2N: .ASCII /000 000 000 000 000 000 000 000 000 000/ ER2S=.-ER2M ER3M: .ASCII /~~~LOGGER~~~ERROR:/ CMDA: .ASCII /??????/ ER3BS=.-ER3M ER3SS=.-ER3M .ASCII / TT/ TRMA: .ASCII /##: [/ GRPA: .ASCII /###,/ MEMA: .ASCII /###] / ER3OS=.-ER3M NAME: .ASCII /LASTNAMEHERE/ NAMSIZ=.-NAME .ASCII / / PROJ: .ASCII /PROJECT###/ PRJSIZ=.-PROJ ER3IS=.-ER3M LGERM: .ASCII /~~~LOGGER~~~LOG FILE ERROR: -/ LGERN: .ASCII /##~~~/ LGERS=.-LGERM NEWM: .ASCII /~~~LOGGER~~~LOG FILE CREATED~~~/ NEWS=.-NEWM NFFLG: .BYTE ;0 IF ERROR ON LOGOUT LOOKUP FAILURE DATFLG: .BYTE ;0 IF FIRST COMMAND NOT RECEIVED YET FILFLG: .BYTE ;0 IF LOG.SYS CLOSED .EVEN FNBSIZ=15. ;15. WORDS IN FILENAME BLOCK LOGID: .BLKW FNBSIZ ;SAVE AREA FOR FILENAME BLOCK CMDBUF: .BLKW 15. ;RECEIVE DATA BUFFER CMDOFF: .WORD ;COMMAND DISPATCH OFFSET LASTR: .WORD ;LAST RECORD NUMBER ER3SIZ: .WORD ER3TBL: .WORD ER3BS,ER3IS,ER3OS,ER3SS ;SIZES OF ERR3 STRINGS TIMBUF: .BLKW 8. ;TIME PARAMETERS PROT=177000 ;SY:RWED,OW:RWED,GR:R,WO: .LIST BEX SRILOG: CALL INIT ;INITIALIZE DATA, OPEN LOG FILE BCS ERR0 ;CAN'T EVEN DO THAT?? 10$: CALL GETCMD ;DEQUEUE A COMMAND....IF NONE, EXIT BCC 15$ ;DISPATCH CODE IN R0 CALL ERR1 ; NO COMMAND!! BR 10$ 15$: CALL PARSE ;PARSE THE COMMAND BCC 20$ ; GOT IT CALL ERR2 ; BAD SYNTAX!! BR 10$ 20$: MOV LASTR,R4 ;POINT TO LAST VALID RECORD MOV CMDOFF,R0 ;RETREIVE OFFSET CALL @CMDDIS(R0) ;DISPATCH ON COMMAND CODE BCC 10$ ;DONE....TRY A NEW COMMAND CALL ERR3 ; LOG AN ERROR BR 10$ ;AND LOOP BACK INIT: CLRB FILFLG ;SET FILE CLOSED CLRB DATFLG ;SET NO DATA YET MOV #PROT,R1 ;SET DEFAULT PROTECTION CALL .WDFFP ;FOR LOG.SYS CREATION ALUN$C COLUN,CO,0 ;ASSIGN LUN TO CO: MOV #$LOGFL,R0 ;GET FDB ADDR OPEN$U R0 ;OPEN FILE BCC 30$ ;OPEN! MOVB F.ERR(R0),R5 ;GET ERROR CODE CMP R5,#IE.NSF ;FILE NOT FOUND? BNE LGERR ;NOPE...OTHER ERROR OPEN$W R0 ;CREATE FILE BCS LGERR ;COULDN'T DO IT MOV #NEWM,R5 ;WRITE 'NEW FILE' MSG MOV #NEWS,R4 CALL ERROR MOV #TOPLIN,R5 ;SET FIRST RECORD ADDRESS MOV #1,R4 ;SET RECORD NUMBER TO WRITE CALL PUTLOG ;WRITE THE TOP LINE BCS 50$ ; ERROR 30$: INCB FILFLG ;SET FILE OPEN CALL FILSET ;SET UP TO SAVE NAMEBLOCK 35$: MOV (R1)+,(R2)+ SOB R3,35$ ;COPY FOR FUTURE OPEN BY FILE ID CLC ;KEEP THE FILE OPEN 50$: RETURN LGERR: CALL LGER ;WRITE FILE ERROR MSG LGCLOS: CLOSE$ #$LOGFL ;CLOSE THE FILE CLRB FILFLG ;FILE CLOSED SEC ;SET CARRY BIT RETURN ;AND RETURN REOPEN: CALL FILSET ;SET UP REGS 5$: MOV (R2)+,(R1)+ ;MOVE SAVED NAMEBLOCK BACK IN SOB R3,5$ OFID$U R0 ;REOPEN THE FILE BCS LGERR ; OOPS INCB FILFLG ;FILE OPEN RETURN FILSET: MOV #$LOGFL,R0 ;POINT TO FDB MOV #FNBSIZ,R3 ;SET SIZE OF NAME BLOCK MOV #LOGID,R2 ;SET AREA TO COPY IT TO MOV #$LOGFL+F.FNB,R1 ;POINT TO CURRENT NAME BLOCK RETURN ERR0: MOV #ER0M,R5 ;SET ERROR ADDRESS MOV #ER0S,R4 ;AND SIZE CALL ERROR ;PRINT MSG EXIT$S ;AND EXIT ERR1: MOV #ER1M,R5 ;MSG ADDRESS MOV #ER1S,R4 ;AND SIZE BR ERROR ERR2: MOV #ER2N,R0 ;POINT TO SPACE FOR BUFFER MOV #CMDBUF+4,R5 ;POINT TO CMD BUFFER MOV #10.,R4 ;PRINT FIRST 10 BYTES OF BAD COMMAND 5$: MOVB (R5)+,R1 ;GET BYTE BIC #177400,R1 ;CLEAR HIGH BYTE MOV #15010,R2 ;3 OCTAL DIGITS, ZERO-FILL CALL $CBTA INC R0 ;SKIP SPACE SOB R4,5$ MOV #ER2M,R5 ;POINT TO MSG MOV #ER2S,R4 BR ERROR ERR3: MOV #ER3M,R5 ;GET ERROR MSG SET UP BY PARSE MOV ER3SIZ,R4 ;AND SIZE ERROR: DSCP$S ;DISABLE CHECKPOINTING QIO$S #IO.WBT,#COLUN,#COEFN,,,, BCS E5 MRKT$C TMEFN,5,2 ;MARK 5 SECONDS BCS E5 WTLO$C 0,TMEFNM!COEFNM ;WAIT FOR EITHER WRITE OR TIMEOUT E5: QIOW$C IO.KIL,COLUN,COEFN ;KILL I/O ANYWAY CMKT$S ;AND CANCEL MARK TIMES ENCP$S ;ENABLE CHECKPOINTING RETURN ;*** MIGHT SPAWN A SYSTEM SERVICE MESSAGE LGER: MOV #$LOGFL,R0 ;POINT TO FILE FDB MOVB F.ERR(R0),R1 ;GET ERROR CODE NEG R1 ;TURN POSITIVE (MINUS SIGN IS IN STRING) MOV #LGERN,R0 ;POINT TO RECEIVE STRING MOV #13012,R2 ;UNSIGNED, DECIMAL, SPACE-FILL, 2 DIGITS CALL $CBTA ;CONVERT TO ASCII MOV #LGERM,R5 ;GET START OF MSG MOV #LGERS,R4 ;AND SIZE BR ERROR ;PRINT MSG ; LIST OF VALID SENDER TASKS: TASKS: .RAD50 /HEL/ .RAD50 /BYE/ .RAD50 /B../ .RAD50 /S../ .WORD 0 CMDS: .WORD 2,3,1,4 ;COMMAND CODES GETCMD: TSTB DATFLG ;GOT A COMMAND YET? BNE G10 ;YES....GET DATA OR EXIT INCB DATFLG ;EXECUTE THIS JUST ONCE RCVD$C ,CMDBUF ;RECEIVE THE FIRST COMMAND BR G200 G10: CLOSE$ #$LOGFL ;MAKE SURE FILE IS CLOSED BEFORE EXIT CLRB FILFLG ;SET FILE CLOSED RCVX$C ,CMDBUF ;GET NEXT COMMAND OR EXIT G200: RETURN PARSE: MOV CMDBUF,R0 ;GET FIRST HALF OF SENDER TASK NAME MOV CMDBUF+2,R1 ;AND 2ND HALF MOV #TASKS,R2 ;POINT TO LIST OF OK SENDER TASKS TST (R2) ;ANY MORE? 1$: BEQ SYNERR ; NO...NG CMP (R2),R0 ;1ST HALF OK? BEQ 3$ ; YES CMP (R2),R1 ;2ND HALF OK? BEQ 3$ ; YUP TST (R2)+ BR 1$ 3$: MOV #CMDBUF+4,R5 ;POINT TO COMMAND BUFFER MOVB (R5)+,R0 ;GET COMMAND BYTE ADD #CMDS-TASKS,R2 ;POINT TO APPROPRIATE CODE BYTE CMP R0,(R2) ; IS THIS THE RIGHT COMMAND? BNE SYNERR DEC R0 ;TURN INTO DISPATCH OFFSET ASL R0 MOV R0,CMDOFF ;SAVE FOR LATER MOV BSTBL(R0),R2 ;GET POINTER TO COMMAND STRING MOV #BSSIZ,R4 ;AND SIZE OF STRING MOV #CMDA,R3 ;POINT TO INSERT POINT 5$: MOVB (R2)+,(R3)+ ;MOVE STRING SOB R4,5$ MOV ER3TBL(R0),ER3SIZ ;GET SIZE OF ERR3 STRING CALL @PRS(R0) ;COMPLETE PARSING ACCORDING TO COMMAND TYPE BCS SYNERR ;ERROR!! TSTB FILFLG ;FILE ALREADY OPEN? BNE 10$ ;YES CALL REOPEN ;REOPEN THE LOG FILE BCS SYNERR 10$: CALL LASTRC ;GET LAST RECORD NUMBER GTIM$C TIMBUF ;WHAT TIME IS IT? RETURN PRS: .WORD PB,PI,PO,PS ;PARSING DISPATCH TABLE PB: MOV #25.,R4 ;NEXT 25. BYTES SHOULD BE ZERO BR CHK0 PS: MOV #25.,R4 ;NEXT 25. BYTES ARE ZERO BR CHK0 PI: CALL CHKTRM ;NEXT BYTE IS TERMINAL NUMBER BCS RETC ; N.G. CALL CHKUIC ;NEXT TWO BYTES ARE UIC BCS RETC MOV #PRJSIZ,R4 ;NEXT IS PROJECT MOV #PROJ,R3 ;PUT IT IN ITS PLACE 5$: MOVB (R5)+,(R3)+ SOB R4,5$ MOV #NAMSIZ,R4 ;NEXT IS NAME MOV #NAME,R3 ;MOVE IT 10$: MOVB (R5)+,(R3)+ SOB R4,10$ CLC ;FINE RETC: RETURN PO: CALL CHKTRM ;CHECK TERMINAL NUMBER BCS RETC CALL CHKUIC ;CHECK UIC BCS RETC MOVB (R5)+,NFFLG ;SAVE 'NOT FOUND' FLAG MOV #21.,R4 ;CHECK THE REST FOR ZEROES CHK0: TSTB (R5)+ ;CHECK FOR ZEROES BNE SYNERR ;N.G. SOB R4,CHK0 CLC RETURN SYNERR: SEC RETURN HITERM=20 ;HIGHEST TERMINAL NUMBER ALLOWED ( < 100 OCTAL ) CHKTRM: MOVB (R5)+,R1 ;GET TERMINAL NUMBER CMP R1,#HITERM ;TERMINAL NUMBER REASONABLE? BHI SYNERR ;NOPE MOV #TRMA,R0 ;PUT INTO COMMAND STRING MOV #11010,R2 ;2 OCTAL DIGITS, ZERO FILL CALL $CBTA CLC RETURN CHKUIC: MOVB (R5)+,R1 ;GRP NON-ZERO? BEQ SYNERR BIC #177400,R1 ;CLEAR HIGH BYTE MOV #GRPA,R0 ;PUT IN SLOT MOV #15010,R2 ;3 OCTAL DIGITS, ZERO-FILL CALL $CBTA MOVB (R5)+,R1 ;MEM NON-ZERO? BEQ SYNERR BIC #177400,R1 MOV #MEMA,R0 ;MOVE TO STRING MOV #15010,R2 ;3 OCTAL DIGITS, ZERO-FILL CALL $CBTA CLC RETURN LASTRC: MOV #$LOGFL,R0 ;POINT TO FDB MOV F.EFBK+2(R0),R5 ;GET LAST BLOCK NUMBER MOV F.FFBY(R0),R4 ;GET FIRST FREE BYTE # DEC R5 ASH #3,R5 ;MULTIPLY BY 8 ASH #-6,R4 ;DIVIDE BY 64 ADD R5,R4 ;R4 <- LAST RECORD NUMBER MOV R4,LASTR RETURN ; ON DISPATCH TO #CMD ROUTINES, ; R4 - PTR TO LAST VALID RECORD CMDDIS: .WORD BCMD,ICMD,OCMD,SCMD ; BOOT COMMAND -- CHANGE LAST BLOCK OF 'HEL' ENTRIES TO 'XXX' AND ADD BOOT LINE BCMD: 1$: CALL GETLOG ;READ FROM END OF FILE BACKWARDS BCS ERXT ; N.G. CMPB (R5),#'* ;BACK TO START OF BLOCK? BEQ 10$ ; YES...DONE CMPB (R5),#'H ;HEL ENTRY? BNE 5$ ; NO...GO ON MOVB #'X,R3 ; GOT ONE, UPDATE MOVB R3,(R5)+ MOVB R3,(R5)+ MOVB R3,(R5)+ ;XXX OUT HEL ADD #LL.TTL-3,R5 ;POINT TO 'LOGON' MOV #BOOT,R3 MOV #5,R1 3$: MOVB (R3)+,(R5)+ ;REPLACE WITH '*BOOT' SOB R1,3$ CALL PUTBUF ;WRITE LINE BCS ERXT 5$: SOB R4,1$ ;BACK UP ONE RECORD AND TRY AGAIN 10$: MOV #BOOT,R0 ;POINT TO BOOT LINE PUTBS: MOV #BSLIN+2,R1 ;POINT TO INSERT POINT MOV #BSSIZ,R2 ;GET SIZE TO MOVE 5$: MOVB (R0)+,(R1)+ ;MOVE IN STRING SOB R2,5$ MOV #BSLIN,R5 ;POINT TO BOOT/SHUTUP LINE CALL PUTDAT ;PUT IN TIME AND DATE MOV LASTR,R4 ;RESTORE LAST RECORD PTR INC R4 MOV #BSLIN,R5 ;POINT TO LINE TO WRITE CALL PUTLOG ;WRITE IT OUT RETURN ;DONE PROCESSING THIS CMD ; SHUTUP COMMAND -- LOGOUT ALL ENTRIES IN CURRENT BLOCK AND WRITE SHUTUP LINE SCMD: 1$: CALL GETLOG ;READ FROM END OF FILE BACKWARDS BCS ERXT ; N.G. CMPB (R5),#'* ;BACK TO START OF BLOCK? BEQ 10$ ; YES...DONE CMPB (R5),#'H ;HEL ENTRY? BNE 5$ ; NO...GO ON CALL OUT ;LOG THIS ENTRY OUT AND WRITE IT BACK BCS ERXT 5$: SOB R4,1$ ;AND TRY NEXT PREVIOUS 10$: MOV #SHUT,R0 ;POINT TO SHUTUP STRING BR PUTBS ERXT: SEC RETURN ; LOGOUT COMMAND -- FIND CORRECT ENTRY AND LOGOUT ; IF NOT FOUND, ERROR UNLESS NFFLG < 0 OCMD: 1$: CALL GETLOG ;READ FROM END OF FILE BACKWARDS BCS ERXT ; N.G. CMPB (R5),#'* ;BACK TO START OF BLOCK? BEQ 10$ ; YES...DONE CMPB (R5),#'H ;HEL ENTRY? BNE 5$ ; NO...GO ON CMPB LL.TT+1(R5),TRMA ;SAME FIRST DIGIT OF TERMINAL NUMBER? BNE 5$ ; NO...SKIP IT CMPB LL.TT+2(R5),TRMA+1 ;SAME SECOND DIGIT? BEQ 50$ ; YES...LOG IT OUT 5$: SOB R4,1$ ;TRY PREVIOUS ENTRY 10$: TSTB NFFLG ;COULDN'T FIND IT....IS THIS AN ERROR? BPL ERXT ; YES...ERROR MSG GOES OUT BR 75$ ; NO....NORMAL EXIT 50$: CALL OUT ;LOG THIS ENTRY OUT AND WRITE TO FILE 75$: RETURN ; LOGIN ENTRY -- WRITE A NEW LINE ON END OF FILE ICMD: MOV #HELLIN+LL.TT+1,R0 ;POINT TO TERMINAL NUMBER SLOT MOVB TRMA,(R0)+ ;MOVE ASCII NUMBER MOVB TRMA+1,(R0)+ MOV #HELLIN+LL.UIC,R0 ;POINT TO UIC SLOT MOV #GRPA,R1 ;POINT TO PARSED UIC MOV #7,R2 ;3 DIGITS, COMMA, 3 DIGITS 5$: MOVB (R1)+,(R0)+ SOB R2,5$ MOV #HELLIN+LL.LNM,R0 ;POINT TO LAST NAME SLOT MOV #NAME,R1 ;POINT TO PARSED NAME MOV #NAMSIZ,R2 10$: MOVB (R1)+,(R0)+ SOB R2,10$ MOV #HELLIN+LL.PRJ,R0 ;POINT TO PROJECT SLOT MOV #PROJ,R1 ;PARSED PROJECT MOV #PRJSIZ,R2 15$: MOVB (R1)+,(R0)+ SOB R2,15$ MOV #HELLIN,R5 ;POINT TO START OF LINE CALL PUTDAT ;PUT IN TIME INC R4 ;POINT TO NEXT RECORD CALL PUTLOG ;WRITE RECORD RETURN PUTDAT: MOV R5,R0 ;GET PTR TO LINE TO ADD DATE TO ADD #LL.DAT,R0 ;POINT TO DATE AREA MOV TIMBUF+2,R1 ;MONTH CALL TWODEC ;PUT TWO DIGITS INTO LOGLIN MOVB #'/,(R0)+ MOVB TIMBUF+4,R1 ;DAY CALL TWODEC MOVB #'/,(R0)+ MOVB TIMBUF,R1 ;YEAR CALL TWODEC MOVB #40,(R0)+ ;SPACE PUTTIM: MOVB TIMBUF+6,R1 ;HOURS CALL TWODEC MOVB #':,(R0)+ MOVB TIMBUF+10,R1 ;MINUTES CALL TWODEC RETURN TWODEC: MOV #11012,R2 ;UNSIGNED, ZERO FILL, TWO DECIMAL DIGITS CALL $CBTA RETURN ;OUT MARKS THE RECORD IN LOGBUF AS LOGGED OUT AND WRITES IT OUT ; *** NOTE WELL *** ; THIS ROUTINE COMPUTES CONNECT TIME WITH EXACTLY ONE DAY OVERLAP! ; THIS MEANS THAT IF YOU LOG ON AT 23:59 AND LOGOUT AT 00:01, THREE YEARS ; LATER, YOU WILL BE BILLED FOR 2 MINUTES CONNECT TIME (LUCKY YOU!). OUT: MOV #LOGBUF,R0 ;POINT TO TOP OF LINE MOV R0,R1 MOVB #'L,(R1)+ ;CHANGE 'HEL' TO 'LOG' MOVB #'O,(R1)+ MOVB #'G,(R1)+ ADD #LL.DAT+3,R0 ;POINT TO ASCII DAY MOV #TIMBUF,R3 ;POINT TO PRESENT BINARY TIME MOV G.TIMI(R3),-(SP) ;SAVE MINS MOV G.TIHR(R3),-(SP) ;AND HOURS CALL $CDTB ;CONVERT LOG-LINE DAY TO BINARY CMP R1,G.TIDA(R3) ;LOGOUT SAME DAY AS LOGIN? BEQ 5$ ; YES ADD #24.,G.TIHR(R3) ; NO...ASSUME ONE DAY'S PASSAGE 5$: MOV #LOGBUF+LL.ON+3,R0 ;POINT TO LOGON TIME (MIN) CALL $CDTB ;CONVERT TO BINARY CMP R1,G.TIMI(R3) ;OLD MIN > NEW? BLE 10$ ; NO ADD #60.,G.TIMI(R3) ; YES...BORROW FROM HOURS DEC G.TIHR(R3) 10$: SUB R1,G.TIMI(R3) ;SUBTRACT MIN MOV #LOGBUF+LL.ON,R0 ;POINT TO LOGON TIME (HR) CALL $CDTB ;CONVERT SUB R1,G.TIHR(R3) ;SUBTRACT LOGON HRS 15$: BPL 20$ ; NORMALLY, POSITIVE ADD #24.,G.TIHR(R3) ;DOES TIME GO BACKWARDS? BR 15$ 20$: MOV #LOGBUF+LL.TTL,R0 ;POINT TO LOGOUT TOTAL TIME CALL PUTTIM ;CONVERT TO ASCII MOV (SP)+,G.TIHR(R3) ;RESTORE HOURS MOV (SP)+,G.TIMI(R3) ;RESTORE MINS BR PUTBUF ;AND WRITE ENTRY TO LOG FILE ;GETLOG READS A 64. BYTE RECORD (@ R4) INTO LOGBUF & RETURNS R5 POINTING TO IT GETLOG: MOV #$LOGFL,R0 ;GET FDB MOV R4,F.RCNM+2(R0) ;SET RECORD NUMBER MOV #LOGBUF,R5 ;SET DEST GET$ R0,R5,#64. ;READ A RECORD BCS FLERR ; ERROR RET: RETURN ;AND RETURN STATUS IN C-BIT ;PUTBUF WRITES LOGBUF USING PUTLOG ;PUTLOG WRITES LINE AT R5 TO RECORD NUMBER IN R4 PUTBUF: MOV #LOGBUF,R5 PUTLOG: MOV #$LOGFL,R0 ;GET FDB MOV R4,F.RCNM+2(R0) ;SET RECORD NUMBER PUT$ R0,R5,#64. ;WRITE 64 BYTES BCC RET ; OK FLERR: JMP LGERR ;PRINT ERROR CODE .END SRILOG