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.
659 lines
11 KiB
659 lines
11 KiB
;
|
|
; 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
|
|
|