Files
RomWBW/Source/Images/d_bp/u15/SHDEFINE.MAC
2020-01-03 20:42:06 -08:00

659 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;
; 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