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

;
;==================================================================================================
; 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