mirror of https://github.com/wwarthen/RomWBW.git
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.
110 lines
2.4 KiB
110 lines
2.4 KiB
;
|
|
;==================================================================================================
|
|
; MD DISK DRIVER (MEMORY DISK)
|
|
;==================================================================================================
|
|
;
|
|
MD_DISPATCH:
|
|
LD A,B ; GET REQUESTED FUNCTION
|
|
AND $0F
|
|
JR Z,MD_READ
|
|
DEC A
|
|
JR Z,MD_WRITE
|
|
DEC A
|
|
JR Z,MD_STATUS
|
|
DEC A
|
|
JR Z,MD_MEDIA
|
|
CALL PANIC
|
|
;
|
|
;
|
|
;
|
|
MD_MEDIA:
|
|
LD A,C ; DEVICE/UNIT IS IN C
|
|
AND $0F ; ISOLATE UNIT NUM
|
|
CP 2 ; CHECK FOR MAX UNIT EXCEEDED
|
|
CALL NC,PANIC ; PANIC IF TOO HIGH
|
|
ADD A,MID_MDROM ; SET CORRECT MEDIA VALUE
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
MD_INIT:
|
|
PRTS("MD: UNITS=2 $")
|
|
PRTS("ROMDISK=$")
|
|
LD HL,ROMSIZE - 64
|
|
CALL PRTDEC
|
|
PRTS("KB RAMDISK=$")
|
|
LD HL,RAMSIZE - 32 - 64
|
|
CALL PRTDEC
|
|
PRTS("KB$")
|
|
XOR A ; INIT SUCCEEDED
|
|
RET ; RETURN
|
|
;
|
|
;
|
|
;
|
|
MD_STATUS:
|
|
XOR A ; ALWAYS OK
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
MD_READ:
|
|
CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
|
|
JR MD_BNKCPY ; DO IT AND RETURN
|
|
;
|
|
;
|
|
;
|
|
MD_WRITE:
|
|
LD A,C ; DEVICE/UNIT IS IN C
|
|
AND $0F ; ISOLATE UNIT NUM
|
|
LD A,1 ; PREPARE TO RETURN FALSE
|
|
RET Z ; RETURN ERROR IF ROM UNIT
|
|
|
|
CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
|
|
EX DE,HL ; SWAP SRC/DEST FOR WRITE
|
|
JR MD_BNKCPY ; DO IT AND RETURN
|
|
;
|
|
;
|
|
;
|
|
MD_BNKCPY:
|
|
; DO THE MEMORY COPY
|
|
CALL HB_BNKCPY ; COPY TO/FROM DMA BUFFER
|
|
XOR A ; SET SUCCESS
|
|
RET
|
|
;
|
|
; SETUP FOR MEMORY COPY
|
|
; A=BANK SELECT
|
|
; BC=COPY SIZE
|
|
; DE=DESTINATION
|
|
; HL=SOURCE
|
|
;
|
|
; ASSUMES A "READ" OPERATION. HL AND DE CAN BE SWAPPED
|
|
; FOR A WRITE OPERATION
|
|
;
|
|
MD_IOSETUP:
|
|
; SETUP A WITH BANK SELECTION VALUE
|
|
; NOTE THAT HIGH ORDER BIT DETERMINES ROM/RAM ACCESS
|
|
; THE OTHER BITS DETERMINE BANK NUMBER
|
|
LD A,(HSTTRK)
|
|
INC A ; OFFSET PAST RESERVED 32KB SYSTEM AREA OF RAM/ROM!
|
|
INC A ; OFFSET ANOTHER 32K PAST DRIVER BANK
|
|
LD C,A ; SAVE IT IN C
|
|
|
|
LD A,(HSTDSK) ; GET DEVICE/UNIT
|
|
AND $01 ; ISOLATE LOW BIT
|
|
RRCA ; MOVE IT TO HIGH BIT
|
|
OR C ; COMBINE WITH SAVE PAGE NUM
|
|
PUSH AF ; SAVE FOR LATER
|
|
|
|
; SETUP HL WITH MEMORY BANK OFFSET BASED ON SECTOR INDEX
|
|
; WE NEED TO MULTIPLY THE SECTOR INDEX (HSTSEC)
|
|
; BY 512 TO GET THE MEMORY BANK OFFSET
|
|
LD A,(HSTSEC) ; GET LSB OF SECTOR INTO A
|
|
RLCA ; SHIFT LEFT ONE BIT
|
|
LD H,A ; PUT IN H
|
|
LD L,0 ; SET L TO ZERO
|
|
|
|
; LOAD DESTINATION AND COUNT
|
|
LD DE,(DIOBUF) ; DMA ADDRESS IS DESTINATION
|
|
LD BC,512 ; ALWAYS COPY ONE SECTOR
|
|
POP AF ; RECOVER PAGE VALUE
|
|
RET
|
|
|