OBJNAM WAIT.SBR ; Last modified 30-Dec-85
; Subroutine to WAIT for specified number of seconds (can use fractions)
; by Irv Bromberg, Medic/OS Consultants, Toronto, CANADA
RADIX 10
VEDIT=11
VMINOR=1
VMAJOR=5
VSUB=0
IF EQ,1
Calling syntax: XCALL WAIT {,Delay}
where Delay is a floating point or string parameter containing a decimal
delay value in seconds (fractional parts may be used). This version of
WAIT.SBR waits for OIP to finish before starting the delay. If Delay=0
or no parameters are passed subroutine simply returns after waiting for
OIP to clear. If the operator hits ^C the sleeping is aborted at the end
of the current 100th of a second.
Advantages over Alpha Micro's SLEEP.SBR:
Control-C can abort the sleep period. Waits for output-in-progress to
the user's terminal to finish before starting the sleep. Does the OIP
wait even if no parameters are passed or the delay=0, can be used to
make sure output has flushed before continuing (for example if next step
will modify user's terminal status word). Changes JOBPRG(JCB) to [WAIT]
when the system is in "test" mode (using SET TEST command) while
waiting, so SYSTAT or STAT can display what the job is doing (restores
JOBPRG after delay complete).
; SY$TST=256 ; remove semi-colon before this equate if assembling on
; system with AMOS/L version prior to 1.3
SCALE=128 ; offset to SCALE factor in BASIC Impure Workspace
PHDR -1,0,PH$REE!PH$REU
MOV JOBCUR,JCB ; index user's Job Control Block
MOV JOBTRM(JCB),TCB ; index user's Terminal Control Block
PUSH JOBPRG(JCB) ; save current JOBPRG
MOV SYSTEM,D7 ; is system in "test" mode?
AND #SY$TST,D7 ; if so then change JOBPRG=[WAIT]
BEQ WaitOIP ; note this has no effect under AMOS/L
MOV #<[WAI]_16+[T ]>,JOBPRG(JCB) ; versions prior to 1.3 unless
; the user has a program to set SY$TST
WaitOIP:TSTB T.STS(TCB) ; wait for OIP to clear before delay
BPL GetVal
SLEEP #500 ; 50ms wait each time around loop
BR WaitOIP
GetVal: TSTW @ArgBas ; wait only for OIP to clear if no
BEQ Done ; parameter is passed
TST 8(ArgBas) ; check parameter size
BEQ Done ; NULL parameter, wait only for OIP
CMPW 2(ArgBas),#4 ; is it floating parameter?
BNE Done ; no, wait only for OIP
GetFlt: SUB #6,SP ; get some workspace
MOV SP,Worksp
MOV 4(ArgBas),Source ; get desired seconds to sleep
MOVB (Source)+,(Worksp)+
MOVB (Source)+,(Worksp)+
MOVB (Source)+,(Worksp)+
MOVB (Source)+,(Worksp)+
MOVB (Source)+,(Worksp)+
MOVB (Source)+,(Worksp)+
MOV SP,Worksp ; restore pointer
MOV Scale(Impure),D7 ; scale factor in use?
NEG D7 ; if so we have to unscale the value
ADD #2,D7 ; but multiply to 100ths of second
BEQ 10$ ; could be zero if SCALE 2 if effect
FPWR @Worksp,D7
10$: FFTOL @Worksp,Ticks ; convert to longword
ADD #6,SP ; return the workspace
TST Ticks
BEQ Done ; quit if 0 delay requested
Loop: SLEEP #96 ; sleep 1/100s (-4 for overhead)
TSTB JOBSTS(JCB) ; ^C pending?
BMI Done ; yes, abort
DEC Ticks ; countdown
BNE Loop ; more if not zero yet