rlm@1: #include rlm@1: #include rlm@1: #include rlm@1: rlm@1: #include "bios.h" rlm@1: #include "../common/System.h" rlm@1: #include "GBA.h" rlm@1: #include "GBACheats.h" // FIXME: SDL build requires this rlm@1: #include "GBAinline.h" rlm@1: #include "GBAGlobals.h" rlm@1: rlm@1: s16 sineTable[256] = { rlm@1: (s16)0x0000, (s16)0x0192, (s16)0x0323, (s16)0x04B5, (s16)0x0645, (s16)0x07D5, (s16)0x0964, (s16)0x0AF1, rlm@1: (s16)0x0C7C, (s16)0x0E05, (s16)0x0F8C, (s16)0x1111, (s16)0x1294, (s16)0x1413, (s16)0x158F, (s16)0x1708, rlm@1: (s16)0x187D, (s16)0x19EF, (s16)0x1B5D, (s16)0x1CC6, (s16)0x1E2B, (s16)0x1F8B, (s16)0x20E7, (s16)0x223D, rlm@1: (s16)0x238E, (s16)0x24DA, (s16)0x261F, (s16)0x275F, (s16)0x2899, (s16)0x29CD, (s16)0x2AFA, (s16)0x2C21, rlm@1: (s16)0x2D41, (s16)0x2E5A, (s16)0x2F6B, (s16)0x3076, (s16)0x3179, (s16)0x3274, (s16)0x3367, (s16)0x3453, rlm@1: (s16)0x3536, (s16)0x3612, (s16)0x36E5, (s16)0x37AF, (s16)0x3871, (s16)0x392A, (s16)0x39DA, (s16)0x3A82, rlm@1: (s16)0x3B20, (s16)0x3BB6, (s16)0x3C42, (s16)0x3CC5, (s16)0x3D3E, (s16)0x3DAE, (s16)0x3E14, (s16)0x3E71, rlm@1: (s16)0x3EC5, (s16)0x3F0E, (s16)0x3F4E, (s16)0x3F84, (s16)0x3FB1, (s16)0x3FD3, (s16)0x3FEC, (s16)0x3FFB, rlm@1: (s16)0x4000, (s16)0x3FFB, (s16)0x3FEC, (s16)0x3FD3, (s16)0x3FB1, (s16)0x3F84, (s16)0x3F4E, (s16)0x3F0E, rlm@1: (s16)0x3EC5, (s16)0x3E71, (s16)0x3E14, (s16)0x3DAE, (s16)0x3D3E, (s16)0x3CC5, (s16)0x3C42, (s16)0x3BB6, rlm@1: (s16)0x3B20, (s16)0x3A82, (s16)0x39DA, (s16)0x392A, (s16)0x3871, (s16)0x37AF, (s16)0x36E5, (s16)0x3612, rlm@1: (s16)0x3536, (s16)0x3453, (s16)0x3367, (s16)0x3274, (s16)0x3179, (s16)0x3076, (s16)0x2F6B, (s16)0x2E5A, rlm@1: (s16)0x2D41, (s16)0x2C21, (s16)0x2AFA, (s16)0x29CD, (s16)0x2899, (s16)0x275F, (s16)0x261F, (s16)0x24DA, rlm@1: (s16)0x238E, (s16)0x223D, (s16)0x20E7, (s16)0x1F8B, (s16)0x1E2B, (s16)0x1CC6, (s16)0x1B5D, (s16)0x19EF, rlm@1: (s16)0x187D, (s16)0x1708, (s16)0x158F, (s16)0x1413, (s16)0x1294, (s16)0x1111, (s16)0x0F8C, (s16)0x0E05, rlm@1: (s16)0x0C7C, (s16)0x0AF1, (s16)0x0964, (s16)0x07D5, (s16)0x0645, (s16)0x04B5, (s16)0x0323, (s16)0x0192, rlm@1: (s16)0x0000, (s16)0xFE6E, (s16)0xFCDD, (s16)0xFB4B, (s16)0xF9BB, (s16)0xF82B, (s16)0xF69C, (s16)0xF50F, rlm@1: (s16)0xF384, (s16)0xF1FB, (s16)0xF074, (s16)0xEEEF, (s16)0xED6C, (s16)0xEBED, (s16)0xEA71, (s16)0xE8F8, rlm@1: (s16)0xE783, (s16)0xE611, (s16)0xE4A3, (s16)0xE33A, (s16)0xE1D5, (s16)0xE075, (s16)0xDF19, (s16)0xDDC3, rlm@1: (s16)0xDC72, (s16)0xDB26, (s16)0xD9E1, (s16)0xD8A1, (s16)0xD767, (s16)0xD633, (s16)0xD506, (s16)0xD3DF, rlm@1: (s16)0xD2BF, (s16)0xD1A6, (s16)0xD095, (s16)0xCF8A, (s16)0xCE87, (s16)0xCD8C, (s16)0xCC99, (s16)0xCBAD, rlm@1: (s16)0xCACA, (s16)0xC9EE, (s16)0xC91B, (s16)0xC851, (s16)0xC78F, (s16)0xC6D6, (s16)0xC626, (s16)0xC57E, rlm@1: (s16)0xC4E0, (s16)0xC44A, (s16)0xC3BE, (s16)0xC33B, (s16)0xC2C2, (s16)0xC252, (s16)0xC1EC, (s16)0xC18F, rlm@1: (s16)0xC13B, (s16)0xC0F2, (s16)0xC0B2, (s16)0xC07C, (s16)0xC04F, (s16)0xC02D, (s16)0xC014, (s16)0xC005, rlm@1: (s16)0xC000, (s16)0xC005, (s16)0xC014, (s16)0xC02D, (s16)0xC04F, (s16)0xC07C, (s16)0xC0B2, (s16)0xC0F2, rlm@1: (s16)0xC13B, (s16)0xC18F, (s16)0xC1EC, (s16)0xC252, (s16)0xC2C2, (s16)0xC33B, (s16)0xC3BE, (s16)0xC44A, rlm@1: (s16)0xC4E0, (s16)0xC57E, (s16)0xC626, (s16)0xC6D6, (s16)0xC78F, (s16)0xC851, (s16)0xC91B, (s16)0xC9EE, rlm@1: (s16)0xCACA, (s16)0xCBAD, (s16)0xCC99, (s16)0xCD8C, (s16)0xCE87, (s16)0xCF8A, (s16)0xD095, (s16)0xD1A6, rlm@1: (s16)0xD2BF, (s16)0xD3DF, (s16)0xD506, (s16)0xD633, (s16)0xD767, (s16)0xD8A1, (s16)0xD9E1, (s16)0xDB26, rlm@1: (s16)0xDC72, (s16)0xDDC3, (s16)0xDF19, (s16)0xE075, (s16)0xE1D5, (s16)0xE33A, (s16)0xE4A3, (s16)0xE611, rlm@1: (s16)0xE783, (s16)0xE8F8, (s16)0xEA71, (s16)0xEBED, (s16)0xED6C, (s16)0xEEEF, (s16)0xF074, (s16)0xF1FB, rlm@1: (s16)0xF384, (s16)0xF50F, (s16)0xF69C, (s16)0xF82B, (s16)0xF9BB, (s16)0xFB4B, (s16)0xFCDD, (s16)0xFE6E rlm@1: }; rlm@1: rlm@1: void BIOS_ArcTan() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("ArcTan: %08x (VCOUNT=%2d)\n", rlm@1: reg[0].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: s32 a = -((s32)(reg[0].I * reg[0].I)) >> 14; rlm@1: s32 b = ((0xA9 * a) >> 14) + 0x390; rlm@1: b = ((b * a) >> 14) + 0x91C; rlm@1: b = ((b * a) >> 14) + 0xFB6; rlm@1: b = ((b * a) >> 14) + 0x16AA; rlm@1: b = ((b * a) >> 14) + 0x2081; rlm@1: b = ((b * a) >> 14) + 0x3651; rlm@1: b = ((b * a) >> 14) + 0xA2F9; rlm@1: reg[0].I = (reg[0].I * b) >> 16; rlm@1: rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("ArcTan: return=%08x\n", rlm@1: reg[0].I); rlm@1: } rlm@1: #endif rlm@1: } rlm@1: rlm@1: void BIOS_ArcTan2() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("ArcTan2: %08x,%08x (VCOUNT=%2d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: s16 x = reg[0].I; rlm@1: s16 y = reg[1].I; rlm@1: rlm@1: if (y == 0) rlm@1: { rlm@1: reg[0].I = 0x8000 & x; rlm@1: reg[3].I = 0x170; rlm@1: } rlm@1: else rlm@1: { rlm@1: if (x == 0) rlm@1: { rlm@1: reg[0].I = (0x8000 & y) + 0x4000; rlm@1: reg[3].I = 0x170; rlm@1: } rlm@1: else rlm@1: { rlm@1: if (abs(x) > abs(y)) rlm@1: { rlm@1: reg[1].I = x; rlm@1: reg[0].I = y << 14; rlm@1: BIOS_Div(); rlm@1: BIOS_ArcTan(); rlm@1: if (x < 0) rlm@1: reg[0].I = 0x8000 + reg[0].I; rlm@1: else rlm@1: reg[0].I = ((y & 0x8000) << 1) + reg[0].I; rlm@1: reg[3].I = 0x170; rlm@1: } rlm@1: else rlm@1: { rlm@1: reg[0].I = x << 14; rlm@1: BIOS_Div(); rlm@1: BIOS_ArcTan(); rlm@1: reg[0].I = (0x4000 + (y & 0x8000)) - reg[0].I; rlm@1: reg[3].I = 0x170; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("ArcTan2: return=%08x\n", rlm@1: reg[0].I); rlm@1: } rlm@1: #endif rlm@1: } rlm@1: rlm@1: void BIOS_BitUnPack() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("BitUnPack: %08x,%08x,%08x (VCOUNT=%2d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: reg[2].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: u32 header = reg[2].I; rlm@1: rlm@1: int len = CPUReadHalfWord(header); rlm@1: // check address rlm@1: int bits = CPUReadByte(header+2); rlm@1: int revbits = 8 - bits; rlm@1: // u32 value = 0; rlm@1: u32 base = CPUReadMemory(header+4); rlm@1: bool addBase = (base & 0x80000000) ? true : false; rlm@1: base &= 0x7fffffff; rlm@1: int dataSize = CPUReadByte(header+3); rlm@1: rlm@1: int data = 0; rlm@1: int bitwritecount = 0; rlm@1: while (1) rlm@1: { rlm@1: len -= 1; rlm@1: if (len < 0) rlm@1: break; rlm@1: int mask = 0xff >> revbits; rlm@1: u8 b = CPUReadByte(source); rlm@1: source++; rlm@1: int bitcount = 0; rlm@1: while (1) rlm@1: { rlm@1: if (bitcount >= 8) rlm@1: break; rlm@1: u32 d = b & mask; rlm@1: u32 temp = d >> bitcount; rlm@1: if (!temp && addBase) rlm@1: { rlm@1: temp += base; rlm@1: } rlm@1: data |= temp << bitwritecount; rlm@1: bitwritecount += dataSize; rlm@1: if (bitwritecount >= 32) rlm@1: { rlm@1: CPUWriteMemory(dest, data); rlm@1: dest += 4; rlm@1: data = 0; rlm@1: bitwritecount = 0; rlm@1: } rlm@1: mask <<= bits; rlm@1: bitcount += bits; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_BgAffineSet() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("BgAffineSet: %08x,%08x,%08x (VCOUNT=%2d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: reg[2].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 src = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: int num = reg[2].I; rlm@1: rlm@1: for (int i = 0; i < num; i++) rlm@1: { rlm@1: s32 cx = CPUReadMemory(src); rlm@1: src += 4; rlm@1: s32 cy = CPUReadMemory(src); rlm@1: src += 4; rlm@1: s16 dispx = CPUReadHalfWord(src); rlm@1: src += 2; rlm@1: s16 dispy = CPUReadHalfWord(src); rlm@1: src += 2; rlm@1: s16 rx = CPUReadHalfWord(src); rlm@1: src += 2; rlm@1: s16 ry = CPUReadHalfWord(src); rlm@1: src += 2; rlm@1: u16 theta = CPUReadHalfWord(src)>>8; rlm@1: src += 4; // keep structure alignment rlm@1: s32 a = (s32)sineTable[(theta+0x40)&255]; rlm@1: s32 b = (s32)sineTable[theta]; rlm@1: rlm@1: s16 dx = (s16)((rx * a)>>14); rlm@1: s16 dmx = (s16)((rx * b)>>14); rlm@1: s16 dy = (s16)((ry * b)>>14); rlm@1: s16 dmy = (s16)((ry * a)>>14); rlm@1: rlm@1: CPUWriteHalfWord(dest, dx); rlm@1: dest += 2; rlm@1: CPUWriteHalfWord(dest, -dmx); rlm@1: dest += 2; rlm@1: CPUWriteHalfWord(dest, dy); rlm@1: dest += 2; rlm@1: CPUWriteHalfWord(dest, dmy); rlm@1: dest += 2; rlm@1: rlm@1: s32 startx = cx - dx * dispx + dmx * dispy; rlm@1: s32 starty = cy - dy * dispx - dmy * dispy; rlm@1: rlm@1: CPUWriteMemory(dest, startx); rlm@1: dest += 4; rlm@1: CPUWriteMemory(dest, starty); rlm@1: dest += 4; rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_CpuSet() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("CpuSet: 0x%08x,0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, reg[1].I, rlm@1: reg[2].I, VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: u32 cnt = reg[2].I; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + (((cnt << 11)>>9) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: int count = cnt & 0x1FFFFF; rlm@1: rlm@1: // 32-bit ? rlm@1: if ((cnt >> 26) & 1) rlm@1: { rlm@1: // needed for 32-bit mode! rlm@1: source &= 0xFFFFFFFC; rlm@1: dest &= 0xFFFFFFFC; rlm@1: // fill ? rlm@1: if ((cnt >> 24) & 1) rlm@1: { rlm@1: u32 value = CPUReadMemory(source); rlm@1: while (count) rlm@1: { rlm@1: CPUWriteMemory(dest, value); rlm@1: dest += 4; rlm@1: count--; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: // copy rlm@1: while (count) rlm@1: { rlm@1: CPUWriteMemory(dest, CPUReadMemory(source)); rlm@1: source += 4; rlm@1: dest += 4; rlm@1: count--; rlm@1: } rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: // 16-bit fill? rlm@1: if ((cnt >> 24) & 1) rlm@1: { rlm@1: u16 value = CPUReadHalfWord(source); rlm@1: while (count) rlm@1: { rlm@1: CPUWriteHalfWord(dest, value); rlm@1: dest += 2; rlm@1: count--; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: // copy rlm@1: while (count) rlm@1: { rlm@1: CPUWriteHalfWord(dest, CPUReadHalfWord(source)); rlm@1: source += 2; rlm@1: dest += 2; rlm@1: count--; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_CpuFastSet() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("CpuFastSet: 0x%08x,0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, reg[1].I, rlm@1: reg[2].I, VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: u32 cnt = reg[2].I; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + (((cnt << 11)>>9) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: // needed for 32-bit mode! rlm@1: source &= 0xFFFFFFFC; rlm@1: dest &= 0xFFFFFFFC; rlm@1: rlm@1: int count = cnt & 0x1FFFFF; rlm@1: rlm@1: // fill? rlm@1: if ((cnt >> 24) & 1) rlm@1: { rlm@1: while (count > 0) rlm@1: { rlm@1: // BIOS always transfers 32 bytes at a time rlm@1: u32 value = CPUReadMemory(source); rlm@1: for (int i = 0; i < 8; i++) rlm@1: { rlm@1: CPUWriteMemory(dest, value); rlm@1: dest += 4; rlm@1: } rlm@1: count -= 8; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: // copy rlm@1: while (count > 0) rlm@1: { rlm@1: // BIOS always transfers 32 bytes at a time rlm@1: for (int i = 0; i < 8; i++) rlm@1: { rlm@1: CPUWriteMemory(dest, CPUReadMemory(source)); rlm@1: source += 4; rlm@1: dest += 4; rlm@1: } rlm@1: count -= 8; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_Diff8bitUnFilterWram() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("Diff8bitUnFilterWram: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, rlm@1: reg[1].I, VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff) & 0xe000000) == 0)) rlm@1: return; rlm@1: rlm@1: int len = header >> 8; rlm@1: rlm@1: u8 data = CPUReadByte(source++); rlm@1: CPUWriteByte(dest++, data); rlm@1: len--; rlm@1: rlm@1: while (len > 0) rlm@1: { rlm@1: u8 diff = CPUReadByte(source++); rlm@1: data += diff; rlm@1: CPUWriteByte(dest++, data); rlm@1: len--; rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_Diff8bitUnFilterVram() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("Diff8bitUnFilterVram: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, rlm@1: reg[1].I, VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: int len = header >> 8; rlm@1: rlm@1: u8 data = CPUReadByte(source++); rlm@1: u16 writeData = data; rlm@1: int shift = 8; rlm@1: int bytes = 1; rlm@1: rlm@1: while (len >= 2) rlm@1: { rlm@1: u8 diff = CPUReadByte(source++); rlm@1: data += diff; rlm@1: writeData |= (data << shift); rlm@1: bytes++; rlm@1: shift += 8; rlm@1: if (bytes == 2) rlm@1: { rlm@1: CPUWriteHalfWord(dest, writeData); rlm@1: dest += 2; rlm@1: len -= 2; rlm@1: bytes = 0; rlm@1: writeData = 0; rlm@1: shift = 0; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_Diff16bitUnFilter() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("Diff16bitUnFilter: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, rlm@1: reg[1].I, VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: int len = header >> 8; rlm@1: rlm@1: u16 data = CPUReadHalfWord(source); rlm@1: source += 2; rlm@1: CPUWriteHalfWord(dest, data); rlm@1: dest += 2; rlm@1: len -= 2; rlm@1: rlm@1: while (len >= 2) rlm@1: { rlm@1: u16 diff = CPUReadHalfWord(source); rlm@1: source += 2; rlm@1: data += diff; rlm@1: CPUWriteHalfWord(dest, data); rlm@1: dest += 2; rlm@1: len -= 2; rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_Div() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("Div: 0x%08x,0x%08x (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: int number = reg[0].I; rlm@1: int denom = reg[1].I; rlm@1: rlm@1: if (denom != 0) rlm@1: { rlm@1: reg[0].I = number / denom; rlm@1: reg[1].I = number % denom; rlm@1: s32 temp = (s32)reg[0].I; rlm@1: reg[3].I = temp < 0 ? (u32)-temp : (u32)temp; rlm@1: } rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("Div: return=0x%08x,0x%08x,0x%08x\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: reg[3].I); rlm@1: } rlm@1: #endif rlm@1: } rlm@1: rlm@1: void BIOS_DivARM() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("DivARM: 0x%08x, (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 temp = reg[0].I; rlm@1: reg[0].I = reg[1].I; rlm@1: reg[1].I = temp; rlm@1: BIOS_Div(); rlm@1: } rlm@1: rlm@1: void BIOS_HuffUnComp() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("HuffUnComp: 0x%08x,0x%08x (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: u8 treeSize = CPUReadByte(source++); rlm@1: rlm@1: u32 treeStart = source; rlm@1: rlm@1: source += (treeSize<<1) + 1; rlm@1: rlm@1: int len = header >> 8; rlm@1: rlm@1: u32 mask = 0x80000000; rlm@1: u32 data = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: int pos = 0; rlm@1: u8 rootNode = CPUReadByte(treeStart); rlm@1: u8 currentNode = rootNode; rlm@1: bool writeData = false; rlm@1: int byteShift = 0; rlm@1: int byteCount = 0; rlm@1: u32 writeValue = 0; rlm@1: rlm@1: if ((header & 0x0F) == 8) rlm@1: { rlm@1: while (len > 0) rlm@1: { rlm@1: // take left rlm@1: if (pos == 0) rlm@1: pos++; rlm@1: else rlm@1: pos += (((currentNode & 0x3F)+1)<<1); rlm@1: rlm@1: if (data & mask) rlm@1: { rlm@1: // right rlm@1: if (currentNode & 0x40) rlm@1: writeData = true; rlm@1: currentNode = CPUReadByte(treeStart+pos+1); rlm@1: } rlm@1: else rlm@1: { rlm@1: // left rlm@1: if (currentNode & 0x80) rlm@1: writeData = true; rlm@1: currentNode = CPUReadByte(treeStart+pos); rlm@1: } rlm@1: rlm@1: if (writeData) rlm@1: { rlm@1: writeValue |= (currentNode << byteShift); rlm@1: byteCount++; rlm@1: byteShift += 8; rlm@1: rlm@1: pos = 0; rlm@1: currentNode = rootNode; rlm@1: writeData = false; rlm@1: rlm@1: if (byteCount == 4) rlm@1: { rlm@1: byteCount = 0; rlm@1: byteShift = 0; rlm@1: CPUWriteMemory(dest, writeValue); rlm@1: writeValue = 0; rlm@1: dest += 4; rlm@1: len -= 4; rlm@1: } rlm@1: } rlm@1: mask >>= 1; rlm@1: if (mask == 0) rlm@1: { rlm@1: mask = 0x80000000; rlm@1: data = CPUReadMemory(source); rlm@1: source += 4; rlm@1: } rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: int halfLen = 0; rlm@1: int value = 0; rlm@1: while (len > 0) rlm@1: { rlm@1: // take left rlm@1: if (pos == 0) rlm@1: pos++; rlm@1: else rlm@1: pos += (((currentNode & 0x3F)+1)<<1); rlm@1: rlm@1: if ((data & mask)) rlm@1: { rlm@1: // right rlm@1: if (currentNode & 0x40) rlm@1: writeData = true; rlm@1: currentNode = CPUReadByte(treeStart+pos+1); rlm@1: } rlm@1: else rlm@1: { rlm@1: // left rlm@1: if (currentNode & 0x80) rlm@1: writeData = true; rlm@1: currentNode = CPUReadByte(treeStart+pos); rlm@1: } rlm@1: rlm@1: if (writeData) rlm@1: { rlm@1: if (halfLen == 0) rlm@1: value |= currentNode; rlm@1: else rlm@1: value |= (currentNode<<4); rlm@1: rlm@1: halfLen += 4; rlm@1: if (halfLen == 8) rlm@1: { rlm@1: writeValue |= (value << byteShift); rlm@1: byteCount++; rlm@1: byteShift += 8; rlm@1: rlm@1: halfLen = 0; rlm@1: value = 0; rlm@1: rlm@1: if (byteCount == 4) rlm@1: { rlm@1: byteCount = 0; rlm@1: byteShift = 0; rlm@1: CPUWriteMemory(dest, writeValue); rlm@1: dest += 4; rlm@1: writeValue = 0; rlm@1: len -= 4; rlm@1: } rlm@1: } rlm@1: pos = 0; rlm@1: currentNode = rootNode; rlm@1: writeData = false; rlm@1: } rlm@1: mask >>= 1; rlm@1: if (mask == 0) rlm@1: { rlm@1: mask = 0x80000000; rlm@1: data = CPUReadMemory(source); rlm@1: source += 4; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_LZ77UnCompVram() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("LZ77UnCompVram: 0x%08x,0x%08x (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: int byteCount = 0; rlm@1: int byteShift = 0; rlm@1: u32 writeValue = 0; rlm@1: rlm@1: int len = header >> 8; rlm@1: rlm@1: while (len > 0) rlm@1: { rlm@1: u8 d = CPUReadByte(source++); rlm@1: rlm@1: if (d) rlm@1: { rlm@1: for (int i = 0; i < 8; i++) rlm@1: { rlm@1: if (d & 0x80) rlm@1: { rlm@1: u16 data = CPUReadByte(source++) << 8; rlm@1: data |= CPUReadByte(source++); rlm@1: int length = (data >> 12) + 3; rlm@1: int offset = (data & 0x0FFF); rlm@1: u32 windowOffset = dest + byteCount - offset - 1; rlm@1: for (int i = 0; i < length; i++) rlm@1: { rlm@1: writeValue |= (CPUReadByte(windowOffset++) << byteShift); rlm@1: byteShift += 8; rlm@1: byteCount++; rlm@1: rlm@1: if (byteCount == 2) rlm@1: { rlm@1: CPUWriteHalfWord(dest, writeValue); rlm@1: dest += 2; rlm@1: byteCount = 0; rlm@1: byteShift = 0; rlm@1: writeValue = 0; rlm@1: } rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: writeValue |= (CPUReadByte(source++) << byteShift); rlm@1: byteShift += 8; rlm@1: byteCount++; rlm@1: if (byteCount == 2) rlm@1: { rlm@1: CPUWriteHalfWord(dest, writeValue); rlm@1: dest += 2; rlm@1: byteCount = 0; rlm@1: byteShift = 0; rlm@1: writeValue = 0; rlm@1: } rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: d <<= 1; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: for (int i = 0; i < 8; i++) rlm@1: { rlm@1: writeValue |= (CPUReadByte(source++) << byteShift); rlm@1: byteShift += 8; rlm@1: byteCount++; rlm@1: if (byteCount == 2) rlm@1: { rlm@1: CPUWriteHalfWord(dest, writeValue); rlm@1: dest += 2; rlm@1: byteShift = 0; rlm@1: byteCount = 0; rlm@1: writeValue = 0; rlm@1: } rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_LZ77UnCompWram() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("LZ77UnCompWram: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, reg[1].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: int len = header >> 8; rlm@1: rlm@1: while (len > 0) rlm@1: { rlm@1: u8 d = CPUReadByte(source++); rlm@1: rlm@1: if (d) rlm@1: { rlm@1: for (int i = 0; i < 8; i++) rlm@1: { rlm@1: if (d & 0x80) rlm@1: { rlm@1: u16 data = CPUReadByte(source++) << 8; rlm@1: data |= CPUReadByte(source++); rlm@1: int length = (data >> 12) + 3; rlm@1: int offset = (data & 0x0FFF); rlm@1: u32 windowOffset = dest - offset - 1; rlm@1: for (int i = 0; i < length; i++) rlm@1: { rlm@1: CPUWriteByte(dest++, CPUReadByte(windowOffset++)); rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: CPUWriteByte(dest++, CPUReadByte(source++)); rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: d <<= 1; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: for (int i = 0; i < 8; i++) rlm@1: { rlm@1: CPUWriteByte(dest++, CPUReadByte(source++)); rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_ObjAffineSet() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("ObjAffineSet: 0x%08x,0x%08x,0x%08x,0x%08x (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: reg[2].I, rlm@1: reg[3].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 src = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: int num = reg[2].I; rlm@1: int offset = reg[3].I; rlm@1: rlm@1: for (int i = 0; i < num; i++) rlm@1: { rlm@1: s16 rx = CPUReadHalfWord(src); rlm@1: src += 2; rlm@1: s16 ry = CPUReadHalfWord(src); rlm@1: src += 2; rlm@1: u16 theta = CPUReadHalfWord(src)>>8; rlm@1: src += 4; // keep structure alignment rlm@1: rlm@1: s32 a = (s32)sineTable[(theta+0x40)&255]; rlm@1: s32 b = (s32)sineTable[theta]; rlm@1: rlm@1: s16 dx = (s16)((rx * a)>>14); rlm@1: s16 dmx = (s16)((rx * b)>>14); rlm@1: s16 dy = (s16)((ry * b)>>14); rlm@1: s16 dmy = (s16)((ry * a)>>14); rlm@1: rlm@1: CPUWriteHalfWord(dest, dx); rlm@1: dest += offset; rlm@1: CPUWriteHalfWord(dest, -dmx); rlm@1: dest += offset; rlm@1: CPUWriteHalfWord(dest, dy); rlm@1: dest += offset; rlm@1: CPUWriteHalfWord(dest, dmy); rlm@1: dest += offset; rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_RegisterRamReset(u32 flags) rlm@1: { rlm@1: // no need to trace here. this is only called directly from GBA.cpp rlm@1: // to emulate bios initialization rlm@1: rlm@1: if (flags) rlm@1: { rlm@1: if (flags & 0x01) rlm@1: { rlm@1: // clear work RAM rlm@1: memset(workRAM, 0, 0x40000); rlm@1: } rlm@1: if (flags & 0x02) rlm@1: { rlm@1: // clear internal RAM rlm@1: memset(internalRAM, 0, 0x7e00); // don't clear 0x7e00-0x7fff rlm@1: } rlm@1: if (flags & 0x04) rlm@1: { rlm@1: // clear palette RAM rlm@1: memset(paletteRAM, 0, 0x400); rlm@1: } rlm@1: if (flags & 0x08) rlm@1: { rlm@1: // clear VRAM rlm@1: memset(vram, 0, 0x18000); rlm@1: } rlm@1: if (flags & 0x10) rlm@1: { rlm@1: // clean OAM rlm@1: memset(oam, 0, 0x400); rlm@1: } rlm@1: rlm@1: if (flags & 0x80) rlm@1: { rlm@1: int i; rlm@1: for (i = 0; i < 8; i++) rlm@1: CPUUpdateRegister(0x200+i*2, 0); rlm@1: rlm@1: CPUUpdateRegister(0x202, 0xFFFF); rlm@1: rlm@1: for (i = 0; i < 8; i++) rlm@1: CPUUpdateRegister(0x4+i*2, 0); rlm@1: rlm@1: for (i = 0; i < 16; i++) rlm@1: CPUUpdateRegister(0x20+i*2, 0); rlm@1: rlm@1: for (i = 0; i < 24; i++) rlm@1: CPUUpdateRegister(0xb0+i*2, 0); rlm@1: rlm@1: CPUUpdateRegister(0x130, 0); rlm@1: CPUUpdateRegister(0x20, 0x100); rlm@1: CPUUpdateRegister(0x30, 0x100); rlm@1: CPUUpdateRegister(0x26, 0x100); rlm@1: CPUUpdateRegister(0x36, 0x100); rlm@1: } rlm@1: rlm@1: if (flags & 0x20) rlm@1: { rlm@1: int i; rlm@1: for (i = 0; i < 8; i++) rlm@1: CPUUpdateRegister(0x110+i*2, 0); rlm@1: CPUUpdateRegister(0x134, 0x8000); rlm@1: for (i = 0; i < 7; i++) rlm@1: CPUUpdateRegister(0x140+i*2, 0); rlm@1: } rlm@1: rlm@1: if (flags & 0x40) rlm@1: { rlm@1: int i; rlm@1: CPUWriteByte(0x4000084, 0); rlm@1: CPUWriteByte(0x4000084, 0x80); rlm@1: CPUWriteMemory(0x4000080, 0x880e0000); rlm@1: CPUUpdateRegister(0x88, CPUReadHalfWord(0x4000088)&0x3ff); rlm@1: CPUWriteByte(0x4000070, 0x70); rlm@1: for (i = 0; i < 8; i++) rlm@1: CPUUpdateRegister(0x90+i*2, 0); rlm@1: CPUWriteByte(0x4000070, 0); rlm@1: for (i = 0; i < 8; i++) rlm@1: CPUUpdateRegister(0x90+i*2, 0); rlm@1: CPUWriteByte(0x4000084, 0); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_RegisterRamReset() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("RegisterRamReset: 0x%08x (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: BIOS_RegisterRamReset(reg[0].I); rlm@1: } rlm@1: rlm@1: void BIOS_RLUnCompVram() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("RLUnCompVram: 0x%08x,0x%08x (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: int len = header >> 8; rlm@1: int byteCount = 0; rlm@1: int byteShift = 0; rlm@1: u32 writeValue = 0; rlm@1: rlm@1: while (len > 0) rlm@1: { rlm@1: u8 d = CPUReadByte(source++); rlm@1: int l = d & 0x7F; rlm@1: if (d & 0x80) rlm@1: { rlm@1: u8 data = CPUReadByte(source++); rlm@1: l += 3; rlm@1: for (int i = 0; i < l; i++) rlm@1: { rlm@1: writeValue |= (data << byteShift); rlm@1: byteShift += 8; rlm@1: byteCount++; rlm@1: rlm@1: if (byteCount == 2) rlm@1: { rlm@1: CPUWriteHalfWord(dest, writeValue); rlm@1: dest += 2; rlm@1: byteCount = 0; rlm@1: byteShift = 0; rlm@1: writeValue = 0; rlm@1: } rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: l++; rlm@1: for (int i = 0; i < l; i++) rlm@1: { rlm@1: writeValue |= (CPUReadByte(source++) << byteShift); rlm@1: byteShift += 8; rlm@1: byteCount++; rlm@1: if (byteCount == 2) rlm@1: { rlm@1: CPUWriteHalfWord(dest, writeValue); rlm@1: dest += 2; rlm@1: byteCount = 0; rlm@1: byteShift = 0; rlm@1: writeValue = 0; rlm@1: } rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_RLUnCompWram() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("RLUnCompWram: 0x%08x,0x%08x (VCOUNT=%d)\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 source = reg[0].I; rlm@1: u32 dest = reg[1].I; rlm@1: rlm@1: u32 header = CPUReadMemory(source); rlm@1: source += 4; rlm@1: rlm@1: if (((source & 0xe000000) == 0) || rlm@1: ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) rlm@1: return; rlm@1: rlm@1: int len = header >> 8; rlm@1: rlm@1: while (len > 0) rlm@1: { rlm@1: u8 d = CPUReadByte(source++); rlm@1: int l = d & 0x7F; rlm@1: if (d & 0x80) rlm@1: { rlm@1: u8 data = CPUReadByte(source++); rlm@1: l += 3; rlm@1: for (int i = 0; i < l; i++) rlm@1: { rlm@1: CPUWriteByte(dest++, data); rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: l++; rlm@1: for (int i = 0; i < l; i++) rlm@1: { rlm@1: CPUWriteByte(dest++, CPUReadByte(source++)); rlm@1: len--; rlm@1: if (len == 0) rlm@1: return; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_SoftReset() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("SoftReset: (VCOUNT=%d)\n", VCOUNT); rlm@1: } rlm@1: #endif rlm@1: rlm@1: armState = true; rlm@1: armMode = 0x1F; rlm@1: armIrqEnable = false; rlm@1: C_FLAG = V_FLAG = N_FLAG = Z_FLAG = false; rlm@1: reg[13].I = 0x03007F00; rlm@1: reg[14].I = 0x00000000; rlm@1: reg[16].I = 0x00000000; rlm@1: reg[R13_IRQ].I = 0x03007FA0; rlm@1: reg[R14_IRQ].I = 0x00000000; rlm@1: reg[SPSR_IRQ].I = 0x00000000; rlm@1: reg[R13_SVC].I = 0x03007FE0; rlm@1: reg[R14_SVC].I = 0x00000000; rlm@1: reg[SPSR_SVC].I = 0x00000000; rlm@1: u8 b = internalRAM[0x7ffa]; rlm@1: rlm@1: memset(&internalRAM[0x7e00], 0, 0x200); rlm@1: rlm@1: if (b) rlm@1: { rlm@1: armNextPC = 0x02000000; rlm@1: reg[15].I = 0x02000004; rlm@1: } rlm@1: else rlm@1: { rlm@1: armNextPC = 0x08000000; rlm@1: reg[15].I = 0x08000004; rlm@1: } rlm@1: } rlm@1: rlm@1: void BIOS_Sqrt() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("Sqrt: %08x (VCOUNT=%2d)\n", rlm@1: reg[0].I, rlm@1: VCOUNT); rlm@1: } rlm@1: #endif rlm@1: reg[0].I = (u32)sqrt((double)reg[0].I); rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("Sqrt: return=%08x\n", rlm@1: reg[0].I); rlm@1: } rlm@1: #endif rlm@1: } rlm@1: rlm@1: void BIOS_MidiKey2Freq() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("MidiKey2Freq: WaveData=%08x mk=%08x fp=%08x\n", rlm@1: reg[0].I, rlm@1: reg[1].I, rlm@1: reg[2].I); rlm@1: } rlm@1: #endif rlm@1: int freq = CPUReadMemory(reg[0].I+4); rlm@1: double tmp; rlm@1: tmp = ((double)(180 - reg[1].I)) - ((double)reg[2].I / 256.f); rlm@1: tmp = pow((double)2.f, tmp / 12.f); rlm@1: reg[0].I = (int)((double)freq / tmp); rlm@1: rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("MidiKey2Freq: return %08x\n", rlm@1: reg[0].I); rlm@1: } rlm@1: #endif rlm@1: } rlm@1: rlm@1: void BIOS_SndDriverJmpTableCopy() rlm@1: { rlm@1: #ifdef GBA_LOGGING rlm@1: if (systemVerbose & VERBOSE_SWI) rlm@1: { rlm@1: log("SndDriverJmpTableCopy: dest=%08x\n", rlm@1: reg[0].I); rlm@1: } rlm@1: #endif rlm@1: for (int i = 0; i < 0x24; i++) rlm@1: { rlm@1: CPUWriteMemory(reg[0].I, 0x9c); rlm@1: reg[0].I += 4; rlm@1: } rlm@1: } rlm@1: