; PROGRAM: SAK (Strike Any Key) ; AUTHOR: Richard Conn ; VERSION: 1.0 ; DATE: 18 April 1983 ; PREVIOUS VERSIONS: None vers equ 10 ; ; 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 print, condin, eval10, pause, cline, cout, phldc tbuff equ 80h ;command line buffer cr equ 0dh lf equ 0ah ctrlc equ 'C'-'@' ctrlg equ 'G'-'@' ; ; This program is Copyright (c) 1983 by Richard Conn ; All Rights Reserved ; ; ZCPR2 and its utilities, including this one, are released ; to the public domain. Anyone who wishes to USE them may do so with ; no strings attached. The author assumes no responsibility or ; liability for the use of ZCPR2 and its utilities. ; ; The author, Richard Conn, has sole rights to this program. ; ZCPR2 and its utilities may not be sold without the express, ; written permission of the author. ; ; ; Branch to Start of Program ; jmp start ; ;****************************************************************** ; ; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format ; ; This data block precisely defines the data format for ; initial features of a ZCPR2 system which are required for proper ; initialization of the ZCPR2-Specific Routines in SYSLIB. ; ; ; EXTERNAL PATH DATA ; EPAVAIL: DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES) EPADR: DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE ; ; INTERNAL PATH DATA ; INTPATH: DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT ; DISK = 1 FOR A, '$' FOR CURRENT ; USER = NUMBER, '$' FOR CURRENT DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT DB 0 ; END OF PATH ; ; MULTIPLE COMMAND LINE BUFFER DATA ; MCAVAIL: DB 0FFH ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE? MCADR: DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE ; ; DISK/USER LIMITS ; MDISK: DB 4 ; MAXIMUM NUMBER OF DISKS MUSER: DB 31 ; MAXIMUM USER NUMBER ; ; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK ; DOK: DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES) UOK: DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES) ; ; PRIVILEGED USER DATA ; PUSER: DB 10 ; BEGINNING OF PRIVILEGED USER AREAS PPASS: DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL ; ; CURRENT USER/DISK INDICATOR ; CINDIC: DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS) ; ; DMA ADDRESS FOR DISK TRANSFERS ; DMADR: DW 80H ; TBUFF AREA ; ; NAMED DIRECTORY INFORMATION ; NDRADR: DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY NDNAMES: DB 64 ; MAX NUMBER OF DIRECTORY NAMES DNFILE: DB 'NAMES ' ; NAME OF DISK NAME FILE DB 'DIR' ; TYPE OF DISK NAME FILE ; ; REQUIREMENTS FLAGS ; EPREQD: DB 000H ; EXTERNAL PATH? MCREQD: DB 0FFH ; MULTIPLE COMMAND LINE? MXREQD: DB 000H ; MAX USER/DISK? UDREQD: DB 000H ; ALLOW USER/DISK CHANGE? PUREQD: DB 000H ; PRIVILEGED USER? CDREQD: DB 000H ; CURRENT INDIC AND DMA? NDREQD: DB 000H ; NAMED DIRECTORIES? Z2CLASS: DB 6 ; CLASS 6 (for Processor Speed) DB 'ZCPR2' DS 10 ; RESERVED ; ; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA ; ;****************************************************************** ; ; ; ZCPR2 Class 6 Constants ; pspeed: db 4 ;Processor Speed in MHz crtpage: db 24 ;CRT page Size ; ; Other Buffers ; abortf: ds 1 ;abort flag bell: ds 1 ;bell flag delay: ds 2 ;delay constant ; ; Start of Program ; start: ; ; Print Banner ; call print db 'SAK, Version ' db (vers/10)+'0','.',(vers mod 10)+'0',0 ; ; Init Options and Parse and Interpret Command Line ; xra a ;turn options off 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 ;save command line call cline opt: mov a,m ;get option letter inx h ;pt to next ora a ;done? jz optdone cpi ' ' ;skip spaces jz opt cpi 'A' ;abort? jz optabort cpi 'B' ;bell? jz optbell cpi 'P' ;pause? jz optpause call print db cr,lf,'SAK is invoked by a command line of the following form:' db cr,lf,' SAK o...' db cr,lf,'where "o..." is zero or more options combined in any ' db 'order.' db cr,lf,'The options are:' db cr,lf,' A -- DO NOT Allow the User to Abort and Clear the ' db 'MCL Buffer' db cr,lf,' B -- Ring the Bell' db cr,lf,' Pnnnn -- Pause nnnn seconds and then resume ' db 'automatically' db cr,lf,'SAK allows the user to strike ^C to abort and clear the' db cr,lf,'multiple command line buffer (if there is one) or any' db cr,lf,'other key to continue execution' db cr,lf,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 call print db cr,lf,'Pause Selected: ',0 call phldc ;print in decimal call print db ' Second Delay before Resuming',0 xchg ;HL pts to next char jmp opt ; ; Continue Command Processing ; optdone: lhld delay ;get delay count in HL lda abortf ;abort allowed? ora a ;0=no jz noabort call print db cr,lf,'Please Strike ^C to Abort, Any Other Key to ' db 'Continue - ',0 jmp sakloop noabort: call print db cr,lf,'Please Strike Any Key to Continue - ',0 ; ; 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 ; push h ;save second counter lxi h,10 ;1 full second delay lda pspeed ;get processor speed mov b,a ;... in B call pause ;delay 1 sec pop h ;get second counter 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: call print db cr,lf,'Resuming ...',0 ret ; ; Abort Multiple Command Line if there is one ; abort: lda abortf ;abort allowed? ora a ;0=no jz resume lda mcavail ;multiple command line available? ora a ;0=no jz abort1 lhld mcadr ;get address of buffer lxi d,4 ;add 4 xchg dad d ;HL=MC+4, DE=MC mvi m,0 ;set no further command xchg ;HL=MC, DE=MC+4 (next command char ptr) mov m,e ;store ptr to next command inx h mov m,d abort1: call print db cr,lf,'Aborting ...',0 ret ; ; 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 lxi h,4 ;0.4 sec delay lda pspeed ;get processor speed mov b,a ;... in B call pause ;delay bout1: pop h ret end