home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Program: ERROR2
- ; 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
- ;
- ; Unlike ERROR1, ERROR2 is screen-oriented, using the Z3TCAP
- ; for support.
- ;
- ; 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 z3vinit
- ext print,pstr,codend,capine,bbline,crlf,moveb
- ext erradr,puter1,puterc ;Error Handler Routines
- ext qprint ;Quiet Mode Prints
- ext getenv,getefcb,getcl1,qerror ;Z3 Messages et al
- ext at,cls,stndout,stndend,gotoxy,vprint,gxymsg ;VLIB Routines
-
- ;
- ; 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 z3vinit ;initialize the ZCPR3 Environment
- ;
- ; Print Banner
- ;
- call qprint
- db 'ERROR2, 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 getenv ;must have a Z3TCAP entry
- lxi d,80h ;pt to Z3TCAP
- dad d
- mov a,m ;must not be space or less
- cpi ' '+1
- jnc start0
- call print
- db cr,lf,' No Z3TCAP - Aborting',0
- ret
- ;
- ; Determine Name of Routine
- ;
- start0:
- 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 cls ;clear screen
- call gxymsg
- db 3,22
- db '>>>> ',1,'VIDEO ERROR HANDLER',2,' <<<<',0
- call gxymsg
- db 5,28
- db '-- Error Line --',0
- call at
- db 6,10
- call stndout ;reverse video
- call erradr ;get address of error line
- call pstr
- call stndend ;normal video
- mvi h,10 ;position cursor
- mvi l,15
- shld infoxy
- call gxymsg
- db 8,30
- db '-- Options --',0
- call atinfo
- call vprint
- db '1. Replace Command in Error with a New Command',0
- call atinfo
- call vprint
- db ' Replace ',1,0
- lhld badcmd
- call pstr
- call atinfo
- call atinfo
- call vprint
- db 2,'2. Advance to Next Command and Resume Processing',0
- call atinfo
- call vprint
- db ' Advance to ',1,0
- lhld restcmd
- call pstr
- call atinfo
- call atinfo
- call vprint
- db 2,'3. Replace Entire Line with a New Line',0
- call atinfo
- call vprint
- db ' Replace ',1,0
- call erradr ;pt to error line
- call pstr
- call atinfo
- call atinfo
- call vprint
- db 2,'4. Throw Away Entire Line and Continue',0
- call atinfo
- call vprint
- db ' Throw Away ',1,0
- call erradr ;pt to error line
- call pstr
- call stndend
- userin:
- call gxymsg
- db 22,20
- db 'Select Option - ',0
- call capine
- 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 8,' Invalid Option - Retry',0 ;backspace over error
- jmp userin
- ;
- ; Position at INFOXY and advance ptr to next line
- ;
- atinfo:
- lhld infoxy ;pt to next position
- call gotoxy ;go there
- inr h ;next line
- shld infoxy
- ret
- ;
- ; 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 'ERROR2 ',0 ;name of error handler
- empty:
- db 0 ;empty command line
- infoxy:
- ds 2 ;xy-coordinate for display
- 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