Improve DMA and BIOS reads
This commit is contained in:
parent
642179228a
commit
7127ec6408
2 changed files with 98 additions and 88 deletions
184
gba_memory.c
184
gba_memory.c
|
@ -342,6 +342,7 @@ u8 bios_rom[1024 * 16];
|
||||||
// Up to 128kb, store SRAM, flash ROM, or EEPROM here.
|
// Up to 128kb, store SRAM, flash ROM, or EEPROM here.
|
||||||
u8 gamepak_backup[1024 * 128];
|
u8 gamepak_backup[1024 * 128];
|
||||||
|
|
||||||
|
u32 dma_bus_val;
|
||||||
dma_transfer_type dma[4];
|
dma_transfer_type dma[4];
|
||||||
|
|
||||||
// ROM memory is allocated in blocks of 1MB to better map the native block
|
// ROM memory is allocated in blocks of 1MB to better map the native block
|
||||||
|
@ -461,13 +462,16 @@ u8 read_backup(u32 address)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define read_backup8() \
|
#define read_backup8() \
|
||||||
value = read_backup(address & 0xFFFF) \
|
value = read_backup(address & 0xFFFF); \
|
||||||
|
|
||||||
#define read_backup16() \
|
#define read_backup16() \
|
||||||
value = 0 \
|
value = read_backup(address & 0xFFFF); \
|
||||||
|
value = value | (value << 8);
|
||||||
|
|
||||||
#define read_backup32() \
|
#define read_backup32() \
|
||||||
value = 0 \
|
value = read_backup(address & 0xFFFF); \
|
||||||
|
value = value | (value << 8); \
|
||||||
|
value = value | (value << 16);
|
||||||
|
|
||||||
#define write_eeprom8(addr, value)
|
#define write_eeprom8(addr, value)
|
||||||
|
|
||||||
|
@ -1635,14 +1639,14 @@ typedef enum
|
||||||
DMA_REGION_IO = 5,
|
DMA_REGION_IO = 5,
|
||||||
DMA_REGION_EXT = 6,
|
DMA_REGION_EXT = 6,
|
||||||
DMA_REGION_GAMEPAK = 7,
|
DMA_REGION_GAMEPAK = 7,
|
||||||
DMA_REGION_BIOS = 8,
|
DMA_REGION_BUS = 8,
|
||||||
DMA_REGION_NULL = 9
|
DMA_REGION_COUNT = 9
|
||||||
} dma_region_type;
|
} dma_region_type;
|
||||||
|
|
||||||
const dma_region_type dma_region_map[17] =
|
const dma_region_type dma_region_map[17] =
|
||||||
{
|
{
|
||||||
DMA_REGION_BIOS, // 0x00 - BIOS
|
DMA_REGION_BUS, // 0x00 - BUS
|
||||||
DMA_REGION_NULL, // 0x01 - Nothing
|
DMA_REGION_BUS, // 0x01 - BUS
|
||||||
DMA_REGION_EWRAM, // 0x02 - EWRAM
|
DMA_REGION_EWRAM, // 0x02 - EWRAM
|
||||||
DMA_REGION_IWRAM, // 0x03 - IWRAM
|
DMA_REGION_IWRAM, // 0x03 - IWRAM
|
||||||
DMA_REGION_IO, // 0x04 - I/O registers
|
DMA_REGION_IO, // 0x04 - I/O registers
|
||||||
|
@ -1657,7 +1661,7 @@ const dma_region_type dma_region_map[17] =
|
||||||
DMA_REGION_EXT, // 0x0D - EEPROM
|
DMA_REGION_EXT, // 0x0D - EEPROM
|
||||||
DMA_REGION_EXT, // 0x0E - gamepak SRAM/flash ROM
|
DMA_REGION_EXT, // 0x0E - gamepak SRAM/flash ROM
|
||||||
DMA_REGION_EXT, // 0x0F - gamepak SRAM/flash ROM
|
DMA_REGION_EXT, // 0x0F - gamepak SRAM/flash ROM
|
||||||
DMA_REGION_NULL // 0x10 - Not possible (undefined?)
|
DMA_REGION_BUS // 0x10 - Out of region (assuming open bus)
|
||||||
};
|
};
|
||||||
|
|
||||||
#define dma_print(src_op, dest_op, tfsize) \
|
#define dma_print(src_op, dest_op, tfsize) \
|
||||||
|
@ -1676,7 +1680,7 @@ const dma_region_type dma_region_map[17] =
|
||||||
#define dma_vars_io(type)
|
#define dma_vars_io(type)
|
||||||
#define dma_vars_vram(type)
|
#define dma_vars_vram(type)
|
||||||
#define dma_vars_palette_ram(type)
|
#define dma_vars_palette_ram(type)
|
||||||
#define dma_vars_bios(type)
|
#define dma_vars_bus(type)
|
||||||
#define dma_vars_ext(type)
|
#define dma_vars_ext(type)
|
||||||
|
|
||||||
#define dma_oam_ram_src()
|
#define dma_oam_ram_src()
|
||||||
|
@ -1734,10 +1738,9 @@ const dma_region_type dma_region_map[17] =
|
||||||
read_value = readaddress##tfsize(type##_address_block, \
|
read_value = readaddress##tfsize(type##_address_block, \
|
||||||
type##_ptr & 0x7FFF) \
|
type##_ptr & 0x7FFF) \
|
||||||
|
|
||||||
// DMAing from the BIOS is funny, just returns 0..
|
// DMAing from the BIOS/open zone causes previous DMA values to be read
|
||||||
|
|
||||||
#define dma_read_bios(type, tfsize) \
|
#define dma_read_bus(type, tfsize)
|
||||||
read_value = 0 \
|
|
||||||
|
|
||||||
#define dma_read_ext(type, tfsize) \
|
#define dma_read_ext(type, tfsize) \
|
||||||
read_value = read_memory##tfsize(type##_ptr) \
|
read_value = read_memory##tfsize(type##_ptr) \
|
||||||
|
@ -1796,209 +1799,212 @@ cpu_alert_type dma_tf_loop##tfsize( \
|
||||||
bool wb, u32 length, dma_transfer_type *dma) \
|
bool wb, u32 length, dma_transfer_type *dma) \
|
||||||
{ \
|
{ \
|
||||||
u32 i; \
|
u32 i; \
|
||||||
u32 read_value; \
|
u32 read_value = dma_bus_val; \
|
||||||
cpu_alert_type alerts = CPU_ALERT_NONE; \
|
cpu_alert_type alerts = CPU_ALERT_NONE; \
|
||||||
u32 src_region = MIN(src_ptr >> 24, 16); \
|
u32 src_region = MIN(src_ptr >> 24, 16); \
|
||||||
u32 dest_region = MIN(dest_ptr >> 24, 16); \
|
u32 dest_region = MIN(dest_ptr >> 24, 16); \
|
||||||
dma_region_type src_region_type = dma_region_map[src_region]; \
|
dma_region_type src_region_type = dma_region_map[src_region]; \
|
||||||
dma_region_type dest_region_type = dma_region_map[dest_region]; \
|
dma_region_type dest_region_type = dma_region_map[dest_region]; \
|
||||||
\
|
\
|
||||||
switch(src_region_type | (dest_region_type << 4)) \
|
switch(src_region_type + dest_region_type * DMA_REGION_COUNT) \
|
||||||
{ \
|
{ \
|
||||||
default: \
|
default: \
|
||||||
/* Do nothing (read-only destination or unmapped area...) */ \
|
/* Do nothing (read-only destination or unmapped area...) */ \
|
||||||
return CPU_ALERT_NONE; \
|
return CPU_ALERT_NONE; \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_BIOS | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_BUS + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(bios, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(bus, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IWRAM | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_IWRAM + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(iwram, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(iwram, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EWRAM | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_EWRAM + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ewram, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ewram, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_VRAM | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_VRAM + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(vram, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(vram, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_PALETTE_RAM | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_PALETTE_RAM + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(palette_ram, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(palette_ram, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_OAM_RAM | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_OAM_RAM + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(oam_ram, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(oam_ram, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IO | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_IO + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(io, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(io, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_GAMEPAK | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_GAMEPAK + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(gamepak, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(gamepak, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EXT | (DMA_REGION_IWRAM << 4)): \
|
case DMA_REGION_EXT + DMA_REGION_IWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ext, iwram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ext, iwram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_BIOS | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_BUS + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(bios, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(bus, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IWRAM | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_IWRAM + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(iwram, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(iwram, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EWRAM | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_EWRAM + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ewram, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ewram, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_VRAM | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_VRAM + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(vram, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(vram, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_PALETTE_RAM | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_PALETTE_RAM + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(palette_ram, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(palette_ram, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_OAM_RAM | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_OAM_RAM + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(oam_ram, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(oam_ram, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IO | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_IO + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(io, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(io, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_GAMEPAK | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_GAMEPAK + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(gamepak, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(gamepak, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EXT | (DMA_REGION_EWRAM << 4)): \
|
case DMA_REGION_EXT + DMA_REGION_EWRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ext, ewram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ext, ewram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_BIOS | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_BUS + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(bios, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(bus, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IWRAM | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_IWRAM + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(iwram, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(iwram, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EWRAM | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_EWRAM + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ewram, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ewram, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_VRAM | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_VRAM + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(vram, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(vram, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_PALETTE_RAM | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_PALETTE_RAM + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(palette_ram, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(palette_ram, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_OAM_RAM | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_OAM_RAM + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(oam_ram, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(oam_ram, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IO | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_IO + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(io, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(io, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_GAMEPAK | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_GAMEPAK + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(gamepak, vram, src_strd, dest_strd,tfsize); \
|
dma_tfloop(gamepak, vram, src_strd, dest_strd,tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EXT | (DMA_REGION_VRAM << 4)): \
|
case DMA_REGION_EXT + DMA_REGION_VRAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ext, vram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ext, vram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_BIOS | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_BUS + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(bios, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(bus, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IWRAM | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_IWRAM + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(iwram, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(iwram, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EWRAM | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_EWRAM + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ewram, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ewram, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_VRAM | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_VRAM + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(vram, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(vram, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_PALETTE_RAM | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_PALETTE_RAM + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(palette_ram, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(palette_ram, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_OAM_RAM | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_OAM_RAM + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(oam_ram, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(oam_ram, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IO | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_IO + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(io, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(io, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_GAMEPAK | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_GAMEPAK + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(gamepak, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(gamepak, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EXT | (DMA_REGION_PALETTE_RAM << 4)): \
|
case DMA_REGION_EXT + DMA_REGION_PALETTE_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ext, palette_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ext, palette_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_BIOS | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_BUS + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(bios, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(bus, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IWRAM | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_IWRAM + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(iwram, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(iwram, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EWRAM | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_EWRAM + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ewram, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ewram, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_VRAM | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_VRAM + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(vram, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(vram, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_PALETTE_RAM | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_PALETTE_RAM + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(palette_ram, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(palette_ram, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_OAM_RAM | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_OAM_RAM + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(oam_ram, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(oam_ram, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IO | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_IO + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(io, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(io, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_GAMEPAK | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_GAMEPAK + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(gamepak, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(gamepak, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EXT | (DMA_REGION_OAM_RAM << 4)): \
|
case DMA_REGION_EXT + DMA_REGION_OAM_RAM * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ext, oam_ram, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ext, oam_ram, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_BIOS | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_BUS + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(bios, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(bus, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IWRAM | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_IWRAM + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(iwram, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(iwram, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EWRAM | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_EWRAM + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ewram, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ewram, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_VRAM | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_VRAM + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(vram, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(vram, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_PALETTE_RAM | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_PALETTE_RAM + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(palette_ram, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(palette_ram, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_OAM_RAM | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_OAM_RAM + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(oam_ram, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(oam_ram, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IO | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_IO + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(io, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(io, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_GAMEPAK | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_GAMEPAK + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(gamepak, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(gamepak, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EXT | (DMA_REGION_IO << 4)): \
|
case DMA_REGION_EXT + DMA_REGION_IO * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ext, io, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ext, io, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_BIOS | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_BUS + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(bios, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(bus, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IWRAM | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_IWRAM + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(iwram, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(iwram, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EWRAM | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_EWRAM + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ewram, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ewram, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_VRAM | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_VRAM + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(vram, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(vram, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_PALETTE_RAM | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_PALETTE_RAM + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(palette_ram, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(palette_ram, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_OAM_RAM | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_OAM_RAM + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(oam_ram, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(oam_ram, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_IO | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_IO + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(io, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(io, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_GAMEPAK | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_GAMEPAK + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(gamepak, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(gamepak, ext, src_strd, dest_strd, tfsize); \
|
||||||
\
|
\
|
||||||
case (DMA_REGION_EXT | (DMA_REGION_EXT << 4)): \
|
case DMA_REGION_EXT + DMA_REGION_EXT * DMA_REGION_COUNT: \
|
||||||
dma_tfloop(ext, ext, src_strd, dest_strd, tfsize); \
|
dma_tfloop(ext, ext, src_strd, dest_strd, tfsize); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
/* Remember the last value copied in case we read from a bad zone */ \
|
||||||
|
dma_bus_val = read_value; \
|
||||||
|
\
|
||||||
dma->source_address = src_ptr; \
|
dma->source_address = src_ptr; \
|
||||||
if (wb) /* Update destination pointer if requested */ \
|
if (wb) /* Update destination pointer if requested */ \
|
||||||
dma->dest_address = dest_ptr; \
|
dma->dest_address = dest_ptr; \
|
||||||
|
@ -2032,9 +2038,9 @@ static cpu_alert_type dma_transfer_copy(
|
||||||
cpu_alert_type dma_transfer(unsigned dma_chan, int *usedcycles)
|
cpu_alert_type dma_transfer(unsigned dma_chan, int *usedcycles)
|
||||||
{
|
{
|
||||||
dma_transfer_type *dmach = &dma[dma_chan];
|
dma_transfer_type *dmach = &dma[dma_chan];
|
||||||
u32 src_ptr = dmach->source_address & (
|
u32 src_ptr = 0x0FFFFFFF & dmach->source_address & (
|
||||||
dmach->length_type == DMA_16BIT ? ~1U : ~3U);
|
dmach->length_type == DMA_16BIT ? ~1U : ~3U);
|
||||||
u32 dst_ptr = dmach->dest_address & (
|
u32 dst_ptr = 0x0FFFFFFF & dmach->dest_address & (
|
||||||
dmach->length_type == DMA_16BIT ? ~1U : ~3U);
|
dmach->length_type == DMA_16BIT ? ~1U : ~3U);
|
||||||
cpu_alert_type ret = CPU_ALERT_NONE;
|
cpu_alert_type ret = CPU_ALERT_NONE;
|
||||||
u32 tfsizes = dmach->length_type == DMA_16BIT ? 1 : 2;
|
u32 tfsizes = dmach->length_type == DMA_16BIT ? 1 : 2;
|
||||||
|
@ -2272,6 +2278,7 @@ void init_memory(void)
|
||||||
eeprom_counter = 0;
|
eeprom_counter = 0;
|
||||||
rumble_enable_tick = 0;
|
rumble_enable_tick = 0;
|
||||||
rumble_ticks = 0;
|
rumble_ticks = 0;
|
||||||
|
dma_bus_val = 0;
|
||||||
|
|
||||||
flash_mode = FLASH_BASE_MODE;
|
flash_mode = FLASH_BASE_MODE;
|
||||||
|
|
||||||
|
@ -2318,7 +2325,8 @@ bool memory_check_savestate(const u8 *src)
|
||||||
!bson_contains_key(memdoc, "vram", BSON_TYPE_BIN) ||
|
!bson_contains_key(memdoc, "vram", BSON_TYPE_BIN) ||
|
||||||
!bson_contains_key(memdoc, "oamram", BSON_TYPE_BIN) ||
|
!bson_contains_key(memdoc, "oamram", BSON_TYPE_BIN) ||
|
||||||
!bson_contains_key(memdoc, "palram", BSON_TYPE_BIN) ||
|
!bson_contains_key(memdoc, "palram", BSON_TYPE_BIN) ||
|
||||||
!bson_contains_key(memdoc, "ioregs", BSON_TYPE_BIN))
|
!bson_contains_key(memdoc, "ioregs", BSON_TYPE_BIN) ||
|
||||||
|
!bson_contains_key(memdoc, "dma-bus", BSON_TYPE_INT32))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check backup variables
|
// Check backup variables
|
||||||
|
@ -2362,6 +2370,7 @@ bool memory_read_savestate(const u8 *src)
|
||||||
bson_read_bytes(memdoc, "oamram", oam_ram, sizeof(oam_ram)) &&
|
bson_read_bytes(memdoc, "oamram", oam_ram, sizeof(oam_ram)) &&
|
||||||
bson_read_bytes(memdoc, "palram", palette_ram, sizeof(palette_ram)) &&
|
bson_read_bytes(memdoc, "palram", palette_ram, sizeof(palette_ram)) &&
|
||||||
bson_read_bytes(memdoc, "ioregs", io_registers, sizeof(io_registers)) &&
|
bson_read_bytes(memdoc, "ioregs", io_registers, sizeof(io_registers)) &&
|
||||||
|
bson_read_int32(memdoc, "dma-bus", &dma_bus_val) &&
|
||||||
|
|
||||||
bson_read_int32(bakdoc, "backup-type", &backup_type) &&
|
bson_read_int32(bakdoc, "backup-type", &backup_type) &&
|
||||||
|
|
||||||
|
@ -2423,6 +2432,7 @@ unsigned memory_write_savestate(u8 *dst)
|
||||||
bson_write_bytes(dst, "oamram", oam_ram, sizeof(oam_ram));
|
bson_write_bytes(dst, "oamram", oam_ram, sizeof(oam_ram));
|
||||||
bson_write_bytes(dst, "palram", palette_ram, sizeof(palette_ram));
|
bson_write_bytes(dst, "palram", palette_ram, sizeof(palette_ram));
|
||||||
bson_write_bytes(dst, "ioregs", io_registers, sizeof(io_registers));
|
bson_write_bytes(dst, "ioregs", io_registers, sizeof(io_registers));
|
||||||
|
bson_write_int32(dst, "dma-bus", dma_bus_val);
|
||||||
bson_finish_document(dst, wbptr);
|
bson_finish_document(dst, wbptr);
|
||||||
|
|
||||||
bson_start_document(dst, "backup", wbptr);
|
bson_start_document(dst, "backup", wbptr);
|
||||||
|
|
|
@ -92,7 +92,7 @@ bool bson_read_bytes(const u8 *srcp, const char *key, void* buffer, unsigned cnt
|
||||||
/* this is an upper limit, leave room for future (?) stuff */
|
/* this is an upper limit, leave room for future (?) stuff */
|
||||||
#define GBA_STATE_MEM_SIZE (416*1024)
|
#define GBA_STATE_MEM_SIZE (416*1024)
|
||||||
#define GBA_STATE_MAGIC 0x06BAC0DE
|
#define GBA_STATE_MAGIC 0x06BAC0DE
|
||||||
#define GBA_STATE_VERSION 0x00010003
|
#define GBA_STATE_VERSION 0x00010004
|
||||||
|
|
||||||
bool gba_load_state(const void *src);
|
bool gba_load_state(const void *src);
|
||||||
void gba_save_state(void *dst);
|
void gba_save_state(void *dst);
|
||||||
|
|
Loading…
Add table
Reference in a new issue