home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ZSYS
/
SIMTEL20
/
ZCPR3
/
SAK.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
5KB
|
245 lines
; 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