mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:13:13 -06:00
309 lines
7.1 KiB
Plaintext
309 lines
7.1 KiB
Plaintext
;
|
||
; 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
|
||
|
||
end
|
||
|