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.
112 lines
3.3 KiB
112 lines
3.3 KiB
;===============================================************************
|
|
; RAM Disk Driver. ** Hardware Specific **
|
|
; D-X Designs Pty Ltd P112 ************************
|
|
;
|
|
; 1.1 - 28 Jul 01 - Updated to latest fix for external driver. HFB
|
|
; 1.0 - 10 Jun 96 - Initial Release for P112 from YASBEC. HFB
|
|
;=======================================================================
|
|
|
|
CSEG
|
|
IF BANKED
|
|
COMMON /BANK2/
|
|
ENDIF
|
|
|
|
; This module creates a RAM Drive using the available memory (if available)
|
|
; above the TPA and possible System banks. For a banked system, the minimum
|
|
; needed is a 64k Main TPA and a 32k System Bank.
|
|
|
|
;.....
|
|
; Select the RAM Drive. This routine performs any setup required in a select.
|
|
|
|
SELRAM: JP SETPARMS ; No action locally.
|
|
|
|
;.....
|
|
; Read a 128-byte logical sector from the RAM Drive to main memory.
|
|
; This routine uses the HSTxxx values from the base BIOS routines.
|
|
|
|
RAMRD: OR 0FFH ; Set Read flag (non-0)
|
|
JR RamRW ; ..go to common code
|
|
|
|
;.....
|
|
; Write a 128-byte logical sector from main memory to the RAM Drive.
|
|
; This routine uses the HSTxxx values from the base BIOS routines.
|
|
|
|
RAMWR: XOR A ; Set Write flag with 0, Read w/AFH
|
|
LD (HSTWRT),A ; clear pending write flag
|
|
;..fall thru to common code..
|
|
; The following performs calculations for the proper address and bank, sets
|
|
; the DMA block and executes the Move to/from the Host Buffer.
|
|
|
|
RamRW: PUSH AF ; Save R/W flag for later
|
|
LD A,(RAMBNK) ; Get 1st Bank of Ram Drive
|
|
ADD A,A
|
|
ADD A,A ; .converting
|
|
ADD A,A ; ..to DMA Bank addr
|
|
LD HL,HSTTRK ; Point to Track #
|
|
ADD A,(HL) ; ..and add in
|
|
LD HL,0000 ; ..prepare address
|
|
LD B,4
|
|
SHFTR: SRL A ; Shift low 4 bits
|
|
RR H ; ..to high of H
|
|
DJNZ SHFTR
|
|
LD C,A ; Save High byte of A
|
|
LD A,(HSTSEC) ; Get sector #
|
|
SRL A
|
|
RR L ; .multiply by 128
|
|
ADD A,H ; Add Remaining High bits to MSB of address
|
|
LD H,A ; ..and store Addr
|
|
LD A,C ; Get Bank #
|
|
ADC A,0 ; .adjust for possible overflow
|
|
LD C,A ; ..and re-save
|
|
|
|
IF BANKED
|
|
LD A,(SYSBNK) ; Point to system bank for HSTBUF
|
|
ELSE
|
|
LD A,(TPABNK) ; Point to TPA bank if Unbanked
|
|
ENDIF
|
|
LD DE,HSTBUF ; Point to Host Buffer
|
|
RL D ; Place MSB of address in Carry
|
|
ADC A,0 ; .add to Bank Number
|
|
RRA ; Shift Bnk # to DMA Bank Byte (LSB to Carry)
|
|
LD B,A ; ..and place in destination register
|
|
RR D ; Bank # LSB (Carry) to Address MSB
|
|
|
|
POP AF ; Read or Write?
|
|
JR NZ,RAMRD0 ; ..jump if Read
|
|
EX DE,HL ; Else swap things around
|
|
LD A,C
|
|
LD C,B
|
|
LD B,A
|
|
RAMRD0: LD (RAMSRC),HL ; Stuff values in DMA block
|
|
LD A,C
|
|
LD (RAMSRC+2),A
|
|
LD (RAMDST),DE
|
|
LD A,B
|
|
LD (RAMDST+2),A
|
|
LD HL,128 ; ..including length of move
|
|
LD (MLEN),HL
|
|
|
|
; Set the Z-180 registers and start the move
|
|
|
|
LD HL,RAMSRC ; Point to the DMA Control block
|
|
CALL DMAMOV ; .and use the Z-180 DMA to move
|
|
XOR A ; Return Ok status
|
|
RET
|
|
|
|
;.....
|
|
; We need a little data area to set a DMA control block. Put in scratch RAM
|
|
|
|
IF BANKED
|
|
COMMON /B2RAM/
|
|
ELSE
|
|
DSEG
|
|
ENDIF
|
|
|
|
RAMSRC: DEFS 2 ; Address of Source
|
|
DEFS 1 ; .Bank of Source
|
|
RAMDST: DEFS 2 ; Address of Destination
|
|
DEFS 1 ; .Bank of Destination
|
|
MLEN: DEFS 2 ; Length of Data Area to move
|
|
|
|
;================== End of RAM Disk Code ====================
|
|
|