Files
RomWBW/Source/Images/hd0/s0/u15/SAK.MAC
2016-09-30 18:07:16 -07:00

245 lines
4.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; PROGRAM: SAK (Strike Any Key)
; AUTHOR: Richard Conn
; VERSION: 2.0
; DATE: 18 May 84
; PREVIOUS VERSIONS: 1.0 (18 Apr 83)
vers equ 20
z3env SET 0f400h
;
; SAK (Strike Any Key) is used for the following purposes:
; 1) to wait for user interaction before continuing
; and to allow the user to abort a Multiple
; Command Line
; 2) to command the user's attention by ringing the
; bell at his console
;
; The SAK command line is:
; SAK o...
; SAK is invoked with the following options:
; A -- DO NOT Allow the User to Abort MCL
; B -- Ring Bell
; Pnnnn -- Pause nnnn seconds and continue if no
; response by that time
;
ext z3init,wait1s,getcl1,qprint,qcrlf
ext strtzex,stopzex,putzex
ext pstr,print,condin,eval10,cout
tbuff equ 80h ;command line buffer
cr equ 0dh
lf equ 0ah
ctrlc equ 'C'-'@'
ctrlg equ 'G'-'@'
;
; Environment Definition
;
if z3env ne 0
;
; External ZCPR3 Environment Descriptor
;
jmp start
db 'Z3ENV' ;This is a ZCPR3 Utility
db 1 ;External Environment Descriptor
z3eadr:
dw z3env
start:
lhld z3eadr ;pt to ZCPR3 environment
;
else
;
; Internal ZCPR3 Environment Descriptor
;
MACLIB Z3BASE.LIB
MACLIB SYSENV.LIB
z3eadr:
jmp start
SYSENV
start:
lxi h,z3eadr ;pt to ZCPR3 environment
endif
;
; Start of Program -- Initialize ZCPR3 Environment
;
call z3init ;initialize the ZCPR3 Env and the VLIB Env
; Init Options and Parse and Interpret Command Line
;
xra a ;turn options off
sta mpflag ;turn off message printed flag
sta bell ;turn off bell
sta delay ;turn off delay (pause)
sta delay+1
mvi a,0ffh ;turn options on
sta abortf ;turn on abort
lxi h,tbuff+1 ;pt to command line
spskp:
mov a,m ;skip leading spaces
inx h
cpi ' '
jz spskp
dcx h ;pt to char
cpi '/' ;option?
jnz optdone
inx h ;skip option char
opt:
mov a,m ;get option letter
ora a ;done?
jz optdone
inx h ;pt to next
cpi ' ' ;process text
jz optdone
cpi 'A' ;abort?
jz optabort
cpi 'B' ;bell?
jz optbell
cpi 'P' ;pause?
jz optpause
call print
db 'SAK, Version '
db (vers/10)+'0','.',(vers mod 10)+'0'
db cr,lf,'Syntax:'
db cr,lf,' SAK /o... text -or- SAK text'
db cr,lf,'Options:'
db cr,lf,' A -- DO NOT Allow the User to Abort'
db cr,lf,' B -- Ring the Bell'
db cr,lf,' Pnnnn -- Pause nnnn seconds and then resume'
db 0
ret
;
; Process A option (Abort MCL)
;
optabort:
xra a ;turn off abort
sta abortf
jmp opt
;
; Process B option (Ring Bell)
;
optbell:
mvi a,0ffh ;turn on bell
sta bell
jmp opt
;
; Process Pnnnn option (Pause nnnn seconds)
;
optpause:
call eval10 ;convert argument to decimal value in DE
xchg ;HL contains value
shld delay
xchg ;HL pts to next char
jmp opt
;
; Continue Command Processing
;
optdone:
mov a,m ;any message?
ora a
jz optdn1
sta mpflag ;set message printed flag
call print ;new line
db ' --> ',0
call pstr ;print message
call print
db ' <-- ',0
optdn1:
call stopzex ;suspend ZEX processing
lhld delay ;get delay count in HL
;
; Main Delay Loop
;
sakloop:
;
; Ring Bell if Option Selected
;
lda bell ;get flag
ora a ;set zero flag
cnz bout ;ring bell and delay
;
; Get character if one is available
;
call condin ;optionally get character
jnz gotchar ;process character
;
; Loop if No Delay
;
mov a,h ;check for no delay
ora l
jz sakloop
;
; Delay and test for input
;
call wait1s ;delay 1 sec
dcx h ;count down
mov a,h ;done?
ora l
jnz sakloop
;
; Process Input Character
; If no input and timout instead, A=0 for continuation character
;
gotchar:
cpi ctrlc ;abort?
jz abort
resume:
lda mpflag ;message printed?
ora a ;0=no
cnz qcrlf ;new line if yes
call qprint
db 'Resuming ...',0
jmp strtzex ;resume ZEX processing
;
; Abort Multiple Command Line if there is one
;
abort:
lda abortf ;abort allowed?
ora a ;0=no
jz resume
call getcl1 ;get address of command line buffer
mov a,h ;any buffer?
ora l
jz abort1
mov e,m ;get address of next char
inx h
mov d,m
xchg ;HL pts to next char
mvi m,0 ;set no further command
abort1:
lda mpflag ;message printed?
ora a ;0=no
cnz qcrlf ;new line if yes
call qprint
db 'Aborting ...',0
jmp strtzex ;resume ZEX processing
;
; Ring Bell and Delay Briefly
;
bout:
mvi a,ctrlg ;ring bell
call cout
push h ;save HL
lhld delay ;do not delay if pause already invoked
mov a,h ;zero delay?
ora l
jnz bout1 ;skip delay
call wait1s ;delay
bout1:
pop h
ret
;
; Other Buffers
;
abortf:
ds 1 ;abort flag
bell:
ds 1 ;bell flag
delay:
ds 2 ;delay constant
mpflag:
ds 1 ;message printed flag
end