mirror of https://github.com/parasyte/alt64
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.
160 lines
2.7 KiB
160 lines
2.7 KiB
|
|
#include "types.h" |
|
#include "everdrive.h" |
|
#include "sys.h" |
|
|
|
u8 spi_dma; |
|
#include "errors.h" |
|
#include "mem.h" |
|
|
|
u8 memSpiReadDma(void *dst, u16 slen); |
|
u8 memSpiReadPio(void *dst, u16 slen); |
|
u8 mem_buff[512]; |
|
|
|
void memSpiSetDma(u8 mode) { |
|
spi_dma = mode; |
|
} |
|
|
|
void memcopy(void *src, void *dst, u16 len) { |
|
|
|
u8 *s = (u8 *) src; |
|
u8 *d = (u8 *) dst; |
|
while (len--)*d++ = *s++; |
|
} |
|
|
|
void memfill(void *dst, u8 val, u16 len) { |
|
u8 *d = (u8 *) dst; |
|
while (len--)*d++ = val; |
|
} |
|
|
|
|
|
// buff len |
|
u8 memSpiRead(void *dst, u16 slen) { |
|
|
|
u8 copy_to_rom = 0; |
|
u32 addr = (u32) dst; //if ROM_ADDR 0xb0000000 |
|
if (addr >= ROM_ADDR && addr < ROM_END_ADDR)copy_to_rom = 1; |
|
|
|
//if (copy_to_rom || spi_dma) { |
|
if ((copy_to_rom || spi_dma) && addr % 4 == 0) { |
|
return memSpiReadDma(dst, slen); |
|
} else { |
|
return memSpiReadPio(dst, slen); |
|
|
|
} |
|
|
|
} |
|
|
|
u8 memSpiReadPio(void *dst, u16 slen) { |
|
|
|
u16 i; |
|
u16 u; |
|
u8 *ptr8 = (u8 *) dst; |
|
|
|
|
|
|
|
for (i = 0; i < slen; i++) { |
|
|
|
evd_SDdatReadMode(1); |
|
for (u = 0; u < 65535; u++)if ((evd_SPI(0xff) & 0xf1) == 0xf0)break; |
|
evd_SDdatReadMode(0); |
|
if (u == 65535) { |
|
evd_spiSSOff(); |
|
return DISK_RD_FE_TOUT; |
|
} |
|
|
|
for (u = 0; u < 512; u++)*ptr8++ = evd_SPI(0xff); |
|
|
|
u = evd_isSDMode() ? 8 : 2; |
|
|
|
while (u--) { |
|
// console_printf("XRC: %02X", evd_SPI(0xff)); |
|
//console_printf("%02X\n", evd_SPI(0xff)); |
|
u--; |
|
evd_SPI(0xff); |
|
evd_SPI(0xff); |
|
} |
|
//evd_SPI(0xff); |
|
//evd_SPI(0xff); |
|
} |
|
|
|
|
|
return 0; |
|
} |
|
|
|
u8 memSpiReadDma(void *dst, u16 slen) { |
|
|
|
u8 resp = 0; |
|
u8 copy_to_rom = 0; |
|
u32 addr = (u32) dst; |
|
|
|
evd_SDdatReadMode(0); |
|
// console_printf("dma\n"); |
|
if (addr >= ROM_ADDR && addr < ROM_END_ADDR)copy_to_rom = 1; |
|
|
|
if (copy_to_rom) { |
|
|
|
return evd_mmcReadToCart(addr, slen); |
|
|
|
} else { |
|
|
|
resp = evd_mmcReadToCart(0, slen); |
|
dma_read_s(dst, ROM_ADDR, slen * 512); |
|
} |
|
|
|
|
|
return resp; |
|
} |
|
|
|
u8 memSpiWrite(void *src) { |
|
|
|
u16 i; |
|
|
|
u8 *ptr8 = (u8 *) src; |
|
|
|
if ((u32) src >= ROM_ADDR && (u32) src < ROM_END_ADDR) { |
|
dma_read_s(mem_buff, (u32) src, 512); |
|
for (i = 0; i < 512; i++)mem_spi(mem_buff[i]); |
|
} else { |
|
for (i = 0; i < 512; i++)mem_spi(*ptr8++); |
|
} |
|
|
|
|
|
return 0; |
|
} |
|
|
|
void memSpiBusy() { |
|
|
|
while (evd_isSpiBusy()); |
|
|
|
} |
|
|
|
void memRomWrite32(u32 addr, u32 val) { |
|
|
|
vu32 *ptr = (u32 *) (addr + ROM_ADDR); |
|
vu8 tmp; |
|
|
|
tmp = *ptr; |
|
*ptr = val; |
|
tmp = *ptr; |
|
} |
|
|
|
u32 memRomRead32(u32 addr) { |
|
|
|
vu32 *ptr = (u32 *) (addr + ROM_ADDR); |
|
vu8 tmp; |
|
vu32 val; |
|
|
|
tmp = *ptr; |
|
val = *ptr; |
|
|
|
return val; |
|
} |
|
|
|
|
|
/* |
|
u8 mem_spi(u8 dat) { |
|
return evd_SPI(dat); |
|
} |
|
|
|
*/
|
|
|