mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
245 lines
4.8 KiB
Plaintext
245 lines
4.8 KiB
Plaintext
; 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
|
||
|