mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 18:04:07 +00:00
Upload
Digital Research
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user