.TITLE NSPOOL .IDENT /110380/ ; ; TSTAMP DEFINED CAUSES CO: TIME-STAMP CODE TO BE ENABLED ; (DOES A "TIME" COMMAND ON CO: EVERY MIDNIGHT), SO UN-COMMENT ; THE DEFINITION LINE IF YOU WANT THE CO: TIME-STAMP. ; ; TSTAMP = 0 ; .MCALL RCST$S,USTP$S,DIR$,STSE$S .IF DF TSTAMP .MCALL MRKT$,ASTX$S,GTIM$S NSPBGN: JSR PC,NEWDAY ;SET UP NEW DAY PRINTOUT .IFF NSPBGN: .ENDC NSP: RCST$S ,#IBUF ;RECEIVE DATA OR STOP BCS NSP ;ON ERROR, TRY AGAIN CMP $DSW,#2 ;DID WE STOP? BEQ NSP ;YES, SO TRY RECEIVING AGAIN CMP COMAND,#"/S ;IS IT A SPOOL? BEQ 2$ ;YES, DO IT CMP COMAND,#"/U ;IS IT AN UNSPOOL? BNE NSP ;NO, TRY FOR ANOTHER RECEIVE MOV #CMDLN1,CMDADR ;SET UP FOR COMMAND 1 MOV #13.,CMDLEN ; 1$: DIR$ #SPAWN ;SPAWN COMMAND TO MCR BCS 1$ ;ON ERROR, TRY AGAIN STSE$S #1 ;STOP FOR EVENT FLAG (WAIT FOR COMPLETION) USTP$S #IBUF ;UNSTOP TASK THAT SENT US THE MESSAGE BR NSP ;GO BACK AND TRY FOR MORE 2$: MOV #CMDLN2,CMDADR ;SET UP FOR COMMAND 2 MOV #27.,CMDLEN ; 3$: DIR$ #SPAWN ;SPAWN COMMAND TO MCR BCS 3$ ;ON ERROR, TRY AGAIN STSE$S #1 ;STOP FOR EVENT FLAG (WAIT FOR COMPLETION) MOV #CMDLN3,CMDADR ;SET UP FOR COMMAND 3 MOV #17.,CMDLEN ; BR 1$ ;GO TO SPAWN, WAIT, AND UNSTOP ; .IF DF TSTAMP NEWDAY: MOV #DATCMD,CMDADR ;SET UP DATE/TIME COMMAND MOV #4,CMDLEN ;SET UP LENGTH 1$: DIR$ #SPAWN ;SPAWN THE COMMAND BCS 1$ ;IF IT FAILS, TRY IT AGAIN GTIM$S #TIMBUF ;GET THE TIME MOV #60.,MRKTMG ;SET WAIT UNTIL NEXT SECOND SUB TIMBUF+14,MRKTMG ; MOV #TICK,MRKTUN ;UNIT=TICK DIR$ #MRKTIM ;MARK TIME UNTIL NEXT SECOND STSE$S #2 ;WAIT UNTIL IT'S OVER MOV #59.,MRKTMG ;SET WAIT UNTIL NEXT MINUTE SUB TIMBUF+12,MRKTMG ; BEQ 2$ ;IF ALREADY AT LAST SECOND, SKIP WAIT MOV #SECOND,MRKTUN ;UNIT=SECOND MOV #ASTSUB,MRKTAE ;SET AST ADDRESS MOV #3,MRKTEF ;SET EFN 3 TO INDICATE MINUTE WAIT DIR$ #MRKTIM ;MARK TIME UNTIL NEXT MINUTE RTS PC ;RETURN WITHOUT WAITING 2$: CLR EFNO ;SIGNAL NO AST BR FAKEIT ;FAKE AN AST ; ASTSUB: MOV (SP)+,EFNO ;POP OFF EFN MOV R0,-(SP) ;SAVE R0 FAKEIT: CMP EFNO,#4 ;WHICH WAIT? BEQ 10$ ;BRANCH IF WAIT FOR HOUR BHI 20$ ;BRANCH IF WAIT FOR MIDNIGHT MOV #59.,MRKTMG ;WAIT FOR MINUTE DONE; SET UP FOR HOUR WAIT SUB TIMBUF+10,MRKTMG ; BEQ 10$ ;IF NO WAIT NECESSARY, SKIP MOV #MINUTE,MRKTUN ;UNIT=MINUTE MOV #4,MRKTEF ;SET EFN=4 DIR$ #MRKTIM ;MARK TIME UNTIL NEXT HOUR BR 30$ ;AND DO AST EXIT 10$: MOV #23.,MRKTMG ;WAIT FOR HOUR DONE; NOW WAIT FOR MIDNIGHT SUB TIMBUF+6,MRKTMG ; BEQ 20$ ;IF NO WAIT NECESSARY, SKIP MOV #HOUR,MRKTUN ;UNIT=HOUR MOV #5,MRKTEF ;SET EFN=5 DIR$ #MRKTIM ;MARK TIME UNTIL MIDNIGHT BR 30$ ;AND DO AST EXIT 20$: MOV #24.,MRKTMG ;MARK TIME FOR ANOTHER 24 HOURS MOV #HOUR,MRKTUN ;UNIT=HOUR MOV #5,MRKTEF ;SET EFN=5 DIR$ #MRKTIM ;DO IT ALL DAY MOV #DATCMD,CMDADR ;SET UP DATE/TIME COMMAND MOV #4,CMDLEN ;SET UP LENGTH DIR$ #SPAWN ;SPAWN THE COMMAND 30$: TST EFNO ;GOT HERE VIA AST? BNE 40$ ;IF SO, DO AST EXIT RTS PC ;OTHERWISE, JUST RETURN 40$: MOV (SP)+,R0 ;RESTORE R0 ASTX$S ;DO AST EXIT TRAP 0 ;IF THAT FAILS, ABORT US ; EFNO: .BLKW 1 TIMBUF: .BLKW 8. MRKTIM: MRKT$ 2,0,0,0 ;MARK TIME DPB MRKTEF = MRKTIM+M.KTEF MRKTMG = MRKTIM+M.KTMG MRKTUN = MRKTIM+M.KTUN MRKTAE = MRKTIM+M.KTAE TICK = 1 SECOND = 2 MINUTE = 3 HOUR = 4 .ENDC ; SPAWN: .BYTE 11.,13. ;SPAWN DPB .RAD50 /MCR.../ ;SPAWN TO MCR... .BLKW 3 ; .BYTE 57,1 ;RUN UNDER [1,57] .WORD 1,0,0 ;EFN 1 CMDADR: .BLKW 1 ;SPACE FOR COMMAND ADDRESS CMDLEN: .BLKW 1 ;SPACE FOR COMMAND LENGTH .WORD 0,0 ; ; IBUF: .BLKW 4 ;RECEIVE BUFFER: TASK AND COMMAND NAME COMAND: .BLKW 11. ;RECEIVE BUFFER: /S OR /U COMMAND CMDLN1: .ASCII 'QUE LP: /UNSP' ;UNSPOOL COMMAND CMDLN2: .ASCII 'QUE LP: /SP /FLAG:1 /FORM:0' ;FIRST SPOOL COMMAND CMDLN3: .ASCII 'QUE LP: /AS:PRINT' ;SECOND SPOOL COMMAND .IF DF TSTAMP DATCMD: .ASCII 'TIME' ;DATE/TIME COMMAND .ENDC .END NSPBGN ;