mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
4.8 KiB
245 lines
4.8 KiB
; 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
|
|
|