home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
zcpr2
/
sak.mqc
/
SAK.MAC
Wrap
Text File
|
1985-02-09
|
8KB
|
369 lines
; 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