X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2F32x%2Fmemory.c;h=eaf1e3ad584730cf6dd28473d225bc563dba0c8d;hb=efd100fc0a1426202abd2dd2cb1e3ed18bf4440d;hp=e50ad36ccfefbc131aedb367766c5feff179271b;hpb=553c3eaa3a4bda6ba99d925ecab518fe82530cd6;p=picodrive.git diff --git a/pico/32x/memory.c b/pico/32x/memory.c index e50ad36..eaf1e3a 100644 --- a/pico/32x/memory.c +++ b/pico/32x/memory.c @@ -1016,6 +1016,10 @@ static u32 sh2_read16_da(u32 a, int id) return ((u16 *)Pico32xMem->data_array[id])[(a & 0xfff) / 2]; } +static void sh2_write_ignore(u32 a, u32 d, int id) +{ +} + // write8 static void sh2_write8_unmapped(u32 a, u32 d, int id) { @@ -1167,33 +1171,33 @@ typedef void (sh2_write_handler)(u32 a, u32 d, int id); #define SH2MAP_ADDR2OFFS(a) \ (((a >> 25) & 3) | ((a >> 27) & 0x1c)) -u32 p32x_sh2_read8(u32 a, SH2 *sh2) +u32 REGPARM(2) p32x_sh2_read8(u32 a, SH2 *sh2) { const sh2_memmap *sh2_map = sh2->read8_map; uptr p; sh2_map += SH2MAP_ADDR2OFFS(a); p = sh2_map->addr; - if (p & (1 << 31)) + if (map_flag_set(p)) return ((sh2_read_handler *)(p << 1))(a, sh2->is_slave); else return *(u8 *)((p << 1) + ((a & sh2_map->mask) ^ 1)); } -u32 p32x_sh2_read16(u32 a, SH2 *sh2) +u32 REGPARM(2) p32x_sh2_read16(u32 a, SH2 *sh2) { const sh2_memmap *sh2_map = sh2->read16_map; uptr p; sh2_map += SH2MAP_ADDR2OFFS(a); p = sh2_map->addr; - if (p & (1 << 31)) + if (map_flag_set(p)) return ((sh2_read_handler *)(p << 1))(a, sh2->is_slave); else return *(u16 *)((p << 1) + ((a & sh2_map->mask) & ~1)); } -u32 p32x_sh2_read32(u32 a, SH2 *sh2) +u32 REGPARM(2) p32x_sh2_read32(u32 a, SH2 *sh2) { const sh2_memmap *sh2_map = sh2->read16_map; sh2_read_handler *handler; @@ -1203,7 +1207,7 @@ u32 p32x_sh2_read32(u32 a, SH2 *sh2) offs = SH2MAP_ADDR2OFFS(a); sh2_map += offs; p = sh2_map->addr; - if (!(p & (1 << 31))) { + if (!map_flag_set(p)) { // XXX: maybe 32bit access instead with ror? u16 *pd = (u16 *)((p << 1) + ((a & sh2_map->mask) & ~1)); return (pd[0] << 16) | pd[1]; @@ -1216,7 +1220,7 @@ u32 p32x_sh2_read32(u32 a, SH2 *sh2) return (handler(a, sh2->is_slave) << 16) | handler(a + 2, sh2->is_slave); } -void p32x_sh2_write8(u32 a, u32 d, SH2 *sh2) +void REGPARM(3) p32x_sh2_write8(u32 a, u32 d, SH2 *sh2) { const void **sh2_wmap = sh2->write8_tab; sh2_write_handler *wh; @@ -1225,7 +1229,7 @@ void p32x_sh2_write8(u32 a, u32 d, SH2 *sh2) wh(a, d, sh2->is_slave); } -void p32x_sh2_write16(u32 a, u32 d, SH2 *sh2) +void REGPARM(3) p32x_sh2_write16(u32 a, u32 d, SH2 *sh2) { const void **sh2_wmap = sh2->write16_tab; sh2_write_handler *wh; @@ -1234,7 +1238,7 @@ void p32x_sh2_write16(u32 a, u32 d, SH2 *sh2) wh(a, d, sh2->is_slave); } -void p32x_sh2_write32(u32 a, u32 d, SH2 *sh2) +void REGPARM(3) p32x_sh2_write32(u32 a, u32 d, SH2 *sh2) { const void **sh2_wmap = sh2->write16_tab; sh2_write_handler *handler; @@ -1372,7 +1376,7 @@ static void get_bios(void) } #define MAP_MEMORY(m) ((uptr)(m) >> 1) -#define MAP_HANDLER(h) (((uptr)(h) >> 1) | (1 << 31)) +#define MAP_HANDLER(h) ( ((uptr)(h) >> 1) | ((uptr)1 << (sizeof(uptr) * 8 - 1)) ) static sh2_memmap sh2_read8_map[0x20], sh2_read16_map[0x20]; // for writes we are using handlers only @@ -1451,6 +1455,12 @@ void PicoMemSetup32x(void) sh2_write16_map[i] = sh2_write16_unmapped; } + // "purge area" + for (i = 0x08; i <= 0x0b; i++) { + sh2_write8_map[i] = + sh2_write16_map[i] = sh2_write_ignore; + } + // CS0 sh2_read8_map[0].addr = sh2_read8_map[4].addr = MAP_HANDLER(sh2_read8_cs0); sh2_read16_map[0].addr = sh2_read16_map[4].addr = MAP_HANDLER(sh2_read16_cs0);