mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
659 lines
11 KiB
Plaintext
659 lines
11 KiB
Plaintext
;
|
||
; Program: SHDEFINE
|
||
; Author: Richard Conn
|
||
; Version: 1.0
|
||
; Date: 5 Mar 84
|
||
;
|
||
version equ 10
|
||
|
||
;
|
||
; SHDEFINE is used to define shell variables for the Shell SH.
|
||
; It makes entries into the file SH.VAR in the ROOT directory.
|
||
;
|
||
|
||
;
|
||
; Equates for Key Values
|
||
;
|
||
z3env SET 0f400h ;address of ZCPR3 environment
|
||
backup equ 0 ;backup old file? 1 for yes, 0 for no
|
||
ctrlz equ 'Z'-'@' ;^Z for EOF
|
||
fcb equ 5ch
|
||
tbuff equ 80h
|
||
cr equ 0dh
|
||
lf equ 0ah
|
||
|
||
;
|
||
; External Z3LIB and SYSLIB Routines
|
||
;
|
||
ext sctlfl,sout,sprint,scrlf,shldc
|
||
ext bbline,sksp,capine,fillb,cout,moveb,getfn1
|
||
ext initfcb,f$open,f$read,f$close,f$make,f$delete,f$write,f$rename
|
||
ext z3init,qprint,codend,hmovb,root,logud,getwhl,print
|
||
|
||
;
|
||
; 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
|
||
call banner ;print banner
|
||
;
|
||
; Check for Wheel
|
||
;
|
||
call getwhl ;get wheel byte
|
||
jnz start0
|
||
call print
|
||
db cr,lf,' Not Wheel - Aborting',0
|
||
ret
|
||
;
|
||
; Try to Load Variables
|
||
;
|
||
start0:
|
||
;
|
||
; Define File to Work With
|
||
;
|
||
lxi h,fcb+1 ;check for file name
|
||
lxi d,shvfcb+1 ;variable FCB
|
||
mvi b,11 ;11 chars
|
||
mov a,m ;any name given?
|
||
cpi ' ' ;space if none
|
||
jz setdef ;set default shell variable file name
|
||
;
|
||
; Define Passed Name as Shell Variable File
|
||
;
|
||
call moveb ;set name
|
||
lxi h,deftype ;set default type if none
|
||
lxi d,shvfcb+9 ;pt to type
|
||
mvi b,3 ;3 chars
|
||
ldax d ;any chars
|
||
cpi ' ' ;if none, copy
|
||
cz moveb
|
||
jmp bakdef
|
||
;
|
||
; Define from Shell Variable File Name
|
||
;
|
||
setdef:
|
||
call getfn1 ;get name
|
||
call moveb ;copy it
|
||
;
|
||
; Define $$$ and BAK Files
|
||
;
|
||
bakdef:
|
||
lxi h,shvfcb+1
|
||
lxi d,shvtmp+1 ;set $$$ name
|
||
mvi b,8 ;8 chars
|
||
call moveb
|
||
;
|
||
if backup
|
||
lxi d,shvbak+1 ;set BAK name
|
||
call moveb
|
||
endif ;backup
|
||
;
|
||
; Load Variables
|
||
;
|
||
call varload
|
||
jnz start1
|
||
;
|
||
; Initialize Shell Variables if File Not Found
|
||
;
|
||
call codend ;pt to code end
|
||
mvi m,ctrlz ;place ^Z
|
||
;
|
||
; Process User Commands
|
||
;
|
||
start1:
|
||
call menu ;use menu
|
||
rz ;abort
|
||
call varsave ;save new shell variables
|
||
ret
|
||
|
||
;
|
||
; Input and Process User Commands
|
||
; Return with Z if Abort
|
||
;
|
||
menu:
|
||
call print
|
||
db cr,lf
|
||
db cr,lf,' ** Shell Variable Editor **'
|
||
db cr,lf
|
||
db cr,lf,'Edit: E. Edit (Add/Delete/Redefine) Shell Variables'
|
||
db cr,lf,' L. List Shell Variables on Console'
|
||
db cr,lf,' P. Print Shell Variables on Printer'
|
||
db cr,lf
|
||
db cr,lf,'Exit: X. Exit and Update SH.VAR on Disk'
|
||
db cr,lf,' Q. Quit without Updating SH.VAR'
|
||
db cr,lf
|
||
db cr,lf,'Command: ',0
|
||
call capine ;get command
|
||
lxi h,ctable ;scan command table
|
||
call tscan
|
||
call print
|
||
db ' Invalid Command: ',0
|
||
call cout
|
||
jmp menu
|
||
;
|
||
; Pack and Menu Exit
|
||
; Return NZ
|
||
;
|
||
pack:
|
||
call codend ;pack entries in table
|
||
mov d,h ;HL=DE
|
||
mov e,l
|
||
;
|
||
; Check Next Entry
|
||
;
|
||
pack1:
|
||
mov a,m ;get next char
|
||
stax d ;put it
|
||
cpi ctrlz ;done?
|
||
jz packx
|
||
cpi ' ' ;deleted?
|
||
jz pack3
|
||
;
|
||
; Copy Entry
|
||
;
|
||
pack2:
|
||
mov a,m ;get char
|
||
stax d ;put it
|
||
inx h ;pt to next
|
||
inx d
|
||
ora a ;done?
|
||
jnz pack2
|
||
jmp pack1 ;resume
|
||
;
|
||
; Skip Entry
|
||
;
|
||
pack3:
|
||
mov a,m ;get char
|
||
inx h ;pt to next
|
||
ora a ;done?
|
||
jnz pack3
|
||
jmp pack1 ;resume
|
||
;
|
||
; Pack Complete
|
||
;
|
||
packx:
|
||
xra a ;NZ
|
||
dcr a
|
||
ret
|
||
;
|
||
; Menu Quit
|
||
; Return Z
|
||
;
|
||
mquit:
|
||
call print
|
||
db cr,lf,' Do you really want to quit (Y/N)? ',0
|
||
call capine
|
||
cpi 'Y'
|
||
jnz menu
|
||
xra a ;Z
|
||
ret
|
||
;
|
||
; List Names in Table on Printer
|
||
;
|
||
nprint:
|
||
mvi a,80H ;select print
|
||
jmp nliste
|
||
;
|
||
; List Names in Table on Console
|
||
;
|
||
nlist:
|
||
mvi a,1 ;select console
|
||
nliste:
|
||
sta sctlfl ;set flag
|
||
call pack ;pack table
|
||
nlist0:
|
||
call sprint
|
||
db cr,lf,'List of Shell Variables',0
|
||
lxi d,0 ;set count
|
||
call codend ;pt to list
|
||
;
|
||
; Main List Loop
|
||
;
|
||
nlist1:
|
||
mov a,m ;get next variable
|
||
cpi ctrlz ;done?
|
||
jz nlistx
|
||
;
|
||
; Print Next Element
|
||
;
|
||
xchg ;print number
|
||
inx h ;increment count
|
||
call scrlf
|
||
call shldc ;print
|
||
xchg ;DE contains count
|
||
call sprint
|
||
db ' Name: ',0
|
||
mvi b,8 ;8 chars in name
|
||
nlist2:
|
||
mov a,m ;get char
|
||
call sout ;print
|
||
inx h ;pt to next
|
||
dcr b ;count down
|
||
jnz nlist2
|
||
call sprint
|
||
db cr,lf,' >',0
|
||
nlist3:
|
||
mov a,m ;get char
|
||
inx h ;pt to next
|
||
ora a ;done?
|
||
jz nlist4 ;resume
|
||
call sout
|
||
jmp nlist3
|
||
nlist4:
|
||
call sprint
|
||
db '<',0
|
||
jmp nlist1
|
||
;
|
||
; Exit Listing
|
||
;
|
||
nlistx:
|
||
call scrlf ;new line
|
||
mov a,d ;check for none
|
||
ora e
|
||
jnz menu ;resume menu
|
||
call sprint
|
||
db ' -- No Shell Variables Defined --',cr,lf,0
|
||
jmp menu
|
||
|
||
;
|
||
; Add Names to Table
|
||
;
|
||
nadd:
|
||
call print
|
||
db cr,lf,'Enter Shell Variable Name (RETURN to Quit): ',0
|
||
mvi a,0ffh ;capitalize
|
||
call bbline
|
||
call sksp ;skip to first non-blank
|
||
ora a ;done?
|
||
jz menu ;resume menu
|
||
;
|
||
; Copy Input Name into Shell Buffer SHVAR
|
||
;
|
||
push h ;save ptr to name
|
||
lxi h,shvar ;init name buffer
|
||
mvi a,' ' ;space fill
|
||
mvi b,8 ;8 chars
|
||
call fillb
|
||
xchg ;pt to buffer in DE
|
||
pop h ;pt to name
|
||
mvi b,8 ;8 chars max
|
||
nadd1:
|
||
mov a,m ;get name char
|
||
ora a ;done?
|
||
jz nadd2
|
||
stax d ;store char
|
||
inx h ;pt to next
|
||
inx d
|
||
dcr b ;count down
|
||
jnz nadd1
|
||
;
|
||
; Search for Name
|
||
;
|
||
nadd2:
|
||
call codend ;pt to first element
|
||
;
|
||
; Check for End of Entries
|
||
;
|
||
nadd3:
|
||
mov a,m ;get first char of next string
|
||
cpi ctrlz
|
||
jz addit ;add name at HL
|
||
;
|
||
; Compare Names
|
||
;
|
||
lxi d,shvar ;pt to variable
|
||
mvi b,8 ;compare
|
||
shld curname ;save ptr to current name in case of delete
|
||
nadd4:
|
||
ldax d ;check for duplicate
|
||
cmp m
|
||
jnz nadd5
|
||
inx h ;pt to next
|
||
inx d
|
||
dcr b ;count down
|
||
jnz nadd4
|
||
jmp nadd6
|
||
;
|
||
; No Match, so Skip Rest of String
|
||
;
|
||
nadd5:
|
||
mov a,m ;skip to end of string
|
||
inx h ;pt to next
|
||
ora a ;done?
|
||
jnz nadd5
|
||
jmp nadd3 ;resume
|
||
;
|
||
; Match - Determine What User Wants to Do
|
||
;
|
||
nadd6:
|
||
call print
|
||
db cr,lf,' Shell Variable Name ',0
|
||
call prname ;print name
|
||
call print
|
||
db ' Found -'
|
||
db cr,lf,' Delete It (D)'
|
||
db cr,lf,' Redefine It (R)'
|
||
db cr,lf,' No Change (anything else)'
|
||
db cr,lf,'Option: ',0
|
||
call capine
|
||
cpi 'D' ;delete?
|
||
jz delete
|
||
cpi 'R' ;redefine?
|
||
jnz nadd ;restart if not
|
||
;
|
||
; Redefine Name
|
||
;
|
||
lhld curname ;pt to name in buffer
|
||
mvi b,8 ;space fill it
|
||
mvi a,' '
|
||
call fillb
|
||
jmp nadd3 ;resume in case another duplicate
|
||
;
|
||
; Delete Name
|
||
;
|
||
delete:
|
||
lhld curname ;pt to name in buffer
|
||
mvi b,8 ;space fill it
|
||
mvi a,' '
|
||
call fillb
|
||
jmp nadd ;restart
|
||
;
|
||
; Add Name
|
||
;
|
||
addit:
|
||
shld curname ;save ptr to new name
|
||
xchg ;dest in DE
|
||
lxi h,shvar ;pt to name
|
||
mvi b,8 ;8 chars
|
||
call hmovb ;copy name into buffer
|
||
xchg ;pt to after name with HL
|
||
push h ;save ptr
|
||
mvi m,0 ;store ending 0 and ^Z in case of abort
|
||
inx h
|
||
mvi m,ctrlz ;store ^Z
|
||
call print
|
||
db cr,lf,' Definition of ',0
|
||
call prname ;print name
|
||
call print
|
||
db ' (RETURN to Abort) -',cr,lf,'--> ',0
|
||
mvi a,0ffh ;caps
|
||
call bbline
|
||
pop d ;get destination
|
||
mov a,m ;no input?
|
||
ora a ;noadd if not
|
||
jz noadd
|
||
;
|
||
; Copy User Input into Buffer
|
||
;
|
||
addit1:
|
||
mov a,m ;get char
|
||
stax d ;put char
|
||
inx h ;pt to next
|
||
inx d
|
||
ora a ;done?
|
||
jnz addit1
|
||
mvi a,ctrlz ;mark end
|
||
stax d
|
||
jmp nadd
|
||
|
||
;
|
||
; Abort Add
|
||
;
|
||
noadd:
|
||
lhld curname ;pt to first char
|
||
mvi m,ctrlz ;mark end
|
||
jmp nadd
|
||
|
||
;
|
||
; Print Name of Shell Variable
|
||
;
|
||
prname:
|
||
push h ;save regs
|
||
push b
|
||
lxi h,shvar ;pt to name
|
||
mvi b,8 ;8 chars
|
||
prn1:
|
||
mov a,m ;get char
|
||
call cout
|
||
inx h ;pt to next
|
||
dcr b ;count down
|
||
jnz prn1
|
||
pop b ;restore
|
||
pop h
|
||
ret
|
||
|
||
;
|
||
; Command Table Scanner
|
||
;
|
||
tscan:
|
||
mov b,a ;save char in B
|
||
tscan1:
|
||
mov a,m ;end of table?
|
||
ora a
|
||
mov a,b ;prep for return
|
||
rz
|
||
mov a,m ;get table char
|
||
cmp b ;match?
|
||
jz tscan2
|
||
inx h ;pt to next entry
|
||
inx h
|
||
inx h
|
||
jmp tscan1
|
||
;
|
||
; Command Found - Run It
|
||
;
|
||
tscan2:
|
||
inx h ;get address
|
||
mov e,m
|
||
inx h
|
||
mov d,m
|
||
xchg ;address in HL
|
||
pop psw ;clear stack
|
||
pchl ;"run" command
|
||
;
|
||
; Command Table
|
||
;
|
||
ctable:
|
||
db 'E' ;enter
|
||
dw nadd
|
||
db 'L' ;list
|
||
dw nlist
|
||
db 'P' ;print
|
||
dw nprint
|
||
db 'X' ;exit
|
||
dw pack
|
||
db 'Q' ;quit
|
||
dw mquit
|
||
db 0 ;end of table
|
||
|
||
;
|
||
; Print Banner
|
||
;
|
||
banner:
|
||
call qprint
|
||
db 'SHDEFINE, Version '
|
||
db (version/10)+'0','.',(version mod 10)+'0'
|
||
db 0
|
||
ret
|
||
;
|
||
; Save Shell Variable List
|
||
; Return with Z if Error
|
||
;
|
||
varsave:
|
||
call print
|
||
db cr,lf,' Writing Shell Variables to Disk',0
|
||
lxi d,shvtmp ;open temp
|
||
call initfcb
|
||
call f$delete ;delete if any exists
|
||
call f$make ;create new file
|
||
inr a ;error?
|
||
rz
|
||
call codend ;pt to scratch area
|
||
;
|
||
; Save Loop
|
||
;
|
||
vars1:
|
||
lxi d,tbuff ;copy into buffer
|
||
mvi b,128 ;128 bytes
|
||
call hmovb
|
||
lxi d,shvtmp ;write block
|
||
call f$write
|
||
jnz werr ;write error
|
||
lxi d,tbuff ;check for done
|
||
mvi b,128 ;128 bytes
|
||
;
|
||
; Check for Done
|
||
;
|
||
vars2:
|
||
ldax d ;look for ^Z
|
||
cpi ctrlz
|
||
jz varsx
|
||
inx d ;pt to next
|
||
dcr b ;count down
|
||
jnz vars2
|
||
jmp vars1
|
||
;
|
||
; Done
|
||
;
|
||
varsx:
|
||
lxi d,shvtmp ;close temp file
|
||
call f$close
|
||
;
|
||
; Delete Old Backup File SH.BAK
|
||
;
|
||
if backup
|
||
;
|
||
lxi d,shvbak ;delete any old backups
|
||
call initfcb
|
||
call f$delete
|
||
;
|
||
; Create New Backup File SH.BAK=SH.VAR
|
||
;
|
||
lxi h,shvbak ;new name
|
||
lxi d,shvfcb ;old name
|
||
call f$rename ;create backup file
|
||
;
|
||
else
|
||
;
|
||
; Erase Original File
|
||
;
|
||
lxi d,shvfcb ;delete file
|
||
call initfcb
|
||
call f$delete
|
||
;
|
||
endif ;backup
|
||
;
|
||
; Create New Shell Variable File SH.VAR=SH.$$$
|
||
;
|
||
lxi h,shvfcb ;new name
|
||
lxi d,shvtmp ;old name
|
||
call f$rename ;create new file
|
||
xra a ;return OK
|
||
dcr a ;NZ
|
||
ret
|
||
;
|
||
; File Write Error
|
||
;
|
||
werr:
|
||
call print
|
||
db cr,lf,'Error in Writing File - Aborting',0
|
||
xra a ;error code
|
||
ret
|
||
|
||
;
|
||
; Load Shell Variable List
|
||
; Return with Z if Error
|
||
;
|
||
varload:
|
||
;
|
||
; Look for Variable File
|
||
;
|
||
call root ;determine DU of root
|
||
call logud ;goto root
|
||
call codend ;pt to scratch area
|
||
mvi m,ctrlz ;prep for no file
|
||
lxi d,shvfcb ;try to open file
|
||
call initfcb ;init FCB
|
||
call f$open
|
||
rnz ;file not found
|
||
;
|
||
; Read in Variable File
|
||
;
|
||
varl1:
|
||
lxi d,shvfcb ;read in file
|
||
call f$read
|
||
jnz varl2
|
||
lxi d,tbuff ;pt to data
|
||
xchg ;copy into memory
|
||
mvi b,128 ;128 bytes
|
||
call hmovb
|
||
xchg
|
||
jmp varl1
|
||
varl2:
|
||
lxi d,shvfcb ;close file
|
||
call f$close
|
||
;
|
||
; Say List is Already Loaded
|
||
;
|
||
xra a ;return NZ for OK
|
||
dcr a
|
||
ret
|
||
|
||
;
|
||
; Buffers
|
||
;
|
||
curname:
|
||
ds 2 ;ptr to current variable name
|
||
shvar:
|
||
ds 8 ;shell variable name
|
||
deftype:
|
||
db 'VAR' ;default file type
|
||
;
|
||
if backup
|
||
shvbak:
|
||
db 0
|
||
db 'SH ' ;name of shell variable file
|
||
db 'BAK'
|
||
ds 24 ;36 bytes total
|
||
endif ;backup
|
||
;
|
||
shvtmp:
|
||
db 0
|
||
db 'SH ' ;name of shell variable file
|
||
db '$$$'
|
||
ds 24 ;36 bytes total
|
||
shvfcb:
|
||
db 0
|
||
db 'SH ' ;name of shell variable file
|
||
db 'VAR'
|
||
ds 24 ;36 bytes total
|
||
|
||
end
|
||
|