You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

116 lines
2.1 KiB

title 'bank & move module for CP/M3 linked BIOS'
cseg
public ?move,?xmove,?bank,?bnkxlt
public ?mvinit,@hbbio,@hbusr
extrn @cbnk
?mvinit:
ld bc,0F8F2H ; HBIOS GET BNKINFO
;rst 08 ; D: BIOS Bank, E: User Bank
call 0FFF0H
ld a,d
ld (@hbbio),a
ld a,e
ld (@hbusr),a
ret
?xmove:
ld (movbnk),bc ; save source & dest banks
or 0FFH ; flag interbank move type
ld (movtyp),a ; save it
ret
?move:
ld a,(movtyp) ; get move type flag
or a ; set flags
jr nz,xbnkmov ; if so, go to interbank move
; Intrabank move
ex de,hl ; we are passed source in DE and dest in HL
ldir ; use Z80 block move instruction
ex de,hl ; need next addresses in same regs
ret
xbnkmov:
;ld ix,8888H
;halt
; Interbank move
xor a ; zero
ld (movtyp),a ; clear move type flag
push de
push hl
push bc
pop hl
ld a,(srcbnk)
call ?bnkxlt
ld e,a
ld a,(dstbnk)
call ?bnkxlt
ld d,a
ld b,0F4H ; SETCPY
;rst 08
call 0FFF0H
pop hl
pop de
ex de,hl ; swap address regs for call
ld b,0F5H ; BNKCPY
;rst 08
call 0FFF0H
ex de,hl ; next addresses in same regs
;ld ix,9999H
;halt
ret
?bank:
call ?bnkxlt ; xlat to HBIOS bank id
jp 0FFF3H ; do it and return
;
; Convert from CPM3 bank id to HBIOS bank id.
; CPM3 wants TPA for it's bank 0, so that is special
; case mapping to HBIOS BID_USR (8EH). Otherwise, we index
; down below BID_HBIOS (8DH). So CPM3 bank usage grows
; downward.
;
; CPM3 HBIOS
; ------------- -------------------
; COMMON 8FH - BID_COM
; 0 - OS/BUFS 8EH - BID_USR
; 8DH - BID_BIOS
; 1 - TPA 8CH - BID_AUX
; 2 - BUFS 8BH - BID_AUX-1
; 3 - BUFS 8AH - BID_AUX-2
; ...
;
; N.B., Below BID_AUX is considered RAM disk bank. Need to
; make sure RAM disk is kept small enough to stay below
; banks used for OS buffers.
;
?bnkxlt:
;ld ix,5555H
;halt
;cp 2
;jr c,xxx
;ld ix,6666H
;halt
;xxx:
or a
jr z,bank0
neg ; 2 -> -2
add a,08DH ; 8DH - 2 = 8BH
@hbbio equ $ - 1 ; BID_BIOS
ret
bank0:
ld a,08EH ; 0 -> 8EH
@hbusr equ $ - 1 ; BID_USR
ret
movtyp db 0 ; non-zero for interbank move
movbnk:
srcbnk db 0
dstbnk db 0
end