;
; 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.
;
;
; 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 vpr
int
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
;
; **** 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 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