.TITLE LOG .MCALL TINIT,PSTR,TTYOUT,PCRLF .MCALL QIO$,ALUN$,OPEN$A,CLOSE$ .MCALL FSRSZ$,FINIT$ .MCALL GMCR$,PUT$,NMBLK$ .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,FDBF$A .MCALL GTIM$S,EXIT$S .MCALL QIOW$,RECALL ;+ ; PROGRAM TO ALLOW THE USER TO ENTER A LINE INTO A LOG ; FILE WITH THE TIME AND DATE. INVKED BY: ; ; LOG AND THEN THE STRING ; ; USES GMCR$ TO GET THE LINE. USES PUT$ TO WRITE ; TO THE FILE ; ; ; UPDATED SO THAT MORE THAN ONE LINE CAN BE ENTERED ; AT ONE SITTING OF THE LOG ENTRY. ; ; THIS IS MORE OF A PRACTICE FOR MY CO-ROUTINE ; WRITING THAN ANYTHING ELSE. SO OBVIOUSLY, I USE ; CO-ROUTINES. W.K. ; LG.LEN=20. ;THE LENGTH OF THE TIME/DATE STRING ;MUST CORRESPOND TO THE LENGTH OF ;THE STRING AS SET BY LG.COD ;(IE. 12.,15.,18. OR 20.) ; LG.COD=4 ;THE TIME CODE: ; 0 OR 1 => HH ; 2 => HH:MM ; 3 => HH:MM:SS ; >3 => HH:MM:SS.S ; ; WITH LG.LEN AND LG.COD IT IS POSSIBLE TO RE-SPECIFY ; THE ACCURACY OF THE TIME PRINTED ON THE OUTPUT ; TERMINAL AND INTO THE FILE. ; DELIM=100 ;THE '@' SIGNIFIES CONTINUATION TAB=11 ;A TAB CR=15 LF=12 ;- G.DISP=G.MCRB+G.LOG ;A DISPLACEMENT INTO THE GCMR$ G.LOG=3 ;SO THAT "LOG" ARE IGNORED. ; ; START: TINIT TILUN,TIEVF FINIT$ ; ; WE'RE HERE, SO LET'S OUTPUT THE DATE AND TIME. ; GTIM$S #TIME ;FILL INFO BUF MOV #GMCR+G.DISP,R0 ;USE GMCR BUF AS OUT LINE MOV R0,R3 ;REMEMBER IT MOVB #LF,(R0)+ ;SPACE FILE ENTERIES MOV #TIME,R1 ;START WITH DATE CALL $DAT ;AND CONVERT MOVB #40,(R0)+ ;SPACE THINGS MOV #LG.COD,R2 ;THE CODE CALL $TIM ;CONVERT TIME MOVB #CR,(R0)+ ;SET UP FOR POS PROMPT ; ; NOW OUTPUT TIME AND DATE ; SUB R3,R0 ;GET LENGTH MOV R0,R2 ;KEEP IT SAFE FROM FCS TTYOUT R3,R2 ;PRINT ON TERMIAL ; ; OPEN THE FILE. IT REMAINS OPEN TILL THE BITTER END, ; SO HOPE THE END AIN'T TO BITTER. ; OPEN$A #FDB,,,,,,IOERR ; ; NOW OUT TO THE FILE ; PUT$ ,R3,R2,IOERR ; ; FROM HERE ON IN, FDB HAS NEXT RECORD LOCATION SET UP ; OKAY. WE'LL KEEP IT IN R3 AS WELL. AND WE'LL KEEP ; R0 AT THE FDB ; ; NOW WE BEGIN WITH ALL THAT NEAT CO-ROUTINE STUFF ; MOV #NEWLIN,-(SP) ;ONE ADDR ON THE STACK DIR$ #GMCR ;GET LINE MOV $DSW,R4 ;GET LENGTH SUB #G.LOG+1,R4 ;LESS "LOG" BLE NXLIN ; ; HERE THE FIRST CO-R IS JOE SO WE HAVE ; #NEWLIN ON THE STACK ; JOE: CMPB #DELIM,GMCR+G.DISP(R4) BEQ 1$ ;DELIM SO MORE LINES CALL OUTLIN ;OUTPUT LINE TST (SP)+ ;FLUSH CO-R BR DIE 1$: DEC R4 ;REMOVE DELIM CALL OUTLIN ;OUTPUT LINE RECALL BR JOE ;DO IT AGAIN ; ; HERE NEWLIN IS THE FIRST CO-R, SO ; PUT #JOE ON THE STACK. ; NXLIN: MOV #JOE,@SP NEWLIN: DIR$ #PROMPT ;ISSUE A PROMPT DIR$ #READIT ;READ IN MOV IOSB+2,R4 RECALL BR NEWLIN ; ; DIE:: CLOSE$ EXIT$S ; ERRPFX::PSTR ^*/LOG - /* RETURN ; ; THE OUTPUT ROUTINE ; OUTLIN: MOVB #TAB,@R3 INC R4 PUT$ ,,R4,IOERR RETURN ; ; PROMPT: QIOW$ IO.WVB,TILUN,TIEVF,,,, ; READIT: QIOW$ IO.RVB,TILUN,TIEVF,,IOSB,, ; BUFLEN=80. ;A REASONABLE SIZE ; IOSB: .BLKW 2 TIEVF=23 TILUN=2 ; PROM: .ASCII /LOG>/ LPR=.-PROM .EVEN ; FSRSZ$ 1 ; ; THE FDB OF THE OUTPUT (LOG) FILE. ; FDB: FDBDF$ FDAT$A R.VAR,FD.CR FDRC$A ,OUTBUF,94. FDOP$A 1,,NMBLK FDBF$A 12 ;THE EVF ; NMBLK: NMBLK$ LOG,DOC,,SY,0 ; THE FILE ; ; THE RECORD TO BE PUT OUT. ; NOTE THAT THE GMCR$ MUST OCCUR BEFORE ; THE TIME/DATE CONVERSIONS, AS THE CONVERSIONS ; ARE PUT OVER TOP OF THE MACRO. ; TIME: .BLKW 8. ;THE GET-TIME BUFFER ; ; THE OUTPUT LINE ; OUTBUF: .BYTE 12 ;THE PRECEDING LINE-FEED .BLKB LG.LEN-5 ;THE BUFFER SIZE LESS THE ;5 BYTES OF GMCR$ THAT ARE ;OVER-WRITTEN: THE DPB (2) ;AND "LOG" (3). .EVEN ;ALLIGNMENT (A NULL) ; GMCR: GMCR$ ; .BLKW 4 ;APADDING FOR LONG LINES ; .END START