mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:13:13 -06:00
514 lines
9.4 KiB
Plaintext
514 lines
9.4 KiB
Plaintext
;
|
||
; Program: ALIAS1
|
||
; Author: Richard Conn
|
||
; Version: 1.1
|
||
; Date: 10 June 84
|
||
; Previous Versions: 1.0 (5 Mar 84)
|
||
;
|
||
version equ 11
|
||
|
||
;
|
||
; The purpose of ALIAS1 is to load the Command Line Buffer with
|
||
; a command line stored within ALIAS1, extracting parameters using the
|
||
; SUBMIT file convention ($n) as they are referenced in the new command
|
||
; line. Upon successful build, ALIAS1 runs the new command line by simply
|
||
; returning to ZCPR3.
|
||
;
|
||
|
||
;
|
||
; Macros
|
||
;
|
||
MACLIB Z3BASE.LIB
|
||
|
||
;
|
||
; Basic Equates
|
||
;
|
||
tbuff equ 80h
|
||
|
||
;
|
||
; External References
|
||
;
|
||
ext z3init,getefcb,getcl1,getenv,getfn2
|
||
ext eprint,codend,sksp,retud,caps
|
||
|
||
;
|
||
; 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 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 Env and the VLIB Env
|
||
jmp start1 ;skip command line buffer
|
||
;
|
||
; ALIAS ID at START+9
|
||
;
|
||
db 'Z3 ALIAS'
|
||
;
|
||
; Internal Command Line Buffer
|
||
; This buffer address can be determined from START+17, where the
|
||
; value of START is obtained from the 2nd and 3rd bytes of ALIAS1.
|
||
;
|
||
clbuf:
|
||
db 0 ;set to empty
|
||
ds 255 ;allow 256 bytes
|
||
;
|
||
; Resume ALIAS1
|
||
;
|
||
start1:
|
||
call codend ;pt to free space in which to build new line
|
||
lxi d,clbuf ;pt to buffer
|
||
xchg ;HL pts to target line, DE pts to buffer
|
||
;
|
||
; Process Next Char from Target Command Line
|
||
;
|
||
nxtchar:
|
||
mov a,m ;get next char
|
||
ora a ;end of line?
|
||
jz done
|
||
cpi '$' ;possible passed parameter?
|
||
jz param
|
||
stax d ;store next char
|
||
inx h ;pt to next
|
||
inx d
|
||
jmp nxtchar
|
||
;
|
||
; Process Possible Parameter
|
||
;
|
||
param:
|
||
lxi b,nxtchar ;establish return address
|
||
push b ;... on stack
|
||
inx h ;get parameter char
|
||
mov a,m
|
||
call caps ;capitalize
|
||
cpi '*' ;entire tail?
|
||
jz paraml
|
||
cpi 'D' ;current disk?
|
||
jz paramd
|
||
cpi 'U' ;current user?
|
||
jz paramu
|
||
cpi 'F' ;System Filename.Typ?
|
||
jz paramf
|
||
cpi 'N' ;System Filename?
|
||
jz paramn
|
||
; cpi 'T' ;System Typ?
|
||
; jz paramt
|
||
sui '0' ;convert
|
||
jc noparam
|
||
cpi 10 ;range?
|
||
jnc noparam
|
||
ora a ;parameter 0 = original name
|
||
jz oname
|
||
mov b,a ;count in B (1 or more)
|
||
inx h ;pt to next char
|
||
push h ;save ptr
|
||
lxi h,tbuff+1 ;pt to input line
|
||
;
|
||
; Advance to Desired Parameter
|
||
;
|
||
param1:
|
||
call sksp ;skip to non-blank
|
||
mov a,m ;check for done
|
||
ora a
|
||
jz paramx
|
||
dcr b ;count down
|
||
jz param3 ;got it
|
||
;
|
||
; Skip Over This Parameter
|
||
;
|
||
param2:
|
||
mov a,m ;skip to space or EOL
|
||
inx h ;pt to next
|
||
cpi ' ' ;space
|
||
jz param1
|
||
ora a ;EOL
|
||
jz paramx
|
||
jmp param2 ;continue
|
||
;
|
||
; Extract Parameter Into Target Buffer
|
||
;
|
||
param3:
|
||
mov a,m ;get char
|
||
cpi ' '+1 ;done?
|
||
jc paramx
|
||
stax d ;store char
|
||
inx h ;advance
|
||
inx d
|
||
jmp param3
|
||
;
|
||
; Resume Processing of Target Command
|
||
;
|
||
paramx:
|
||
pop h ;restore ptr to next char
|
||
ret ;resume at next char
|
||
;
|
||
; Parameter is for System Filename.typ
|
||
;
|
||
paramf:
|
||
call getfnum ;get file number
|
||
rz ;resume if error
|
||
push h ;save ptr to next char
|
||
call ptfn ;set ptr to file name
|
||
call putn ;put file name
|
||
mvi a,'.' ;dot
|
||
stax d
|
||
inx d
|
||
call putt ;put file type
|
||
pop h ;restore ptr
|
||
ret
|
||
;
|
||
; Parameter is for System Filename
|
||
;
|
||
paramn:
|
||
call getfnum ;get file number
|
||
rz ;resume if error
|
||
push h ;save ptr to next char
|
||
call ptfn ;set ptr to file name
|
||
call putn ;put file name
|
||
pop h ;restore ptr
|
||
ret
|
||
;
|
||
; Parameter is for System Typ
|
||
;
|
||
;paramt:
|
||
; call getfnum ;get file number
|
||
; jz nxtchar ;resume if error
|
||
; push h ;save ptr to next char
|
||
; call ptfn ;set ptr to file name
|
||
; mvi a,8 ;add 8 to get to file type
|
||
; add l
|
||
; mov l,a
|
||
; mov a,h
|
||
; aci 0
|
||
; mov h,a
|
||
; call putt ;put file type
|
||
; pop h ;restore ptr
|
||
; jmp nxtchar
|
||
|
||
;
|
||
; Get File Number (1 to 4)
|
||
; If valid number, return with value in A and HL pting to next char
|
||
; If not valid, return with Z and HL pting to next char (the number)
|
||
;
|
||
getfnum:
|
||
inx h ;pt to number
|
||
mov a,m ;get char
|
||
sui '1' ;convert
|
||
jc getfne ;error if less
|
||
cpi 4 ;range?
|
||
jnc getfne ;error if more
|
||
inx h ;pt to next char
|
||
ret ;NZ from CPI 4
|
||
getfne:
|
||
xra a ;return Z
|
||
ret
|
||
;
|
||
; Pt to File Name whose Number (1-4) is in A
|
||
;
|
||
ptfn:
|
||
mov b,a ;number in B
|
||
call getfn2 ;pt to file name 2
|
||
push d ;save DE
|
||
mov a,b ;file 0?
|
||
ora a
|
||
jz ptfnx
|
||
lxi d,11 ;size of file name and type
|
||
ptfn1:
|
||
dad d ;pt to next
|
||
dcr b ;count down
|
||
jnz ptfn1
|
||
ptfnx:
|
||
pop d ;restore DE
|
||
ret
|
||
;
|
||
; Put File Name pted to by HL
|
||
;
|
||
putn:
|
||
mvi b,8 ;8 chars
|
||
jmp putc
|
||
;
|
||
; Put File Type pted to by HL
|
||
;
|
||
putt:
|
||
mvi b,3 ;3 chars
|
||
;
|
||
; Copy chars from HL to DE for up to 8 bytes - flush if space
|
||
;
|
||
putc:
|
||
mov a,m ;get next char
|
||
cpi ' ' ;skip spaces
|
||
jz putc1
|
||
stax d ;put next char
|
||
inx d ;pt to next
|
||
putc1:
|
||
inx h ;pt to next
|
||
dcr b ;count down
|
||
jnz putc
|
||
ret
|
||
;
|
||
; Parameter is for Disk Letter
|
||
;
|
||
paramd:
|
||
call retud ;get DU in BC
|
||
mov a,b ;get disk letter
|
||
adi 'A' ;convert to ASCII
|
||
stax d ;store char
|
||
inx d ;pt to next
|
||
inx h ;pt to next char
|
||
ret
|
||
;
|
||
; Parameter is for User Number
|
||
;
|
||
paramu:
|
||
call retud ;get DU in BC
|
||
mov a,c ;get user number
|
||
mvi b,10 ;compute 10's
|
||
mvi c,'0'
|
||
pmu1:
|
||
sub b ;subtract 10's
|
||
jc pmu2
|
||
inr c ;increment 10's
|
||
jmp pmu1
|
||
pmu2:
|
||
add b ;add B back in
|
||
adi '0' ;convert to ASCII
|
||
mov b,a ;10's in C, 1's in B
|
||
mov a,c
|
||
cpi '0' ;no leading 0's
|
||
jz pmu3
|
||
stax d ;store char
|
||
inx d ;pt to next
|
||
pmu3:
|
||
mov a,b ;get 1's
|
||
stax d ;store char
|
||
inx d ;pt to next
|
||
inx h ;pt to next char
|
||
ret
|
||
;
|
||
; Parameter is command line tail
|
||
;
|
||
paraml:
|
||
inx h ;pt to char after parameter letter
|
||
push h ;save ptr to parameter
|
||
lxi h,tbuff+1 ;pt to tail
|
||
paramt1:
|
||
mov a,m ;copy tail into line
|
||
ora a ;end of tail?
|
||
jz paramt2
|
||
stax d ;store char
|
||
inx h ;pt to next
|
||
inx d
|
||
jmp paramt1
|
||
paramt2:
|
||
pop h ;pt to next char in script
|
||
ret ;continue processing
|
||
;
|
||
; Form assumed to be $$
|
||
;
|
||
noparam:
|
||
mvi a,'$' ;store '$'
|
||
stax d
|
||
inx d ;pt to next chars
|
||
inx h
|
||
ret
|
||
;
|
||
; $0 - ALIAS Command Name
|
||
;
|
||
oname:
|
||
inx h ;pt to next char
|
||
push h ;save ptr
|
||
call getefcb ;pt to FCB
|
||
jz paramx ;skip if no external FCB
|
||
inx h ;pt to first char
|
||
mvi b,8 ;at most 8 chars
|
||
on1:
|
||
mov a,m ;copy into output line
|
||
cpi ' ' ;done if space
|
||
jz paramx
|
||
stax d ;store char
|
||
inx h ;pt to next
|
||
inx d
|
||
dcr b ;count down
|
||
jnz on1
|
||
jmp paramx
|
||
|
||
;
|
||
; Done -- Buffer is Loaded
|
||
;
|
||
done:
|
||
xra a ;store ending 0
|
||
stax d
|
||
call codend ;pt to buffer
|
||
mov a,m ;skip if empty line
|
||
ora a
|
||
rz
|
||
;
|
||
; Determine if ZCPR3 Environment Support is Available for Command Line
|
||
;
|
||
push h ;save ptr to line
|
||
call getenv ;get environment
|
||
mov a,h
|
||
ora l
|
||
jz done0
|
||
;
|
||
; Get environment from descriptor
|
||
;
|
||
call getcl1 ;get command line data
|
||
mov b,a ;save char count
|
||
mov a,h ;check for no command line
|
||
ora l
|
||
jz done0
|
||
mov a,b ;restore char count
|
||
ora a ;check for no chars
|
||
jnz done1
|
||
;
|
||
; Get environment from MACRO File
|
||
;
|
||
done0:
|
||
lxi h,z3cl ;pt to command line from macro expansion
|
||
mvi a,z3cls ;get size of command line
|
||
;
|
||
; Store Command Line
|
||
;
|
||
done1:
|
||
pop d ;DE pts to line
|
||
call putcl ;store in command line
|
||
rnz ;return to ZCPR3 for processing if OK
|
||
call eprint
|
||
db 'Ovfl',0
|
||
ret
|
||
;
|
||
; PUTCL stores a command line in the ZCPR3 command line buffer.
|
||
; This command line is pted to by DE. CL Buffer is pted to by HL.
|
||
; Size in A. On return, A=0 and Zero
|
||
; Flag Set if command line overflow is possible (no change to command line).
|
||
;
|
||
putcl:
|
||
shld clbfr ;save ptr to command line buffer
|
||
ora a ;any command line?
|
||
jz nocl
|
||
mov b,a ;char count in B
|
||
xchg ;HL pts to new line
|
||
push h ;save ptr to new line
|
||
pcl2:
|
||
mov a,m ;go to end of line
|
||
ora a ;at end?
|
||
jz pcl3
|
||
inx h ;pt to next
|
||
dcr b ;count down
|
||
jnz pcl2
|
||
pop h ;clear stack
|
||
;
|
||
; Command Line Buffer Overflow
|
||
;
|
||
nocl:
|
||
xra a ;error return
|
||
ret
|
||
;
|
||
; At End of New Command Line (ptr on stack)
|
||
; Ptr to first char of new command line on stack
|
||
; HL pts to ending 0 of new command line
|
||
; B = number of chars remaining before overflow of Z3 command line
|
||
;
|
||
pcl3:
|
||
push h ;save ptr to last byte in case of error
|
||
lhld clbfr ;pt to tail of command line
|
||
mov e,m
|
||
inx h
|
||
mov d,m
|
||
xchg ;HL pts to command line tail
|
||
pop d ;restore ptr to last byte of command line
|
||
push d
|
||
mov a,m ;get first char of tail
|
||
cpi ';' ;continuation?
|
||
jz pcl4
|
||
ora a ;done?
|
||
jz pcl4
|
||
mvi a,';' ;set continuation char
|
||
stax d
|
||
inx d
|
||
dcr b ;count down
|
||
jz pcl5 ;overflow
|
||
;
|
||
; Copy tail onto end of new command line
|
||
;
|
||
pcl4:
|
||
mov a,m ;get next char
|
||
stax d ;store it
|
||
inx h ;pt to next
|
||
inx d
|
||
ora a ;done?
|
||
jz pcl6
|
||
dcr b ;count down
|
||
jnz pcl4
|
||
;
|
||
; Command Line too Long
|
||
;
|
||
pcl5:
|
||
pop h ;get ptr to end of old line
|
||
mvi m,0 ;store ending 0
|
||
pop psw ;clear stack
|
||
jmp nocl
|
||
;
|
||
; New Command Line OK
|
||
;
|
||
pcl6:
|
||
pop psw ;clear stack
|
||
lhld clbfr ;pt to command line buffer
|
||
lxi d,4 ;pt to first char in buffer
|
||
xchg
|
||
dad d
|
||
xchg
|
||
mov m,e ;store address
|
||
inx h
|
||
mov m,d ;DE pts to first char of buffer
|
||
pop h ;HL pts to first char of new line
|
||
;
|
||
; Copy New Command Line into Buffer
|
||
;
|
||
pcl7:
|
||
mov a,m ;copy
|
||
stax d
|
||
inx h
|
||
inx d
|
||
ora a ;EOL?
|
||
jnz pcl7
|
||
;
|
||
; Exit with OK Code
|
||
;
|
||
xra a ;set NZ
|
||
dcr a
|
||
ret
|
||
|
||
;
|
||
; Buffers
|
||
;
|
||
clbfr:
|
||
ds 2 ;ptr to command line
|
||
|
||
end
|
||
|
||
|