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
/
LDR.MQC
/
LDR.MAC
Wrap
Text File
|
2000-06-30
|
13KB
|
606 lines
;
; PROGRAM: LDR
; AUTHOR: RICHARD CONN
; VERSION: 1.0
; DATE: 27 FEB 84
; PREVIOUS VERSIONS: 0.1 (3 Feb 84), 0.2 (22 Feb 84), 1.1 (28 Sep 84)
;
;VERSION EQU 10
;VERSION EQU 11 ; Version 1.1 by Joe Wright 28 Sept 84
; This version modified to allow loading the .ENV
; file the first time, when there is no environment
; descriptor in memory. The program now takes
; the environment address from the .ENV file so
; that subsequent files are also loaded correctly.
; ie. LDR SYS.ENV,SYS.RCP,etc. Note that .ENV must
; be the first declared file until LDR is installed
; to your environment. jww
VERSION EQU 12 ; Version 1.2 by Dave Lucky 31 Dec 84
; This version modified to correct exit regs from
; SDLOAD subroutine. The Source and Destination
; registers on entry were HL and DE, respectively.
; On exit, they were DE and HL. The calling routine
; (SETDATA) went amuck when calculating number of NDR
; records using bogus DE. Also, corrected the SETDATA
; routine from using the incorrect address of the NDR
; entry size field as well as its contents acquired
; from the GETNDR routine.
EXTENV EQU 1 ; 1 for External Environ, 0 for Internal Environ
;
; LDR is a general-purpose package loader for ZCPR3. It is
; invoked by the following form:
;
; LDR <list of packages>
;
; For example:
; LDR DEFAULT.RCP,SYSIO.IOP
;
; No default file types are assumed on the list of packages, and
; each package specified must be unambigous and have a type of RCP or IOP
; (for Resident Command Package or Input/Output Package). LDR
; checks to make sure that the files are valid packages and then loads
; them into memory at the correct locations, checking for package boundary
; overflow.
;
;
;
; ZCPR3 Header
;
MACLIB Z3BASE.LIB
;
; System Equates
;
bdos equ 5
fcb equ 5ch
tbuff equ 80h
rcpflg equ 1 ; package type is RCP
iopflg equ 2 ; package type is IOP
fcpflg equ 3 ; package type is FCP
ndrflg equ 4 ; package type is NDR
envflg equ 5 ; package type is ENV
tcapflg equ 6 ; package type is Z3T
cr equ 0dh
lf equ 0ah
ext z3init,envptr
ext retud,getud,putud,logud
ext getrcp,getfcp,getiop,getndr
ext f$open,f$close,f$read
ext print,pfn2
ext hmovb,moveb,fillb
ext cline,sksp,zfname
;
; Environments
;
origin:
;
if extenv ; if external environment ...
;
; External Environment Definition
;
jmp z3ldr
db 'Z3ENV' ; this is an environment
db 1 ; class 1 environment (external)
envloc:
dw z3env ; ptr to environment
z3ldr:
lhld envloc ; HL pts to environment
else ; if internal environment ...
;
; Internal Environment Definition
;
MACLIB SYSENV.LIB
envloc:
jmp z3ldr
SYSENV ; define environment
z3ldr:
lxi h,envloc ; HL pts to environment
endif
;
; Beginning of LDR
;
call z3init ; initialize environment pointer
call banner ; print banner
lxi h,tbuff ; pt to command line
call cline ; save command line as string
call sksp ; skip over spaces
mov a,m ; get offending char
cpi '/' ; help?
jz help
ora a ; help?
jz help
;
; Main Loop - HL pts to next file name in list
;
z3ldr1:
lxi d,fcb ; pt to fcb
call zfname ; extract file name and data
inx d ; pt to file name
call print
db cr,lf,' Loading ',0
call pfn2 ; print file name
push h ; save ptr
call pkload ; load file
pop h ; get ptr
mov a,m ; get char
inx h ; pt to next char
cpi ',' ; another file in list?
jz z3ldr1
ret
;
; Print Help Message
;
help:
call print
db cr,lf,' LDR Syntax:'
db cr,lf,' LDR <list of packages/data files>'
db cr,lf,' where entries in the list may be any of these types:'
db cr,lf
db cr,lf,' FCP - Flow Cmnd Package ENV - Z3 Environ'
db cr,lf,' IOP - Input/Output Package NDR - Z3 Named Dir'
db cr,lf,' RCP - Resident Cmnd Package Z3T - Z3TCAP Entry'
db cr,lf,lf,' The ENV file must be first if LDR is not installed.'
db cr,lf,0
ret
;
; Load package named in FCB
;
pkload:
call setdata ; load data buffers from environment in case of change
call cktype ; check for valid file type
jz typerr ; abort if error
call open ; open file, read in first block, check for valid
jz getud ; abort if error
; Check if ENV. If so, get Z3ENV and call z3init
push h ; save package pointer from cktype
lxi d,fcb+9 ; fcb type
lxi h,envtyp ; ENV?
call comptyp ; compare types
pop h ; get package pointer
jnz pkld ; not ENV, proceed normally
;
; File type is ENV. Get Z3ENV address from file and re-initialize
;
lxi h,tbuff ; first sector in tbuff
lxi d,1bh ; offset to Z3ENV
dad d ; point hl to it
mov e,m ; get Z3ENV
inx h
mov d,m ; got it
xchg ; in hl
call z3init ; set new environment
pkld: call load ; load package into memory at correct location
call close ; close up process
call getud ; return home
;
; Check for IOP and return if not
;
lda pktype ; init package if IOP
cpi iopflg
rnz
;
; Init IOP
;
lhld packadr ; get address
lxi d,9 ; 4th JMP into it
dad d
push h ; address on stack
ret ; "CALL" routine and return to OS
;
; Load Data Buffers from Environment
;
setdata:
lhld envptr ; get environment descriptor address
shld envadr
lxi d,80H ; pt to Z3TCAP
dad d
shld tcapadr
call getrcp ; get RCP data
lxi d,rcpdata ; load
call sdload
call getiop ; get IOP data
lxi d,iopdata ; load
call sdload
call getfcp ; get FCP data
lxi d,fcpdata ; load
call sdload
lxi h,ndridat ; init NDR data in case no entry
lxi d,ndrdata
mvi b,9 ; 9 bytes (1-jmp, 5-ID, 2-adr, 1-size)
call moveb
call getndr ; get NDR data
mov b,a ; save entry count ;1284DL
mov a,h ; no NDR data?
ora l
rz
mov a,b ; restore entry count ;1284DL
call sdload ; with DE -> ndrdata ;1284DL
push d ; save ptr to entry count ;1284DL
mvi h,0 ; HL = value
mov l,a ; A = entry count
dad h ; *2
mov d,h ; DE = value * 2
mov e,l
dad h ; *4
dad h ; *8
dad h ; *16
dad d ; *18
mov a,h ; /128
rlc
ani 0feh
mov h,a
mov a,l
rlc
ani 1
ora h ; A = value * 18 / 128
inr a ; +1
pop d ; get ptr
stax d ; save value
ret
;
; Load 3 bytes pted to by HL into memory pted to by DE+6
;
; Input Regs: ;1284DL
; HL = Source ;1284DL
; DE = Destination ;1284DL
; ;1284DL
; Output Regs: ;1284DL
; HL = Source ;1284DL
; DE = Destination+8 ;1284DL
; ;1284DL
sdload:
push h ; save ptr to data
lxi h,6 ; add 6 to DE to pt to proper buffer
dad d ; HL pts to buffer
pop d ; DE contains address
mov m,e ; store address
inx h
mov m,d
inx h
mov m,a ; store size data
xchg ; swap Source / Destination regs ;1284DL
ret
;
; Print Banner
;
banner:
call print
db cr,lf,'ZCPR3 LDR, Version '
db (VERSION/10)+'0','.',(VERSION MOD 10)+'0',0
ret
;
; Check for Valid Package File Type
; Return with Zero Flag Set if error
; If validated, PKTYPE contains package type and HL pts to data
;
cktype:
lxi d,fcb+9 ; pt to file type
lxi h,rcptyp ; see if RCP
mvi b,rcpflg ; RCP code
call comptyp ; compare
jz cktok ; OK if match
lxi h,ioptyp ; see if IOP
mvi b,iopflg ; IOP code
call comptyp ; compare
jz cktok ; OK if match
lxi h,fcptyp ; see if FCP
mvi b,fcpflg ; FCP code
call comptyp ; compare
jz cktok ; OK if match
lxi h,ndrtyp ; see if NDR
mvi b,ndrflg ; NDR code
call comptyp ; compare
jz cktok ; OK if match
lxi h,envtyp ; see if ENV
mvi b,envflg ; ENV code
call comptyp ; compare
jz cktok ; OK if match
lxi h,tcaptyp ; see if Z3TCAP
mvi b,tcapflg ; Z3T code
call comptyp ; compare
jz cktok
mvi b,0 ; invalid type
cktok:
mov a,b ; set package type
sta pktype
ora a ; set NZ if no error
ret
comptyp:
push d ; save regs
push b
mvi b,3 ; 3 bytes
compt1:
ldax d ; get FCB char
ani 7fh ; mask
cmp m ; compare
jnz compt2
inx h ; pt to next
inx d
dcr b ; count down
jnz compt1
compt2:
pop b ; restore regs
pop d
ret
typerr:
call prf ; print file name and string
db ' is not a Valid Type',0
ret
;
; Open File and Load First Block into TBUFF
; Validate Package Structure and Return with Zero Flag Set if Error
; On input, HL pts to data buffer
; If no error, HL points to load address and B is number of 128-byte
; pages allowed in buffer
;
open:
call putud ; save location
call retud ; get UD in BC
lda fcb ; get disk
ora a ; default?
jz open0
mov b,a ; disk in B (A=1)
dcr b ; adjust to A=0
open0:
lda fcb+13 ; get user
mov c,a ; user in C
call logud ; log into UD
xra a ; clear disk
sta fcb
;
; Disallow Ambiguous File Name
;
call ambchk ; check for ambiguous file name
jz amberr ; abort if any ambiguity
;
; Open File
;
lxi d,fcb ; pt to FCB
call f$open ; open file
jnz fnferr ; abort if file not found
;
; Read First 128-byte Block
;
call f$read ; read in first block
jnz fempty ; abort if file empty
;
; Validate Package
; Package Data Area is structured as follows:
; DB numjmps ; number of jumps at beginning of package
; DB 'Z3xxx' ; package ID (always 5 chars)
; DW address ; address of memory buffer
; DB size ; number of 128-byte blocks in memory buffer
;
xchg ; DE pts to package data
ldax d ; get number of jumps
inx d ; pt to package ID
mov b,a ; jump count in B
;
; Validate Package - MUST have proper number of JMPs
;
lxi h,tbuff ; check jumps
open1:
mov a,b ; at limit of jumps?
ora a
jz open2
dcr b ; count down
mov a,m ; check for JMP
cpi 0C3H ; JMP?
jnz strerr ; structure error
inx h ; pt to next
inx h
inx h
jmp open1
;
; Check Package ID - must match
;
open2:
mvi b,5 ; check package ID
open3:
ldax d ; get byte
cpi ' ' ; no ID if space
jz open4
cmp m ; check
jnz strerr ; structure error
open4:
inx d ; pt to next
inx h
dcr b ; count down
jnz open3
;
; Extract Package Address
;
ldax d ; get low-order address
mov l,a ; put in HL
inx d
ldax d ; get high-order address
mov h,a
inx d
;
; Check for Valid Package Address
;
mov a,h ; must not be zero
ora l
jz adrerr
;
; Extract 128-byte Block Count
;
ldax d ; get block count
mov b,a ; put in B
xra a ; set flags
dcr a ; NZ
ret
;
; Ambiguous File Name Check
; Returns with Z Set if Ambiguous
;
ambchk:
lxi d,fcb+1 ; check for ambiguous file name
mvi b,11 ; 11 chars
ambchk1:
ldax d ; get char
ani 7fh ; mask
cpi '?'
rz
inx d ; pt to next
dcr b ; count down
jnz ambchk1
dcr b ; set NZ flag
ret
;
; Error Messages
;
amberr:
call prf ; print file name and message
db ' is Ambiguous',0
erret:
xra a ; set error code
ret
adrerr:
call prf ; print file name and message
db ' Not Known to Environ',0
jmp erret
fnferr:
call prf ; print file name and message
db ' Not Found',0
jmp erret
fempty:
call prf ; print file name and message
db ' Empty',0
jmp erret
strerr:
call prf ; print file name and message
db ' Contains a Format Flaw',0
jmp erret
prf:
call print
db cr,lf,' File ',0
lxi d,fcb+1
call pfn2
jmp print
;
; Close File
;
close:
lxi d,fcb ; pt to FCB
jmp f$close ; close file
;
; Load File Into Buffer
;
load:
shld packadr ; save package address in case of error
xchg ; DE pts to buffer, B = Max Blocks
load1:
push b ; save count
lxi h,tbuff ; pt to buffer
mvi b,128
call hmovb ; copy TBUFF into Buffer
push d ; save ptr to next block in buffer
lxi d,fcb ; pt to fcb
call f$read ; read next block
pop d ; get ptr
pop b ; get count
rnz ; done if NZ
dcr b ; count down
jnz load1
;
; Buffer Full
;
call prf
db ' is too Large',0
lhld packadr ; clear package
mvi b,128 ; NOPs
xra a
call fillb
lxi b,128 ; pt to after last NOP
dad b
mvi b,3 ; copy 3 bytes
xchg ; DE pts to empty space
lxi h,ercode ; store error code
jmp moveb
;
; Error Code to be Stored if Package Load Fails
;
ercode:
xra a ; 3 bytes
dcr a ; A=0FFH and NZ Flag Set
ret
;
; Buffers
;
ndridat:
db 0 ; no JMPs
db ' ' ; no ID stored
dw 0 ; address
db 0 ; (z3ndirs*18)/128+1 size
rcptyp:
db 'RCP' ; file type of RCP file
rcpdata:
db 0 ; 0 JMPs
db 'Z3RCP' ; ID
dw 0 ; address
db 0 ; size
ioptyp:
db 'IOP' ; file type of IOP file
iopdata:
db 16 ; 16 JMPs
db 'Z3IOP' ; ID
dw 0 ; address
db 0 ; size
fcptyp:
db 'FCP' ; file type of FCP file
fcpdata:
db 0 ; 0 JMPs
db 'Z3FCP' ; ID
dw 0 ; address
db 0 ; size
ndrtyp:
db 'NDR' ; file type of NDR file
ndrdata:
db 0 ; no JMPs
db ' ' ; no ID stored
dw 0 ; address
db 0 ; (z3ndirs*18)/128+1 size
envtyp:
db 'ENV' ; file type of ENV file
envdata:
db 1 ; 1 JMP
db 'Z3ENV' ; ID
envadr:
dw 0 ; address
db 2 ; 2 128-byte blocks max
tcaptyp:
db 'Z3T' ; file type of Z3TCAP file
tcapdata:
db 0 ; no JMPs
db ' ' ; no ID stored
tcapadr:
dw 0 ; address
db 1 ; 1 128-byte block max
pktype:
ds 1 ; package type (0=error)
packadr:
ds 2 ; package address
end