;
; Program: ERROR1
; Author: Richard Conn
; Version: 1.0
; Date: 5 Mar 84
;
version equ 10
;
; This error handler displays the error line to the user and
; provides him with four options as to how to process this line:
; 1. Replace the command in error with a new command
; 2. Skip the command in error and resume execution
; with the next command
; 3. Replace the command line as it now stands
; 4. Throw away the command line and resume user
; control
;
; This program is transportable from one ZCPR3 system to another
; provided it is reassembled with the correct address for the ZCPR3
; Environment Descriptor (Z3ENV) or DDT is used to patch this address
; (which is the first two bytes after the opening JMP). If an external
; ZCPR3 Environment Descriptor is not available, one will have to be
; provided by setting the Z3ENV equate to 0 and providing SYSENV.LIB in
; the current directory at assembly time.
;
;
; Equates for Key Values
;
z3env SET 0f400h ;address of ZCPR3 environment
cmtch equ ';' ;comment character
cr equ 0dh
lf equ 0ah
;
; External Z3LIB and SYSLIB Routines
;
ext z3init
ext print,pstr,codend,capine,bbline,crlf,moveb
ext erradr,puter1,puterc ;Error Handler Routines
ext qprint ;Quiet Mode Prints
ext getefcb,getcl1,qerror ;Z3 Messages et al
;
; 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 Environment
;
; Print Banner
;
call qprint
db 'ERROR1, Version '
db (version/10)+'0','.',(version mod 10)+'0'
db cr,lf,0
;
; Determine if Program Invoked as an Error Handler or By the User
;
call qerror ;error?
jz handler ;handle error
;
; Invoked by the User, so Install as an Error Handler
;
call getefcb ;pt to external FCB
jz start1 ;proceed if external FCB not available
;
; Make Name Invoked by User the Name of the Error Handler
;
inx h ;pt to first char
lxi d,ername ;pt to name of error handler message
mvi b,8 ;at most 8 bytes
call moveb ;copy into buffer
;
; Make Command Line in Buffer the Error Handler
;
start1:
lxi h,ername ;make name in buffer the error handler
call puterc ;set command
mvi a,0ffh ;set error code
call puter1 ;set message
call print
db ' Error Handler Installed',0
ret
;
; Handle Error
;
handler:
call erradr ;get address of error line
xchg ;HL pts to free area, DE pts to error line
call codend ;get ptr to free area
shld badcmd ;save ptr to bad command
;
; Extract Bad Command and Store It in Memory Starting at BADCMD
; DE pts to bad command, HL pts to location to store it at
;
savebad:
ldax d ;get next char
mov m,a ;put it
ora a ;done?
jz sbad1
cpi cmtch ;check for comment
jz sbad1
inx h ;pt to next
inx d
jmp savebad
;
; Set ending 0 in bad command buffer and check for continuation
;
sbad1:
mvi m,0 ;store ending zero
inx h ;pt to next
cpi cmtch ;more?
jnz sbad2
inx d ;pt to rest of command
sbad2:
shld restcmd ;save rest of command line
;
; Extract Rest of Command Line and Store It in Memory Starting at RESTCMD
;
saverest:
ldax d ;get next
mov m,a ;put it
inx h ;pt to next
inx d
ora a ;done?
jnz saverest
shld scratch ;save ptr to scratch area
;
; Prompt User for Action
;
prompt:
call print
db cr,lf,'Error Line is:',cr,lf,' ',0
call erradr ;get address of error line
call pstr
call print
db cr,lf,cr,lf,'Options are: '
db cr,lf,' 1. Replace Command in Error with a New Command'
db cr,lf,' Replace ',0
lhld badcmd
call pstr
call print
db cr,lf,' 2. Advance to Next Command and Resume Processing'
db cr,lf,' Advance to ',0
lhld restcmd
call pstr
call print
db cr,lf,' 3. Replace Entire Line with a New Line'
db cr,lf,' Replace ',0
call erradr ;pt to error line
call pstr
call print
db cr,lf,' 4. Throw Away Entire Line and Continue'
db cr,lf,' Throw Away ',0
call erradr ;pt to error line
call pstr
call print
db cr,lf,cr,lf,'Select Option - ',0
call capine
call crlf
cpi '1' ;option 1
jz replace ;replace command in error
cpi '2' ;option 2
jz advance ;advance to next command
cpi '3' ;option 3
jz newline ;enter new line
cpi '4' ;option 4
jz flush ;throw away line
call print
db cr,lf,'Invalid Option - Retry',cr,lf,0
jmp prompt
;
; Replace Command in Error
;
replace:
call print
db 'Replacement Command?',cr,lf,' ',0
lhld restcmd ;pt to rest of command line in DE
xchg
mvi a,0ffh ;capitalize
call bbline ;get line from user
call build ;build and run command
jmp prompt ;continue if error
;
; Advance to Rest of Command Line
;
advance:
lhld restcmd ;pt to it
xchg
lxi h,empty ;HL pts to empty command, DE pts to tail
call build ;build and run command
jmp prompt ;continue if error
;
; Enter New Line
;
newline:
call print
db 'New Command?',cr,lf,' ',0
mvi a,0ffh ;capitalize
call bbline ;get line from user
lxi d,empty ;HL pts to user command, DE pts to empty command
call build ;build and run command
jmp prompt ;continue if error
;
; Flush Commands
;
flush:
ret ;simply exit if no more commands
;
; Build New Command Line in SCRATCH Area and Run it by returning to ZCPR3
; On input, HL pts to header, DE pts to tail
;
build:
lxi b,1 ;set char count (1 for ending zero)
push d ;save ptr to tail
push h ;save ptr to header
lhld scratch ;pt to scratch area
pop d ;get ptr to header
ldax d ;get first char
ora a ;any there?
cnz copy ;copy line into buffer
pop d ;get ptr to tail
ldax d ;anything there?
ora a
jz bldt ;terminate build if not
mvi m,cmtch ;begin with semicolon
inx h ;pt to next
call copy
bldt:
mvi m,0 ;store ending zero
;
; Store Command Line into MCL Buffer
;
call getcl1 ;pt to command line
cmp c ;check for char count within range
rc
mov a,b ;check for line too long
ora a ;line too long?
rnz ;error if so
lxi d,4 ;pt to first char
push h ;save ptr to current
dad d
pop d ;get ptr to current
xchg ;DE pts to first char position, HL pts to CL buffer
mov m,e ;set address to resume processing
inx h
mov m,d
lhld scratch ;pt to new line
xchg ;in DE, while HL pts to first char position
call copy ;copy it
mov m,a ;store ending zero
pop d ;clear stack
ret ;resume processing
;
; Copy string pted to by DE into buffer pted to by HL
;
copy:
ldax d ;get next char
ora a ;done?
rz
mov m,a ;store it
inx b ;increment count
inx h ;pt to next
inx d
jmp copy
;
; Buffers
;
ername:
db 'ERROR1 ',0 ;name of error handler
empty:
db 0 ;empty command line
badcmd:
ds 2 ;ptr to bad command extracted
restcmd:
ds 2 ;ptr to tail of bad command line
scratch:
ds 2 ;ptr to scratch area used to build new lines