home *** CD-ROM | disk | FTP | other *** search
- ; 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