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