.TITLE POWERD -- POWER DAEMON .IDENT /V01.00/ ;+ ; Copyright (c) 2019 Oleg Safiullin ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;- ;+ ;LUN DEFINITIONS ;- LUN.TI =: 1 ;LUN FOR TI: LUN.CO =: 2 ;LUN FOR CO: ;+ ;EFN DEFINITIONS ;- EFN.TI =: 1 ;EFN FOR TI: I/O EFN.PR =: 2 ;EFN FOR POWER RECOVERY ;+ ;LOCAL DEFINITIONS ;- DELAY =: 5 ;NTPD RUN DELAY RETRY =: 10. ;RUN RETRY COUNT .MCALL ASTX$S,CLEF$C,DIR$,EXIT$S,GLUN$ ;SYSTEM MACROS .MCALL QIOW$,RUN$,SETF$C,STSE$C,SPRA$ ; .MCALL SREA$,WSIG$S ; $START:: DIR$ #GLUN ;GET CO: CHARACTERISTICS MOV BUFF+G.LUNA,R0 ;SAVE DEVICE NAME MOV BUFF+G.LUNU,R1 ;SAVE UNIT NUMBER MOV #LUN.TI,GLUN+G.LULU ;TI: LUN DIR$ #GLUN ;GET TI: CHARACTERISTICS CMP BUFF+G.LUNA,R0 ;DEVICE NAMES MATCH? BNE 10$ ;BRANCH IF NOT CMP BUFF+G.LUNU,R1 ;DEVICE UNITS MATCH? BEQ 20$ ;BRANCH IF SO 10$: CMP #"CO,BUFF+G.LUNA ;RUNNING ON CO:? BEQ 10$ ;BRANCH IF SO EXIT$S ;EXIT 20$: MOV #MSTRT,R3 ;DAEMON STARTED MESSAGE CALL $PRINT ;PRINT IT DIR$ #SREA ;SET REQUESTED ABORT AST DIR$ #SPRA ;SET POWER RECOVERY AST $WFPUP:: CLEF$C EFN.PR ;CLEAR POWER RECOVERY EFN STSE$C EFN.PR ;STOP FOR POWER RECOVERY MOV #MPWUP,R3 ;AC POWER RESTORED MESSAGE CALL $PRINT ;PRINT IT MOV #RETRY,R2 ;RETRY COUNT 10$: DIR$ #RUN ;SCHEDULE NTPD TO SYNC TIME BCC $WFPUP ;BRANCH IF OK CMP #IE.INS,$DSW ;TASK NOT INSTALLED? BEQ $WFPUP ;BRANCH IF SO CMP #IE.UPN,$DSW ;INSUFFICIENT DYNAMIC STORAGE? BEQ 30$ ;BRANCH IF SO 20$: MOV #MNTPD,R3 ;UNABLE TO SCHEDULE MESSAGE CALL $PRINT ;PRINT IT BR $WFPUP ;LOOP 30$: DEC R2 ;MORE TRIES? BEQ 20$ ;BRANCH IF NOT WSIG$S ;WAIT FOR SIGNIFICANT EVENT BR 10$ ;TRY AGAIN $ABORT:: MOV #MABRT,R3 ;TASK ABORTED MESSAGE CALL $PRINT ;PRINT IT EXIT$S ;EXIT $PWRUP:: SETF$C EFN.PR ;SET POWER RECOVERY FLAG ASTX$S ;EXIT FROM AST $PRINT:: MOV #BUFF,R0 ;POINT TO I/O BUFFER MOV #MPRFX,R1 ;POINT TO PREFIX STRING CALL $MOVEZ ;MOVE TO BUFFER MOV R3,R1 ;POINT TO MESSAGE STRING CALL $MOVEZ ;MOVE TO BUFFER SUB #BUFF,R0 ;CALCULATE STRING LENGTH MOV R0,QIOW+Q.IOPL+2 ;UPDATE QIOW DPB DIR$ #QIOW ;PRINT STRING RETURN ;RETURN $MOVEZ:: MOVB (R1)+,(R0)+ ;MOVE A BYTE BNE $MOVEZ ;LOOP IF MORE TO DO DEC R0 ;POINT TO TRAILING NULL RETURN ;RETURN BUFF: .BLKW 40.-<3+2+2> ;I/O BUFFER GLUN: GLUN$ LUN.CO,BUFF ;GLUN DPB/BUFFER SPRA: SPRA$ $PWRUP ;SPRA DPB/BUFFER SREA: SREA$ $ABORT ;SREA DPB/BUFFER QIOW: QIOW$ IO.WVB,LUN.TI,EFN.TI,,,, ;QIOW DPB RUN: RUN$ NTPD,,,,,DELAY,2 ;RUN DPB MPRFX: .ASCIZ /POWERD -- / MSTRT: .ASCIZ /Power daemon started/ MABRT: .ASCIZ /Task aborted via directive or CLI/ MPWUP: .ASCIZ /AC power restored/ MNTPD: .ASCIZ /Unable to schedule NTPD to sync time/ .END $START