.TITLE LOG ; ; PURPOSE: TO READ/WRITE PROJECT DATA FROM "[7,237]LOGLOGLOG.LOG" DURING ; LOGIN AND LOGOUT PROCEDURES. ; ; THIS TASK WILL BE STARTED FROM USER SUBROUTINES IN HELLO AND BYE. ; (SPAWNING TO MCR: "LOG $I$ [XXX,XXX]" OR "LOG $O$ [XXX,XXX]") ; ; ; .MCALL FSRSZ$,FDBDF$A,FDAT$A,FDRC$A,FDBK$A,FDOP$A,OPEN$M,CLOSE$ .MCALL EXST$S,QIOW$S,DIR$,GMCR$,GLUN$S,GTIM$S,MRKT$S,ASTX$S,CMKT$S .GLOBL WFR56,CLR56 ; GMCR: GMCR$ MCRBUF=GMCR+2 ; FSRSZ$ 0 ;NO RECORD I/O FDB: FDBDF$ ;DEFINE FDB FDAT$A ,,,, ;FILE ATTRIBUTE SECTION FDRC$A FD.RWM ;RECORD ACCESS SECTION FDBK$A BUF ;BLOCK ACCESS SECTION FDOP$A ,DSPT ;FILE OPEN SECTION ; DSPT: .WORD DEVSZ,DEV ;DATA SET DESCRIPTOR -- DEVICE .WORD UICSZ,UIC ; -- UIC .WORD FNAMSZ,FNAM ; -- FILE NAME ; DEV: .ASCII /SY0:/ DEVSZ=.-DEV UIC: .ASCII /[7,237]/ UICSZ=.-UIC FNAM: .ASCII /LOGLOGLOG.LOG/ FNAMSZ=.-FNAM .EVEN ; LOG: MOV #1,EXSTAT ;SET EXIT STATUS = SUCCESS DIR$ #GMCR ;GET COMMAND LINE MOV $DSW,R0 ;$DSW CONTAINS NUMBER OF CHARACTERS CMP #17.,R0 ;IF NE 17... ERROR. BEQ INPOK JMP ERR0 INPOK: CMP #"$ ,MCRBUF+6 ;"$ " IN BYTE 7 AND 8? BNE ERR0 ;IF NE NO CMP #"$I,MCRBUF+4 ;"$I" IN BYTE 5 AND 6? BEQ LOGIN ;IF EQ YES, SO IT IS A LOGIN. CMP #"$O,MCRBUF+4 ;"$O" IN BYTE 5 AND 6? BNE ERR0 ;IF NE ERROR JMP LOGOUT ;IF EQ IT IS A LOGOUT. ; ; ERR0: QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#MCRERR,#MCRLEN,#40>;COMMAND LINE ERROR JMP EXST ;EXIT WITHOUT CLOSE FILE OR SET FLAG ; ; LOGIN: JSR PC,WFR56 ;WAIT FOR ACCES TO "LOGLOGLOG.LOG" OPEN$M #FDB,#1,,,,,OPNERR ;OPEN LOG FILE QIOW$S #IO.RVB,#1,#1,,#IOST,,<#IBFHDR,#512.,,,#1> ;READ HEADER GLUN$S #5,#LUNBUF ;GET LUN INFO FOR TI: MOVB LUNBUF+2,R3 ;GET TERMINAL UNIT NUMBER OF TI: ASL R3 ;MAKE IT BYTE OFFSET TST IBFHDR(R3) ;ALREADY LOGGED IN? BEQ FIRST ;IF EQ NO QIOW$S #IO.RVB,#1,#1,,#IOST,,<#IBFPR1,#512.,,,IBFHDR(R3)> QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#MES0,#MS0LEN,#'$> QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#PRONAM,#32.,#'+> FIRST: MOV #IBFHDR+40,R3 ;POINT TO FIRST UIC RECORD CLR R5 ;CLEAR UIC COUNTER AGAIN: MOV #MCRBUF+8.,R2 ;POINT TO UIC IN COMMAND LINE MOV #9.,R4 ;9 CHARACTERS SHOULD MATCH MOV R3,R1 ;SAVE RECORD POINTER TSTUIC: CMPB (R2)+,(R3)+ ;SAME BYTE? BNE NEXTUI ;IF NE NO, TAKE NEXT UIC SOB R4,TSTUIC ;ALL DONE? BR FOUND ;YES, FOUND A MATCH NEXTUI: INC R5 ;INC COUNTER CMP #30.,R5 ;ALL 30 DONE? BGT ADD ;IF GT NO JMP EXIT ;YES...EXIT ADD: MOV R1,R3 ;POINT TO NEXT UIC RECORD ADD #20,R3 BR AGAIN ;AND DO IT ALL OVER AGAIN ; ; FOUND: MOV R5,R3 ;R5=0,1,2....29. ASR R3 ASR R3 ASR R3 ADD #2,R3 ;R3=2,3,4,5 QIOW$S #IO.RVB,#1,#1,,#IOST,,<#IBFVBL,#512.,,,R3> ;READ VBN BLOCK. CLR R3 CLR R4 ; ; BIC #177770,R5 ;R5=0,1,2,...7 ASHC #6,R5 ;R5=0,100,200,....700 QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#MES,#MESLEN,#40> ;PRINT MESSAGE TSTVBN: TST IBFVBL(R5) ;TEST RECORD ELEMENT BEQ NEXT ;IF 0, TAKE NEXT ; ; READ FIRST PROJECT BLOCK ; READ: QIOW$S #IO.RVB,#1,#1,,#IOST,,<#IBFPR1,#512.,,,IBFVBL(R5)> MOV IBFVBL(R5),ISAV1(R3) ;SAVE VBN OF THIS PROJECT INC R3 ;UPDATE INDEX IN SAVED VBN ARRAY INC R3 INCB NUM+1 ;NEXT VALID PROJECT CMPB #'9,NUM+1 ;CORRECT ASCII NUMBER IF NECESSARY BGE NOTEN MOV #'0,NUM+1 INCB NUM NOTEN: QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#NUMBER,#6,#'$> ;PRINT NUMBER ON TI: QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#PRONAM,#32.,#'+> ;AND PROJ. NAME NEXT: INC R5 ;INDEX OF VBN RECORD INC R5 INC R4 CMP #32.,R4 ;ALL 32 POSSIBLE PROJECTS DONE? BGT TSTVBN ;IF GT NO TST R3 ;IF NO PROJECTS FOUND.... BNE ASKN ;........ JMP EXIT ;....EXIT ; ; ASKN: ASR R3 ;NUMBER OF PROJECTS ASKNUM: QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#ASK,#ASKLEN,#'$> ;ASK FOR NUMBER CLR INPUT ;CLEAR INPUT ARRAY CLR INPUT+2 MRKT$S #7,#15.,#2,#TIMAST ;SET UP AST AFTER 15 SECONDS QIOW$S #IO.RVB,#5,#5,,#IOST5,,<#INPUT,#2,#0> ;READ NUMBER FROM TI: CMKT$S #7 ;CANCEL MARKTIME IF STILL THERE TSTB IOST5 ;ERROR OR TIMEOUT? BGT CONVRT ;IF GT NO CLR EXSTAT ;SET EXIT STATUS JMP EXIT ;AND EXIT CONVRT: MOV #INPUT,R0 ;CONVERT TO BINARY CALL $CDTB GOTNUM: CMP R3,R1 ;IF NUMBER > MAXIMUM... TRY AGAIN BLT ASKNUM TST R1 ;IF NUMBER < 0 TRY AGAIN BLE ASKNUM DEC R1 ;MAKE NUMBER A BYTE OFFSET (0,2,....) ASL R1 ; ; READ PROJECT RECORD WANTED ; QIOW$S #IO.RVB,#1,#1,,#IOST,,<#IBFPR1,#512.,,,ISAV1(R1)> GTIM$S #TIMBUF ;GET TIME AND DATE MOVB LUNBUF+2,R3 ;GET LOG-IN TERMINAL NUMBER ASL R3 ;MAKE IT 0,2,4... MOV ISAV1(R1),IBFHDR(R3) ;SAVE VBN OF PROJECT INTO HEADER QIOW$S #IO.WVB,#1,#1,,#IOST,,<#IBFHDR,#512.,,,#1> ;WRITE HEADER BACK MOV #LLGIN,R0 ;COPY THE TIME INTO PROJECT RECORD ADD LLG(R3),R0 MOV TIMBUF,(R0)+ MOV TIMBUF+2,(R0)+ MOV TIMBUF+4,(R0)+ MOV TIMBUF+6,(R0)+ MOV TIMBUF+10,(R0)+ MOV TIMBUF+12,(R0) ; ; WRITE PROJECT RECORD BACK ; QIOW$S #IO.WVB,#1,#1,,#IOST,,<#IBFPR1,#512.,,,ISAV1(R1)> JMP EXIT ; ; TIMAST: QIOW$S #IO.KIL,#5 ;KILL OUTSTANDING READ TST (SP)+ ;CLEAR STACK ASTX$S ;EXIT AST ; ; LOGOUT: JSR PC,WFR56 ;WAIT FOR ACCESS TO LOG-FILE OPEN$M #FDB,#1,,,,,OPNERR ;OPEN LOG-FILE QIOW$S #IO.RVB,#1,#1,,#IOST,,<#IBFHDR,#512.,,,#1> ;READ HEADER GLUN$S #5,#LUNBUF ;GET LUN INFO FOR TERMINAL NUMBER GTIM$S #TIMBUF ;GET CURRENT DATE/TIME MOVB LUNBUF+2,R3 ;GET TERMINAL NUMBER OF TI: ASL R3 ;MAKE IT 0,2,.... MOV IBFHDR(R3),PR1SAV ;GET VBN OF PROJECT ON WHICH LOGGED IN CMP #6,PR1SAV ;IF < 6..... BLE GOON ;...... JMP EXIT ;.... EXIT GOON: CLR IBFHDR(R3) ;CLEAR LOGIN FLAG QIOW$S #IO.WVB,#1,#1,,#IOST,,<#IBFHDR,#512.,,,#1> ;WRITE HEADER QIOW$S #IO.RVB,#1,#1,,#IOST,,<#IBFPR1,#512.,,,PR1SAV> ;READ PROJ BLOCK MOV #LLGOUT,R0 ;COPY CURRENT DATE/TIME INTO PROJ BL. ADD LLG(R3),R0 MOV R0,R1 MOV TIMBUF,(R1)+ MOV TIMBUF+2,(R1)+ MOV TIMBUF+4,(R1)+ MOV TIMBUF+6,(R1)+ MOV TIMBUF+10,(R1)+ MOV TIMBUF+12,(R1) ; ; CALCULATE TIME DIFFERENCE BETWEEN IN- AND OUTLOG ; MOV R0,R1 SUB #120.,R0 BIT #3,(R0) ;LOGIN IN "LEAP-YEAR"? BNE 1$ ;IF NE NO CMP #3,2(R0) ;LOGIN BEFORE MARCH? BLE 2$ ;IF LE NO INC TAB+2 ;MAKE #DAYS IN FEB = 29. BR 2$ 1$: BIT #3,(R1) ;LOGOUT IN "LEAP-YEAR"? BNE 2$ ;IF NE NO CMP #3,2(R1) ;LOGOUT AFTER FEBR.? BLE 2$ ;IF LE YES INC TAB+2 ;MAKE #DAYS IN FEB = 29. 2$: CLR R2 MOV (R1)+,R4 ;GET LOGOUT YEAR SUB (R0)+,R4 ;SUBTRACT LOGIN YEAR BEQ NEXT1 ;IF EQ NO FIREWORKS IN BETWEEN MOV #12.,R2 ;ADD 12 MONTHS LATER ON ; NEXT1: MOV (R1)+,R4 ;GET LOGOUT MONTHS ADD R2,R4 ;ADD 0 OR 12 CLR R2 MOV (R0)+,R3 ;SUBTRACT LOGIN MONTHS SUB R3,R4 BEQ NEXT2 ;IF EQ DON'T ADD DAYS DEC R3 ;PREPARE POINTER TO TAB ASL R3 ADDTAB: ADD TAB(R3),R2 ;ADD DAYS LATER ON INC R3 ;UPDATE POINTER INC R3 CMP #22.,R3 ;PAST DECEMBER?? BGE 10$ ;IF GE NO CLR R3 ;POINT TO JANUARY AGAIN 10$: DEC R4 ;ALL DONE? BGT ADDTAB ;IF GT NO ; NEXT2: MOV (R1)+,R4 ;GET LOGOUT DAYS ADD R2,R4 ;ADD NUMBER OF DAYS CLR R3 SUB (R0)+,R4 ;SUBTRACT LOGIN DAYS BEQ NEXT3 ;IF EQ DON'T ADD HOURS LATER ON MOV R4,R3 MUL #24.,R3 ;R3 = NUMBER OF HOURS TO ADD ; NEXT3: MOV (R1)+,R4 ;GET LOGOUT HOURS ADD R3,R4 ;ADD SOME SUB (R0)+,R4 ;SUBTRACT LOGIN HOURS MOV R4,DIFHH ;SAVE NUMBER OF HOURS CONNECTED TO SYSTEM ; ; MOV (R1)+,R4 ;GET LOGOUT MINUTES SUB (R0)+,R4 ;SUBTRACT LOGOUT MINUTES BEQ NEXT5 ;IF EQ NO ACTION DEC DIFHH ;TAKE 60 MINUTES AND ADD #60.,R4 ;ADD THEM TO MINUTE COUNTER NEXT5: MOV R4,DIFMM ;SAVE MINUTES MOV (R1),R4 ;GET LOGOUT SECONDS SUB (R0),R4 ;SUBTRACT LOGIN SECONDS BEQ NEXT6 ;IF EQ NO ACTION DEC DIFMM ;TAKE 60 SECONDS AND ADD #60.,R4 ;ADD THEM TO SECOND COUNTER MOV R4,DIFSS ;SAVE SECONDS NEXT6: CLR R4 ;#SECONDS SHOULD BE < 60 MOV DIFSS,R5 DIV #60.,R4 MOV R5,DIFSS ADD R4,DIFMM CLR R4 ;# MINUTES TOO MOV DIFMM,R5 DIV #60.,R4 MOV R5,DIFMM ADD R4,DIFHH MOV DIFHH,R0 ;COPY NUMBER OF HOURS, MOV DIFMM,R1 ;MINUTES AND MOV DIFSS,R2 ;SECONDS ; ; ADD TOTLOG,R0 ;ADD OLD TOTALS ADD TOTLOG+2,R1 ADD TOTLOG+4,R2 ; CLR R4 ;MAKE NUMBER OF MINUTES AND SECONDS < 60 MOV R2,R5 DIV #60.,R4 MOV R5,TOTLOG+4 ADD R4,R1 CLR R4 MOV R1,R5 DIV #60.,R4 MOV R5,TOTLOG+2 ADD R4,R0 MOV R0,TOTLOG ; MOV DIFHH,R0 ;SAME FOR GRAND TOTALS MOV DIFMM,R1 MOV DIFSS,R2 ADD GRANTL,R0 ADD GRANTL+2,R1 ADD GRANTL+4,R2 CLR R4 MOV R2,R5 DIV #60.,R4 MOV R5,GRANTL+4 ADD R4,R1 CLR R4 MOV R1,R5 DIV #60.,R4 MOV R5,GRANTL+2 ADD R4,R0 MOV R0,GRANTL ; ; WRITE PROJECT BLOCK BACK ; QIOW$S #IO.WVB,#1,#1,,#IOST,,<#IBFPR1,#512.,,,PR1SAV> MOV #CONHH,R0 ;CONVERT DIFFERENCE INTO ASCII MOV DIFHH,R1 MOV #15012,R2 CALL $CBTA MOV #CONMM,R0 MOV DIFMM,R1 MOV #11012,R2 CALL $CBTA MOV #CONSS,R0 MOV DIFSS,R1 MOV #11012,R2 CALL $CBTA QIOW$S #IO.WVB,#5,#5,,#IOST5,,<#CONNEC,#CONLEN,#40> ;PRINT TO TI: ; ; ; ; ; EXIT: CLOSE$ #FDB ;CLOSE LOG-FILE JSR PC,CLR56 ;CLEAR ACCESS FLAG EXST: EXST$S EXSTAT ;EXIT ; ; OPNERR: MOV $DSW,R0 ;OPEN ERROR.... R0 = $DSW MOV FDB+F.ERR,R1 ; R1 = FCS ERROR CODE JSR PC,CLR56 ;CLEAR ACCESS FLAG TRAP ;SHOW R0 AND R1 AND EXIT ; ; EXSTAT: .WORD 0 DIFHH: .WORD 0 DIFMM: .WORD 0 DIFSS: .WORD 0 TAB: .WORD 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. ; PR1SAV: .WORD 0 BUF: .BLKB 512. IOST: .BLKB 4 IOST5: .BLKB 4 IBFHDR: .BLKB 512. IBFVBL: .BLKB 512. IBFPR1: ACCUIC: .BLKB 10. PRONAM: .BLKB 32. TOTLOG: .BLKB 6 TOTSNC: .BLKB 16. LLGIN: .BLKB 120. LLGOUT: .BLKB 120. ICURPN: .WORD 0 GRANTL: .BLKB 6 GRANTS: .BLKB 16. .BLKB 184. LUNBUF: .BLKW 6 TIMBUF: .BLKW 8. ISAV1: .BLKW 32. LLG: .WORD 0,12.,24.,36.,48.,60.,72.,84.,96.,108. MES0: .BYTE 15,12,12 .ASCII /*** WARNING *** TERMINAL WAS LOGGED IN FOR PROJECT: / MS0LEN=.-MES0 ASK: .BYTE 15,12 .ASCII /--- WHICH PROJECT? / ASKLEN=.-ASK MCRERR: .ASCII /...LOG -- COMMAND LINE ERROR/ MCRLEN=.-MCRERR CONNEC: .BYTE 15,12 .ASCII / ***************************************/ .BYTE 15,12 .ASCII / *** TOTAL TIME CONNECTED: / CONHH: .BLKB 3 .ASCII /:/ CONMM: .BLKB 2 .ASCII /:/ CONSS: .BLKB 2 .ASCII / ***/ .BYTE 15,12 .ASCII / ***************************************/ .BYTE 15,12 CONLEN=.-CONNEC MES: .BYTE 15,12,12 .ASCII /THE FOLLOWING PROJECTS ARE AVAILABLE FOR ACCOUNTING:/ .BYTE 15,12 MESLEN=.-MES .EVEN NUMBER: .BYTE 15,11 NUM: .ASCII /00. / INPUT: .BLKB 4 .END LOG