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

432 lines
7.9 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: 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