Files
RomWBW/Source/Images/hd0/s0/u15/ALIAS1.MAC
2016-09-30 18:07:16 -07:00

514 lines
9.4 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: 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