summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid G. F2021-06-27 01:30:50 +0200
committerGitHub2021-06-27 01:30:50 +0200
commit48f1a71fb7b1d551295aec7ea44f5529c87bff93 (patch)
treecc50bd05fd8fd14444825c4929fb94ea6e98b1dc
parentd5ff18d3cebc56c351d95a3eec1873cd7112e31f (diff)
parent8dbf5f6c17e3d217877119620e5bbfeba05abd7a (diff)
downloadpicogpsp-48f1a71fb7b1d551295aec7ea44f5529c87bff93.tar.gz
picogpsp-48f1a71fb7b1d551295aec7ea44f5529c87bff93.tar.bz2
picogpsp-48f1a71fb7b1d551295aec7ea44f5529c87bff93.zip
Merge pull request #137 from davidgfnet/master
Enable big-endian devices: gc/wii
-rw-r--r--.gitlab-ci.yml30
-rw-r--r--Makefile8
-rw-r--r--cheats.c2
-rw-r--r--common.h16
-rw-r--r--cpu.c26
-rw-r--r--gba_memory.c199
-rw-r--r--gba_memory.h13
-rw-r--r--input.c4
-rw-r--r--main.c22
-rw-r--r--sound.c4
-rw-r--r--video.c267
11 files changed, 326 insertions, 265 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fdbedc4..62b38e9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -63,6 +63,18 @@ include:
- project: 'libretro-infrastructure/ci-templates'
file: '/ctr-static.yml'
+ # Nintendo GameCube
+ - project: 'libretro-infrastructure/ci-templates'
+ file: '/ngc-static.yml'
+
+ # Nintendo Wii
+ - project: 'libretro-infrastructure/ci-templates'
+ file: '/wii-static.yml'
+
+ # Nintendo WiiU
+ - project: 'libretro-infrastructure/ci-templates'
+ file: '/wiiu-static.yml'
+
# Nintendo Switch
- project: 'libretro-infrastructure/ci-templates'
file: '/libnx-static.yml'
@@ -174,6 +186,24 @@ libretro-build-ctr:
- .libretro-ctr-static-retroarch-master
- .core-defs
+# Nintendo GameCube
+libretro-build-ngc:
+ extends:
+ - .libretro-ngc-static-retroarch-master
+ - .core-defs
+
+# Nintendo Wii
+libretro-build-wii:
+ extends:
+ - .libretro-wii-static-retroarch-master
+ - .core-defs
+
+# Nintendo WiiU
+libretro-build-wiiu:
+ extends:
+ - .libretro-wiiu-static-retroarch-master
+ - .core-defs
+
# OpenDingux
libretro-build-dingux-mips32:
extends:
diff --git a/Makefile b/Makefile
index cf0bfd1..5f7afff 100644
--- a/Makefile
+++ b/Makefile
@@ -195,6 +195,14 @@ else ifeq ($(platform), switch)
include $(LIBTRANSISTOR_HOME)/libtransistor.mk
STATIC_LINKING=1
+# Nintendo Game Cube / Wii / WiiU
+else ifneq (,$(filter $(platform), ngc wii wiiu))
+ TARGET := $(TARGET_NAME)_libretro_$(platform).a
+ CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
+ AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
+ CFLAGS += -DGEKKO -mcpu=750 -meabi -mhard-float -DHAVE_STRTOF_L
+ STATIC_LINKING = 1
+
# PSP
else ifeq ($(platform), psp1)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
diff --git a/cheats.c b/cheats.c
index 17556ca..3594730 100644
--- a/cheats.c
+++ b/cheats.c
@@ -190,7 +190,7 @@ void process_cheats(void)
if(!cheats[i].cheat_active)
continue;
- process_cheat_codebreaker(&cheats[i], 0x3ff ^ io_registers[REG_P1]);
+ process_cheat_codebreaker(&cheats[i], 0x3ff ^ read_ioreg(REG_P1));
}
}
diff --git a/common.h b/common.h
index ef6724a..ff4d522 100644
--- a/common.h
+++ b/common.h
@@ -124,6 +124,22 @@ typedef u32 fixed8_24;
#define address32(base, offset) \
*((u32 *)((u8 *)base + (offset))) \
+#define eswap8(value) (value)
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ #define eswap16(value) __builtin_bswap16(value)
+ #define eswap32(value) __builtin_bswap32(value)
+#else
+ #define eswap16(value) (value)
+ #define eswap32(value) (value)
+#endif
+
+#define readaddress8(base, offset) eswap8( address8( base, offset))
+#define readaddress16(base, offset) eswap16(address16(base, offset))
+#define readaddress32(base, offset) eswap32(address32(base, offset))
+
+#define read_ioreg(regnum) (eswap16(io_registers[(regnum)]))
+#define write_ioreg(regnum, val) io_registers[(regnum)] = eswap16(val)
+
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
diff --git a/cpu.c b/cpu.c
index 6003849..873a5e3 100644
--- a/cpu.c
+++ b/cpu.c
@@ -721,8 +721,8 @@ u32 high_frequency_branch_targets = 0;
// probably not worth optimizing for.
#define check_for_interrupts() \
- if((io_registers[REG_IE] & io_registers[REG_IF]) && \
- io_registers[REG_IME] && ((reg[REG_CPSR] & 0x80) == 0)) \
+ if((read_ioreg(REG_IE) & read_ioreg(REG_IF)) && \
+ read_ioreg(REG_IME) && ((reg[REG_CPSR] & 0x80) == 0)) \
{ \
reg_mode[MODE_IRQ][6] = reg[REG_PC] + 4; \
spsr[MODE_IRQ] = reg[REG_CPSR]; \
@@ -945,10 +945,10 @@ const u32 psr_masks[16] =
#define aligned_address_mask16 0xF0000001
#define aligned_address_mask32 0xF0000003
-#define fast_read_memory(size, type, address, dest) \
+#define fast_read_memory(size, type, addr, dest) \
{ \
u8 *map; \
- u32 _address = address; \
+ u32 _address = addr; \
\
if(_address < 0x10000000) \
{ \
@@ -964,7 +964,7 @@ const u32 psr_masks[16] =
if(((_address & aligned_address_mask##size) == 0) && \
(map = memory_map_read[_address >> 15])) \
{ \
- dest = *((type *)((u8 *)map + (_address & 0x7FFF))); \
+ dest = (type)readaddress##size(map, (_address & 0x7FFF)); \
} \
else \
{ \
@@ -984,7 +984,7 @@ const u32 psr_masks[16] =
if(((_address & aligned_address_mask16) == 0) && \
(map = memory_map_read[_address >> 15])) \
{ \
- dest = *((s16 *)((u8 *)map + (_address & 0x7FFF))); \
+ dest = (s16)readaddress16(map, (_address & 0x7FFF)); \
} \
else \
{ \
@@ -1018,7 +1018,7 @@ const u32 psr_masks[16] =
} \
if(_address < 0x10000000 && map) \
{ \
- dest = address32(map, _address & 0x7FFF); \
+ dest = readaddress32(map, _address & 0x7FFF); \
} \
else \
{ \
@@ -1123,10 +1123,10 @@ const u32 psr_masks[16] =
#define arm_block_writeback_no(access_type) \
#define load_block_memory(address, dest) \
- dest = address32(address_region, (address + offset) & 0x7FFF) \
+ dest = readaddress32(address_region, (address + offset) & 0x7FFF) \
#define store_block_memory(address, dest) \
- address32(address_region, (address + offset) & 0x7FFF) = dest \
+ address32(address_region, (address + offset) & 0x7FFF) = eswap32(dest) \
#define arm_block_memory_offset_down_a() \
(base - (word_bit_count(reg_list) * 4) + 4) \
@@ -1601,9 +1601,9 @@ void raise_interrupt(irq_type irq_raised)
{
// The specific IRQ must be enabled in IE, master IRQ enable must be on,
// and it must be on in the flags.
- io_registers[REG_IF] |= irq_raised;
+ write_ioreg(REG_IF, read_ioreg(REG_IF) | irq_raised);
- if((io_registers[REG_IE] & irq_raised) && io_registers[REG_IME] &&
+ if((read_ioreg(REG_IE) & irq_raised) && read_ioreg(REG_IME) &&
((reg[REG_CPSR] & 0x80) == 0))
{
bios_read_protect = 0xe55ec002;
@@ -1681,7 +1681,7 @@ arm_loop:
using_instruction(arm);
check_pc_region();
pc &= ~0x03;
- opcode = address32(pc_address_block, (pc & 0x7FFF));
+ opcode = readaddress32(pc_address_block, (pc & 0x7FFF));
condition = opcode >> 28;
switch(condition)
@@ -3256,7 +3256,7 @@ thumb_loop:
using_instruction(thumb);
check_pc_region();
pc &= ~0x01;
- opcode = address16(pc_address_block, (pc & 0x7FFF));
+ opcode = readaddress16(pc_address_block, (pc & 0x7FFF));
switch((opcode >> 8) & 0xFF)
{
diff --git a/gba_memory.c b/gba_memory.c
index af94585..4376cf8 100644
--- a/gba_memory.c
+++ b/gba_memory.c
@@ -35,7 +35,7 @@
gbc_sound_channel[channel].envelope_status = (envelope_ticks != 0); \
gbc_sound_channel[channel].envelope_volume = initial_volume; \
gbc_sound_update = 1; \
- address16(io_registers, address) = value; \
+ address16(io_registers, address) = eswap16(value); \
} \
#define gbc_sound_tone_control_high(channel, address) \
@@ -56,7 +56,7 @@
} \
\
gbc_sound_update = 1; \
- address16(io_registers, address) = value; \
+ address16(io_registers, address) = eswap16(value); \
} \
#define gbc_sound_tone_control_sweep() \
@@ -68,7 +68,7 @@
gbc_sound_channel[0].sweep_ticks = sweep_ticks; \
gbc_sound_channel[0].sweep_initial_ticks = sweep_ticks; \
gbc_sound_update = 1; \
- address16(io_registers, 0x60) = value; \
+ write_ioreg(REG_SOUND1CNT_L, value); \
} \
#define gbc_sound_wave_control() \
@@ -80,7 +80,7 @@
gbc_sound_channel[2].master_enable = 1; \
\
gbc_sound_update = 1; \
- address16(io_registers, 0x70) = value; \
+ write_ioreg(REG_SOUND3CNT_L, value); \
} \
static u32 gbc_sound_wave_volume[4] = { 0, 16384, 8192, 4096 };
@@ -94,7 +94,7 @@ static u32 gbc_sound_wave_volume[4] = { 0, 16384, 8192, 4096 };
gbc_sound_channel[2].wave_volume = \
gbc_sound_wave_volume[(value >> 13) & 0x03]; \
gbc_sound_update = 1; \
- address16(io_registers, 0x72) = value; \
+ write_ioreg(REG_SOUND3CNT_H, value); \
} \
#define gbc_sound_tone_control_high_wave() \
@@ -110,7 +110,7 @@ static u32 gbc_sound_wave_volume[4] = { 0, 16384, 8192, 4096 };
gbc_sound_channel[2].active_flag = 1; \
} \
gbc_sound_update = 1; \
- address16(io_registers, 0x74) = value; \
+ write_ioreg(REG_SOUND3CNT_X, value); \
} \
#define gbc_sound_noise_control() \
@@ -141,7 +141,7 @@ static u32 gbc_sound_wave_volume[4] = { 0, 16384, 8192, 4096 };
gbc_sound_channel[3].envelope_initial_volume; \
} \
gbc_sound_update = 1; \
- address16(io_registers, 0x7C) = value; \
+ write_ioreg(REG_SOUND4CNT_H, value); \
} \
static void gbc_trigger_sound(u32 value)
@@ -156,7 +156,7 @@ static void gbc_trigger_sound(u32 value)
gbc_sound_channel[channel].status =
((value >> (channel + 8)) & 0x01) | ((value >> (channel + 11)) & 0x03);
}
- address16(io_registers, 0x80) = value;
+ write_ioreg(REG_SOUNDCNT_L, value);
}
#define trigger_sound() \
@@ -175,7 +175,7 @@ static void gbc_trigger_sound(u32 value)
sound_reset_fifo(0); \
if((value >> 15) & 0x01) \
sound_reset_fifo(1); \
- address16(io_registers, 0x82) = value; \
+ write_ioreg(REG_SOUNDCNT_H, value); \
} \
static void sound_control_x(u32 value)
@@ -193,8 +193,8 @@ static void sound_control_x(u32 value)
sound_on = 0;
}
- address16(io_registers, 0x84) =
- (address16(io_registers, 0x84) & 0x000F) | (value & 0xFFF0);
+ address16(io_registers, 0x84) = eswap16(
+ (readaddress16(io_registers, 0x84) & 0x000F) | (value & 0xFFF0));
}
#define sound_update_frequency_step(timer_number) \
@@ -238,7 +238,7 @@ static void trigger_timer(u32 timer_number, u32 value)
timer[timer_number].prescale = prescale;
timer[timer_number].irq = (value >> 6) & 0x01;
- address16(io_registers, 0x100 + (timer_number * 4)) = -timer_reload;
+ write_ioreg(REG_TM0D + (timer_number * 2), (u32)(-timer_reload));
timer_reload <<= prescale;
timer[timer_number].count = timer_reload;
@@ -266,7 +266,7 @@ static void trigger_timer(u32 timer_number, u32 value)
timer[timer_number].stop_cpu_ticks = cpu_ticks;
}
}
- address16(io_registers, 0x102 + (timer_number * 4)) = value;
+ write_ioreg(REG_TM0CNT + (timer_number * 2), value);
}
// This table is configured for sequential access on system defaults
@@ -458,7 +458,7 @@ void function_cc write_eeprom(u32 unused_address, u32 value)
if(eeprom_size == EEPROM_512_BYTE)
{
eeprom_address =
- (address16(eeprom_buffer, 0) >> 2) * 8;
+ (readaddress16(eeprom_buffer, 0) >> 2) * 8;
}
else
{
@@ -508,10 +508,10 @@ void function_cc write_eeprom(u32 unused_address, u32 value)
u32 gamepak_index = address >> 15; \
u8 *map = memory_map_read[gamepak_index]; \
\
- if(!map) \
+ if(!map) \
map = load_gamepak_page(gamepak_index & 0x3FF); \
\
- value = address##type(map, address & 0x7FFF) \
+ value = readaddress##type(map, address & 0x7FFF) \
#define read_open8() \
if(!(reg[REG_CPSR] & 0x20)) \
@@ -580,29 +580,29 @@ u32 function_cc read_eeprom(void)
case 0x00: \
/* BIOS */ \
if(reg[REG_PC] >= 0x4000) \
- value = address##type(&bios_read_protect, address & 0x03); \
+ value = readaddress##type(&bios_read_protect, address & 0x03); \
else \
- value = address##type(bios_rom, address & 0x3FFF); \
+ value = readaddress##type(bios_rom, address & 0x3FFF); \
break; \
\
case 0x02: \
/* external work RAM */ \
- value = address##type(ewram, (address & 0x3FFFF)); \
+ value = readaddress##type(ewram, (address & 0x3FFFF)); \
break; \
\
case 0x03: \
/* internal work RAM */ \
- value = address##type(iwram, (address & 0x7FFF) + 0x8000); \
+ value = readaddress##type(iwram, (address & 0x7FFF) + 0x8000); \
break; \
\
case 0x04: \
/* I/O registers */ \
- value = address##type(io_registers, address & 0x3FF); \
+ value = readaddress##type(io_registers, address & 0x3FF); \
break; \
\
case 0x05: \
/* palette RAM */ \
- value = address##type(palette_ram, address & 0x3FF); \
+ value = readaddress##type(palette_ram, address & 0x3FF); \
break; \
\
case 0x06: \
@@ -611,12 +611,12 @@ u32 function_cc read_eeprom(void)
if(address > 0x18000) \
address -= 0x8000; \
\
- value = address##type(vram, address); \
+ value = readaddress##type(vram, address); \
break; \
\
case 0x07: \
/* OAM RAM */ \
- value = address##type(oam_ram, address & 0x3FF); \
+ value = readaddress##type(oam_ram, address & 0x3FF); \
break; \
\
case 0x08: \
@@ -660,12 +660,12 @@ static cpu_alert_type trigger_dma(u32 dma_number, u32 value)
if(dma[dma_number].start_type == DMA_INACTIVE)
{
u32 start_type = (value >> 12) & 0x03;
- u32 dest_address = address32(io_registers, (dma_number * 12) + 0xB4) &
+ u32 dest_address = readaddress32(io_registers, (dma_number * 12) + 0xB4) &
0xFFFFFFF;
dma[dma_number].dma_channel = dma_number;
dma[dma_number].source_address =
- address32(io_registers, (dma_number * 12) + 0xB0) & 0xFFFFFFF;
+ readaddress32(io_registers, (dma_number * 12) + 0xB0) & 0xFFFFFFF;
dma[dma_number].dest_address = dest_address;
dma[dma_number].source_direction = (value >> 7) & 0x03;
dma[dma_number].repeat_type = (value >> 9) & 0x01;
@@ -686,7 +686,7 @@ static cpu_alert_type trigger_dma(u32 dma_number, u32 value)
}
else
{
- u32 length = address16(io_registers, (dma_number * 12) + 0xB8);
+ u32 length = read_ioreg(REG_DMA0CNT_L + (dma_number * 6));
if((dma_number == 3) && ((dest_address >> 24) == 0x0D) &&
((length & 0x1F) == 17))
@@ -708,7 +708,7 @@ static cpu_alert_type trigger_dma(u32 dma_number, u32 value)
dma[dma_number].dest_direction = (value >> 5) & 0x03;
}
- address16(io_registers, (dma_number * 12) + 0xBA) = value;
+ write_ioreg(REG_DMA0CNT_H + (dma_number * 6), value);
if(start_type == DMA_START_IMMEDIATELY)
return dma_transfer(dma + dma_number);
}
@@ -717,7 +717,7 @@ static cpu_alert_type trigger_dma(u32 dma_number, u32 value)
{
dma[dma_number].start_type = DMA_INACTIVE;
dma[dma_number].direct_sound_channel = DMA_NO_DIRECT_SOUND;
- address16(io_registers, (dma_number * 12) + 0xBA) = value;
+ write_ioreg(REG_DMA0CNT_H + (dma_number * 6), value);
}
return CPU_ALERT_NONE;
@@ -731,10 +731,10 @@ static cpu_alert_type trigger_dma(u32 dma_number, u32 value)
value = ((address8(io_registers, address + 1)) << 8) | value \
#define access_register16_high(address) \
- value = (value << 16) | (address16(io_registers, address)) \
+ value = (value << 16) | (readaddress16(io_registers, address)) \
#define access_register16_low(address) \
- value = ((address16(io_registers, address + 2)) << 16) | value \
+ value = ((readaddress16(io_registers, address + 2)) << 16) | value \
cpu_alert_type function_cc write_io_register8(u32 address, u32 value)
{
@@ -743,7 +743,7 @@ cpu_alert_type function_cc write_io_register8(u32 address, u32 value)
{
case 0x00:
{
- u32 dispcnt = io_registers[REG_DISPCNT];
+ u32 dispcnt = read_ioreg(REG_DISPCNT);
if((value & 0x07) != (dispcnt & 0x07))
reg[OAM_UPDATED] = 1;
@@ -768,28 +768,28 @@ cpu_alert_type function_cc write_io_register8(u32 address, u32 value)
access_register8_low(0x28);
access_register16_low(0x28);
affine_reference_x[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x28) = value;
+ address32(io_registers, 0x28) = eswap32(value);
break;
case 0x29:
access_register8_high(0x28);
access_register16_low(0x28);
affine_reference_x[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x28) = value;
+ address32(io_registers, 0x28) = eswap32(value);
break;
case 0x2A:
access_register8_low(0x2A);
access_register16_high(0x28);
affine_reference_x[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x28) = value;
+ address32(io_registers, 0x28) = eswap32(value);
break;
case 0x2B:
access_register8_high(0x2A);
access_register16_high(0x28);
affine_reference_x[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x28) = value;
+ address32(io_registers, 0x28) = eswap32(value);
break;
// BG2 reference Y
@@ -797,28 +797,28 @@ cpu_alert_type function_cc write_io_register8(u32 address, u32 value)
access_register8_low(0x2C);
access_register16_low(0x2C);
affine_reference_y[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x2C) = value;
+ address32(io_registers, 0x2C) = eswap32(value);
break;
case 0x2D:
access_register8_high(0x2C);
access_register16_low(0x2C);
affine_reference_y[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x2C) = value;
+ address32(io_registers, 0x2C) = eswap32(value);
break;
case 0x2E:
access_register8_low(0x2E);
access_register16_high(0x2C);
affine_reference_y[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x2C) = value;
+ address32(io_registers, 0x2C) = eswap32(value);
break;
case 0x2F:
access_register8_high(0x2E);
access_register16_high(0x2C);
affine_reference_y[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x2C) = value;
+ address32(io_registers, 0x2C) = eswap32(value);
break;
// BG3 reference X
@@ -826,28 +826,28 @@ cpu_alert_type function_cc write_io_register8(u32 address, u32 value)
access_register8_low(0x38);
access_register16_low(0x38);
affine_reference_x[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x38) = value;
+ address32(io_registers, 0x38) = eswap32(value);
break;
case 0x39:
access_register8_high(0x38);
access_register16_low(0x38);
affine_reference_x[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x38) = value;
+ address32(io_registers, 0x38) = eswap32(value);
break;
case 0x3A:
access_register8_low(0x3A);
access_register16_high(0x38);
affine_reference_x[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x38) = value;
+ address32(io_registers, 0x38) = eswap32(value);
break;
case 0x3B:
access_register8_high(0x3A);
access_register16_high(0x38);
affine_reference_x[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x38) = value;
+ address32(io_registers, 0x38) = eswap32(value);
break;
// BG3 reference Y
@@ -855,28 +855,28 @@ cpu_alert_type function_cc write_io_register8(u32 address, u32 value)
access_register8_low(0x3C);
access_register16_low(0x3C);
affine_reference_y[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x3C) = value;
+ address32(io_registers, 0x3C) = eswap32(value);
break;
case 0x3D:
access_register8_high(0x3C);
access_register16_low(0x3C);
affine_reference_y[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x3C) = value;
+ address32(io_registers, 0x3C) = eswap32(value);
break;
case 0x3E:
access_register8_low(0x3E);
access_register16_high(0x3C);
affine_reference_y[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x3C) = value;
+ address32(io_registers, 0x3C) = eswap32(value);
break;
case 0x3F:
access_register8_high(0x3E);
access_register16_high(0x3C);
affine_reference_y[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x3C) = value;
+ address32(io_registers, 0x3C) = eswap32(value);
break;
// Sound 1 control sweep
@@ -1160,18 +1160,17 @@ cpu_alert_type function_cc write_io_register16(u32 address, u32 value)
{
case 0x00:
{
- u32 dispcnt = io_registers[REG_DISPCNT];
+ u32 dispcnt = read_ioreg(REG_DISPCNT);
if((value & 0x07) != (dispcnt & 0x07))
reg[OAM_UPDATED] = 1;
- address16(io_registers, 0x00) = value;
+ write_ioreg(REG_DISPCNT, value);
break;
}
// DISPSTAT
case 0x04:
- address16(io_registers, 0x04) =
- (address16(io_registers, 0x04) & 0x07) | (value & ~0x07);
+ write_ioreg(REG_DISPSTAT, (read_ioreg(REG_DISPSTAT) & 0x07) | (value & ~0x07));
break;
// VCOUNT
@@ -1182,26 +1181,26 @@ cpu_alert_type function_cc write_io_register16(u32 address, u32 value)
case 0x28:
access_register16_low(0x28);
affine_reference_x[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x28) = value;
+ address32(io_registers, 0x28) = eswap32(value);
break;
case 0x2A:
access_register16_high(0x28);
affine_reference_x[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x28) = value;
+ address32(io_registers, 0x28) = eswap32(value);
break;
// BG2 reference Y
case 0x2C:
access_register16_low(0x2C);
affine_reference_y[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x2C) = value;
+ address32(io_registers, 0x2C) = eswap32(value);
break;
case 0x2E:
access_register16_high(0x2C);
affine_reference_y[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x2C) = value;
+ address32(io_registers, 0x2C) = eswap32(value);
break;
// BG3 reference X
@@ -1209,26 +1208,26 @@ cpu_alert_type function_cc write_io_register16(u32 address, u32 value)
case 0x38:
access_register16_low(0x38);
affine_reference_x[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x38) = value;
+ address32(io_registers, 0x38) = eswap32(value);
break;
case 0x3A:
access_register16_high(0x38);
affine_reference_x[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x38) = value;
+ address32(io_registers, 0x38) = eswap32(value);
break;
// BG3 reference Y
case 0x3C:
access_register16_low(0x3C);
affine_reference_y[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x3C) = value;
+ address32(io_registers, 0x3C) = eswap32(value);
break;
case 0x3E:
access_register16_high(0x3C);
affine_reference_y[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x3C) = value;
+ address32(io_registers, 0x3C) = eswap32(value);
break;
// Sound 1 control sweep
@@ -1313,7 +1312,7 @@ cpu_alert_type function_cc write_io_register16(u32 address, u32 value)
case 0x9D:
case 0x9E:
gbc_sound_wave_update = 1;
- address16(io_registers, address) = value;
+ address16(io_registers, address) = eswap16(value);
break;
// Sound FIFO A
@@ -1382,7 +1381,7 @@ cpu_alert_type function_cc write_io_register16(u32 address, u32 value)
// Interrupt flag
case 0x202:
- address16(io_registers, 0x202) &= ~value;
+ write_ioreg(REG_IF, read_ioreg(REG_IF) & (~value));
break;
// WAITCNT
@@ -1399,7 +1398,7 @@ cpu_alert_type function_cc write_io_register16(u32 address, u32 value)
return CPU_ALERT_HALT;
default:
- address16(io_registers, address) = value;
+ address16(io_registers, address) = eswap16(value);
break;
}
@@ -1414,25 +1413,25 @@ cpu_alert_type function_cc write_io_register32(u32 address, u32 value)
// BG2 reference X
case 0x28:
affine_reference_x[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x28) = value;
+ address32(io_registers, 0x28) = eswap32(value);
break;
// BG2 reference Y
case 0x2C:
affine_reference_y[0] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x2C) = value;
+ address32(io_registers, 0x2C) = eswap32(value);
break;
// BG3 reference X
case 0x38:
affine_reference_x[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x38) = value;
+ address32(io_registers, 0x38) = eswap32(value);
break;
// BG3 reference Y
case 0x3C:
affine_reference_y[1] = (s32)(value << 4) >> 4;
- address32(io_registers, 0x3C) = value;
+ address32(io_registers, 0x3C) = eswap32(value);
break;
// Sound FIFO A
@@ -1468,7 +1467,7 @@ cpu_alert_type function_cc write_io_register32(u32 address, u32 value)
#define write_palette16(address, value) \
{ \
u32 palette_address = address; \
- address16(palette_ram, palette_address) = value; \
+ address16(palette_ram, palette_address) = eswap16(value); \
convert_palette(value); \
address16(palette_ram_converted, palette_address) = value; \
} \
@@ -1478,11 +1477,11 @@ cpu_alert_type function_cc write_io_register32(u32 address, u32 value)
u32 palette_address = address; \
u32 value_high = value >> 16; \
u32 value_low = value & 0xFFFF; \
- address32(palette_ram, palette_address) = value; \
+ address32(palette_ram, palette_address) = eswap32(value); \
convert_palette(value_high); \
+ address16(palette_ram_converted, palette_address + 2) = value_high; \
convert_palette(value_low); \
- value = (value_high << 16) | value_low; \
- address32(palette_ram_converted, palette_address) = value; \
+ address16(palette_ram_converted, palette_address) = value_low; \
} \
@@ -1616,13 +1615,13 @@ void function_cc write_backup(u32 address, u32 value)
#define write_vram8() \
address &= ~0x01; \
- address16(vram, address) = ((value << 8) | value) \
+ address16(vram, address) = eswap16((value << 8) | value) \
#define write_vram16() \
- address16(vram, address) = value \
+ address16(vram, address) = eswap16(value) \
#define write_vram32() \
- address32(vram, address) = value \
+ address32(vram, address) = eswap32(value) \
// RTC code derived from VBA's (due to lack of any real publically available
// documentation...)
@@ -1682,7 +1681,7 @@ static u32 encode_bcd(u8 value)
if(!map) \
map = load_gamepak_page(rtc_page_index & 0x3FF); \
\
- address16(map, update_address & 0x7FFF) = _value \
+ address16(map, update_address & 0x7FFF) = eswap16(_value) \
void function_cc write_rtc(u32 address, u32 value)
{
@@ -1897,12 +1896,12 @@ void function_cc write_rtc(u32 address, u32 value)
{ \
case 0x02: \
/* external work RAM */ \
- address##type(ewram, (address & 0x3FFFF)) = value; \
+ address##type(ewram, (address & 0x3FFFF)) = eswap##type(value); \
break; \
\
case 0x03: \
/* internal work RAM */ \
- address##type(iwram, (address & 0x7FFF) + 0x8000) = value; \
+ address##type(iwram, (address & 0x7FFF) + 0x8000) = eswap##type(value); \
break; \
\
case 0x04: \
@@ -1926,7 +1925,7 @@ void function_cc write_rtc(u32 address, u32 value)
case 0x07: \
/* OAM RAM */ \
reg[OAM_UPDATED] = 1; \
- address##type(oam_ram, address & 0x3FF) = value; \
+ address##type(oam_ram, address & 0x3FF) = eswap##type(value); \
break; \
\
case 0x08: \
@@ -2544,26 +2543,26 @@ dma_region_type dma_region_map[16] =
} \
#define dma_read_iwram(type, transfer_size) \
- read_value = address##transfer_size(iwram + 0x8000, type##_ptr & 0x7FFF) \
+ read_value = readaddress##transfer_size(iwram + 0x8000, type##_ptr & 0x7FFF)\
#define dma_read_vram(type, transfer_size) \
- read_value = address##transfer_size(vram, type##_ptr & 0x1FFFF) \
+ read_value = readaddress##transfer_size(vram, type##_ptr & 0x1FFFF) \
#define dma_read_io(type, transfer_size) \
- read_value = address##transfer_size(io_registers, type##_ptr & 0x7FFF) \
+ read_value = readaddress##transfer_size(io_registers, type##_ptr & 0x7FFF) \
#define dma_read_oam_ram(type, transfer_size) \
- read_value = address##transfer_size(oam_ram, type##_ptr & 0x3FF) \
+ read_value = readaddress##transfer_size(oam_ram, type##_ptr & 0x3FF) \
#define dma_read_palette_ram(type, transfer_size) \
- read_value = address##transfer_size(palette_ram, type##_ptr & 0x3FF) \
+ read_value = readaddress##transfer_size(palette_ram, type##_ptr & 0x3FF) \
#define dma_read_ewram(type, transfer_size) \
- read_value = address##transfer_size(ewram, type##_ptr & 0x3FFFF) \
+ read_value = readaddress##transfer_size(ewram, type##_ptr & 0x3FFFF) \
#define dma_read_gamepak(type, transfer_size) \
dma_gamepak_check_region(type); \
- read_value = address##transfer_size(type##_address_block, \
+ read_value = readaddress##transfer_size(type##_address_block, \
type##_ptr & 0x7FFF) \
// DMAing from the BIOS is funny, just returns 0..
@@ -2575,17 +2574,20 @@ dma_region_type dma_region_map[16] =
read_value = read_memory##transfer_size(type##_ptr) \
#define dma_write_iwram(type, transfer_size) \
- address##transfer_size(iwram + 0x8000, type##_ptr & 0x7FFF) = read_value; \
+ address##transfer_size(iwram + 0x8000, type##_ptr & 0x7FFF) = \
+ eswap##transfer_size(read_value); \
smc_trigger |= address##transfer_size(iwram, type##_ptr & 0x7FFF) \
#define dma_write_vram(type, transfer_size) \
- address##transfer_size(vram, type##_ptr & 0x1FFFF) = read_value \
+ address##transfer_size(vram, type##_ptr & 0x1FFFF) = \
+ eswap##transfer_size(read_value) \
#define dma_write_io(type, transfer_size) \
write_io_register##transfer_size(type##_ptr & 0x3FF, read_value) \
#define dma_write_oam_ram(type, transfer_size) \
- address##transfer_size(oam_ram, type##_ptr & 0x3FF) = read_value \
+ address##transfer_size(oam_ram, type##_ptr & 0x3FF) = \
+ eswap##transfer_size(read_value) \
#define dma_write_palette_ram(type, transfer_size) \
write_palette##transfer_size(type##_ptr & 0x3FF, read_value) \
@@ -2594,7 +2596,8 @@ dma_region_type dma_region_map[16] =
write_memory##transfer_size(type##_ptr, read_value) \
#define dma_write_ewram(type, transfer_size) \
- address##transfer_size(ewram, type##_ptr & 0x3FFFF) = read_value; \
+ address##transfer_size(ewram, type##_ptr & 0x3FFFF) = \
+ eswap##transfer_size(read_value); \
smc_trigger |= address##transfer_size(ewram, \
(type##_ptr & 0x3FFFF) + 0x40000) \
@@ -3034,8 +3037,8 @@ cpu_alert_type dma_transfer(dma_transfer_type *dma)
(dma->start_type == DMA_START_IMMEDIATELY))
{
dma->start_type = DMA_INACTIVE;
- address16(io_registers, (dma->dma_channel * 12) + 0xBA) &=
- (~0x8000);
+ address16(io_registers, (dma->dma_channel * 12) + 0xBA) =
+ readaddress16(io_registers, (dma->dma_channel * 12) + 0xBA) & (~0x8000);
}
if(dma->irq)
@@ -3208,13 +3211,13 @@ void init_memory(void)
memset(ewram, 0, sizeof(ewram));
memset(vram, 0, sizeof(vram));
- io_registers[REG_DISPCNT] = 0x80;
- io_registers[REG_P1] = 0x3FF;
- io_registers[REG_BG2PA] = 0x100;
- io_registers[REG_BG2PD] = 0x100;
- io_registers[REG_BG3PA] = 0x100;
- io_registers[REG_BG3PD] = 0x100;
- io_registers[REG_RCNT] = 0x8000;
+ write_ioreg(REG_DISPCNT, 0x80);
+ write_ioreg(REG_P1, 0x3FF);
+ write_ioreg(REG_BG2PA, 0x100);
+ write_ioreg(REG_BG2PD, 0x100);
+ write_ioreg(REG_BG3PA, 0x100);
+ write_ioreg(REG_BG3PD, 0x100);
+ write_ioreg(REG_RCNT, 0x8000);
backup_type = BACKUP_NONE;
diff --git a/gba_memory.h b/gba_memory.h
index 5319a30..0f9dc3a 100644
--- a/gba_memory.h
+++ b/gba_memory.h
@@ -122,6 +122,19 @@ typedef enum
REG_BLDCNT = 0x28,
REG_BLDALPHA = 0x29,
REG_BLDY = 0x2A,
+ REG_SOUND1CNT_L = 0x30,
+ REG_SOUND1CNT_H = 0x31,
+ REG_SOUND3CNT_L = 0x38,
+ REG_SOUND3CNT_H = 0x39,
+ REG_SOUND3CNT_X = 0x3A,
+ REG_SOUND4CNT_H = 0x3E,
+ REG_SOUNDCNT_L = 0x40,
+ REG_SOUNDCNT_H = 0x41,
+ REG_SOUNDCNT_X = 0x42,
+ REG_DMA0SAD = 0x58,
+ REG_DMA0DAD = 0x5A,
+ REG_DMA0CNT_L = 0x5C,
+ REG_DMA0CNT_H = 0x5D,
REG_TM0D = 0x80,
REG_TM0CNT = 0x81,
REG_TM1D = 0x82,
diff --git a/input.c b/input.c
index 9aef248..e030596 100644
--- a/input.c
+++ b/input.c
@@ -38,7 +38,7 @@ extern void set_fastforward_override(bool fastforward);
static void trigger_key(u32 key)
{
- u32 p1_cnt = io_registers[REG_P1CNT];
+ u32 p1_cnt = read_ioreg(REG_P1CNT);
if((p1_cnt >> 14) & 0x01)
{
@@ -121,7 +121,7 @@ u32 update_input(void)
trigger_key(new_key);
old_key = new_key;
- io_registers[REG_P1] = (~old_key) & 0x3FF;
+ write_ioreg(REG_P1, (~old_key) & 0x3FF);
/* Handle fast forward button */
if (libretro_ff_enabled != libretro_ff_enabled_prev)
diff --git a/main.c b/main.c
index 260edd5..461dbcf 100644
--- a/main.c
+++ b/main.c
@@ -63,7 +63,7 @@ static void update_timers(irq_type *irq_raised)
{
timer[i].count -= execute_cycles;
/* io_registers accessors range: REG_TM0D, REG_TM1D, REG_TM2D, REG_TM3D */
- io_registers[128 + (i * 2)] = -(timer[i].count > timer[i].prescale);
+ write_ioreg(REG_TM0D + (i * 2), -(timer[i].count > timer[i].prescale));
}
if(timer[i].count > 0)
@@ -76,7 +76,7 @@ static void update_timers(irq_type *irq_raised)
if((i != 3) && (timer[i + 1].status == TIMER_CASCADE))
{
timer[i + 1].count--;
- io_registers[REG_TM0D + (i + 1) * 2] = -(timer[i + 1].count);
+ write_ioreg(REG_TM0D + (i + 1) * 2, -timer[i+1].count);
}
if(i < 2)
@@ -146,8 +146,8 @@ u32 update_gba(void)
if(video_count <= 0)
{
- u32 vcount = io_registers[REG_VCOUNT];
- u32 dispstat = io_registers[REG_DISPSTAT];
+ u32 vcount = read_ioreg(REG_VCOUNT);
+ u32 dispstat = read_ioreg(REG_DISPSTAT);
if((dispstat & 0x02) == 0)
{
@@ -162,7 +162,7 @@ u32 update_gba(void)
oam_update_count++;
if(no_alpha)
- io_registers[REG_BLDCNT] = 0;
+ write_ioreg(REG_BLDCNT, 0);
update_scanline();
// If in visible area also fire HDMA
@@ -196,13 +196,13 @@ u32 update_gba(void)
}
affine_reference_x[0] =
- (s32)(address32(io_registers, 0x28) << 4) >> 4;
+ (s32)(readaddress32(io_registers, 0x28) << 4) >> 4;
affine_reference_y[0] =
- (s32)(address32(io_registers, 0x2C) << 4) >> 4;
+ (s32)(readaddress32(io_registers, 0x2C) << 4) >> 4;
affine_reference_x[1] =
- (s32)(address32(io_registers, 0x38) << 4) >> 4;
+ (s32)(readaddress32(io_registers, 0x38) << 4) >> 4;
affine_reference_y[1] =
- (s32)(address32(io_registers, 0x3C) << 4) >> 4;
+ (s32)(readaddress32(io_registers, 0x3C) << 4) >> 4;
for(i = 0; i < 4; i++)
{
@@ -251,9 +251,9 @@ u32 update_gba(void)
else
dispstat &= ~0x04;
- io_registers[REG_VCOUNT] = vcount;
+ write_ioreg(REG_VCOUNT, vcount);
}
- io_registers[REG_DISPSTAT] = dispstat;
+ write_ioreg(REG_DISPSTAT, dispstat);
}
if(irq_raised)
diff --git a/sound.c b/sound.c
index 10a3261..bc88fff 100644
--- a/sound.c
+++ b/sound.c
@@ -437,7 +437,7 @@ void update_gbc_sound(u32 cpu_ticks)
s32 volume_left, volume_right;
u32 envelope_volume;
s32 current_sample;
- u32 sound_status = address16(io_registers, 0x84) & 0xFFF0;
+ u16 sound_status = read_ioreg(REG_SOUNDCNT_X) & 0xFFF0;
s8 *sample_data;
s8 *wave_bank;
u8 *wave_ram = ((u8 *)io_registers) + 0x90;
@@ -521,7 +521,7 @@ void update_gbc_sound(u32 cpu_ticks)
}
}
- address16(io_registers, 0x84) = sound_status;
+ write_ioreg(REG_SOUNDCNT_X, sound_status);
gbc_sound_last_cpu_ticks = cpu_ticks;
gbc_sound_buffer_index =
diff --git a/video.c b/video.c
index 4221f25..274b39c 100644
--- a/video.c
+++ b/video.c
@@ -31,22 +31,8 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
u32 enable_flags, u32 dispcnt, u32 bldcnt, const bitmap_layer_render_struct
*layer_renderers);
-#define no_op \
-
-// This old version is not necessary if the palette is either being converted
-// transparently or the ABGR 1555 format is being used natively. The direct
-// version (without conversion) is much faster.
-
-#define tile_lookup_palette_full(palette, source) \
- current_pixel = palette[source]; \
- convert_palette(current_pixel) \
-
-#define tile_lookup_palette(palette, source) \
- current_pixel = palette[source]; \
-
-
#define tile_expand_base_normal(index) \
- tile_lookup_palette(palette, current_pixel); \
+ current_pixel = palette[current_pixel]; \
dest_ptr[index] = current_pixel \
#define tile_expand_transparent_normal(index) \
@@ -68,14 +54,14 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define color_combine_mask_a(layer) \
- ((io_registers[REG_BLDCNT] >> layer) & 0x01) \
+ ((read_ioreg(REG_BLDCNT) >> layer) & 0x01) \
// For color blending operations, will create a mask that has in bit
// 10 if the layer is target B, and bit 9 if the layer is target A.
#define color_combine_mask(layer) \
(color_combine_mask_a(layer) | \
- ((io_registers[REG_BLDCNT] >> (layer + 7)) & 0x02)) << 9 \
+ ((read_ioreg(REG_BLDCNT) >> (layer + 7)) & 0x02)) << 9 \
// For alpha blending renderers, draw the palette index (9bpp) and
// layer bits rather than the raw RGB. For the base this should write to
@@ -183,7 +169,7 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
// Get the current tile from the map in 8bpp mode
#define get_tile_8bpp() \
- current_tile = *map_ptr; \
+ current_tile = eswap16(*map_ptr); \
tile_ptr = tile_base + ((current_tile & 0x3FF) * 64) \
@@ -243,16 +229,16 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define partial_tile_right_noflip_8bpp(combine_op, alpha_op) \
if(partial_tile_offset >= 4) \
{ \
- current_pixels = *((u32 *)(tile_ptr + 4)) >> \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))) >> \
((partial_tile_offset - 4) * 8); \
partial_tile_8bpp(combine_op, alpha_op); \
} \
else \
{ \
partial_tile_run -= 4; \
- current_pixels = *((u32 *)tile_ptr) >> (partial_tile_offset * 8); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)) >> (partial_tile_offset * 8);\
partial_tile_8bpp(combine_op, alpha_op); \
- current_pixels = *((u32 *)(tile_ptr + 4)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))); \
tile_8bpp_draw_four_##combine_op(0, alpha_op, noflip); \
advance_dest_ptr_##combine_op(4); \
} \
@@ -264,19 +250,19 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define partial_tile_mid_noflip_8bpp(combine_op, alpha_op) \
if(partial_tile_offset >= 4) \
{ \
- current_pixels = *((u32 *)(tile_ptr + 4)) >> \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))) >> \
((partial_tile_offset - 4) * 8); \
} \
else \
{ \
- current_pixels = *((u32 *)tile_ptr) >> (partial_tile_offset * 8); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)) >> (partial_tile_offset * 8);\
if((partial_tile_offset + partial_tile_run) > 4) \
{ \
u32 old_run = partial_tile_run; \
partial_tile_run = 4 - partial_tile_offset; \
partial_tile_8bpp(combine_op, alpha_op); \
partial_tile_run = old_run - partial_tile_run; \
- current_pixels = *((u32 *)(tile_ptr + 4)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))); \
} \
} \
partial_tile_8bpp(combine_op, alpha_op); \
@@ -288,23 +274,23 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define partial_tile_left_noflip_8bpp(combine_op, alpha_op) \
if(partial_tile_run >= 4) \
{ \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
tile_8bpp_draw_four_##combine_op(0, alpha_op, noflip); \
advance_dest_ptr_##combine_op(4); \
tile_ptr += 4; \
partial_tile_run -= 4; \
} \
\
- current_pixels = *((u32 *)(tile_ptr)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr))); \
partial_tile_8bpp(combine_op, alpha_op) \
// Draws a non-clipped (complete) 8bpp tile.
#define tile_noflip_8bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
tile_8bpp_draw_four_##combine_op(0, alpha_op, noflip); \
- current_pixels = *((u32 *)(tile_ptr + 4)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))); \
tile_8bpp_draw_four_##combine_op(4, alpha_op, noflip) \
@@ -321,26 +307,28 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define partial_tile_right_flip_8bpp(combine_op, alpha_op) \
if(partial_tile_offset >= 4) \
{ \
- current_pixels = *((u32 *)tile_ptr) << ((partial_tile_offset - 4) * 8); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)) << \
+ ((partial_tile_offset - 4) * 8); \
partial_tile_flip_8bpp(combine_op, alpha_op); \
} \
else \
{ \
partial_tile_run -= 4; \
- current_pixels = *((u32 *)(tile_ptr + 4)) << \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))) << \
((partial_tile_offset - 4) * 8); \
partial_tile_flip_8bpp(combine_op, alpha_op); \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
tile_8bpp_draw_four_##combine_op(0, alpha_op, flip); \
advance_dest_ptr_##combine_op(4); \
} \
#define partial_tile_mid_flip_8bpp(combine_op, alpha_op) \
if(partial_tile_offset >= 4) \
- current_pixels = *((u32 *)tile_ptr) << ((partial_tile_offset - 4) * 8); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)) << \
+ ((partial_tile_offset - 4) * 8); \
else \
{ \
- current_pixels = *((u32 *)(tile_ptr + 4)) << \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))) << \
((partial_tile_offset - 4) * 8); \
\
if((partial_tile_offset + partial_tile_run) > 4) \
@@ -349,7 +337,7 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
partial_tile_run = 4 - partial_tile_offset; \
partial_tile_flip_8bpp(combine_op, alpha_op); \
partial_tile_run = old_run - partial_tile_run; \
- current_pixels = *((u32 *)(tile_ptr)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr))); \
} \
} \
partial_tile_flip_8bpp(combine_op, alpha_op); \
@@ -357,20 +345,20 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define partial_tile_left_flip_8bpp(combine_op, alpha_op) \
if(partial_tile_run >= 4) \
{ \
- current_pixels = *((u32 *)(tile_ptr + 4)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))); \
tile_8bpp_draw_four_##combine_op(0, alpha_op, flip); \
advance_dest_ptr_##combine_op(4); \
tile_ptr -= 4; \
partial_tile_run -= 4; \
} \
\
- current_pixels = *((u32 *)(tile_ptr + 4)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))); \
partial_tile_flip_8bpp(combine_op, alpha_op) \
#define tile_flip_8bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)(tile_ptr + 4)); \
+ current_pixels = eswap32(*((u32 *)(tile_ptr + 4))); \
tile_8bpp_draw_four_##combine_op(0, alpha_op, flip); \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
tile_8bpp_draw_four_##combine_op(4, alpha_op, flip) \
@@ -536,7 +524,7 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
// the pixel block.
#define get_tile_4bpp() \
- current_tile = *map_ptr; \
+ current_tile = eswap16(*map_ptr); \
current_palette = (current_tile >> 12) << 4; \
tile_ptr = tile_base + ((current_tile & 0x3FF) * 32); \
@@ -557,7 +545,7 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
// how many to draw.
#define partial_tile_right_noflip_4bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)tile_ptr) >> (partial_tile_offset * 4); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)) >> (partial_tile_offset * 4); \
partial_tile_4bpp(combine_op, alpha_op) \
@@ -571,13 +559,13 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
// partial_tile_offset is how many to draw.
#define partial_tile_left_noflip_4bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
partial_tile_4bpp(combine_op, alpha_op) \
// Draws a complete 4bpp tile row (not clipped)
#define tile_noflip_4bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
tile_4bpp_draw_eight_##combine_op(alpha_op, noflip) \
@@ -592,18 +580,18 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
} \
#define partial_tile_right_flip_4bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)tile_ptr) << (partial_tile_offset * 4); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)) << (partial_tile_offset * 4); \
partial_tile_flip_4bpp(combine_op, alpha_op) \
#define partial_tile_mid_flip_4bpp(combine_op, alpha_op) \
partial_tile_right_flip_4bpp(combine_op, alpha_op) \
#define partial_tile_left_flip_4bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
partial_tile_flip_4bpp(combine_op, alpha_op) \
#define tile_flip_4bpp(combine_op, alpha_op) \
- current_pixels = *((u32 *)tile_ptr); \
+ current_pixels = eswap32(*((u32 *)tile_ptr)); \
tile_4bpp_draw_eight_##combine_op(alpha_op, flip) \
@@ -868,13 +856,13 @@ static void render_scanline_text_base_normal(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_base_normal(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -1055,13 +1043,13 @@ static void render_scanline_text_transparent_normal(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_transparent_normal(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -1241,13 +1229,13 @@ static void render_scanline_text_base_color16(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_base_color16(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -1426,13 +1414,13 @@ static void render_scanline_text_transparent_color16(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_transparent_color16(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -1611,13 +1599,13 @@ static void render_scanline_text_base_color32(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_base_color32(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -1796,13 +1784,13 @@ static void render_scanline_text_transparent_color32(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_transparent_color32(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -1983,13 +1971,13 @@ static void render_scanline_text_base_alpha(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_base_alpha(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -2166,13 +2154,13 @@ static void render_scanline_text_transparent_alpha(u32 layer,
u32 start, u32 end, void *scanline)
{
render_scanline_extra_variables_transparent_alpha(text);
- u32 bg_control = io_registers[REG_BG0CNT + layer];
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer);
u32 map_size = (bg_control >> 14) & 0x03;
u32 map_width = map_widths[map_size];
u32 horizontal_offset =
- (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512;
- u32 vertical_offset = (io_registers[REG_VCOUNT] +
- io_registers[REG_BG0VOFS + (layer * 2)]) % 512;
+ (read_ioreg(REG_BG0HOFS + (layer * 2)) + start) % 512;
+ u32 vertical_offset = (read_ioreg(REG_VCOUNT) +
+ read_ioreg(REG_BG0VOFS + (layer * 2))) % 512;
u32 current_pixel;
u32 current_pixels;
u32 partial_tile_run = 0;
@@ -2522,7 +2510,7 @@ void render_scanline_affine_##combine_op##_##alpha_op(u32 layer, \
u32 start, u32 end, void *scanline) \
{ \
render_scanline_extra_variables_##combine_op##_##alpha_op(affine); \
- u32 bg_control = io_registers[REG_BG0CNT + layer]; \
+ u32 bg_control = read_ioreg(REG_BG0CNT + layer); \
u32 current_pixel; \
s32 source_x, source_y; \
u32 pixel_x, pixel_y; \
@@ -2539,8 +2527,8 @@ void render_scanline_affine_##combine_op##_##alpha_op(u32 layer, \
render_scanline_dest_##alpha_op *dest_ptr = \
((render_scanline_dest_##alpha_op *)scanline) + start; \
\
- dx = (s16)io_registers[REG_BG2PA + layer_offset]; \
- dy = (s16)io_registers[REG_BG2PC + layer_offset]; \
+ dx = (s16)read_ioreg(REG_BG2PA + layer_offset); \
+ dy = (s16)read_ioreg(REG_BG2PC + layer_offset); \
source_x = affine_reference_x[layer - 2] + (start * dx); \
source_y = affine_reference_y[layer - 2] + (start * dy); \
\
@@ -2609,7 +2597,7 @@ render_scanline_affine_builder(transparent, alpha);
\
for(i = 0; (s32)i < (s32)end; i++) \
{ \
- current_pixel = *src_ptr; \
+ current_pixel = srcread_##type(*src_ptr); \
bitmap_render_pixel_##type(alpha_op); \
src_ptr++; \
dest_ptr++; \
@@ -2637,7 +2625,7 @@ render_scanline_affine_builder(transparent, alpha);
if((u32)pixel_x >= (u32)width) \
break; \
\
- current_pixel = src_ptr[pixel_x]; \
+ current_pixel = srcread_##type(src_ptr[pixel_x]); \
bitmap_render_pixel_##type(alpha_op); \
\
source_x += dx; \
@@ -2669,7 +2657,7 @@ render_scanline_affine_builder(transparent, alpha);
if(((u32)pixel_x >= (u32)width) || ((u32)pixel_y >= (u32)height)) \
break; \
\
- current_pixel = src_ptr[pixel_x + (pixel_y * width)]; \
+ current_pixel = srcread_##type(src_ptr[pixel_x + (pixel_y * width)]); \
bitmap_render_pixel_##type(alpha_op); \
\
source_x += dx; \
@@ -2683,16 +2671,19 @@ render_scanline_affine_builder(transparent, alpha);
#define render_scanline_vram_setup_mode5() \
u16 *src_ptr = (u16 *)vram; \
- if(io_registers[REG_DISPCNT] & 0x10) \
+ if(read_ioreg(REG_DISPCNT) & 0x10) \
src_ptr = (u16 *)(vram + 0xA000); \
#define render_scanline_vram_setup_mode4() \
u16 *palette = palette_ram_converted; \
u8 *src_ptr = vram; \
- if(io_registers[REG_DISPCNT] & 0x10) \
+ if(read_ioreg(REG_DISPCNT) & 0x10) \
src_ptr = vram + 0xA000; \
+#define srcread_mode3(v) eswap16(v)
+#define srcread_mode5(v) eswap16(v)
+#define srcread_mode4(v) (v)
// Build bitmap scanline rendering functions.
@@ -2705,8 +2696,8 @@ static void render_scanline_bitmap_##type##_##alpha_op(u32 start, u32 end, \
s32 source_x, source_y; \
s32 pixel_x, pixel_y; \
\
- s32 dx = (s16)io_registers[REG_BG2PA]; \
- s32 dy = (s16)io_registers[REG_BG2PC]; \
+ s32 dx = (s16)read_ioreg(REG_BG2PA); \
+ s32 dy = (s16)read_ioreg(REG_BG2PC); \
\
u32 i; \
\
@@ -3058,11 +3049,11 @@ static const bitmap_layer_render_struct bitmap_mode_renderers[3] =
#define obj_render_affine(combine_op, color_depth, alpha_op, map_space) \
{ \
- s16 *params = (s16 *)oam_ram + (((obj_attribute_1 >> 9) & 0x1F) * 16); \
- s32 dx = params[3]; \
- s32 dmx = params[7]; \
- s32 dy = params[11]; \
- s32 dmy = params[15]; \
+ u16 *params = (u16 *)oam_ram + (((obj_attribute_1 >> 9) & 0x1F) * 16); \
+ s32 dx = (s16)eswap16(params[3]); \
+ s32 dmx = (s16)eswap16(params[7]); \
+ s32 dy = (s16)eswap16(params[11]); \
+ s32 dmy = (s16)eswap16(params[15]); \
s32 source_x, source_y; \
s32 tile_x, tile_y; \
u32 tile_map_offset; \
@@ -3163,9 +3154,9 @@ static u32 obj_alpha_count[160];
u32 dest \
#define render_scanline_obj_extra_variables_copy(type) \
- u32 bldcnt = io_registers[REG_BLDCNT]; \
- u32 dispcnt = io_registers[REG_DISPCNT]; \
- u32 obj_enable = io_registers[REG_WINOUT] >> 8; \
+ u32 bldcnt = read_ioreg(REG_BLDCNT); \
+ u32 dispcnt = read_ioreg(REG_DISPCNT); \
+ u32 obj_enable = read_ioreg(REG_WINOUT) >> 8; \
render_scanline_layer_functions_##type(); \
u32 copy_start, copy_end; \
u16 copy_buffer[240]; \
@@ -3278,7 +3269,7 @@ static void render_scanline_obj_##alpha_op##_##map_space(u32 priority, \
s32 obj_size; \
s32 obj_width, obj_height; \
u32 obj_attribute_0, obj_attribute_1, obj_attribute_2; \
- s32 vcount = io_registers[REG_VCOUNT]; \
+ s32 vcount = read_ioreg(REG_VCOUNT); \
u32 tile_run; \
u32 current_pixels; \
u32 current_pixel; \
@@ -3296,9 +3287,9 @@ static void render_scanline_obj_##alpha_op##_##map_space(u32 priority, \
for(obj_num = 0; obj_num < obj_count; obj_num++) \
{ \
oam_ptr = oam_ram + (obj_list[obj_num] * 4); \
- obj_attribute_0 = oam_ptr[0]; \
- obj_attribute_1 = oam_ptr[1]; \
- obj_attribute_2 = oam_ptr[2]; \
+ obj_attribute_0 = eswap16(oam_ptr[0]); \
+ obj_attribute_1 = eswap16(oam_ptr[1]); \
+ obj_attribute_2 = eswap16(oam_ptr[2]); \
obj_size = ((obj_attribute_0 >> 12) & 0x0C) | (obj_attribute_1 >> 14); \
\
obj_x = (s32)(obj_attribute_1 << 23) >> 23; \
@@ -3355,8 +3346,8 @@ static void order_obj(u32 video_mode)
for(obj_num = 127; obj_num >= 0; obj_num--, oam_ptr -= 4)
{
- obj_attribute_0 = oam_ptr[0];
- obj_attribute_2 = oam_ptr[2];
+ obj_attribute_0 = eswap16(oam_ptr[0]);
+ obj_attribute_2 = eswap16(oam_ptr[2]);
obj_size = obj_attribute_0 & 0xC000;
obj_priority = (obj_attribute_2 >> 10) & 0x03;
obj_mode = (obj_attribute_0 >> 10) & 0x03;
@@ -3369,7 +3360,7 @@ static void order_obj(u32 video_mode)
if(obj_y > 160)
obj_y -= 256;
- obj_attribute_1 = oam_ptr[1];
+ obj_attribute_1 = eswap16(oam_ptr[1]);
obj_size = ((obj_size >> 12) & 0x0C) | (obj_attribute_1 >> 14);
obj_height = obj_height_table[obj_size];
obj_width = obj_width_table[obj_size];
@@ -3436,14 +3427,14 @@ static void order_layers(u32 layer_flags)
for(layer_number = 3; layer_number >= 0; layer_number--)
{
if(((layer_flags >> layer_number) & 1) &&
- ((io_registers[REG_BG0CNT + layer_number] & 0x03) == priority))
+ ((read_ioreg(REG_BG0CNT + layer_number) & 0x03) == priority))
{
layer_order[layer_count] = layer_number;
layer_count++;
}
}
- if((obj_priority_count[priority][io_registers[REG_VCOUNT]] > 0)
+ if((obj_priority_count[priority][read_ioreg(REG_VCOUNT)] > 0)
&& (layer_flags & 0x10))
{
layer_order[layer_count] = priority | 0x04;
@@ -3614,7 +3605,7 @@ void expand_blend(u32 *screen_src_ptr, u16 *screen_dest_ptr,
{
u32 pixel_pair;
u32 pixel_top, pixel_bottom;
- u32 bldalpha = io_registers[REG_BLDALPHA];
+ u32 bldalpha = read_ioreg(REG_BLDALPHA);
u32 blend_a = bldalpha & 0x1F;
u32 blend_b = (bldalpha >> 8) & 0x1F;
u32 i;
@@ -3645,7 +3636,7 @@ static void expand_darken(u16 *screen_src_ptr, u16 *screen_dest_ptr,
u32 start, u32 end)
{
u32 pixel_top;
- s32 blend = 16 - (io_registers[REG_BLDY] & 0x1F);
+ s32 blend = 16 - (read_ioreg(REG_BLDY) & 0x1F);
u32 i;
if(blend < 0)
@@ -3661,7 +3652,7 @@ static void expand_brighten(u16 *screen_src_ptr, u16 *screen_dest_ptr,
u32 start, u32 end)
{
u32 pixel_top;
- u32 blend = io_registers[REG_BLDY] & 0x1F;
+ u32 blend = read_ioreg(REG_BLDY) & 0x1F;
u32 upper;
u32 i;
@@ -3682,10 +3673,10 @@ static void expand_brighten(u16 *screen_src_ptr, u16 *screen_dest_ptr,
static void expand_darken_partial_alpha(u32 *screen_src_ptr, u16 *screen_dest_ptr,
u32 start, u32 end)
{
- s32 blend = 16 - (io_registers[REG_BLDY] & 0x1F);
+ s32 blend = 16 - (read_ioreg(REG_BLDY) & 0x1F);
u32 pixel_pair;
u32 pixel_top, pixel_bottom;
- u32 bldalpha = io_registers[REG_BLDALPHA];
+ u32 bldalpha = read_ioreg(REG_BLDALPHA);
u32 blend_a = bldalpha & 0x1F;
u32 blend_b = (bldalpha >> 8) & 0x1F;
u32 i;
@@ -3706,10 +3697,10 @@ static void expand_darken_partial_alpha(u32 *screen_src_ptr, u16 *screen_dest_pt
static void expand_brighten_partial_alpha(u32 *screen_src_ptr, u16 *screen_dest_ptr,
u32 start, u32 end)
{
- s32 blend = io_registers[REG_BLDY] & 0x1F;
+ s32 blend = read_ioreg(REG_BLDY) & 0x1F;
u32 pixel_pair;
u32 pixel_top, pixel_bottom;
- u32 bldalpha = io_registers[REG_BLDALPHA];
+ u32 bldalpha = read_ioreg(REG_BLDALPHA);
u32 blend_a = bldalpha & 0x1F;
u32 blend_b = (bldalpha >> 8) & 0x1F;
u32 upper;
@@ -3784,20 +3775,20 @@ static void expand_brighten_partial_alpha(u32 *screen_src_ptr, u16 *screen_dest_
} \
#define render_condition_alpha \
- (((io_registers[REG_BLDALPHA] & 0x1F1F) != 0x001F) && \
- ((io_registers[REG_BLDCNT] & 0x3F) != 0) && \
- ((io_registers[REG_BLDCNT] & 0x3F00) != 0)) \
+ (((read_ioreg(REG_BLDALPHA) & 0x1F1F) != 0x001F) && \
+ ((read_ioreg(REG_BLDCNT) & 0x3F) != 0) && \
+ ((read_ioreg(REG_BLDCNT) & 0x3F00) != 0)) \
#define render_condition_fade \
- (((io_registers[REG_BLDY] & 0x1F) != 0) && \
- ((io_registers[REG_BLDCNT] & 0x3F) != 0)) \
+ (((read_ioreg(REG_BLDY) & 0x1F) != 0) && \
+ ((read_ioreg(REG_BLDCNT) & 0x3F) != 0)) \
#define render_layers_color_effect(renderer, layer_condition, \
alpha_condition, fade_condition, _start, _end) \
{ \
if(layer_condition) \
{ \
- if(obj_alpha_count[io_registers[REG_VCOUNT]] > 0) \
+ if(obj_alpha_count[read_ioreg(REG_VCOUNT)] > 0) \
{ \
/* Render based on special effects mode. */ \
u32 screen_buffer[240]; \
@@ -3902,7 +3893,7 @@ static void expand_brighten_partial_alpha(u32 *screen_src_ptr, u16 *screen_dest_
{ \
if(color_combine_mask_a(5)) \
{ \
- u32 blend = io_registers[REG_BLDY] & 0x1F; \
+ u32 blend = read_ioreg(REG_BLDY) & 0x1F; \
u32 upper; \
\
if(blend > 16) \
@@ -3921,7 +3912,7 @@ static void expand_brighten_partial_alpha(u32 *screen_src_ptr, u16 *screen_dest_
{ \
if(color_combine_mask_a(5)) \
{ \
- s32 blend = 16 - (io_registers[REG_BLDY] & 0x1F); \
+ s32 blend = 16 - (read_ioreg(REG_BLDY) & 0x1F); \
\
if(blend < 0) \
blend = 0; \
@@ -3942,7 +3933,7 @@ static void render_scanline_tile(u16 *scanline, u32 dispcnt)
{
u32 current_layer;
u32 layer_order_pos;
- u32 bldcnt = io_registers[REG_BLDCNT];
+ u32 bldcnt = read_ioreg(REG_BLDCNT);
render_scanline_layer_functions_tile();
render_layers_color_effect(render_layers, layer_count,
@@ -4116,9 +4107,9 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define window_x_coords(window_number) \
window_##window_number##_x1 = \
- io_registers[REG_WIN##window_number##H] >> 8; \
+ read_ioreg(REG_WIN##window_number##H) >> 8; \
window_##window_number##_x2 = \
- io_registers[REG_WIN##window_number##H] & 0xFF; \
+ read_ioreg(REG_WIN##window_number##H) & 0xFF; \
window_##window_number##_enable = \
(winin >> (window_number * 8)) & 0x3F; \
\
@@ -4133,9 +4124,9 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
u32 window_##window_number##_y1, window_##window_number##_y2; \
u32 window_##window_number##_enable = 0; \
window_##window_number##_y1 = \
- io_registers[REG_WIN##window_number##V] >> 8; \
+ read_ioreg(REG_WIN##window_number##V) >> 8; \
window_##window_number##_y2 = \
- io_registers[REG_WIN##window_number##V] & 0xFF; \
+ read_ioreg(REG_WIN##window_number##V) & 0xFF; \
\
if(window_##window_number##_y1 > window_##window_number##_y2) \
{ \
@@ -4306,7 +4297,7 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define render_window_single(type, window_number) \
- u32 winin = io_registers[REG_WININ]; \
+ u32 winin = read_ioreg(REG_WININ); \
window_coords(window_number); \
if(window_##window_number##_x1 > window_##window_number##_x2) \
{ \
@@ -4344,9 +4335,9 @@ static void render_scanline_conditional_bitmap(u32 start, u32 end, u16 *scanline
#define render_scanline_window_builder(type) \
static void render_scanline_window_##type(u16 *scanline, u32 dispcnt) \
{ \
- u32 vcount = io_registers[REG_VCOUNT]; \
- u32 winout = io_registers[REG_WINOUT]; \
- u32 bldcnt = io_registers[REG_BLDCNT]; \
+ u32 vcount = read_ioreg(REG_VCOUNT); \
+ u32 winout = read_ioreg(REG_WINOUT); \
+ u32 bldcnt = read_ioreg(REG_BLDCNT); \
u32 window_out_enable = winout & 0x3F; \
\
render_scanline_layer_functions_##type(); \
@@ -4370,7 +4361,7 @@ static void render_scanline_window_##type(u16 *scanline, u32 dispcnt) \
/* Windows 1 and 2 */ \
case 0x03: \
{ \
- u32 winin = io_registers[REG_WININ]; \
+ u32 winin = read_ioreg(REG_WININ); \
window_coords(0); \
window_coords(1); \
render_window_multi(type, 0, 1); \
@@ -4387,7 +4378,7 @@ static void render_scanline_window_##type(u16 *scanline, u32 dispcnt) \
/* Window 0 and OBJ window */ \
case 0x05: \
{ \
- u32 winin = io_registers[REG_WININ]; \
+ u32 winin = read_ioreg(REG_WININ); \
window_coords(0); \
render_window_multi(type, 0, obj); \
break; \
@@ -4396,7 +4387,7 @@ static void render_scanline_window_##type(u16 *scanline, u32 dispcnt) \
/* Window 1 and OBJ window */ \
case 0x06: \
{ \
- u32 winin = io_registers[REG_WININ]; \
+ u32 winin = read_ioreg(REG_WININ); \
window_coords(1); \
render_window_multi(type, 1, obj); \
break; \
@@ -4405,7 +4396,7 @@ static void render_scanline_window_##type(u16 *scanline, u32 dispcnt) \
/* Window 0, 1, and OBJ window */ \
case 0x07: \
{ \
- u32 winin = io_registers[REG_WININ]; \
+ u32 winin = read_ioreg(REG_WININ); \
window_coords(0); \
window_coords(1); \
render_window_multi(type, 0, 1_obj); \
@@ -4422,8 +4413,8 @@ static const u32 active_layers[6] = { 0x1F, 0x17, 0x1C, 0x14, 0x14, 0x14 };
void update_scanline(void)
{
u32 pitch = get_screen_pitch();
- u32 dispcnt = io_registers[REG_DISPCNT];
- u32 vcount = io_registers[REG_VCOUNT];
+ u32 dispcnt = read_ioreg(REG_DISPCNT);
+ u32 vcount = read_ioreg(REG_VCOUNT);
u16 *screen_offset = get_screen_pixels() + (vcount * pitch);
u32 video_mode = dispcnt & 0x07;
@@ -4467,10 +4458,10 @@ void update_scanline(void)
}
}
- affine_reference_x[0] += (s16)io_registers[REG_BG2PB];
- affine_reference_y[0] += (s16)io_registers[REG_BG2PD];
- affine_reference_x[1] += (s16)io_registers[REG_BG3PB];
- affine_reference_y[1] += (s16)io_registers[REG_BG3PD];
+ affine_reference_x[0] += (s16)read_ioreg(REG_BG2PB);
+ affine_reference_y[0] += (s16)read_ioreg(REG_BG2PD);
+ affine_reference_x[1] += (s16)read_ioreg(REG_BG3PB);
+ affine_reference_y[1] += (s16)read_ioreg(REG_BG3PD);
}
#define video_savestate_builder(type) \