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.
432 lines
7.9 KiB
432 lines
7.9 KiB
;
|
|
; Program: ALIAS0
|
|
; Author: Richard Conn
|
|
; Version: 1.1
|
|
; Date: 10 Jun 84
|
|
; Previous Versions: 1.0 (5 Mar 84)
|
|
;
|
|
version equ 11
|
|
|
|
;
|
|
; The purpose of ALIAS0 is to create aliases using the ALIAS1
|
|
; program.
|
|
;
|
|
|
|
;
|
|
; Environment Definition
|
|
;
|
|
MACLIB Z3BASE.LIB
|
|
|
|
;
|
|
; Basic Equates
|
|
;
|
|
buffer equ 4000h ;1K (approx) buffer
|
|
tbuff equ 80h
|
|
fcb equ 5ch
|
|
cr equ 0dh
|
|
lf equ 0ah
|
|
|
|
;
|
|
; External References
|
|
;
|
|
ext $memry
|
|
ext z3init,qprint,getwhl
|
|
ext print,sksp,bbline,capine,crlf,pfn1,retud,logud,padc
|
|
ext hmovb,sfa,cout,ccout,pstr,zfname
|
|
ext f$open,f$read,f$close,f$make,f$delete,f$write,f$exist,initfcb
|
|
|
|
;
|
|
; Key Equates for Address Definition of Environment
|
|
;
|
|
envdefn equ 103H ;Beginning of Environment Definition
|
|
envclas equ 108H ;Address of Environment Descriptor Class
|
|
|
|
;
|
|
; 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
|
|
;
|
|
; Print Banner
|
|
;
|
|
call qprint
|
|
db 'ALIAS, Version '
|
|
db (version/10)+'0','.',(version mod 10)+'0',0
|
|
;
|
|
; Check for File
|
|
;
|
|
xra a
|
|
sta flflag ;clear file loaded flag
|
|
lxi h,fcb+1 ;pt to file name
|
|
mov a,m ;get first char
|
|
cpi ' ' ;no name if space
|
|
jz create ;create an alias if no name
|
|
cpi '/' ;help?
|
|
jnz start0
|
|
;
|
|
; Help Message
|
|
;
|
|
call print
|
|
db cr,lf,'ALIAS -- Create Alias Commands'
|
|
db cr,lf,'Syntax:'
|
|
db cr,lf,' ALIAS <-- Define New Command'
|
|
db cr,lf,'or'
|
|
db cr,lf,' ALIAS dir:cmndname <-- Redefine Old Command'
|
|
db 0
|
|
ret
|
|
|
|
;
|
|
; Load ALIAS File
|
|
;
|
|
start0:
|
|
call setcom ;set file type of file in FCB to COM if not already
|
|
call retud ;get current DU in BC
|
|
dcx h ;pt to disk
|
|
mov a,m ;get disk
|
|
ora a ;no current disk?
|
|
jz start1 ;use current disk
|
|
dcr a ;set disk (A=0)
|
|
mov b,a
|
|
start1:
|
|
mvi m,0 ;set current disk
|
|
lxi d,13 ;pt to user number
|
|
push h ;save ptr to FCB
|
|
dad d ;pt to user
|
|
mov c,m ;get user
|
|
pop d ;pt to FCB
|
|
call logud ;log into dir in BC
|
|
lxi h,buffer ;pt to file storage buffer
|
|
call f$open ;open alias file for input
|
|
jz load ;load file
|
|
call print
|
|
db cr,lf,' Alias File ',0
|
|
inx d ;pt to file name
|
|
call pfn1 ;print it
|
|
call print
|
|
db ' Not Found',0
|
|
ret
|
|
;
|
|
; Load Alias File
|
|
;
|
|
load:
|
|
lxi h,buffer ;pt to load buffer
|
|
mvi c,9 ;set block count
|
|
load1:
|
|
lxi d,fcb ;pt to FCB
|
|
call f$read ;read next block
|
|
jnz load2
|
|
lxi d,tbuff ;pt to buffer
|
|
xchg
|
|
mvi b,128 ;128 bytes
|
|
call hmovb
|
|
xchg ;DE pts to next block
|
|
dcr c ;count down
|
|
jnz load1
|
|
;
|
|
; Error - Not an Alias File
|
|
;
|
|
noalias:
|
|
call print
|
|
db cr,lf,' File ',0
|
|
lxi d,fcb+1
|
|
call pfn1
|
|
call print
|
|
db ' is Not an Alias',0
|
|
ret
|
|
;
|
|
; Load Complete - Check for Alias File Structure
|
|
;
|
|
load2:
|
|
call f$close ;close input file
|
|
lhld buffer+1 ;get address of START
|
|
lxi d,buffer-100H
|
|
dad d ;pt to actual address
|
|
lxi d,9 ;skip to ALIAS ID
|
|
dad d
|
|
lxi d,aliasid ;compare
|
|
mvi b,8 ;8 chars
|
|
acheck:
|
|
ldax d ;get char
|
|
cmp m ;compare
|
|
jnz noalias
|
|
inx h ;pt to next
|
|
inx d
|
|
dcr b ;count down
|
|
jnz acheck
|
|
shld oldaline ;save ptr to old alias command line
|
|
mvi a,0ffh ;set file loaded flag
|
|
sta flflag
|
|
;
|
|
; Create New Alias
|
|
;
|
|
create:
|
|
lda flflag ;check for file loaded
|
|
ora a ;0 if not
|
|
jz cr1
|
|
;
|
|
; Display Data on Old Alias
|
|
;
|
|
call print
|
|
db cr,lf,' Alias Name: ',0
|
|
lxi h,fcb+1 ;pt to name
|
|
mvi b,8 ;8 chars
|
|
cr0:
|
|
mov a,m ;print name
|
|
call cout
|
|
inx h ;pt to next char
|
|
dcr b ;count down
|
|
jnz cr0
|
|
call print
|
|
db cr,lf,' Old Alias Command Line:',0
|
|
lhld oldaline
|
|
mvi b,1 ;set line count
|
|
cr0a:
|
|
mov a,m ;check for done
|
|
ora a
|
|
jz cr1
|
|
call crlf ;new line
|
|
mov a,b ;print line number
|
|
call padc
|
|
inr b ;increment count
|
|
call print ;print prompt
|
|
db ' --> ',0
|
|
cr0b:
|
|
mov a,m ;get char
|
|
ora a
|
|
jz cr1
|
|
call ccout ;print char with control char processing
|
|
inx h ;pt to next
|
|
cpi ';' ;next logical line?
|
|
jz cr0a
|
|
jmp cr0b
|
|
|
|
;
|
|
; Input Alias Command from User
|
|
;
|
|
cr1:
|
|
call getwhl ;get wheel byte
|
|
jnz cr1a
|
|
call print
|
|
db cr,lf,' Modification of Alias Not Permitted',0
|
|
ret
|
|
;
|
|
; Input Alias from User
|
|
;
|
|
cr1a:
|
|
call print
|
|
db cr,lf
|
|
db cr,lf,' Input Alias (RETURN to Abort)',cr,lf,' --> ',0
|
|
mvi a,0ffh ;input line from user
|
|
call bbline
|
|
call sksp ;skip to non-blank
|
|
mov a,m ;get char
|
|
ora a ;any input?
|
|
rz
|
|
push h ;save ptr
|
|
;
|
|
; Set Buffers in New Alias to Reflect the ALIAS0 Buffers
|
|
;
|
|
call codend ;pt to new alias
|
|
inx h ;pt to start of buffers
|
|
inx h
|
|
inx h
|
|
lxi d,envdefn ;pt to environment definition
|
|
mvi b,8 ;prepare to copy 8 bytes for class 1
|
|
; bytes are: DB 'Z3ENV',1
|
|
; DW envaddr
|
|
lda envclas ;get code for class of alias
|
|
cpi 1 ;class 1 is address of Env Desc only
|
|
jz cr1b
|
|
mvi b,100H-3 ;prepare to copy an entire env desc
|
|
;
|
|
; Copy the Buffers Over
|
|
;
|
|
cr1b:
|
|
ldax d ;copy environment definition into new alias
|
|
mov m,a
|
|
inx h ;advance
|
|
inx d
|
|
dcr b ;count down
|
|
jnz cr1b
|
|
;
|
|
; Prep to Copy New Command Into Alias
|
|
;
|
|
call codend ;pt to new alias command buffer
|
|
inx h
|
|
mov e,m ;get address of START
|
|
inx h
|
|
mov d,m
|
|
lxi h,17 ;pt to buffer at START+17
|
|
dad d
|
|
lxi d,-100H ;compute offset
|
|
dad d ;HL contains offset
|
|
xchg
|
|
call codend
|
|
dad d ;HL pts to absolute address
|
|
mvi b,255 ;check for overflow (max number of chars)
|
|
pop d ;pt to new command
|
|
;
|
|
; Copy New Command into ALIAS File
|
|
;
|
|
cr2:
|
|
ldax d ;get char
|
|
mov m,a ;put char
|
|
ora a ;done?
|
|
jz cr3
|
|
inx h ;pt to next
|
|
inx d
|
|
dcr b ;count down
|
|
jnz cr2
|
|
call print
|
|
db cr,lf,' Command Too Long for Buffer - Reenter',0
|
|
jmp create
|
|
;
|
|
; ALIAS Command Line Copied
|
|
;
|
|
cr3:
|
|
lda flflag ;file loaded?
|
|
ora a ;0=no
|
|
jnz write
|
|
call print
|
|
db cr,lf,' Name of ALIAS Command (RETURN to Abort)? ',0
|
|
mvi a,0ffh ;capitalize
|
|
call bbline
|
|
call sksp ;skip to non-blank
|
|
mov a,m
|
|
ora a
|
|
jz create
|
|
lxi d,fcb ;pt to FCB
|
|
call zfname ;convert and place in FCB
|
|
call setcom ;set file type to COM if not already
|
|
call retud ;get current DU
|
|
lda fcb ;get disk
|
|
ora a ;default?
|
|
jz cr4
|
|
dcr a ;disk A = 0
|
|
mov b,a
|
|
cr4:
|
|
lda fcb+13 ;get user
|
|
mov c,a
|
|
call logud
|
|
;
|
|
; Write File whose Name is in FCB
|
|
;
|
|
write:
|
|
lxi d,fcb ;check for file
|
|
call initfcb ;clear FCB
|
|
call f$exist ;check for existence
|
|
jz write1
|
|
call print
|
|
db cr,lf,' File ',0
|
|
lxi d,fcb+1
|
|
call pfn1
|
|
call print
|
|
db ' Exists - Overwrite (Y/N)? ',0
|
|
call capine
|
|
call crlf
|
|
cpi 'Y'
|
|
rnz ;abort if not Y
|
|
lxi d,fcb ;clear file attributes
|
|
xra a
|
|
call sfa ;set file attributes to R/W DIR
|
|
call f$delete ;delete file
|
|
;
|
|
; Create New File
|
|
;
|
|
write1:
|
|
lxi d,fcb ;pt to FCB
|
|
call initfcb ;init it
|
|
call f$make ;create file
|
|
mvi c,8 ;8 sectors
|
|
call codend ;pt to file
|
|
write2:
|
|
lxi d,tbuff ;copy sector into buffer
|
|
mvi b,128 ;128 bytes
|
|
call hmovb
|
|
lxi d,fcb ;write block
|
|
call f$write
|
|
jnz werr
|
|
dcr c ;count down
|
|
jnz write2
|
|
call f$close ;close file
|
|
call print
|
|
db cr,lf,' Alias Created',0
|
|
ret
|
|
werr:
|
|
call print
|
|
db cr,lf,' Error in Creating File',0
|
|
ret
|
|
|
|
;
|
|
; Determine End of Code to Nearest 128 bytes
|
|
;
|
|
codend:
|
|
push d
|
|
lhld $memry ;get next available byte
|
|
mov a,l ;get low
|
|
ani 80h ;set MSB
|
|
mov l,a
|
|
lxi d,128 ;next 128 bytes
|
|
dad d
|
|
pop d
|
|
ret
|
|
|
|
;
|
|
; Set File Type of File in FCB to COM if Not Already Set
|
|
;
|
|
setcom:
|
|
lda fcb+9 ;get first char of file type
|
|
cpi ' '
|
|
rnz
|
|
push h
|
|
push d
|
|
push b
|
|
lxi h,comtyp ;set COM type
|
|
lxi d,fcb+9 ;copy into file type
|
|
mvi b,3 ;3 bytes
|
|
call hmovb
|
|
pop b
|
|
pop d
|
|
pop h
|
|
ret
|
|
|
|
;
|
|
; Buffers
|
|
;
|
|
comtyp:
|
|
db 'COM' ;COM File Type
|
|
aliasid:
|
|
db 'Z3 ALIAS' ;ALIAS File ID
|
|
flflag:
|
|
ds 1 ;file loaded flag
|
|
oldaline:
|
|
ds 2 ;ptr to old alias line
|
|
|
|
end
|
|
|