mirror of https://github.com/mgba-emu/mgba.git
GBA BIOS: Implement dummy sound driver calls
This commit is contained in:
parent
00b46d7041
commit
7ea3728165
1
CHANGES
1
CHANGES
|
@ -7,6 +7,7 @@ Emulation fixes:
|
||||||
- GB Serialize: Fix timing bug loading channel 4 timing
|
- GB Serialize: Fix timing bug loading channel 4 timing
|
||||||
- GBA: Fix multiboot entry point while skipping BIOS
|
- GBA: Fix multiboot entry point while skipping BIOS
|
||||||
- GBA BIOS: Fix undefined instruction HLE behavior
|
- GBA BIOS: Fix undefined instruction HLE behavior
|
||||||
|
- GBA BIOS: Implement dummy sound driver calls
|
||||||
- GBA DMA: Linger last DMA on bus (fixes mgba.io/i/301 and mgba.io/i/1320)
|
- GBA DMA: Linger last DMA on bus (fixes mgba.io/i/301 and mgba.io/i/1320)
|
||||||
- GBA Memory: Misaligned SRAM writes are ignored
|
- GBA Memory: Misaligned SRAM writes are ignored
|
||||||
- GBA Memory: Improve gamepak prefetch timing
|
- GBA Memory: Improve gamepak prefetch timing
|
||||||
|
|
|
@ -14,6 +14,52 @@ CXX_GUARD_START
|
||||||
|
|
||||||
mLOG_DECLARE_CATEGORY(GBA_BIOS);
|
mLOG_DECLARE_CATEGORY(GBA_BIOS);
|
||||||
|
|
||||||
|
enum GBASwi {
|
||||||
|
GBA_SWI_SOFT_RESET = 0x00,
|
||||||
|
GBA_SWI_REGISTER_RAM_RESET = 0x01,
|
||||||
|
GBA_SWI_HALT = 0x02,
|
||||||
|
GBA_SWI_STOP = 0x03,
|
||||||
|
GBA_SWI_INTR_WAIT = 0x04,
|
||||||
|
GBA_SWI_VBLANK_INTR_WAIT = 0x05,
|
||||||
|
GBA_SWI_DIV = 0x06,
|
||||||
|
GBA_SWI_DIV_ARM = 0x07,
|
||||||
|
GBA_SWI_SQRT = 0x08,
|
||||||
|
GBA_SWI_ARCTAN = 0x09,
|
||||||
|
GBA_SWI_ARCTAN2 = 0x0A,
|
||||||
|
GBA_SWI_CPU_SET = 0x0B,
|
||||||
|
GBA_SWI_CPU_FAST_SET = 0x0C,
|
||||||
|
GBA_SWI_GET_BIOS_CHECKSUM = 0x0D,
|
||||||
|
GBA_SWI_BG_AFFINE_SET = 0x0E,
|
||||||
|
GBA_SWI_OBJ_AFFINE_SET = 0x0F,
|
||||||
|
GBA_SWI_BIT_UNPACK = 0x10,
|
||||||
|
GBA_SWI_LZ77_UNCOMP_WRAM = 0x11,
|
||||||
|
GBA_SWI_LZ77_UNCOMP_VRAM = 0x12,
|
||||||
|
GBA_SWI_HUFFMAN_UNCOMP = 0x13,
|
||||||
|
GBA_SWI_RL_UNCOMP_WRAM = 0x14,
|
||||||
|
GBA_SWI_RL_UNCOMP_VRAM = 0x15,
|
||||||
|
GBA_SWI_DIFF_8BIT_UNFILTER_WRAM = 0x16,
|
||||||
|
GBA_SWI_DIFF_8BIT_UNFILTER_VRAM = 0x17,
|
||||||
|
GBA_SWI_DIFF_16BIT_UNFILTER = 0x18,
|
||||||
|
GBA_SWI_SOUND_BIAS = 0x19,
|
||||||
|
GBA_SWI_SOUND_DRIVER_INIT = 0x1A,
|
||||||
|
GBA_SWI_SOUND_DRIVER_MODE = 0x1B,
|
||||||
|
GBA_SWI_SOUND_DRIVER_MAIN = 0x1C,
|
||||||
|
GBA_SWI_SOUND_DRIVER_VSYNC = 0x1D,
|
||||||
|
GBA_SWI_SOUND_CHANNEL_CLEAR = 0x1E,
|
||||||
|
GBA_SWI_MIDI_KEY_2_FREQ = 0x1F,
|
||||||
|
GBA_SWI_MUSIC_PLAYER_OPEN = 0x20,
|
||||||
|
GBA_SWI_MUSIC_PLAYER_START = 0x21,
|
||||||
|
GBA_SWI_MUSIC_PLAYER_STOP = 0x22,
|
||||||
|
GBA_SWI_MUSIC_PLAYER_CONTINUE = 0x23,
|
||||||
|
GBA_SWI_MUSIC_PLAYER_FADE_OUT = 0x24,
|
||||||
|
GBA_SWI_MULTI_BOOT = 0x25,
|
||||||
|
GBA_SWI_HARD_RESET = 0x26,
|
||||||
|
GBA_SWI_CUSTOM_HALT = 0x27,
|
||||||
|
GBA_SWI_SOUND_DRIVER_VSYNC_OFF = 0x28,
|
||||||
|
GBA_SWI_SOUND_DRIVER_VSYNC_ON = 0x29,
|
||||||
|
GBA_SWI_SOUND_DRIVER_GET_JUMP_LIST = 0x2A,
|
||||||
|
};
|
||||||
|
|
||||||
struct ARMCore;
|
struct ARMCore;
|
||||||
void GBASwi16(struct ARMCore* cpu, int immediate);
|
void GBASwi16(struct ARMCore* cpu, int immediate);
|
||||||
void GBASwi32(struct ARMCore* cpu, int immediate);
|
void GBASwi32(struct ARMCore* cpu, int immediate);
|
||||||
|
|
|
@ -424,43 +424,43 @@ void GBASwi16(struct ARMCore* cpu, int immediate) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (immediate) {
|
switch (immediate) {
|
||||||
case 0x0:
|
case GBA_SWI_SOFT_RESET:
|
||||||
_SoftReset(gba);
|
_SoftReset(gba);
|
||||||
break;
|
break;
|
||||||
case 0x1:
|
case GBA_SWI_REGISTER_RAM_RESET:
|
||||||
_RegisterRamReset(gba);
|
_RegisterRamReset(gba);
|
||||||
break;
|
break;
|
||||||
case 0x2:
|
case GBA_SWI_HALT:
|
||||||
GBAHalt(gba);
|
GBAHalt(gba);
|
||||||
break;
|
break;
|
||||||
case 0x3:
|
case GBA_SWI_STOP:
|
||||||
GBAStop(gba);
|
GBAStop(gba);
|
||||||
break;
|
break;
|
||||||
case 0x05:
|
case GBA_SWI_VBLANK_INTR_WAIT:
|
||||||
// VBlankIntrWait
|
// VBlankIntrWait
|
||||||
// Fall through:
|
// Fall through:
|
||||||
case 0x04:
|
case GBA_SWI_INTR_WAIT:
|
||||||
// IntrWait
|
// IntrWait
|
||||||
ARMRaiseSWI(cpu);
|
ARMRaiseSWI(cpu);
|
||||||
break;
|
break;
|
||||||
case 0x6:
|
case GBA_SWI_DIV:
|
||||||
_Div(gba, cpu->gprs[0], cpu->gprs[1]);
|
_Div(gba, cpu->gprs[0], cpu->gprs[1]);
|
||||||
break;
|
break;
|
||||||
case 0x7:
|
case GBA_SWI_DIV_ARM:
|
||||||
_Div(gba, cpu->gprs[1], cpu->gprs[0]);
|
_Div(gba, cpu->gprs[1], cpu->gprs[0]);
|
||||||
break;
|
break;
|
||||||
case 0x8:
|
case GBA_SWI_SQRT:
|
||||||
cpu->gprs[0] = _Sqrt(cpu->gprs[0], &cpu->cycles);
|
cpu->gprs[0] = _Sqrt(cpu->gprs[0], &cpu->cycles);
|
||||||
break;
|
break;
|
||||||
case 0x9:
|
case GBA_SWI_ARCTAN:
|
||||||
cpu->gprs[0] = _ArcTan(cpu->gprs[0], &cpu->gprs[1], &cpu->gprs[3], &cpu->cycles);
|
cpu->gprs[0] = _ArcTan(cpu->gprs[0], &cpu->gprs[1], &cpu->gprs[3], &cpu->cycles);
|
||||||
break;
|
break;
|
||||||
case 0xA:
|
case GBA_SWI_ARCTAN2:
|
||||||
cpu->gprs[0] = (uint16_t) _ArcTan2(cpu->gprs[0], cpu->gprs[1], &cpu->gprs[1], &cpu->cycles);
|
cpu->gprs[0] = (uint16_t) _ArcTan2(cpu->gprs[0], cpu->gprs[1], &cpu->gprs[1], &cpu->cycles);
|
||||||
cpu->gprs[3] = 0x170;
|
cpu->gprs[3] = 0x170;
|
||||||
break;
|
break;
|
||||||
case 0xB:
|
case GBA_SWI_CPU_SET:
|
||||||
case 0xC:
|
case GBA_SWI_CPU_FAST_SET:
|
||||||
if (cpu->gprs[0] >> BASE_OFFSET < REGION_WORKING_RAM) {
|
if (cpu->gprs[0] >> BASE_OFFSET < REGION_WORKING_RAM) {
|
||||||
mLOG(GBA_BIOS, GAME_ERROR, "Cannot CpuSet from BIOS");
|
mLOG(GBA_BIOS, GAME_ERROR, "Cannot CpuSet from BIOS");
|
||||||
break;
|
break;
|
||||||
|
@ -473,18 +473,18 @@ void GBASwi16(struct ARMCore* cpu, int immediate) {
|
||||||
}
|
}
|
||||||
ARMRaiseSWI(cpu);
|
ARMRaiseSWI(cpu);
|
||||||
break;
|
break;
|
||||||
case 0xD:
|
case GBA_SWI_GET_BIOS_CHECKSUM:
|
||||||
cpu->gprs[0] = GBA_BIOS_CHECKSUM;
|
cpu->gprs[0] = GBA_BIOS_CHECKSUM;
|
||||||
cpu->gprs[1] = 1;
|
cpu->gprs[1] = 1;
|
||||||
cpu->gprs[3] = SIZE_BIOS;
|
cpu->gprs[3] = SIZE_BIOS;
|
||||||
break;
|
break;
|
||||||
case 0xE:
|
case GBA_SWI_BG_AFFINE_SET:
|
||||||
_BgAffineSet(gba);
|
_BgAffineSet(gba);
|
||||||
break;
|
break;
|
||||||
case 0xF:
|
case GBA_SWI_OBJ_AFFINE_SET:
|
||||||
_ObjAffineSet(gba);
|
_ObjAffineSet(gba);
|
||||||
break;
|
break;
|
||||||
case 0x10:
|
case GBA_SWI_BIT_UNPACK:
|
||||||
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
||||||
mLOG(GBA_BIOS, GAME_ERROR, "Bad BitUnPack source");
|
mLOG(GBA_BIOS, GAME_ERROR, "Bad BitUnPack source");
|
||||||
break;
|
break;
|
||||||
|
@ -500,8 +500,8 @@ void GBASwi16(struct ARMCore* cpu, int immediate) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x11:
|
case GBA_SWI_LZ77_UNCOMP_WRAM:
|
||||||
case 0x12:
|
case GBA_SWI_LZ77_UNCOMP_VRAM:
|
||||||
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
||||||
mLOG(GBA_BIOS, GAME_ERROR, "Bad LZ77 source");
|
mLOG(GBA_BIOS, GAME_ERROR, "Bad LZ77 source");
|
||||||
break;
|
break;
|
||||||
|
@ -513,11 +513,11 @@ void GBASwi16(struct ARMCore* cpu, int immediate) {
|
||||||
case REGION_WORKING_RAM:
|
case REGION_WORKING_RAM:
|
||||||
case REGION_WORKING_IRAM:
|
case REGION_WORKING_IRAM:
|
||||||
case REGION_VRAM:
|
case REGION_VRAM:
|
||||||
_unLz77(gba, immediate == 0x11 ? 1 : 2);
|
_unLz77(gba, immediate == GBA_SWI_LZ77_UNCOMP_WRAM ? 1 : 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x13:
|
case GBA_SWI_HUFFMAN_UNCOMP:
|
||||||
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
||||||
mLOG(GBA_BIOS, GAME_ERROR, "Bad Huffman source");
|
mLOG(GBA_BIOS, GAME_ERROR, "Bad Huffman source");
|
||||||
break;
|
break;
|
||||||
|
@ -533,8 +533,8 @@ void GBASwi16(struct ARMCore* cpu, int immediate) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x14:
|
case GBA_SWI_RL_UNCOMP_WRAM:
|
||||||
case 0x15:
|
case GBA_SWI_RL_UNCOMP_VRAM:
|
||||||
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
||||||
mLOG(GBA_BIOS, GAME_ERROR, "Bad RL source");
|
mLOG(GBA_BIOS, GAME_ERROR, "Bad RL source");
|
||||||
break;
|
break;
|
||||||
|
@ -546,13 +546,13 @@ void GBASwi16(struct ARMCore* cpu, int immediate) {
|
||||||
case REGION_WORKING_RAM:
|
case REGION_WORKING_RAM:
|
||||||
case REGION_WORKING_IRAM:
|
case REGION_WORKING_IRAM:
|
||||||
case REGION_VRAM:
|
case REGION_VRAM:
|
||||||
_unRl(gba, immediate == 0x14 ? 1 : 2);
|
_unRl(gba, immediate == GBA_SWI_RL_UNCOMP_WRAM ? 1 : 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x16:
|
case GBA_SWI_DIFF_8BIT_UNFILTER_WRAM:
|
||||||
case 0x17:
|
case GBA_SWI_DIFF_8BIT_UNFILTER_VRAM:
|
||||||
case 0x18:
|
case GBA_SWI_DIFF_16BIT_UNFILTER:
|
||||||
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
if (cpu->gprs[0] < BASE_WORKING_RAM) {
|
||||||
mLOG(GBA_BIOS, GAME_ERROR, "Bad UnFilter source");
|
mLOG(GBA_BIOS, GAME_ERROR, "Bad UnFilter source");
|
||||||
break;
|
break;
|
||||||
|
@ -564,17 +564,20 @@ void GBASwi16(struct ARMCore* cpu, int immediate) {
|
||||||
case REGION_WORKING_RAM:
|
case REGION_WORKING_RAM:
|
||||||
case REGION_WORKING_IRAM:
|
case REGION_WORKING_IRAM:
|
||||||
case REGION_VRAM:
|
case REGION_VRAM:
|
||||||
_unFilter(gba, immediate == 0x18 ? 2 : 1, immediate == 0x16 ? 1 : 2);
|
_unFilter(gba, immediate == GBA_SWI_DIFF_16BIT_UNFILTER ? 2 : 1, immediate == GBA_SWI_DIFF_8BIT_UNFILTER_WRAM ? 1 : 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x19:
|
case GBA_SWI_SOUND_BIAS:
|
||||||
// SoundBias is mostly meaningless here
|
// SoundBias is mostly meaningless here
|
||||||
mLOG(GBA_BIOS, STUB, "Stub software interrupt: SoundBias (19)");
|
mLOG(GBA_BIOS, STUB, "Stub software interrupt: SoundBias (19)");
|
||||||
break;
|
break;
|
||||||
case 0x1F:
|
case GBA_SWI_MIDI_KEY_2_FREQ:
|
||||||
_MidiKey2Freq(gba);
|
_MidiKey2Freq(gba);
|
||||||
break;
|
break;
|
||||||
|
case GBA_SWI_SOUND_DRIVER_GET_JUMP_LIST:
|
||||||
|
ARMRaiseSWI(cpu);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
mLOG(GBA_BIOS, STUB, "Stub software interrupt: %02X", immediate);
|
mLOG(GBA_BIOS, STUB, "Stub software interrupt: %02X", immediate);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
#include <mgba/internal/gba/memory.h>
|
#include <mgba/internal/gba/memory.h>
|
||||||
|
|
||||||
const uint8_t hleBios[SIZE_BIOS] = {
|
const uint8_t hleBios[SIZE_BIOS] = {
|
||||||
0x06, 0x00, 0x00, 0xea, 0x88, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xea,
|
0x06, 0x00, 0x00, 0xea, 0x58, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xea,
|
||||||
0xfe, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0xa0, 0xe1,
|
0xfe, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0xa0, 0xe1,
|
||||||
0x2c, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x02, 0x03, 0xa0, 0xe3,
|
0x4b, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x02, 0x03, 0xa0, 0xe3,
|
||||||
0x03, 0x10, 0xd0, 0xe5, 0xea, 0x00, 0x51, 0xe3, 0x04, 0x02, 0x9f, 0x15,
|
0x03, 0x10, 0xd0, 0xe5, 0xea, 0x00, 0x51, 0xe3, 0x14, 0x01, 0x9f, 0x15,
|
||||||
0x10, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x29, 0xe1,
|
0x10, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x29, 0xe1,
|
||||||
0x00, 0x00, 0x5d, 0xe3, 0x01, 0xd3, 0xa0, 0x03, 0x20, 0xd0, 0x4d, 0x02,
|
0x00, 0x00, 0x5d, 0xe3, 0x01, 0xd3, 0xa0, 0x03, 0x20, 0xd0, 0x4d, 0x02,
|
||||||
0x00, 0x58, 0x2d, 0xe9, 0x02, 0xb0, 0x5e, 0xe5, 0x9c, 0xc0, 0xa0, 0xe3,
|
0x00, 0x58, 0x2d, 0xe9, 0x02, 0xb0, 0x5e, 0xe5, 0x9c, 0xc0, 0xa0, 0xe3,
|
||||||
|
@ -16,39 +16,55 @@ const uint8_t hleBios[SIZE_BIOS] = {
|
||||||
0x1b, 0xff, 0x2f, 0x11, 0x00, 0x40, 0xbd, 0xe8, 0x93, 0xf0, 0x29, 0xe3,
|
0x1b, 0xff, 0x2f, 0x11, 0x00, 0x40, 0xbd, 0xe8, 0x93, 0xf0, 0x29, 0xe3,
|
||||||
0x00, 0x10, 0xbd, 0xe8, 0x0c, 0xf0, 0x69, 0xe1, 0x00, 0x58, 0xbd, 0xe8,
|
0x00, 0x10, 0xbd, 0xe8, 0x0c, 0xf0, 0x69, 0xe1, 0x00, 0x58, 0xbd, 0xe8,
|
||||||
0x0e, 0xf0, 0xb0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0xa0, 0xe3,
|
0x0e, 0xf0, 0xb0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0xa0, 0xe3,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
|
0x78, 0x01, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00,
|
||||||
0xd4, 0x01, 0x00, 0x00, 0x0f, 0x50, 0x2d, 0xe9, 0x01, 0x03, 0xa0, 0xe3,
|
0x60, 0x02, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x00, 0xe0, 0x8f, 0xe2, 0x04, 0xf0, 0x10, 0xe5, 0x0f, 0x50, 0xbd, 0xe8,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x04, 0xf0, 0x5e, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x5e, 0xe5,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x01, 0x00, 0xa0, 0xe3, 0x01, 0x10, 0xa0, 0xe3, 0x0c, 0x40, 0x2d, 0xe9,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x01, 0xc3, 0xa0, 0xe3, 0x00, 0x00, 0x50, 0xe3, 0x00, 0x00, 0xa0, 0xe3,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x01, 0x20, 0xa0, 0xe3, 0x03, 0x00, 0x00, 0x0a, 0xb8, 0x30, 0x5c, 0xe1,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x01, 0x30, 0xc3, 0xe1, 0xb8, 0x30, 0x4c, 0xe1, 0x01, 0x03, 0xcc, 0xe5,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x08, 0x02, 0xcc, 0xe5, 0xb8, 0x30, 0x5c, 0xe1, 0x01, 0x30, 0x13, 0xe0,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x01, 0x30, 0x23, 0x10, 0xb8, 0x30, 0x4c, 0x11, 0x08, 0x22, 0xcc, 0xe5,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0xf7, 0xff, 0xff, 0x0a, 0x0c, 0x80, 0xbd, 0xe8, 0x30, 0x40, 0x2d, 0xe9,
|
0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00,
|
||||||
0x02, 0x46, 0xa0, 0xe1, 0x00, 0xc0, 0xa0, 0xe1, 0x01, 0x50, 0xa0, 0xe1,
|
0xb8, 0x02, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x02, 0x0f, 0x50, 0x2d, 0xe9,
|
||||||
0x01, 0x04, 0x12, 0xe3, 0x0f, 0x00, 0x00, 0x0a, 0x01, 0x03, 0x12, 0xe3,
|
0x01, 0x03, 0xa0, 0xe3, 0x00, 0xe0, 0x8f, 0xe2, 0x04, 0xf0, 0x10, 0xe5,
|
||||||
0x05, 0x00, 0x00, 0x0a, 0x24, 0x45, 0x85, 0xe0, 0x08, 0x00, 0xbc, 0xe8,
|
0x0f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x04, 0x00, 0x55, 0xe1, 0x08, 0x00, 0xa5, 0xb8, 0xfc, 0xff, 0xff, 0xba,
|
0x02, 0xc0, 0x5e, 0xe5, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x14, 0x00, 0x00, 0xea, 0x01, 0xc0, 0xcc, 0xe3, 0x01, 0x50, 0xc5, 0xe3,
|
0x04, 0xe0, 0xa0, 0x03, 0x1e, 0xff, 0x2f, 0xe1, 0x01, 0x00, 0xa0, 0xe3,
|
||||||
0xa4, 0x45, 0x85, 0xe0, 0xb0, 0x30, 0xdc, 0xe1, 0x04, 0x00, 0x55, 0xe1,
|
0x01, 0x10, 0xa0, 0xe3, 0x0c, 0x40, 0x2d, 0xe9, 0x01, 0xc3, 0xa0, 0xe3,
|
||||||
0xb2, 0x30, 0xc5, 0xb0, 0xfc, 0xff, 0xff, 0xba, 0x0c, 0x00, 0x00, 0xea,
|
0x00, 0x00, 0x50, 0xe3, 0x00, 0x00, 0xa0, 0xe3, 0x01, 0x20, 0xa0, 0xe3,
|
||||||
0x01, 0x03, 0x12, 0xe3, 0x05, 0x00, 0x00, 0x0a, 0x24, 0x45, 0x85, 0xe0,
|
0x03, 0x00, 0x00, 0x0a, 0xb8, 0x30, 0x5c, 0xe1, 0x01, 0x30, 0xc3, 0xe1,
|
||||||
0x04, 0x00, 0x55, 0xe1, 0x08, 0x00, 0xbc, 0xb8, 0x08, 0x00, 0xa5, 0xb8,
|
0xb8, 0x30, 0x4c, 0xe1, 0x01, 0x03, 0xcc, 0xe5, 0x08, 0x02, 0xcc, 0xe5,
|
||||||
0xfb, 0xff, 0xff, 0xba, 0x04, 0x00, 0x00, 0xea, 0xa4, 0x45, 0x85, 0xe0,
|
0xb8, 0x30, 0x5c, 0xe1, 0x01, 0x30, 0x13, 0xe0, 0x01, 0x30, 0x23, 0x10,
|
||||||
0x04, 0x00, 0x55, 0xe1, 0xb2, 0x30, 0xdc, 0xb0, 0xb2, 0x30, 0xc5, 0xb0,
|
0xb8, 0x30, 0x4c, 0x11, 0x08, 0x22, 0xcc, 0xe5, 0xf7, 0xff, 0xff, 0x0a,
|
||||||
0xfb, 0xff, 0xff, 0xba, 0x17, 0x3e, 0xa0, 0xe3, 0x30, 0x80, 0xbd, 0xe8,
|
0x0c, 0x80, 0xbd, 0xe8, 0x30, 0x40, 0x2d, 0xe9, 0x02, 0x46, 0xa0, 0xe1,
|
||||||
0xf0, 0x47, 0x2d, 0xe9, 0x01, 0x04, 0x12, 0xe3, 0x02, 0x36, 0xa0, 0xe1,
|
0x00, 0xc0, 0xa0, 0xe1, 0x01, 0x50, 0xa0, 0xe1, 0x01, 0x04, 0x12, 0xe3,
|
||||||
0x23, 0x25, 0x81, 0xe0, 0x0b, 0x00, 0x00, 0x0a, 0x00, 0x30, 0x90, 0xe5,
|
0x0f, 0x00, 0x00, 0x0a, 0x01, 0x03, 0x12, 0xe3, 0x05, 0x00, 0x00, 0x0a,
|
||||||
0x03, 0x40, 0xa0, 0xe1, 0x03, 0x50, 0xa0, 0xe1, 0x03, 0x60, 0xa0, 0xe1,
|
0x24, 0x45, 0x85, 0xe0, 0x08, 0x00, 0xbc, 0xe8, 0x04, 0x00, 0x55, 0xe1,
|
||||||
0x03, 0x70, 0xa0, 0xe1, 0x03, 0x80, 0xa0, 0xe1, 0x03, 0x90, 0xa0, 0xe1,
|
0x08, 0x00, 0xa5, 0xb8, 0xfc, 0xff, 0xff, 0xba, 0x14, 0x00, 0x00, 0xea,
|
||||||
0x03, 0xa0, 0xa0, 0xe1, 0x02, 0x00, 0x51, 0xe1, 0xf8, 0x07, 0xa1, 0xb8,
|
0x01, 0xc0, 0xcc, 0xe3, 0x01, 0x50, 0xc5, 0xe3, 0xa4, 0x45, 0x85, 0xe0,
|
||||||
0xfc, 0xff, 0xff, 0xba, 0x03, 0x00, 0x00, 0xea, 0x02, 0x00, 0x51, 0xe1,
|
0xb0, 0x30, 0xdc, 0xe1, 0x04, 0x00, 0x55, 0xe1, 0xb2, 0x30, 0xc5, 0xb0,
|
||||||
0xf8, 0x07, 0xb0, 0xb8, 0xf8, 0x07, 0xa1, 0xb8, 0xfb, 0xff, 0xff, 0xba,
|
0xfc, 0xff, 0xff, 0xba, 0x0c, 0x00, 0x00, 0xea, 0x01, 0x03, 0x12, 0xe3,
|
||||||
0xf0, 0x87, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0x00, 0x00, 0x00,
|
0x05, 0x00, 0x00, 0x0a, 0x24, 0x45, 0x85, 0xe0, 0x04, 0x00, 0x55, 0xe1,
|
||||||
0x04, 0xe0, 0xa0, 0x03, 0xc0, 0x00, 0x00, 0x02
|
0x08, 0x00, 0xbc, 0xb8, 0x08, 0x00, 0xa5, 0xb8, 0xfb, 0xff, 0xff, 0xba,
|
||||||
|
0x04, 0x00, 0x00, 0xea, 0xa4, 0x45, 0x85, 0xe0, 0x04, 0x00, 0x55, 0xe1,
|
||||||
|
0xb2, 0x30, 0xdc, 0xb0, 0xb2, 0x30, 0xc5, 0xb0, 0xfb, 0xff, 0xff, 0xba,
|
||||||
|
0x17, 0x3e, 0xa0, 0xe3, 0x30, 0x80, 0xbd, 0xe8, 0xf0, 0x47, 0x2d, 0xe9,
|
||||||
|
0x01, 0x04, 0x12, 0xe3, 0x02, 0x36, 0xa0, 0xe1, 0x23, 0x25, 0x81, 0xe0,
|
||||||
|
0x0b, 0x00, 0x00, 0x0a, 0x00, 0x30, 0x90, 0xe5, 0x03, 0x40, 0xa0, 0xe1,
|
||||||
|
0x03, 0x50, 0xa0, 0xe1, 0x03, 0x60, 0xa0, 0xe1, 0x03, 0x70, 0xa0, 0xe1,
|
||||||
|
0x03, 0x80, 0xa0, 0xe1, 0x03, 0x90, 0xa0, 0xe1, 0x03, 0xa0, 0xa0, 0xe1,
|
||||||
|
0x02, 0x00, 0x51, 0xe1, 0xf8, 0x07, 0xa1, 0xb8, 0xfc, 0xff, 0xff, 0xba,
|
||||||
|
0x03, 0x00, 0x00, 0xea, 0x02, 0x00, 0x51, 0xe1, 0xf8, 0x07, 0xb0, 0xb8,
|
||||||
|
0xf8, 0x07, 0xa1, 0xb8, 0xfb, 0xff, 0xff, 0xba, 0xf0, 0x87, 0xbd, 0xe8,
|
||||||
|
0xf0, 0x07, 0x2d, 0xe9, 0x38, 0x10, 0x9f, 0xe5, 0x01, 0x30, 0xa0, 0xe1,
|
||||||
|
0x01, 0x40, 0xa0, 0xe1, 0x01, 0x50, 0xa0, 0xe1, 0x01, 0x60, 0xa0, 0xe1,
|
||||||
|
0x01, 0x70, 0xa0, 0xe1, 0x01, 0x80, 0xa0, 0xe1, 0x01, 0x90, 0xa0, 0xe1,
|
||||||
|
0x01, 0xa0, 0xa0, 0xe1, 0xfa, 0x07, 0xa0, 0xe8, 0xfa, 0x07, 0xa0, 0xe8,
|
||||||
|
0xfa, 0x07, 0xa0, 0xe8, 0xfa, 0x07, 0xa0, 0xe8, 0x00, 0x10, 0xa0, 0xe3,
|
||||||
|
0xf0, 0x07, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x01, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
|
@ -52,20 +52,51 @@ movs pc, lr
|
||||||
.word 0xE3A02004
|
.word 0xE3A02004
|
||||||
|
|
||||||
swiTable:
|
swiTable:
|
||||||
.word SoftReset
|
.word SoftReset @ 0x00
|
||||||
.word RegisterRamReset
|
.word RegisterRamReset @ 0x01
|
||||||
.word Halt
|
.word Halt @ 0x02
|
||||||
.word Stop
|
.word Stop @ 0x03
|
||||||
.word IntrWait
|
.word IntrWait @ 0x04
|
||||||
.word VBlankIntrWait
|
.word VBlankIntrWait @ 0x05
|
||||||
.word Div
|
.word Div @ 0x06
|
||||||
.word DivArm
|
.word DivArm @ 0x07
|
||||||
.word Sqrt
|
.word Sqrt @ 0x08
|
||||||
.word ArcTan
|
.word ArcTan @ 0x09
|
||||||
.word ArcTan2
|
.word ArcTan2 @ 0x0A
|
||||||
.word CpuSet
|
.word CpuSet @ 0x0B
|
||||||
.word CpuFastSet
|
.word CpuFastSet @ 0x0C
|
||||||
@ ... The rest of this table isn't needed if the rest aren't implemented
|
.word GetBiosChecksum @ 0x0D
|
||||||
|
.word BgAffineSet @ 0x0E
|
||||||
|
.word ObjAffineSet @ 0x0F
|
||||||
|
.word BitUnPack @ 0x10
|
||||||
|
.word Lz77UnCompWram @ 0x11
|
||||||
|
.word Lz77UnCompVram @ 0x12
|
||||||
|
.word HuffmanUnComp @ 0x13
|
||||||
|
.word RlUnCompWram @ 0x14
|
||||||
|
.word RlUnCompVram @ 0x15
|
||||||
|
.word Diff8BitUnFilterWram @ 0x16
|
||||||
|
.word Diff8BitUnFilterVram @ 0x17
|
||||||
|
.word Diff16BitUnFilter @ 0x18
|
||||||
|
.word SoundBias @ 0x19
|
||||||
|
.word SoundDriverInit @ 0x1A
|
||||||
|
.word SoundDriverMode @ 0x1B
|
||||||
|
.word SoundDriverMain @ 0x1C
|
||||||
|
.word SoundDriverVsync @ 0x1D
|
||||||
|
.word SoundChannelClear @ 0x1E
|
||||||
|
.word MidiKey2Freq @ 0x1F
|
||||||
|
.word MusicPlayerOpen @ 0x20
|
||||||
|
.word MusicPlayerStart @ 0x21
|
||||||
|
.word MusicPlayerStop @ 0x22
|
||||||
|
.word MusicPlayerContinue @ 0x23
|
||||||
|
.word MusicPlayerFadeOut @ 0x24
|
||||||
|
.word MultiBoot @ 0x25
|
||||||
|
.word HardReset @ 0x26
|
||||||
|
.word CustomHalt @ 0x27
|
||||||
|
.word SoundDriverVsyncOff @ 0x28
|
||||||
|
.word SoundDriverVsyncOn @ 0x29
|
||||||
|
.word SoundDriverGetJumpList @ 0x2A
|
||||||
|
|
||||||
|
.ltorg
|
||||||
|
|
||||||
irqBase:
|
irqBase:
|
||||||
stmfd sp!, {r0-r3, r12, lr}
|
stmfd sp!, {r0-r3, r12, lr}
|
||||||
|
@ -77,6 +108,54 @@ subs pc, lr, #4
|
||||||
.word 0
|
.word 0
|
||||||
.word 0xE55EC002
|
.word 0xE55EC002
|
||||||
|
|
||||||
|
undefBase:
|
||||||
|
subs pc, lr, #4
|
||||||
|
.word 0
|
||||||
|
.word 0x03A0E004
|
||||||
|
|
||||||
|
@ Unimplemented
|
||||||
|
SoftReset:
|
||||||
|
RegisterRamReset:
|
||||||
|
Halt:
|
||||||
|
Stop:
|
||||||
|
Div:
|
||||||
|
DivArm:
|
||||||
|
Sqrt:
|
||||||
|
ArcTan:
|
||||||
|
ArcTan2:
|
||||||
|
GetBiosChecksum:
|
||||||
|
BgAffineSet:
|
||||||
|
ObjAffineSet:
|
||||||
|
BitUnPack:
|
||||||
|
Lz77UnCompWram:
|
||||||
|
Lz77UnCompVram:
|
||||||
|
HuffmanUnComp:
|
||||||
|
RlUnCompWram:
|
||||||
|
RlUnCompVram:
|
||||||
|
Diff8BitUnFilterWram:
|
||||||
|
Diff8BitUnFilterVram:
|
||||||
|
Diff16BitUnFilter:
|
||||||
|
SoundBias:
|
||||||
|
SoundDriverInit:
|
||||||
|
SoundDriverMode:
|
||||||
|
SoundDriverMain:
|
||||||
|
SoundDriverVsync:
|
||||||
|
SoundChannelClear:
|
||||||
|
MidiKey2Freq:
|
||||||
|
MusicPlayerOpen:
|
||||||
|
MusicPlayerStart:
|
||||||
|
MusicPlayerStop:
|
||||||
|
MusicPlayerContinue:
|
||||||
|
MusicPlayerFadeOut:
|
||||||
|
MultiBoot:
|
||||||
|
HardReset:
|
||||||
|
CustomHalt:
|
||||||
|
SoundDriverVsyncOff:
|
||||||
|
SoundDriverVsyncOn:
|
||||||
|
|
||||||
|
NopCall:
|
||||||
|
bx lr
|
||||||
|
|
||||||
VBlankIntrWait:
|
VBlankIntrWait:
|
||||||
mov r0, #1
|
mov r0, #1
|
||||||
mov r1, #1
|
mov r1, #1
|
||||||
|
@ -187,9 +266,23 @@ blt 0b
|
||||||
2:
|
2:
|
||||||
ldmfd sp!, {r4-r10, pc}
|
ldmfd sp!, {r4-r10, pc}
|
||||||
|
|
||||||
undefBase:
|
SoundDriverGetJumpList:
|
||||||
subs pc, lr, #4
|
stmfd sp!, {r4-r10}
|
||||||
.word 0
|
ldr r1, =NopCall
|
||||||
.word 0x03A0E004
|
mov r3, r1
|
||||||
|
mov r4, r1
|
||||||
|
mov r5, r1
|
||||||
|
mov r6, r1
|
||||||
|
mov r7, r1
|
||||||
|
mov r8, r1
|
||||||
|
mov r9, r1
|
||||||
|
mov r10, r1
|
||||||
|
stmia r0!, {r1, r3-r10}
|
||||||
|
stmia r0!, {r1, r3-r10}
|
||||||
|
stmia r0!, {r1, r3-r10}
|
||||||
|
stmia r0!, {r1, r3-r10}
|
||||||
|
mov r1, #0
|
||||||
|
ldmfd sp!, {r4-r10}
|
||||||
|
bx lr
|
||||||
|
|
||||||
.ltorg
|
.ltorg
|
||||||
|
|
Loading…
Reference in New Issue