mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1753 lines
31 KiB
1753 lines
31 KiB
;
|
|
; Program: SHOW
|
|
; Author: Richard Conn
|
|
; Version: 1.0
|
|
; Date: 5 Mar 84
|
|
;
|
|
version equ 10
|
|
z3env SET 0f400h
|
|
|
|
;
|
|
; The purpose of SHOW is to display various details about the ZCPR3
|
|
; System to the ZCPR3 user. Details on the ZCPR3 Environment Descriptor,
|
|
; what facilities are available, and what the status of these facilities
|
|
; is are included.
|
|
;
|
|
|
|
;
|
|
; Basic Equates
|
|
;
|
|
fcb equ 5ch
|
|
cr equ 0dh
|
|
lf equ 0ah
|
|
ctrlc equ 'C'-'@'
|
|
ctrlr equ 'R'-'@'
|
|
|
|
;
|
|
; External References
|
|
;
|
|
ext envptr
|
|
ext tinit,dinit ;from VLIB
|
|
ext z3vinit,cls,gotoxy,gxymsg,vprint,at ;from VLIB
|
|
ext getiop
|
|
ext retud,pfn1
|
|
ext getpath,dutdir,bbline,eval16
|
|
ext capine,cout,crlf,print,pstr,getmsg,padc,pafdc,phl4hc,pa2hc
|
|
ext shempty,shfull,getsh
|
|
ext geter1,geterc,puter1,puterc
|
|
ext getfcp,getrcp,getefcb
|
|
ext getndr
|
|
ext strtzex,stopzex
|
|
|
|
;
|
|
; 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 Env and the VLIB Env
|
|
shld dumpstrt ;set beginning address of memory dump
|
|
lda fcb+1 ;check for E option (error handler)
|
|
cpi ' ' ;no option, so proceed
|
|
jz show
|
|
cpi 'E' ;install SHOW as error handler
|
|
jz errins
|
|
call print
|
|
db 'SHOW Version '
|
|
db (version/10)+'0','.',(version mod 10)+'0'
|
|
db cr,lf,'Syntax:'
|
|
db cr,lf,' SHOW <-- Invoke Normally'
|
|
db cr,lf,' SHOW E <-- Install as Error Handler'
|
|
db 0
|
|
ret
|
|
;
|
|
; Install SHOW as an error handler
|
|
;
|
|
errins:
|
|
call getefcb ;pt to name of command
|
|
jnz errins1
|
|
lxi h,showcmd-1 ;pt to command line
|
|
errins1:
|
|
inx h ;pt to first char
|
|
push h ;save ptr
|
|
lxi d,8 ;skip to file type field
|
|
dad d
|
|
mvi m,0 ;store ending 0
|
|
pop h
|
|
call puterc ;store error handler command line
|
|
mvi a,0ffh ;turn on error handlers
|
|
call puter1
|
|
call print
|
|
db 'SHOW Installed as an Error Handler',0
|
|
ret
|
|
;
|
|
; Print Menu and Accept Command
|
|
;
|
|
show:
|
|
call tinit ;init terminal
|
|
call stopzex ;stop ZEX if running
|
|
call banner ;print banner
|
|
call gxymsg
|
|
db 3,31
|
|
db '--> ',1,'SHOW Menu',2,' <--',0
|
|
mvi h,7 ;begin on row 7
|
|
mvi l,10 ;column 10
|
|
shld infoxy
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' '
|
|
db ' PACKAGE DATA ',0
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' C -- '
|
|
db 1,'Command Packages ',2,0
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' I -- '
|
|
db 1,'Input/Output Package',2,0
|
|
call dispxy ;position for display
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' '
|
|
db ' ENVIRONMENT ',0
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' E -- '
|
|
db 1,'Error Handler ',2,0
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' M -- '
|
|
db 1,'Memory Utility ',2,0
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' N -- '
|
|
db 1,'Named Directory ',2,0
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db ' P -- '
|
|
db 1,'Path Expression ',2,0
|
|
call dispxy
|
|
call vprint
|
|
db ' S -- '
|
|
db 1,'Shell Stack ',2,0
|
|
mvi h,7 ; row 7
|
|
mvi l,40 ; column 40
|
|
shld infoxy
|
|
call dispxy
|
|
call vprint
|
|
db ' '
|
|
db 'ZCPR3 SYSTEM DATA ',0
|
|
call dispxy
|
|
call vprint
|
|
db ' 1 -- '
|
|
db 1,'Env Descriptor ',2,0
|
|
call dispxy
|
|
call vprint
|
|
db ' 2 -- '
|
|
db 1,'Message Buffers ',2,0
|
|
call dispxy
|
|
call vprint
|
|
db ' 3 -- '
|
|
db 1,'CRT and Printer Data',2,0
|
|
call dispxy
|
|
call vprint
|
|
db ' 4 -- '
|
|
db 1,'System File Defns ',2,0
|
|
call dispxy
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db ' X -- '
|
|
db 1,'Exit',2,0
|
|
;
|
|
; Input Command from User
|
|
;
|
|
getcmd:
|
|
call gxymsg ;print prompt
|
|
db 23,10,'SHOW Command? ',0
|
|
call capine ;get command
|
|
getcmd1:
|
|
call ctabscan ;scan for and process command
|
|
call print ;print error message
|
|
db 7,0 ;beep
|
|
jmp getcmd
|
|
;
|
|
; Print Banner
|
|
;
|
|
banner:
|
|
call cls ;clear screen
|
|
call gxymsg ;print banner message
|
|
db 1,27 ;row/col
|
|
db '>>>> '
|
|
db 'SHOW Version '
|
|
db (version/10)+'0','.',(version mod 10)+'0'
|
|
db ' <<<<',0
|
|
ret
|
|
;
|
|
; Command Table
|
|
;
|
|
ctable:
|
|
db '1' ;Env Desc
|
|
dw envdes
|
|
db '2' ;Messages
|
|
dw msg
|
|
db '3' ;CRT and Printer
|
|
dw cpdata
|
|
db '4' ;File Names
|
|
dw fnames
|
|
db 'C' ;Command Package Status
|
|
dw command
|
|
db 'E' ;Error Handler Display
|
|
dw errorh
|
|
db 'I' ;I/O Package Display
|
|
dw iopack
|
|
db 'M' ;Memory Utility
|
|
dw memory
|
|
db 'N' ;Named Directory Data
|
|
dw namedir
|
|
db 'P' ;Path Display
|
|
dw pdisp
|
|
db 'S' ;Shell Stack Display
|
|
dw shstack
|
|
db 'X' ;Exit
|
|
dw exit
|
|
db ctrlc ;Exit
|
|
dw exit
|
|
db cr ;New Screen
|
|
dw show
|
|
db ' ' ;New Screen
|
|
dw show
|
|
db ctrlr ;New Screen
|
|
dw show
|
|
db 0 ;end of table
|
|
;
|
|
; Scan for and transfer control to command routine
|
|
;
|
|
ctabscan:
|
|
lxi h,ctable ;pt to command table
|
|
mov c,a ;command in C
|
|
ctab1:
|
|
mov a,m ;get char from table
|
|
ora a ;done?
|
|
rz
|
|
cmp c ;check for match
|
|
jz ctab2
|
|
inx h ;skip address
|
|
inx h
|
|
inx h ;pt to next command char
|
|
jmp ctab1
|
|
ctab2:
|
|
inx h ;pt to address
|
|
mov a,m ;get low
|
|
inx h
|
|
mov h,m ;get high
|
|
mov l,a ;HL pts to command
|
|
pop psw ;clear stack
|
|
pchl ;"goto" command
|
|
;
|
|
; **** Deinitialize Terminal and Exit to ZCPR3 ****
|
|
;
|
|
exit:
|
|
call strtzex ;resume ZEX if running
|
|
jmp dinit ;deinit terminal
|
|
;
|
|
; **** Memory Dumper ****
|
|
;
|
|
memory:
|
|
call banner
|
|
call gxymsg
|
|
db 3,25
|
|
db '--> ',1,'Memory Display at ',0
|
|
lhld dumpstrt ;start of dump address
|
|
call phl4hc
|
|
call vprint
|
|
db 2,' <--',cr,lf,0
|
|
mvi b,16
|
|
mem1:
|
|
shld cline ;set current line ptr
|
|
call crlf ;new line
|
|
call phl4hc ;print address
|
|
call vprint
|
|
db 1,' --',2,0
|
|
mvi c,16 ;count for elements
|
|
mem2:
|
|
mov a,c ;extra space?
|
|
ani 3
|
|
mvi a,' ' ;extra space
|
|
cz cout
|
|
mov a,m ;get next byte
|
|
call pa2hc ;print as hex
|
|
mvi a,' ' ;space
|
|
call cout
|
|
inx h ;pt to next
|
|
dcr c ;count down
|
|
jnz mem2
|
|
call vprint
|
|
db 1,'| ',2,0
|
|
lhld cline ;pt to current line again
|
|
mvi c,16 ;count again
|
|
mem3:
|
|
mov a,m ;get next byte
|
|
ani 7fh ;mask MSB
|
|
cpi ' '
|
|
jnc mem4
|
|
mvi a,'.' ;dot fill
|
|
mem4:
|
|
call cout
|
|
inx h ;pt to next
|
|
dcr c ;count down
|
|
jnz mem3
|
|
dcr b ;count down major loop
|
|
jnz mem1
|
|
call gxymsg ;print prompt
|
|
db 23,10
|
|
db 1,'Command (<=last, >=next, A=adr, SHOW Cmd)? ',2,0
|
|
call capine ;get input
|
|
cpi 'A' ;address?
|
|
jz memadr
|
|
cpi '>' ;advance?
|
|
jz memnext
|
|
cpi '.' ;advance?
|
|
jz memnext
|
|
cpi '<' ;backup?
|
|
jz memback
|
|
cpi ',' ;backup?
|
|
jz memback
|
|
jmp getcmd1 ;process otherwise
|
|
memadr:
|
|
call print
|
|
db 'ddress (Hex)? ',0
|
|
mvi a,0ffh ;capitalize
|
|
call bbline ;get line from user
|
|
mema1:
|
|
mov a,m ;skip leading spaces
|
|
inx h ;pt to next char
|
|
cpi ' '
|
|
jz mema1
|
|
dcx h ;pt to first char
|
|
call eval16 ;evaluate as hex
|
|
xchg ;result in HL
|
|
shld dumpstrt ;set new start address
|
|
jmp memory ;restart
|
|
memnext:
|
|
lhld dumpstrt ;advance 1 page
|
|
inr h
|
|
shld dumpstrt
|
|
jmp memory ;restart
|
|
memback:
|
|
lhld dumpstrt ;backup 1 page
|
|
dcr h
|
|
shld dumpstrt
|
|
jmp memory ;restart
|
|
;
|
|
; **** ZCPR3 Messages ****
|
|
;
|
|
msg:
|
|
call banner
|
|
call gxymsg
|
|
db 3,25
|
|
db '--> ',1,'ZCPR3 System Messages',2,' <--',0
|
|
mvi h,5 ; row 5
|
|
mvi l,5 ; column 5
|
|
shld infoxy
|
|
mvi a,22h ; offset
|
|
call compenv ; pt to address of messages
|
|
mov a,m
|
|
inx h
|
|
mov h,m
|
|
mov l,a ; HL pts to first message
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Error Handler Defined? ',2,0
|
|
mov a,m ; get flag
|
|
call pryn
|
|
mov a,m ; get flag again
|
|
ora a ; defined?
|
|
jz msg1
|
|
push h
|
|
lxi d,10h ; pt to error command line
|
|
dad d
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Error Handler: ',2,0
|
|
call pstr
|
|
pop h
|
|
msg1:
|
|
inx h
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Current IF Level: ',2,0
|
|
mvi b,8 ; set IF count
|
|
mov c,m ; get IF flag
|
|
iftst:
|
|
mov a,c ; get flag
|
|
rlc
|
|
mov c,a ; save flag
|
|
jc iftst1
|
|
dcr b ; count down
|
|
jnz iftst
|
|
iftst1:
|
|
mov a,b ; get char
|
|
call padc
|
|
inx h ; pt to IF active flag
|
|
inx h ; pt to command status
|
|
shld cstat ; save address
|
|
inx h ; pt to error address
|
|
inx h
|
|
inx h ; pt to program error code
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Program Error Code: ',2,0
|
|
mov a,m
|
|
call padc
|
|
inx h ; pt to ZEX message byte
|
|
inx h ; pt to ZEX running flag
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'ZEX Running? ',2,0
|
|
mov a,m
|
|
call pryn
|
|
mov a,m ; make sure we have char
|
|
inx h ; skip ZEX data
|
|
inx h
|
|
inx h
|
|
ora a ; ZEX running?
|
|
jz nozex
|
|
mov e,m ; get low-order
|
|
inx h
|
|
mov d,m ; get high-order
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Address of ZEX Buffer: ',2,0
|
|
xchg
|
|
call phl4hc ; print address
|
|
xchg
|
|
jmp scb ; process shell control byte now
|
|
nozex:
|
|
inx h
|
|
scb:
|
|
inx h ; pt to shell control byte
|
|
push h
|
|
mvi h,5 ; row 5
|
|
mvi l,40 ; column 40
|
|
shld infoxy
|
|
pop h
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Shell Control --',2,0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Enable Shell Comment? ',2,0
|
|
mov a,m
|
|
ani 1
|
|
call pryn
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Enable Shell Echo? ',2,0
|
|
mov a,m
|
|
ani 10b
|
|
call pryn
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Enable Shell Wait? ',2,0
|
|
mov a,m
|
|
ani 80h
|
|
call pryn
|
|
push h ; save ptr to next message byte
|
|
lhld cstat ; get ptr to command status
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Command Status: ',2,0
|
|
mov a,m ; get it
|
|
ani 3 ; 2 LSBs
|
|
jz csnorm
|
|
cpi 1
|
|
jz csshell
|
|
call print
|
|
db 'Error',0
|
|
inx h ; pt to error address
|
|
mov a,m ; get low
|
|
inx h
|
|
mov h,m ; get high
|
|
mov l,a
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Error Command ',2,0
|
|
call dispxy
|
|
call print
|
|
db ' ',0
|
|
erprt:
|
|
mov a,m ; get char
|
|
cpi ' '+1 ; end of command with space or less?
|
|
jc csdone
|
|
cpi ';' ; end of command with new command?
|
|
jz csdone
|
|
call cout ; print char
|
|
inx h
|
|
jmp erprt
|
|
csnorm:
|
|
call print
|
|
db 'Normal',0
|
|
jmp csdone
|
|
csshell:
|
|
call print
|
|
db 'Shell',0
|
|
csdone:
|
|
pop h ; restore ptr
|
|
lxi d,35 ; jump to registers
|
|
dad d
|
|
push h
|
|
mvi h,17 ; row 17
|
|
mvi l,5 ; column 5
|
|
shld infoxy
|
|
pop h
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Registers --',2,0
|
|
call dispxy ; new line
|
|
mvi b,10 ; 10 times
|
|
mvi c,0
|
|
regl:
|
|
call vprint
|
|
db 1,' ',0
|
|
mvi a,10+'0' ; compute reg char
|
|
sub b ; get value
|
|
call cout
|
|
call vprint
|
|
db '=',2,0
|
|
mov a,m ; get value
|
|
inx h ; pt to next
|
|
call padc ; print
|
|
inr c ; every 4
|
|
mov a,c ; get count
|
|
ani 3
|
|
cz dispxy ; new line
|
|
dcr b ; count down
|
|
jnz regl
|
|
lxi d,6 ; skip to user-defined values
|
|
dad d
|
|
push h
|
|
mvi h,17 ; row 17
|
|
mvi l,40 ; column 40
|
|
shld infoxy
|
|
pop h
|
|
call dispxy
|
|
call vprint
|
|
db 1,'User-Defined Area --',2,0
|
|
call dispxy ; new line
|
|
mvi b,16 ; 16 times
|
|
mvi c,0
|
|
regl1:
|
|
call vprint
|
|
db ' ',0
|
|
mov a,m ; get value
|
|
inx h ; pt to next
|
|
call padc ; print
|
|
inr c ; every 4
|
|
mov a,c ; get count
|
|
ani 3
|
|
cz dispxy ; new line
|
|
dcr b ; count down
|
|
jnz regl1
|
|
jmp getcmd
|
|
;
|
|
; **** System File Definitions ****
|
|
;
|
|
fnames:
|
|
call banner
|
|
call gxymsg
|
|
db 3,27
|
|
db '--> ',1,'System File Names',2,' <--',0
|
|
mvi h,5 ; row 5
|
|
mvi l,24 ; column 24
|
|
shld infoxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Shell Variable File: ',2,0
|
|
mvi a,47h ; offset
|
|
call compenv
|
|
xchg ; DE pts to file name
|
|
call pfn ; print file name
|
|
call dispxy
|
|
mvi b,'1' ; set counter
|
|
fnames1:
|
|
lxi h,11 ; offset to next file
|
|
dad d ; pt to next file name
|
|
xchg
|
|
call dispxy
|
|
call vprint
|
|
db 1,'File Name ',0
|
|
mov a,b
|
|
call cout ; print number
|
|
call vprint
|
|
db ': ',2,0
|
|
call pfn ; print file name
|
|
inr b ; next name
|
|
mov a,b ; get next
|
|
cpi '4'+1 ; done?
|
|
jnz fnames1
|
|
jmp getcmd
|
|
;
|
|
; Print File Name for FNAMES
|
|
;
|
|
pfn:
|
|
ldax d ; get first char
|
|
cpi ' ' ; none?
|
|
jnz pfn1 ; print name
|
|
lxi h,8 ; check type
|
|
dad d
|
|
mov a,m ; get first char of type
|
|
cpi ' ' ; none?
|
|
jnz pfn1 ; print name
|
|
call print
|
|
db 'Undefined',0
|
|
ret
|
|
;
|
|
; **** CRT and Printer Data ****
|
|
;
|
|
cpdata:
|
|
call banner
|
|
call gxymsg
|
|
db 3,26
|
|
db '--> ',1,'CRT and Printer Data',2,' <--',0
|
|
mvi h,5 ; row 5
|
|
mvi l,5 ; column 5
|
|
shld infoxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'CRT -- Selection: ',2,0
|
|
mvi a,2fh ; offset
|
|
call prbyte ; print byte value there
|
|
call dispxy
|
|
call vprint
|
|
db 1,' CRT 0',2,0
|
|
mvi a,31h ; print data at 31H
|
|
call cprt
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'LST -- Selection: ',2,0
|
|
mvi a,30h ; offset
|
|
call prbyte ; print byte value there
|
|
call dispxy
|
|
call vprint
|
|
db 1,' LST 0',2,0
|
|
mvi a,37h ; offset
|
|
call lprt
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,' LST 2',2,0
|
|
mvi a,3fh ; offset
|
|
call lprt
|
|
mvi h,6 ; row 6
|
|
mvi l,40 ; column 40
|
|
shld infoxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,' CRT 1',2,0
|
|
mvi a,34h ; print data at 34H
|
|
call cprt
|
|
call dispxy
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,' LST 1',2,0
|
|
mvi a,3bh ; offset
|
|
call lprt
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,' LST 3',2,0
|
|
mvi a,43h ; offset
|
|
call lprt
|
|
jmp getcmd
|
|
;
|
|
; Print CRT Data
|
|
;
|
|
cprt:
|
|
call compenv ; compute offset
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Width: ',2,0
|
|
mov a,m
|
|
call padc
|
|
call vprint
|
|
db ' Cols',0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Lines/Text: ',2,0
|
|
inx h
|
|
mov a,m
|
|
call padc
|
|
call vprint
|
|
db ' / ',0
|
|
inx h
|
|
mov a,m
|
|
call padc
|
|
ret
|
|
;
|
|
; Print LST Data
|
|
;
|
|
lprt:
|
|
call compenv ; compute offset
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Width: ',2,0
|
|
mov a,m
|
|
call padc
|
|
call vprint
|
|
db ' Cols',0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Lines/Text: ',2,0
|
|
inx h
|
|
mov a,m
|
|
call padc
|
|
call vprint
|
|
db ' / ',0
|
|
inx h
|
|
mov a,m
|
|
call padc
|
|
inx h
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Form Feed? ',2,0
|
|
mov a,m
|
|
call pryn
|
|
ret
|
|
|
|
;
|
|
; **** Print Environment Descriptor Data ****
|
|
;
|
|
envdes:
|
|
call banner
|
|
call gxymsg
|
|
db 3,25
|
|
db '--> ',1,'Environment Descriptor',2,' <--',0
|
|
mvi h,5 ; row 5
|
|
mvi l,5 ; column 5
|
|
shld infoxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'>> Addresses <<',2,0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Command Line Buffer: ',2,0
|
|
mvi a,18h ; offset
|
|
call pradr ; print address
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Command-Search Path: ',2,0
|
|
mvi a,9 ; offset
|
|
call pradr ; print address
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Environment Descriptor: ',2,0
|
|
lhld envptr ; get ptr
|
|
call phl4hc
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Externals --',2,0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' File Control Block: ',2,0
|
|
mvi a,24h
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' System Stack: ',2,0
|
|
mvi a,26h
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Message Buffer: ',2,0
|
|
mvi a,22h
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Named Directory Buffer: ',2,0
|
|
mvi a,15h
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Packages --',2,0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Flow Command: ',2,0
|
|
mvi a,12h
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Input/Output: ',2,0
|
|
mvi a,0fh
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Resident Command: ',2,0
|
|
mvi a,0ch
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Shell Stack Buffer: ',2,0
|
|
mvi a,1eh
|
|
call pradr
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Wheel Byte: ',2,0
|
|
mvi a,29h
|
|
call pradr
|
|
mvi h,5 ; row 5
|
|
mvi l,40 ; column 40
|
|
shld infoxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'>> Data Elements <<',2,0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Sizes --',2,0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Command Line: ',2,0
|
|
mvi a,1ah
|
|
call prbyte
|
|
call vprint
|
|
db ' Chars',0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' External Path: ',2,0
|
|
mvi a,0bh
|
|
call prbyte
|
|
call vprint
|
|
db ' Elts',0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Named Dir Entries: ',2,0
|
|
mvi a,17h
|
|
call prbyte
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Package, FCP: ',2,0
|
|
mvi a,14h
|
|
call prbyte
|
|
call pr128
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Package, IOP: ',2,0
|
|
mvi a,11h
|
|
call prbyte
|
|
call pr128
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Package, RCP: ',2,0
|
|
mvi a,0eh
|
|
call prbyte
|
|
call pr128
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Shell Stack Elts: ',2,0
|
|
mvi a,20h
|
|
call prbyte
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,' DU Form Allowed? ',2,0
|
|
mvi a,2eh
|
|
call compenv
|
|
mov a,m ; get byte
|
|
call pryn
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Max Disk and User: ',2,0
|
|
mvi a,2ch
|
|
call compenv
|
|
mov a,m
|
|
adi '@'
|
|
call cout
|
|
inx h
|
|
mov a,m
|
|
call pafdc
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Processor Speed: ',2,0
|
|
mvi a,2bh
|
|
call prbyte
|
|
call vprint
|
|
db ' MHz',0
|
|
call dispxy
|
|
call vprint
|
|
db 1,' Quiet Operation? ',2,0
|
|
mvi a,28h
|
|
call compenv
|
|
mov a,m ; get byte
|
|
call pryn
|
|
jmp getcmd
|
|
;
|
|
; Print 128-Byte Block Message
|
|
;
|
|
pr128:
|
|
call vprint
|
|
db ' Blocks',0
|
|
ret
|
|
;
|
|
; Print address pted to by A offset as 4 hex chars
|
|
;
|
|
pradr:
|
|
call compenv ; pt to address
|
|
mov e,m ; get address
|
|
inx h
|
|
mov d,m
|
|
xchg
|
|
jmp phl4hc
|
|
;
|
|
; Print byte pted to by A offset as dec chars
|
|
;
|
|
prbyte:
|
|
call compenv ; compute offset (in HL)
|
|
mov a,m ; get byte
|
|
jmp padc
|
|
;
|
|
; Add A to Base Address in ENVPTR
|
|
; Return Result in HL
|
|
;
|
|
compenv:
|
|
lhld envptr ; get base address
|
|
add l ; add offset
|
|
mov l,a
|
|
mov a,h
|
|
aci 0
|
|
mov h,a
|
|
ret
|
|
;
|
|
; **** Display Input/Output Package Function ****
|
|
;
|
|
iopack:
|
|
call banner
|
|
call gxymsg
|
|
db 3,26
|
|
db '--> ',1,'Input/Output Package',2,' <--',0
|
|
call getiop ;check for initialization
|
|
mov a,h
|
|
ora l ;must NOT be zero
|
|
jnz iopack0
|
|
call gxymsg
|
|
db 5,23,'Input/Output Packages Not Available',0
|
|
jmp getcmd
|
|
iopack0:
|
|
call status ;check for drivers
|
|
jnz iopack1
|
|
call gxymsg
|
|
db 5,22,'Input/Output Redirection Not Available',0
|
|
jmp getcmd
|
|
iopack1:
|
|
call dispcon ;successive displays
|
|
call disprdr
|
|
call gxymsg
|
|
db 23,10,'Strike Any Key For Next Screen - ',0
|
|
call capine
|
|
call banner
|
|
call gxymsg
|
|
db 3,26
|
|
db '--> ',1,'Input/Output Package',2,' <--',0
|
|
call disppun
|
|
call displst
|
|
jmp getcmd
|
|
dispcon:
|
|
call vprint
|
|
db cr,lf,cr,lf,1,'Console',0
|
|
mvi a,0 ;select CON:
|
|
call disp
|
|
jmp curr
|
|
displst:
|
|
call vprint
|
|
db cr,lf,cr,lf,1,'Printer',0
|
|
mvi a,3 ;select LST:
|
|
call disp
|
|
jmp curr
|
|
disprdr:
|
|
call vprint
|
|
db cr,lf,cr,lf,1,'Reader ',0
|
|
mvi a,1 ;select RDR:
|
|
call disp
|
|
jmp curr
|
|
disppun:
|
|
call vprint
|
|
db cr,lf,cr,lf,1,'Punch ',0
|
|
mvi a,2 ;select PUN:
|
|
call disp
|
|
;
|
|
; Print Name of Current Device
|
|
;
|
|
curr:
|
|
push h ;save ptr
|
|
mov b,a ;save number in B
|
|
push b ;save B
|
|
call vprint
|
|
db cr,lf,1,' Assignment is ',2,0
|
|
push b ;save B
|
|
call status ;get status
|
|
pop b ;get B
|
|
inr b ;add 1 for offset
|
|
dcx h ;back up
|
|
curr1:
|
|
inx h ;pt to next
|
|
inx h
|
|
dcr b ;count down
|
|
jnz curr1
|
|
pop b ;get logical number in B
|
|
mov c,m ;get physical number in C
|
|
call pname0 ;print first part of name only
|
|
pop h ;get ptr
|
|
ret
|
|
;
|
|
; Print Names of All Physical Devices for a Logical Device
|
|
;
|
|
disp:
|
|
push h ;save char ptr
|
|
push psw ;save device number
|
|
call vprint
|
|
db ' Devices --',2,0
|
|
mov b,a ;logical device in B
|
|
push b ;save for later
|
|
push b ;save it
|
|
call status ;get status report
|
|
pop b ;get logical device number
|
|
inr b ;add 1 for offset
|
|
dcx h ;back up
|
|
dcx h
|
|
disp1:
|
|
inx h ;pt to next
|
|
inx h
|
|
dcr b ;count down
|
|
jnz disp1
|
|
pop b ;get B back
|
|
mov c,m ;get count of devices
|
|
mov a,c ;check for none
|
|
ora a
|
|
jz disp3
|
|
disp2:
|
|
push b ;save values
|
|
dcr c ;pt to next name
|
|
call print
|
|
db cr,lf,' ',0
|
|
call pnamer ;print name (B=logical, C=physical)
|
|
pop b ;get count
|
|
dcr c ;count down
|
|
jnz disp2
|
|
disp3:
|
|
pop psw
|
|
pop h
|
|
ret
|
|
;
|
|
; Routine to Print Name of Selected Device
|
|
; B=logical number, C=physical number
|
|
;
|
|
pnamer:
|
|
push b ;save BC
|
|
call pname0 ;print first part of name
|
|
call vprint ;print separator
|
|
db 1,' - ',2,0
|
|
call pstr ;print rest as string
|
|
pop b ;restore BC
|
|
ret
|
|
;
|
|
; Print first part of selected device name
|
|
;
|
|
pname0:
|
|
call namer ;get ptr to string
|
|
mvi b,8 ;at most 8 chars
|
|
pname1:
|
|
mov a,m ;get char
|
|
inx h ;pt to next char
|
|
cpi ' ' ;end of name?
|
|
jz pname2
|
|
call cout ;print char
|
|
dcr b ;count down
|
|
jnz pname1
|
|
ret
|
|
pname2:
|
|
mvi a,' ' ;print spaces
|
|
call cout
|
|
dcr b ;count down
|
|
jnz pname2
|
|
ret
|
|
|
|
;
|
|
; Basic Interface Routines
|
|
;
|
|
status:
|
|
lxi d,0 ;Offset 0
|
|
runit:
|
|
call getiop ;device driver base
|
|
dad d
|
|
pchl
|
|
select:
|
|
lxi d,3 ;Offset 3
|
|
jmp runit
|
|
namer:
|
|
lxi d,6 ;Offset 6
|
|
jmp runit
|
|
|
|
;
|
|
; **** Display Path Function ****
|
|
;
|
|
pdisp:
|
|
call banner
|
|
call gxymsg
|
|
db 3,28
|
|
db '--> ',1,'Path Expressions',2,' <--',0
|
|
mvi h,6 ; row 6
|
|
mvi l,10 ; column 10
|
|
shld infoxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'Symbolic Form',2,0
|
|
call dispxy
|
|
call vprint
|
|
db ' ',0
|
|
call getpath ; pt to external path
|
|
pdisp1:
|
|
mov a,m ; get disk
|
|
ora a ; done?
|
|
jz adisp
|
|
cpi '$' ; current?
|
|
jz pdisp2
|
|
adi '@' ; convert to letter
|
|
pdisp2:
|
|
call cout ; print disk letter
|
|
inx h ; pt to user
|
|
mov a,m ; get user number
|
|
cpi '$' ; current?
|
|
jnz pdisp3
|
|
call cout ; print current indicator
|
|
jmp pdisp4
|
|
pdisp3:
|
|
call pafdc ; print user number
|
|
pdisp4:
|
|
call colon
|
|
inx h ; pt to next element
|
|
mov a,m ; done?
|
|
ora a ; 0=yes
|
|
cnz arrow
|
|
jmp pdisp1
|
|
;
|
|
; Print Absolute Path
|
|
;
|
|
adisp:
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'DU Form ',2,0
|
|
call dispxy
|
|
call vprint
|
|
db ' ',0
|
|
call retud ; get current user/disk
|
|
call getpath ; pt to external path
|
|
adisp1:
|
|
mov a,m ; get disk
|
|
ora a ; done?
|
|
jz ndisp
|
|
cpi '$' ; current?
|
|
jnz adisp2
|
|
mov a,b ; get current disk
|
|
inr a ; adjust to 1 to n
|
|
adisp2:
|
|
adi '@' ; convert to letter
|
|
call cout ; print disk letter
|
|
inx h ; pt to user
|
|
mov a,m ; get user
|
|
cpi '$' ; current?
|
|
jnz adisp3
|
|
mov a,c ; get current user
|
|
adisp3:
|
|
call pafdc ; print user
|
|
call colon
|
|
inx h ; pt to next
|
|
mov a,m ; done?
|
|
ora a
|
|
cnz arrow
|
|
jmp adisp1
|
|
;
|
|
; Print Named Path
|
|
;
|
|
ndisp:
|
|
call dispxy
|
|
call dispxy
|
|
call vprint
|
|
db 1,'DIR Form ',2,0
|
|
call dispxy
|
|
call vprint
|
|
db ' ',0
|
|
call getpath ; pt to external path
|
|
ndisp1:
|
|
call retud ; get current user and disk in C and B
|
|
mov a,m ; get disk
|
|
ora a ; done?
|
|
jz getcmd
|
|
cpi '$' ; current?
|
|
jz ndisp2
|
|
mov b,a ; disk in B
|
|
dcr b ; adjust to 0 to n-1
|
|
ndisp2:
|
|
inx h ; pt to user
|
|
mov a,m ; get it
|
|
cpi '$' ; current?
|
|
jz ndisp3
|
|
mov c,a ; user in C
|
|
ndisp3:
|
|
inx h ; pt to next
|
|
push h ; save ptr
|
|
call udscan ; scan dirs for user/disk and print its name
|
|
pop h ; get ptr
|
|
call colon
|
|
mov a,m ; done?
|
|
ora a
|
|
cnz arrow
|
|
jmp ndisp1
|
|
|
|
;
|
|
; Print Colon
|
|
;
|
|
colon:
|
|
mvi a,':' ; print colon
|
|
jmp cout
|
|
|
|
;
|
|
; Print Arrow
|
|
;
|
|
arrow:
|
|
call vprint
|
|
db 1,' --> ',2,0
|
|
ret
|
|
|
|
;
|
|
; Scan directories for user and disk in C and B
|
|
; Print name if found or "Noname" if not
|
|
;
|
|
udscan:
|
|
call dutdir ; convert to name
|
|
jz udscan1 ; error return if no name
|
|
mvi b,8 ; 8 chars max
|
|
udsprn:
|
|
mov a,m ; get name char
|
|
cpi ' ' ; done?
|
|
rz
|
|
call cout ; print char
|
|
inx h ; pt to next
|
|
dcr b ; count down
|
|
jnz udsprn
|
|
ret
|
|
udscan1:
|
|
call vprint
|
|
db 'Noname',0
|
|
ret
|
|
|
|
;
|
|
; **** Print Named Directory Info ****
|
|
;
|
|
namedir:
|
|
call banner
|
|
call gxymsg
|
|
db 3,26
|
|
db '--> ',1,'Named Directory Data',2,' <--',0
|
|
call getndr ;get location of directory
|
|
jnz ndir1
|
|
call gxymsg
|
|
db 5,22
|
|
db 'Named Directory Buffer Not Available',0
|
|
jmp getcmd
|
|
;
|
|
; Print Names of Directory Elements
|
|
;
|
|
ndir1:
|
|
call gxymsg
|
|
db 5,25
|
|
db '-- Named Directory Entries --',0
|
|
mvi d,7 ;set row
|
|
mvi e,7 ;set column
|
|
xchg
|
|
call gotoxy ;position cursor
|
|
xchg
|
|
mvi c,0 ;set entry count
|
|
mvi b,1 ;set disk 1
|
|
;
|
|
; Print Each Resident Command Name
|
|
;
|
|
ndir2:
|
|
mov a,m ;get table entry
|
|
ora a ;end of table?
|
|
jz getcmd
|
|
;
|
|
; DE is carried over all of this as starting row/column
|
|
;
|
|
cmp b ;same disk?
|
|
jz ndir3
|
|
;
|
|
; Advance to Next Set of Entries for New Disk
|
|
;
|
|
mvi c,0 ;reset counter
|
|
mov b,a ;set new disk
|
|
xchg ;position for new disk
|
|
inr h ;blank line
|
|
inr h
|
|
call gotoxy ;position on screen
|
|
xchg
|
|
ndir3:
|
|
push b ;save counters
|
|
;
|
|
; Print DU:
|
|
;
|
|
mov a,m ;get disk
|
|
adi '@' ;convert to letter (A to P)
|
|
call cout
|
|
inx h ;pt to user
|
|
mov a,m ;get user
|
|
call padc ;print user number
|
|
call print ;print separator
|
|
db ': ',0
|
|
inx h ;pt to name
|
|
;
|
|
; Print DIR
|
|
;
|
|
mvi b,8 ;print name
|
|
ndir4:
|
|
mov a,m ;get char
|
|
call cout
|
|
inx h ;pt to next
|
|
dcr b ;count down
|
|
jnz ndir4
|
|
;
|
|
; Advance to Next and Print Separator
|
|
;
|
|
lxi b,8 ;skip over password
|
|
dad b
|
|
call print ;print separator
|
|
db ' ',0
|
|
pop b ;get counters
|
|
;
|
|
; New Line Counter
|
|
;
|
|
inr c ;increment entry counter
|
|
mov a,c ;check for done
|
|
ani 3 ;every 4
|
|
jnz ndir2
|
|
;
|
|
; Position in Next Line
|
|
;
|
|
xchg ;position cursor
|
|
inr h ;next row
|
|
call gotoxy
|
|
xchg
|
|
jmp ndir2
|
|
|
|
;
|
|
; **** Print Command Status ****
|
|
;
|
|
command:
|
|
call banner
|
|
call gxymsg
|
|
db 3,25
|
|
db '--> ',1,'Command Package Status',2,' <--',0
|
|
call gxymsg
|
|
db 5,25
|
|
db '---- ',1,'FLOW COMMAND PACKAGE',2,' ----',0
|
|
call getfcp ;get FCP data
|
|
jnz flow0
|
|
call gxymsg
|
|
db 7,20
|
|
db 'Flow Command Facility Not Available',0
|
|
jmp rcp
|
|
;
|
|
; Check for Flow Command Package Loaded
|
|
;
|
|
flow0:
|
|
mov a,m ;get first byte
|
|
ora a ;0=none loaded
|
|
jnz flow1
|
|
call gxymsg
|
|
db 7,25
|
|
db 'No Flow Command Package Loaded',0
|
|
jmp rcp
|
|
;
|
|
; Print Flow Command Package Info
|
|
;
|
|
flow1:
|
|
call gxymsg
|
|
db 7,20
|
|
db 1,'Flow Commands:',2,0
|
|
lxi d,5 ;skip to command size byte
|
|
dad d
|
|
mov b,m ;get command size
|
|
inx h ;pt to first command
|
|
call at
|
|
db 8,22
|
|
;
|
|
; Print Flow Command Names
|
|
;
|
|
flow2:
|
|
mov a,m ;get first char
|
|
ora a ;end of table?
|
|
jz flow4
|
|
push b ;save counter
|
|
flow3:
|
|
mov a,m ;get char
|
|
inx h ;pt to next
|
|
call cout ;print char
|
|
dcr b ;count down
|
|
jnz flow3
|
|
call print
|
|
db ' ',0
|
|
inx h ;skip over address
|
|
inx h
|
|
pop b ;get counter
|
|
jmp flow2
|
|
;
|
|
; Print Flow Command Arguments
|
|
;
|
|
flow4:
|
|
call gxymsg
|
|
db 9,20
|
|
db 1,'IF Options:',2,0
|
|
call at
|
|
db 10,22
|
|
inx h ;pt to first option
|
|
;
|
|
; Print Each Option
|
|
;
|
|
flow5:
|
|
mov a,m ;get next char
|
|
ora a ;done?
|
|
jz flow6
|
|
call cout ;print char
|
|
inx h ;pt to 2nd char
|
|
mov a,m ;get it and print
|
|
call cout
|
|
call print
|
|
db ' ',0 ;space over
|
|
inx h ;skip address
|
|
inx h
|
|
inx h
|
|
jmp flow5
|
|
;
|
|
; Print Current IF Level
|
|
;
|
|
flow6:
|
|
call gxymsg
|
|
db 11,20
|
|
db 1,'Current IF Level: ',2,0
|
|
call getmsg ;pt to ZCPR3 messages
|
|
inx h ;pt to IF byte
|
|
mov a,m ;get IF byte
|
|
mvi c,'0' ;assume level 0
|
|
ora a ;see if at last IF level
|
|
jz flow8
|
|
flow7:
|
|
inr c ;advance to next level
|
|
rrc ;rotate bits
|
|
ani 7fh ;mask out MSB
|
|
jnz flow7 ;continue looping until no 1 bits
|
|
flow8:
|
|
mov a,c ;get digit
|
|
call cout ;print it
|
|
;
|
|
; Print RCP Data
|
|
;
|
|
rcp:
|
|
call gxymsg
|
|
db 14,23
|
|
db '---- ',1,'RESIDENT COMMAND PACKAGE',2,' ----',0
|
|
call getrcp ;get RCP data
|
|
jnz rcp0
|
|
call gxymsg
|
|
db 16,20
|
|
db 'Resident Command Facility Not Available',0
|
|
jmp getcmd
|
|
;
|
|
; Check for Resident Command Package Loaded
|
|
;
|
|
rcp0:
|
|
mov a,m ;get first byte
|
|
ora a ;0=none loaded
|
|
jnz rcp1
|
|
call gxymsg
|
|
db 16,23
|
|
db 'No Resident Command Package Loaded',0
|
|
jmp getcmd
|
|
;
|
|
; Print Resident Command Package Info
|
|
;
|
|
rcp1:
|
|
call gxymsg
|
|
db 16,20
|
|
db 1,'Resident Commands:',2,0
|
|
lxi d,5 ;skip to command size byte
|
|
dad d
|
|
mov b,m ;get command size
|
|
mvi c,0 ;set count
|
|
inx h ;pt to first command
|
|
mvi d,17 ;set row
|
|
mvi e,22 ;set column
|
|
xchg
|
|
call gotoxy ;position cursor
|
|
xchg
|
|
;
|
|
; Print Each Resident Command Name
|
|
;
|
|
rcp2:
|
|
mov a,m ;get table entry
|
|
ora a ;end of table?
|
|
jz getcmd
|
|
push b ;save counters
|
|
rcp3:
|
|
mov a,m ;get char
|
|
inx h ;pt to next
|
|
call cout
|
|
dcr b ;count down
|
|
jnz rcp3
|
|
call print
|
|
db ' ',0
|
|
inx h ;pt to next command
|
|
inx h
|
|
pop b ;get counters
|
|
inr c ;increment entry counter
|
|
mov a,c ;check for done
|
|
ani 7 ;every 8
|
|
jnz rcp2
|
|
xchg ;position cursor
|
|
inr h ;next row
|
|
call gotoxy
|
|
xchg
|
|
jmp rcp2
|
|
|
|
;
|
|
; **** Print Error Handler Data ****
|
|
;
|
|
errorh:
|
|
call banner
|
|
call gxymsg
|
|
db 3,27
|
|
db '--> ',1,'Error Handler Data',2,' <--',0
|
|
call getmsg ;get message address
|
|
jnz errh1
|
|
call gxymsg
|
|
db 5,20
|
|
db 'ZCPR3 Messages Not Available on this System',0
|
|
jmp getcmd
|
|
errh1:
|
|
call gxymsg
|
|
db 5,27
|
|
db 1,'Error Handler Engaged? ',2,0
|
|
call geter1 ;error handler engaged?
|
|
push psw
|
|
call pryn ;print yes/no
|
|
pop psw
|
|
jz getcmd ;exit display
|
|
call gxymsg
|
|
db 6,27
|
|
db 1,'Error Handler Command: ',2,0
|
|
call geterc ;get command line
|
|
call pstr
|
|
call gxymsg
|
|
db 7,30
|
|
db 1,'Command Status: ',2,0
|
|
mvi a,22h ; offset to message ptr
|
|
call compenv ; pt to message ptr
|
|
mov a,m
|
|
inx h
|
|
mov h,m
|
|
mov l,a ; HL pts to messages
|
|
inx h ; pt to command status message
|
|
inx h
|
|
inx h
|
|
mov a,m ; get it
|
|
ani 3 ; 2 LSBs
|
|
jz errh3
|
|
cpi 1
|
|
jz errh4
|
|
call print
|
|
db 'Error',0
|
|
inx h ; pt to error address
|
|
mov a,m ; get low
|
|
inx h
|
|
mov h,m ; get high
|
|
mov l,a
|
|
call gxymsg
|
|
db 9,5
|
|
db 1,'Error Command --',2,0
|
|
call vprint
|
|
db cr,lf,1,' --> ',2,0
|
|
errh2:
|
|
mov a,m ; get char
|
|
inx h ; pt to next
|
|
ora a ; end of line?
|
|
jz errh5
|
|
cpi ';' ; end of command with new command?
|
|
jnz errh2a
|
|
call vprint
|
|
db 1,';',2,cr,lf,1,' --> ',2,0
|
|
jmp errh2
|
|
errh2a:
|
|
call cout ; print char
|
|
jmp errh2
|
|
errh3:
|
|
call print
|
|
db 'Normal',0
|
|
jmp errh5
|
|
errh4:
|
|
call print
|
|
db 'Shell',0
|
|
errh5:
|
|
jmp getcmd
|
|
|
|
;
|
|
; **** Print Shell Stack Data ****
|
|
;
|
|
shstack:
|
|
call banner
|
|
call gxymsg
|
|
db 3,28
|
|
db '--> ',1,'Shell Stack Data',2,' <--',0
|
|
call getsh ;get shell data
|
|
jnz shs0
|
|
call gxymsg
|
|
db 5,20
|
|
db 'Shell Stack NOT Available on this System',0
|
|
jmp getcmd
|
|
;
|
|
; Print Empty/Full Messages
|
|
;
|
|
shs0:
|
|
call gxymsg
|
|
db 5,30
|
|
db 'Shell Stack Empty? ',0
|
|
call shempty
|
|
jz shsem
|
|
mvi a,0 ; set not empty
|
|
jmp shsnem
|
|
shsem:
|
|
mvi a,1 ; set empty
|
|
shsnem:
|
|
call pryn
|
|
call gxymsg
|
|
db 6,30
|
|
db 'Shell Stack Full? ',0
|
|
call shfull
|
|
jz shsfu
|
|
mvi a,0 ; set not full
|
|
jmp shsnfu
|
|
shsfu:
|
|
mvi a,1 ; set full
|
|
shsnfu:
|
|
call pryn
|
|
;
|
|
; Print Shell Stack Content Data
|
|
;
|
|
call gxymsg
|
|
db 8,27
|
|
db '--- Shell Stack Content ---',0
|
|
mvi h,10 ;row 10
|
|
mvi l,20 ;col 20
|
|
shld infoxy ;save position
|
|
call getsh ;get shell stack data
|
|
mov e,b ;get element size in DE
|
|
mvi d,0
|
|
mov b,a ;get element count in B
|
|
mvi c,'1' ;get digit in C
|
|
shs1:
|
|
mov a,m ;check for element in stack
|
|
ora a ;0=empty
|
|
jz shs2
|
|
call dispxy ;position for display
|
|
call vprint
|
|
db 1,'Elt ',0
|
|
mov a,c ;get digit
|
|
call cout ;print as decimal
|
|
inr c ;next digit
|
|
call vprint
|
|
db ' -- ',2,0
|
|
push h
|
|
call pstr ;print entry
|
|
pop h
|
|
dad d ;pt to next
|
|
dcr b ;count down
|
|
jnz shs1
|
|
shs2:
|
|
mov a,c ;see if anything printed
|
|
cpi '1'
|
|
jnz getcmd
|
|
lhld infoxy ;position on screen
|
|
call gotoxy
|
|
call print
|
|
db ' Empty',0
|
|
jmp getcmd
|
|
|
|
;
|
|
; Position Display at INFOXY address and advance
|
|
;
|
|
dispxy:
|
|
push h ;save HL
|
|
lhld infoxy ;get screen position
|
|
call gotoxy ;go there
|
|
inr h ;advance to next line
|
|
shld infoxy ;set screen position
|
|
pop h ;restore HL
|
|
ret
|
|
;
|
|
; If A=0, print Yes, else print No
|
|
;
|
|
pryn:
|
|
ora a
|
|
jnz pryes
|
|
call print
|
|
db 'NO',0
|
|
ret
|
|
pryes:
|
|
call print
|
|
db 'YES',0
|
|
ret
|
|
|
|
;
|
|
; Buffers
|
|
;
|
|
showcmd:
|
|
db 'SHOW ',0
|
|
infoxy:
|
|
ds 2 ;address on screen of next line to print
|
|
cstat:
|
|
ds 2 ;command status ptr
|
|
dumpstrt:
|
|
ds 2 ;address of next byte to start memory dump
|
|
cline:
|
|
ds 2 ;address of current line
|
|
|
|
end
|
|
|