Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,226 @@
$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