; 23-MAY-77 16:51:31 >BYE=BYE .TITLE RSX11D .SBTTL INTRO PAGE .IDENT /V02 / .LIST MEB ; .PSECT . ABS.,OVL,RW,LCL,D ;MAX LEN = 000000 ;; .MCALL DIR$,GMCR$,QIOW$,EXIT$S,GTIM$ .MCALL FDBDF$,FSRSZ$,FDAT$A,FDRC$A,FDOP$A,NMBLK$,GET$R,PUT$ .MCALL CLOSE$,OPEN$R,OPEN$A,NBOF$L ; ; ; BYEPDS IS STANDARD HEL MODIFIED TO INTERFACE TO ; REESE SYSTEM ; ; BYE DOES NORMAL THING OF LOGGING USER OFF. ; TWO MINOR CHANGES ARE ; A/ BYE DOES NOT RESET TERM CHARACTERISTICS EXCEPT FOR PHONE LINES ; B/ BYE CANCLES HIS MCR RECALL FLAG SO MCR AND HEL ARE NOT RECALLED ; ; MAJOR MODIFICATION FOR IAS/RSX IS THAT ; ; A/ HEL HAS PUT LOG ON TIME AND USER RECORD IN [1,100]PDSUPF.DAT ; INTO A COMMON AREA HELBYE.TSK ; ; B/ BYE USES DATA IN COMMON AREA TO COMPUTE CONNECT TIME FOR THE ; USER, AND WRITES TO A FILE [1,100]XXXXXXXXX.DAT (WHERE XXXXXXXXX ; IS THE USERNAME TERMINAL WAS LOGGED INTO) A LINE OF THE FORM ; ; MM/DD/YY HH:MM:SS MM/DD/YY HH:MM:SS DDD:HH:MM:SS ; (TIME OF LOGIN) (TIME OF LOGOUT) TOTAL CONNECT TIME ; ; C/ AS A HANDSHAKE, BYE ZEROS THE CONNECT TIME BUFFER AND ; USER PROFILE FILE RECORD NUMBER AFTER HE FINISHES ; ; D/ FORMAT OF HELBYE IS ; ; HELBYE:: .BLKW 8 ;LOG-ON TIME (A GET TIME DATA BLOCK) ; .WORD 17 ;INDEX INTO USER PROFILE FILE ; .WORD 0 ;A SPARE WORD ; THE ABOVE 10. WORD BLOCK IS REPEATED FOR EACH TERMINAL ; IN THE SYSTEM. ; ; ; E/ BYE IS MORE HUMAN LIKE: HIS TOTAL ACTION LOOKS LIKE THIS ; ; MCR>BYE ; USER XXXXXXXXX: YOU ARE LOGGED OF AT HH:MM:SS ; CONNECT TIME WAS: DDD:HH:MM:SS ; GOOD MORNING ; GOOD AFTERNOON (LAST LINE IS TIME DEPENDENT) ; GOOD EVENING ; ; .PAGE .SBTTL DATA AREAS GMCDPB: GMCR$ ;DPB & BUFFER TO GET MCR & FREE NDOES QIODPB: QIOW$ SF.RDF,6,1,,,, ;QIO TO RESET TERM CHARACTERISTICS BYEDPB: QIOW$ IO.WVB,6,1,,,, ;QIO TO WRITE LOG-OFF MESSAGE GETDPB: GTIM$ TIMBUF BYEHDR: .ASCII /USER / BYEMES: .ASCII / : / BYEME1: .ASCII /LOGGED OFF AT / BYEPTR: .ASCII / / BYELEN=.-BYEHDR BYELE1=.-BYEME1 .EVEN BYEMS1: .ASCII /GOOD EVENING/ BYELN1=.-BYEMS1 BYEMS2: .ASCII /GOOD AFTERNOON/ BYELN2=.-BYEMS2 BYEMS3: .ASCII /GOOD MORNING/ BYELN3=.-BYEMS3 .EVEN TIMCON: .ASCII /CONNECT TIME WAS: / TIMTIM: .ASCII /DDD:HH:MM:SS/ TIMLEN=.-TIMCON .EVEN OUT.LN = 80. TIMFLA: .WORD 0 ;FLAG FOR FIRST TIME PUTING TIME TO FILE MONTAB: .BYTE 31.,31.,28.,31.,30.,31.,30. ;DEC THRU JUNE .BYTE 31.,31.,30.,31.,30.,31. ;TABLE OF LENGTHS OF MONTHS .EVEN TIMBUF: .BLKW 8. ;BUFFER FOR LOG OFF TIME DIFBUF: .BLKW 8. ;BUFFER FOR DELTA TIME USEBUF: .BLKW 40 ;BUFFER TO READ UPF INFO OUTBUF: .BLKB OUT.LN ;BUFFER FOR FILE OUTPUT .PAGE .SBTTL FCS DATA AREAS NBOF$L ;DEFINE NAME BLOCK OFFSETS USENAM: NMBLK$ PDSUPF,DAT,,SD ;DEFINE FILE NAME FOR USER PROFILE FILE NAMBLK: NMBLK$ UNSERN,LOG,,SD ;DEFINE FILE NAME FOR TIME LOG FILE FSRSZ$ 2 FDB: FDBDF$ ;DEFINE FDB FOR USER PROFILE FILE FDAT$A R.FIX,,64. FDRC$A FD.RAN,USEBUF,64. FDOP$A 4,,USENAM FDB1: FDBDF$ ;DEFINE FDB FOR LOGGING FILE FDAT$A R.VAR,FD.CR,80. FDRC$A ,OUTBUF,80. FDOP$A 4,,NAMBLK UICSTR: .ASCII /[1,100]/ UICLEN=.-UICSTR .EVEN UICDSD: .WORD UICLEN .WORD UICSTR .PAGE .SBTTL INITIAL CODE ;MOD AT MRH SO BYE NEVER RECALLS MCR (OR HELLO) AND DOESN'T RESET ;TERMINAL CHARACTERISTICS START: DIR$ #GMCDPB ;GET MCR TO FREE NODES MOV #OUTBUF,R0 ;BLANK OUT LINE BUFFER FOR FILE MOV #OUT.LN,R1 MOVB #40,R2 3$: MOVB R2,(R0)+ SOB R1,3$ MOV .CRTSK,R5 ;GET MY ATL ENTRY MOV #77406,-(SP) ;NEW PDR TO STACK MOV A.HA(R5),-(SP) ;NEW PAR TO STACK JSR PC,..SPD3 ;SWAP PAR/PDR SET 3 TO MY HEADER BIC #HF.RMC,60000+H.EAF ;CLEAR MY MCR RECALL FLAG MOV #500,60000+H.UIC ;MAKE HEADER UIC 1,100 JSR PC,..SPD3 ;RESET MY PAR/PDR SET 3 CMP (SP)+,(SP)+ ;AND ADJUST STACK MOV A.TI(R5),R5 ;NOW HAVE MY TI PUD POINTER BIC #UT.LG,U.TF(R5) ;CLEAR LOGGED ON BIT BIC #UC.OSP,U.PR(R5) ;AND CLEAR OUTPUT SPOOLED BIT JUST IN CASE BIT #6,U.C3(R5) ;A DZ OR DC PHONE LINE INTERFACE ? BEQ 10$ ;BR IF NOT DIR$ #QIODPB ;ONLY RESET IF A PHONE LINE INTERFACE 10$: DIR$ #GETDPB ;GET TIME MOV #BYEPTR,R0 ;POINT TO 2ND HALF OF MESSAGE MOV #TIMBUF+6,R5 ;POINT TO HOURS MOV #3,R4 ;LOOP COUNTER CLR R2 ;NO LEADING ZEROES 1$: MOV (R5)+,R1 ;TIME IN R1 CMP R1,#10. ;ONE DIGIT ? BGE 2$ ;IF SO SKIP NEXT MOVB #'0,(R0)+ ;MAKE TIME LOOK NEAT 2$: JSR PC,$CBDMG ;CONVERT TIME MOVB #':,(R0)+ ;MAKE IT NEAT SOB R4,1$ ;LOOP FOR 3 MOVB #' ,-(R0) ;ERASE LAST ':' .PAGE .SBTTL GET USER INFO MOV #HELBYE,R0 ;POINT TO COMMON AREA MOV .CRTSK,R5 ;GET MY ATL AGAIN MOV A.TI(R5),R5 ;AND TI POINTER MOVB U.UN(R5),R5 ;AND UNIT NUMBER MUL #20.,R5 ;MAKE HIM OFFSET INTO DATA AREA ADD R5,R0 ;NOW HAVE BUFFER FOR THIS TI TST HB.USE(R0) ;IF THIS IS ZERO, WAS NEVER LOGGED ON ;OR PERMANENTLY CONNECTED BNE 22$ ;SO DON'T WRITE TO LOG FILE MOV #BYEME1,BYEDPB+Q.IOPL ;CHANGE START ADDR OF STRING MOV #BYELE1,BYEDPB+Q.IOPL+2 ;AND CHANGE LENGTH TOO DIR$ #BYEDPB ;WRITE BYE MESSAGE EXIT$S ;JUST EXIT 22$: MOV R0,-(SP) ;SAVE BUFFER POINTER MOV HB.USE(R0),R5 ;GET RECORD NUMBER IN USER PROFILE FILE MOV #FDB,R0 ;FDB ADDRESS MOV #USENAM,R1 ;DATA SET DESC ADDR -> R1 MOV #UICDSD,R2 ;UIC STRING DESCRIPTOR -> R2 JSR PC,.GTDIR ;FILL IN UIC STRING OPEN$R #FDB ;READ USER PROFILE FILE GET$R #FDB,#USEBUF,#100,R5 CLOSE$ #FDB ;CLOSE THE FILE MOV USEBUF,R1 ;FIRST PART OF USER NAME TO R1 MOV #BYEMES,R0 ;POINT TO ASCII BUFFER JSR PC,$C5TA ;CONVERT USER NAME MOV USEBUF+2,R1 ;2ND 3 LETTERS JSR PC,$C5TA MOV USEBUF+4,R1 ;LAST 3 JSR PC,$C5TA DIR$ #BYEDPB ;WRITE LOG OFF MESSAGE .PAGE .SBTTL COMPUTE AND REPORT LOGGED ON TIME MOV (SP),R0 ;RESTORE HELBYE BUFFER POINTER ADD #HB.LOG,R0 ;POINT AT LOG ON TIME BUFFER MOV #TIMBUF,R1 ;CURRENT TIME AT R1 MOV #DIFBUF,R2 ;DIFFERENCE AT R2 MOV #6,R3 ;DO 6 WORDS LOO1: MOV (R1)+,(R2) ;XFER CURRENT TIME SUB (R0)+,(R2)+ ;SUB LOGGED IN TIME SOB R3,LOO1 ;FOR YR,MO,DA,HR,MIN,SEC MOV #DIFBUF,R5 ;POINT AT DIFF AGAIN MOV G.TIYR(R5),R1 ;GET DIF IN YEARS (COULD BE AT NEW YEAR) BEQ 444$ ;NO MUL #12.,R1 ;CONVERT TO MONTHS ADD R1,G.TIMO(R5) ;AND ADJUST MONTHS 444$: TST G.TISC(R5) ;SECONDS OK ? BPL 1$ DEC G.TIMI(R5) ADD #60.,G.TISC(R5) 1$: TST G.TIMI(R5) BPL 2$ DEC G.TIHR(R5) ADD #60.,G.TIMI(R5) 2$: TST G.TIHR(R5) BPL 3$ DEC G.TIDA(R5) ADD #24.,G.TIHR(R5) 3$: TST G.TIDA(R5) BPL 4$ ;BORROW FROM MONTHS MORE COMPLICATED CAUSE ;MONTHS HAVE DIFFERENT DAYS DEC G.TIMO(R5) ;BORROW ONE MONTH MOV #TIMBUF,R0 ;POINT AT CURRENT TIME MOV G.TIMO(R0),R0 ;GET CURRENT MONTH DEC R0 ;GET NUMB OF PREV MONTH, (MONTH TABLE STARTS ;WITH DEC AT BYTE OFFSET 0) MOVB MONTAB(R0),R0 ;GET NUMBER OF DAYS IN PREV MONTH ADD R0,G.TIDA(R5) ;ADD TO DAYS 4$: MOV G.TIMO(R5),R1 ;GET TOTAL MONTHS MUL #31.,R1 ;FOR MULT MONTHS, JUST MAKE THEM 31 DAYS ADD R1,G.TIDA(R5) ;NOW HAVE DAYS, MONTHS, MINS, SECS MOV #TIMTIM,R0 ;POINT TO MESSAGE BUFFER MOV G.TIDA(R5),R1 ;MONTHS IN R1 CMP R1,#100. ;3 DIGITS BGE 551$ ;YES MOVB #' ,(R0)+ ;NO, MAKE NEAT CMP R1,#10. ;OR 2 BGE 551$ ;YES MOVB #' ,(R0)+ ;NO, MAKE NEAT 551$: CLR R2 ;SUP LEADING 0'S JSR PC,$CBDMG ;CONVERT DAYS MOV #3,R3 ;COUNT HRS,MINS,SEC MOV #DIFBUF+G.TIHR,R4 ;POINT AT CORRECT AREA OF TIME BUFFER 552$: MOV (R4)+,R1 ;GET HOUR, MIN OR SEC MOVB #':,(R0)+ ;BE NEAT CMP R1,#10. ;ONLY ONE DIGIT BGE 553$ MOVB #'0,(R0)+ ;IF SO, BE NEAT 553$: JSR PC,$CBDMG ;CONVERT SOB R3,552$ ;FOR 3 NUMBERS MOV #TIMCON,BYEDPB+Q.IOPL ;SET TO DO QIO MOV #TIMLEN,BYEDPB+Q.IOPL+2 DIR$ #BYEDPB .PAGE .SBTTL DO FINAL GOODBYE LINE MOVB TIMBUF+6,R0 ;GET TIME CMP R0,#18. ;PAST 18:00 ? BLT 111$ ;NO MOV #BYEMS1,BYEDPB+Q.IOPL ;CHANGE MESSAGE MOV #BYELN1,BYEDPB+Q.IOPL+2 BR 333$ 111$: CMP R0,#12. ;PAST NOON ? BLT 222$ MOV #BYEMS2,BYEDPB+Q.IOPL MOV #BYELN2,BYEDPB+Q.IOPL+2 BR 333$ 222$: MOV #BYEMS3,BYEDPB+Q.IOPL MOV #BYELN3,BYEDPB+Q.IOPL+2 333$: DIR$ #BYEDPB ;SAY GOODBYE .PAGE .SBTTL WRITE START STOP TIMES TO USER LOG FILE MOV #OUTBUF,R0 ;POINT AT BUFFER MOV (SP),R5 ;GET LOGGED ON TIME TST (R5) ;CHECK TO SEE IF SOME STRANGE BNE 6$ ;SEQUENCE JMP FINISH ;OF EVENTS TRIED TO LOG US OUT ;WITH ZEROED BUFFER, AND IF SO ;DON'T CLOBBER LOG FILE WITH BOGUS ;RECORD 6$: CLR TIMFLA ;SHOW WRITING TIME FIRST TIME WTTIM: MOV G.TIMO(R5),R1 ;GET MONTH CMP R1,#10. ;LESS THAN 10 BGE 123$ MOVB #'0,(R0)+ ;FILL IN DIGIT 123$: CLR R2 ;SHOW SUPRESS LEADING 0'S JSR PC,$CBDMG ;CONVERT MONTH MOVB #'/,(R0)+ ;OLD STYLE DATE MOV G.TIDA(R5),R1 ;GET DAY CMP R1,#10. BGE 124$ MOVB #'0,(R0)+ 124$: JSR PC,$CBDMG ;CONVERT DAY MOVB #'/,(R0)+ MOV G.TIYR(R5),R1 ;YEAR WILL BE 2 DIGITS FOR SOME TIME JSR PC,$CBDMG ;CONVERT YEAR MOVB #' ,(R0)+ MOV #3,R3 ADD #G.TIHR,R5 ;BUMP R5 TO YEAR WORD IN TIME BUFFER 125$: MOV (R5)+,R1 ;GET HOUR, MIN OR SEC CMP R1,#10. BGE 126$ MOVB #'0,(R0)+ 126$: JSR PC,$CBDMG ;CONVERT HOUR,MIN OR SEC MOVB #':,(R0)+ SOB R3,125$ ;DO 3 TIMES DEC R0 ;BACK UP OVER LAST ':' MOVB #' ,(R0)+ MOVB #' ,(R0)+ TST TIMFLA ;DID WE DO THIS TWICE ? BNE WTOVR ;IF SO, THEN OUTPUT CONNECT TIME INC TIMFLA ;IF NO, SHOW FLAG FOR NEXT TIME MOV #TIMBUF,R5 ;POINT AT LOGOUT TIME BUFFER JMP WTTIM ;AND WRITE SECOND TIME .PAGE .SBTTL WRITE CONNECT TIME TO USER LOG FILE WTOVR: MOV #TIMTIM,R1 ;POINT TO CONNECT TIME ASCII STRING MOV #12.,R3 127$: MOVB (R1)+,(R0)+ ;XFER CONNECT TIME SOB R3,127$ ;DO 12 CHARACTERS MOVB #40,(R0)+ ;PUT IN SPACE MOVB #'T,(R0)+ ;NOW A 'T' MOVB #'T,(R0)+ ;AND ANOTHER ONE MOV .CRTSK,R5 ;OUR ATL ADD -> R5 MOV A.TI(R5),R5 ;NOW OUR TI PUD -> R5 MOVB U.UN(R5),R3 ;UNIT # -> R3 CLR R2 ;SET UP FOR DIVIDE DIV #10,R2 ;QUOT. -> R2 ;REM. -> R3 ADD #60,R2 ;MAKE 1ST DIGIT ASCII ADD #60,R3 ;ALSO 2ND DIGIT MOVB R2,(R0)+ ;PUT AWAY 1ST DIGIT MOVB R3,(R0)+ ;AND SECOND DIGIT MOVB #40,(R0)+ ;AND TRAILING SEPARATOR SUB #OUTBUF,R0 ;SUB START OF BUFFER TO GET LENGTH MOV R0,-(SP) ;SAVE FOR NOW ;FILL IN FILE NAME IN NAME BLOCK MOV USEBUF,NAMBLK+N.FNAM MOV USEBUF+2,NAMBLK+N.FNAM+2 MOV USEBUF+4,NAMBLK+N.FNAM+4 MOV #FDB1,R0 ;R0 CONTAINS FDB MOV #NAMBLK,R1 ;R1 CONTAINS NAME BLOCK MOV #UICDSD,R2 ;R2 CONTAINS UIC STRING DESCRIPTOR JSR PC,.GTDIR ;FILL IN UIC IN NAME BLOCK OPEN$A #FDB1 ;APPEND TO LOG FILE MOV (SP)+,R5 ;RESTORE LINE LENGTH TO R5 PUT$ #FDB1,#OUTBUF,F.RSIZ(R0) ;WRITE THE LINE CLOSE$ #FDB1 ;CLOSE THE FILE ; ; FINALLY CLEAR BUFFER AREA AS FLAG WE'RE DONE FINISH: MOV (SP)+,R0 ;RESTORE BUFFER POINTER MOV #0,R1 MOV #10.,R2 ;CLEAR 10 WORDS LP: MOV R1,(R0)+ SOB R2,LP EXIT$S ;AND EXIT RTS PC ;IN CASE EXIT DIR FAILS ????? .END START