mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 01:14:21 +00:00
226 lines
3.6 KiB
NASM
226 lines
3.6 KiB
NASM
$title ('MP/M II V2.0 Load, Relocate, and Write File')
|
||
name ldrlwr
|
||
;
|
||
;/*
|
||
; Copyright (C) 1979,1980,1981
|
||
; Digital Research
|
||
; P.O. Box 579
|
||
; Pacific Grove, CA 93950
|
||
;
|
||
; Revised:
|
||
; 14 Sept 81 by Thomas Rolander
|
||
;*/
|
||
|
||
cseg
|
||
|
||
extrn mon1 ;BDOS entry point
|
||
extrn FCBin ;FCB for input
|
||
extrn FCBout ;FCB for output
|
||
extrn sctbfr ;sector buffer
|
||
extrn offset ;relocation offset
|
||
extrn prgsiz ;program size
|
||
extrn bufsiz ;buffer size
|
||
;
|
||
; Procedure to Load, Relocate, and Write an SPR or RSP
|
||
;
|
||
LdRl:
|
||
public LdRl
|
||
;compute number of sectors to be read
|
||
lhld prgsiz
|
||
lxi d,007fh
|
||
dad d
|
||
mov a,l
|
||
ral ;carry = high order bit
|
||
mov a,h
|
||
ral ;A = # sectors
|
||
sta wrcnt
|
||
lxi h,sctbfr
|
||
rdloop:
|
||
sta rdcnt
|
||
shld DMA
|
||
xchg
|
||
mvi c,26
|
||
call mon1 ;set DMA address for next sector
|
||
call read ;read next sector
|
||
lhld DMA
|
||
lxi d,0080h
|
||
dad d
|
||
lda rdcnt
|
||
dcr a
|
||
jnz rdloop
|
||
|
||
lxi h,bitmap
|
||
xchg
|
||
mvi c,26
|
||
call mon1 ;set DMA address to bit map
|
||
;
|
||
;file loaded, ready for relocation
|
||
lhld prgsiz
|
||
mov b,h
|
||
mov c,l ;BC = program size
|
||
xchg
|
||
lxi h,sctbfr
|
||
xchg ;DE = base of program
|
||
dad d ;HL = bit map base
|
||
push h ;save bit map base in stack
|
||
lda DMA
|
||
adi 128
|
||
sta btmptp
|
||
lda offset
|
||
mov h,a ;H = relocation offset
|
||
pgrel0:
|
||
mov a,b ;bc=0?
|
||
ora c
|
||
jz ExitLdRl
|
||
;
|
||
; not end of the relocation,
|
||
; may be into next byte of bit map
|
||
dcx b ;count length down
|
||
mov a,e
|
||
sui low(sctbfr)
|
||
ani 111b ;0 causes fetch of next byte
|
||
jnz pgrel3
|
||
; fetch bit map from stacked address
|
||
xthl
|
||
lda btmptp
|
||
cmp l
|
||
jnz pgrel2
|
||
mvi a,low(bitmap+128)
|
||
sta btmptp
|
||
push b
|
||
push d
|
||
lxi d,FCBin
|
||
mvi c,20
|
||
call mon1
|
||
pop d
|
||
pop b
|
||
lxi h,bitmap
|
||
ora a
|
||
jnz errtn ;return with error condition
|
||
pgrel2:
|
||
mov a,m ;next 8 bits of map
|
||
inx h
|
||
xthl ;base address goes back to stack
|
||
mov l,a ;l holds map as 8 bytes done
|
||
pgrel3:
|
||
mov a,l
|
||
ral ;cy set to 1 if reloc necessary
|
||
mov l,a ;back to l for next time around
|
||
jnc pgrel4 ;skip relocation if cy=0
|
||
;
|
||
; current address requires relocation
|
||
ldax d
|
||
add h ;apply bias in h
|
||
stax d
|
||
pgrel4:
|
||
inx d ;to next address
|
||
jmp pgrel0 ;for another byte to relocate
|
||
;
|
||
; Write out relocated data (top to bottom)
|
||
;
|
||
ExitLdRl:
|
||
pop h
|
||
lxi h,0
|
||
mov a,h
|
||
ret
|
||
|
||
;
|
||
FxWr:
|
||
public FxWr
|
||
;prefill buffer with zeros for filler record
|
||
lhld DMA
|
||
lxi b,128
|
||
dad b
|
||
xra a
|
||
filloop:
|
||
mov m,a
|
||
inx h
|
||
dcr c
|
||
jnz filloop
|
||
lhld bufsiz
|
||
mov a,l
|
||
ora h
|
||
jz nobuf
|
||
lxi d,255
|
||
dad d
|
||
mov a,h
|
||
add a
|
||
push psw
|
||
lhld DMA
|
||
lxi b,128
|
||
dad b
|
||
xchg
|
||
mvi c,26
|
||
call mon1 ;set DMA address for next sector
|
||
pop psw
|
||
bufwr:
|
||
push psw
|
||
call write ;write next sector
|
||
pop psw
|
||
dcr a
|
||
jnz bufwr
|
||
nobuf:
|
||
lxi b,0
|
||
lxi h,wrcnt
|
||
mov a,m
|
||
ani 1
|
||
jz evenrecord
|
||
inr m ;force even # of records
|
||
mvi c,128
|
||
evenrecord:
|
||
lhld DMA
|
||
dad b
|
||
Wrloop:
|
||
shld DMA
|
||
xchg
|
||
mvi c,26
|
||
call mon1 ;set DMA address for next sector
|
||
call write ;write next sector
|
||
lhld DMA
|
||
lxi d,-0080h
|
||
dad d
|
||
lda wrcnt
|
||
dcr a
|
||
sta wrcnt
|
||
jnz Wrloop
|
||
;
|
||
; Load, Relocation, and Write finished
|
||
;
|
||
ret
|
||
|
||
|
||
;
|
||
; Local Procedures
|
||
;
|
||
write:
|
||
lxi h,FCBout
|
||
xchg
|
||
mvi c,21 ;write sequential
|
||
call mon1
|
||
ora a
|
||
jnz errtn
|
||
ret
|
||
|
||
read:
|
||
lxi h,FCBin
|
||
xchg
|
||
mvi c,20 ;read sequential
|
||
call mon1
|
||
ora a
|
||
rz
|
||
errtn:
|
||
pop h ;discard return address
|
||
lxi h,0ffffh
|
||
mov a,h
|
||
ret ;return with error condition
|
||
;
|
||
; Local Data Segment
|
||
;
|
||
rdcnt: ds 2 ;read counter
|
||
wrcnt: ds 2 ;write counter
|
||
DMA: ds 2 ;DMA address
|
||
bitmap: ds 128 ;bit map buffer
|
||
btmptp: ds 1 ;bit low (bitmap+128)
|
||
|
||
end
|
||
|