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.
514 lines
9.4 KiB
514 lines
9.4 KiB
;
|
|
; 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
|
|
|
|
|