home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ZSYS
/
SIMTEL20
/
ZCPR3
/
ALIAS0.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
8KB
|
432 lines
;
; 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