From fd7d883e69cc573c7f1582eceaf1892e7e7a60e2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 24 Jul 2017 10:26:29 -0700 Subject: [PATCH 001/158] GB MBC: Initial TAMA5 support --- include/mgba/gb/interface.h | 1 + include/mgba/internal/gb/mbc.h | 2 - include/mgba/internal/gb/memory.h | 13 ++++++ src/gb/gb.c | 4 +- src/gb/mbc.c | 69 ++++++++++++++++++++++++++++++- src/gb/memory.c | 4 +- 6 files changed, 85 insertions(+), 8 deletions(-) diff --git a/include/mgba/gb/interface.h b/include/mgba/gb/interface.h index ef0771bca..73996746c 100644 --- a/include/mgba/gb/interface.h +++ b/include/mgba/gb/interface.h @@ -31,6 +31,7 @@ enum GBMemoryBankControllerType { GB_HuC1 = 0x11, GB_HuC3 = 0x12, GB_POCKETCAM = 0x13, + GB_TAMA5 = 0x14, GB_MBC3_RTC = 0x103, GB_MBC5_RUMBLE = 0x105 }; diff --git a/include/mgba/internal/gb/mbc.h b/include/mgba/internal/gb/mbc.h index 96a27ddc9..7ec4cf052 100644 --- a/include/mgba/internal/gb/mbc.h +++ b/include/mgba/internal/gb/mbc.h @@ -37,8 +37,6 @@ struct GBMBCRTCSaveBuffer { void GBMBCRTCRead(struct GB* gb); void GBMBCRTCWrite(struct GB* gb); -void GBMBC7Write(struct GBMemory*, uint16_t address, uint8_t value); - CXX_GUARD_END #endif diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h index d28338cff..c2d5e92fa 100644 --- a/include/mgba/internal/gb/memory.h +++ b/include/mgba/internal/gb/memory.h @@ -86,6 +86,11 @@ enum GBMBC7MachineState { GBMBC7_STATE_EEPROM_ERASE = 0x1C, }; +enum GBTAMA5Register { + GBTAMA5_BANK = 0x0, + GBTAMA5_MAX +}; + struct GBMBC1State { int mode; int multicartStride; @@ -106,10 +111,18 @@ struct GBPocketCamState { bool registersActive; }; +struct GBTAMA5State { + bool unlocked; + uint8_t reg; + uint8_t value; + uint8_t registers[GBTAMA5_MAX]; +}; + union GBMBCState { struct GBMBC1State mbc1; struct GBMBC7State mbc7; struct GBPocketCamState pocketCam; + struct GBTAMA5State tama5; }; struct mRotationSource; diff --git a/src/gb/gb.c b/src/gb/gb.c index e6f620ce1..720a862c7 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -613,7 +613,7 @@ void GBHalt(struct LR35902Core* cpu) { void GBStop(struct LR35902Core* cpu) { struct GB* gb = (struct GB*) cpu->master; if (cpu->bus) { - mLOG(GB, GAME_ERROR, "Hit illegal stop at address %04X:%02X\n", cpu->pc, cpu->bus); + mLOG(GB, GAME_ERROR, "Hit illegal stop at address %04X:%02X", cpu->pc, cpu->bus); } if (gb->memory.io[REG_KEY1] & 1) { gb->doubleSpeed ^= 1; @@ -639,7 +639,7 @@ void GBStop(struct LR35902Core* cpu) { void GBIllegal(struct LR35902Core* cpu) { struct GB* gb = (struct GB*) cpu->master; - mLOG(GB, GAME_ERROR, "Hit illegal opcode at address %04X:%02X\n", cpu->pc, cpu->bus); + mLOG(GB, GAME_ERROR, "Hit illegal opcode at address %04X:%02X", cpu->pc, cpu->bus); #ifdef USE_DEBUGGERS if (cpu->components && cpu->components[CPU_COMPONENT_DEBUGGER]) { struct mDebuggerEntryInfo info = { diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 559e3b2f9..9b628c322 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -29,8 +29,13 @@ static void _GBMBC6(struct GB*, uint16_t address, uint8_t value); static void _GBMBC7(struct GB*, uint16_t address, uint8_t value); static void _GBHuC3(struct GB*, uint16_t address, uint8_t value); static void _GBPocketCam(struct GB* gb, uint16_t address, uint8_t value); +static void _GBTAMA5(struct GB* gb, uint16_t address, uint8_t value); static uint8_t _GBMBC7Read(struct GBMemory*, uint16_t address); +static void _GBMBC7Write(struct GBMemory* memory, uint16_t address, uint8_t value); + +static uint8_t _GBTAMA5Read(struct GBMemory*, uint16_t address); + static uint8_t _GBPocketCamRead(struct GBMemory*, uint16_t address); void GBMBCSwitchBank(struct GB* gb, int bank) { @@ -160,11 +165,14 @@ void GBMBCInit(struct GB* gb) { gb->memory.mbcType = GB_POCKETCAM; break; case 0xFD: - gb->memory.mbcType = GB_HuC1; + gb->memory.mbcType = GB_TAMA5; break; case 0xFE: gb->memory.mbcType = GB_HuC3; break; + case 0xFF: + gb->memory.mbcType = GB_HuC1; + break; } } } else { @@ -211,6 +219,12 @@ void GBMBCInit(struct GB* gb) { case GB_HuC3: gb->memory.mbcWrite = _GBHuC3; break; + case GB_TAMA5: + mLOG(GB_MBC, WARN, "unimplemented MBC: TAMA5"); + memset(gb->memory.rtcRegs, 0, sizeof(gb->memory.rtcRegs)); + gb->memory.mbcWrite = _GBTAMA5; + gb->memory.mbcRead = _GBTAMA5Read; + break; case GB_MBC3_RTC: memset(gb->memory.rtcRegs, 0, sizeof(gb->memory.rtcRegs)); gb->memory.mbcWrite = _GBMBC3; @@ -493,6 +507,8 @@ void _GBMBC7(struct GB* gb, uint16_t address, uint8_t value) { gb->memory.mbcState.mbc7.access &= ~2; } break; + case 0x5: + _GBMBC7Write(&gb->memory, address, value); default: // TODO mLOG(GB_MBC, STUB, "MBC7 unknown address: %04X:%02X", address, value); @@ -547,7 +563,7 @@ uint8_t _GBMBC7Read(struct GBMemory* memory, uint16_t address) { } } -void GBMBC7Write(struct GBMemory* memory, uint16_t address, uint8_t value) { +static void _GBMBC7Write(struct GBMemory* memory, uint16_t address, uint8_t value) { struct GBMBC7State* mbc7 = &memory->mbcState.mbc7; if (mbc7->access != 3) { return; @@ -750,6 +766,55 @@ uint8_t _GBPocketCamRead(struct GBMemory* memory, uint16_t address) { return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)]; } +void _GBTAMA5(struct GB* gb, uint16_t address, uint8_t value) { + struct GBMemory* memory = &gb->memory; + struct GBTAMA5State* tama5 = &memory->mbcState.tama5; + switch (address >> 13) { + case 0x5: + if (address & 1) { + if (tama5->unlocked) { + tama5->reg = value; + } else if (value == 0xA) { + tama5->unlocked = true; + } + } else { + uint8_t reg = tama5->reg >> 1; + if (reg < GBTAMA5_MAX) { + uint8_t mask = 0xF << (4 * (tama5->reg & 1)); + value <<= (4 * (tama5->reg & 1)); + value |= tama5->registers[reg] & ~mask; + tama5->registers[reg] = value; + if (tama5->reg & 1) { + switch (reg) { + case GBTAMA5_BANK: + GBMBCSwitchBank(gb, value & 0x1F); + // Fall through + default: + mLOG(GB_MBC, STUB, "TAMA5 unknown register: %02X:%02X", reg, value); + break; + } + tama5->unlocked = false; + } + } else { + mLOG(GB_MBC, STUB, "TAMA5 unknown register: %02X", reg); + } + } + break; + default: + mLOG(GB_MBC, STUB, "TAMA5 unknown address: %04X:%02X", address, value); + } +} + +uint8_t _GBTAMA5Read(struct GBMemory* memory, uint16_t address) { + struct GBTAMA5State* tama5 = &memory->mbcState.tama5; + mLOG(GB_MBC, STUB, "TAMA5 unknown address: %04X", address); + if (address & 1) { + return 0xFF; + } else { + return 0xF0 | tama5->unlocked; + } +} + void GBMBCRTCRead(struct GB* gb) { struct GBMBCRTCSaveBuffer rtcBuffer; struct VFile* vf = gb->sramVf; diff --git a/src/gb/memory.c b/src/gb/memory.c index f37f6ef73..1d40bb7a9 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -289,8 +289,8 @@ void GBStore8(struct LR35902Core* cpu, uint16_t address, int8_t value) { memory->rtcRegs[memory->activeRtcReg] = value; } else if (memory->sramAccess) { memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)] = value; - } else if (memory->mbcType == GB_MBC7) { - GBMBC7Write(memory, address, value); + } else { + memory->mbcWrite(gb, address, value); } gb->sramDirty |= GB_SRAM_DIRT_NEW; return; From f187fba4fbee89d8fab91b445ed43d4ed0c0bc45 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 24 Jul 2017 13:48:59 -0700 Subject: [PATCH 002/158] GB MBC: More detailed TAMA5 implementation, working saves --- include/mgba/internal/gb/memory.h | 14 ++++-- src/gb/mbc.c | 78 ++++++++++++++++++++++--------- 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h index c2d5e92fa..44eb2a541 100644 --- a/include/mgba/internal/gb/memory.h +++ b/include/mgba/internal/gb/memory.h @@ -87,8 +87,16 @@ enum GBMBC7MachineState { }; enum GBTAMA5Register { - GBTAMA5_BANK = 0x0, - GBTAMA5_MAX + GBTAMA5_BANK_LO = 0x0, + GBTAMA5_BANK_HI = 0x1, + GBTAMA5_WRITE_LO = 0x4, + GBTAMA5_WRITE_HI = 0x5, + GBTAMA5_CS = 0x6, + GBTAMA5_ADDR_LO = 0x7, + GBTAMA5_MAX = 0x8, + GBTAMA5_ACTIVE = 0xA, + GBTAMA5_READ_LO = 0xC, + GBTAMA5_READ_HI = 0xD, }; struct GBMBC1State { @@ -112,9 +120,7 @@ struct GBPocketCamState { }; struct GBTAMA5State { - bool unlocked; uint8_t reg; - uint8_t value; uint8_t registers[GBTAMA5_MAX]; }; diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 9b628c322..496289a06 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -224,6 +224,7 @@ void GBMBCInit(struct GB* gb) { memset(gb->memory.rtcRegs, 0, sizeof(gb->memory.rtcRegs)); gb->memory.mbcWrite = _GBTAMA5; gb->memory.mbcRead = _GBTAMA5Read; + gb->sramSize = 0x20; break; case GB_MBC3_RTC: memset(gb->memory.rtcRegs, 0, sizeof(gb->memory.rtcRegs)); @@ -772,31 +773,39 @@ void _GBTAMA5(struct GB* gb, uint16_t address, uint8_t value) { switch (address >> 13) { case 0x5: if (address & 1) { - if (tama5->unlocked) { - tama5->reg = value; - } else if (value == 0xA) { - tama5->unlocked = true; - } + tama5->reg = value; } else { - uint8_t reg = tama5->reg >> 1; - if (reg < GBTAMA5_MAX) { - uint8_t mask = 0xF << (4 * (tama5->reg & 1)); - value <<= (4 * (tama5->reg & 1)); - value |= tama5->registers[reg] & ~mask; - tama5->registers[reg] = value; - if (tama5->reg & 1) { - switch (reg) { - case GBTAMA5_BANK: - GBMBCSwitchBank(gb, value & 0x1F); - // Fall through - default: - mLOG(GB_MBC, STUB, "TAMA5 unknown register: %02X:%02X", reg, value); + value &= 0xF; + if (tama5->reg < GBTAMA5_MAX) { + tama5->registers[tama5->reg] = value; + uint8_t address = ((tama5->registers[GBTAMA5_CS] << 4) & 0x10) | tama5->registers[GBTAMA5_ADDR_LO]; + uint8_t out = (tama5->registers[GBTAMA5_WRITE_HI] << 4) | tama5->registers[GBTAMA5_WRITE_LO]; + switch (tama5->reg) { + case GBTAMA5_BANK_LO: + case GBTAMA5_BANK_HI: + GBMBCSwitchBank(gb, tama5->registers[GBTAMA5_BANK_LO] | (tama5->registers[GBTAMA5_BANK_HI] << 4)); + break; + case GBTAMA5_WRITE_LO: + case GBTAMA5_WRITE_HI: + case GBTAMA5_CS: + break; + case GBTAMA5_ADDR_LO: + switch (tama5->registers[GBTAMA5_CS] >> 1) { + case 0x0: // RAM write + memory->sram[address] = out; break; + case 0x1: // RAM read + break; + default: + mLOG(GB_MBC, STUB, "TAMA5 unknown address: %X-%02X:%02X", tama5->registers[GBTAMA5_CS] >> 1, address, out); } - tama5->unlocked = false; + break; + default: + mLOG(GB_MBC, STUB, "TAMA5 unknown write: %02X:%X", tama5->reg, value); + break; } } else { - mLOG(GB_MBC, STUB, "TAMA5 unknown register: %02X", reg); + mLOG(GB_MBC, STUB, "TAMA5 unknown write: %02X", tama5->reg); } } break; @@ -807,11 +816,36 @@ void _GBTAMA5(struct GB* gb, uint16_t address, uint8_t value) { uint8_t _GBTAMA5Read(struct GBMemory* memory, uint16_t address) { struct GBTAMA5State* tama5 = &memory->mbcState.tama5; - mLOG(GB_MBC, STUB, "TAMA5 unknown address: %04X", address); + if ((address & 0x1FFF) > 1) { + mLOG(GB_MBC, STUB, "TAMA5 unknown address: %04X", address); + } if (address & 1) { return 0xFF; } else { - return 0xF0 | tama5->unlocked; + uint8_t value = 0xF0; + uint8_t address = ((tama5->registers[GBTAMA5_CS] << 4) & 0x10) | tama5->registers[GBTAMA5_ADDR_LO]; + switch (tama5->reg) { + case GBTAMA5_ACTIVE: + return 0xF1; + case GBTAMA5_READ_LO: + case GBTAMA5_READ_HI: + switch (tama5->registers[GBTAMA5_CS] >> 1) { + case 1: + value = memory->sram[address]; + break; + default: + mLOG(GB_MBC, STUB, "TAMA5 unknown read: %02X", tama5->reg); + break; + } + if (tama5->reg == GBTAMA5_READ_HI) { + value >>= 4; + } + value |= 0xF0; + return value; + default: + mLOG(GB_MBC, STUB, "TAMA5 unknown read: %02X", tama5->reg); + return 0xF1; + } } } From 9de2189b2ef52ddb51dfde14befda9e4dff4e436 Mon Sep 17 00:00:00 2001 From: NieDzejkob Date: Tue, 25 Jul 2017 14:56:41 +0200 Subject: [PATCH 003/158] Qt: Fix building with FFmpeg or ImageMagick disabled --- src/platform/qt/Window.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 55b9eb8c9..fda4c03d5 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -1753,15 +1753,23 @@ void Window::setController(CoreController* controller, const QString& fname) { if (m_gdbController) { m_gdbController->setController(m_controller); } + if (m_console) { m_console->setController(m_controller); } + +#ifdef USE_MAGICK if (m_gifView) { m_gifView->setController(m_controller); } +#endif + +#ifdef USE_FFMPEG if (m_videoView) { m_videoView->setController(m_controller); } +#endif + if (m_overrideView) { m_overrideView->setController(m_controller); } From a7fb4460298027da9d48aa91450e5268d913dc27 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 25 Jul 2017 11:15:08 -0700 Subject: [PATCH 004/158] Qt: Fix backup load state (fixes #823) --- src/platform/qt/CoreController.cpp | 2 +- src/platform/qt/VFileDevice.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 0da9443f5..86c375edb 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -408,7 +408,7 @@ void CoreController::loadState(int slot) { if (!controller->m_backupLoadState.isOpen()) { controller->m_backupLoadState = VFileMemChunk(nullptr, 0); } - mCoreLoadStateNamed(context->core, controller->m_backupLoadState, controller->m_saveStateFlags); + mCoreSaveStateNamed(context->core, controller->m_backupLoadState, controller->m_saveStateFlags); if (mCoreLoadState(context->core, controller->m_stateSlot, controller->m_loadStateFlags)) { emit controller->frameAvailable(); emit controller->stateLoaded(); diff --git a/src/platform/qt/VFileDevice.cpp b/src/platform/qt/VFileDevice.cpp index d3b8c8bed..49b761768 100644 --- a/src/platform/qt/VFileDevice.cpp +++ b/src/platform/qt/VFileDevice.cpp @@ -20,6 +20,9 @@ VFileDevice::VFileDevice(VFile* vf, QObject* parent) } void VFileDevice::close() { + if (!m_vf) { + return; + } QIODevice::close(); m_vf->close(m_vf); m_vf = nullptr; From 1a30dcc5537a4263209f0f5c088be6c02b593c72 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 25 Jul 2017 13:44:23 -0700 Subject: [PATCH 005/158] GB Serialize: Fix audio state loading --- CHANGES | 1 + src/gb/audio.c | 2 ++ src/gb/io.c | 30 ++++++++++++++++++++++++++++++ src/gb/serialize.c | 8 ++++---- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 38ce42b1f..4111b34da 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Bugfixes: - Python: Fix importing .gb or .gba before .core - GBA: Reset active region as needed when loading a ROM - Qt: Fix command line debugger closing second game + - GB Serialize: Fix audio state loading Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/audio.c b/src/gb/audio.c index b8541b720..adaa44ff4 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -960,6 +960,8 @@ void GBAudioPSGDeserialize(struct GBAudio* audio, const struct GBSerializedPSGSt mTimingSchedule(audio->timing, &audio->frameEvent, when); LOAD_32LE(flags, 0, flagsIn); + audio->frame = GBSerializedAudioFlagsGetFrame(flags); + LOAD_32LE(ch1Flags, 0, &state->ch1.envelope); audio->ch1.envelope.currentVolume = GBSerializedAudioFlagsGetCh1Volume(flags); audio->ch1.envelope.dead = GBSerializedAudioFlagsGetCh1Dead(flags); diff --git a/src/gb/io.c b/src/gb/io.c index 3be656499..b4c42f7f9 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -580,6 +580,36 @@ void GBIOSerialize(const struct GB* gb, struct GBSerializedState* state) { void GBIODeserialize(struct GB* gb, const struct GBSerializedState* state) { memcpy(gb->memory.io, state->io, GB_SIZE_IO); gb->memory.ie = state->ie; + + if (GBAudioEnableGetEnable(*gb->audio.nr52)) { + GBIOWrite(gb, REG_NR10, gb->memory.io[REG_NR10]); + GBIOWrite(gb, REG_NR11, gb->memory.io[REG_NR11]); + GBIOWrite(gb, REG_NR12, gb->memory.io[REG_NR12]); + GBIOWrite(gb, REG_NR13, gb->memory.io[REG_NR13]); + gb->audio.ch1.control.frequency &= 0xFF; + gb->audio.ch1.control.frequency |= GBAudioRegisterControlGetFrequency(gb->memory.io[REG_NR14] << 8); + gb->audio.ch1.control.stop = GBAudioRegisterControlGetStop(gb->memory.io[REG_NR14] << 8); + GBIOWrite(gb, REG_NR21, gb->memory.io[REG_NR21]); + GBIOWrite(gb, REG_NR22, gb->memory.io[REG_NR22]); + GBIOWrite(gb, REG_NR22, gb->memory.io[REG_NR23]); + gb->audio.ch2.control.frequency &= 0xFF; + gb->audio.ch2.control.frequency |= GBAudioRegisterControlGetFrequency(gb->memory.io[REG_NR24] << 8); + gb->audio.ch2.control.stop = GBAudioRegisterControlGetStop(gb->memory.io[REG_NR24] << 8); + GBIOWrite(gb, REG_NR30, gb->memory.io[REG_NR30]); + GBIOWrite(gb, REG_NR31, gb->memory.io[REG_NR31]); + GBIOWrite(gb, REG_NR32, gb->memory.io[REG_NR32]); + GBIOWrite(gb, REG_NR32, gb->memory.io[REG_NR33]); + gb->audio.ch3.rate &= 0xFF; + gb->audio.ch3.rate |= GBAudioRegisterControlGetRate(gb->memory.io[REG_NR34] << 8); + gb->audio.ch3.stop = GBAudioRegisterControlGetStop(gb->memory.io[REG_NR34] << 8); + GBIOWrite(gb, REG_NR41, gb->memory.io[REG_NR41]); + GBIOWrite(gb, REG_NR42, gb->memory.io[REG_NR42]); + GBIOWrite(gb, REG_NR43, gb->memory.io[REG_NR43]); + gb->audio.ch4.stop = GBAudioRegisterNoiseControlGetStop(gb->memory.io[REG_NR44]); + GBIOWrite(gb, REG_NR50, gb->memory.io[REG_NR50]); + GBIOWrite(gb, REG_NR51, gb->memory.io[REG_NR51]); + } + gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_LCDC, state->io[REG_LCDC]); gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_SCY, state->io[REG_SCY]); gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_SCX, state->io[REG_SCX]); diff --git a/src/gb/serialize.c b/src/gb/serialize.c index d9f192092..006f126a7 100644 --- a/src/gb/serialize.c +++ b/src/gb/serialize.c @@ -150,16 +150,16 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { gb->doubleSpeed = GBSerializedCpuFlagsGetDoubleSpeed(flags); gb->audio.timingFactor = gb->doubleSpeed + 1; + LOAD_32LE(gb->cpu->cycles, 0, &state->cpu.cycles); + LOAD_32LE(gb->cpu->nextEvent, 0, &state->cpu.nextEvent); + gb->timing.root = NULL; + uint32_t when; LOAD_32LE(when, 0, &state->cpu.eiPending); if (GBSerializedCpuFlagsIsEiPending(flags)) { mTimingSchedule(&gb->timing, &gb->eiPending, when); } - LOAD_32LE(gb->cpu->cycles, 0, &state->cpu.cycles); - LOAD_32LE(gb->cpu->nextEvent, 0, &state->cpu.nextEvent); - gb->timing.root = NULL; - gb->model = state->model; if (gb->model < GB_MODEL_CGB) { From 6c0d67cf5f86684e971e673000cfa4338563d5dc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 25 Jul 2017 13:46:24 -0700 Subject: [PATCH 006/158] GB Video: Fix dot clock timing being slightly wrong --- CHANGES | 1 + src/gb/video.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 4111b34da..1114e5ae7 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Bugfixes: - GBA: Reset active region as needed when loading a ROM - Qt: Fix command line debugger closing second game - GB Serialize: Fix audio state loading + - GB Video: Fix dot clock timing being slightly wrong Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/video.c b/src/gb/video.c index 605fcdd7f..830f71c30 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -211,7 +211,7 @@ void _endMode2(struct mTiming* timing, void* context, uint32_t cyclesLate) { struct GBVideo* video = context; _cleanOAM(video, video->ly); video->x = 0; - video->dotClock = timing->masterCycles - cyclesLate; + video->dotClock = mTimingCurrentTime(timing) - cyclesLate; int32_t next = GB_VIDEO_MODE_3_LENGTH_BASE + video->objMax * 6 - (video->p->memory.io[REG_SCX] & 7); video->mode = 3; video->modeEvent.callback = _endMode3; From 010cb8f49db2e35f7aa5011103a93b0b1818b45a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 25 Jul 2017 17:29:07 -0700 Subject: [PATCH 007/158] GB MBC: Pocket Cam memory should be accessible without enabling --- CHANGES | 1 + src/gb/mbc.c | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 1114e5ae7..449d43967 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ Bugfixes: - Qt: Fix command line debugger closing second game - GB Serialize: Fix audio state loading - GB Video: Fix dot clock timing being slightly wrong + - GB MBC: Pocket Cam memory should be accessible without enabling Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 496289a06..6c262e1d3 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -761,9 +761,6 @@ uint8_t _GBPocketCamRead(struct GBMemory* memory, uint16_t address) { if (memory->mbcState.pocketCam.registersActive) { return 0; } - if (!memory->sramAccess) { - return 0xFF; - } return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)]; } From bf8cc66a8533d15495a32d4fb1ec8feee9ac7731 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 25 Jul 2017 18:34:39 -0700 Subject: [PATCH 008/158] GB Memory: Initialize peripheral pointers --- CHANGES | 1 + src/gb/memory.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 449d43967..af395f570 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,7 @@ Bugfixes: - GB Serialize: Fix audio state loading - GB Video: Fix dot clock timing being slightly wrong - GB MBC: Pocket Cam memory should be accessible without enabling + - GB Memory: Initialize peripheral pointers Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/memory.c b/src/gb/memory.c index 1d40bb7a9..83556927c 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -103,6 +103,8 @@ void GBMemoryInit(struct GB* gb) { gb->memory.mbcWrite = NULL; gb->memory.rtc = NULL; + gb->memory.rotation = NULL; + gb->memory.rumble = NULL; GBIOInit(gb); } From 80cf9646a6b0f4ad6c24f29be0c9f2855a44d820 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 25 Jul 2017 18:35:57 -0700 Subject: [PATCH 009/158] GB MBC: Fix SRAM sizes 4 and 5 --- CHANGES | 1 + src/gb/mbc.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGES b/CHANGES index af395f570..410c5946a 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,7 @@ Bugfixes: - GB Video: Fix dot clock timing being slightly wrong - GB MBC: Pocket Cam memory should be accessible without enabling - GB Memory: Initialize peripheral pointers + - GB MBC: Fix SRAM sizes 4 and 5 Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 6c262e1d3..00560f648 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -110,6 +110,12 @@ void GBMBCInit(struct GB* gb) { case 3: gb->sramSize = 0x8000; break; + case 4: + gb->sramSize = 0x20000; + break; + case 5: + gb->sramSize = 0x10000; + break; } if (gb->memory.mbcType == GB_MBC_AUTODETECT) { From 56c6e3b497b45e59982f2cae19740d5fbe18bedc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Jul 2017 10:56:47 -0700 Subject: [PATCH 010/158] Qt: Fix status messages not showing --- src/platform/qt/LogController.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/qt/LogController.cpp b/src/platform/qt/LogController.cpp index 26383ba6d..d8870d335 100644 --- a/src/platform/qt/LogController.cpp +++ b/src/platform/qt/LogController.cpp @@ -14,6 +14,7 @@ LogController::LogController(int levels, QObject* parent) { mLogFilterInit(&m_filter); mLogFilterSet(&m_filter, "gba.bios", mLOG_STUB); + mLogFilterSet(&m_filter, "core.status", mLOG_ALL & ~mLOG_DEBUG); m_filter.defaultLevels = levels; if (this != &s_global) { From 55330698cb08493324a8be5e812e86f94e2ac1fe Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Jul 2017 10:57:04 -0700 Subject: [PATCH 011/158] Qt: Fix fast forward crashing when no game is loaded --- src/platform/qt/Window.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index fda4c03d5..effa21623 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -1163,6 +1163,7 @@ void Window::setupMenu(QMenuBar* menubar) { m_controller->forceFastForward(value); }); addControlledAction(emulationMenu, turbo, "fastForward"); + m_gameActions.append(turbo); QMenu* ffspeedMenu = emulationMenu->addMenu(tr("Fast forward speed")); ConfigOption* ffspeed = m_config->addOption("fastForwardRatio"); @@ -1178,9 +1179,13 @@ void Window::setupMenu(QMenuBar* menubar) { m_config->updateOption("fastForwardRatio"); m_shortcutController->addFunctions(emulationMenu, [this]() { - m_controller->setRewinding(true); + if (m_controller) { + m_controller->setRewinding(true); + } }, [this]() { - m_controller->setRewinding(false); + if (m_controller) { + m_controller->setRewinding(false); + } }, QKeySequence("`"), tr("Rewind (held)"), "holdRewind"); QAction* rewind = new QAction(tr("Re&wind"), emulationMenu); From 31b9100f381fb7ee75ba8ee006a86ab65e6e0b35 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Jul 2017 10:57:57 -0700 Subject: [PATCH 012/158] GB MBC: Pocket Cam support --- CHANGES | 1 + include/mgba/core/interface.h | 7 ++++ include/mgba/internal/gb/mbc.h | 5 +++ include/mgba/internal/gb/memory.h | 2 + res/no-cam.png | Bin 0 -> 1824 bytes src/gb/core.c | 3 ++ src/gb/gb.c | 3 ++ src/gb/mbc.c | 56 ++++++++++++++++++++++++++++ src/gb/memory.c | 1 + src/platform/qt/CoreController.cpp | 5 ++- src/platform/qt/InputController.cpp | 21 +++++++++++ src/platform/qt/InputController.h | 8 ++++ src/platform/qt/resources.qrc | 1 + 13 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 res/no-cam.png diff --git a/CHANGES b/CHANGES index 410c5946a..ef13fdd4d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ 0.7.0: (Future) Features: - ELF support + - Game Boy Camera support Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h index 44c7e13d5..44590e71d 100644 --- a/include/mgba/core/interface.h +++ b/include/mgba/core/interface.h @@ -61,6 +61,7 @@ struct mKeyCallback { enum mPeripheral { mPERIPH_ROTATION = 1, mPERIPH_RUMBLE, + mPERIPH_IMAGE_SOURCE, mPERIPH_CUSTOM = 0x1000 }; @@ -82,6 +83,12 @@ struct mRTCSource { bool (*deserialize)(struct mRTCSource*, const struct mStateExtdataItem*); }; +struct mImageSource { + void (*startRequestImage)(struct mImageSource*); + void (*stopRequestImage)(struct mImageSource*); + void (*requestImage)(struct mImageSource*, unsigned w, unsigned h, const uint32_t** buffer, size_t* stride); +}; + enum mRTCGenericType { RTC_NO_OVERRIDE, RTC_FIXED, diff --git a/include/mgba/internal/gb/mbc.h b/include/mgba/internal/gb/mbc.h index 7ec4cf052..86f58c8f0 100644 --- a/include/mgba/internal/gb/mbc.h +++ b/include/mgba/internal/gb/mbc.h @@ -21,6 +21,11 @@ void GBMBCSwitchBank(struct GB* gb, int bank); void GBMBCSwitchBank0(struct GB* gb, int bank); void GBMBCSwitchSramBank(struct GB* gb, int bank); +enum GBCam { + GBCAM_WIDTH = 128, + GBCAM_HEIGHT = 112 +}; + struct GBMBCRTCSaveBuffer { uint32_t sec; uint32_t min; diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h index 44eb2a541..eb3f9c508 100644 --- a/include/mgba/internal/gb/memory.h +++ b/include/mgba/internal/gb/memory.h @@ -117,6 +117,7 @@ struct GBMBC7State { struct GBPocketCamState { bool registersActive; + uint8_t registers[0x36]; }; struct GBTAMA5State { @@ -179,6 +180,7 @@ struct GBMemory { struct mRTCSource* rtc; struct mRotationSource* rotation; struct mRumble* rumble; + struct mImageSource* cam; }; struct LR35902Core; diff --git a/res/no-cam.png b/res/no-cam.png new file mode 100644 index 0000000000000000000000000000000000000000..2070f21ccd812ab1bfcaad5cd250bbfff54b8eba GIT binary patch literal 1824 zcmV+*2jBRKP)&GAtoHU>9PLeUoKCM5tmL27)l`hy+B|Vc3S9 zm>6T?Pw-!S?L*)0u3oEZG?`$&`!HWu-BahDuCAr)_R!xLTzjR_6wnmV6foEV!oe0W z=snOB&=fG}0$!GB*n;O?yv}$>0mC$crylX$@$|?AHCzJ-9y`bPz*D~iXru-J1P>kK z`{3!m9Wz?4&M&n(jcoM#0$?RYs2z&UNl19Yv~$>meJ9uENYOSNwjx1SB1Ze(N~%sU!<8BVmnvP8x%FHCJ-lhgbAiHq>vqKZDq&7idz?8gS4OGcj@!BI zJYiIZk%DBZ$E~Lzqd<$a1qg~jm~2q8qOA(WZs44x8Z?jsD33AP0R z06@1_#i(O3ajkhg$yQ6POdCm^dJ!j^VzWQTcTobwjYIKv7K zP>7LBmyj+ijU6EE<9oxWfbVZ@a5Wa z{G;^|Y_H`<7Amti1j};@Okat~BbETxb3ykaQ-J_hP{rzJAnN9Il$#3x zqFpeZp`;-9Igr<`1F`K*`hZvX4RIexKyFCLGOGgQUKeh+!>NiD6PCV1z-orcqvtKhcm6KfOP8XZ@y2<>7d-1Kon%B`)$!SJ0`K!yf^+(;a|r4j}Iqp zv13wO%L?|CdY5v1FG~8>2aWZtK$rNqQu;B{MlU!vvVwgD&k~OBN$9W{Wh{RG8&a_N zZOxOA)_UpP%(vN9;^S>QSm(t^t9{U0IevGkmtS3iHC_T%dVo7Q{*eklzrF>ld<3kp z0Cw>23SfKuni>1%^KV+AAX9w4eW_Vi!kxwfn}5yjFnnBhtV6|>v^*k+i&b%I1?&!$IZh_|nUKCR83rIg6;J(y z)6vz;65r_}+CUBH5ftrgjjwPn$cXe8u)ploPv-#u(`tMbRw=;#&4_^XZbZ?SFq9pQ z603?+*#lk4sekc74Vh#HE&})@@hO-Yfs2N+Fn3WEr*bn&5Q`3KK!GAdCSjwJKM|SX zqs&i|Pb-*h5YoaZ&7)*7rOH`LsQ50;XAo7=!g$#p@GOYaTy;6+*h~RZQ3z7OzZSsp zOEcawS2i;Q*C!}~O7jQ*ZXJ-NIsd}IHhVza9G^*T40IZXqyX8Awz#7114u>ydfQ9| zRdMXIKtlG3Ht=B<`Ltz*%d?I&!cTCy`-s?cxAam*$ zLWtHX0j=2{5aNC=r|Pv1gk`7xek31e&Epy)wehhwQqn&v5l|7PQox0>vj+r!n2u~J z|Nb0T==6g%cg3R-0~KH_aEZ|qV3;AS*j6W*+WbiM7SMi4tNf||8PH;OOi9~(-n7Lk zpmH6Ud|9i^ss9Clw=xf=ZVib9qJMbyD}4pX69h1E@E>= zA5{tfuJVVg-?{t-Zwys!uBlRdFtH{EeOTkfb!PYj0Ps4;uWoWfmEeO3bs^}3IxlWA z$DaURtYX0fbbL%Ja&d!`T!b3)SF zZj8@efow0r7CQ(4=uI!)|K47j|EO#VXbSir3usQmrhuk^K^HLC)9@dScNwaEZJgWy O0000memory.rumble = periph; break; + case mPERIPH_IMAGE_SOURCE: + gb->memory.cam = periph; + break; default: return; } diff --git a/src/gb/gb.c b/src/gb/gb.c index 720a862c7..0ef8bb051 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -294,6 +294,9 @@ void GBUnloadROM(struct GB* gb) { } gb->sramRealVf = NULL; gb->sramVf = NULL; + if (gb->memory.cam && gb->memory.cam->stopRequestImage) { + gb->memory.cam->stopRequestImage(gb->memory.cam); + } } void GBSynthesizeROM(struct VFile* vf) { diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 00560f648..9055d34c6 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -37,6 +37,7 @@ static void _GBMBC7Write(struct GBMemory* memory, uint16_t address, uint8_t valu static uint8_t _GBTAMA5Read(struct GBMemory*, uint16_t address); static uint8_t _GBPocketCamRead(struct GBMemory*, uint16_t address); +static void _GBPocketCamCapture(struct GBMemory*); void GBMBCSwitchBank(struct GB* gb, int bank) { size_t bankStart = bank * GB_SIZE_CART_BANK0; @@ -242,6 +243,9 @@ void GBMBCInit(struct GB* gb) { case GB_POCKETCAM: gb->memory.mbcWrite = _GBPocketCam; gb->memory.mbcRead = _GBPocketCamRead; + if (gb->memory.cam && gb->memory.cam->startRequestImage) { + gb->memory.cam->startRequestImage(gb->memory.cam); + } break; } @@ -757,6 +761,16 @@ void _GBPocketCam(struct GB* gb, uint16_t address, uint8_t value) { memory->mbcState.pocketCam.registersActive = true; } break; + case 0x5: + address &= 0x7F; + if (address == 0 && value & 1) { + value &= 6; // TODO: Timing + _GBPocketCamCapture(memory); + } + if (address < sizeof(memory->mbcState.pocketCam.registers)) { + memory->mbcState.pocketCam.registers[address] = value; + } + break; default: mLOG(GB_MBC, STUB, "Pocket Cam unknown address: %04X:%02X", address, value); break; @@ -765,11 +779,53 @@ void _GBPocketCam(struct GB* gb, uint16_t address, uint8_t value) { uint8_t _GBPocketCamRead(struct GBMemory* memory, uint16_t address) { if (memory->mbcState.pocketCam.registersActive) { + if ((address & 0x7F) == 0) { + return memory->mbcState.pocketCam.registers[0]; + } return 0; } return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)]; } +void _GBPocketCamCapture(struct GBMemory* memory) { + if (!memory->cam) { + return; + } + const uint32_t* image = NULL; + size_t stride; + memory->cam->requestImage(memory->cam, GBCAM_WIDTH, GBCAM_HEIGHT, &image, &stride); + if (!image) { + return; + } + memset(&memory->sram[0x100], 0, GBCAM_HEIGHT * GBCAM_WIDTH / 4); + struct GBPocketCamState* pocketCam = &memory->mbcState.pocketCam; + size_t x, y; + for (y = 0; y < GBCAM_HEIGHT; ++y) { + for (x = 0; x < GBCAM_WIDTH; ++x) { + uint32_t color = image[y * stride + x]; + uint32_t gray = ((color & 0xFF) + ((color >> 8) & 0xFF) + ((color >> 16) & 0xFF)); + uint16_t exposure = (pocketCam->registers[2] << 8) | (pocketCam->registers[3]); + gray = (gray + 1) * exposure / 0x300; + // TODO: Additional processing + int matrixEntry = 3 * ((x & 3) + 4 * (y & 3)); + if (gray < pocketCam->registers[matrixEntry + 6]) { + gray = 0x101; + } else if (gray < pocketCam->registers[matrixEntry + 7]) { + gray = 0x100; + } else if (gray < pocketCam->registers[matrixEntry + 8]) { + gray = 0x001; + } else { + gray = 0; + } + int coord = (((x >> 3) & 0xF) * 8 + (y & 0x7)) * 2 + (y & ~0x7) * 0x20; + uint16_t existing; + LOAD_16LE(existing, coord + 0x100, memory->sram); + existing |= gray << (7 - (x & 7)); + STORE_16LE(existing, coord + 0x100, memory->sram); + } + } +} + void _GBTAMA5(struct GB* gb, uint16_t address, uint8_t value) { struct GBMemory* memory = &gb->memory; struct GBTAMA5State* tama5 = &memory->mbcState.tama5; diff --git a/src/gb/memory.c b/src/gb/memory.c index 83556927c..0c3d7e57c 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -105,6 +105,7 @@ void GBMemoryInit(struct GB* gb) { gb->memory.rtc = NULL; gb->memory.rotation = NULL; gb->memory.rumble = NULL; + gb->memory.cam = NULL; GBIOInit(gb); } diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 86c375edb..d4eea69cf 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -47,8 +47,6 @@ CoreController::CoreController(mCore* core, QObject* parent) m_threadContext.startCallback = [](mCoreThread* context) { CoreController* controller = static_cast(context->userData); - context->core->setPeripheral(context->core, mPERIPH_ROTATION, controller->m_inputController->rotationSource()); - context->core->setPeripheral(context->core, mPERIPH_RUMBLE, controller->m_inputController->rumble()); switch (context->core->platform(context->core)) { #ifdef M_CORE_GBA @@ -285,6 +283,9 @@ void CoreController::setOverride(std::unique_ptr override) { void CoreController::setInputController(InputController* inputController) { m_inputController = inputController; + m_threadContext.core->setPeripheral(m_threadContext.core, mPERIPH_ROTATION, m_inputController->rotationSource()); + m_threadContext.core->setPeripheral(m_threadContext.core, mPERIPH_RUMBLE, m_inputController->rumble()); + m_threadContext.core->setPeripheral(m_threadContext.core, mPERIPH_IMAGE_SOURCE, m_inputController->imageSource()); } void CoreController::setLogger(LogController* logger) { diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 2da1d72bb..980051144 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -78,6 +78,27 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren }; setLuminanceLevel(0); #endif + + m_image.startRequestImage = [](mImageSource* context) { + InputControllerImage* image = static_cast(context); + image->image.load(":/res/no-cam.png"); + }; + m_image.stopRequestImage = nullptr; + m_image.requestImage = [](mImageSource* context, unsigned w, unsigned h, const uint32_t** buffer, size_t* stride) { + InputControllerImage* image = static_cast(context); + image->resizedImage = image->image.scaled(w, h, Qt::KeepAspectRatioByExpanding); + image->resizedImage = image->resizedImage.convertToFormat(QImage::Format_RGB32); + const uint32_t* bits = reinterpret_cast(image->resizedImage.constBits()); + QSize size = image->resizedImage.size(); + if (size.width() > w) { + bits += size.width() / 2; + } + if (size.height() > h) { + bits += (size.height() / 2) * size.width(); + } + *buffer = bits; + *stride = size.width(); + }; } InputController::~InputController() { diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index c97d11818..fbad1810e 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -9,6 +9,7 @@ #include "GamepadAxisEvent.h" #include "GamepadHatEvent.h" +#include #include #include #include @@ -82,6 +83,7 @@ public: mRumble* rumble(); mRotationSource* rotationSource(); + mImageSource* imageSource() { return &m_image; } GBALuminanceSource* luminance() { return &m_lux; } signals: @@ -115,6 +117,12 @@ private: uint8_t m_luxValue; int m_luxLevel; + struct InputControllerImage : mImageSource { + InputController* p; + QImage image; + QImage resizedImage; + } m_image; + mInputMap m_inputMap; ConfigController* m_config = nullptr; int m_playerId; diff --git a/src/platform/qt/resources.qrc b/src/platform/qt/resources.qrc index 1629b7eaf..7d61b6dd1 100644 --- a/src/platform/qt/resources.qrc +++ b/src/platform/qt/resources.qrc @@ -3,5 +3,6 @@ ../../../res/mgba-1024.png ../../../res/keymap.qpic ../../../res/patrons.txt + ../../../res/no-cam.png From a1acf8bcef00cbc2c3a8f7506d6e9db70a943c28 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Jul 2017 11:11:49 -0700 Subject: [PATCH 013/158] Qt: Load arbitrary images for GB Camera --- src/platform/qt/InputController.cpp | 13 ++++++++++--- src/platform/qt/InputController.h | 2 ++ src/platform/qt/Window.cpp | 12 ++++++++++++ src/platform/qt/Window.h | 2 ++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 980051144..7ffa47d1a 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -81,7 +81,9 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren m_image.startRequestImage = [](mImageSource* context) { InputControllerImage* image = static_cast(context); - image->image.load(":/res/no-cam.png"); + if (image->image.isNull()) { + image->image.load(":/res/no-cam.png"); + } }; m_image.stopRequestImage = nullptr; m_image.requestImage = [](mImageSource* context, unsigned w, unsigned h, const uint32_t** buffer, size_t* stride) { @@ -91,10 +93,10 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren const uint32_t* bits = reinterpret_cast(image->resizedImage.constBits()); QSize size = image->resizedImage.size(); if (size.width() > w) { - bits += size.width() / 2; + bits += (size.width() - w) / 2; } if (size.height() > h) { - bits += (size.height() / 2) * size.width(); + bits += ((size.height() - h) / 2) * size.width(); } *buffer = bits; *stride = size.width(); @@ -643,6 +645,11 @@ void InputController::releaseFocus(QWidget* focus) { } } +void InputController::loadCamImage(const QString& path) { + m_image.image.load(path); + m_image.resizedImage = QImage(); +} + void InputController::increaseLuminanceLevel() { setLuminanceLevel(m_luxLevel + 1); } diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index fbad1810e..b5efea9f5 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -81,6 +81,8 @@ public: void stealFocus(QWidget* focus); void releaseFocus(QWidget* focus); + void loadCamImage(const QString& path); + mRumble* rumble(); mRotationSource* rotationSource(); mImageSource* imageSource() { return &m_image; } diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index effa21623..a6a992f18 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -372,6 +372,13 @@ void Window::openView(QWidget* widget) { widget->show(); } +void Window::loadCamImage() { + QString filename = GBAApp::app()->getOpenFileName(this, tr("Select image"), tr("Image file (*.png *.gif *.jpg *.jpeg);;All files (*)")); + if (!filename.isEmpty()) { + m_inputController.loadCamImage(filename); + } +} + void Window::importSharkport() { QString filename = GBAApp::app()->getOpenFileName(this, tr("Select save"), tr("GameShark saves (*.sps *.xps)")); if (!filename.isEmpty()) { @@ -1064,6 +1071,11 @@ void Window::setupMenu(QMenuBar* menubar) { addControlledAction(quickSaveMenu, quickSave, QString("quickSave.%1").arg(i)); } + fileMenu->addSeparator(); + QAction* camImage = new QAction(tr("Load camera image..."), fileMenu); + connect(camImage, &QAction::triggered, this, &Window::loadCamImage); + addControlledAction(fileMenu, camImage, "loadCamImage"); + #ifdef M_CORE_GBA fileMenu->addSeparator(); QAction* importShark = new QAction(tr("Import GameShark Save"), fileMenu); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 0517d7080..4298296d1 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -76,6 +76,8 @@ public slots: void reloadConfig(); void saveConfig(); + void loadCamImage(); + void replaceROM(); void multiplayerChanged(); From cf15ea91d7743dac546f4bfed2f305c4fd5e6216 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Jul 2017 13:51:30 -0700 Subject: [PATCH 014/158] Qt: Preliminary QCamera support --- src/platform/qt/CMakeLists.txt | 2 ++ src/platform/qt/InputController.cpp | 34 +++++++++++++++++++++++- src/platform/qt/InputController.h | 24 +++++++++++++++-- src/platform/qt/VideoDumper.cpp | 41 +++++++++++++++++++++++++++++ src/platform/qt/VideoDumper.h | 27 +++++++++++++++++++ 5 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 src/platform/qt/VideoDumper.cpp create mode 100644 src/platform/qt/VideoDumper.h diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index dc1468c99..eb1ca8587 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -157,6 +157,8 @@ if(Qt5Multimedia_FOUND) list(APPEND AUDIO_SRC AudioProcessorQt.cpp AudioDevice.cpp) + list(APPEND SOURCE_FILES + VideoDumper.cpp) if (WIN32 AND QT_STATIC) list(APPEND QT_LIBRARIES qtaudio_windows strmiids winmm) endif() diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 7ffa47d1a..2ca1b65d6 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -13,6 +13,9 @@ #include #include #include +#ifdef BUILD_QT_MULTIMEDIA +#include +#endif #include #include @@ -53,6 +56,10 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren m_gamepadTimer.setInterval(50); m_gamepadTimer.start(); +#ifdef BUILD_QT_MULTIMEDIA + connect(&m_videoDumper, &VideoDumper::imageAvailable, this, &InputController::setCamImage); +#endif + mInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_X, GBA_KEY_A); mInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Z, GBA_KEY_B); mInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_A, GBA_KEY_L); @@ -79,13 +86,33 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren setLuminanceLevel(0); #endif + m_image.p = this; m_image.startRequestImage = [](mImageSource* context) { InputControllerImage* image = static_cast(context); if (image->image.isNull()) { image->image.load(":/res/no-cam.png"); } +#ifdef BUILD_QT_MULTIMEDIA + if (image->p->m_config->getQtOption("cameraDriver").toInt() == static_cast(CameraDriver::QT_MULTIMEDIA)) { + if (!image->p->m_camera) { + image->p->m_camera = new QCamera; + } + image->p->m_camera->setViewfinder(&image->p->m_videoDumper); + image->p->m_camera->start(); + } +#endif }; - m_image.stopRequestImage = nullptr; + + m_image.stopRequestImage = [](mImageSource* context) { + InputControllerImage* image = static_cast(context); +#ifdef BUILD_QT_MULTIMEDIA + if (image->p->m_camera) { + image->p->m_camera->stop(); + delete image->p->m_camera; + } +#endif + }; + m_image.requestImage = [](mImageSource* context, unsigned w, unsigned h, const uint32_t** buffer, size_t* stride) { InputControllerImage* image = static_cast(context); image->resizedImage = image->image.scaled(w, h, Qt::KeepAspectRatioByExpanding); @@ -650,6 +677,11 @@ void InputController::loadCamImage(const QString& path) { m_image.resizedImage = QImage(); } +void InputController::setCamImage(const QImage& image) { + m_image.image = image; + m_image.resizedImage = QImage(); +} + void InputController::increaseLuminanceLevel() { setLuminanceLevel(m_luxLevel + 1); } diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index b5efea9f5..0da15dcd0 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -22,9 +22,16 @@ #include "platform/sdl/sdl-events.h" #endif + +#ifdef BUILD_QT_MULTIMEDIA +#include "VideoDumper.h" +#endif + struct mRotationSource; struct mRumble; +class QCamera; + namespace QGBA { class ConfigController; @@ -33,6 +40,13 @@ class InputController : public QObject { Q_OBJECT public: + enum class CameraDriver : int { + NONE = 0, +#ifdef BUILD_QT_MULTIMEDIA + QT_MULTIMEDIA = 1, +#endif + }; + static const uint32_t KEYBOARD = 0x51545F4B; InputController(int playerId = 0, QWidget* topLevel = nullptr, QObject* parent = nullptr); @@ -81,8 +95,6 @@ public: void stealFocus(QWidget* focus); void releaseFocus(QWidget* focus); - void loadCamImage(const QString& path); - mRumble* rumble(); mRotationSource* rotationSource(); mImageSource* imageSource() { return &m_image; } @@ -106,6 +118,9 @@ public slots: void setLuminanceLevel(int level); void setLuminanceValue(uint8_t value); + void loadCamImage(const QString& path); + void setCamImage(const QImage& image); + private: void postPendingEvent(GBAKey); void clearPendingEvent(GBAKey); @@ -125,6 +140,11 @@ private: QImage resizedImage; } m_image; +#ifdef BUILD_QT_MULTIMEDIA + QCamera* m_camera = nullptr; + VideoDumper m_videoDumper; +#endif + mInputMap m_inputMap; ConfigController* m_config = nullptr; int m_playerId; diff --git a/src/platform/qt/VideoDumper.cpp b/src/platform/qt/VideoDumper.cpp new file mode 100644 index 000000000..a036c6a2f --- /dev/null +++ b/src/platform/qt/VideoDumper.cpp @@ -0,0 +1,41 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "VideoDumper.h" + +#include + +using namespace QGBA; + +VideoDumper::VideoDumper(QObject* parent) + : QAbstractVideoSurface(parent) +{ +} + +bool VideoDumper::present(const QVideoFrame& frame) { + QVideoFrame mappedFrame(frame); + if (!mappedFrame.map(QAbstractVideoBuffer::ReadOnly)) { + return false; + } + QImage::Format format = QVideoFrame::imageFormatFromPixelFormat(mappedFrame.pixelFormat()); + const uchar* bits = mappedFrame.bits(); + QImage image(bits, mappedFrame.width(), mappedFrame.height(), mappedFrame.bytesPerLine(), + format); + image = std::move(image.copy()); // Create a deep copy of the bits + emit imageAvailable(image); + mappedFrame.unmap(); + return true; +} + +QList VideoDumper::supportedPixelFormats(QAbstractVideoBuffer::HandleType) const { + QList list; + list.append(QVideoFrame::Format_ARGB32); + list.append(QVideoFrame::Format_ARGB32_Premultiplied); + list.append(QVideoFrame::Format_RGB32); + list.append(QVideoFrame::Format_RGB24); + list.append(QVideoFrame::Format_RGB565); + list.append(QVideoFrame::Format_RGB555); + return list; +} diff --git a/src/platform/qt/VideoDumper.h b/src/platform/qt/VideoDumper.h new file mode 100644 index 000000000..f2deb1044 --- /dev/null +++ b/src/platform/qt/VideoDumper.h @@ -0,0 +1,27 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef QGBA_VIDEO_DUMPER +#define QGBA_VIDEO_DUMPER +#include + +namespace QGBA { + +class VideoDumper : public QAbstractVideoSurface { +Q_OBJECT + +public: + VideoDumper(QObject* parent = nullptr); + + bool present(const QVideoFrame& frame) override; + QList supportedPixelFormats(QAbstractVideoBuffer::HandleType type = QAbstractVideoBuffer::NoHandle) const override; + +signals: + void imageAvailable(const QImage& image); +}; + +} + +#endif From ce9439031f0ad4a62e5fb098ee79ca70912b932e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Jul 2017 14:40:06 -0700 Subject: [PATCH 015/158] Qt: Improve QCamera support for 5.5+ --- include/mgba/core/interface.h | 4 +-- src/gb/mbc.c | 4 +-- src/platform/qt/InputController.cpp | 39 +++++++++++++++++++++++------ src/platform/qt/InputController.h | 1 + src/platform/qt/VideoDumper.cpp | 4 +-- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h index 44590e71d..2b2cab2bf 100644 --- a/include/mgba/core/interface.h +++ b/include/mgba/core/interface.h @@ -84,9 +84,9 @@ struct mRTCSource { }; struct mImageSource { - void (*startRequestImage)(struct mImageSource*); + void (*startRequestImage)(struct mImageSource*, unsigned w, unsigned h); void (*stopRequestImage)(struct mImageSource*); - void (*requestImage)(struct mImageSource*, unsigned w, unsigned h, const uint32_t** buffer, size_t* stride); + void (*requestImage)(struct mImageSource*, const uint32_t** buffer, size_t* stride); }; enum mRTCGenericType { diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 9055d34c6..366a25b26 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -244,7 +244,7 @@ void GBMBCInit(struct GB* gb) { gb->memory.mbcWrite = _GBPocketCam; gb->memory.mbcRead = _GBPocketCamRead; if (gb->memory.cam && gb->memory.cam->startRequestImage) { - gb->memory.cam->startRequestImage(gb->memory.cam); + gb->memory.cam->startRequestImage(gb->memory.cam, GBCAM_WIDTH, GBCAM_HEIGHT); } break; } @@ -793,7 +793,7 @@ void _GBPocketCamCapture(struct GBMemory* memory) { } const uint32_t* image = NULL; size_t stride; - memory->cam->requestImage(memory->cam, GBCAM_WIDTH, GBCAM_HEIGHT, &image, &stride); + memory->cam->requestImage(memory->cam, &image, &stride); if (!image) { return; } diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 2ca1b65d6..ed761e8f8 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -87,16 +87,42 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren #endif m_image.p = this; - m_image.startRequestImage = [](mImageSource* context) { + m_image.startRequestImage = [](mImageSource* context, unsigned w, unsigned h) { InputControllerImage* image = static_cast(context); + image->w = w; + image->h = h; if (image->image.isNull()) { image->image.load(":/res/no-cam.png"); } + image->resizedImage = image->image.scaled(w, h, Qt::KeepAspectRatioByExpanding); #ifdef BUILD_QT_MULTIMEDIA if (image->p->m_config->getQtOption("cameraDriver").toInt() == static_cast(CameraDriver::QT_MULTIMEDIA)) { if (!image->p->m_camera) { image->p->m_camera = new QCamera; } +#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) + QCameraViewfinderSettings settings; + QSize size(1920, 1080); + auto cameraRes = image->p->m_camera->supportedViewfinderResolutions(settings); + for (auto& cameraSize : cameraRes) { + if (cameraSize.width() < w || cameraSize.height() < h) { + continue; + } + if (cameraSize.width() <= size.width() && cameraSize.height() <= size.height()) { + size = cameraSize; + } + } + settings.setResolution(size); + auto cameraFormats = image->p->m_camera->supportedViewfinderPixelFormats(settings); + auto goodFormats = image->p->m_videoDumper.supportedPixelFormats(); + for (auto& format : goodFormats) { + if (cameraFormats.contains(format)) { + settings.setPixelFormat(format); + break; + } + } + image->p->m_camera->setViewfinderSettings(settings); +#endif image->p->m_camera->setViewfinder(&image->p->m_videoDumper); image->p->m_camera->start(); } @@ -113,17 +139,16 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren #endif }; - m_image.requestImage = [](mImageSource* context, unsigned w, unsigned h, const uint32_t** buffer, size_t* stride) { + m_image.requestImage = [](mImageSource* context, const uint32_t** buffer, size_t* stride) { InputControllerImage* image = static_cast(context); - image->resizedImage = image->image.scaled(w, h, Qt::KeepAspectRatioByExpanding); image->resizedImage = image->resizedImage.convertToFormat(QImage::Format_RGB32); const uint32_t* bits = reinterpret_cast(image->resizedImage.constBits()); QSize size = image->resizedImage.size(); - if (size.width() > w) { - bits += (size.width() - w) / 2; + if (size.width() > image->w) { + bits += (size.width() - image->w) / 2; } - if (size.height() > h) { - bits += ((size.height() - h) / 2) * size.width(); + if (size.height() > image->h) { + bits += ((size.height() - image->h) / 2) * size.width(); } *buffer = bits; *stride = size.width(); diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index 0da15dcd0..c90fd2645 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -138,6 +138,7 @@ private: InputController* p; QImage image; QImage resizedImage; + unsigned w, h; } m_image; #ifdef BUILD_QT_MULTIMEDIA diff --git a/src/platform/qt/VideoDumper.cpp b/src/platform/qt/VideoDumper.cpp index a036c6a2f..4c427d933 100644 --- a/src/platform/qt/VideoDumper.cpp +++ b/src/platform/qt/VideoDumper.cpp @@ -31,10 +31,10 @@ bool VideoDumper::present(const QVideoFrame& frame) { QList VideoDumper::supportedPixelFormats(QAbstractVideoBuffer::HandleType) const { QList list; - list.append(QVideoFrame::Format_ARGB32); - list.append(QVideoFrame::Format_ARGB32_Premultiplied); list.append(QVideoFrame::Format_RGB32); + list.append(QVideoFrame::Format_ARGB32); list.append(QVideoFrame::Format_RGB24); + list.append(QVideoFrame::Format_ARGB32_Premultiplied); list.append(QVideoFrame::Format_RGB565); list.append(QVideoFrame::Format_RGB555); return list; From 9b7521cceaa5130466a32eea6a70aa43352abaef Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Jul 2017 23:15:50 -0700 Subject: [PATCH 016/158] Qt: Fix QCamera threading woes --- src/platform/qt/CMakeLists.txt | 7 ++- src/platform/qt/InputController.cpp | 84 +++++++++++++++++------------ src/platform/qt/InputController.h | 8 ++- src/platform/qt/VideoDumper.cpp | 9 ++-- src/platform/qt/main.cpp | 1 + 5 files changed, 68 insertions(+), 41 deletions(-) diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index eb1ca8587..7bea1cb71 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -160,7 +160,8 @@ if(Qt5Multimedia_FOUND) list(APPEND SOURCE_FILES VideoDumper.cpp) if (WIN32 AND QT_STATIC) - list(APPEND QT_LIBRARIES qtaudio_windows strmiids winmm) + list(APPEND QT_LIBRARIES Qt5::QWindowsAudioPlugin Qt5::DSServicePlugin + strmiids winmm mfuuid mfplat mf ksguid dxva2 evr d3d9) endif() list(APPEND QT_LIBRARIES Qt5::Multimedia) list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA) @@ -283,10 +284,12 @@ if(APPLE) if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION) get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION) + get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION) set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app) target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}") set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns) set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns) + set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns) install(CODE " include(BundleUtilities) set(BU_CHMOD_BUNDLE_ITEMS ON) @@ -294,7 +297,7 @@ if(APPLE) fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\") " COMPONENT ${BINARY_NAME}-qt) else() - set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib) + set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib.dylib) if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool") set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}") endif() diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index ed761e8f8..8a86256ac 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -15,6 +15,7 @@ #include #ifdef BUILD_QT_MULTIMEDIA #include +#include #endif #include @@ -94,37 +95,9 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren if (image->image.isNull()) { image->image.load(":/res/no-cam.png"); } - image->resizedImage = image->image.scaled(w, h, Qt::KeepAspectRatioByExpanding); #ifdef BUILD_QT_MULTIMEDIA if (image->p->m_config->getQtOption("cameraDriver").toInt() == static_cast(CameraDriver::QT_MULTIMEDIA)) { - if (!image->p->m_camera) { - image->p->m_camera = new QCamera; - } -#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) - QCameraViewfinderSettings settings; - QSize size(1920, 1080); - auto cameraRes = image->p->m_camera->supportedViewfinderResolutions(settings); - for (auto& cameraSize : cameraRes) { - if (cameraSize.width() < w || cameraSize.height() < h) { - continue; - } - if (cameraSize.width() <= size.width() && cameraSize.height() <= size.height()) { - size = cameraSize; - } - } - settings.setResolution(size); - auto cameraFormats = image->p->m_camera->supportedViewfinderPixelFormats(settings); - auto goodFormats = image->p->m_videoDumper.supportedPixelFormats(); - for (auto& format : goodFormats) { - if (cameraFormats.contains(format)) { - settings.setPixelFormat(format); - break; - } - } - image->p->m_camera->setViewfinderSettings(settings); -#endif - image->p->m_camera->setViewfinder(&image->p->m_videoDumper); - image->p->m_camera->start(); + QMetaObject::invokeMethod(image->p, "setupCam"); } #endif }; @@ -132,15 +105,15 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren m_image.stopRequestImage = [](mImageSource* context) { InputControllerImage* image = static_cast(context); #ifdef BUILD_QT_MULTIMEDIA - if (image->p->m_camera) { - image->p->m_camera->stop(); - delete image->p->m_camera; - } + QMetaObject::invokeMethod(image->p, "teardownCam"); #endif }; m_image.requestImage = [](mImageSource* context, const uint32_t** buffer, size_t* stride) { InputControllerImage* image = static_cast(context); + if (image->resizedImage.isNull()) { + image->resizedImage = image->image.scaled(image->w, image->h, Qt::KeepAspectRatioByExpanding); + } image->resizedImage = image->resizedImage.convertToFormat(QImage::Format_RGB32); const uint32_t* bits = reinterpret_cast(image->resizedImage.constBits()); QSize size = image->resizedImage.size(); @@ -737,3 +710,48 @@ void InputController::setLuminanceValue(uint8_t value) { emit luminanceValueChanged(m_luxValue); } +void InputController::setupCam() { +#ifdef BUILD_QT_MULTIMEDIA + if (!m_camera) { + m_camera = std::make_unique(); + } + QVideoFrame::PixelFormat format(QVideoFrame::Format_RGB32); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) + m_camera->load(); + QCameraViewfinderSettings settings; + QSize size(1920, 1080); + auto cameraRes = m_camera->supportedViewfinderResolutions(settings); + for (auto& cameraSize : cameraRes) { + if (cameraSize.width() < m_image.w || cameraSize.height() < m_image.h) { + continue; + } + if (cameraSize.width() <= size.width() && cameraSize.height() <= size.height()) { + size = cameraSize; + } + } + settings.setResolution(size); + auto cameraFormats = m_camera->supportedViewfinderPixelFormats(settings); + auto goodFormats = m_videoDumper.supportedPixelFormats(); + for (auto& goodFormat : goodFormats) { + if (cameraFormats.contains(goodFormat)) { + settings.setPixelFormat(goodFormat); + format = goodFormat; + break; + } + } + m_camera->setViewfinderSettings(settings); +#endif + m_camera->setCaptureMode(QCamera::CaptureVideo); + m_camera->setViewfinder(&m_videoDumper); + m_camera->start(); +#endif +} + +void InputController::teardownCam() { +#ifdef BUILD_QT_MULTIMEDIA + if (m_camera) { + m_camera->stop(); + m_camera.reset(); + } +#endif +} diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index c90fd2645..3282c04cc 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -15,6 +15,8 @@ #include #include +#include + #include #include @@ -121,6 +123,10 @@ public slots: void loadCamImage(const QString& path); void setCamImage(const QImage& image); +private slots: + void setupCam(); + void teardownCam(); + private: void postPendingEvent(GBAKey); void clearPendingEvent(GBAKey); @@ -142,7 +148,7 @@ private: } m_image; #ifdef BUILD_QT_MULTIMEDIA - QCamera* m_camera = nullptr; + std::unique_ptr m_camera; VideoDumper m_videoDumper; #endif diff --git a/src/platform/qt/VideoDumper.cpp b/src/platform/qt/VideoDumper.cpp index 4c427d933..373678ac6 100644 --- a/src/platform/qt/VideoDumper.cpp +++ b/src/platform/qt/VideoDumper.cpp @@ -20,12 +20,11 @@ bool VideoDumper::present(const QVideoFrame& frame) { return false; } QImage::Format format = QVideoFrame::imageFormatFromPixelFormat(mappedFrame.pixelFormat()); - const uchar* bits = mappedFrame.bits(); - QImage image(bits, mappedFrame.width(), mappedFrame.height(), mappedFrame.bytesPerLine(), - format); - image = std::move(image.copy()); // Create a deep copy of the bits - emit imageAvailable(image); + uchar* bits = mappedFrame.bits(); + QImage image(bits, mappedFrame.width(), mappedFrame.height(), mappedFrame.bytesPerLine(), format); + image = image.copy(); // Create a deep copy of the bits mappedFrame.unmap(); + emit imageAvailable(image); return true; } diff --git a/src/platform/qt/main.cpp b/src/platform/qt/main.cpp index d42fa6281..10e5e5bbc 100644 --- a/src/platform/qt/main.cpp +++ b/src/platform/qt/main.cpp @@ -23,6 +23,7 @@ Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin); #ifdef BUILD_QT_MULTIMEDIA Q_IMPORT_PLUGIN(QWindowsAudioPlugin); +Q_IMPORT_PLUGIN(DSServicePlugin); #endif #endif #endif From c7e65ff621b4bebfc41fb91fd378e034564b0880 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 27 Jul 2017 00:06:54 -0700 Subject: [PATCH 017/158] Qt: More camera threading fixes --- src/platform/qt/InputController.cpp | 17 +++++++++++++---- src/platform/qt/InputController.h | 3 +++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 8a86256ac..5e014adaa 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -111,12 +111,17 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren m_image.requestImage = [](mImageSource* context, const uint32_t** buffer, size_t* stride) { InputControllerImage* image = static_cast(context); - if (image->resizedImage.isNull()) { - image->resizedImage = image->image.scaled(image->w, image->h, Qt::KeepAspectRatioByExpanding); + QSize size; + { + QMutexLocker locker(&image->mutex); + if (image->outOfDate) { + image->resizedImage = image->image.scaled(image->w, image->h, Qt::KeepAspectRatioByExpanding); + image->resizedImage = image->resizedImage.convertToFormat(QImage::Format_RGB32); + image->outOfDate = false; + } } - image->resizedImage = image->resizedImage.convertToFormat(QImage::Format_RGB32); + size = image->resizedImage.size(); const uint32_t* bits = reinterpret_cast(image->resizedImage.constBits()); - QSize size = image->resizedImage.size(); if (size.width() > image->w) { bits += (size.width() - image->w) / 2; } @@ -671,13 +676,17 @@ void InputController::releaseFocus(QWidget* focus) { } void InputController::loadCamImage(const QString& path) { + QMutexLocker locker(&m_image.mutex); m_image.image.load(path); m_image.resizedImage = QImage(); + m_image.outOfDate = true; } void InputController::setCamImage(const QImage& image) { + QMutexLocker locker(&m_image.mutex); m_image.image = image; m_image.resizedImage = QImage(); + m_image.outOfDate = true; } void InputController::increaseLuminanceLevel() { diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index 3282c04cc..50d670fc2 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -10,6 +10,7 @@ #include "GamepadHatEvent.h" #include +#include #include #include #include @@ -144,6 +145,8 @@ private: InputController* p; QImage image; QImage resizedImage; + bool outOfDate; + QMutex mutex; unsigned w, h; } m_image; From e0f04a0d5ae03dabe71787f9c2425d8a3e5373a6 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 27 Jul 2017 12:59:06 -0700 Subject: [PATCH 018/158] Core: Color formats --- include/mgba/core/interface.h | 27 +++++++++++++++-- src/gb/mbc.c | 47 ++++++++++++++++++++++++++--- src/platform/qt/InputController.cpp | 11 ++++--- 3 files changed, 73 insertions(+), 12 deletions(-) diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h index 2b2cab2bf..b3bbad782 100644 --- a/include/mgba/core/interface.h +++ b/include/mgba/core/interface.h @@ -37,6 +37,29 @@ typedef uint32_t color_t; struct blip_t; +enum mColorFormat { + mCOLOR_XBGR8 = 0x00001, + mCOLOR_XRGB8 = 0x00002, + mCOLOR_BGRX8 = 0x00004, + mCOLOR_RGBX8 = 0x00008, + mCOLOR_ABGR8 = 0x00010, + mCOLOR_ARGB8 = 0x00020, + mCOLOR_BGRA8 = 0x00040, + mCOLOR_RGBA8 = 0x00080, + mCOLOR_RGB5 = 0x00100, + mCOLOR_BGR5 = 0x00200, + mCOLOR_RGB565 = 0x00400, + mCOLOR_BGR565 = 0x00800, + mCOLOR_ARGB5 = 0x01000, + mCOLOR_ABGR5 = 0x02000, + mCOLOR_RGBA5 = 0x04000, + mCOLOR_BGRA5 = 0x08000, + mCOLOR_RGB8 = 0x10000, + mCOLOR_BGR8 = 0x20000, + + mCOLOR_ANY = -1 +}; + struct mCoreCallbacks { void* context; void (*videoFrameStarted)(void* context); @@ -84,9 +107,9 @@ struct mRTCSource { }; struct mImageSource { - void (*startRequestImage)(struct mImageSource*, unsigned w, unsigned h); + void (*startRequestImage)(struct mImageSource*, unsigned w, unsigned h, int colorFormats); void (*stopRequestImage)(struct mImageSource*); - void (*requestImage)(struct mImageSource*, const uint32_t** buffer, size_t* stride); + void (*requestImage)(struct mImageSource*, const void** buffer, size_t* stride, enum mColorFormat* colorFormat); }; enum mRTCGenericType { diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 366a25b26..341478764 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -244,7 +244,7 @@ void GBMBCInit(struct GB* gb) { gb->memory.mbcWrite = _GBPocketCam; gb->memory.mbcRead = _GBPocketCamRead; if (gb->memory.cam && gb->memory.cam->startRequestImage) { - gb->memory.cam->startRequestImage(gb->memory.cam, GBCAM_WIDTH, GBCAM_HEIGHT); + gb->memory.cam->startRequestImage(gb->memory.cam, GBCAM_WIDTH, GBCAM_HEIGHT, mCOLOR_ANY); } break; } @@ -791,9 +791,10 @@ void _GBPocketCamCapture(struct GBMemory* memory) { if (!memory->cam) { return; } - const uint32_t* image = NULL; + const void* image = NULL; size_t stride; - memory->cam->requestImage(memory->cam, &image, &stride); + enum mColorFormat format; + memory->cam->requestImage(memory->cam, &image, &stride, &format); if (!image) { return; } @@ -802,8 +803,44 @@ void _GBPocketCamCapture(struct GBMemory* memory) { size_t x, y; for (y = 0; y < GBCAM_HEIGHT; ++y) { for (x = 0; x < GBCAM_WIDTH; ++x) { - uint32_t color = image[y * stride + x]; - uint32_t gray = ((color & 0xFF) + ((color >> 8) & 0xFF) + ((color >> 16) & 0xFF)); + uint32_t gray; + uint32_t color; + switch (format) { + case mCOLOR_XBGR8: + case mCOLOR_XRGB8: + case mCOLOR_ARGB8: + case mCOLOR_ABGR8: + color = ((const uint32_t*) image)[y * stride + x]; + gray = (color & 0xFF) + ((color >> 8) & 0xFF) + ((color >> 16) & 0xFF); + break; + case mCOLOR_BGRX8: + case mCOLOR_RGBX8: + case mCOLOR_RGBA8: + case mCOLOR_BGRA8: + color = ((const uint32_t*) image)[y * stride + x]; + gray = ((color >> 8) & 0xFF) + ((color >> 16) & 0xFF) + ((color >> 24) & 0xFF); + break; + case mCOLOR_BGR5: + case mCOLOR_RGB5: + case mCOLOR_ARGB5: + case mCOLOR_ABGR5: + color = ((const uint16_t*) image)[y * stride + x]; + gray = ((color << 3) & 0xF8) + ((color >> 2) & 0xF8) + ((color >> 7) & 0xF8); + break; + case mCOLOR_BGR565: + case mCOLOR_RGB565: + color = ((const uint16_t*) image)[y * stride + x]; + gray = ((color << 3) & 0xF8) + ((color >> 3) & 0xFC) + ((color >> 8) & 0xF8); + break; + case mCOLOR_BGRA5: + case mCOLOR_RGBA5: + color = ((const uint16_t*) image)[y * stride + x]; + gray = ((color << 2) & 0xF8) + ((color >> 3) & 0xF8) + ((color >> 8) & 0xF8); + break; + default: + mLOG(GB_MBC, WARN, "Unsupported pixel format: %X", format); + return; + } uint16_t exposure = (pocketCam->registers[2] << 8) | (pocketCam->registers[3]); gray = (gray + 1) * exposure / 0x300; // TODO: Additional processing diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 5e014adaa..9dbbb3aff 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -88,7 +88,7 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren #endif m_image.p = this; - m_image.startRequestImage = [](mImageSource* context, unsigned w, unsigned h) { + m_image.startRequestImage = [](mImageSource* context, unsigned w, unsigned h, int) { InputControllerImage* image = static_cast(context); image->w = w; image->h = h; @@ -109,19 +109,19 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren #endif }; - m_image.requestImage = [](mImageSource* context, const uint32_t** buffer, size_t* stride) { + m_image.requestImage = [](mImageSource* context, const void** buffer, size_t* stride, mColorFormat* format) { InputControllerImage* image = static_cast(context); QSize size; { QMutexLocker locker(&image->mutex); if (image->outOfDate) { image->resizedImage = image->image.scaled(image->w, image->h, Qt::KeepAspectRatioByExpanding); - image->resizedImage = image->resizedImage.convertToFormat(QImage::Format_RGB32); + image->resizedImage = image->resizedImage.convertToFormat(QImage::Format_RGB16); image->outOfDate = false; } } size = image->resizedImage.size(); - const uint32_t* bits = reinterpret_cast(image->resizedImage.constBits()); + const uint16_t* bits = reinterpret_cast(image->resizedImage.constBits()); if (size.width() > image->w) { bits += (size.width() - image->w) / 2; } @@ -129,7 +129,8 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren bits += ((size.height() - image->h) / 2) * size.width(); } *buffer = bits; - *stride = size.width(); + *stride = image->resizedImage.bytesPerLine() / sizeof(*bits); + *format = mCOLOR_RGB565; }; } From 8a3d54c769b94e247998b8ac4d8e9243c9c43578 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 27 Jul 2017 13:39:59 -0700 Subject: [PATCH 019/158] GB Video: Fix 16-bit screenshots (fixes #826) --- CHANGES | 1 + src/gb/renderers/software.c | 27 --------------------------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/CHANGES b/CHANGES index ef13fdd4d..679f9edad 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,7 @@ Bugfixes: - GB MBC: Pocket Cam memory should be accessible without enabling - GB Memory: Initialize peripheral pointers - GB MBC: Fix SRAM sizes 4 and 5 + - GB Video: Fix 16-bit screenshots (fixes mgba.io/i/826) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 2d2dbe787..1a6688578 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -448,37 +448,10 @@ static void GBVideoSoftwareRendererDrawObj(struct GBVideoSoftwareRenderer* rende static void GBVideoSoftwareRendererGetPixels(struct GBVideoRenderer* renderer, size_t* stride, const void** pixels) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; - // TODO: Share with GBAVideoSoftwareRendererGetPixels -#ifdef COLOR_16_BIT - *stride = GB_VIDEO_HORIZONTAL_PIXELS; - if (!softwareRenderer->temporaryBuffer) { - softwareRenderer->temporaryBuffer = anonymousMemoryMap(GB_VIDEO_HORIZONTAL_PIXELS * GB_VIDEO_VERTICAL_PIXELS * 4); - } - *pixels = softwareRenderer->temporaryBuffer; - unsigned y, x; - for (y = 0; y < GB_VIDEO_VERTICAL_PIXELS; ++y) { - for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; ++x) { - color_t inColor = softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y + x]; - uint32_t outColor; -#ifdef COLOR_5_6_5 - outColor = (inColor & 0x1F) << 19; - outColor |= (inColor & 0x7C0) << 5; - outColor |= (inColor & 0xF800) >> 8; -#else - outColor = (inColor & 0x1F) << 3; - outColor |= (inColor & 0x3E0) << 6; - outColor |= (inColor & 0x7C00) << 9; -#endif - softwareRenderer->temporaryBuffer[GB_VIDEO_HORIZONTAL_PIXELS * y + x] = outColor; - } - } -#else *stride = softwareRenderer->outputBufferStride; *pixels = softwareRenderer->outputBuffer; -#endif } - static void GBVideoSoftwareRendererPutPixels(struct GBVideoRenderer* renderer, size_t stride, const void* pixels) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; // TODO: Share with GBAVideoSoftwareRendererGetPixels From 22400e336f2fb1b7aa994a8e0e666b8f78fc6fd3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 27 Jul 2017 15:11:37 -0700 Subject: [PATCH 020/158] 3DS: Support camera --- src/platform/3ds/main.c | 153 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 147 insertions(+), 6 deletions(-) diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index da0954a21..888825735 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -27,6 +27,9 @@ #include <3ds.h> #include <3ds/gpu/gx.h> +mLOG_DECLARE_CATEGORY(GUI_3DS); +mLOG_DEFINE_CATEGORY(GUI_3DS, "3DS", "gui.3ds"); + static enum ScreenMode { SM_PA_BOTTOM, SM_AF_BOTTOM, @@ -58,12 +61,21 @@ static enum DarkenMode { #define AUDIO_SAMPLE_BUFFER (AUDIO_SAMPLES * 16) #define DSP_BUFFERS 4 -static struct GBA3DSRotationSource { +static struct m3DSRotationSource { struct mRotationSource d; accelVector accel; angularRate gyro; } rotation; +static struct m3DSImageSource { + struct mImageSource d; + Handle handles[2]; + u32 bufferSize; + u32 transferSize; + void* buffer; + unsigned cam; +} camera; + static enum { NO_SOUND, DSP_SUPPORTED, @@ -128,6 +140,7 @@ static void _cleanup(void) { ndspExit(); } + camExit(); csndExit(); ptmuExit(); } @@ -234,6 +247,19 @@ static void _guiFinish(void) { ctrFlushBatch(); } +static void _resetCamera(struct m3DSImageSource* imageSource) { + if (!imageSource->cam) { + return; + } + CAMU_SetSize(imageSource->cam, SIZE_QCIF, CONTEXT_A); + CAMU_SetOutputFormat(imageSource->cam, OUTPUT_RGB_565, CONTEXT_A); + CAMU_SetFrameRate(imageSource->cam, FRAME_RATE_30); + + CAMU_SetNoiseFilter(imageSource->cam, true); + CAMU_SetAutoExposure(imageSource->cam, false); + CAMU_SetAutoWhiteBalance(imageSource->cam, false); +} + static void _setup(struct mGUIRunner* runner) { bool isNew3DS = false; APT_CheckNew3DS(&isNew3DS); @@ -243,6 +269,7 @@ static void _setup(struct mGUIRunner* runner) { } runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation.d); + runner->core->setPeripheral(runner->core, mPERIPH_IMAGE_SOURCE, &camera.d); if (hasSound != NO_SOUND) { runner->core->setAVStream(runner->core, &stream); } @@ -284,6 +311,7 @@ static void _setup(struct mGUIRunner* runner) { static void _gameLoaded(struct mGUIRunner* runner) { switch (runner->core->platform(runner->core)) { #ifdef M_CORE_GBA + // TODO: Move these to callbacks case PLATFORM_GBA: if (((struct GBA*) runner->core->board)->memory.hw.devices & HW_TILT) { HIDUSER_EnableAccelerometer(); @@ -334,6 +362,27 @@ static void _gameLoaded(struct mGUIRunner* runner) { if (mCoreConfigGetUIntValue(&runner->config, "darkenMode", &mode) && mode < DM_MAX) { darkenMode = mode; } + if (mCoreConfigGetUIntValue(&runner->config, "camera", &mode)) { + switch (mode) { + case 0: + default: + mode = SELECT_NONE; + break; + case 1: + mode = SELECT_IN1; + break; + case 2: + mode = SELECT_OUT1; + break; + } + if (mode != camera.cam) { + camera.cam = mode; + if (camera.buffer) { + _resetCamera(&camera); + CAMU_Activate(camera.cam); + } + } + } } static void _gameUnloaded(struct mGUIRunner* runner) { @@ -347,6 +396,7 @@ static void _gameUnloaded(struct mGUIRunner* runner) { switch (runner->core->platform(runner->core)) { #ifdef M_CORE_GBA + // TODO: Move these to callbacks case PLATFORM_GBA: if (((struct GBA*) runner->core->board)->memory.hw.devices & HW_TILT) { HIDUSER_DisableAccelerometer(); @@ -600,27 +650,97 @@ static enum GUICursorState _pollCursor(unsigned* x, unsigned* y) { } static void _sampleRotation(struct mRotationSource* source) { - struct GBA3DSRotationSource* rotation = (struct GBA3DSRotationSource*) source; + struct m3DSRotationSource* rotation = (struct m3DSRotationSource*) source; // Work around ctrulib getting the entries wrong rotation->accel = *(accelVector*) &hidSharedMem[0x48]; rotation->gyro = *(angularRate*) &hidSharedMem[0x5C]; } static int32_t _readTiltX(struct mRotationSource* source) { - struct GBA3DSRotationSource* rotation = (struct GBA3DSRotationSource*) source; + struct m3DSRotationSource* rotation = (struct m3DSRotationSource*) source; return rotation->accel.x << 18L; } static int32_t _readTiltY(struct mRotationSource* source) { - struct GBA3DSRotationSource* rotation = (struct GBA3DSRotationSource*) source; + struct m3DSRotationSource* rotation = (struct m3DSRotationSource*) source; return rotation->accel.y << 18L; } static int32_t _readGyroZ(struct mRotationSource* source) { - struct GBA3DSRotationSource* rotation = (struct GBA3DSRotationSource*) source; + struct m3DSRotationSource* rotation = (struct m3DSRotationSource*) source; return rotation->gyro.y << 18L; // Yes, y } +static void _startRequestImage(struct mImageSource* source, unsigned w, unsigned h, int colorFormats) { + UNUSED(colorFormats); + struct m3DSImageSource* imageSource = (struct m3DSImageSource*) source; + + _resetCamera(imageSource); + + CAMU_SetTrimming(PORT_CAM1, true); + CAMU_SetTrimmingParamsCenter(PORT_CAM1, w, h, 176, 144); + CAMU_GetBufferErrorInterruptEvent(&imageSource->handles[1], PORT_CAM1); + + if (imageSource->bufferSize != w * h * 2 && imageSource->buffer) { + free(imageSource->buffer); + imageSource->buffer = NULL; + } + imageSource->bufferSize = w * h * 2; + if (!imageSource->buffer) { + imageSource->buffer = malloc(imageSource->bufferSize); + } + CAMU_GetMaxBytes(&imageSource->transferSize, w, h); + CAMU_SetTransferBytes(PORT_CAM1, imageSource->transferSize, w, h); + CAMU_Activate(imageSource->cam); + CAMU_ClearBuffer(PORT_CAM1); + CAMU_StartCapture(PORT_CAM1); + CAMU_PlayShutterSound(SHUTTER_SOUND_TYPE_MOVIE); + + if (imageSource->cam) { + CAMU_SetReceiving(&imageSource->handles[0], imageSource->buffer, PORT_CAM1, imageSource->bufferSize, imageSource->transferSize); + } +} + +static void _stopRequestImage(struct mImageSource* source) { + struct m3DSImageSource* imageSource = (struct m3DSImageSource*) source; + + free(imageSource->buffer); + imageSource->buffer = NULL; + svcCloseHandle(imageSource->handles[0]); + svcCloseHandle(imageSource->handles[1]); + + CAMU_StopCapture(PORT_CAM1); + CAMU_Activate(SELECT_NONE); +} + + +static void _requestImage(struct mImageSource* source, const void** buffer, size_t* stride, enum mColorFormat* colorFormat) { + struct m3DSImageSource* imageSource = (struct m3DSImageSource*) source; + + if (!imageSource->cam) { + memset(imageSource->buffer, 0, imageSource->bufferSize); + *buffer = imageSource->buffer; + *stride = 128; + *colorFormat = mCOLOR_RGB565; + return; + } + + s32 i; + svcWaitSynchronizationN(&i, imageSource->handles, 2, false, U64_MAX); + + if (i == 0) { + *buffer = imageSource->buffer; + *stride = 128; + *colorFormat = mCOLOR_RGB565; + } else { + CAMU_ClearBuffer(PORT_CAM1); + CAMU_StartCapture(PORT_CAM1); + } + + svcCloseHandle(imageSource->handles[0]); + CAMU_SetReceiving(&imageSource->handles[0], imageSource->buffer, PORT_CAM1, imageSource->bufferSize, imageSource->transferSize); +} + static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* right) { UNUSED(stream); if (hasSound == CSND_SUPPORTED) { @@ -670,6 +790,13 @@ int main() { stream.postAudioFrame = 0; stream.postAudioBuffer = _postAudioBuffer; + camera.d.startRequestImage = _startRequestImage; + camera.d.stopRequestImage = _stopRequestImage; + camera.d.requestImage = _requestImage; + camera.buffer = NULL; + camera.bufferSize = 0; + camera.cam = SELECT_IN1; + if (!allocateRomBuffer()) { return 1; } @@ -677,6 +804,8 @@ int main() { aptHook(&cookie, _aptHook, 0); ptmuInit(); + camInit(); + hasSound = NO_SOUND; if (!ndspInit()) { hasSound = DSP_SUPPORTED; @@ -819,9 +948,21 @@ int main() { "Grayed", }, .nStates = 4 + }, + { + .title = "Camera", + .data = "camera", + .submenu = 0, + .state = 1, + .validStates = (const char*[]) { + "None", + "Inner", + "Outer", + }, + .nStates = 3 } }, - .nConfigExtra = 3, + .nConfigExtra = 4, .setup = _setup, .teardown = 0, .gameLoaded = _gameLoaded, From e9c393b8767aa0656359ffe5df43777d47ed31b2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 27 Jul 2017 17:35:18 -0700 Subject: [PATCH 021/158] PSP2: Support camera --- src/platform/psp2/CMakeLists.txt | 2 +- src/platform/psp2/main.c | 14 +++- src/platform/psp2/psp2-context.c | 109 +++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 2 deletions(-) diff --git a/src/platform/psp2/CMakeLists.txt b/src/platform/psp2/CMakeLists.txt index 8c127f735..eb8f31d75 100644 --- a/src/platform/psp2/CMakeLists.txt +++ b/src/platform/psp2/CMakeLists.txt @@ -13,7 +13,7 @@ source_group("PS Vita-specific code" FILES ${OS_SRC}) list(APPEND CORE_VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/sce-vfs.c) set(CORE_VFS_SRC ${CORE_VFS_SRC} PARENT_SCOPE) -set(OS_LIB -lvita2d -lSceAppMgr_stub -lSceCtrl_stub -lScePgf_stub -lSceGxm_stub -lSceDisplay_stub -lSceAudio_stub -lSceCommonDialog_stub -lSceMotion_stub -lScePhotoExport_stub -lScePower_stub -lSceSysmodule_stub -lSceTouch_stub -l${M_LIBRARY}) +set(OS_LIB -lvita2d -lSceAppMgr_stub -lSceCtrl_stub -lSceAudio_stub -lSceCamera_stub -lSceCommonDialog_stub -lSceDisplay_stub -lSceGxm_stub -lSceMotion_stub -lScePgf_stub -lScePhotoExport_stub -lScePower_stub -lSceSysmodule_stub -lSceTouch_stub -l${M_LIBRARY}) set(OBJCOPY_CMD ${OBJCOPY} -I binary -O elf32-littlearm -B arm) list(APPEND GUI_SRC ${CMAKE_CURRENT_SOURCE_DIR}/gui-font.c) diff --git a/src/platform/psp2/main.c b/src/platform/psp2/main.c index d41ae49c6..40068e700 100644 --- a/src/platform/psp2/main.c +++ b/src/platform/psp2/main.c @@ -105,6 +105,18 @@ int main() { "Fit Aspect Ratio", }, .nStates = 4 + }, + { + .title = "Camera", + .data = "camera", + .submenu = 0, + .state = 1, + .validStates = (const char*[]) { + "None", + "Front", + "Back", + }, + .nStates = 3 } }, .keySources = (struct GUIInputKeys[]) { @@ -133,7 +145,7 @@ int main() { }, { .id = 0 } }, - .nConfigExtra = 1, + .nConfigExtra = 2, .setup = mPSP2Setup, .teardown = mPSP2Teardown, .gameLoaded = mPSP2LoadROM, diff --git a/src/platform/psp2/psp2-context.c b/src/platform/psp2/psp2-context.c index b2bef2bae..278c7419d 100644 --- a/src/platform/psp2/psp2-context.c +++ b/src/platform/psp2/psp2-context.c @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,7 @@ #include #define RUMBLE_PWM 8 +#define CDRAM_ALIGN 0x40000 static enum ScreenMode { SM_BACKDROP, @@ -49,15 +51,26 @@ static void* outputBuffer; static vita2d_texture* tex; static vita2d_texture* screenshot; static Thread audioThread; + static struct mSceRotationSource { struct mRotationSource d; struct SceMotionSensorState state; } rotation; + static struct mSceRumble { struct mRumble d; struct CircleBuffer history; int current; } rumble; + +static struct mSceImageSource { + struct mImageSource d; + SceUID memblock; + void* buffer; + unsigned cam; + size_t bufferOffset; +} camera; + bool frameLimiter = true; extern const uint8_t _binary_backdrop_png_start[]; @@ -143,6 +156,79 @@ static void _setRumble(struct mRumble* source, int enable) { sceCtrlSetActuator(1, &state); } +static void _resetCamera(struct mSceImageSource* imageSource) { + if (!imageSource->cam) { + return; + } + + sceCameraOpen(imageSource->cam - 1, &(SceCameraInfo) { + .size = sizeof(SceCameraInfo), + .format = 5, // SCE_CAMERA_FORMAT_ABGR + .resolution = SCE_CAMERA_RESOLUTION_176_144, + .framerate = SCE_CAMERA_FRAMERATE_30_FPS, + .sizeIBase = 176 * 144 * 4, + .pitch = 0, + .pIBase = imageSource->buffer, + }); + sceCameraStart(imageSource->cam - 1); +} + +static void _startRequestImage(struct mImageSource* source, unsigned w, unsigned h, int colorFormats) { + UNUSED(colorFormats); + struct mSceImageSource* imageSource = (struct mSceImageSource*) source; + + if (!imageSource->buffer) { + imageSource->memblock = sceKernelAllocMemBlock("camera", SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, CDRAM_ALIGN, NULL); + sceKernelGetMemBlockBase(imageSource->memblock, &imageSource->buffer); + } + + if (!imageSource->cam) { + return; + } + + _resetCamera(imageSource); + imageSource->bufferOffset = (176 - w) / 2 + (144 - h) * 176 / 2; + + SceCameraRead read = { + sizeof(SceCameraRead), + 1 + }; + sceCameraRead(imageSource->cam - 1, &read); +} + +static void _stopRequestImage(struct mImageSource* source) { + struct mSceImageSource* imageSource = (struct mSceImageSource*) source; + if (imageSource->cam) { + sceCameraStop(imageSource->cam - 1); + sceCameraClose(imageSource->cam - 1); + } + sceKernelFreeMemBlock(imageSource->memblock); + imageSource->buffer = NULL; +} + + +static void _requestImage(struct mImageSource* source, const void** buffer, size_t* stride, enum mColorFormat* colorFormat) { + struct mSceImageSource* imageSource = (struct mSceImageSource*) source; + + if (!imageSource->cam) { + memset(imageSource->buffer, 0, 176 * 144 * 4); + *buffer = (uint32_t*) imageSource->buffer; + *stride = 176; + *colorFormat = mCOLOR_XBGR8; + return; + } + + *buffer = (uint32_t*) imageSource->buffer + imageSource->bufferOffset; + *stride = 176; + *colorFormat = mCOLOR_XBGR8; + + SceCameraRead read = { + sizeof(SceCameraRead), + 1 + }; + sceCameraRead(imageSource->cam - 1, &read); +} + uint16_t mPSP2PollInput(struct mGUIRunner* runner) { SceCtrlData pad; sceCtrlPeekBufferPositive(0, &pad, 1); @@ -210,6 +296,13 @@ void mPSP2Setup(struct mGUIRunner* runner) { CircleBufferInit(&rumble.history, RUMBLE_PWM); runner->core->setPeripheral(runner->core, mPERIPH_RUMBLE, &rumble.d); + camera.d.startRequestImage = _startRequestImage; + camera.d.stopRequestImage = _stopRequestImage; + camera.d.requestImage = _requestImage; + camera.buffer = NULL; + camera.cam = 1; + runner->core->setPeripheral(runner->core, mPERIPH_IMAGE_SOURCE, &camera.d); + frameLimiter = true; backdrop = vita2d_load_PNG_buffer(_binary_backdrop_png_start); @@ -217,6 +310,9 @@ void mPSP2Setup(struct mGUIRunner* runner) { if (mCoreConfigGetUIntValue(&runner->config, "screenMode", &mode) && mode < SM_MAX) { screenMode = mode; } + if (mCoreConfigGetUIntValue(&runner->config, "camera", &mode)) { + camera.cam = mode; + } } void mPSP2LoadROM(struct mGUIRunner* runner) { @@ -313,6 +409,19 @@ void mPSP2Unpaused(struct mGUIRunner* runner) { if (mCoreConfigGetUIntValue(&runner->config, "screenMode", &mode) && mode != screenMode) { screenMode = mode; } + + if (mCoreConfigGetUIntValue(&runner->config, "camera", &mode)) { + if (mode != camera.cam) { + if (camera.buffer) { + sceCameraStop(camera.cam - 1); + sceCameraClose(camera.cam - 1); + } + camera.cam = mode; + if (camera.buffer) { + _resetCamera(&camera); + } + } + } } void mPSP2Teardown(struct mGUIRunner* runner) { From 9dc8b9e854e52de22ee0db240e017f6bfd939f60 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 27 Jul 2017 22:55:15 -0700 Subject: [PATCH 022/158] Qt: Fix memory leak --- src/platform/qt/Window.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index a6a992f18..855782485 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -1722,11 +1722,8 @@ void Window::setController(CoreController* controller, const QString& fname) { connect(m_controller.get(), &CoreController::started, &m_inputController, &InputController::suspendScreensaver); connect(m_controller.get(), &CoreController::stopping, this, &Window::gameStopped); { - std::shared_ptr controller(m_controller); - connect(m_controller.get(), &CoreController::stopping, [this, controller]() { - if (m_controller == controller) { - m_controller.reset(); - } + connect(m_controller.get(), &CoreController::stopping, [this]() { + m_controller.reset(); }); } connect(m_controller.get(), &CoreController::stopping, &m_inputController, &InputController::resumeScreensaver); From 64eb253c50e23a9fd0f637ee401b939a2de21a78 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 13:44:47 -0700 Subject: [PATCH 023/158] Qt: Add camera driver option --- src/platform/qt/SettingsView.cpp | 31 ++++++ src/platform/qt/SettingsView.h | 1 + src/platform/qt/SettingsView.ui | 160 +++++++++++++++++++++++++++++++ src/platform/qt/Window.cpp | 1 + 4 files changed, 193 insertions(+) diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index 0a361f280..b13ebaf2a 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -130,15 +130,40 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC } #endif + // TODO: Move to reloadConfig() + QVariant cameraDriver = m_controller->getQtOption("cameraDriver"); + m_ui.cameraDriver->addItem(tr("None (Still Image)"), static_cast(InputController::CameraDriver::NONE)); + if (cameraDriver.isNull() || cameraDriver.toInt() == static_cast(InputController::CameraDriver::NONE)) { + m_ui.cameraDriver->setCurrentIndex(m_ui.cameraDriver->count() - 1); + } + +#ifdef BUILD_QT_MULTIMEDIA + m_ui.cameraDriver->addItem(tr("Qt Multimedia"), static_cast(InputController::CameraDriver::QT_MULTIMEDIA)); + if (!cameraDriver.isNull() && cameraDriver.toInt() == static_cast(InputController::CameraDriver::QT_MULTIMEDIA)) { + m_ui.cameraDriver->setCurrentIndex(m_ui.cameraDriver->count() - 1); + } +#endif + +#ifdef M_CORE_GBA connect(m_ui.gbaBiosBrowse, &QPushButton::clicked, [this]() { selectBios(m_ui.gbaBios); }); +#else + m_ui.gbaBiosBrowse->hide(); +#endif + +#ifdef M_CORE_GB connect(m_ui.gbBiosBrowse, &QPushButton::clicked, [this]() { selectBios(m_ui.gbBios); }); connect(m_ui.gbcBiosBrowse, &QPushButton::clicked, [this]() { selectBios(m_ui.gbcBios); }); +#else + m_ui.gbBiosBrowse->hide(); + m_ui.gbcBiosBrowse->hide(); + m_ui.gb->hide(); +#endif GBAKeyEditor* editor = new GBAKeyEditor(inputController, InputController::KEYBOARD, QString(), this); m_ui.stackedWidget->addWidget(editor); @@ -294,6 +319,12 @@ void SettingsView::updateConfig() { emit displayDriverChanged(); } + QVariant cameraDriver = m_ui.cameraDriver->itemData(m_ui.cameraDriver->currentIndex()); + if (cameraDriver != m_controller->getQtOption("cameraDriver")) { + m_controller->setQtOption("cameraDriver", cameraDriver); + emit cameraDriverChanged(); + } + QLocale language = m_ui.languages->itemData(m_ui.languages->currentIndex()).toLocale(); if (language != m_controller->getQtOption("language").toLocale() && !(language.bcp47Name() == QLocale::system().bcp47Name() && m_controller->getQtOption("language").isNull())) { m_controller->setQtOption("language", language.bcp47Name()); diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index 6815eb74d..cc628e10d 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -32,6 +32,7 @@ signals: void biosLoaded(int platform, const QString&); void audioDriverChanged(); void displayDriverChanged(); + void cameraDriverChanged(); void pathsChanged(); void languageChanged(); void libraryCleared(); diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index 2c98c5c03..e9a029f23 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -65,6 +65,11 @@ Paths + + + Game Boy + + @@ -1010,6 +1015,161 @@ + + + + + + false + + + Default model + + + + + + + false + + + + Autodetect + + + + + Game Boy (DMG) + + + + + Game Boy Color (CGB) + + + + + Game Boy Advance (AGB) + + + + + + + + false + + + Default colors + + + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + Qt::Horizontal + + + + + + + Camera driver + + + + + + + + 0 + 0 + + + + + + diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 855782485..7e1f68ee5 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -402,6 +402,7 @@ void Window::openSettingsWindow() { #endif connect(settingsWindow, &SettingsView::displayDriverChanged, this, &Window::reloadDisplayDriver); connect(settingsWindow, &SettingsView::audioDriverChanged, this, &Window::reloadAudioDriver); + connect(settingsWindow, &SettingsView::cameraDriverChanged, this, &Window::mustRestart); connect(settingsWindow, &SettingsView::languageChanged, this, &Window::mustRestart); connect(settingsWindow, &SettingsView::pathsChanged, this, &Window::reloadConfig); connect(settingsWindow, &SettingsView::libraryCleared, m_libraryView, &LibraryController::clear); From 0c0fab5402726e988a1335539008a03012dea844 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 14:29:56 -0700 Subject: [PATCH 024/158] GB Core: Fix palette loading when loading a foreign config --- CHANGES | 1 + src/gb/core.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 679f9edad..707aa9367 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,7 @@ Bugfixes: - GB Memory: Initialize peripheral pointers - GB MBC: Fix SRAM sizes 4 and 5 - GB Video: Fix 16-bit screenshots (fixes mgba.io/i/826) + - GB Core: Fix palette loading when loading a foreign config Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/core.c b/src/gb/core.c index db12ec457..2e50324df 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -167,17 +167,17 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf gb->video.frameskip = core->opts.frameskip; int color; - if (mCoreConfigGetIntValue(&core->config, "gb.pal[0]", &color)) { - GBVideoSetPalette(&gb->video, 0, color); + if (mCoreConfigGetIntValue(config, "gb.pal[0]", &color)) { + GBVideoSetPalette(&gb->video, 0, color); } - if (mCoreConfigGetIntValue(&core->config, "gb.pal[1]", &color)) { - GBVideoSetPalette(&gb->video, 1, color); + if (mCoreConfigGetIntValue(config, "gb.pal[1]", &color)) { + GBVideoSetPalette(&gb->video, 1, color); } - if (mCoreConfigGetIntValue(&core->config, "gb.pal[2]", &color)) { - GBVideoSetPalette(&gb->video, 2, color); + if (mCoreConfigGetIntValue(config, "gb.pal[2]", &color)) { + GBVideoSetPalette(&gb->video, 2, color); } - if (mCoreConfigGetIntValue(&core->config, "gb.pal[3]", &color)) { - GBVideoSetPalette(&gb->video, 3, color); + if (mCoreConfigGetIntValue(config, "gb.pal[3]", &color)) { + GBVideoSetPalette(&gb->video, 3, color); } mCoreConfigCopyValue(&core->config, config, "gb.bios"); From f15aacd0b6aaf33c17eae8e0ec0558bc124b3bc4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 14:32:17 -0700 Subject: [PATCH 025/158] Qt: Set default Game Boy colors --- CHANGES | 1 + src/platform/qt/CMakeLists.txt | 1 + src/platform/qt/ColorPicker.cpp | 56 +++++++++++++++++++++++++++++ src/platform/qt/ColorPicker.h | 37 +++++++++++++++++++ src/platform/qt/OverrideView.cpp | 61 ++++++-------------------------- src/platform/qt/OverrideView.h | 5 ++- src/platform/qt/SettingsView.cpp | 35 ++++++++++++++++++ src/platform/qt/SettingsView.h | 4 +++ src/platform/qt/SettingsView.ui | 3 -- 9 files changed, 146 insertions(+), 57 deletions(-) create mode 100644 src/platform/qt/ColorPicker.cpp create mode 100644 src/platform/qt/ColorPicker.h diff --git a/CHANGES b/CHANGES index 707aa9367..f5c40cbfc 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ Features: - ELF support - Game Boy Camera support + - Qt: Set default Game Boy colors Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 7bea1cb71..c34df5909 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -66,6 +66,7 @@ set(SOURCE_FILES CheatsModel.cpp CheatsView.cpp ConfigController.cpp + ColorPicker.cpp CoreManager.cpp CoreController.cpp Display.cpp diff --git a/src/platform/qt/ColorPicker.cpp b/src/platform/qt/ColorPicker.cpp new file mode 100644 index 000000000..7351286e4 --- /dev/null +++ b/src/platform/qt/ColorPicker.cpp @@ -0,0 +1,56 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "ColorPicker.h" + +#include +#include + +using namespace QGBA; + +ColorPicker::ColorPicker() { +} + +ColorPicker::ColorPicker(QWidget* parent, const QColor& defaultColor) + : m_parent(parent) +{ + QPalette palette = parent->palette(); + palette.setColor(parent->backgroundRole(), defaultColor); + parent->setPalette(palette); + parent->installEventFilter(this); +} + +ColorPicker& ColorPicker::operator=(const ColorPicker& other) { + if (m_parent) { + m_parent->removeEventFilter(this); + } + m_parent = other.m_parent; + m_parent->installEventFilter(this); + + return *this; +} + +bool ColorPicker::eventFilter(QObject* obj, QEvent* event) { + if (event->type() != QEvent::MouseButtonRelease) { + return false; + } + int colorId; + if (obj != m_parent) { + return false; + } + + QWidget* swatch = static_cast(obj); + + QColorDialog* colorPicker = new QColorDialog; + colorPicker->setAttribute(Qt::WA_DeleteOnClose); + colorPicker->open(); + connect(colorPicker, &QColorDialog::colorSelected, [this, swatch](const QColor& color) { + QPalette palette = swatch->palette(); + palette.setColor(swatch->backgroundRole(), color); + swatch->setPalette(palette); + emit colorChanged(color); + }); + return true; +} diff --git a/src/platform/qt/ColorPicker.h b/src/platform/qt/ColorPicker.h new file mode 100644 index 000000000..720e55922 --- /dev/null +++ b/src/platform/qt/ColorPicker.h @@ -0,0 +1,37 @@ +/* Copyright (c) 2013-2015 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef QGBA_COLOR_PICKER +#define QGBA_COLOR_PICKER + +#include + +class QColor; +class QWidget; + +namespace QGBA { + +class ColorPicker : public QObject { +Q_OBJECT + +public: + ColorPicker(); + ColorPicker(QWidget* parent, const QColor& defaultColor); + + ColorPicker& operator=(const ColorPicker&); + +signals: + void colorChanged(const QColor&); + +protected: + bool eventFilter(QObject* obj, QEvent* event) override; + +private: + QWidget* m_parent = nullptr; +}; + +} + +#endif diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index 640f5bcf4..a1fd24334 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "OverrideView.h" -#include #include #include "ConfigController.h" @@ -76,20 +75,16 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) connect(m_ui.gbModel, &QComboBox::currentTextChanged, this, &OverrideView::updateOverrides); connect(m_ui.mbc, &QComboBox::currentTextChanged, this, &OverrideView::updateOverrides); - QPalette palette = m_ui.color0->palette(); - palette.setColor(backgroundRole(), QColor(0xF8, 0xF8, 0xF8)); - m_ui.color0->setPalette(palette); - palette.setColor(backgroundRole(), QColor(0xA8, 0xA8, 0xA8)); - m_ui.color1->setPalette(palette); - palette.setColor(backgroundRole(), QColor(0x50, 0x50, 0x50)); - m_ui.color2->setPalette(palette); - palette.setColor(backgroundRole(), QColor(0x00, 0x00, 0x00)); - m_ui.color3->setPalette(palette); - - m_ui.color0->installEventFilter(this); - m_ui.color1->installEventFilter(this); - m_ui.color2->installEventFilter(this); - m_ui.color3->installEventFilter(this); + m_colorPickers[0] = ColorPicker(m_ui.color0, QColor(0xF8, 0xF8, 0xF8)); + m_colorPickers[1] = ColorPicker(m_ui.color1, QColor(0xA8, 0xA8, 0xA8)); + m_colorPickers[2] = ColorPicker(m_ui.color2, QColor(0x50, 0x50, 0x50)); + m_colorPickers[3] = ColorPicker(m_ui.color3, QColor(0x00, 0x00, 0x00)); + for (int colorId = 0; colorId < 4; ++colorId) { + connect(&m_colorPickers[colorId], &ColorPicker::colorChanged, this, [this, colorId](const QColor& color) { + m_gbColors[colorId] = color.rgb(); + updateOverrides(); + }); + } connect(m_ui.tabWidget, &QTabWidget::currentChanged, this, &OverrideView::updateOverrides); #ifndef M_CORE_GBA @@ -115,42 +110,6 @@ void OverrideView::setController(std::shared_ptr controller) { } } -bool OverrideView::eventFilter(QObject* obj, QEvent* event) { -#ifdef M_CORE_GB - if (event->type() != QEvent::MouseButtonRelease) { - return false; - } - int colorId; - if (obj == m_ui.color0) { - colorId = 0; - } else if (obj == m_ui.color1) { - colorId = 1; - } else if (obj == m_ui.color2) { - colorId = 2; - } else if (obj == m_ui.color3) { - colorId = 3; - } else { - return false; - } - - QWidget* swatch = static_cast(obj); - - QColorDialog* colorPicker = new QColorDialog; - colorPicker->setAttribute(Qt::WA_DeleteOnClose); - colorPicker->open(); - connect(colorPicker, &QColorDialog::colorSelected, [this, swatch, colorId](const QColor& color) { - QPalette palette = swatch->palette(); - palette.setColor(backgroundRole(), color); - swatch->setPalette(palette); - m_gbColors[colorId] = color.rgb(); - updateOverrides(); - }); - return true; -#else - return false; -#endif -} - void OverrideView::saveOverride() { if (!m_config || !m_controller) { return; diff --git a/src/platform/qt/OverrideView.h b/src/platform/qt/OverrideView.h index 2b971aaae..e9d6b80c3 100644 --- a/src/platform/qt/OverrideView.h +++ b/src/platform/qt/OverrideView.h @@ -14,6 +14,7 @@ #include #endif +#include "ColorPicker.h" #include "Override.h" #include "ui_OverrideView.h" @@ -42,9 +43,6 @@ private slots: void gameStarted(); void gameStopped(); -protected: - bool eventFilter(QObject* obj, QEvent* event) override; - private: Ui::OverrideView m_ui; @@ -54,6 +52,7 @@ private: #ifdef M_CORE_GB uint32_t m_gbColors[4]{}; + ColorPicker m_colorPickers[4]; static QList s_gbModelList; static QList s_mbcList; diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index b13ebaf2a..4dd9bc143 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -159,6 +159,34 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC connect(m_ui.gbcBiosBrowse, &QPushButton::clicked, [this]() { selectBios(m_ui.gbcBios); }); + + QList defaultColors; + defaultColors.append(QColor(0xF8, 0xF8, 0xF8)); + defaultColors.append(QColor(0xA8, 0xA8, 0xA8)); + defaultColors.append(QColor(0x50, 0x50, 0x50)); + defaultColors.append(QColor(0x00, 0x00, 0x00)); + bool ok; + if (m_controller->getOption("gb.pal[0]").toUInt(&ok) || ok) { + defaultColors[0] = QColor::fromRgb(m_controller->getOption("gb.pal[0]").toUInt()); + } + if (m_controller->getOption("gb.pal[1]").toUInt(&ok) || ok) { + defaultColors[1] = QColor::fromRgb(m_controller->getOption("gb.pal[1]").toUInt()); + } + if (m_controller->getOption("gb.pal[2]").toUInt(&ok) || ok) { + defaultColors[2] = QColor::fromRgb(m_controller->getOption("gb.pal[2]").toUInt()); + } + if (m_controller->getOption("gb.pal[3]").toUInt(&ok) || ok) { + defaultColors[3] = QColor::fromRgb(m_controller->getOption("gb.pal[3]").toUInt()); + } + m_colorPickers[0] = ColorPicker(m_ui.color0, defaultColors[0]); + m_colorPickers[1] = ColorPicker(m_ui.color1, defaultColors[1]); + m_colorPickers[2] = ColorPicker(m_ui.color2, defaultColors[2]); + m_colorPickers[3] = ColorPicker(m_ui.color3, defaultColors[3]); + for (int colorId = 0; colorId < 4; ++colorId) { + connect(&m_colorPickers[colorId], &ColorPicker::colorChanged, this, [this, colorId](const QColor& color) { + m_gbColors[colorId] = color.rgb(); + }); + } #else m_ui.gbBiosBrowse->hide(); m_ui.gbcBiosBrowse->hide(); @@ -331,6 +359,13 @@ void SettingsView::updateConfig() { emit languageChanged(); } + if (m_gbColors[0] | m_gbColors[1] | m_gbColors[2] | m_gbColors[3]) { + m_controller->setOption("gb.pal[0]", m_gbColors[0]); + m_controller->setOption("gb.pal[1]", m_gbColors[1]); + m_controller->setOption("gb.pal[2]", m_gbColors[2]); + m_controller->setOption("gb.pal[3]", m_gbColors[3]); + } + m_controller->write(); emit pathsChanged(); diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index cc628e10d..0713171f9 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -8,6 +8,8 @@ #include +#include "ColorPicker.h" + #include #include "ui_SettingsView.h" @@ -48,6 +50,8 @@ private: ConfigController* m_controller; InputController* m_input; ShaderSelector* m_shader = nullptr; + uint32_t m_gbColors[4]{}; + ColorPicker m_colorPickers[4]; void saveSetting(const char* key, const QAbstractButton*); void saveSetting(const char* key, const QComboBox*); diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index e9a029f23..6a2379302 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -1056,9 +1056,6 @@ - - false - Default colors From d1db97cf0c5a5861446aae0d88d934bcd4441b04 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 16:35:10 -0700 Subject: [PATCH 026/158] Qt: Fix LOG argument order --- CHANGES | 1 + src/platform/qt/LogController.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index f5c40cbfc..b8b54474f 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ Bugfixes: - GB MBC: Fix SRAM sizes 4 and 5 - GB Video: Fix 16-bit screenshots (fixes mgba.io/i/826) - GB Core: Fix palette loading when loading a foreign config + - Qt: Fix LOG argument order Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/platform/qt/LogController.h b/src/platform/qt/LogController.h index 88c24f1b1..db87c9f91 100644 --- a/src/platform/qt/LogController.h +++ b/src/platform/qt/LogController.h @@ -63,7 +63,7 @@ private: static LogController s_global; }; -#define LOG(C, L) (*LogController::global())(_mLOG_CAT_ ## C (), mLOG_ ## L) +#define LOG(C, L) (*LogController::global())(mLOG_ ## L, _mLOG_CAT_ ## C ()) } From 6ca3e9940dabc7e52697f177566f65626599396d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 17:45:18 -0700 Subject: [PATCH 027/158] Qt: Improve camera compatibility --- src/platform/qt/InputController.cpp | 6 ++++++ src/platform/qt/VideoDumper.cpp | 26 ++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 9dbbb3aff..36afa1841 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -9,6 +9,7 @@ #include "GamepadAxisEvent.h" #include "GamepadButtonEvent.h" #include "InputProfile.h" +#include "LogController.h" #include #include @@ -742,13 +743,18 @@ void InputController::setupCam() { settings.setResolution(size); auto cameraFormats = m_camera->supportedViewfinderPixelFormats(settings); auto goodFormats = m_videoDumper.supportedPixelFormats(); + bool goodFormatFound = false; for (auto& goodFormat : goodFormats) { if (cameraFormats.contains(goodFormat)) { settings.setPixelFormat(goodFormat); format = goodFormat; + goodFormatFound = true; break; } } + if (!goodFormatFound) { + LOG(QT, WARN) << "Could not find a valid camera format!"; + } m_camera->setViewfinderSettings(settings); #endif m_camera->setCaptureMode(QCamera::CaptureVideo); diff --git a/src/platform/qt/VideoDumper.cpp b/src/platform/qt/VideoDumper.cpp index 373678ac6..ae4695a5a 100644 --- a/src/platform/qt/VideoDumper.cpp +++ b/src/platform/qt/VideoDumper.cpp @@ -19,10 +19,26 @@ bool VideoDumper::present(const QVideoFrame& frame) { if (!mappedFrame.map(QAbstractVideoBuffer::ReadOnly)) { return false; } - QImage::Format format = QVideoFrame::imageFormatFromPixelFormat(mappedFrame.pixelFormat()); + QVideoFrame::PixelFormat vFormat = mappedFrame.pixelFormat(); + QImage::Format format = QVideoFrame::imageFormatFromPixelFormat(vFormat); + bool swap = false; + if (format == QImage::Format_Invalid) { + vFormat = static_cast(vFormat - QVideoFrame::Format_BGRA32 + QVideoFrame::Format_ARGB32); + format = QVideoFrame::imageFormatFromPixelFormat(vFormat); + if (format == QImage::Format_ARGB32) { + format = QImage::Format_RGBA8888; + } else if (format == QImage::Format_ARGB32_Premultiplied) { + format = QImage::Format_RGBA8888_Premultiplied; + } + swap = true; + } uchar* bits = mappedFrame.bits(); QImage image(bits, mappedFrame.width(), mappedFrame.height(), mappedFrame.bytesPerLine(), format); - image = image.copy(); // Create a deep copy of the bits + if (swap) { + image = image.rgbSwapped(); + } else { + image = image.copy(); // Create a deep copy of the bits + } mappedFrame.unmap(); emit imageAvailable(image); return true; @@ -36,5 +52,11 @@ QList VideoDumper::supportedPixelFormats(QAbstractVide list.append(QVideoFrame::Format_ARGB32_Premultiplied); list.append(QVideoFrame::Format_RGB565); list.append(QVideoFrame::Format_RGB555); + list.append(QVideoFrame::Format_BGR32); + list.append(QVideoFrame::Format_BGRA32); + list.append(QVideoFrame::Format_BGR24); + list.append(QVideoFrame::Format_BGRA32_Premultiplied); + list.append(QVideoFrame::Format_BGR565); + list.append(QVideoFrame::Format_BGR555); return list; } From 3927fcfbd3f6ad9177fe283c8efa3bac4b5a87f2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 17:50:32 -0700 Subject: [PATCH 028/158] Qt: Add TAMA5 and Pocket Cam to MBC overrides --- src/platform/qt/OverrideView.cpp | 2 ++ src/platform/qt/OverrideView.ui | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index a1fd24334..618041868 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -43,6 +43,8 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) s_mbcList.append(GB_MBC5); s_mbcList.append(GB_MBC5_RUMBLE); s_mbcList.append(GB_MBC7); + s_mbcList.append(GB_POCKETCAM); + s_mbcList.append(GB_TAMA5); s_mbcList.append(GB_HuC3); } if (s_gbModelList.isEmpty()) { diff --git a/src/platform/qt/OverrideView.ui b/src/platform/qt/OverrideView.ui index 3d8238cd8..6c9b4a772 100644 --- a/src/platform/qt/OverrideView.ui +++ b/src/platform/qt/OverrideView.ui @@ -319,6 +319,16 @@ MBC7 + + + Pocket Cam + + + + + TAMA5 + + HuC-3 From 4681a823b7f8e19febf230e3d5add00378cee9d5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 18:30:15 -0700 Subject: [PATCH 029/158] Qt: Work around Qt DirectShow bug (fixes #829) --- src/platform/qt/VideoDumper.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/platform/qt/VideoDumper.cpp b/src/platform/qt/VideoDumper.cpp index ae4695a5a..a92d34754 100644 --- a/src/platform/qt/VideoDumper.cpp +++ b/src/platform/qt/VideoDumper.cpp @@ -37,7 +37,12 @@ bool VideoDumper::present(const QVideoFrame& frame) { if (swap) { image = image.rgbSwapped(); } else { +#ifdef Q_OS_WIN + // Qt's DirectShow plug-in is pretty dang buggy + image = image.mirrored(true); +#else image = image.copy(); // Create a deep copy of the bits +#endif } mappedFrame.unmap(); emit imageAvailable(image); From dd5ca4031cabdd9f3824162528f03cfaa7af4f56 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 28 Jul 2017 18:58:35 -0700 Subject: [PATCH 030/158] Qt: Fix plugin name for macOS camera support --- src/platform/qt/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index c34df5909..6b84bc9ab 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -298,7 +298,7 @@ if(APPLE) fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\") " COMPONENT ${BINARY_NAME}-qt) else() - set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib.dylib) + set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib) if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool") set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}") endif() From f5887513fd9ef911ffc556e1bc1ec36ab1308ecf Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Fri, 28 Jul 2017 21:49:31 -0700 Subject: [PATCH 031/158] =?UTF-8?q?Fix=20CMakeFile.txt=20for=20SDL2=20supp?= =?UTF-8?q?lied=20SDL2-config.cmake,=20which=20is=20inclu=E2=80=A6=20(#830?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix CMakeFile.txt for SDL2 supplied SDL2-config.cmake, which is included with version 2.0.4 and newer. * Fall back to pkgconfig for ancient releases that are stuck on pre-2.0.4 SDL. --- src/platform/sdl/CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 8161362ad..0922dec62 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -1,8 +1,11 @@ set(SDL_VERSION "2" CACHE STRING "Version of SDL to use (1.2 or 2)") if (SDL_VERSION EQUAL "2") - include(FindPkgConfig) - pkg_search_module(SDL2 sdl2) + find_package(SDL2) + if (NOT SDL2_FOUND) + include(FindPkgConfig) + pkg_search_module(SDL2 sdl2) + endif() if (SDL2_FOUND) set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIRS}) set(SDL_LIBRARY ${SDL2_LIBRARIES}) From 1f2ff497e2b9096cf48ecfa1b589fd52c41a5460 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 14:43:55 -0700 Subject: [PATCH 032/158] =?UTF-8?q?Revert=20"Fix=20CMakeFile.txt=20for=20S?= =?UTF-8?q?DL2=20supplied=20SDL2-config.cmake,=20which=20is=20inclu?= =?UTF-8?q?=E2=80=A6=20(#830)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f5887513fd9ef911ffc556e1bc1ec36ab1308ecf. Broke too much stuff, didn't fix enough --- src/platform/sdl/CMakeLists.txt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 0922dec62..8161362ad 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -1,11 +1,8 @@ set(SDL_VERSION "2" CACHE STRING "Version of SDL to use (1.2 or 2)") if (SDL_VERSION EQUAL "2") - find_package(SDL2) - if (NOT SDL2_FOUND) - include(FindPkgConfig) - pkg_search_module(SDL2 sdl2) - endif() + include(FindPkgConfig) + pkg_search_module(SDL2 sdl2) if (SDL2_FOUND) set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIRS}) set(SDL_LIBRARY ${SDL2_LIBRARIES}) From cd7f7f72e1ddc092615b11b1cafe39e07403cc69 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 15:31:29 -0700 Subject: [PATCH 033/158] GB Memory: Prevent accessing empty SRAM (fixes #831) --- CHANGES | 1 + src/gb/memory.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index b8b54474f..2d3f11afc 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,7 @@ Bugfixes: - GB Video: Fix 16-bit screenshots (fixes mgba.io/i/826) - GB Core: Fix palette loading when loading a foreign config - Qt: Fix LOG argument order + - GB Memory: Prevent accessing empty SRAM (fixes mgba.io/i/831) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/memory.c b/src/gb/memory.c index 0c3d7e57c..68a8eabc2 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -221,7 +221,7 @@ uint8_t GBLoad8(struct LR35902Core* cpu, uint16_t address) { return memory->rtcRegs[memory->activeRtcReg]; } else if (memory->mbcRead) { return memory->mbcRead(memory, address); - } else if (memory->sramAccess) { + } else if (memory->sramAccess && memory->sram) { return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)]; } else if (memory->mbcType == GB_HuC3) { return 0x01; // TODO: Is this supposed to be the current SRAM bank? @@ -290,7 +290,7 @@ void GBStore8(struct LR35902Core* cpu, uint16_t address, int8_t value) { case GB_REGION_EXTERNAL_RAM + 1: if (memory->rtcAccess) { memory->rtcRegs[memory->activeRtcReg] = value; - } else if (memory->sramAccess) { + } else if (memory->sramAccess && memory->sram) { memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)] = value; } else { memory->mbcWrite(gb, address, value); @@ -388,7 +388,7 @@ uint8_t GBView8(struct LR35902Core* cpu, uint16_t address, int segment) { if (memory->rtcAccess) { return memory->rtcRegs[memory->activeRtcReg]; } else if (memory->sramAccess) { - if (segment < 0) { + if (segment < 0 && memory->sram) { return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)]; } else if ((size_t) segment * GB_SIZE_EXTERNAL_RAM < gb->sramSize) { return memory->sram[(address & (GB_SIZE_EXTERNAL_RAM - 1)) + segment *GB_SIZE_EXTERNAL_RAM]; From e1bc79b83796d67d7817fe0883e2b0182dcfb2bb Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 15:59:00 -0700 Subject: [PATCH 034/158] SDL: Fix 2.0.5 build on macOS under some circumstances --- CHANGES | 1 + src/platform/sdl/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 2d3f11afc..d0ae4f3d5 100644 --- a/CHANGES +++ b/CHANGES @@ -23,6 +23,7 @@ Misc: - All: Make FIXED_ROM_BUFFER an option instead of 3DS-only - Qt: Don't rebuild library view if style hasn't changed - Qt: Redo GameController into multiple classes + - SDL: Fix 2.0.5 build on macOS under some circumstances 0.6.0: (2017-07-16) Features: diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 8161362ad..f700062a5 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -34,7 +34,7 @@ endif() if(WIN32) list(APPEND SDL_LIBRARY imm32 version winmm) elseif(APPLE) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework AppKit -framework AudioUnit -framework Carbon -framework CoreAudio -framework ForceFeedback -framework IOKit") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework AppKit -framework AudioUnit -framework Carbon -framework CoreAudio -framework AudioToolbox -framework ForceFeedback -framework IOKit") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" PARENT_SCOPE) endif() From 5c90abd294cb969722808b9513e3a7ce58db1da7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 17:32:36 -0700 Subject: [PATCH 035/158] GB, GBA: Fix crashes when attempting to identify null VFiles --- CHANGES | 1 + src/gb/gb.c | 3 +++ src/gba/gba.c | 3 +++ 3 files changed, 7 insertions(+) diff --git a/CHANGES b/CHANGES index d0ae4f3d5..1a344d2cd 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,7 @@ Bugfixes: - GB Core: Fix palette loading when loading a foreign config - Qt: Fix LOG argument order - GB Memory: Prevent accessing empty SRAM (fixes mgba.io/i/831) + - GB, GBA: Fix crashes when attempting to identify null VFiles Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/gb.c b/src/gb/gb.c index 0ef8bb051..79d438df6 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -658,6 +658,9 @@ void GBIllegal(struct LR35902Core* cpu) { } bool GBIsROM(struct VFile* vf) { + if (!vf) { + return false; + } vf->seek(vf, 0x104, SEEK_SET); uint8_t header[4]; diff --git a/src/gba/gba.c b/src/gba/gba.c index 3baaea232..836e0dede 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -527,6 +527,9 @@ bool GBAIsROM(struct VFile* vf) { return isGBA; } #endif + if (!vf) { + return false; + } if (vf->seek(vf, GBA_ROM_MAGIC_OFFSET, SEEK_SET) < 0) { return false; } From 558a3ab0376faa422132980782dbc7be82c6daa3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 17:40:58 -0700 Subject: [PATCH 036/158] GB Test: Fix tests --- src/gb/test/rtc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gb/test/rtc.c b/src/gb/test/rtc.c index 5ad393a64..10261f848 100644 --- a/src/gb/test/rtc.c +++ b/src/gb/test/rtc.c @@ -14,7 +14,6 @@ struct GBRTCTest { struct mRTCSource d; struct mCore* core; - struct VFile* fakeROM; time_t nextTime; }; @@ -51,10 +50,10 @@ M_TEST_SUITE_SETUP(GBRTC) { struct VFile* vf = VFileMemChunk(NULL, 2048); GBSynthesizeROM(vf); test->core->loadROM(test->core, vf); - test->core->setRTC(test->core, &test->d); + mCoreSetRTC(test->core, &test->d); + struct GB* gb = test->core->board; - struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100]; - cart->type = 0x0F; + gb->memory.mbcType = GB_MBC3_RTC; *state = test; return 0; @@ -77,6 +76,7 @@ M_TEST_DEFINE(create) { uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 }; assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + assert_int_equal(gb->memory.mbcType, GB_MBC3_RTC); } M_TEST_DEFINE(tickSecond) { From a330df2f1fc617254e793702ebb5e3ed869af804 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 20:32:13 -0700 Subject: [PATCH 037/158] GB MBC: Fix RTC initialization (fixes #825) --- CHANGES | 1 + src/gb/mbc.c | 11 +- src/gb/test/rtc.c | 284 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 294 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 1a344d2cd..2ff7b4f57 100644 --- a/CHANGES +++ b/CHANGES @@ -18,6 +18,7 @@ Bugfixes: - Qt: Fix LOG argument order - GB Memory: Prevent accessing empty SRAM (fixes mgba.io/i/831) - GB, GBA: Fix crashes when attempting to identify null VFiles + - GB MBC: Fix RTC initialization (fixes mgba.io/i/825) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 341478764..bbabb9935 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -255,6 +255,15 @@ void GBMBCInit(struct GB* gb) { gb->memory.rtcAccess = false; gb->memory.activeRtcReg = 0; gb->memory.rtcLatched = false; + gb->memory.rtcLastLatch = 0; + if (gb->memory.rtc) { + if (gb->memory.rtc->sample) { + gb->memory.rtc->sample(gb->memory.rtc); + } + gb->memory.rtcLastLatch = gb->memory.rtc->unixTime(gb->memory.rtc); + } else { + gb->memory.rtcLastLatch = time(0); + } memset(&gb->memory.rtcRegs, 0, sizeof(gb->memory.rtcRegs)); GBResizeSram(gb, gb->sramSize); @@ -993,7 +1002,7 @@ void GBMBCRTCWrite(struct GB* gb) { STORE_32LE(gb->memory.rtcRegs[2], 0, &rtcBuffer.latchedHour); STORE_32LE(gb->memory.rtcRegs[3], 0, &rtcBuffer.latchedDays); STORE_32LE(gb->memory.rtcRegs[4], 0, &rtcBuffer.latchedDaysHi); - STORE_64LE(rtcLastLatch, 0, &rtcBuffer.unixTime); + STORE_64LE(gb->memory.rtcLastLatch, 0, &rtcBuffer.unixTime); if (vf->size(vf) == gb->sramSize) { // Writing past the end of the file can invalidate the file mapping diff --git a/src/gb/test/rtc.c b/src/gb/test/rtc.c index 10261f848..d26cb696e 100644 --- a/src/gb/test/rtc.c +++ b/src/gb/test/rtc.c @@ -14,6 +14,7 @@ struct GBRTCTest { struct mRTCSource d; struct mCore* core; + struct VFile* fakeSave; time_t nextTime; }; @@ -52,6 +53,9 @@ M_TEST_SUITE_SETUP(GBRTC) { test->core->loadROM(test->core, vf); mCoreSetRTC(test->core, &test->d); + test->fakeSave = VFileMemChunk(NULL, 0); + test->core->loadSave(test->core, test->fakeSave); + struct GB* gb = test->core->board; gb->memory.mbcType = GB_MBC3_RTC; @@ -81,6 +85,7 @@ M_TEST_DEFINE(create) { M_TEST_DEFINE(tickSecond) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 1; @@ -108,6 +113,7 @@ M_TEST_DEFINE(tickSecond) { M_TEST_DEFINE(tick30Seconds) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 30; @@ -142,6 +148,7 @@ M_TEST_DEFINE(tick30Seconds) { M_TEST_DEFINE(tickMinute) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 60; @@ -184,6 +191,7 @@ M_TEST_DEFINE(tickMinute) { M_TEST_DEFINE(tick90Seconds) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 90; @@ -240,6 +248,7 @@ M_TEST_DEFINE(tick90Seconds) { M_TEST_DEFINE(tick30Minutes) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 1800; @@ -282,6 +291,7 @@ M_TEST_DEFINE(tick30Minutes) { M_TEST_DEFINE(tickHour) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 3600; @@ -339,6 +349,7 @@ M_TEST_DEFINE(tickHour) { M_TEST_DEFINE(tick12Hours) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 3600 * 12; @@ -407,6 +418,7 @@ M_TEST_DEFINE(tick12Hours) { M_TEST_DEFINE(tickDay) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 3600 * 24; @@ -505,6 +517,7 @@ M_TEST_DEFINE(tickDay) { M_TEST_DEFINE(wideTickDay) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 3600 * 24 * 2001; @@ -611,6 +624,7 @@ M_TEST_DEFINE(wideTickDay) { M_TEST_DEFINE(rolloverSecond) { struct GBRTCTest* test = *state; + test->nextTime = 0; test->core->reset(test->core); struct GB* gb = test->core->board; test->nextTime = 1; @@ -672,6 +686,270 @@ M_TEST_DEFINE(rolloverSecond) { assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); } +M_TEST_DEFINE(roundtrip0) { + struct GBRTCTest* test = *state; + test->nextTime = 0; + test->fakeSave->truncate(test->fakeSave, 0); + test->core->reset(test->core); + struct GB* gb = test->core->board; + + uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 }; + memset(gb->memory.rtcRegs, 0, sizeof(expected)); + GBMBCRTCWrite(gb); + + GBMBCRTCRead(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + GBMBCRTCWrite(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + GBMBCRTCRead(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3600; + expected[2] = 1; + GBMBCRTCWrite(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + GBMBCRTCWrite(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3600 * 2; + expected[2] = 2; + GBMBCRTCWrite(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); +} + +M_TEST_DEFINE(roundtripSecond) { + struct GBRTCTest* test = *state; + test->nextTime = 0; + test->fakeSave->truncate(test->fakeSave, 0); + test->core->reset(test->core); + struct GB* gb = test->core->board; + + uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 }; + memset(gb->memory.rtcRegs, 0, sizeof(expected)); + GBMBCRTCWrite(gb); + + test->nextTime = 1; + GBMBCRTCRead(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + expected[0] = 1; + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + GBMBCRTCWrite(gb); + + test->nextTime = 2; + GBMBCRTCRead(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + _sampleRtcKeepLatch(gb); + expected[0] = 2; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->core->reset(test->core); + expected[0] = 1; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + _sampleRtcKeepLatch(gb); + expected[0] = 2; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->core->reset(test->core); + expected[0] = 1; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + expected[0] = 2; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3; + test->core->reset(test->core); + expected[0] = 1; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + _sampleRtcKeepLatch(gb); + expected[0] = 3; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 1; + test->core->reset(test->core); + expected[0] = 1; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + test->nextTime = 4; + _sampleRtcKeepLatch(gb); + expected[0] = 4; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); +} + +M_TEST_DEFINE(roundtripDay) { + struct GBRTCTest* test = *state; + test->nextTime = 0; + test->fakeSave->truncate(test->fakeSave, 0); + test->core->reset(test->core); + struct GB* gb = test->core->board; + + uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 }; + memset(gb->memory.rtcRegs, 0, sizeof(expected)); + GBMBCRTCWrite(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3600 * 24; + GBMBCRTCRead(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 1; + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3600 * 24 * 2; + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + GBMBCRTCWrite(gb); + + test->nextTime = 3600 * 24 * 2; + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3600 * 24 * 3; + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 3; + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3600 * 24 * 2; + test->core->reset(test->core); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 3600 * 24 * 3; + test->core->reset(test->core); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 3; + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); +} + +M_TEST_DEFINE(roundtripHuge) { + struct GBRTCTest* test = *state; + test->nextTime = 1500000000; + test->fakeSave->truncate(test->fakeSave, 0); + test->core->reset(test->core); + struct GB* gb = test->core->board; + + uint8_t expected[sizeof(gb->memory.rtcRegs)] = { 0, 0, 0, 0, 0 }; + memset(gb->memory.rtcRegs, 0, sizeof(expected)); + GBMBCRTCWrite(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 1500000000 + 3600 * 24; + GBMBCRTCRead(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 1; + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 1500000000 + 3600 * 24 * 2; + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + GBMBCRTCWrite(gb); + + test->nextTime = 1500000000 + 3600 * 24 * 2; + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 1500000000 + 3600 * 24 * 3; + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 3; + GBMBCRTCRead(gb); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 1500000000 + 3600 * 24 * 2; + test->core->reset(test->core); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + + test->nextTime = 1500000000 + 3600 * 24 * 3; + test->core->reset(test->core); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 2; + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); + expected[0] = 0; + expected[1] = 0; + expected[2] = 0; + expected[3] = 3; + _sampleRtcKeepLatch(gb); + assert_memory_equal(gb->memory.rtcRegs, expected, sizeof(expected)); +} + M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(GBRTC, cmocka_unit_test(create), cmocka_unit_test(tickSecond), @@ -683,4 +961,8 @@ M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(GBRTC, cmocka_unit_test(tick12Hours), cmocka_unit_test(tickDay), cmocka_unit_test(wideTickDay), - cmocka_unit_test(rolloverSecond)) + cmocka_unit_test(rolloverSecond), + cmocka_unit_test(roundtrip0), + cmocka_unit_test(roundtripSecond), + cmocka_unit_test(roundtripDay), + cmocka_unit_test(roundtripHuge)) From 1dc4790e20cbc949764503c79f7619f573c91fdf Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 21:59:30 -0700 Subject: [PATCH 038/158] Qt: Fix regression with sensor view not getting attached --- src/platform/qt/SensorView.cpp | 1 + src/platform/qt/Window.cpp | 20 ++++++++++++++++---- src/platform/qt/Window.h | 4 +++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/platform/qt/SensorView.cpp b/src/platform/qt/SensorView.cpp index 75cc5c3ae..bbcf0dd6a 100644 --- a/src/platform/qt/SensorView.cpp +++ b/src/platform/qt/SensorView.cpp @@ -68,6 +68,7 @@ void SensorView::setController(std::shared_ptr controller) { connect(m_ui.timeFakeEpoch, &QRadioButton::clicked, [controller, this] () { controller->setFakeEpoch(m_ui.time->dateTime()); }); + m_ui.timeButtons->checkedButton()->clicked(); connect(controller.get(), &CoreController::stopping, [this]() { m_controller.reset(); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 7e1f68ee5..243097055 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -147,7 +147,6 @@ Window::Window(CoreManager* manager, ConfigController* config, int playerId, QWi Window::~Window() { delete m_logView; - delete m_overrideView; #ifdef USE_FFMPEG delete m_videoView; @@ -1414,18 +1413,27 @@ void Window::setupMenu(QMenuBar* menubar) { QAction* overrides = new QAction(tr("Game &overrides..."), toolsMenu); connect(overrides, &QAction::triggered, [this]() { if (!m_overrideView) { - m_overrideView = new OverrideView(m_config); + m_overrideView = std::move(std::make_unique(m_config)); if (m_controller) { m_overrideView->setController(m_controller); } - connect(this, &Window::shutdown, m_overrideView, &QWidget::close); + connect(this, &Window::shutdown, m_overrideView.get(), &QWidget::close); } m_overrideView->show(); }); addControlledAction(toolsMenu, overrides, "overrideWindow"); QAction* sensors = new QAction(tr("Game &Pak sensors..."), toolsMenu); - connect(sensors, &QAction::triggered, openTView(&m_inputController)); + connect(sensors, &QAction::triggered, [this]() { + if (!m_sensorView) { + m_sensorView = std::move(std::make_unique(&m_inputController)); + if (m_controller) { + m_sensorView->setController(m_controller); + } + connect(this, &Window::shutdown, m_sensorView.get(), &QWidget::close); + } + m_sensorView->show(); + }); addControlledAction(toolsMenu, sensors, "sensorWindow"); QAction* cheats = new QAction(tr("&Cheats..."), toolsMenu); @@ -1785,6 +1793,10 @@ void Window::setController(CoreController* controller, const QString& fname) { } #endif + if (m_sensorView) { + m_sensorView->setController(m_controller); + } + if (m_overrideView) { m_overrideView->setController(m_controller); } diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 4298296d1..9c9384d8b 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -34,6 +34,7 @@ class GIFView; class LibraryController; class LogView; class OverrideView; +class SensorView; class ShaderSelector; class ShortcutController; class VideoView; @@ -200,7 +201,8 @@ private: bool m_hitUnimplementedBiosCall; - OverrideView* m_overrideView = nullptr; + std::unique_ptr m_overrideView; + std::unique_ptr m_sensorView; #ifdef USE_FFMPEG VideoView* m_videoView = nullptr; From 676d428f91c57f693c9384ebf6bfa5586293de53 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 22:07:24 -0700 Subject: [PATCH 039/158] Python: Set appropriate debugger context --- src/platform/python/engine.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/python/engine.c b/src/platform/python/engine.c index 19fe76c0c..6222039a0 100644 --- a/src/platform/python/engine.c +++ b/src/platform/python/engine.c @@ -105,6 +105,7 @@ void mPythonScriptDebuggerEntered(struct mScriptEngine* se, enum mDebuggerEntryR return; } + mPythonSetDebugger(debugger); mPythonDebuggerEntered(reason, info); } #endif From 86901d93b666766ae35b1287c744e5e2c25158ab Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 29 Jul 2017 22:48:37 -0700 Subject: [PATCH 040/158] GB MBC: Fix RTC loading when file size is off --- CHANGES | 1 + src/gb/mbc.c | 13 +++---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 2ff7b4f57..a4dadb2fc 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,7 @@ Bugfixes: - GB Memory: Prevent accessing empty SRAM (fixes mgba.io/i/831) - GB, GBA: Fix crashes when attempting to identify null VFiles - GB MBC: Fix RTC initialization (fixes mgba.io/i/825) + - GB MBC: Fix RTC loading when file size is off Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/mbc.c b/src/gb/mbc.c index bbabb9935..0e560e0e8 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -960,17 +960,10 @@ void GBMBCRTCRead(struct GB* gb) { if (!vf) { return; } - ssize_t end = vf->seek(vf, -sizeof(rtcBuffer), SEEK_END); - switch (end & 0x1FFF) { - case 0: - break; - case 0x1FFC: - vf->seek(vf, -sizeof(rtcBuffer) - 4, SEEK_END); - break; - default: + vf->seek(vf, gb->sramSize, SEEK_SET); + if (vf->read(vf, &rtcBuffer, sizeof(rtcBuffer)) < (ssize_t) sizeof(rtcBuffer) - 4) { return; } - vf->read(vf, &rtcBuffer, sizeof(rtcBuffer)); LOAD_32LE(gb->memory.rtcRegs[0], 0, &rtcBuffer.latchedSec); LOAD_32LE(gb->memory.rtcRegs[1], 0, &rtcBuffer.latchedMin); @@ -1004,7 +997,7 @@ void GBMBCRTCWrite(struct GB* gb) { STORE_32LE(gb->memory.rtcRegs[4], 0, &rtcBuffer.latchedDaysHi); STORE_64LE(gb->memory.rtcLastLatch, 0, &rtcBuffer.unixTime); - if (vf->size(vf) == gb->sramSize) { + if ((size_t) vf->size(vf) < gb->sramSize + sizeof(rtcBuffer)) { // Writing past the end of the file can invalidate the file mapping vf->unmap(vf, gb->memory.sram, gb->sramSize); gb->memory.sram = NULL; From dc976eaf51a9bea691736a03f1113e34ad819462 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 30 Jul 2017 17:17:58 -0700 Subject: [PATCH 041/158] GB SIO: Game Boy Printer --- CHANGES | 1 + CMakeLists.txt | 2 +- include/mgba/internal/gb/sio/printer.h | 74 +++++++ src/gb/sio/printer.c | 233 ++++++++++++++++++++++ src/platform/qt/CMakeLists.txt | 2 + src/platform/qt/CoreController.cpp | 53 +++++ src/platform/qt/CoreController.h | 17 ++ src/platform/qt/MultiplayerController.cpp | 3 + src/platform/qt/PrinterView.cpp | 73 +++++++ src/platform/qt/PrinterView.h | 50 +++++ src/platform/qt/PrinterView.ui | 137 +++++++++++++ src/platform/qt/Window.cpp | 16 +- 12 files changed, 658 insertions(+), 3 deletions(-) create mode 100644 include/mgba/internal/gb/sio/printer.h create mode 100644 src/gb/sio/printer.c create mode 100644 src/platform/qt/PrinterView.cpp create mode 100644 src/platform/qt/PrinterView.h create mode 100644 src/platform/qt/PrinterView.ui diff --git a/CHANGES b/CHANGES index a4dadb2fc..1d980f26a 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ Features: - ELF support - Game Boy Camera support - Qt: Set default Game Boy colors + - Game Boy Printer support Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ba280ecd..229d7e5a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ file(GLOB GUI_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/gui/*.c ${CMAKE_CURRENT_S file(GLOB GBA_RENDERER_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gba/renderers/*.c) file(GLOB GBA_SIO_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gba/sio/lockstep.c) file(GLOB GBA_EXTRA_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gba/extra/*.c) -file(GLOB GB_SIO_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gb/sio/lockstep.c) +file(GLOB GB_SIO_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gb/sio/*.c) file(GLOB GB_RENDERER_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gb/renderers/*.c) file(GLOB GB_EXTRA_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gb/extra/*.c) file(GLOB THIRD_PARTY_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/inih/*.c) diff --git a/include/mgba/internal/gb/sio/printer.h b/include/mgba/internal/gb/sio/printer.h new file mode 100644 index 000000000..a5b42a83d --- /dev/null +++ b/include/mgba/internal/gb/sio/printer.h @@ -0,0 +1,74 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef GB_PRINTER_H +#define GB_PRINTER_H + +#include + +CXX_GUARD_START + +#include + +enum GBPrinterPacketByte { + GB_PRINTER_BYTE_MAGIC_0, + GB_PRINTER_BYTE_MAGIC_1, + GB_PRINTER_BYTE_COMMAND, + GB_PRINTER_BYTE_COMPRESSION, + GB_PRINTER_BYTE_LENGTH_0, + GB_PRINTER_BYTE_LENGTH_1, + GB_PRINTER_BYTE_DATA, + GB_PRINTER_BYTE_CHECKSUM_0, + GB_PRINTER_BYTE_CHECKSUM_1, + GB_PRINTER_BYTE_KEEPALIVE, + GB_PRINTER_BYTE_STATUS, + + GB_PRINTER_BYTE_COMPRESSED_DATUM, + GB_PRINTER_BYTE_UNCOMPRESSED_DATA +}; + +enum GBPrinterStatus { + GB_PRINTER_STATUS_CHECKSUM_ERROR = 0x01, + GB_PRINTER_STATUS_PRINTING = 0x02, + GB_PRINTER_STATUS_PRINT_REQ = 0x04, + GB_PRINTER_STATUS_READY = 0x08, + GB_PRINTER_STATUS_LOW_BATTERY = 0x10, + GB_PRINTER_STATUS_TIMEOUT = 0x20, + GB_PRINTER_STATUS_PAPER_JAM = 0x40, + GB_PRINTER_STATUS_TEMPERATURE_ISSUE = 0x80 +}; + +enum GBPrinterCommand { + GB_PRINTER_COMMAND_INIT = 0x1, + GB_PRINTER_COMMAND_PRINT = 0x2, + GB_PRINTER_COMMAND_DATA = 0x4, + GB_PRINTER_COMMAND_STATUS = 0xF, +}; + +struct GBPrinter { + struct GBSIODriver d; + + void (*print)(struct GBPrinter*, int height, const uint8_t* data); + + uint8_t* buffer; + uint16_t checksum; + enum GBPrinterCommand command; + uint16_t remainingBytes; + uint8_t remainingCmpBytes; + unsigned currentIndex; + bool compression; + + uint8_t byte; + enum GBPrinterPacketByte next; + uint8_t status; + int printWait; +}; + +void GBPrinterCreate(struct GBPrinter* printer); +void GBPrinterDonePrinting(struct GBPrinter* printer); + +CXX_GUARD_END + +#endif diff --git a/src/gb/sio/printer.c b/src/gb/sio/printer.c new file mode 100644 index 000000000..4bd1bf2ea --- /dev/null +++ b/src/gb/sio/printer.c @@ -0,0 +1,233 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + +#include +#include + + +static bool GBPrinterInit(struct GBSIODriver* driver); +static void GBPrinterDeinit(struct GBSIODriver* driver); +static void GBPrinterWriteSB(struct GBSIODriver* driver, uint8_t value); +static uint8_t GBPrinterWriteSC(struct GBSIODriver* driver, uint8_t value); + +void GBPrinterCreate(struct GBPrinter* printer) { + printer->d.init = GBPrinterInit; + printer->d.deinit = GBPrinterDeinit; + printer->d.writeSB = GBPrinterWriteSB; + printer->d.writeSC = GBPrinterWriteSC; + printer->print = NULL; +} + +bool GBPrinterInit(struct GBSIODriver* driver) { + struct GBPrinter* printer = (struct GBPrinter*) driver; + + printer->checksum = 0; + printer->command = 0; + printer->remainingBytes = 0; + printer->currentIndex = 0; + printer->compression = false; + printer->byte = 0; + printer->next = GB_PRINTER_BYTE_MAGIC_0; + printer->status = 0; + printer->printWait = -1; + + printer->buffer = malloc(GB_VIDEO_HORIZONTAL_PIXELS * GB_VIDEO_VERTICAL_PIXELS / 2); + + return true; +} + +void GBPrinterDeinit(struct GBSIODriver* driver) { + struct GBPrinter* printer = (struct GBPrinter*) driver; + free(printer->buffer); +} + +static void GBPrinterWriteSB(struct GBSIODriver* driver, uint8_t value) { + struct GBPrinter* printer = (struct GBPrinter*) driver; + printer->byte = value; +} + +static void _processByte(struct GBPrinter* printer) { + switch (printer->command) { + case GB_PRINTER_COMMAND_DATA: + if (printer->currentIndex < GB_VIDEO_VERTICAL_PIXELS * GB_VIDEO_HORIZONTAL_PIXELS / 2) { + printer->buffer[printer->currentIndex] = printer->byte; + ++printer->currentIndex; + } + break; + case GB_PRINTER_COMMAND_PRINT: + // TODO + break; + default: + break; + } +} + +static uint8_t GBPrinterWriteSC(struct GBSIODriver* driver, uint8_t value) { + struct GBPrinter* printer = (struct GBPrinter*) driver; + if ((value & 0x81) == 0x81) { + switch (printer->next) { + driver->p->pendingSB = 0; + case GB_PRINTER_BYTE_MAGIC_0: + if (printer->byte == 0x88) { + printer->next = GB_PRINTER_BYTE_MAGIC_1; + } else { + printer->next = GB_PRINTER_BYTE_MAGIC_0; + } + break; + case GB_PRINTER_BYTE_MAGIC_1: + if (printer->byte == 0x33) { + printer->next = GB_PRINTER_BYTE_COMMAND; + } else { + printer->next = GB_PRINTER_BYTE_MAGIC_0; + } + break; + case GB_PRINTER_BYTE_COMMAND: + printer->checksum = printer->byte; + printer->command = printer->byte; + printer->next = GB_PRINTER_BYTE_COMPRESSION; + break; + case GB_PRINTER_BYTE_COMPRESSION: + printer->checksum += printer->byte; + printer->compression = printer->byte; + printer->next = GB_PRINTER_BYTE_LENGTH_0; + break; + case GB_PRINTER_BYTE_LENGTH_0: + printer->checksum += printer->byte; + printer->remainingBytes = printer->byte; + printer->next = GB_PRINTER_BYTE_LENGTH_1; + break; + case GB_PRINTER_BYTE_LENGTH_1: + printer->checksum += printer->byte; + printer->remainingBytes |= printer->byte << 8; + if (printer->remainingBytes) { + printer->next = GB_PRINTER_BYTE_DATA; + } else { + printer->next = GB_PRINTER_BYTE_CHECKSUM_0; + } + switch (printer->command) { + case GB_PRINTER_COMMAND_INIT: + printer->currentIndex = 0; + printer->status &= ~(GB_PRINTER_STATUS_PRINT_REQ | GB_PRINTER_STATUS_READY); + break; + default: + break; + } + break; + case GB_PRINTER_BYTE_DATA: + printer->checksum += printer->byte; + if (!printer->compression) { + _processByte(printer); + } else { + printer->next = printer->byte & 0x80 ? GB_PRINTER_BYTE_COMPRESSED_DATUM : GB_PRINTER_BYTE_UNCOMPRESSED_DATA; + printer->remainingCmpBytes = (printer->byte & 0x7F) + 1; + if (printer->byte & 0x80) { + ++printer->remainingCmpBytes; + } + } + --printer->remainingBytes; + if (!printer->remainingBytes) { + printer->next = GB_PRINTER_BYTE_CHECKSUM_0; + } + break; + case GB_PRINTER_BYTE_UNCOMPRESSED_DATA: + printer->checksum += printer->byte; + _processByte(printer); + --printer->remainingCmpBytes; + if (!printer->remainingCmpBytes) { + printer->next = GB_PRINTER_BYTE_DATA; + } + --printer->remainingBytes; + if (!printer->remainingBytes) { + printer->next = GB_PRINTER_BYTE_CHECKSUM_0; + } + break; + case GB_PRINTER_BYTE_COMPRESSED_DATUM: + printer->checksum += printer->byte; + while (printer->remainingCmpBytes) { + _processByte(printer); + --printer->remainingCmpBytes; + } + --printer->remainingBytes; + if (!printer->remainingBytes) { + printer->next = GB_PRINTER_BYTE_CHECKSUM_0; + } else { + printer->next = GB_PRINTER_BYTE_DATA; + } + break; + case GB_PRINTER_BYTE_CHECKSUM_0: + printer->checksum ^= printer->byte; + printer->next = GB_PRINTER_BYTE_CHECKSUM_1; + break; + case GB_PRINTER_BYTE_CHECKSUM_1: + printer->checksum ^= printer->byte << 8; + printer->next = GB_PRINTER_BYTE_KEEPALIVE; + break; + case GB_PRINTER_BYTE_KEEPALIVE: + driver->p->pendingSB = 0x81; + printer->next = GB_PRINTER_BYTE_STATUS; + break; + case GB_PRINTER_BYTE_STATUS: + switch (printer->command) { + case GB_PRINTER_COMMAND_DATA: + if (printer->currentIndex >= 0x280 && !(printer->status & GB_PRINTER_STATUS_CHECKSUM_ERROR)) { + printer->status |= GB_PRINTER_STATUS_READY; + } + break; + case GB_PRINTER_COMMAND_PRINT: + if (printer->currentIndex >= GB_VIDEO_HORIZONTAL_PIXELS * 2) { + printer->printWait = 0; + } + break; + case GB_PRINTER_COMMAND_STATUS: + if (!printer->printWait) { + printer->status &= ~GB_PRINTER_STATUS_READY; + printer->status |= GB_PRINTER_STATUS_PRINTING | GB_PRINTER_STATUS_PRINT_REQ; + if (printer->print) { + size_t y; + for (y = 0; y < printer->currentIndex / (2 * GB_VIDEO_HORIZONTAL_PIXELS); ++y) { + uint8_t lineBuffer[GB_VIDEO_HORIZONTAL_PIXELS * 2]; + uint8_t* buffer = &printer->buffer[sizeof(lineBuffer) * y]; + size_t i; + for (i = 0; i < sizeof(lineBuffer); i += 2) { + uint8_t ilo = buffer[i + 0x0]; + uint8_t ihi = buffer[i + 0x1]; + uint8_t olo = 0; + uint8_t ohi = 0; + olo |= ((ihi & 0x80) >> 0) | ((ilo & 0x80) >> 1); + olo |= ((ihi & 0x40) >> 1) | ((ilo & 0x40) >> 2); + olo |= ((ihi & 0x20) >> 2) | ((ilo & 0x20) >> 3); + olo |= ((ihi & 0x10) >> 3) | ((ilo & 0x10) >> 4); + ohi |= ((ihi & 0x08) << 4) | ((ilo & 0x08) << 3); + ohi |= ((ihi & 0x04) << 3) | ((ilo & 0x04) << 2); + ohi |= ((ihi & 0x02) << 2) | ((ilo & 0x02) << 1); + ohi |= ((ihi & 0x01) << 1) | ((ilo & 0x01) << 0); + lineBuffer[(((i >> 1) & 0x7) * GB_VIDEO_HORIZONTAL_PIXELS / 4) + ((i >> 3) & ~1)] = olo; + lineBuffer[(((i >> 1) & 0x7) * GB_VIDEO_HORIZONTAL_PIXELS / 4) + ((i >> 3) | 1)] = ohi; + } + memcpy(buffer, lineBuffer, sizeof(lineBuffer)); + } + printer->print(printer, printer->currentIndex * 4 / GB_VIDEO_HORIZONTAL_PIXELS, printer->buffer); + } + } + if (printer->printWait >= 0) { + --printer->printWait; + } + default: + break; + } + driver->p->pendingSB = printer->status; + printer->next = GB_PRINTER_BYTE_MAGIC_0; + break; + } + printer->byte = 0; + } + return value; +} + +void GBPrinterDonePrinting(struct GBPrinter* printer) { + printer->status &= ~GB_PRINTER_STATUS_PRINTING; +} diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 6b84bc9ab..239413635 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -93,6 +93,7 @@ set(SOURCE_FILES ObjView.cpp OverrideView.cpp PaletteView.cpp + PrinterView.cpp ROMInfo.cpp SavestateButton.cpp SensorView.cpp @@ -123,6 +124,7 @@ set(UI_FILES ObjView.ui OverrideView.ui PaletteView.ui + PrinterView.ui ROMInfo.ui SensorView.ui SettingsView.ui diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index d4eea69cf..35332afa6 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -590,6 +590,59 @@ void CoreController::exportSharkport(const QString& path) { #endif } +void CoreController::attachPrinter() { +#ifdef M_CORE_GB + if (platform() != PLATFORM_GB) { + return; + } + GB* gb = static_cast(m_threadContext.core->board); + clearMultiplayerController(); + GBPrinterCreate(&m_printer.d); + m_printer.parent = this; + m_printer.d.print = [](GBPrinter* printer, int height, const uint8_t* data) { + QGBPrinter* qPrinter = reinterpret_cast(printer); + QImage image(GB_VIDEO_HORIZONTAL_PIXELS, height, QImage::Format_Indexed8); + QVector colors; + colors.append(qRgb(0xF8, 0xF8, 0xF8)); + colors.append(qRgb(0xA8, 0xA8, 0xA8)); + colors.append(qRgb(0x50, 0x50, 0x50)); + colors.append(qRgb(0x00, 0x00, 0x00)); + image.setColorTable(colors); + for (int y = 0; y < height; ++y) { + for (int x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 4) { + uint8_t byte = data[(x + y * GB_VIDEO_HORIZONTAL_PIXELS) / 4]; + image.setPixel(x + 0, y, (byte & 0xC0) >> 6); + image.setPixel(x + 1, y, (byte & 0x30) >> 4); + image.setPixel(x + 2, y, (byte & 0x0C) >> 2); + image.setPixel(x + 3, y, (byte & 0x03) >> 0); + } + } + QMetaObject::invokeMethod(qPrinter->parent, "imagePrinted", Q_ARG(const QImage&, image)); + }; + GBSIOSetDriver(&gb->sio, &m_printer.d.d); +#endif +} + +void CoreController::detachPrinter() { +#ifdef M_CORE_GB + if (platform() != PLATFORM_GB) { + return; + } + GB* gb = static_cast(m_threadContext.core->board); + GBPrinterDonePrinting(&m_printer.d); + GBSIOSetDriver(&gb->sio, nullptr); +#endif +} + +void CoreController::endPrint() { +#ifdef M_CORE_GB + if (platform() != PLATFORM_GB) { + return; + } + GBPrinterDonePrinting(&m_printer.d); +#endif +} + void CoreController::setAVStream(mAVStream* stream) { Interrupter interrupter(this); m_threadContext.core->setAVStream(m_threadContext.core, stream); diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 1cd162160..13c79e56c 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -22,6 +22,10 @@ #include #include +#ifdef M_CORE_GB +#include +#endif + struct mCore; namespace QGBA { @@ -123,6 +127,10 @@ public slots: void importSharkport(const QString& path); void exportSharkport(const QString& path); + void attachPrinter(); + void detachPrinter(); + void endPrint(); + void setAVStream(mAVStream*); void clearAVStream(); @@ -149,6 +157,8 @@ signals: void statusPosted(const QString& message); void logPosted(int level, int category, const QString& log); + void imagePrinted(const QImage&); + private: void updateKeys(); int updateAutofire(); @@ -195,6 +205,13 @@ private: mVideoLogContext* m_vl = nullptr; VFile* m_vlVf = nullptr; + +#ifdef M_CORE_GB + struct QGBPrinter { + GBPrinter d; + CoreController* parent; + } m_printer; +#endif }; } diff --git a/src/platform/qt/MultiplayerController.cpp b/src/platform/qt/MultiplayerController.cpp index 203e32330..ac68dd4bf 100644 --- a/src/platform/qt/MultiplayerController.cpp +++ b/src/platform/qt/MultiplayerController.cpp @@ -233,6 +233,9 @@ bool MultiplayerController::attachGame(CoreController* controller) { } void MultiplayerController::detachGame(CoreController* controller) { + if (m_players.empty()) { + return; + } mCoreThread* thread = controller->thread(); if (!thread) { return; diff --git a/src/platform/qt/PrinterView.cpp b/src/platform/qt/PrinterView.cpp new file mode 100644 index 000000000..7efca8892 --- /dev/null +++ b/src/platform/qt/PrinterView.cpp @@ -0,0 +1,73 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "PrinterView.h" + +#include "CoreController.h" +#include "GBAApp.h" + +#include + +using namespace QGBA; + +PrinterView::PrinterView(std::shared_ptr controller, QWidget* parent) + : QDialog(parent) + , m_controller(controller) +{ + m_ui.setupUi(this); + + connect(controller.get(), &CoreController::imagePrinted, this, &PrinterView::printImage); + connect(&m_timer, &QTimer::timeout, this, &PrinterView::printLine); + connect(m_ui.hurry, &QAbstractButton::clicked, this, &PrinterView::printAll); + connect(m_ui.tear, &QAbstractButton::clicked, this, &PrinterView::clear); + connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &PrinterView::save); + m_timer.setInterval(80); + clear(); +} + +PrinterView::~PrinterView() { + m_controller->detachPrinter(); +} + +void PrinterView::save() { + QString filename = GBAApp::app()->getSaveFileName(this, tr("Save Printout"), tr("Portable Network Graphics (*.png)")); + if (filename.isNull()) { + return; + } + m_image.save(filename); +} + +void PrinterView::clear() { + m_ui.image->setFixedHeight(0); + m_ui.image->clear(); + m_ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false); +} + +void PrinterView::printImage(const QImage& image) { + QPixmap pixmap(image.width(), image.height() + m_image.height()); + QPainter painter(&pixmap); + painter.drawPixmap(0, 0, m_image); + painter.drawImage(0, m_image.height(), image); + m_image = pixmap; + m_ui.image->setPixmap(m_image); + m_timer.start(); + m_ui.hurry->setEnabled(true); +} + +void PrinterView::printLine() { + m_ui.image->setFixedHeight(m_ui.image->height() + 1); + m_ui.scrollArea->ensureVisible(0, m_ui.image->height(), 0, 0); + if (m_ui.image->height() >= m_image.height()) { + printAll(); + } +} + +void PrinterView::printAll() { + m_timer.stop(); + m_ui.image->setFixedHeight(m_image.height()); + m_controller->endPrint(); + m_ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(true); + m_ui.hurry->setEnabled(false); +} diff --git a/src/platform/qt/PrinterView.h b/src/platform/qt/PrinterView.h new file mode 100644 index 000000000..581350961 --- /dev/null +++ b/src/platform/qt/PrinterView.h @@ -0,0 +1,50 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef QGBA_PRINTER_VIEW +#define QGBA_PRINTER_VIEW + +#include +#include +#include + +#include + +#include "ui_PrinterView.h" + +namespace QGBA { + +class CoreController; + +class PrinterView : public QDialog { +Q_OBJECT + +public: + PrinterView(std::shared_ptr controller, QWidget* parent = nullptr); + ~PrinterView(); + +signals: + void donePrinting(); + +public slots: + void save(); + void clear(); + +private slots: + void printImage(const QImage&); + void printLine(); + void printAll(); + +private: + Ui::PrinterView m_ui; + QPixmap m_image; + QTimer m_timer; + + std::shared_ptr m_controller; +}; + +} + +#endif diff --git a/src/platform/qt/PrinterView.ui b/src/platform/qt/PrinterView.ui new file mode 100644 index 000000000..ceac7c577 --- /dev/null +++ b/src/platform/qt/PrinterView.ui @@ -0,0 +1,137 @@ + + + PrinterView + + + + 0 + 0 + 241 + 311 + + + + Game Boy Printer + + + + + + QFrame::NoFrame + + + true + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + + + + + + 0 + 0 + + + + + 160 + 1 + + + + + 160 + 16777215 + + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + + + + + + + false + + + Hurry up! + + + + + + + Tear off + + + + + + + + + QDialogButtonBox::Close|QDialogButtonBox::Save + + + + + + + + + buttonBox + rejected() + PrinterView + close() + + + 112 + 226 + + + 112 + 123 + + + + + diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 243097055..be9d6d3dc 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -41,6 +41,7 @@ #include "OverrideView.h" #include "ObjView.h" #include "PaletteView.h" +#include "PrinterView.h" #include "ROMInfo.h" #include "SensorView.h" #include "SettingsView.h" @@ -1358,9 +1359,7 @@ void Window::setupMenu(QMenuBar* menubar) { fpsTargetOption->addValue(tr("240"), 240, target); m_config->updateOption("fpsTarget"); -#if defined(USE_PNG) || defined(USE_FFMPEG) || defined(USE_MAGICK) avMenu->addSeparator(); -#endif #ifdef USE_PNG QAction* screenshot = new QAction(tr("Take &screenshot"), avMenu); @@ -1397,6 +1396,18 @@ void Window::setupMenu(QMenuBar* menubar) { addControlledAction(avMenu, stopVL, "stopVL"); m_gameActions.append(stopVL); +#ifdef M_CORE_GB + QAction* gbPrint = new QAction(tr("Game Boy Printer..."), avMenu); + connect(gbPrint, &QAction::triggered, [this]() { + PrinterView* view = new PrinterView(m_controller); + openView(view); + m_controller->attachPrinter(); + + }); + addControlledAction(avMenu, gbPrint, "gbPrint"); + m_gameActions.append(gbPrint); +#endif + avMenu->addSeparator(); m_videoLayers = avMenu->addMenu(tr("Video layers")); m_shortcutController->addMenu(m_videoLayers, avMenu); @@ -1807,6 +1818,7 @@ void Window::setController(CoreController* controller, const QString& fname) { } m_controller->start(); + m_controller->loadConfig(m_config); } WindowBackground::WindowBackground(QWidget* parent) From 55679df8fc49fca3d5f8584d16b90e9bb734a922 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 30 Jul 2017 19:51:33 -0700 Subject: [PATCH 042/158] GB SIO: Fix tear off not clearing pixmap --- src/platform/qt/PrinterView.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/qt/PrinterView.cpp b/src/platform/qt/PrinterView.cpp index 7efca8892..088600ad2 100644 --- a/src/platform/qt/PrinterView.cpp +++ b/src/platform/qt/PrinterView.cpp @@ -41,6 +41,7 @@ void PrinterView::save() { void PrinterView::clear() { m_ui.image->setFixedHeight(0); + m_image = QPixmap(); m_ui.image->clear(); m_ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false); } From 36c1fb59be4710543c4a5476a554757efe306ccd Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 1 Aug 2017 19:01:44 -0700 Subject: [PATCH 043/158] GB: Super Game Boy borders --- CHANGES | 1 + include/mgba/internal/gb/gb.h | 32 +++ include/mgba/internal/gb/renderers/software.h | 3 + include/mgba/internal/gb/video.h | 21 +- src/gb/core.c | 11 +- src/gb/extra/proxy.c | 17 ++ src/gb/gb.c | 17 +- src/gb/io.c | 34 ++- src/gb/overrides.c | 2 +- src/gb/renderers/software.c | 209 ++++++++++++++++-- src/gb/video.c | 126 ++++++++++- src/platform/3ds/main.c | 2 +- src/platform/libretro/libretro.c | 2 +- src/platform/openemu/mGBAGameCore.m | 15 +- src/platform/opengl/gl.c | 6 +- src/platform/opengl/gles2.c | 17 +- src/platform/qt/CoreController.cpp | 21 +- src/platform/qt/DisplayGL.cpp | 3 +- src/platform/qt/DisplayQt.cpp | 7 +- src/platform/qt/OverrideView.cpp | 1 + src/platform/qt/OverrideView.ui | 5 + src/platform/sdl/gl-sdl.c | 12 +- src/platform/sdl/gles2-sdl.c | 9 +- src/platform/sdl/main.c | 7 + 24 files changed, 523 insertions(+), 57 deletions(-) diff --git a/CHANGES b/CHANGES index 1d980f26a..54f8fb1f7 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Features: - Game Boy Camera support - Qt: Set default Game Boy colors - Game Boy Printer support + - Super Game Boy borders Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core diff --git a/include/mgba/internal/gb/gb.h b/include/mgba/internal/gb/gb.h index 37050e613..1d222211a 100644 --- a/include/mgba/internal/gb/gb.h +++ b/include/mgba/internal/gb/gb.h @@ -44,6 +44,34 @@ enum GBIRQVector { GB_VECTOR_KEYPAD = 0x60, }; +enum GBSGBCommand { + SGB_PAL01 = 0, + SGB_PAL23, + SGB_PAL03, + SGB_PAL12, + SGB_ATTR_BLK, + SGB_ATTR_LIN, + SGB_ATTR_DIV, + SGB_ATTR_CHR, + SGB_SOUND, + SGB_SOU_TRN, + SGB_PAL_SET, + SGB_PAL_TRN, + SGB_ATRC_EN, + SGB_TEST_EN, + SGB_PICON_EN, + SGB_DATA_SND, + SGB_DATA_TRN, + SGB_MLT_REG, + SGB_JUMP, + SGB_CHR_TRN, + SGB_PCT_TRN, + SGB_ATTR_TRN, + SGB_ATTR_SET, + SGB_MASK_EN, + SGB_OBJ_TRN +}; + struct LR35902Core; struct mCoreSync; struct mAVStream; @@ -76,6 +104,10 @@ struct GB { int32_t sramDirtAge; bool sramMaskWriteback; + int sgbBit; + int currentSgbBits; + uint8_t sgbPacket[16]; + struct mCoreCallbacksList coreCallbacks; struct mAVStream* stream; diff --git a/include/mgba/internal/gb/renderers/software.h b/include/mgba/internal/gb/renderers/software.h index 038c660b8..875973774 100644 --- a/include/mgba/internal/gb/renderers/software.h +++ b/include/mgba/internal/gb/renderers/software.h @@ -34,6 +34,9 @@ struct GBVideoSoftwareRenderer { GBRegisterLCDC lcdc; enum GBModel model; + + int sgbTransfer; + uint8_t sgbPacket[16]; }; void GBVideoSoftwareRendererCreate(struct GBVideoSoftwareRenderer*); diff --git a/include/mgba/internal/gb/video.h b/include/mgba/internal/gb/video.h index 440a90ccf..539ce2253 100644 --- a/include/mgba/internal/gb/video.h +++ b/include/mgba/internal/gb/video.h @@ -30,7 +30,11 @@ enum { GB_VIDEO_TOTAL_LENGTH = 70224, GB_BASE_MAP = 0x1800, - GB_SIZE_MAP = 0x0400 + GB_SIZE_MAP = 0x0400, + + SGB_SIZE_CHAR_RAM = 0x2000, + SGB_SIZE_MAP_RAM = 0x1000, + SGB_SIZE_PAL_RAM = 0x1000 }; DECL_BITFIELD(GBObjAttributes, uint8_t); @@ -41,6 +45,13 @@ DECL_BIT(GBObjAttributes, XFlip, 5); DECL_BIT(GBObjAttributes, YFlip, 6); DECL_BIT(GBObjAttributes, Priority, 7); +DECL_BITFIELD(SGBBgAttributes, uint16_t); +DECL_BITS(SGBBgAttributes, Tile, 0, 10); +DECL_BITS(SGBBgAttributes, Palette, 10, 3); +DECL_BIT(SGBBgAttributes, Priority, 13); +DECL_BIT(SGBBgAttributes, XFlip, 14); +DECL_BIT(SGBBgAttributes, YFlip, 15); + struct GBObj { uint8_t y; uint8_t x; @@ -59,6 +70,7 @@ struct GBVideoRenderer { void (*deinit)(struct GBVideoRenderer* renderer); uint8_t (*writeVideoRegister)(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); + void (*writeSGBPacket)(struct GBVideoRenderer* renderer, uint8_t* data); void (*writeVRAM)(struct GBVideoRenderer* renderer, uint16_t address); void (*writePalette)(struct GBVideoRenderer* renderer, int index, uint16_t value); void (*writeOAM)(struct GBVideoRenderer* renderer, uint16_t oam); @@ -73,6 +85,11 @@ struct GBVideoRenderer { union GBOAM* oam; struct mTileCache* cache; + uint8_t* sgbCharRam; + uint8_t* sgbMapRam; + uint8_t* sgbPalRam; + int sgbRenderMode; + bool disableBG; bool disableOBJ; bool disableWIN; @@ -146,6 +163,8 @@ void GBVideoSwitchBank(struct GBVideo* video, uint8_t value); void GBVideoSetPalette(struct GBVideo* video, unsigned index, uint32_t color); +void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data); + struct GBSerializedState; void GBVideoSerialize(const struct GBVideo* video, struct GBSerializedState* state); void GBVideoDeserialize(struct GBVideo* video, const struct GBSerializedState* state); diff --git a/src/gb/core.c b/src/gb/core.c index 2e50324df..aa2b61e87 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -190,9 +190,14 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf } static void _GBCoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) { - UNUSED(core); - *width = GB_VIDEO_HORIZONTAL_PIXELS; - *height = GB_VIDEO_VERTICAL_PIXELS; + struct GB* gb = core->board; + if (!gb || gb->model != GB_MODEL_SGB) { + *width = GB_VIDEO_HORIZONTAL_PIXELS; + *height = GB_VIDEO_VERTICAL_PIXELS; + } else { + *width = 256; + *height = 224; + } } static void _GBCoreSetVideoBuffer(struct mCore* core, color_t* buffer, size_t stride) { diff --git a/src/gb/extra/proxy.c b/src/gb/extra/proxy.c index 2b015ae6c..1f68ee0ee 100644 --- a/src/gb/extra/proxy.c +++ b/src/gb/extra/proxy.c @@ -10,10 +10,12 @@ #include #define BUFFER_OAM 1 +#define BUFFER_SGB 2 static void GBVideoProxyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model); static void GBVideoProxyRendererDeinit(struct GBVideoRenderer* renderer); static uint8_t GBVideoProxyRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); +static void GBVideoProxyRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data); static void GBVideoProxyRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t address); static void GBVideoProxyRendererWriteOAM(struct GBVideoRenderer* renderer, uint16_t oam); static void GBVideoProxyRendererWritePalette(struct GBVideoRenderer* renderer, int address, uint16_t value); @@ -30,6 +32,7 @@ void GBVideoProxyRendererCreate(struct GBVideoProxyRenderer* renderer, struct GB renderer->d.init = GBVideoProxyRendererInit; renderer->d.deinit = GBVideoProxyRendererDeinit; renderer->d.writeVideoRegister = GBVideoProxyRendererWriteVideoRegister; + renderer->d.writeSGBPacket = GBVideoProxyRendererWriteSGBPacket; renderer->d.writeVRAM = GBVideoProxyRendererWriteVRAM; renderer->d.writeOAM = GBVideoProxyRendererWriteOAM; renderer->d.writePalette = GBVideoProxyRendererWritePalette; @@ -111,6 +114,7 @@ void GBVideoProxyRendererDeinit(struct GBVideoRenderer* renderer) { static bool _parsePacket(struct mVideoLogger* logger, const struct mVideoLoggerDirtyInfo* item) { struct GBVideoProxyRenderer* proxyRenderer = logger->context; + uint8_t sgbPacket[16]; switch (item->type) { case DIRTY_REGISTER: proxyRenderer->backend->writeVideoRegister(proxyRenderer->backend, item->address, item->value); @@ -154,6 +158,11 @@ static bool _parsePacket(struct mVideoLogger* logger, const struct mVideoLoggerD return false; } logger->readData(logger, &proxyRenderer->objThisLine, item->value2, true); + break; + case BUFFER_SGB: + logger->readData(logger, sgbPacket, 16, true); + proxyRenderer->backend->writeSGBPacket(proxyRenderer->backend, sgbPacket); + break; } break; case DIRTY_FLUSH: @@ -179,6 +188,14 @@ uint8_t GBVideoProxyRendererWriteVideoRegister(struct GBVideoRenderer* renderer, return value; } +void GBVideoProxyRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data) { + struct GBVideoProxyRenderer* proxyRenderer = (struct GBVideoProxyRenderer*) renderer; + if (!proxyRenderer->logger->block) { + proxyRenderer->backend->writeSGBPacket(proxyRenderer->backend, data); + } + mVideoLoggerWriteBuffer(proxyRenderer->logger, BUFFER_SGB, 0, 16, data); +} + void GBVideoProxyRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t address) { struct GBVideoProxyRenderer* proxyRenderer = (struct GBVideoProxyRenderer*) renderer; mVideoLoggerRendererWriteVRAM(proxyRenderer->logger, address); diff --git a/src/gb/gb.c b/src/gb/gb.c index 79d438df6..66c8c2aa6 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -28,6 +28,7 @@ static const uint8_t _knownHeader[4] = { 0xCE, 0xED, 0x66, 0x66}; #define DMG_BIOS_CHECKSUM 0xC2F5CC97 #define DMG_2_BIOS_CHECKSUM 0x59C8598E +#define SGB_BIOS_CHECKSUM 0xEC8A83B9 #define CGB_BIOS_CHECKSUM 0x41884E46 mLOG_DEFINE_CATEGORY(GB, "GB", "gb"); @@ -384,6 +385,7 @@ bool GBIsBIOS(struct VFile* vf) { switch (_GBBiosCRC32(vf)) { case DMG_BIOS_CHECKSUM: case DMG_2_BIOS_CHECKSUM: + case SGB_BIOS_CHECKSUM: case CGB_BIOS_CHECKSUM: return true; default: @@ -425,11 +427,11 @@ void GBReset(struct LR35902Core* cpu) { if (!gb->biosVf) { switch (gb->model) { - case GB_MODEL_DMG: - // TODO: SGB - case GB_MODEL_SGB: case GB_MODEL_AUTODETECT: // Silence warnings gb->model = GB_MODEL_DMG; + // TODO: SGB registers + case GB_MODEL_SGB: + case GB_MODEL_DMG: cpu->a = 1; cpu->f.packed = 0xB0; cpu->c = 0x13; @@ -467,6 +469,10 @@ void GBReset(struct LR35902Core* cpu) { gb->yankedRomSize = 0; } + gb->sgbBit = -1; + gb->currentSgbBits = 0; + memset(gb->sgbPacket, 0, sizeof(gb->sgbPacket)); + mTimingClear(&gb->timing); GBMemoryReset(gb); @@ -491,6 +497,9 @@ void GBDetectModel(struct GB* gb) { case DMG_2_BIOS_CHECKSUM: gb->model = GB_MODEL_DMG; break; + case SGB_BIOS_CHECKSUM: + gb->model = GB_MODEL_SGB; + break; case CGB_BIOS_CHECKSUM: gb->model = GB_MODEL_CGB; break; @@ -503,6 +512,8 @@ void GBDetectModel(struct GB* gb) { const struct GBCartridge* cart = (const struct GBCartridge*) &gb->memory.rom[0x100]; if (cart->cgb & 0x80) { gb->model = GB_MODEL_CGB; + } else if (cart->sgb == 0x03 && cart->oldLicensee == 0x33) { + gb->model = GB_MODEL_SGB; } else { gb->model = GB_MODEL_DMG; } diff --git a/src/gb/io.c b/src/gb/io.c index b4c42f7f9..f28ba4d76 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -105,6 +105,33 @@ static const uint8_t _registerMask[] = { [REG_IE] = 0xE0, }; +static void _writeSGBBits(struct GB* gb, int bits) { + if (!bits) { + gb->sgbBit = 0; + memset(gb->sgbPacket, 0, sizeof(gb->sgbPacket)); + } + if (bits == gb->currentSgbBits) { + return; + } + gb->currentSgbBits = bits; + if (gb->sgbBit == 128 && bits == 2) { + GBVideoWriteSGBPacket(&gb->video, gb->sgbPacket); + ++gb->sgbBit; + } + if (gb->sgbBit >= 128) { + return; + } + switch (bits) { + case 1: + gb->sgbPacket[gb->sgbBit >> 3] |= 1 << (gb->sgbBit & 7); + // Fall through + case 2: + ++gb->sgbBit; + default: + break; + } +} + void GBIOInit(struct GB* gb) { memset(gb->memory.io, 0, sizeof(gb->memory.io)); } @@ -341,6 +368,10 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { } break; case REG_JOYP: + if (gb->model == GB_MODEL_SGB) { + _writeSGBBits(gb, (value >> 4) & 3); + } + break; case REG_TIMA: case REG_TMA: // Handled transparently by the registers @@ -453,7 +484,8 @@ static uint8_t _readKeys(struct GB* gb) { uint8_t keys = *gb->keySource; switch (gb->memory.io[REG_JOYP] & 0x30) { case 0x30: - keys = 0; + // TODO: Increment + keys = gb->model == GB_MODEL_SGB ? 0xF : 0; break; case 0x20: keys >>= 4; diff --git a/src/gb/overrides.c b/src/gb/overrides.c index d8265800b..8efd4c1b9 100644 --- a/src/gb/overrides.c +++ b/src/gb/overrides.c @@ -54,7 +54,7 @@ bool GBOverrideFind(const struct Configuration* config, struct GBCartridgeOverri override->model = GB_MODEL_AGB; } else if (strcasecmp(model, "SGB") == 0) { found = true; - override->model = GB_MODEL_DMG; // TODO + override->model = GB_MODEL_SGB; } else if (strcasecmp(model, "MGB") == 0) { found = true; override->model = GB_MODEL_DMG; // TODO diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 1a6688578..f2235c946 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -7,11 +7,13 @@ #include #include +#include #include static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum GBModel model); static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer); static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); +static void GBVideoSoftwareRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data); static void GBVideoSoftwareRendererWritePalette(struct GBVideoRenderer* renderer, int index, uint16_t value); static void GBVideoSoftwareRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t address); static void GBVideoSoftwareRendererWriteOAM(struct GBVideoRenderer* renderer, uint16_t oam); @@ -25,9 +27,13 @@ static void GBVideoSoftwareRendererDrawBackground(struct GBVideoSoftwareRenderer static void GBVideoSoftwareRendererDrawObj(struct GBVideoSoftwareRenderer* renderer, struct GBObj* obj, int startX, int endX, int y); static void _clearScreen(struct GBVideoSoftwareRenderer* renderer) { + size_t sgbOffset = 0; + if (renderer->model == GB_MODEL_SGB) { + sgbOffset = renderer->outputBufferStride * 40 + 48; + } int y; for (y = 0; y < GB_VIDEO_VERTICAL_PIXELS; ++y) { - color_t* row = &renderer->outputBuffer[renderer->outputBufferStride * y]; + color_t* row = &renderer->outputBuffer[renderer->outputBufferStride * y + sgbOffset]; int x; for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 4) { row[x + 0] = renderer->palette[0]; @@ -38,10 +44,64 @@ static void _clearScreen(struct GBVideoSoftwareRenderer* renderer) { } } +static void _regenerateSGBBorder(struct GBVideoSoftwareRenderer* renderer) { + int i; + for (i = 0; i < 0x40; ++i) { + uint16_t color; + LOAD_16LE(color, 0x800 + i * 2, renderer->d.sgbMapRam); + renderer->d.writePalette(&renderer->d, i + 0x40, color); + } + int x, y; + for (y = 0; y < 224; ++y) { + for (x = 0; x < 256; x += 8) { + uint16_t mapData; + LOAD_16LE(mapData, (x >> 2) + (y & ~7) * 8, renderer->d.sgbMapRam); + if (UNLIKELY(SGBBgAttributesGetTile(mapData) > 0x100)) { + continue; + } + int localY = y & 0x7; + if (SGBBgAttributesIsYFlip(mapData)) { + localY = 7 - y; + } + uint8_t tileData[4]; + tileData[0] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x00]; + tileData[1] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x01]; + tileData[2] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x10]; + tileData[3] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x11]; + if (!(tileData[0] | tileData[1] | tileData[2] | tileData[3])) { + continue; + } + + size_t base = y * renderer->outputBufferStride + x; + int p = SGBBgAttributesGetPalette(mapData) * 0x10; + if (SGBBgAttributesIsXFlip(mapData)) { + renderer->outputBuffer[base + 0] = renderer->palette[p | ((tileData[0] >> 0) & 0x1) | ((tileData[1] << 1) & 0x2) | ((tileData[2] << 2) & 0x4) | ((tileData[3] << 3) & 0x8)]; + renderer->outputBuffer[base + 1] = renderer->palette[p | ((tileData[0] >> 1) & 0x1) | ((tileData[1] >> 0) & 0x2) | ((tileData[2] << 1) & 0x4) | ((tileData[3] << 2) & 0x8)]; + renderer->outputBuffer[base + 2] = renderer->palette[p | ((tileData[0] >> 2) & 0x1) | ((tileData[1] >> 1) & 0x2) | ((tileData[2] >> 0) & 0x4) | ((tileData[3] << 1) & 0x8)]; + renderer->outputBuffer[base + 3] = renderer->palette[p | ((tileData[0] >> 3) & 0x1) | ((tileData[1] >> 2) & 0x2) | ((tileData[2] >> 1) & 0x4) | ((tileData[3] >> 0) & 0x8)]; + renderer->outputBuffer[base + 4] = renderer->palette[p | ((tileData[0] >> 4) & 0x1) | ((tileData[1] >> 3) & 0x2) | ((tileData[2] >> 2) & 0x4) | ((tileData[3] >> 1) & 0x8)]; + renderer->outputBuffer[base + 5] = renderer->palette[p | ((tileData[0] >> 5) & 0x1) | ((tileData[1] >> 4) & 0x2) | ((tileData[2] >> 3) & 0x4) | ((tileData[3] >> 2) & 0x8)]; + renderer->outputBuffer[base + 6] = renderer->palette[p | ((tileData[0] >> 6) & 0x1) | ((tileData[1] >> 5) & 0x2) | ((tileData[2] >> 4) & 0x4) | ((tileData[3] >> 3) & 0x8)]; + renderer->outputBuffer[base + 7] = renderer->palette[p | ((tileData[0] >> 7) & 0x1) | ((tileData[1] >> 6) & 0x2) | ((tileData[2] >> 5) & 0x4) | ((tileData[3] >> 4) & 0x8)]; + } else { + renderer->outputBuffer[base + 0] = renderer->palette[p | ((tileData[0] >> 7) & 0x1) | ((tileData[1] >> 6) & 0x2) | ((tileData[2] >> 5) & 0x4) | ((tileData[3] >> 4) & 0x8)]; + renderer->outputBuffer[base + 1] = renderer->palette[p | ((tileData[0] >> 6) & 0x1) | ((tileData[1] >> 5) & 0x2) | ((tileData[2] >> 4) & 0x4) | ((tileData[3] >> 3) & 0x8)]; + renderer->outputBuffer[base + 2] = renderer->palette[p | ((tileData[0] >> 5) & 0x1) | ((tileData[1] >> 4) & 0x2) | ((tileData[2] >> 3) & 0x4) | ((tileData[3] >> 2) & 0x8)]; + renderer->outputBuffer[base + 3] = renderer->palette[p | ((tileData[0] >> 4) & 0x1) | ((tileData[1] >> 3) & 0x2) | ((tileData[2] >> 2) & 0x4) | ((tileData[3] >> 1) & 0x8)]; + renderer->outputBuffer[base + 4] = renderer->palette[p | ((tileData[0] >> 3) & 0x1) | ((tileData[1] >> 2) & 0x2) | ((tileData[2] >> 1) & 0x4) | ((tileData[3] >> 0) & 0x8)]; + renderer->outputBuffer[base + 5] = renderer->palette[p | ((tileData[0] >> 2) & 0x1) | ((tileData[1] >> 1) & 0x2) | ((tileData[2] >> 0) & 0x4) | ((tileData[3] << 1) & 0x8)]; + renderer->outputBuffer[base + 6] = renderer->palette[p | ((tileData[0] >> 1) & 0x1) | ((tileData[1] >> 0) & 0x2) | ((tileData[2] << 1) & 0x4) | ((tileData[3] << 2) & 0x8)]; + renderer->outputBuffer[base + 7] = renderer->palette[p | ((tileData[0] >> 0) & 0x1) | ((tileData[1] << 1) & 0x2) | ((tileData[2] << 2) & 0x4) | ((tileData[3] << 3) & 0x8)]; + } + } + } +} + void GBVideoSoftwareRendererCreate(struct GBVideoSoftwareRenderer* renderer) { renderer->d.init = GBVideoSoftwareRendererInit; renderer->d.deinit = GBVideoSoftwareRendererDeinit; renderer->d.writeVideoRegister = GBVideoSoftwareRendererWriteVideoRegister; + renderer->d.writeSGBPacket = GBVideoSoftwareRendererWriteSGBPacket; renderer->d.writePalette = GBVideoSoftwareRendererWritePalette; renderer->d.writeVRAM = GBVideoSoftwareRendererWriteVRAM; renderer->d.writeOAM = GBVideoSoftwareRendererWriteOAM; @@ -67,6 +127,7 @@ static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum G softwareRenderer->currentWy = 0; softwareRenderer->wx = 0; softwareRenderer->model = model; + softwareRenderer->sgbTransfer = 0; } static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer) { @@ -96,6 +157,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* return value; } +static void GBVideoSoftwareRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data) { + struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; + memcpy(softwareRenderer->sgbPacket, data, sizeof(softwareRenderer->sgbPacket)); +} + static void GBVideoSoftwareRendererWritePalette(struct GBVideoRenderer* renderer, int index, uint16_t value) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; #ifdef COLOR_16_BIT @@ -167,20 +233,60 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i GBVideoSoftwareRendererDrawObj(softwareRenderer, &obj[i], startX, endX, y); } } - color_t* row = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y]; - int x; - for (x = startX; x + 7 < (endX & ~7); x += 8) { - row[x] = softwareRenderer->palette[softwareRenderer->row[x] & 0x7F]; - row[x + 1] = softwareRenderer->palette[softwareRenderer->row[x + 1] & 0x7F]; - row[x + 2] = softwareRenderer->palette[softwareRenderer->row[x + 2] & 0x7F]; - row[x + 3] = softwareRenderer->palette[softwareRenderer->row[x + 3] & 0x7F]; - row[x + 4] = softwareRenderer->palette[softwareRenderer->row[x + 4] & 0x7F]; - row[x + 5] = softwareRenderer->palette[softwareRenderer->row[x + 5] & 0x7F]; - row[x + 6] = softwareRenderer->palette[softwareRenderer->row[x + 6] & 0x7F]; - row[x + 7] = softwareRenderer->palette[softwareRenderer->row[x + 7] & 0x7F]; + size_t sgbOffset = 0; + if (softwareRenderer->model == GB_MODEL_SGB) { + sgbOffset = softwareRenderer->outputBufferStride * 40 + 48; } - for (; x < endX; ++x) { - row[x] = softwareRenderer->palette[softwareRenderer->row[x] & 0x7F]; + color_t* row = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y + sgbOffset]; + int x; + switch (softwareRenderer->d.sgbRenderMode) { + case 0: + for (x = startX; x + 7 < (endX & ~7); x += 8) { + row[x] = softwareRenderer->palette[softwareRenderer->row[x] & 0x7F]; + row[x + 1] = softwareRenderer->palette[softwareRenderer->row[x + 1] & 0x7F]; + row[x + 2] = softwareRenderer->palette[softwareRenderer->row[x + 2] & 0x7F]; + row[x + 3] = softwareRenderer->palette[softwareRenderer->row[x + 3] & 0x7F]; + row[x + 4] = softwareRenderer->palette[softwareRenderer->row[x + 4] & 0x7F]; + row[x + 5] = softwareRenderer->palette[softwareRenderer->row[x + 5] & 0x7F]; + row[x + 6] = softwareRenderer->palette[softwareRenderer->row[x + 6] & 0x7F]; + row[x + 7] = softwareRenderer->palette[softwareRenderer->row[x + 7] & 0x7F]; + } + for (; x < endX; ++x) { + row[x] = softwareRenderer->palette[softwareRenderer->row[x] & 0x7F]; + } + break; + case 1: + return; + case 2: + for (x = startX; x + 7 < (endX & ~7); x += 8) { + row[x] = 0; + row[x + 1] = 0; + row[x + 2] = 0; + row[x + 3] = 0; + row[x + 4] = 0; + row[x + 5] = 0; + row[x + 6] = 0; + row[x + 7] = 0; + } + for (; x < endX; ++x) { + row[x] = 0; + } + return; + case 3: + for (x = startX; x + 7 < (endX & ~7); x += 8) { + row[x] = softwareRenderer->palette[0]; + row[x + 1] = softwareRenderer->palette[0]; + row[x + 2] = softwareRenderer->palette[0]; + row[x + 3] = softwareRenderer->palette[0]; + row[x + 4] = softwareRenderer->palette[0]; + row[x + 5] = softwareRenderer->palette[0]; + row[x + 6] = softwareRenderer->palette[0]; + row[x + 7] = softwareRenderer->palette[0]; + } + for (; x < endX; ++x) { + row[x] = softwareRenderer->palette[0]; + } + return; } } @@ -189,6 +295,53 @@ static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* render if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && softwareRenderer->wy <= y && softwareRenderer->wx - 7 < GB_VIDEO_HORIZONTAL_PIXELS) { ++softwareRenderer->currentWy; } + if (softwareRenderer->sgbTransfer == 1) { + uint8_t* buffer = NULL; + switch (softwareRenderer->sgbPacket[0] >> 3) { + case SGB_PAL_TRN: + buffer = renderer->sgbPalRam; + break; + case SGB_CHR_TRN: + buffer = &renderer->sgbCharRam[SGB_SIZE_CHAR_RAM / 2 * (softwareRenderer->sgbPacket[1] & 1)]; + break; + case SGB_PCT_TRN: + buffer = renderer->sgbMapRam; + break; + default: + break; + } + if (buffer) { + size_t offset = 2 * ((y & 7) + (y >> 3) * GB_VIDEO_HORIZONTAL_PIXELS); + if (offset < 0x1000) { + int i; + for (i = 0; i < GB_VIDEO_HORIZONTAL_PIXELS; i += 8) { + if (UNLIKELY(offset + (i << 1) + 1 >= 0x1000)) { + break; + } + uint8_t hi = 0; + uint8_t lo = 0; + hi |= (softwareRenderer->row[i + 0] & 0x2) << 6; + lo |= (softwareRenderer->row[i + 0] & 0x1) << 7; + hi |= (softwareRenderer->row[i + 1] & 0x2) << 5; + lo |= (softwareRenderer->row[i + 1] & 0x1) << 6; + hi |= (softwareRenderer->row[i + 2] & 0x2) << 4; + lo |= (softwareRenderer->row[i + 2] & 0x1) << 5; + hi |= (softwareRenderer->row[i + 3] & 0x2) << 3; + lo |= (softwareRenderer->row[i + 3] & 0x1) << 4; + hi |= (softwareRenderer->row[i + 4] & 0x2) << 2; + lo |= (softwareRenderer->row[i + 4] & 0x1) << 3; + hi |= (softwareRenderer->row[i + 5] & 0x2) << 1; + lo |= (softwareRenderer->row[i + 5] & 0x1) << 2; + hi |= (softwareRenderer->row[i + 6] & 0x2) << 0; + lo |= (softwareRenderer->row[i + 6] & 0x1) << 1; + hi |= (softwareRenderer->row[i + 7] & 0x2) >> 1; + lo |= (softwareRenderer->row[i + 7] & 0x1) >> 0; + buffer[offset + (i << 1) + 0] = lo; + buffer[offset + (i << 1) + 1] = hi; + } + } + } + } } static void GBVideoSoftwareRendererFinishFrame(struct GBVideoRenderer* renderer) { @@ -201,6 +354,34 @@ static void GBVideoSoftwareRendererFinishFrame(struct GBVideoRenderer* renderer) if (!GBRegisterLCDCIsEnable(softwareRenderer->lcdc)) { _clearScreen(softwareRenderer); } + if (softwareRenderer->model == GB_MODEL_SGB) { + switch (softwareRenderer->sgbPacket[0] >> 3) { + case SGB_PAL_SET: + if (softwareRenderer->sgbPacket[9] & 0x40) { + renderer->sgbRenderMode = 0; + } + break; + case SGB_ATTR_SET: + if (softwareRenderer->sgbPacket[1] & 0x40) { + renderer->sgbRenderMode = 0; + } + break; + case SGB_PAL_TRN: + case SGB_CHR_TRN: + case SGB_PCT_TRN: + if (softwareRenderer->sgbTransfer > 0) { + // Make sure every buffer sees this if we're multibuffering + _regenerateSGBBorder(softwareRenderer); + } + ++softwareRenderer->sgbTransfer; + if (softwareRenderer->sgbTransfer == 5) { + softwareRenderer->sgbTransfer = 0; + softwareRenderer->sgbPacket[0] = 0; + } + default: + break; + } + } softwareRenderer->currentWy = 0; } diff --git a/src/gb/video.c b/src/gb/video.c index 830f71c30..61d38c0fd 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -18,6 +18,7 @@ static void GBVideoDummyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model); static void GBVideoDummyRendererDeinit(struct GBVideoRenderer* renderer); static uint8_t GBVideoDummyRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); +static void GBVideoDummyRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data); static void GBVideoDummyRendererWritePalette(struct GBVideoRenderer* renderer, int index, uint16_t value); static void GBVideoDummyRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t address); static void GBVideoDummyRendererWriteOAM(struct GBVideoRenderer* renderer, uint16_t oam); @@ -39,6 +40,7 @@ static struct GBVideoRenderer dummyRenderer = { .init = GBVideoDummyRendererInit, .deinit = GBVideoDummyRendererDeinit, .writeVideoRegister = GBVideoDummyRendererWriteVideoRegister, + .writeSGBPacket = GBVideoDummyRendererWriteSGBPacket, .writeVRAM = GBVideoDummyRendererWriteVRAM, .writeOAM = GBVideoDummyRendererWriteOAM, .writePalette = GBVideoDummyRendererWritePalette, @@ -52,6 +54,7 @@ static struct GBVideoRenderer dummyRenderer = { void GBVideoInit(struct GBVideo* video) { video->renderer = &dummyRenderer; video->renderer->cache = NULL; + video->renderer->sgbRenderMode = 0; video->vram = 0; video->frameskip = 0; @@ -68,6 +71,10 @@ void GBVideoInit(struct GBVideo* video) { video->dmgPalette[1] = 0x56B5; video->dmgPalette[2] = 0x294A; video->dmgPalette[3] = 0x0000; + + video->renderer->sgbCharRam = NULL; + video->renderer->sgbMapRam = NULL; + video->renderer->sgbPalRam = NULL; } void GBVideoReset(struct GBVideo* video) { @@ -89,6 +96,12 @@ void GBVideoReset(struct GBVideo* video) { video->renderer->oam = &video->oam; memset(&video->palette, 0, sizeof(video->palette)); + if (video->p->model == GB_MODEL_SGB) { + video->renderer->sgbCharRam = anonymousMemoryMap(SGB_SIZE_CHAR_RAM); + video->renderer->sgbMapRam = anonymousMemoryMap(SGB_SIZE_MAP_RAM); + video->renderer->sgbPalRam = anonymousMemoryMap(SGB_SIZE_PAL_RAM); + } + video->renderer->deinit(video->renderer); video->renderer->init(video->renderer, video->p->model); } @@ -96,11 +109,27 @@ void GBVideoReset(struct GBVideo* video) { void GBVideoDeinit(struct GBVideo* video) { GBVideoAssociateRenderer(video, &dummyRenderer); mappedMemoryFree(video->vram, GB_SIZE_VRAM); + if (video->renderer->sgbCharRam) { + mappedMemoryFree(video->renderer->sgbCharRam, SGB_SIZE_CHAR_RAM); + video->renderer->sgbCharRam = NULL; + } + if (video->renderer->sgbMapRam) { + mappedMemoryFree(video->renderer->sgbMapRam, SGB_SIZE_MAP_RAM); + video->renderer->sgbMapRam = NULL; + } + if (video->renderer->sgbPalRam) { + mappedMemoryFree(video->renderer->sgbPalRam, SGB_SIZE_PAL_RAM); + video->renderer->sgbPalRam = NULL; + } } void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* renderer) { video->renderer->deinit(video->renderer); renderer->cache = video->renderer->cache; + renderer->sgbRenderMode = video->renderer->sgbRenderMode; + renderer->sgbCharRam = video->renderer->sgbCharRam; + renderer->sgbMapRam = video->renderer->sgbMapRam; + renderer->sgbPalRam = video->renderer->sgbPalRam; video->renderer = renderer; renderer->vram = video->vram; video->renderer->init(video->renderer, video->p->model); @@ -372,7 +401,7 @@ void GBVideoWriteLCDC(struct GBVideo* video, GBRegisterLCDC value) { void GBVideoWriteSTAT(struct GBVideo* video, GBRegisterSTAT value) { GBRegisterSTAT oldStat = video->stat; video->stat = (video->stat & 0x7) | (value & 0x78); - if (video->p->model == GB_MODEL_DMG && !_statIRQAsserted(video, oldStat) && video->mode < 3) { + if (video->p->model < GB_MODEL_CGB && !_statIRQAsserted(video, oldStat) && video->mode < 3) { // TODO: variable for the IRQ line value? video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT); GBUpdateIRQs(video->p); @@ -476,6 +505,96 @@ void GBVideoSetPalette(struct GBVideo* video, unsigned index, uint32_t color) { video->dmgPalette[index] = M_RGB8_TO_RGB5(color); } +void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { + switch (data[0] >> 3) { + case SGB_PAL01: + video->palette[0] = data[1] | (data[2] << 8); + video->palette[1] = data[3] | (data[4] << 8); + video->palette[2] = data[5] | (data[6] << 8); + video->palette[3] = data[7] | (data[8] << 8); + + video->palette[17] = data[9] | (data[10] << 8); + video->palette[18] = data[11] | (data[12] << 8); + video->palette[19] = data[13] | (data[14] << 8); + video->renderer->writePalette(video->renderer, 0, video->palette[0]); + video->renderer->writePalette(video->renderer, 1, video->palette[1]); + video->renderer->writePalette(video->renderer, 2, video->palette[2]); + video->renderer->writePalette(video->renderer, 3, video->palette[3]); + video->renderer->writePalette(video->renderer, 17, video->palette[17]); + video->renderer->writePalette(video->renderer, 18, video->palette[18]); + video->renderer->writePalette(video->renderer, 19, video->palette[19]); + break; + case SGB_PAL23: + video->palette[32] = data[1] | (data[2] << 8); + video->palette[33] = data[3] | (data[4] << 8); + video->palette[34] = data[5] | (data[6] << 8); + video->palette[35] = data[7] | (data[8] << 8); + + video->palette[49] = data[9] | (data[10] << 8); + video->palette[50] = data[11] | (data[12] << 8); + video->palette[51] = data[13] | (data[14] << 8); + video->renderer->writePalette(video->renderer, 32, video->palette[32]); + video->renderer->writePalette(video->renderer, 33, video->palette[33]); + video->renderer->writePalette(video->renderer, 34, video->palette[34]); + video->renderer->writePalette(video->renderer, 35, video->palette[35]); + video->renderer->writePalette(video->renderer, 49, video->palette[49]); + video->renderer->writePalette(video->renderer, 50, video->palette[50]); + video->renderer->writePalette(video->renderer, 51, video->palette[51]); + break; + case SGB_PAL03: + video->palette[0] = data[1] | (data[2] << 8); + video->palette[1] = data[3] | (data[4] << 8); + video->palette[2] = data[5] | (data[6] << 8); + video->palette[3] = data[7] | (data[8] << 8); + + video->palette[49] = data[9] | (data[10] << 8); + video->palette[50] = data[11] | (data[12] << 8); + video->palette[51] = data[13] | (data[14] << 8); + video->renderer->writePalette(video->renderer, 0, video->palette[0]); + video->renderer->writePalette(video->renderer, 1, video->palette[1]); + video->renderer->writePalette(video->renderer, 2, video->palette[2]); + video->renderer->writePalette(video->renderer, 3, video->palette[3]); + video->renderer->writePalette(video->renderer, 49, video->palette[49]); + video->renderer->writePalette(video->renderer, 50, video->palette[50]); + video->renderer->writePalette(video->renderer, 51, video->palette[51]); + break; + case SGB_PAL12: + video->palette[16] = data[1] | (data[2] << 8); + video->palette[17] = data[3] | (data[4] << 8); + video->palette[18] = data[5] | (data[6] << 8); + video->palette[19] = data[7] | (data[8] << 8); + + video->palette[33] = data[9] | (data[10] << 8); + video->palette[34] = data[11] | (data[12] << 8); + video->palette[35] = data[13] | (data[14] << 8); + video->renderer->writePalette(video->renderer, 16, video->palette[16]); + video->renderer->writePalette(video->renderer, 17, video->palette[17]); + video->renderer->writePalette(video->renderer, 18, video->palette[18]); + video->renderer->writePalette(video->renderer, 19, video->palette[19]); + video->renderer->writePalette(video->renderer, 33, video->palette[33]); + video->renderer->writePalette(video->renderer, 34, video->palette[34]); + video->renderer->writePalette(video->renderer, 35, video->palette[35]); + break; + case SGB_MLT_REG: + return; + case SGB_MASK_EN: + video->renderer->sgbRenderMode = data[1] & 0x3; + break; + case SGB_PAL_TRN: + case SGB_CHR_TRN: + case SGB_PCT_TRN: + break; + case SGB_PAL_SET: + case SGB_ATTR_SET: + mLOG(GB, STUB, "Unimplemented SGB command: %02X", data[0] >> 3); + break; + default: + mLOG(GB, STUB, "Unimplemented SGB command: %02X", data[0] >> 3); + return; + } + video->renderer->writeSGBPacket(video->renderer, data); +} + static void GBVideoDummyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model) { UNUSED(renderer); UNUSED(model); @@ -493,6 +612,11 @@ static uint8_t GBVideoDummyRendererWriteVideoRegister(struct GBVideoRenderer* re return value; } +static void GBVideoDummyRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data) { + UNUSED(renderer); + UNUSED(data); +} + static void GBVideoDummyRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t address) { if (renderer->cache) { mTileCacheWriteVRAM(renderer->cache, address); diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index 888825735..17a28175d 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -285,7 +285,7 @@ static void _setup(struct mGUIRunner* runner) { _map3DSKey(&runner->core->inputMap, KEY_L, GBA_KEY_L); _map3DSKey(&runner->core->inputMap, KEY_R, GBA_KEY_R); - outputBuffer = linearMemAlign(256 * VIDEO_VERTICAL_PIXELS * 2, 0x80); + outputBuffer = linearMemAlign(256 * 224 * 2, 0x80); runner->core->setVideoBuffer(runner->core, outputBuffer, 256); unsigned mode; diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index d19c5006f..934fca788 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -390,7 +390,7 @@ bool retro_load_game(const struct retro_game_info* game) { core->init(core); core->setAVStream(core, &stream); - outputBuffer = malloc(256 * VIDEO_VERTICAL_PIXELS * BYTES_PER_PIXEL); + outputBuffer = malloc(256 * 224 * BYTES_PER_PIXEL); core->setVideoBuffer(core, outputBuffer, 256); core->setAudioBufferSize(core, SAMPLES); diff --git a/src/platform/openemu/mGBAGameCore.m b/src/platform/openemu/mGBAGameCore.m index 1ddf5482f..9b2b93b05 100644 --- a/src/platform/openemu/mGBAGameCore.m +++ b/src/platform/openemu/mGBAGameCore.m @@ -65,13 +65,9 @@ }; mCoreConfigLoadDefaults(&core->config, &opts); core->init(core); + outputBuffer = nil; - unsigned width, height; - core->desiredVideoDimensions(core, &width, &height); - outputBuffer = malloc(width * height * BYTES_PER_PIXEL); - core->setVideoBuffer(core, outputBuffer, width); core->setAudioBufferSize(core, SAMPLES); - cheatSets = [[NSMutableDictionary alloc] init]; } @@ -108,6 +104,15 @@ mCoreAutoloadSave(core); core->reset(core); + + unsigned width, height; + core->desiredVideoDimensions(core, &width, &height); + if (outputBuffer) { + free(outputBuffer); + } + outputBuffer = malloc(width * height * BYTES_PER_PIXEL); + core->setVideoBuffer(core, outputBuffer, width); + return YES; } diff --git a/src/platform/opengl/gl.c b/src/platform/opengl/gl.c index 87b679c6b..9f259292e 100644 --- a/src/platform/opengl/gl.c +++ b/src/platform/opengl/gl.c @@ -110,12 +110,12 @@ void mGLContextPostFrame(struct VideoBackend* v, const void* frame) { glBindTexture(GL_TEXTURE_2D, context->tex); #ifdef COLOR_16_BIT #ifdef COLOR_5_6_5 - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, v->width, v->height, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, frame); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, toPow2(v->width), v->height, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, frame); #else - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, v->width, v->height, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frame); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, toPow2(v->width), v->height, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frame); #endif #else - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, v->width, v->height, GL_RGBA, GL_UNSIGNED_BYTE, frame); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, toPow2(v->width), v->height, GL_RGBA, GL_UNSIGNED_BYTE, frame); #endif } diff --git a/src/platform/opengl/gles2.c b/src/platform/opengl/gles2.c index 2dfa7448b..f7db81a52 100644 --- a/src/platform/opengl/gles2.c +++ b/src/platform/opengl/gles2.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -190,13 +191,6 @@ static void mGLES2ContextClear(struct VideoBackend* v) { void _drawShader(struct mGLES2Context* context, struct mGLES2Shader* shader) { GLint viewport[4]; glBindFramebuffer(GL_FRAMEBUFFER, shader->fbo); - if (shader->blend) { - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } else { - glDisable(GL_BLEND); - glClear(GL_COLOR_BUFFER_BIT); - } glGetIntegerv(GL_VIEWPORT, viewport); int drawW = shader->width; @@ -222,6 +216,14 @@ void _drawShader(struct mGLES2Context* context, struct mGLES2Shader* shader) { drawH -= drawH % context->d.height; } glViewport(padW, padH, drawW, drawH); + if (shader->blend) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } else { + glDisable(GL_BLEND); + glClear(GL_COLOR_BUFFER_BIT); + } + if (shader->tex && (shader->width <= 0 || shader->height <= 0)) { GLint oldTex; glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTex); @@ -316,6 +318,7 @@ void mGLES2ContextDrawFrame(struct VideoBackend* v) { void mGLES2ContextPostFrame(struct VideoBackend* v, const void* frame) { struct mGLES2Context* context = (struct mGLES2Context*) v; glBindTexture(GL_TEXTURE_2D, context->tex); + glPixelStorei(GL_UNPACK_ROW_LENGTH, toPow2(v->width)); #ifdef COLOR_16_BIT #ifdef COLOR_5_6_5 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, v->width, v->height, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, frame); diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 35332afa6..286f3dc4d 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -25,6 +25,7 @@ #include #include #endif +#include #include using namespace QGBA; @@ -38,9 +39,11 @@ CoreController::CoreController(mCore* core, QObject* parent) m_threadContext.core = core; m_threadContext.userData = this; - QSize size = screenDimensions(); - m_buffers[0].resize(size.width() * size.height() * sizeof(color_t)); - m_buffers[1].resize(size.width() * size.height() * sizeof(color_t)); + QSize size(256, 512); + m_buffers[0].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); + m_buffers[1].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); + m_buffers[0].fill(0xFF); + m_buffers[1].fill(0xFF); m_activeBuffer = &m_buffers[0]; m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast(m_activeBuffer->data()), size.width()); @@ -81,7 +84,15 @@ CoreController::CoreController(mCore* core, QObject* parent) } controller->m_resetActions.clear(); - controller->m_activeBuffer->fill(0xFF); + QSize size = controller->screenDimensions(); + controller->m_buffers[0].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); + controller->m_buffers[1].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); + controller->m_buffers[0].fill(0xFF); + controller->m_buffers[1].fill(0xFF); + controller->m_activeBuffer = &controller->m_buffers[0]; + + context->core->setVideoBuffer(context->core, reinterpret_cast(controller->m_activeBuffer->data()), toPow2(size.width())); + controller->finishFrame(); }; @@ -712,7 +723,7 @@ void CoreController::finishFrame() { if (m_activeBuffer == m_completeBuffer) { m_activeBuffer = &m_buffers[1]; } - m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast(m_activeBuffer->data()), screenDimensions().width()); + m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast(m_activeBuffer->data()), toPow2(screenDimensions().width())); for (auto& action : m_frameActions) { action(); diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp index 07ee75dc7..113f859bd 100644 --- a/src/platform/qt/DisplayGL.cpp +++ b/src/platform/qt/DisplayGL.cpp @@ -14,6 +14,7 @@ #include #include +#include #ifdef BUILD_GL #include "platform/opengl/gl.h" #endif @@ -390,7 +391,7 @@ void PainterGL::enqueue(const uint32_t* backing) { buffer = m_free.takeLast(); } QSize size = m_context->screenDimensions(); - memcpy(buffer, backing, size.width() * size.height() * BYTES_PER_PIXEL); + memcpy(buffer, backing, toPow2(size.width()) * size.height() * BYTES_PER_PIXEL); m_queue.enqueue(buffer); m_mutex.unlock(); } diff --git a/src/platform/qt/DisplayQt.cpp b/src/platform/qt/DisplayQt.cpp index 0c63e8b78..45ba297a9 100644 --- a/src/platform/qt/DisplayQt.cpp +++ b/src/platform/qt/DisplayQt.cpp @@ -11,6 +11,7 @@ #include #include +#include using namespace QGBA; @@ -56,12 +57,12 @@ void DisplayQt::framePosted() { } #ifdef COLOR_16_BIT #ifdef COLOR_5_6_5 - m_backing = QImage(reinterpret_cast(buffer), m_width, m_height, QImage::Format_RGB16); + m_backing = QImage(reinterpret_cast(buffer), toPow2(m_width), m_height, QImage::Format_RGB16); #else - m_backing = QImage(reinterpret_cast(buffer), m_width, m_height, QImage::Format_RGB555); + m_backing = QImage(reinterpret_cast(buffer), toPow2(m_width), m_height, QImage::Format_RGB555); #endif #else - m_backing = QImage(reinterpret_cast(buffer), m_width, m_height, QImage::Format_ARGB32); + m_backing = QImage(reinterpret_cast(buffer), toPow2(m_width), m_height, QImage::Format_ARGB32); m_backing = m_backing.convertToFormat(QImage::Format_RGB32); #endif } diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index 618041868..ac380cc9c 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -51,6 +51,7 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) // NB: Keep in sync with OverrideView.ui s_gbModelList.append(GB_MODEL_AUTODETECT); s_gbModelList.append(GB_MODEL_DMG); + s_gbModelList.append(GB_MODEL_SGB); s_gbModelList.append(GB_MODEL_CGB); s_gbModelList.append(GB_MODEL_AGB); } diff --git a/src/platform/qt/OverrideView.ui b/src/platform/qt/OverrideView.ui index 6c9b4a772..9ab598a8e 100644 --- a/src/platform/qt/OverrideView.ui +++ b/src/platform/qt/OverrideView.ui @@ -253,6 +253,11 @@ Game Boy (DMG) + + + Super Game Boy (SGB) + + Game Boy Color (CGB) diff --git a/src/platform/sdl/gl-sdl.c b/src/platform/sdl/gl-sdl.c index 2919fc2b3..d4fd0ff01 100644 --- a/src/platform/sdl/gl-sdl.c +++ b/src/platform/sdl/gl-sdl.c @@ -9,6 +9,8 @@ #include #include +#include + #include "platform/opengl/gl.h" static void _doViewport(int w, int h, struct VideoBackend* v) { @@ -31,9 +33,10 @@ void mSDLGLCreate(struct mSDLRenderer* renderer) { bool mSDLGLInit(struct mSDLRenderer* renderer) { mSDLGLCommonInit(renderer); - renderer->outputBuffer = malloc(renderer->width * renderer->height * BYTES_PER_PIXEL); - memset(renderer->outputBuffer, 0, renderer->width * renderer->height * BYTES_PER_PIXEL); - renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, renderer->width); + size_t size = toPow2(renderer->width) * renderer->height * BYTES_PER_PIXEL; + renderer->outputBuffer = malloc(size); + memset(renderer->outputBuffer, 0, size); + renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, toPow2(renderer->width)); mGLContextCreate(&renderer->gl); renderer->gl.d.user = renderer; @@ -64,6 +67,9 @@ void mSDLGLRunloop(struct mSDLRenderer* renderer, void* user) { renderer->player.windowUpdated = 0; } #endif + if (renderer->width != v->width || renderer->height != v->height) { + renderer->gl.d.setDimensions(&renderer->gl.d, renderer->width, renderer->height); + } } if (mCoreSyncWaitFrameStart(&context->impl->sync)) { diff --git a/src/platform/sdl/gles2-sdl.c b/src/platform/sdl/gles2-sdl.c index 9f9778c3f..b80ab33c5 100644 --- a/src/platform/sdl/gles2-sdl.c +++ b/src/platform/sdl/gles2-sdl.c @@ -98,13 +98,14 @@ bool mSDLGLES2Init(struct mSDLRenderer* renderer) { mSDLGLCommonInit(renderer); #endif + size_t size = toPow2(renderer->width) * renderer->height * BYTES_PER_PIXEL; #ifndef __APPLE__ - renderer->outputBuffer = memalign(16, renderer->width * renderer->height * BYTES_PER_PIXEL); + renderer->outputBuffer = memalign(16, size); #else - posix_memalign((void**) &renderer->outputBuffer, 16, renderer->width * renderer->height * BYTES_PER_PIXEL); + posix_memalign((void**) &renderer->outputBuffer, 16, size); #endif - memset(renderer->outputBuffer, 0, renderer->width * renderer->height * BYTES_PER_PIXEL); - renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, renderer->width); + memset(renderer->outputBuffer, 0, size); + renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, toPow2(renderer->width)); mGLES2ContextCreate(&renderer->gl2); renderer->gl2.d.user = renderer; diff --git a/src/platform/sdl/main.c b/src/platform/sdl/main.c index 3cdf30856..3ba08f9dc 100644 --- a/src/platform/sdl/main.c +++ b/src/platform/sdl/main.c @@ -220,6 +220,13 @@ int mSDLRun(struct mSDLRenderer* renderer, struct mArguments* args) { bool didFail = !mCoreThreadStart(&thread); if (!didFail) { #if SDL_VERSION_ATLEAST(2, 0, 0) + renderer->core->desiredVideoDimensions(renderer->core, &renderer->width, &renderer->height); + unsigned width = renderer->width * renderer->ratio; + unsigned height = renderer->height * renderer->ratio; + if (width != (unsigned) renderer->viewportWidth && height != (unsigned) renderer->viewportHeight) { + SDL_SetWindowSize(renderer->window, width, height); + renderer->player.windowUpdated = 1; + } mSDLSetScreensaverSuspendable(&renderer->events, renderer->core->opts.suspendScreensaver); mSDLSuspendScreensaver(&renderer->events); #endif From 871c21fb6cf9041b4ac7c7f7074e0b2eb77484fe Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 14:47:23 -0700 Subject: [PATCH 044/158] GB Video: Further SGB work, support for ATTR_BLK --- CHANGES | 2 +- include/mgba/core/interface.h | 22 ++ include/mgba/internal/gb/renderers/software.h | 5 + include/mgba/internal/gb/video.h | 6 +- src/gb/renderers/software.c | 266 ++++++++++++------ src/gb/video.c | 95 ++++++- src/gba/renderers/software-bg.c | 2 + src/gba/renderers/video-software.c | 17 +- src/platform/python/_builder.h | 3 +- src/platform/sdl/gl-sdl.c | 8 +- src/platform/sdl/gles2-sdl.c | 2 +- 11 files changed, 307 insertions(+), 121 deletions(-) diff --git a/CHANGES b/CHANGES index 54f8fb1f7..83f89025d 100644 --- a/CHANGES +++ b/CHANGES @@ -4,7 +4,7 @@ Features: - Game Boy Camera support - Qt: Set default Game Boy colors - Game Boy Printer support - - Super Game Boy borders + - Super Game Boy support Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h index b3bbad782..053b5b1d1 100644 --- a/include/mgba/core/interface.h +++ b/include/mgba/core/interface.h @@ -35,6 +35,28 @@ typedef uint32_t color_t; #define M_RGB8_TO_BGR5(X) ((((X) & 0xF8) >> 3) | (((X) & 0xF800) >> 6) | (((X) & 0xF80000) >> 9)) #define M_RGB8_TO_RGB5(X) ((((X) & 0xF8) << 7) | (((X) & 0xF800) >> 6) | (((X) & 0xF80000) >> 19)) +#ifndef PYCPARSE +static inline color_t mColorFrom555(uint16_t value) { +#ifdef COLOR_16_BIT +#ifdef COLOR_5_6_5 + color_t color = 0; + color |= (value & 0x001F) << 11; + color |= (value & 0x03E0) << 1; + color |= (value & 0x7C00) >> 10; +#else + color_t color = value; +#endif +#else + color_t color = 0; + color |= (value << 3) & 0xF8; + color |= (value << 6) & 0xF800; + color |= (value << 9) & 0xF80000; + color |= (color >> 5) & 0x070707; +#endif + return color; +} +#endif + struct blip_t; enum mColorFormat { diff --git a/include/mgba/internal/gb/renderers/software.h b/include/mgba/internal/gb/renderers/software.h index 875973774..4ee36d850 100644 --- a/include/mgba/internal/gb/renderers/software.h +++ b/include/mgba/internal/gb/renderers/software.h @@ -23,6 +23,7 @@ struct GBVideoSoftwareRenderer { uint8_t row[GB_VIDEO_HORIZONTAL_PIXELS + 8]; color_t palette[128]; + uint8_t lookup[64]; uint32_t* temporaryBuffer; @@ -37,6 +38,10 @@ struct GBVideoSoftwareRenderer { int sgbTransfer; uint8_t sgbPacket[16]; + uint8_t sgbCommandHeader; + int sgbPacketId; + int sgbDataSets; + uint8_t sgbPartialDataSet[15]; }; void GBVideoSoftwareRendererCreate(struct GBVideoSoftwareRenderer*); diff --git a/include/mgba/internal/gb/video.h b/include/mgba/internal/gb/video.h index 539ce2253..f9648168e 100644 --- a/include/mgba/internal/gb/video.h +++ b/include/mgba/internal/gb/video.h @@ -34,7 +34,8 @@ enum { SGB_SIZE_CHAR_RAM = 0x2000, SGB_SIZE_MAP_RAM = 0x1000, - SGB_SIZE_PAL_RAM = 0x1000 + SGB_SIZE_PAL_RAM = 0x1000, + SGB_SIZE_ATF_RAM = 0x1000 }; DECL_BITFIELD(GBObjAttributes, uint8_t); @@ -89,6 +90,8 @@ struct GBVideoRenderer { uint8_t* sgbMapRam; uint8_t* sgbPalRam; int sgbRenderMode; + uint8_t* sgbAttributes; + uint8_t* sgbAttributeFiles; bool disableBG; bool disableOBJ; @@ -140,6 +143,7 @@ struct GBVideo { bool bcpIncrement; int ocpIndex; bool ocpIncrement; + uint8_t sgbCommandHeader; uint16_t dmgPalette[4]; uint16_t palette[64]; diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index f2235c946..b76228a53 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -45,7 +45,7 @@ static void _clearScreen(struct GBVideoSoftwareRenderer* renderer) { } static void _regenerateSGBBorder(struct GBVideoSoftwareRenderer* renderer) { - int i; + int i; for (i = 0; i < 0x40; ++i) { uint16_t color; LOAD_16LE(color, 0x800 + i * 2, renderer->d.sgbMapRam); @@ -54,23 +54,24 @@ static void _regenerateSGBBorder(struct GBVideoSoftwareRenderer* renderer) { int x, y; for (y = 0; y < 224; ++y) { for (x = 0; x < 256; x += 8) { - uint16_t mapData; - LOAD_16LE(mapData, (x >> 2) + (y & ~7) * 8, renderer->d.sgbMapRam); - if (UNLIKELY(SGBBgAttributesGetTile(mapData) > 0x100)) { + if (x >= 48 && x < 208 && y >= 40 && y < 104) { continue; } + uint16_t mapData; + LOAD_16LE(mapData, (x >> 2) + (y & ~7) * 8, renderer->d.sgbMapRam); + if (UNLIKELY(SGBBgAttributesGetTile(mapData) >= 0x100)) { + continue; + } + int localY = y & 0x7; if (SGBBgAttributesIsYFlip(mapData)) { - localY = 7 - y; + localY = 7 - localY; } uint8_t tileData[4]; tileData[0] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x00]; tileData[1] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x01]; tileData[2] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x10]; tileData[3] = renderer->d.sgbCharRam[(SGBBgAttributesGetTile(mapData) * 16 + localY) * 2 + 0x11]; - if (!(tileData[0] | tileData[1] | tileData[2] | tileData[3])) { - continue; - } size_t base = y * renderer->outputBufferStride + x; int p = SGBBgAttributesGetPalette(mapData) * 0x10; @@ -97,6 +98,53 @@ static void _regenerateSGBBorder(struct GBVideoSoftwareRenderer* renderer) { } } +static inline void _setAttribute(uint8_t* sgbAttributes, unsigned x, unsigned y, int palette) { + int p = sgbAttributes[(x >> 2) + 5 * y]; + p &= ~(3 << (2 * (3 - (x & 3)))); + p |= palette << (2 * (3 - (x & 3))); + sgbAttributes[(x >> 2) + 5 * y] = p; +} + +static void _parseAttrBlock(struct GBVideoSoftwareRenderer* renderer, int start) { + uint8_t block[6]; + if (start < 0) { + memcpy(block, renderer->sgbPartialDataSet, -start); + memcpy(&block[-start], renderer->sgbPacket, 6 + start); + } else { + memcpy(block, &renderer->sgbPacket[start], 6); + } + unsigned x0 = block[2]; + unsigned x1 = block[4]; + unsigned y0 = block[3]; + unsigned y1 = block[5]; + unsigned x, y; + int pIn = block[1] & 3; + int pPerim = (block[1] >> 2) & 3; + int pOut = (block[1] >> 4) & 3; + + for (y = 0; y < GB_VIDEO_VERTICAL_PIXELS / 8; ++y) { + for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS / 8; ++x) { + if (y > y0 && y < y1 && x > x0 && x < x1) { + if (block[0] & 1) { + _setAttribute(renderer->d.sgbAttributes, x, y, pIn); + } + } else if (y < y0 || y > y1 || x < x0 || x > x1) { + if (block[0] & 4) { + _setAttribute(renderer->d.sgbAttributes, x, y, pOut); + } + } else { + if (block[0] & 2) { + _setAttribute(renderer->d.sgbAttributes, x, y, pPerim); + } else if (block[0] & 1) { + _setAttribute(renderer->d.sgbAttributes, x, y, pIn); + } else if (block[0] & 4) { + _setAttribute(renderer->d.sgbAttributes, x, y, pOut); + } + } + } + } +} + void GBVideoSoftwareRendererCreate(struct GBVideoSoftwareRenderer* renderer) { renderer->d.init = GBVideoSoftwareRendererInit; renderer->d.deinit = GBVideoSoftwareRendererDeinit; @@ -128,6 +176,14 @@ static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum G softwareRenderer->wx = 0; softwareRenderer->model = model; softwareRenderer->sgbTransfer = 0; + softwareRenderer->sgbCommandHeader = 0; + int i; + for (i = 0; i < 64; ++i) { + softwareRenderer->lookup[i] = i; + softwareRenderer->lookup[i] = i; + softwareRenderer->lookup[i] = i; + softwareRenderer->lookup[i] = i; + } } static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer) { @@ -153,6 +209,24 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* case REG_WX: softwareRenderer->wx = value; break; + case REG_BGP: + softwareRenderer->lookup[0] = value & 3; + softwareRenderer->lookup[1] = (value >> 2) & 3; + softwareRenderer->lookup[2] = (value >> 4) & 3; + softwareRenderer->lookup[3] = (value >> 6) & 3; + break; + case REG_OBP0: + softwareRenderer->lookup[0x20 + 0] = value & 3; + softwareRenderer->lookup[0x20 + 1] = (value >> 2) & 3; + softwareRenderer->lookup[0x20 + 2] = (value >> 4) & 3; + softwareRenderer->lookup[0x20 + 3] = (value >> 6) & 3; + break; + case REG_OBP1: + softwareRenderer->lookup[0x24 + 0] = value & 3; + softwareRenderer->lookup[0x24 + 1] = (value >> 2) & 3; + softwareRenderer->lookup[0x24 + 2] = (value >> 4) & 3; + softwareRenderer->lookup[0x24 + 3] = (value >> 6) & 3; + break; } return value; } @@ -160,26 +234,48 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* static void GBVideoSoftwareRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; memcpy(softwareRenderer->sgbPacket, data, sizeof(softwareRenderer->sgbPacket)); + int i; + if (!(softwareRenderer->sgbCommandHeader & 7)) { + softwareRenderer->sgbCommandHeader = data[0]; + softwareRenderer->sgbPacketId = 0; + softwareRenderer->sgbTransfer = 0; + } + --softwareRenderer->sgbCommandHeader; + ++softwareRenderer->sgbPacketId; + int set; + switch (softwareRenderer->sgbCommandHeader >> 3) { + case SGB_PAL_SET: + softwareRenderer->sgbPacket[1] = data[9]; + if (!(data[9] & 0x80)) { + break; + } + // Fall through + case SGB_ATTR_SET: + set = softwareRenderer->sgbPacket[1] & 0x3F; + if (set <= 0x2C) { + memcpy(renderer->sgbAttributes, &renderer->sgbAttributeFiles[set * 90], 90); + } + break; + case SGB_ATTR_BLK: + if (softwareRenderer->sgbPacketId == 1) { + softwareRenderer->sgbDataSets = softwareRenderer->sgbPacket[1]; + i = 2; + } else { + i = (9 - softwareRenderer->sgbPacketId) % 3 * -2; + } + for (; i <= 10 && softwareRenderer->sgbDataSets; i += 6, --softwareRenderer->sgbDataSets) { + _parseAttrBlock(softwareRenderer, i); + } + if (i < 16 && softwareRenderer->sgbDataSets) { + memcpy(softwareRenderer->sgbPartialDataSet, &softwareRenderer->sgbPacket[i], 16 - i); + } + break; + } } static void GBVideoSoftwareRendererWritePalette(struct GBVideoRenderer* renderer, int index, uint16_t value) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; -#ifdef COLOR_16_BIT -#ifdef COLOR_5_6_5 - color_t color = 0; - color |= (value & 0x001F) << 11; - color |= (value & 0x03E0) << 1; - color |= (value & 0x7C00) >> 10; -#else - color_t color = value; -#endif -#else - color_t color = 0; - color |= (value << 3) & 0xF8; - color |= (value << 6) & 0xF800; - color |= (value << 9) & 0xF80000; - color |= (color >> 5) & 0x070707; -#endif + color_t color = mColorFrom555(value); softwareRenderer->palette[index] = color; if (renderer->cache) { mTileCacheWritePalette(renderer->cache, index << 1); @@ -233,6 +329,10 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i GBVideoSoftwareRendererDrawObj(softwareRenderer, &obj[i], startX, endX, y); } } +} + +static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* renderer, int y) { + struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; size_t sgbOffset = 0; if (softwareRenderer->model == GB_MODEL_SGB) { sgbOffset = softwareRenderer->outputBufferStride * 40 + 48; @@ -241,24 +341,28 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i int x; switch (softwareRenderer->d.sgbRenderMode) { case 0: - for (x = startX; x + 7 < (endX & ~7); x += 8) { - row[x] = softwareRenderer->palette[softwareRenderer->row[x] & 0x7F]; - row[x + 1] = softwareRenderer->palette[softwareRenderer->row[x + 1] & 0x7F]; - row[x + 2] = softwareRenderer->palette[softwareRenderer->row[x + 2] & 0x7F]; - row[x + 3] = softwareRenderer->palette[softwareRenderer->row[x + 3] & 0x7F]; - row[x + 4] = softwareRenderer->palette[softwareRenderer->row[x + 4] & 0x7F]; - row[x + 5] = softwareRenderer->palette[softwareRenderer->row[x + 5] & 0x7F]; - row[x + 6] = softwareRenderer->palette[softwareRenderer->row[x + 6] & 0x7F]; - row[x + 7] = softwareRenderer->palette[softwareRenderer->row[x + 7] & 0x7F]; - } - for (; x < endX; ++x) { - row[x] = softwareRenderer->palette[softwareRenderer->row[x] & 0x7F]; + for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 8) { + int p = 0; + if (softwareRenderer->model == GB_MODEL_SGB) { + p = softwareRenderer->d.sgbAttributes[(x >> 5) + 5 * (y >> 3)]; + p >>= 6 - ((x / 4) & 0x6); + p &= 3; + p <<= 2; + } + row[x + 0] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x] & 0x7F]]; + row[x + 1] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 1] & 0x7F]]; + row[x + 2] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 2] & 0x7F]]; + row[x + 3] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 3] & 0x7F]]; + row[x + 4] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 4] & 0x7F]]; + row[x + 5] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 5] & 0x7F]]; + row[x + 6] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 6] & 0x7F]]; + row[x + 7] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 7] & 0x7F]]; } break; case 1: - return; + break; case 2: - for (x = startX; x + 7 < (endX & ~7); x += 8) { + for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 8) { row[x] = 0; row[x + 1] = 0; row[x + 2] = 0; @@ -268,12 +372,9 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i row[x + 6] = 0; row[x + 7] = 0; } - for (; x < endX; ++x) { - row[x] = 0; - } - return; + break; case 3: - for (x = startX; x + 7 < (endX & ~7); x += 8) { + for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 8) { row[x] = softwareRenderer->palette[0]; row[x + 1] = softwareRenderer->palette[0]; row[x + 2] = softwareRenderer->palette[0]; @@ -283,21 +384,19 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i row[x + 6] = softwareRenderer->palette[0]; row[x + 7] = softwareRenderer->palette[0]; } - for (; x < endX; ++x) { - row[x] = softwareRenderer->palette[0]; - } - return; + break; } -} -static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* renderer, int y) { - struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && softwareRenderer->wy <= y && softwareRenderer->wx - 7 < GB_VIDEO_HORIZONTAL_PIXELS) { ++softwareRenderer->currentWy; } if (softwareRenderer->sgbTransfer == 1) { + size_t offset = 2 * ((y & 7) + (y >> 3) * GB_VIDEO_HORIZONTAL_PIXELS); + if (offset >= 0x1000) { + return; + } uint8_t* buffer = NULL; - switch (softwareRenderer->sgbPacket[0] >> 3) { + switch (softwareRenderer->sgbCommandHeader >> 3) { case SGB_PAL_TRN: buffer = renderer->sgbPalRam; break; @@ -307,38 +406,38 @@ static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* render case SGB_PCT_TRN: buffer = renderer->sgbMapRam; break; + case SGB_ATTR_TRN: + buffer = renderer->sgbAttributeFiles; + break; default: break; } if (buffer) { - size_t offset = 2 * ((y & 7) + (y >> 3) * GB_VIDEO_HORIZONTAL_PIXELS); - if (offset < 0x1000) { - int i; - for (i = 0; i < GB_VIDEO_HORIZONTAL_PIXELS; i += 8) { - if (UNLIKELY(offset + (i << 1) + 1 >= 0x1000)) { - break; - } - uint8_t hi = 0; - uint8_t lo = 0; - hi |= (softwareRenderer->row[i + 0] & 0x2) << 6; - lo |= (softwareRenderer->row[i + 0] & 0x1) << 7; - hi |= (softwareRenderer->row[i + 1] & 0x2) << 5; - lo |= (softwareRenderer->row[i + 1] & 0x1) << 6; - hi |= (softwareRenderer->row[i + 2] & 0x2) << 4; - lo |= (softwareRenderer->row[i + 2] & 0x1) << 5; - hi |= (softwareRenderer->row[i + 3] & 0x2) << 3; - lo |= (softwareRenderer->row[i + 3] & 0x1) << 4; - hi |= (softwareRenderer->row[i + 4] & 0x2) << 2; - lo |= (softwareRenderer->row[i + 4] & 0x1) << 3; - hi |= (softwareRenderer->row[i + 5] & 0x2) << 1; - lo |= (softwareRenderer->row[i + 5] & 0x1) << 2; - hi |= (softwareRenderer->row[i + 6] & 0x2) << 0; - lo |= (softwareRenderer->row[i + 6] & 0x1) << 1; - hi |= (softwareRenderer->row[i + 7] & 0x2) >> 1; - lo |= (softwareRenderer->row[i + 7] & 0x1) >> 0; - buffer[offset + (i << 1) + 0] = lo; - buffer[offset + (i << 1) + 1] = hi; + int i; + for (i = 0; i < GB_VIDEO_HORIZONTAL_PIXELS; i += 8) { + if (UNLIKELY(offset + (i << 1) + 1 >= 0x1000)) { + break; } + uint8_t hi = 0; + uint8_t lo = 0; + hi |= (softwareRenderer->row[i + 0] & 0x2) << 6; + lo |= (softwareRenderer->row[i + 0] & 0x1) << 7; + hi |= (softwareRenderer->row[i + 1] & 0x2) << 5; + lo |= (softwareRenderer->row[i + 1] & 0x1) << 6; + hi |= (softwareRenderer->row[i + 2] & 0x2) << 4; + lo |= (softwareRenderer->row[i + 2] & 0x1) << 5; + hi |= (softwareRenderer->row[i + 3] & 0x2) << 3; + lo |= (softwareRenderer->row[i + 3] & 0x1) << 4; + hi |= (softwareRenderer->row[i + 4] & 0x2) << 2; + lo |= (softwareRenderer->row[i + 4] & 0x1) << 3; + hi |= (softwareRenderer->row[i + 5] & 0x2) << 1; + lo |= (softwareRenderer->row[i + 5] & 0x1) << 2; + hi |= (softwareRenderer->row[i + 6] & 0x2) << 0; + lo |= (softwareRenderer->row[i + 6] & 0x1) << 1; + hi |= (softwareRenderer->row[i + 7] & 0x2) >> 1; + lo |= (softwareRenderer->row[i + 7] & 0x1) >> 0; + buffer[offset + (i << 1) + 0] = lo; + buffer[offset + (i << 1) + 1] = hi; } } } @@ -355,12 +454,8 @@ static void GBVideoSoftwareRendererFinishFrame(struct GBVideoRenderer* renderer) _clearScreen(softwareRenderer); } if (softwareRenderer->model == GB_MODEL_SGB) { - switch (softwareRenderer->sgbPacket[0] >> 3) { + switch (softwareRenderer->sgbCommandHeader >> 3) { case SGB_PAL_SET: - if (softwareRenderer->sgbPacket[9] & 0x40) { - renderer->sgbRenderMode = 0; - } - break; case SGB_ATTR_SET: if (softwareRenderer->sgbPacket[1] & 0x40) { renderer->sgbRenderMode = 0; @@ -373,10 +468,11 @@ static void GBVideoSoftwareRendererFinishFrame(struct GBVideoRenderer* renderer) // Make sure every buffer sees this if we're multibuffering _regenerateSGBBorder(softwareRenderer); } + // Fall through + case SGB_ATTR_TRN: ++softwareRenderer->sgbTransfer; if (softwareRenderer->sgbTransfer == 5) { - softwareRenderer->sgbTransfer = 0; - softwareRenderer->sgbPacket[0] = 0; + softwareRenderer->sgbCommandHeader = 0; } default: break; diff --git a/src/gb/video.c b/src/gb/video.c index 61d38c0fd..840689e7f 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -75,6 +75,8 @@ void GBVideoInit(struct GBVideo* video) { video->renderer->sgbCharRam = NULL; video->renderer->sgbMapRam = NULL; video->renderer->sgbPalRam = NULL; + video->renderer->sgbAttributes = NULL; + video->renderer->sgbAttributeFiles = NULL; } void GBVideoReset(struct GBVideo* video) { @@ -100,10 +102,40 @@ void GBVideoReset(struct GBVideo* video) { video->renderer->sgbCharRam = anonymousMemoryMap(SGB_SIZE_CHAR_RAM); video->renderer->sgbMapRam = anonymousMemoryMap(SGB_SIZE_MAP_RAM); video->renderer->sgbPalRam = anonymousMemoryMap(SGB_SIZE_PAL_RAM); + video->renderer->sgbAttributeFiles = anonymousMemoryMap(SGB_SIZE_ATF_RAM); + video->renderer->sgbAttributes = malloc(90 * 45); + memset(video->renderer->sgbAttributes, 0, 90 * 45); + video->sgbCommandHeader = 0; } + video->palette[0] = video->dmgPalette[0]; + video->palette[1] = video->dmgPalette[1]; + video->palette[2] = video->dmgPalette[2]; + video->palette[3] = video->dmgPalette[3]; + video->palette[8 * 4 + 0] = video->dmgPalette[0]; + video->palette[8 * 4 + 1] = video->dmgPalette[1]; + video->palette[8 * 4 + 2] = video->dmgPalette[2]; + video->palette[8 * 4 + 3] = video->dmgPalette[3]; + video->palette[9 * 4 + 0] = video->dmgPalette[0]; + video->palette[9 * 4 + 1] = video->dmgPalette[1]; + video->palette[9 * 4 + 2] = video->dmgPalette[2]; + video->palette[9 * 4 + 3] = video->dmgPalette[3]; + video->renderer->deinit(video->renderer); video->renderer->init(video->renderer, video->p->model); + + video->renderer->writePalette(video->renderer, 0, video->palette[0]); + video->renderer->writePalette(video->renderer, 1, video->palette[1]); + video->renderer->writePalette(video->renderer, 2, video->palette[2]); + video->renderer->writePalette(video->renderer, 3, video->palette[3]); + video->renderer->writePalette(video->renderer, 8 * 4 + 0, video->palette[8 * 4 + 0]); + video->renderer->writePalette(video->renderer, 8 * 4 + 1, video->palette[8 * 4 + 1]); + video->renderer->writePalette(video->renderer, 8 * 4 + 2, video->palette[8 * 4 + 2]); + video->renderer->writePalette(video->renderer, 8 * 4 + 3, video->palette[8 * 4 + 3]); + video->renderer->writePalette(video->renderer, 9 * 4 + 0, video->palette[9 * 4 + 0]); + video->renderer->writePalette(video->renderer, 9 * 4 + 1, video->palette[9 * 4 + 1]); + video->renderer->writePalette(video->renderer, 9 * 4 + 2, video->palette[9 * 4 + 2]); + video->renderer->writePalette(video->renderer, 9 * 4 + 3, video->palette[9 * 4 + 3]); } void GBVideoDeinit(struct GBVideo* video) { @@ -121,6 +153,14 @@ void GBVideoDeinit(struct GBVideo* video) { mappedMemoryFree(video->renderer->sgbPalRam, SGB_SIZE_PAL_RAM); video->renderer->sgbPalRam = NULL; } + if (video->renderer->sgbAttributeFiles) { + mappedMemoryFree(video->renderer->sgbAttributeFiles, SGB_SIZE_ATF_RAM); + video->renderer->sgbAttributeFiles = NULL; + } + if (video->renderer->sgbAttributes) { + free(video->renderer->sgbAttributes); + video->renderer->sgbAttributes = NULL; + } } void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* renderer) { @@ -130,6 +170,8 @@ void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* ren renderer->sgbCharRam = video->renderer->sgbCharRam; renderer->sgbMapRam = video->renderer->sgbMapRam; renderer->sgbPalRam = video->renderer->sgbPalRam; + renderer->sgbAttributeFiles = video->renderer->sgbAttributeFiles; + renderer->sgbAttributes = video->renderer->sgbAttributes; video->renderer = renderer; renderer->vram = video->vram; video->renderer->init(video->renderer, video->p->model); @@ -419,7 +461,7 @@ void GBVideoWriteLYC(struct GBVideo* video, uint8_t value) { } void GBVideoWritePalette(struct GBVideo* video, uint16_t address, uint8_t value) { - if (video->p->model < GB_MODEL_CGB) { + if (video->p->model < GB_MODEL_SGB) { switch (address) { case REG_BGP: video->palette[0] = video->dmgPalette[value & 3]; @@ -452,6 +494,8 @@ void GBVideoWritePalette(struct GBVideo* video, uint16_t address, uint8_t value) video->renderer->writePalette(video->renderer, 9 * 4 + 3, video->palette[9 * 4 + 3]); break; } + } else if (video->p->model == GB_MODEL_SGB) { + video->renderer->writeVideoRegister(video->renderer, address, value); } else { switch (address) { case REG_BCPD: @@ -506,7 +550,12 @@ void GBVideoSetPalette(struct GBVideo* video, unsigned index, uint32_t color) { } void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { - switch (data[0] >> 3) { + int i; + if (!(video->sgbCommandHeader & 7)) { + video->sgbCommandHeader = data[0]; + } + --video->sgbCommandHeader; + switch (video->sgbCommandHeader >> 3) { case SGB_PAL01: video->palette[0] = data[1] | (data[2] << 8); video->palette[1] = data[3] | (data[4] << 8); @@ -516,13 +565,17 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->palette[17] = data[9] | (data[10] << 8); video->palette[18] = data[11] | (data[12] << 8); video->palette[19] = data[13] | (data[14] << 8); + video->renderer->writePalette(video->renderer, 0, video->palette[0]); video->renderer->writePalette(video->renderer, 1, video->palette[1]); video->renderer->writePalette(video->renderer, 2, video->palette[2]); video->renderer->writePalette(video->renderer, 3, video->palette[3]); + video->renderer->writePalette(video->renderer, 16, video->palette[0]); video->renderer->writePalette(video->renderer, 17, video->palette[17]); video->renderer->writePalette(video->renderer, 18, video->palette[18]); video->renderer->writePalette(video->renderer, 19, video->palette[19]); + video->renderer->writePalette(video->renderer, 32, video->palette[0]); + video->renderer->writePalette(video->renderer, 48, video->palette[0]); break; case SGB_PAL23: video->palette[32] = data[1] | (data[2] << 8); @@ -533,7 +586,6 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->palette[49] = data[9] | (data[10] << 8); video->palette[50] = data[11] | (data[12] << 8); video->palette[51] = data[13] | (data[14] << 8); - video->renderer->writePalette(video->renderer, 32, video->palette[32]); video->renderer->writePalette(video->renderer, 33, video->palette[33]); video->renderer->writePalette(video->renderer, 34, video->palette[34]); video->renderer->writePalette(video->renderer, 35, video->palette[35]); @@ -547,6 +599,7 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->palette[2] = data[5] | (data[6] << 8); video->palette[3] = data[7] | (data[8] << 8); + video->palette[48] = data[1] | (data[2] << 8); video->palette[49] = data[9] | (data[10] << 8); video->palette[50] = data[11] | (data[12] << 8); video->palette[51] = data[13] | (data[14] << 8); @@ -554,6 +607,9 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->renderer->writePalette(video->renderer, 1, video->palette[1]); video->renderer->writePalette(video->renderer, 2, video->palette[2]); video->renderer->writePalette(video->renderer, 3, video->palette[3]); + video->renderer->writePalette(video->renderer, 16, video->palette[0]); + video->renderer->writePalette(video->renderer, 32, video->palette[0]); + video->renderer->writePalette(video->renderer, 48, video->palette[0]); video->renderer->writePalette(video->renderer, 49, video->palette[49]); video->renderer->writePalette(video->renderer, 50, video->palette[50]); video->renderer->writePalette(video->renderer, 51, video->palette[51]); @@ -567,7 +623,6 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->palette[33] = data[9] | (data[10] << 8); video->palette[34] = data[11] | (data[12] << 8); video->palette[35] = data[13] | (data[14] << 8); - video->renderer->writePalette(video->renderer, 16, video->palette[16]); video->renderer->writePalette(video->renderer, 17, video->palette[17]); video->renderer->writePalette(video->renderer, 18, video->palette[18]); video->renderer->writePalette(video->renderer, 19, video->palette[19]); @@ -575,19 +630,35 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->renderer->writePalette(video->renderer, 34, video->palette[34]); video->renderer->writePalette(video->renderer, 35, video->palette[35]); break; + case SGB_PAL_SET: + for (i = 0; i < 4; ++i) { + uint16_t entry = (data[2 + (i * 2)] << 8) | data[1 + (i * 2)]; + if (entry >= 0x200) { + mLOG(GB, STUB, "Unimplemented SGB palette overflow: %03X", entry); + continue; + } + LOAD_16LE(video->palette[i * 4 + 0], entry * 8 + 0, video->renderer->sgbPalRam); + video->renderer->writePalette(video->renderer, i * 4 + 0, video->palette[0]); + LOAD_16LE(video->palette[i * 4 + 1], entry * 8 + 2, video->renderer->sgbPalRam); + video->renderer->writePalette(video->renderer, i * 4 + 1, video->palette[i * 4 + 1]); + LOAD_16LE(video->palette[i * 4 + 2], entry * 8 + 4, video->renderer->sgbPalRam); + video->renderer->writePalette(video->renderer, i * 4 + 2, video->palette[i * 4 + 2]); + LOAD_16LE(video->palette[i * 4 + 3], entry * 8 + 6, video->renderer->sgbPalRam); + video->renderer->writePalette(video->renderer, i * 4 + 3, video->palette[i * 4 + 3]); + } + break; + case SGB_ATTR_BLK: + case SGB_PAL_TRN: + case SGB_CHR_TRN: + case SGB_PCT_TRN: + case SGB_ATTR_TRN: + case SGB_ATTR_SET: + break; case SGB_MLT_REG: return; case SGB_MASK_EN: video->renderer->sgbRenderMode = data[1] & 0x3; break; - case SGB_PAL_TRN: - case SGB_CHR_TRN: - case SGB_PCT_TRN: - break; - case SGB_PAL_SET: - case SGB_ATTR_SET: - mLOG(GB, STUB, "Unimplemented SGB command: %02X", data[0] >> 3); - break; default: mLOG(GB, STUB, "Unimplemented SGB command: %02X", data[0] >> 3); return; diff --git a/src/gba/renderers/software-bg.c b/src/gba/renderers/software-bg.c index f22a3a589..93c30a87e 100644 --- a/src/gba/renderers/software-bg.c +++ b/src/gba/renderers/software-bg.c @@ -5,6 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "gba/renderers/software-private.h" +#include #include #define MODE_2_COORD_OVERFLOW \ @@ -101,6 +102,7 @@ void GBAVideoSoftwareRendererDrawBackgroundMode3(struct GBAVideoSoftwareRenderer if (!mosaicWait) { LOAD_16(color, ((localX >> 8) + (localY >> 8) * VIDEO_HORIZONTAL_PIXELS) << 1, renderer->d.vram); + color = mColorFrom555(color); #ifndef COLOR_16_BIT unsigned color32; color32 = 0; diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 70dac8811..9898fa9ae 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -359,22 +359,7 @@ static void GBAVideoSoftwareRendererWriteOAM(struct GBAVideoRenderer* renderer, static void GBAVideoSoftwareRendererWritePalette(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; -#ifdef COLOR_16_BIT -#ifdef COLOR_5_6_5 - unsigned color = 0; - color |= (value & 0x001F) << 11; - color |= (value & 0x03E0) << 1; - color |= (value & 0x7C00) >> 10; -#else - unsigned color = value; -#endif -#else - unsigned color = 0; - color |= (value << 3) & 0xF8; - color |= (value << 6) & 0xF800; - color |= (value << 9) & 0xF80000; - color |= (color >> 5) & 0x070707; -#endif + color_t color = mColorFrom555(value); softwareRenderer->normalPalette[address >> 1] = color; if (softwareRenderer->blendEffect == BLEND_BRIGHTEN) { softwareRenderer->variantPalette[address >> 1] = _brighten(color, softwareRenderer->bldy); diff --git a/src/platform/python/_builder.h b/src/platform/python/_builder.h index 19842c402..2dc4f7b5a 100644 --- a/src/platform/python/_builder.h +++ b/src/platform/python/_builder.h @@ -14,6 +14,8 @@ #define CXX_GUARD_START #define CXX_GUARD_END +#define PYCPARSE + typedef int... time_t; typedef int... off_t; typedef ... va_list; @@ -24,7 +26,6 @@ typedef ...* png_unknown_chunkp; void free(void*); #include -#undef const #include "flags.h" diff --git a/src/platform/sdl/gl-sdl.c b/src/platform/sdl/gl-sdl.c index d4fd0ff01..5504673d1 100644 --- a/src/platform/sdl/gl-sdl.c +++ b/src/platform/sdl/gl-sdl.c @@ -33,7 +33,7 @@ void mSDLGLCreate(struct mSDLRenderer* renderer) { bool mSDLGLInit(struct mSDLRenderer* renderer) { mSDLGLCommonInit(renderer); - size_t size = toPow2(renderer->width) * renderer->height * BYTES_PER_PIXEL; + size_t size = toPow2(renderer->width) * toPow2(renderer->height) * BYTES_PER_PIXEL; renderer->outputBuffer = malloc(size); memset(renderer->outputBuffer, 0, size); renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, toPow2(renderer->width)); @@ -67,9 +67,9 @@ void mSDLGLRunloop(struct mSDLRenderer* renderer, void* user) { renderer->player.windowUpdated = 0; } #endif - if (renderer->width != v->width || renderer->height != v->height) { - renderer->gl.d.setDimensions(&renderer->gl.d, renderer->width, renderer->height); - } + } + if (renderer->width != v->width || renderer->height != v->height) { + v->setDimensions(v, renderer->width, renderer->height); } if (mCoreSyncWaitFrameStart(&context->impl->sync)) { diff --git a/src/platform/sdl/gles2-sdl.c b/src/platform/sdl/gles2-sdl.c index b80ab33c5..81daa0f90 100644 --- a/src/platform/sdl/gles2-sdl.c +++ b/src/platform/sdl/gles2-sdl.c @@ -98,7 +98,7 @@ bool mSDLGLES2Init(struct mSDLRenderer* renderer) { mSDLGLCommonInit(renderer); #endif - size_t size = toPow2(renderer->width) * renderer->height * BYTES_PER_PIXEL; + size_t size = toPow2(renderer->width) * toPow2(renderer->height) * BYTES_PER_PIXEL; #ifndef __APPLE__ renderer->outputBuffer = memalign(16, size); #else From 6ab7e178be1cd076965b035276e66491c41ee454 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 14:47:46 -0700 Subject: [PATCH 045/158] Qt: Fix up OverrideView a bit --- src/platform/qt/OverrideView.cpp | 36 ++++++++------------------------ src/platform/qt/OverrideView.h | 1 - 2 files changed, 9 insertions(+), 28 deletions(-) diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index ac380cc9c..fed38926d 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -66,18 +66,6 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) m_ui.hwRumble->setEnabled(!enabled); }); - connect(m_ui.savetype, &QComboBox::currentTextChanged, this, &OverrideView::updateOverrides); - connect(m_ui.hwAutodetect, &QAbstractButton::clicked, this, &OverrideView::updateOverrides); - connect(m_ui.hwRTC, &QAbstractButton::clicked, this, &OverrideView::updateOverrides); - connect(m_ui.hwGyro, &QAbstractButton::clicked, this, &OverrideView::updateOverrides); - connect(m_ui.hwLight, &QAbstractButton::clicked, this, &OverrideView::updateOverrides); - connect(m_ui.hwTilt, &QAbstractButton::clicked, this, &OverrideView::updateOverrides); - connect(m_ui.hwRumble, &QAbstractButton::clicked, this, &OverrideView::updateOverrides); - connect(m_ui.hwGBPlayer, &QAbstractButton::clicked, this, &OverrideView::updateOverrides); - - connect(m_ui.gbModel, &QComboBox::currentTextChanged, this, &OverrideView::updateOverrides); - connect(m_ui.mbc, &QComboBox::currentTextChanged, this, &OverrideView::updateOverrides); - m_colorPickers[0] = ColorPicker(m_ui.color0, QColor(0xF8, 0xF8, 0xF8)); m_colorPickers[1] = ColorPicker(m_ui.color1, QColor(0xA8, 0xA8, 0xA8)); m_colorPickers[2] = ColorPicker(m_ui.color2, QColor(0x50, 0x50, 0x50)); @@ -85,11 +73,9 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) for (int colorId = 0; colorId < 4; ++colorId) { connect(&m_colorPickers[colorId], &ColorPicker::colorChanged, this, [this, colorId](const QColor& color) { m_gbColors[colorId] = color.rgb(); - updateOverrides(); }); } - connect(m_ui.tabWidget, &QTabWidget::currentChanged, this, &OverrideView::updateOverrides); #ifndef M_CORE_GBA m_ui.tabWidget->removeTab(m_ui.tabWidget->indexOf(m_ui.tabGBA)); #endif @@ -104,13 +90,9 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) void OverrideView::setController(std::shared_ptr controller) { m_controller = controller; - gameStarted(); + connect(controller.get(), &CoreController::started, this, &OverrideView::gameStarted); connect(controller.get(), &CoreController::stopping, this, &OverrideView::gameStopped); - if (m_override) { - m_controller->setOverride(std::move(m_override)); - } else { - m_controller->clearOverride(); - } + updateOverrides(); } void OverrideView::saveOverride() { @@ -121,6 +103,9 @@ void OverrideView::saveOverride() { } void OverrideView::updateOverrides() { + if (!m_controller) { + return; + } #ifdef M_CORE_GBA if (m_ui.tabWidget->currentWidget() == m_ui.tabGBA) { std::unique_ptr gba(new GBAOverride); @@ -158,12 +143,11 @@ void OverrideView::updateOverrides() { gba->override.idleLoop = parsedIdleLoop; } - if (gba->override.savetype != SAVEDATA_AUTODETECT || gba->override.hardware != HW_NO_OVERRIDE || gba->override.idleLoop != IDLE_LOOP_NONE) { - m_override = std::move(gba); + m_controller->setOverride(std::move(gba)); } else { - m_override.reset(); + m_controller->clearOverride(); } } #endif @@ -179,9 +163,9 @@ void OverrideView::updateOverrides() { bool hasOverride = gb->override.mbc != GB_MBC_AUTODETECT || gb->override.model != GB_MODEL_AUTODETECT; hasOverride = hasOverride || (m_gbColors[0] | m_gbColors[1] | m_gbColors[2] | m_gbColors[3]); if (hasOverride) { - m_override = std::move(gb); + m_controller->setOverride(std::move(gb)); } else { - m_override.reset(); + m_controller->clearOverride(); } } #endif @@ -248,6 +232,4 @@ void OverrideView::gameStopped() { m_ui.mbc->setCurrentIndex(0); m_ui.gbModel->setCurrentIndex(0); - - updateOverrides(); } diff --git a/src/platform/qt/OverrideView.h b/src/platform/qt/OverrideView.h index e9d6b80c3..5fa62f2ee 100644 --- a/src/platform/qt/OverrideView.h +++ b/src/platform/qt/OverrideView.h @@ -47,7 +47,6 @@ private: Ui::OverrideView m_ui; std::shared_ptr m_controller; - std::unique_ptr m_override; ConfigController* m_config; #ifdef M_CORE_GB From f61c0ce02f47218f795803e0fc1562a35fd84411 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 17:00:29 -0700 Subject: [PATCH 046/158] GB: Support SGB boot ROM --- include/mgba/gb/interface.h | 10 ++++---- src/gb/core.c | 15 ++++++++++-- src/gb/overrides.c | 11 ++++++++- src/platform/qt/SettingsView.cpp | 6 +++++ src/platform/qt/SettingsView.ui | 40 +++++++++++++++++++++++++++----- 5 files changed, 69 insertions(+), 13 deletions(-) diff --git a/include/mgba/gb/interface.h b/include/mgba/gb/interface.h index 73996746c..77e7eef17 100644 --- a/include/mgba/gb/interface.h +++ b/include/mgba/gb/interface.h @@ -12,10 +12,12 @@ CXX_GUARD_START enum GBModel { GB_MODEL_AUTODETECT = 0xFF, - GB_MODEL_DMG = 0x00, - GB_MODEL_SGB = 0x40, - GB_MODEL_CGB = 0x80, - GB_MODEL_AGB = 0xC0 + GB_MODEL_DMG = 0x00, + GB_MODEL_SGB = 0x20, + GB_MODEL_MGB = 0x40, + GB_MODEL_SGB2 = 0x60, + GB_MODEL_CGB = 0x80, + GB_MODEL_AGB = 0xC0 }; enum GBMemoryBankControllerType { diff --git a/src/gb/core.c b/src/gb/core.c index aa2b61e87..a90479d86 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -181,6 +181,7 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf } mCoreConfigCopyValue(&core->config, config, "gb.bios"); + mCoreConfigCopyValue(&core->config, config, "sgb.bios"); mCoreConfigCopyValue(&core->config, config, "gbc.bios"); #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 @@ -345,9 +346,13 @@ static void _GBCoreReset(struct mCore* core) { switch (gb->model) { case GB_MODEL_DMG: - case GB_MODEL_SGB: // TODO + case GB_MODEL_MGB: // TODO configPath = mCoreConfigGetValue(&core->config, "gb.bios"); break; + case GB_MODEL_SGB: + case GB_MODEL_SGB2: // TODO + configPath = mCoreConfigGetValue(&core->config, "sgb.bios"); + break; case GB_MODEL_CGB: case GB_MODEL_AGB: configPath = mCoreConfigGetValue(&core->config, "gbc.bios"); @@ -370,9 +375,13 @@ static void _GBCoreReset(struct mCore* core) { mCoreConfigDirectory(path, PATH_MAX); switch (gb->model) { case GB_MODEL_DMG: - case GB_MODEL_SGB: // TODO + case GB_MODEL_MGB: // TODO strncat(path, PATH_SEP "gb_bios.bin", PATH_MAX - strlen(path)); break; + case GB_MODEL_SGB: + case GB_MODEL_SGB2: // TODO + strncat(path, PATH_SEP "sgb_bios.bin", PATH_MAX - strlen(path)); + break; case GB_MODEL_CGB: case GB_MODEL_AGB: strncat(path, PATH_SEP "gbc_bios.bin", PATH_MAX - strlen(path)); @@ -566,7 +575,9 @@ size_t _GBListMemoryBlocks(const struct mCore* core, const struct mCoreMemoryBlo const struct GB* gb = core->board; switch (gb->model) { case GB_MODEL_DMG: + case GB_MODEL_MGB: case GB_MODEL_SGB: + case GB_MODEL_SGB2: default: *blocks = _GBMemoryBlocks; return sizeof(_GBMemoryBlocks) / sizeof(*_GBMemoryBlocks); diff --git a/src/gb/overrides.c b/src/gb/overrides.c index 8efd4c1b9..63adadf0b 100644 --- a/src/gb/overrides.c +++ b/src/gb/overrides.c @@ -57,7 +57,10 @@ bool GBOverrideFind(const struct Configuration* config, struct GBCartridgeOverri override->model = GB_MODEL_SGB; } else if (strcasecmp(model, "MGB") == 0) { found = true; - override->model = GB_MODEL_DMG; // TODO + override->model = GB_MODEL_MGB; + } else if (strcasecmp(model, "SGB2") == 0) { + found = true; + override->model = GB_MODEL_SGB2; } } @@ -99,6 +102,12 @@ void GBOverrideSave(struct Configuration* config, const struct GBCartridgeOverri case GB_MODEL_SGB: model = "SGB"; break; + case GB_MODEL_MGB: + model = "MGB"; + break; + case GB_MODEL_SGB2: + model = "SGB2"; + break; case GB_MODEL_CGB: model = "CGB"; break; diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index 4dd9bc143..7102ad767 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -159,6 +159,9 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC connect(m_ui.gbcBiosBrowse, &QPushButton::clicked, [this]() { selectBios(m_ui.gbcBios); }); + connect(m_ui.sgbBiosBrowse, &QPushButton::clicked, [this]() { + selectBios(m_ui.sgbBios); + }); QList defaultColors; defaultColors.append(QColor(0xF8, 0xF8, 0xF8)); @@ -190,6 +193,7 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC #else m_ui.gbBiosBrowse->hide(); m_ui.gbcBiosBrowse->hide(); + m_ui.sgbBiosBrowse->hide(); m_ui.gb->hide(); #endif @@ -275,6 +279,7 @@ void SettingsView::updateConfig() { saveSetting("gba.bios", m_ui.gbaBios); saveSetting("gb.bios", m_ui.gbBios); saveSetting("gbc.bios", m_ui.gbcBios); + saveSetting("sgb.bios", m_ui.sgbBios); saveSetting("useBios", m_ui.useBios); saveSetting("skipBios", m_ui.skipBios); saveSetting("audioBuffers", m_ui.audioBufferSize); @@ -377,6 +382,7 @@ void SettingsView::reloadConfig() { loadSetting("gba.bios", m_ui.gbaBios); loadSetting("gb.bios", m_ui.gbBios); loadSetting("gbc.bios", m_ui.gbcBios); + loadSetting("sgb.bios", m_ui.sgbBios); loadSetting("useBios", m_ui.useBios); loadSetting("skipBios", m_ui.skipBios); loadSetting("audioBuffers", m_ui.audioBufferSize); diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index 6a2379302..7b2510018 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -748,7 +748,7 @@ - + Use BIOS file if found @@ -758,14 +758,14 @@ - + Skip BIOS intro - + @@ -786,21 +786,21 @@ - + GBA BIOS file: - + GBC BIOS file: - + @@ -821,6 +821,34 @@ + + + + SGB BIOS file: + + + + + + + + + + 0 + 0 + + + + + + + + Browse + + + + + From ec25074cec84c82e4105a6b84e8779b1cf3a937e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 18:17:51 -0700 Subject: [PATCH 047/158] GBA Video: Mark scanlines as dirty if they need to be updated --- .../internal/gba/renderers/video-software.h | 4 + src/gba/core.c | 1 + src/gba/memory.c | 77 ++++++++---- src/gba/renderers/video-software.c | 116 +++++++++++++----- 4 files changed, 146 insertions(+), 52 deletions(-) diff --git a/include/mgba/internal/gba/renderers/video-software.h b/include/mgba/internal/gba/renderers/video-software.h index 853a6f335..c6a0c7781 100644 --- a/include/mgba/internal/gba/renderers/video-software.h +++ b/include/mgba/internal/gba/renderers/video-software.h @@ -11,6 +11,7 @@ CXX_GUARD_START #include +#include #include struct GBAVideoSoftwareSprite { @@ -157,6 +158,9 @@ struct GBAVideoSoftwareRenderer { int oamMax; struct GBAVideoSoftwareSprite sprites[128]; + uint32_t scanlineDirty[5]; + uint16_t ioCache[REG_SOUND1CNT_LO]; + int start; int end; }; diff --git a/src/gba/core.c b/src/gba/core.c index 695f842b6..1940d6418 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -258,6 +258,7 @@ static void _GBACoreSetVideoBuffer(struct mCore* core, color_t* buffer, size_t s struct GBACore* gbacore = (struct GBACore*) core; gbacore->renderer.outputBuffer = buffer; gbacore->renderer.outputBufferStride = stride; + memset(gbacore->renderer.scanlineDirty, 0xFFFFFFFF, sizeof(gbacore->renderer.scanlineDirty)); } static void _GBACoreGetPixels(struct mCore* core, const void** buffer, size_t* stride) { diff --git a/src/gba/memory.c b/src/gba/memory.c index 8b407fa09..5b81f1963 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -683,27 +683,39 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { GBAIOWrite32(gba, address & (OFFSET_MASK - 3), value); #define STORE_PALETTE_RAM \ - STORE_32(value, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); \ - gba->video.renderer->writePalette(gba->video.renderer, (address & (SIZE_PALETTE_RAM - 4)) + 2, value >> 16); \ - wait += waitstatesRegion[REGION_PALETTE_RAM]; \ - gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 4), value); + LOAD_32(oldValue, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); \ + if (oldValue != value) { \ + STORE_32(value, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); \ + gba->video.renderer->writePalette(gba->video.renderer, (address & (SIZE_PALETTE_RAM - 4)) + 2, value >> 16); \ + gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 4), value); \ + } \ + wait += waitstatesRegion[REGION_PALETTE_RAM]; #define STORE_VRAM \ if ((address & 0x0001FFFF) < SIZE_VRAM) { \ - STORE_32(value, address & 0x0001FFFC, gba->video.vram); \ - gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC) + 2); \ - gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC)); \ + LOAD_32(oldValue, address & 0x0001FFFC, gba->video.vram); \ + if (oldValue != value) { \ + STORE_32(value, address & 0x0001FFFC, gba->video.vram); \ + gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC) + 2); \ + gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC)); \ + } \ } else { \ - STORE_32(value, address & 0x00017FFC, gba->video.vram); \ - gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x00017FFC) + 2); \ - gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x00017FFC)); \ + LOAD_32(oldValue, address & 0x00017FFC, gba->video.vram); \ + if (oldValue != value) { \ + STORE_32(value, address & 0x00017FFC, gba->video.vram); \ + gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x00017FFC) + 2); \ + gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x00017FFC)); \ + } \ } \ wait += waitstatesRegion[REGION_VRAM]; #define STORE_OAM \ - STORE_32(value, address & (SIZE_OAM - 4), gba->video.oam.raw); \ - gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 4)) >> 1); \ - gba->video.renderer->writeOAM(gba->video.renderer, ((address & (SIZE_OAM - 4)) >> 1) + 1); + LOAD_32(oldValue, address & (SIZE_OAM - 4), gba->video.oam.raw); \ + if (oldValue != value) { \ + STORE_32(value, address & (SIZE_OAM - 4), gba->video.oam.raw); \ + gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 4)) >> 1); \ + gba->video.renderer->writeOAM(gba->video.renderer, ((address & (SIZE_OAM - 4)) >> 1) + 1); \ + } #define STORE_CART \ wait += waitstatesRegion[address >> BASE_OFFSET]; \ @@ -726,6 +738,7 @@ void GBAStore32(struct ARMCore* cpu, uint32_t address, int32_t value, int* cycle struct GBA* gba = (struct GBA*) cpu->master; struct GBAMemory* memory = &gba->memory; int wait = 0; + int32_t oldValue; char* waitstatesRegion = memory->waitstatesNonseq32; switch (address >> BASE_OFFSET) { @@ -777,6 +790,7 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle struct GBA* gba = (struct GBA*) cpu->master; struct GBAMemory* memory = &gba->memory; int wait = 0; + int16_t oldValue; switch (address >> BASE_OFFSET) { case REGION_WORKING_RAM: @@ -790,21 +804,33 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle GBAIOWrite(gba, address & (OFFSET_MASK - 1), value); break; case REGION_PALETTE_RAM: - STORE_16(value, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); - gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 2), value); + LOAD_16(oldValue, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); + if (oldValue != value) { + STORE_16(value, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); + gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 2), value); + } break; case REGION_VRAM: if ((address & 0x0001FFFF) < SIZE_VRAM) { - STORE_16(value, address & 0x0001FFFE, gba->video.vram); - gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x0001FFFE); + LOAD_16(oldValue, address & 0x0001FFFE, gba->video.vram); + if (value != oldValue) { + STORE_16(value, address & 0x0001FFFE, gba->video.vram); + gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x0001FFFE); + } } else { - STORE_16(value, address & 0x00017FFE, gba->video.vram); - gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x00017FFE); + LOAD_16(oldValue, address & 0x00017FFE, gba->video.vram); + if (value != oldValue) { + STORE_16(value, address & 0x00017FFE, gba->video.vram); + gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x00017FFE); + } } break; case REGION_OAM: - STORE_16(value, address & (SIZE_OAM - 2), gba->video.oam.raw); - gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 2)) >> 1); + LOAD_16(oldValue, address & (SIZE_OAM - 2), gba->video.oam.raw); + if (value != oldValue) { + STORE_16(value, address & (SIZE_OAM - 2), gba->video.oam.raw); + gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 2)) >> 1); + } break; case REGION_CART0: if (memory->hw.devices != HW_NONE && IS_GPIO_REGISTER(address & 0xFFFFFE)) { @@ -844,6 +870,7 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo struct GBA* gba = (struct GBA*) cpu->master; struct GBAMemory* memory = &gba->memory; int wait = 0; + uint16_t oldValue; switch (address >> BASE_OFFSET) { case REGION_WORKING_RAM: @@ -865,8 +892,11 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo mLOG(GBA_MEM, GAME_ERROR, "Cannot Store8 to OBJ: 0x%08X", address); break; } - gba->video.renderer->vram[(address & 0x1FFFE) >> 1] = ((uint8_t) value) | (value << 8); - gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x0001FFFE); + oldValue = gba->video.renderer->vram[(address & 0x1FFFE) >> 1]; + if (oldValue != (((uint8_t) value) | (value << 8))) { + gba->video.renderer->vram[(address & 0x1FFFE) >> 1] = ((uint8_t) value) | (value << 8); + gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x0001FFFE); + } break; case REGION_OAM: mLOG(GBA_MEM, GAME_ERROR, "Cannot Store8 to OAM: 0x%08X", address); @@ -1369,6 +1399,7 @@ uint32_t GBAStoreMultiple(struct ARMCore* cpu, uint32_t address, int mask, enum struct GBA* gba = (struct GBA*) cpu->master; struct GBAMemory* memory = &gba->memory; uint32_t value; + uint32_t oldValue; char* waitstatesRegion = memory->waitstatesSeq32; int i; diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 9898fa9ae..11b8b7515 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -26,10 +26,6 @@ static void GBAVideoSoftwareRendererPutPixels(struct GBAVideoRenderer* renderer, static void GBAVideoSoftwareRendererUpdateDISPCNT(struct GBAVideoSoftwareRenderer* renderer); static void GBAVideoSoftwareRendererWriteBGCNT(struct GBAVideoSoftwareRenderer* renderer, struct GBAVideoSoftwareBackground* bg, uint16_t value); -static void GBAVideoSoftwareRendererWriteBGPA(struct GBAVideoSoftwareBackground* bg, uint16_t value); -static void GBAVideoSoftwareRendererWriteBGPB(struct GBAVideoSoftwareBackground* bg, uint16_t value); -static void GBAVideoSoftwareRendererWriteBGPC(struct GBAVideoSoftwareBackground* bg, uint16_t value); -static void GBAVideoSoftwareRendererWriteBGPD(struct GBAVideoSoftwareBackground* bg, uint16_t value); static void GBAVideoSoftwareRendererWriteBGX_LO(struct GBAVideoSoftwareBackground* bg, uint16_t value); static void GBAVideoSoftwareRendererWriteBGX_HI(struct GBAVideoSoftwareBackground* bg, uint16_t value); static void GBAVideoSoftwareRendererWriteBGY_LO(struct GBAVideoSoftwareBackground* bg, uint16_t value); @@ -112,6 +108,9 @@ static void GBAVideoSoftwareRendererReset(struct GBAVideoRenderer* renderer) { softwareRenderer->mosaic = 0; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + memset(softwareRenderer->ioCache, 0, sizeof(softwareRenderer->ioCache)); + for (i = 0; i < 4; ++i) { struct GBAVideoSoftwareBackground* bg = &softwareRenderer->bg[i]; bg->index = i; @@ -145,106 +144,162 @@ static void GBAVideoSoftwareRendererDeinit(struct GBAVideoRenderer* renderer) { static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; + if (softwareRenderer->ioCache[address >> 1] == value) { + return value; + } switch (address) { case REG_DISPCNT: softwareRenderer->dispcnt = value; GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG0CNT: value &= 0xDFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[0], value); + if (softwareRenderer->bg[0].enabled) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG1CNT: value &= 0xDFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[1], value); + if (softwareRenderer->bg[1].enabled) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG2CNT: value &= 0xFFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[2], value); + if (softwareRenderer->bg[2].enabled) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG3CNT: value &= 0xFFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[3], value); + if (softwareRenderer->bg[3].enabled) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG0HOFS: value &= 0x01FF; softwareRenderer->bg[0].x = value; + if (softwareRenderer->bg[0].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG0VOFS: value &= 0x01FF; softwareRenderer->bg[0].y = value; + if (softwareRenderer->bg[0].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG1HOFS: value &= 0x01FF; softwareRenderer->bg[1].x = value; + if (softwareRenderer->bg[1].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG1VOFS: value &= 0x01FF; softwareRenderer->bg[1].y = value; + if (softwareRenderer->bg[1].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG2HOFS: value &= 0x01FF; softwareRenderer->bg[2].x = value; + if (softwareRenderer->bg[2].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG2VOFS: value &= 0x01FF; softwareRenderer->bg[2].y = value; + if (softwareRenderer->bg[2].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG3HOFS: value &= 0x01FF; softwareRenderer->bg[3].x = value; + if (softwareRenderer->bg[3].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG3VOFS: value &= 0x01FF; softwareRenderer->bg[3].y = value; + if (softwareRenderer->bg[2].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + } break; case REG_BG2PA: - GBAVideoSoftwareRendererWriteBGPA(&softwareRenderer->bg[2], value); + softwareRenderer->bg[2].dx = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2PB: - GBAVideoSoftwareRendererWriteBGPB(&softwareRenderer->bg[2], value); + softwareRenderer->bg[2].dmx = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2PC: - GBAVideoSoftwareRendererWriteBGPC(&softwareRenderer->bg[2], value); + softwareRenderer->bg[2].dy = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2PD: - GBAVideoSoftwareRendererWriteBGPD(&softwareRenderer->bg[2], value); + softwareRenderer->bg[2].dmy = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2X_LO: GBAVideoSoftwareRendererWriteBGX_LO(&softwareRenderer->bg[2], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2X_HI: GBAVideoSoftwareRendererWriteBGX_HI(&softwareRenderer->bg[2], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2Y_LO: GBAVideoSoftwareRendererWriteBGY_LO(&softwareRenderer->bg[2], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2Y_HI: GBAVideoSoftwareRendererWriteBGY_HI(&softwareRenderer->bg[2], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3PA: - GBAVideoSoftwareRendererWriteBGPA(&softwareRenderer->bg[3], value); + softwareRenderer->bg[3].dx = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3PB: - GBAVideoSoftwareRendererWriteBGPB(&softwareRenderer->bg[3], value); + softwareRenderer->bg[3].dmx = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3PC: - GBAVideoSoftwareRendererWriteBGPC(&softwareRenderer->bg[3], value); + softwareRenderer->bg[3].dy = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3PD: - GBAVideoSoftwareRendererWriteBGPD(&softwareRenderer->bg[3], value); + softwareRenderer->bg[3].dmy = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3X_LO: GBAVideoSoftwareRendererWriteBGX_LO(&softwareRenderer->bg[3], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3X_HI: GBAVideoSoftwareRendererWriteBGX_HI(&softwareRenderer->bg[3], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3Y_LO: GBAVideoSoftwareRendererWriteBGY_LO(&softwareRenderer->bg[3], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3Y_HI: GBAVideoSoftwareRendererWriteBGY_HI(&softwareRenderer->bg[3], value); + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BLDCNT: GBAVideoSoftwareRendererWriteBLDCNT(softwareRenderer, value); @@ -260,6 +315,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->bldb = 0x10; } value &= 0x1F1F; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BLDY: value &= 0x1F; @@ -270,6 +326,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->bldy = value; softwareRenderer->blendDirty = true; } + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN0H: softwareRenderer->winN[0].h.end = value; @@ -283,6 +340,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[0].h.start = VIDEO_HORIZONTAL_PIXELS; } } + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN1H: softwareRenderer->winN[1].h.end = value; @@ -296,6 +354,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[1].h.start = VIDEO_HORIZONTAL_PIXELS; } } + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN0V: softwareRenderer->winN[0].v.end = value; @@ -309,6 +368,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[0].v.start = VIDEO_VERTICAL_PIXELS; } } + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN1V: softwareRenderer->winN[1].v.end = value; @@ -322,19 +382,23 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[1].v.start = VIDEO_VERTICAL_PIXELS; } } + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WININ: value &= 0x3F3F; softwareRenderer->winN[0].control.packed = value; softwareRenderer->winN[1].control.packed = value >> 8; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WINOUT: value &= 0x3F3F; softwareRenderer->winout.packed = value; softwareRenderer->objwin.packed = value >> 8; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_MOSAIC: softwareRenderer->mosaic = value; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_GREENSWP: mLOG(GBA_VIDEO, STUB, "Stub video register write: 0x%03X", address); @@ -342,19 +406,23 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender default: mLOG(GBA_VIDEO, GAME_ERROR, "Invalid video register: 0x%03X", address); } + softwareRenderer->ioCache[address >> 1] = value; return value; } static void GBAVideoSoftwareRendererWriteVRAM(struct GBAVideoRenderer* renderer, uint32_t address) { + struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; if (renderer->cache) { mTileCacheWriteVRAM(renderer->cache, address); } + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); } static void GBAVideoSoftwareRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t oam) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; - softwareRenderer->oamDirty = 1; UNUSED(oam); + softwareRenderer->oamDirty = 1; + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); } static void GBAVideoSoftwareRendererWritePalette(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { @@ -369,6 +437,7 @@ static void GBAVideoSoftwareRendererWritePalette(struct GBAVideoRenderer* render if (renderer->cache) { mTileCacheWritePalette(renderer->cache, address); } + memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); } static void _breakWindow(struct GBAVideoSoftwareRenderer* softwareRenderer, struct WindowN* win, int y) { @@ -472,6 +541,10 @@ static void _cleanOAM(struct GBAVideoSoftwareRenderer* renderer) { static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; + if (!(softwareRenderer->scanlineDirty[y >> 5] & (1 << (y & 0x1F)))) { + return; + } + color_t* row = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y]; if (GBARegisterDISPCNTIsForcedBlank(softwareRenderer->dispcnt)) { int x; @@ -587,6 +660,7 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render #else memcpy(row, softwareRenderer->row, VIDEO_HORIZONTAL_PIXELS * sizeof(*row)); #endif + softwareRenderer->scanlineDirty[y >> 5] &= ~(1 << (y & 0x1F)); } static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* renderer) { @@ -636,22 +710,6 @@ static void GBAVideoSoftwareRendererWriteBGCNT(struct GBAVideoSoftwareRenderer* bg->size = GBARegisterBGCNTGetSize(value); } -static void GBAVideoSoftwareRendererWriteBGPA(struct GBAVideoSoftwareBackground* bg, uint16_t value) { - bg->dx = value; -} - -static void GBAVideoSoftwareRendererWriteBGPB(struct GBAVideoSoftwareBackground* bg, uint16_t value) { - bg->dmx = value; -} - -static void GBAVideoSoftwareRendererWriteBGPC(struct GBAVideoSoftwareBackground* bg, uint16_t value) { - bg->dy = value; -} - -static void GBAVideoSoftwareRendererWriteBGPD(struct GBAVideoSoftwareBackground* bg, uint16_t value) { - bg->dmy = value; -} - static void GBAVideoSoftwareRendererWriteBGX_LO(struct GBAVideoSoftwareBackground* bg, uint16_t value) { bg->refx = (bg->refx & 0xFFFF0000) | value; bg->sx = bg->refx; From f26982e0139b313b670b82becb5e54cb87b05341 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 22:15:32 -0700 Subject: [PATCH 048/158] GBA Video: Fix scanline parameters not advancing for clean scanlines (fixes #837) --- src/gba/renderers/video-software.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 11b8b7515..386e0d3a8 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -542,6 +542,12 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; if (!(softwareRenderer->scanlineDirty[y >> 5] & (1 << (y & 0x1F)))) { + if (GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) != 0) { + softwareRenderer->bg[2].sx += softwareRenderer->bg[2].dmx; + softwareRenderer->bg[2].sy += softwareRenderer->bg[2].dmy; + softwareRenderer->bg[3].sx += softwareRenderer->bg[3].dmx; + softwareRenderer->bg[3].sy += softwareRenderer->bg[3].dmy; + } return; } From 129af691054cb1acffd9a2be9eb9f1dbf47f51df Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 23:39:56 -0700 Subject: [PATCH 049/158] GB Serialize: Fix deserializing video STAT --- CHANGES | 1 + src/gb/io.c | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 83f89025d..b5e6e3575 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,7 @@ Bugfixes: - GB, GBA: Fix crashes when attempting to identify null VFiles - GB MBC: Fix RTC initialization (fixes mgba.io/i/825) - GB MBC: Fix RTC loading when file size is off + - GB Serialize: Fix deserializing video STAT Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/io.c b/src/gb/io.c index f28ba4d76..1be29a50f 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -647,4 +647,5 @@ void GBIODeserialize(struct GB* gb, const struct GBSerializedState* state) { gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_SCX, state->io[REG_SCX]); gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_WY, state->io[REG_WY]); gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_WX, state->io[REG_WX]); + gb->video.stat = state->io[REG_STAT]; } From 05c2fc3e0d4cec701af25581cbb6b807b16b66a9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 23:41:30 -0700 Subject: [PATCH 050/158] GB Serialize: Support serializing/deserializing SGB --- include/mgba/internal/gb/serialize.h | 38 +++++++++++++- src/core/serialize.c | 5 +- src/gb/io.c | 5 ++ src/gb/renderers/software.c | 4 ++ src/gb/serialize.c | 74 +++++++++++++++++++++++++++- src/gb/video.c | 10 +++- 6 files changed, 127 insertions(+), 9 deletions(-) diff --git a/include/mgba/internal/gb/serialize.h b/include/mgba/internal/gb/serialize.h index dcdb400a7..71d2c78b7 100644 --- a/include/mgba/internal/gb/serialize.h +++ b/include/mgba/internal/gb/serialize.h @@ -19,7 +19,7 @@ extern const uint32_t GB_SAVESTATE_VERSION; mLOG_DECLARE_CATEGORY(GB_STATE); /* Savestate format: - * 0x00000 - 0x00003: Version Magic (0x01000001) + * 0x00000 - 0x00003: Version Magic (0x01000002) * 0x00004 - 0x00007: ROM CRC32 * 0x00008: Game Boy model * 0x00009 - 0x0000B: Reserved (leave zero) @@ -161,7 +161,22 @@ mLOG_DECLARE_CATEGORY(GB_STATE); * 0x003FF: Interrupts enabled * 0x00400 - 0x043FF: VRAM * 0x04400 - 0x0C3FF: WRAM - * Total size: 0xC400 (50,176) bytes + * 0x0C400 - 0x0C77F: Reserved + * 0x0C780 - 0x117FF: Super Game Boy + * | 0x0C780 - 0x0C7D9: Current attributes + * | 0x0C7DA: Current command + * | 0x0C7DB: Current bit count + * | 0x0C7DC - 0x0C7DF: Flags + * | bits 0 - 1: Current P1 bits + * | bits 2 - 3: Current render mode + * | bits 4 - 31: Reserved (leave 0) + * | 0x0C7E0 - 0x0C7EF: Current packet + * | 0x0C7F0 - 0x0C7FF: Reserved + * | 0x0C800 - 0x0E7FF: Character VRAM + * | 0x0E800 - 0x0F7FF: Tile map VRAM + * | 0x0F800 - 0x107FF: Palette VRAM + * | 0x10800 - 0x117FF: Attribute file + * Total size: 0x11800 (71,680) bytes */ DECL_BITFIELD(GBSerializedAudioFlags, uint32_t); @@ -238,6 +253,10 @@ DECL_BIT(GBSerializedMemoryFlags, Ime, 3); DECL_BIT(GBSerializedMemoryFlags, IsHdma, 4); DECL_BITS(GBSerializedMemoryFlags, ActiveRtcReg, 5, 3); +DECL_BITFIELD(GBSerializedSGBFlags, uint32_t); +DECL_BITS(GBSerializedSGBFlags, P1Bits, 0, 2); +DECL_BITS(GBSerializedSGBFlags, RenderMode, 2, 2); + #pragma pack(push, 1) struct GBSerializedState { uint32_t versionMagic; @@ -366,6 +385,21 @@ struct GBSerializedState { uint8_t vram[GB_SIZE_VRAM]; uint8_t wram[GB_SIZE_WORKING_RAM]; + + uint32_t reserved2[0xE0]; + + struct { + uint8_t attributes[90]; + uint8_t command; + uint8_t bits; + GBSerializedSGBFlags flags; + uint8_t packet[16]; + uint32_t reserved[4]; + uint8_t charRam[SGB_SIZE_CHAR_RAM]; + uint8_t mapRam[SGB_SIZE_MAP_RAM]; + uint8_t palRam[SGB_SIZE_PAL_RAM]; + uint8_t atfRam[SGB_SIZE_ATF_RAM]; + } sgb; }; #pragma pack(pop) diff --git a/src/core/serialize.c b/src/core/serialize.c index 9efca53f7..fe1015bb8 100644 --- a/src/core/serialize.c +++ b/src/core/serialize.c @@ -409,11 +409,8 @@ void* mCoreExtractState(struct mCore* core, struct VFile* vf, struct mStateExtda } #endif ssize_t stateSize = core->stateSize(core); - vf->seek(vf, 0, SEEK_SET); - if (vf->size(vf) < stateSize) { - return false; - } void* state = anonymousMemoryMap(stateSize); + vf->seek(vf, 0, SEEK_SET); if (vf->read(vf, state, stateSize) != stateSize) { mappedMemoryFree(state, stateSize); return 0; diff --git a/src/gb/io.c b/src/gb/io.c index 1be29a50f..6b45f47ff 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -647,5 +647,10 @@ void GBIODeserialize(struct GB* gb, const struct GBSerializedState* state) { gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_SCX, state->io[REG_SCX]); gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_WY, state->io[REG_WY]); gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_WX, state->io[REG_WX]); + if (gb->model == GB_MODEL_SGB) { + gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_BGP, state->io[REG_BGP]); + gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_OBP0, state->io[REG_OBP0]); + gb->video.renderer->writeVideoRegister(gb->video.renderer, REG_OBP1, state->io[REG_OBP1]); + } gb->video.stat = state->io[REG_STAT]; } diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index b76228a53..a81da16f5 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -270,6 +270,9 @@ static void GBVideoSoftwareRendererWriteSGBPacket(struct GBVideoRenderer* render memcpy(softwareRenderer->sgbPartialDataSet, &softwareRenderer->sgbPacket[i], 16 - i); } break; + case SGB_ATRC_EN: + _regenerateSGBBorder(softwareRenderer); + break; } } @@ -474,6 +477,7 @@ static void GBVideoSoftwareRendererFinishFrame(struct GBVideoRenderer* renderer) if (softwareRenderer->sgbTransfer == 5) { softwareRenderer->sgbCommandHeader = 0; } + break; default: break; } diff --git a/src/gb/serialize.c b/src/gb/serialize.c index 006f126a7..1a6ee92f6 100644 --- a/src/gb/serialize.c +++ b/src/gb/serialize.c @@ -12,7 +12,10 @@ mLOG_DEFINE_CATEGORY(GB_STATE, "GB Savestate", "gb.serialize"); const uint32_t GB_SAVESTATE_MAGIC = 0x00400000; -const uint32_t GB_SAVESTATE_VERSION = 0x00000001; +const uint32_t GB_SAVESTATE_VERSION = 0x00000002; + +static void GBSGBSerialize(struct GB* gb, struct GBSerializedState* state); +static void GBSGBDeserialize(struct GB* gb, const struct GBSerializedState* state); void GBSerialize(struct GB* gb, struct GBSerializedState* state) { STORE_32LE(GB_SAVESTATE_MAGIC + GB_SAVESTATE_VERSION, 0, &state->versionMagic); @@ -59,6 +62,10 @@ void GBSerialize(struct GB* gb, struct GBSerializedState* state) { GBVideoSerialize(&gb->video, state); GBTimerSerialize(&gb->timer, state); GBAudioSerialize(&gb->audio, state); + + if (gb->model == GB_MODEL_SGB) { + GBSGBSerialize(gb, state); + } } bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { @@ -77,6 +84,7 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { } else if (ucheck < GB_SAVESTATE_MAGIC + GB_SAVESTATE_VERSION) { mLOG(GB_STATE, WARN, "Old savestate: expected %08X, got %08X, continuing anyway", GB_SAVESTATE_MAGIC + GB_SAVESTATE_VERSION, ucheck); } + bool canSgb = ucheck >= GB_SAVESTATE_MAGIC + 2; if (gb->memory.rom && memcmp(state->title, ((struct GBCartridge*) gb->memory.rom)->titleLong, sizeof(state->title))) { mLOG(GB_STATE, WARN, "Savestate is for a different game"); @@ -174,7 +182,71 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { GBTimerDeserialize(&gb->timer, state); GBAudioDeserialize(&gb->audio, state); + if (gb->model == GB_MODEL_SGB && canSgb) { + GBSGBDeserialize(gb, state); + } + gb->cpu->memory.setActiveRegion(gb->cpu, gb->cpu->pc); return true; } + +// TODO: Reorganize SGB into its own file +void GBSGBSerialize(struct GB* gb, struct GBSerializedState* state) { + state->sgb.command = gb->video.sgbCommandHeader; + state->sgb.bits = gb->sgbBit; + + GBSerializedSGBFlags flags = 0; + flags = GBSerializedSGBFlagsSetP1Bits(flags, gb->currentSgbBits); + flags = GBSerializedSGBFlagsSetRenderMode(flags, gb->video.renderer->sgbRenderMode); + STORE_32LE(flags, 0, &state->sgb.flags); + + memcpy(state->sgb.packet, gb->sgbPacket, sizeof(state->sgb.packet)); + + if (gb->video.renderer->sgbCharRam) { + memcpy(state->sgb.charRam, gb->video.renderer->sgbCharRam, sizeof(state->sgb.charRam)); + } + if (gb->video.renderer->sgbMapRam) { + memcpy(state->sgb.mapRam, gb->video.renderer->sgbMapRam, sizeof(state->sgb.mapRam)); + } + if (gb->video.renderer->sgbPalRam) { + memcpy(state->sgb.palRam, gb->video.renderer->sgbPalRam, sizeof(state->sgb.palRam)); + } + if (gb->video.renderer->sgbAttributeFiles) { + memcpy(state->sgb.atfRam, gb->video.renderer->sgbAttributeFiles, sizeof(state->sgb.atfRam)); + } + if (gb->video.renderer->sgbAttributes) { + memcpy(state->sgb.attributes, gb->video.renderer->sgbAttributes, sizeof(state->sgb.attributes)); + } +} + +void GBSGBDeserialize(struct GB* gb, const struct GBSerializedState* state) { + gb->video.sgbCommandHeader = state->sgb.command; + gb->sgbBit = state->sgb.bits; + + GBSerializedSGBFlags flags; + LOAD_32LE(flags, 0, &state->sgb.flags); + gb->currentSgbBits = GBSerializedSGBFlagsGetP1Bits(flags); + gb->video.renderer->sgbRenderMode = GBSerializedSGBFlagsGetRenderMode(flags); + + memcpy(gb->sgbPacket, state->sgb.packet, sizeof(state->sgb.packet)); + + if (gb->video.renderer->sgbCharRam) { + memcpy(gb->video.renderer->sgbCharRam, state->sgb.charRam, sizeof(state->sgb.charRam)); + } + if (gb->video.renderer->sgbMapRam) { + memcpy(gb->video.renderer->sgbMapRam, state->sgb.mapRam, sizeof(state->sgb.mapRam)); + } + if (gb->video.renderer->sgbPalRam) { + memcpy(gb->video.renderer->sgbPalRam, state->sgb.palRam, sizeof(state->sgb.palRam)); + } + if (gb->video.renderer->sgbAttributeFiles) { + memcpy(gb->video.renderer->sgbAttributeFiles, state->sgb.atfRam, sizeof(state->sgb.atfRam)); + } + if (gb->video.renderer->sgbAttributes) { + memcpy(gb->video.renderer->sgbAttributes, state->sgb.attributes, sizeof(state->sgb.attributes)); + } + + GBVideoWriteSGBPacket(&gb->video, (uint8_t[16]) { (SGB_ATRC_EN << 3) | 1, 0 }); + GBVideoWriteSGBPacket(&gb->video, gb->sgbPacket); +} diff --git a/src/gb/video.c b/src/gb/video.c index 840689e7f..3857ffbf5 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -562,10 +562,14 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->palette[2] = data[5] | (data[6] << 8); video->palette[3] = data[7] | (data[8] << 8); + video->palette[16] = data[1] | (data[2] << 8); video->palette[17] = data[9] | (data[10] << 8); video->palette[18] = data[11] | (data[12] << 8); video->palette[19] = data[13] | (data[14] << 8); + video->palette[32] = data[1] | (data[2] << 8); + video->palette[48] = data[1] | (data[2] << 8); + video->renderer->writePalette(video->renderer, 0, video->palette[0]); video->renderer->writePalette(video->renderer, 1, video->palette[1]); video->renderer->writePalette(video->renderer, 2, video->palette[2]); @@ -578,7 +582,6 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->renderer->writePalette(video->renderer, 48, video->palette[0]); break; case SGB_PAL23: - video->palette[32] = data[1] | (data[2] << 8); video->palette[33] = data[3] | (data[4] << 8); video->palette[34] = data[5] | (data[6] << 8); video->palette[35] = data[7] | (data[8] << 8); @@ -599,6 +602,9 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->palette[2] = data[5] | (data[6] << 8); video->palette[3] = data[7] | (data[8] << 8); + video->palette[16] = data[1] | (data[2] << 8); + video->palette[32] = data[1] | (data[2] << 8); + video->palette[48] = data[1] | (data[2] << 8); video->palette[49] = data[9] | (data[10] << 8); video->palette[50] = data[11] | (data[12] << 8); @@ -615,7 +621,6 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->renderer->writePalette(video->renderer, 51, video->palette[51]); break; case SGB_PAL12: - video->palette[16] = data[1] | (data[2] << 8); video->palette[17] = data[3] | (data[4] << 8); video->palette[18] = data[5] | (data[6] << 8); video->palette[19] = data[7] | (data[8] << 8); @@ -649,6 +654,7 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { break; case SGB_ATTR_BLK: case SGB_PAL_TRN: + case SGB_ATRC_EN: case SGB_CHR_TRN: case SGB_PCT_TRN: case SGB_ATTR_TRN: From 48cf8448c161b51f49d7ee0aa87303c329487d57 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 2 Aug 2017 23:42:38 -0700 Subject: [PATCH 051/158] GBA Video: Finish mColor cleanup --- src/gba/renderers/software-bg.c | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/src/gba/renderers/software-bg.c b/src/gba/renderers/software-bg.c index 93c30a87e..9655166e1 100644 --- a/src/gba/renderers/software-bg.c +++ b/src/gba/renderers/software-bg.c @@ -103,21 +103,6 @@ void GBAVideoSoftwareRendererDrawBackgroundMode3(struct GBAVideoSoftwareRenderer if (!mosaicWait) { LOAD_16(color, ((localX >> 8) + (localY >> 8) * VIDEO_HORIZONTAL_PIXELS) << 1, renderer->d.vram); color = mColorFrom555(color); -#ifndef COLOR_16_BIT - unsigned color32; - color32 = 0; - color32 |= (color << 3) & 0xF8; - color32 |= (color << 6) & 0xF800; - color32 |= (color << 9) & 0xF80000; - color32 |= (color32 >> 5) & 0x070707; - color = color32; -#elif COLOR_5_6_5 - uint16_t color16 = 0; - color16 |= (color & 0x001F) << 11; - color16 |= (color & 0x03E0) << 1; - color16 |= (color & 0x7C00) >> 10; - color = color16; -#endif mosaicWait = mosaicH; } else { --mosaicWait; @@ -194,20 +179,7 @@ void GBAVideoSoftwareRendererDrawBackgroundMode5(struct GBAVideoSoftwareRenderer if (!mosaicWait) { LOAD_16(color, offset + (localX >> 8) * 2 + (localY >> 8) * 320, renderer->d.vram); -#ifndef COLOR_16_BIT - unsigned color32 = 0; - color32 |= (color << 9) & 0xF80000; - color32 |= (color << 3) & 0xF8; - color32 |= (color << 6) & 0xF800; - color32 |= (color32 >> 5) & 0x070707; - color = color32; -#elif COLOR_5_6_5 - uint16_t color16 = 0; - color16 |= (color & 0x001F) << 11; - color16 |= (color & 0x03E0) << 1; - color16 |= (color & 0x7C00) >> 10; - color = color16; -#endif + color = mColorFrom555(color); mosaicWait = mosaicH; } else { --mosaicWait; From 0883dc08150e44dbb3f7d66948e2fa5f0046c4fd Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 14:33:51 -0700 Subject: [PATCH 052/158] GB I/O: Improve accuracy of SGB MLT_REG polling (fixes #839) --- src/gb/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gb/io.c b/src/gb/io.c index 6b45f47ff..962eeb1bf 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -485,7 +485,7 @@ static uint8_t _readKeys(struct GB* gb) { switch (gb->memory.io[REG_JOYP] & 0x30) { case 0x30: // TODO: Increment - keys = gb->model == GB_MODEL_SGB ? 0xF : 0; + keys = (gb->video.sgbCommandHeader >> 3) == SGB_MLT_REG ? 0xF : 0; break; case 0x20: keys >>= 4; From e71baacd2fe3729e3556b73af7b1cafc0345955f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 16:54:17 -0700 Subject: [PATCH 053/158] GBA Video: Scanline-level I/O caching --- .../internal/gba/renderers/video-software.h | 5 +- src/gba/renderers/video-software.c | 114 ++++++++---------- 2 files changed, 51 insertions(+), 68 deletions(-) diff --git a/include/mgba/internal/gba/renderers/video-software.h b/include/mgba/internal/gba/renderers/video-software.h index c6a0c7781..e82d172ca 100644 --- a/include/mgba/internal/gba/renderers/video-software.h +++ b/include/mgba/internal/gba/renderers/video-software.h @@ -159,7 +159,10 @@ struct GBAVideoSoftwareRenderer { struct GBAVideoSoftwareSprite sprites[128]; uint32_t scanlineDirty[5]; - uint16_t ioCache[REG_SOUND1CNT_LO]; + uint16_t ioCache[VIDEO_VERTICAL_PIXELS][REG_SOUND1CNT_LO]; + uint16_t nextIo[REG_SOUND1CNT_LO]; + int32_t scaleCache[VIDEO_VERTICAL_PIXELS][2][2]; + int nextY; int start; int end; diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 386e0d3a8..94fd9b6d7 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -107,9 +107,12 @@ static void GBAVideoSoftwareRendererReset(struct GBAVideoRenderer* renderer) { softwareRenderer->oamMax = 0; softwareRenderer->mosaic = 0; + softwareRenderer->nextY = 0; memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); memset(softwareRenderer->ioCache, 0, sizeof(softwareRenderer->ioCache)); + memset(softwareRenderer->nextIo, 0, sizeof(softwareRenderer->nextIo)); + memset(softwareRenderer->scaleCache, 0, sizeof(softwareRenderer->scaleCache)); for (i = 0; i < 4; ++i) { struct GBAVideoSoftwareBackground* bg = &softwareRenderer->bg[i]; @@ -144,162 +147,130 @@ static void GBAVideoSoftwareRendererDeinit(struct GBAVideoRenderer* renderer) { static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; - if (softwareRenderer->ioCache[address >> 1] == value) { - return value; - } switch (address) { case REG_DISPCNT: softwareRenderer->dispcnt = value; GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG0CNT: value &= 0xDFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[0], value); - if (softwareRenderer->bg[0].enabled) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG1CNT: value &= 0xDFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[1], value); - if (softwareRenderer->bg[1].enabled) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG2CNT: value &= 0xFFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[2], value); - if (softwareRenderer->bg[2].enabled) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG3CNT: value &= 0xFFFF; GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[3], value); - if (softwareRenderer->bg[3].enabled) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG0HOFS: value &= 0x01FF; softwareRenderer->bg[0].x = value; - if (softwareRenderer->bg[0].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG0VOFS: value &= 0x01FF; softwareRenderer->bg[0].y = value; - if (softwareRenderer->bg[0].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG1HOFS: value &= 0x01FF; softwareRenderer->bg[1].x = value; - if (softwareRenderer->bg[1].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG1VOFS: value &= 0x01FF; softwareRenderer->bg[1].y = value; - if (softwareRenderer->bg[1].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) < 2) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG2HOFS: value &= 0x01FF; softwareRenderer->bg[2].x = value; - if (softwareRenderer->bg[2].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG2VOFS: value &= 0x01FF; softwareRenderer->bg[2].y = value; - if (softwareRenderer->bg[2].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG3HOFS: value &= 0x01FF; softwareRenderer->bg[3].x = value; - if (softwareRenderer->bg[3].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG3VOFS: value &= 0x01FF; softwareRenderer->bg[3].y = value; - if (softwareRenderer->bg[2].enabled && GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) == 0) { - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - } break; case REG_BG2PA: softwareRenderer->bg[2].dx = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2PB: softwareRenderer->bg[2].dmx = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2PC: softwareRenderer->bg[2].dy = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2PD: softwareRenderer->bg[2].dmy = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG2X_LO: GBAVideoSoftwareRendererWriteBGX_LO(&softwareRenderer->bg[2], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[2].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][0][0]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BG2X_HI: GBAVideoSoftwareRendererWriteBGX_HI(&softwareRenderer->bg[2], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[2].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][0][0]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BG2Y_LO: GBAVideoSoftwareRendererWriteBGY_LO(&softwareRenderer->bg[2], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[2].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][0][1]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BG2Y_HI: GBAVideoSoftwareRendererWriteBGY_HI(&softwareRenderer->bg[2], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[2].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][0][1]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BG3PA: softwareRenderer->bg[3].dx = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3PB: softwareRenderer->bg[3].dmx = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3PC: softwareRenderer->bg[3].dy = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3PD: softwareRenderer->bg[3].dmy = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BG3X_LO: GBAVideoSoftwareRendererWriteBGX_LO(&softwareRenderer->bg[3], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[3].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][1][0]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BG3X_HI: GBAVideoSoftwareRendererWriteBGX_HI(&softwareRenderer->bg[3], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[3].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][1][0]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BG3Y_LO: GBAVideoSoftwareRendererWriteBGY_LO(&softwareRenderer->bg[3], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[3].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][1][1]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BG3Y_HI: GBAVideoSoftwareRendererWriteBGY_HI(&softwareRenderer->bg[3], value); - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); + if (softwareRenderer->bg[3].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][1][1]) { + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } break; case REG_BLDCNT: GBAVideoSoftwareRendererWriteBLDCNT(softwareRenderer, value); @@ -315,7 +286,6 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->bldb = 0x10; } value &= 0x1F1F; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_BLDY: value &= 0x1F; @@ -326,7 +296,6 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->bldy = value; softwareRenderer->blendDirty = true; } - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN0H: softwareRenderer->winN[0].h.end = value; @@ -340,7 +309,6 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[0].h.start = VIDEO_HORIZONTAL_PIXELS; } } - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN1H: softwareRenderer->winN[1].h.end = value; @@ -354,7 +322,6 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[1].h.start = VIDEO_HORIZONTAL_PIXELS; } } - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN0V: softwareRenderer->winN[0].v.end = value; @@ -368,7 +335,6 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[0].v.start = VIDEO_VERTICAL_PIXELS; } } - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WIN1V: softwareRenderer->winN[1].v.end = value; @@ -382,23 +348,19 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender softwareRenderer->winN[1].v.start = VIDEO_VERTICAL_PIXELS; } } - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WININ: value &= 0x3F3F; softwareRenderer->winN[0].control.packed = value; softwareRenderer->winN[1].control.packed = value >> 8; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_WINOUT: value &= 0x3F3F; softwareRenderer->winout.packed = value; softwareRenderer->objwin.packed = value >> 8; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_MOSAIC: softwareRenderer->mosaic = value; - memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); break; case REG_GREENSWP: mLOG(GBA_VIDEO, STUB, "Stub video register write: 0x%03X", address); @@ -406,7 +368,11 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender default: mLOG(GBA_VIDEO, GAME_ERROR, "Invalid video register: 0x%03X", address); } - softwareRenderer->ioCache[address >> 1] = value; + softwareRenderer->nextIo[address >> 1] = value; + if (softwareRenderer->ioCache[softwareRenderer->nextY][address >> 1] != value) { + softwareRenderer->ioCache[softwareRenderer->nextY][address >> 1] = value; + softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + } return value; } @@ -541,7 +507,20 @@ static void _cleanOAM(struct GBAVideoSoftwareRenderer* renderer) { static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; - if (!(softwareRenderer->scanlineDirty[y >> 5] & (1 << (y & 0x1F)))) { + softwareRenderer->nextY = y + 1; + + bool dirty = softwareRenderer->scanlineDirty[y >> 5] & (1 << (y & 0x1F)); + if (memcmp(softwareRenderer->nextIo, softwareRenderer->ioCache[y], sizeof(softwareRenderer->nextIo))) { + memcpy(softwareRenderer->ioCache[y], softwareRenderer->nextIo, sizeof(softwareRenderer->nextIo)); + dirty = true; + } + + softwareRenderer->scaleCache[y][0][0] = softwareRenderer->bg[2].sx; + softwareRenderer->scaleCache[y][0][1] = softwareRenderer->bg[2].sy; + softwareRenderer->scaleCache[y][1][0] = softwareRenderer->bg[3].sx; + softwareRenderer->scaleCache[y][1][1] = softwareRenderer->bg[3].sy; + + if (!dirty) { if (GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) != 0) { softwareRenderer->bg[2].sx += softwareRenderer->bg[2].dmx; softwareRenderer->bg[2].sy += softwareRenderer->bg[2].dmy; @@ -672,6 +651,7 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* renderer) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; + softwareRenderer->nextY = 0; if (softwareRenderer->temporaryBuffer) { mappedMemoryFree(softwareRenderer->temporaryBuffer, VIDEO_HORIZONTAL_PIXELS * VIDEO_VERTICAL_PIXELS * 4); softwareRenderer->temporaryBuffer = 0; From 51a6079e91fd1c11896ce08742e54a7adc67e4c8 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 17:39:53 -0700 Subject: [PATCH 054/158] GBA Video: Caching cleanup --- .../internal/gba/renderers/video-software.h | 6 +- src/gba/renderers/video-software.c | 64 ++++++++++--------- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/include/mgba/internal/gba/renderers/video-software.h b/include/mgba/internal/gba/renderers/video-software.h index e82d172ca..6ce9c2037 100644 --- a/include/mgba/internal/gba/renderers/video-software.h +++ b/include/mgba/internal/gba/renderers/video-software.h @@ -159,9 +159,11 @@ struct GBAVideoSoftwareRenderer { struct GBAVideoSoftwareSprite sprites[128]; uint32_t scanlineDirty[5]; - uint16_t ioCache[VIDEO_VERTICAL_PIXELS][REG_SOUND1CNT_LO]; uint16_t nextIo[REG_SOUND1CNT_LO]; - int32_t scaleCache[VIDEO_VERTICAL_PIXELS][2][2]; + struct ScanlineCache { + uint16_t io[REG_SOUND1CNT_LO]; + int32_t scale[2][2]; + } cache[VIDEO_VERTICAL_PIXELS]; int nextY; int start; diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 94fd9b6d7..2ae1cf838 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -12,6 +12,9 @@ #include #include +#define DIRTY_SCANLINE(R, Y) R->scanlineDirty[Y >> 5] |= (1 << (Y & 0x1F)) +#define CLEAN_SCANLINE(R, Y) R->scanlineDirty[Y >> 5] &= ~(1 << (Y & 0x1F)) + static void GBAVideoSoftwareRendererInit(struct GBAVideoRenderer* renderer); static void GBAVideoSoftwareRendererDeinit(struct GBAVideoRenderer* renderer); static void GBAVideoSoftwareRendererReset(struct GBAVideoRenderer* renderer); @@ -110,9 +113,8 @@ static void GBAVideoSoftwareRendererReset(struct GBAVideoRenderer* renderer) { softwareRenderer->nextY = 0; memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); - memset(softwareRenderer->ioCache, 0, sizeof(softwareRenderer->ioCache)); + memset(softwareRenderer->cache, 0, sizeof(softwareRenderer->cache)); memset(softwareRenderer->nextIo, 0, sizeof(softwareRenderer->nextIo)); - memset(softwareRenderer->scaleCache, 0, sizeof(softwareRenderer->scaleCache)); for (i = 0; i < 4; ++i) { struct GBAVideoSoftwareBackground* bg = &softwareRenderer->bg[i]; @@ -214,26 +216,26 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender break; case REG_BG2X_LO: GBAVideoSoftwareRendererWriteBGX_LO(&softwareRenderer->bg[2], value); - if (softwareRenderer->bg[2].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][0][0]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[2].sx != softwareRenderer->cache[softwareRenderer->nextY].scale[0][0]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BG2X_HI: GBAVideoSoftwareRendererWriteBGX_HI(&softwareRenderer->bg[2], value); - if (softwareRenderer->bg[2].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][0][0]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[2].sx != softwareRenderer->cache[softwareRenderer->nextY].scale[0][0]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BG2Y_LO: GBAVideoSoftwareRendererWriteBGY_LO(&softwareRenderer->bg[2], value); - if (softwareRenderer->bg[2].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][0][1]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[2].sy != softwareRenderer->cache[softwareRenderer->nextY].scale[0][1]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BG2Y_HI: GBAVideoSoftwareRendererWriteBGY_HI(&softwareRenderer->bg[2], value); - if (softwareRenderer->bg[2].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][0][1]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[2].sy != softwareRenderer->cache[softwareRenderer->nextY].scale[0][1]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BG3PA: @@ -250,26 +252,26 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender break; case REG_BG3X_LO: GBAVideoSoftwareRendererWriteBGX_LO(&softwareRenderer->bg[3], value); - if (softwareRenderer->bg[3].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][1][0]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[3].sx != softwareRenderer->cache[softwareRenderer->nextY].scale[1][0]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BG3X_HI: GBAVideoSoftwareRendererWriteBGX_HI(&softwareRenderer->bg[3], value); - if (softwareRenderer->bg[3].sx != softwareRenderer->scaleCache[softwareRenderer->nextY][1][0]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[3].sx != softwareRenderer->cache[softwareRenderer->nextY].scale[1][0]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BG3Y_LO: GBAVideoSoftwareRendererWriteBGY_LO(&softwareRenderer->bg[3], value); - if (softwareRenderer->bg[3].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][1][1]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[3].sy != softwareRenderer->cache[softwareRenderer->nextY].scale[1][1]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BG3Y_HI: GBAVideoSoftwareRendererWriteBGY_HI(&softwareRenderer->bg[3], value); - if (softwareRenderer->bg[3].sy != softwareRenderer->scaleCache[softwareRenderer->nextY][1][1]) { - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->bg[3].sy != softwareRenderer->cache[softwareRenderer->nextY].scale[1][1]) { + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } break; case REG_BLDCNT: @@ -369,9 +371,9 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender mLOG(GBA_VIDEO, GAME_ERROR, "Invalid video register: 0x%03X", address); } softwareRenderer->nextIo[address >> 1] = value; - if (softwareRenderer->ioCache[softwareRenderer->nextY][address >> 1] != value) { - softwareRenderer->ioCache[softwareRenderer->nextY][address >> 1] = value; - softwareRenderer->scanlineDirty[softwareRenderer->nextY >> 5] |= (1 << (softwareRenderer->nextY & 0x1F)); + if (softwareRenderer->cache[softwareRenderer->nextY].io[address >> 1] != value) { + softwareRenderer->cache[softwareRenderer->nextY].io[address >> 1] = value; + DIRTY_SCANLINE(softwareRenderer, softwareRenderer->nextY); } return value; } @@ -507,18 +509,22 @@ static void _cleanOAM(struct GBAVideoSoftwareRenderer* renderer) { static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; - softwareRenderer->nextY = y + 1; + if (y == VIDEO_VERTICAL_PIXELS - 1) { + softwareRenderer->nextY = 0; + } else { + softwareRenderer->nextY = y + 1; + } bool dirty = softwareRenderer->scanlineDirty[y >> 5] & (1 << (y & 0x1F)); - if (memcmp(softwareRenderer->nextIo, softwareRenderer->ioCache[y], sizeof(softwareRenderer->nextIo))) { - memcpy(softwareRenderer->ioCache[y], softwareRenderer->nextIo, sizeof(softwareRenderer->nextIo)); + if (memcmp(softwareRenderer->nextIo, softwareRenderer->cache[y].io, sizeof(softwareRenderer->nextIo))) { + memcpy(softwareRenderer->cache[y].io, softwareRenderer->nextIo, sizeof(softwareRenderer->nextIo)); dirty = true; } - softwareRenderer->scaleCache[y][0][0] = softwareRenderer->bg[2].sx; - softwareRenderer->scaleCache[y][0][1] = softwareRenderer->bg[2].sy; - softwareRenderer->scaleCache[y][1][0] = softwareRenderer->bg[3].sx; - softwareRenderer->scaleCache[y][1][1] = softwareRenderer->bg[3].sy; + softwareRenderer->cache[y].scale[0][0] = softwareRenderer->bg[2].sx; + softwareRenderer->cache[y].scale[0][1] = softwareRenderer->bg[2].sy; + softwareRenderer->cache[y].scale[1][0] = softwareRenderer->bg[3].sx; + softwareRenderer->cache[y].scale[1][1] = softwareRenderer->bg[3].sy; if (!dirty) { if (GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) != 0) { @@ -645,7 +651,7 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render #else memcpy(row, softwareRenderer->row, VIDEO_HORIZONTAL_PIXELS * sizeof(*row)); #endif - softwareRenderer->scanlineDirty[y >> 5] &= ~(1 << (y & 0x1F)); + CLEAN_SCANLINE(softwareRenderer, y); } static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* renderer) { From 35a13753bb414253c5901013b3dcc1b05ff9dc6c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 18:44:26 -0700 Subject: [PATCH 055/158] Core: Fix mVL state size discrepancies --- src/feature/video-logger.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/feature/video-logger.c b/src/feature/video-logger.c index ab071512d..6d9710872 100644 --- a/src/feature/video-logger.c +++ b/src/feature/video-logger.c @@ -687,8 +687,16 @@ void mVideoLogContextDestroy(struct mCore* core, struct mVideoLogContext* contex void mVideoLogContextRewind(struct mVideoLogContext* context, struct mCore* core) { _readHeader(context); - if (core && core->stateSize(core) == context->initialStateSize) { - core->loadState(core, context->initialState); + if (core) { + size_t size = core->stateSize(core); + if (size <= context->initialStateSize) { + core->loadState(core, context->initialState); + } else { + void* extendedState = anonymousMemoryMap(size); + memcpy(extendedState, context->initialState, context->initialStateSize); + core->loadState(core, extendedState); + mappedMemoryFree(extendedState, size); + } } off_t pointer = context->backing->seek(context->backing, 0, SEEK_CUR); From da10c3bbeccb4e445f1e7bdcb28e86024723e6d6 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 19:07:54 -0700 Subject: [PATCH 056/158] GB Video: Fix regression with modifying BGP mid-scanline --- src/gb/renderers/software.c | 45 +++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index a81da16f5..025e1935c 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -332,20 +332,26 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i GBVideoSoftwareRendererDrawObj(softwareRenderer, &obj[i], startX, endX, y); } } -} -static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* renderer, int y) { - struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; size_t sgbOffset = 0; if (softwareRenderer->model == GB_MODEL_SGB) { sgbOffset = softwareRenderer->outputBufferStride * 40 + 48; } color_t* row = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y + sgbOffset]; int x; + int p = 0; switch (softwareRenderer->d.sgbRenderMode) { case 0: - for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 8) { - int p = 0; + if (softwareRenderer->model == GB_MODEL_SGB) { + p = softwareRenderer->d.sgbAttributes[(startX >> 5) + 5 * (y >> 3)]; + p >>= 6 - ((x / 4) & 0x6); + p &= 3; + p <<= 2; + } + for (x = startX; x < ((startX + 7) & ~7) && x < endX; ++x) { + row[x] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x] & 0x7F]]; + } + for (; x + 7 < (endX & ~7); x += 8) { if (softwareRenderer->model == GB_MODEL_SGB) { p = softwareRenderer->d.sgbAttributes[(x >> 5) + 5 * (y >> 3)]; p >>= 6 - ((x / 4) & 0x6); @@ -361,11 +367,23 @@ static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* render row[x + 6] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 6] & 0x7F]]; row[x + 7] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x + 7] & 0x7F]]; } + if (softwareRenderer->model == GB_MODEL_SGB) { + p = softwareRenderer->d.sgbAttributes[(x >> 5) + 5 * (y >> 3)]; + p >>= 6 - ((x / 4) & 0x6); + p &= 3; + p <<= 2; + } + for (; x < endX; ++x) { + row[x] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x] & 0x7F]]; + } break; case 1: break; case 2: - for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 8) { + for (x = startX; x < ((startX + 7) & ~7) && x < endX; ++x) { + row[x] = 0; + } + for (; x + 7 < (endX & ~7); x += 8) { row[x] = 0; row[x + 1] = 0; row[x + 2] = 0; @@ -375,9 +393,15 @@ static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* render row[x + 6] = 0; row[x + 7] = 0; } + for (; x < endX; ++x) { + row[x] = 0; + } break; case 3: - for (x = 0; x < GB_VIDEO_HORIZONTAL_PIXELS; x += 8) { + for (x = startX; x < ((startX + 7) & ~7) && x < endX; ++x) { + row[x] = softwareRenderer->palette[0]; + } + for (; x + 7 < (endX & ~7); x += 8) { row[x] = softwareRenderer->palette[0]; row[x + 1] = softwareRenderer->palette[0]; row[x + 2] = softwareRenderer->palette[0]; @@ -387,8 +411,15 @@ static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* render row[x + 6] = softwareRenderer->palette[0]; row[x + 7] = softwareRenderer->palette[0]; } + for (; x < endX; ++x) { + row[x] = softwareRenderer->palette[0]; + } break; } +} + +static void GBVideoSoftwareRendererFinishScanline(struct GBVideoRenderer* renderer, int y) { + struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && softwareRenderer->wy <= y && softwareRenderer->wx - 7 < GB_VIDEO_HORIZONTAL_PIXELS) { ++softwareRenderer->currentWy; From 75e609f65cec1e3e7336f305dda75eac4e17f0ab Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 19:35:00 -0700 Subject: [PATCH 057/158] GB: Drop invalid SGB packets --- src/gb/video.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gb/video.c b/src/gb/video.c index 3857ffbf5..6458f89df 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -552,6 +552,10 @@ void GBVideoSetPalette(struct GBVideo* video, unsigned index, uint32_t color) { void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { int i; if (!(video->sgbCommandHeader & 7)) { + if ((data[0] >> 3) > SGB_OBJ_TRN) { + video->sgbCommandHeader = 0; + return; + } video->sgbCommandHeader = data[0]; } --video->sgbCommandHeader; From 17fa98fe4e90de445af406e962d1b49ce8865265 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 22:20:32 -0700 Subject: [PATCH 058/158] Qt: ConfigController::getOption now has a default argument --- src/platform/qt/ConfigController.cpp | 12 ++++++++---- src/platform/qt/ConfigController.h | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/platform/qt/ConfigController.cpp b/src/platform/qt/ConfigController.cpp index 9136f1679..3b3074aa7 100644 --- a/src/platform/qt/ConfigController.cpp +++ b/src/platform/qt/ConfigController.cpp @@ -158,12 +158,16 @@ void ConfigController::updateOption(const char* key) { m_optionSet[optionName]->setValue(mCoreConfigGetValue(&m_config, key)); } -QString ConfigController::getOption(const char* key) const { - return QString(mCoreConfigGetValue(&m_config, key)); +QString ConfigController::getOption(const char* key, const QVariant& defaultVal) const { + const char* val = mCoreConfigGetValue(&m_config, key); + if (val) { + return QString(val); + } + return defaultVal.toString(); } -QString ConfigController::getOption(const QString& key) const { - return getOption(key.toUtf8().constData()); +QString ConfigController::getOption(const QString& key, const QVariant& defaultVal) const { + return getOption(key.toUtf8().constData(), defaultVal); } QVariant ConfigController::getQtOption(const QString& key, const QString& group) const { diff --git a/src/platform/qt/ConfigController.h b/src/platform/qt/ConfigController.h index 3c3a9bca3..17079ea4c 100644 --- a/src/platform/qt/ConfigController.h +++ b/src/platform/qt/ConfigController.h @@ -70,8 +70,8 @@ public: ConfigOption* addOption(const char* key); void updateOption(const char* key); - QString getOption(const char* key) const; - QString getOption(const QString& key) const; + QString getOption(const char* key, const QVariant& defaultVal = QVariant()) const; + QString getOption(const QString& key, const QVariant& defaultVal = QVariant()) const; QVariant getQtOption(const QString& key, const QString& group = QString()) const; From 7bd29d6e44c60a7812c499879e160d3a95e53f25 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 22:20:43 -0700 Subject: [PATCH 059/158] Qt: Fix autofire --- src/platform/qt/CoreController.cpp | 14 ++++++++------ src/platform/qt/CoreController.h | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 286f3dc4d..00c40e1a9 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -209,12 +209,13 @@ QSize CoreController::screenDimensions() const { void CoreController::loadConfig(ConfigController* config) { Interrupter interrupter(this); - m_loadStateFlags = config->getOption("loadStateExtdata").toInt(); - m_saveStateFlags = config->getOption("saveStateExtdata").toInt(); - m_fastForwardRatio = config->getOption("fastForwardRatio").toFloat(); - m_videoSync = config->getOption("videoSync").toInt(); - m_audioSync = config->getOption("audioSync").toInt(); + m_loadStateFlags = config->getOption("loadStateExtdata", m_loadStateFlags).toInt(); + m_saveStateFlags = config->getOption("saveStateExtdata", m_saveStateFlags).toInt(); + m_fastForwardRatio = config->getOption("fastForwardRatio", m_fastForwardRatio).toFloat(); + m_videoSync = config->getOption("videoSync", m_videoSync).toInt(); + m_audioSync = config->getOption("audioSync", m_audioSync).toInt(); m_fpsTarget = config->getOption("fpsTarget").toFloat(); + m_autofireThreshold = config->getOption("autofireThreshold", m_autofireThreshold).toInt(); updateFastForward(); mCoreLoadForeignConfig(m_threadContext.core, config->config()); mCoreThreadRewindParamsChanged(&m_threadContext); @@ -706,8 +707,9 @@ int CoreController::updateAutofire() { continue; } ++m_autofireStatus[k]; - if (m_autofireStatus[k]) { + if (m_autofireStatus[k] >= 2 * m_autofireThreshold) { m_autofireStatus[k] = 0; + } else if (m_autofireStatus[k] >= m_autofireThreshold) { active |= 1 << k; } } diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 13c79e56c..4cd1a9f05 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -184,6 +184,7 @@ private: int m_activeKeys = 0; bool m_autofire[32] = {}; int m_autofireStatus[32] = {}; + int m_autofireThreshold = 1; VFileDevice m_backupLoadState; QByteArray m_backupSaveState{nullptr}; From 1733c6456125b0a49c7f7fcac28ffe4328ce4701 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 22:43:15 -0700 Subject: [PATCH 060/158] Qt: Customizable autofire speed (closes #789) --- CHANGES | 1 + src/platform/qt/SettingsView.cpp | 2 ++ src/platform/qt/SettingsView.ui | 57 +++++++++++++++++++++----------- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/CHANGES b/CHANGES index b5e6e3575..f9127fa84 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,7 @@ Features: - Qt: Set default Game Boy colors - Game Boy Printer support - Super Game Boy support + - Customizable autofire speed Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index 7102ad767..e3d8b925e 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -288,6 +288,7 @@ void SettingsView::updateConfig() { saveSetting("audioSync", m_ui.audioSync); saveSetting("frameskip", m_ui.frameskip); saveSetting("fpsTarget", m_ui.fpsTarget); + saveSetting("autofireThreshold", m_ui.autofireThreshold); saveSetting("lockAspectRatio", m_ui.lockAspectRatio); saveSetting("lockIntegerScaling", m_ui.lockIntegerScaling); saveSetting("volume", m_ui.volume); @@ -391,6 +392,7 @@ void SettingsView::reloadConfig() { loadSetting("audioSync", m_ui.audioSync); loadSetting("frameskip", m_ui.frameskip); loadSetting("fpsTarget", m_ui.fpsTarget); + loadSetting("autofireThreshold", m_ui.autofireThreshold); loadSetting("lockAspectRatio", m_ui.lockAspectRatio); loadSetting("lockIntegerScaling", m_ui.lockIntegerScaling); loadSetting("volume", m_ui.volume); diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index 7b2510018..d256ccfee 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -7,7 +7,7 @@ 0 0 650 - 454 + 488 @@ -545,28 +545,28 @@ - + Qt::Horizontal - + Enable rewind - + Rewind history: - + @@ -584,21 +584,21 @@ - + Qt::Horizontal - + Idle loops: - + @@ -617,21 +617,21 @@ - + Qt::Horizontal - + Savestate extra data: - + Screenshot @@ -641,7 +641,7 @@ - + Save data @@ -651,7 +651,7 @@ - + Cheat codes @@ -661,14 +661,14 @@ - + Load extra data: - + Screenshot @@ -678,28 +678,28 @@ - + Save data - + Cheat codes - + Qt::Horizontal - + Rewind affects save data @@ -709,13 +709,30 @@ - + Preload entire ROM into memory + + + + Autofire interval: + + + + + + + 1 + + + 60 + + + From 1a749240239d58eab801825eb5d43be19290b90d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 3 Aug 2017 23:56:44 -0700 Subject: [PATCH 061/158] Core: Add pause/unpause callbacks to mCoreThread --- include/mgba/core/thread.h | 12 ++++++-- src/core/thread.c | 48 +++++++++++++++++++++--------- src/platform/qt/CoreController.cpp | 14 +++++++-- 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/include/mgba/core/thread.h b/include/mgba/core/thread.h index 420533762..9e609bfe7 100644 --- a/include/mgba/core/thread.h +++ b/include/mgba/core/thread.h @@ -34,6 +34,8 @@ struct mCoreThread { ThreadCallback cleanCallback; ThreadCallback frameCallback; ThreadCallback sleepCallback; + ThreadCallback pauseCallback; + ThreadCallback unpauseCallback; void* userData; void (*run)(struct mCoreThread*); @@ -50,13 +52,19 @@ enum mCoreThreadState { THREAD_RUNNING = 0, THREAD_REWINDING, THREAD_MAX_RUNNING = THREAD_REWINDING, + + THREAD_WAITING, THREAD_INTERRUPTED, - THREAD_INTERRUPTING, THREAD_PAUSED, + THREAD_MAX_WAITING = THREAD_PAUSED, + THREAD_PAUSING, THREAD_RUN_ON, - THREAD_WAITING, THREAD_RESETING, + THREAD_MIN_DEFERRED = THREAD_PAUSING, + THREAD_MAX_DEFERRED = THREAD_RESETING, + + THREAD_INTERRUPTING, THREAD_EXITING, THREAD_SHUTDOWN, THREAD_CRASHED diff --git a/src/core/thread.c b/src/core/thread.c index 782b573df..f17b5e30a 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -195,38 +195,58 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } } - int resetScheduled = 0; + enum mCoreThreadState deferred = THREAD_RUNNING; MutexLock(&impl->stateMutex); while (impl->state > THREAD_MAX_RUNNING && impl->state < THREAD_EXITING) { - if (impl->state == THREAD_PAUSING) { - impl->state = THREAD_PAUSED; - ConditionWake(&impl->stateCond); - } + deferred = impl->state; + if (impl->state == THREAD_INTERRUPTING) { impl->state = THREAD_INTERRUPTED; ConditionWake(&impl->stateCond); } - if (impl->state == THREAD_RUN_ON) { - if (threadContext->run) { - threadContext->run(threadContext); - } - impl->state = impl->savedState; - ConditionWake(&impl->stateCond); + + if (impl->state == THREAD_PAUSING) { + impl->state = THREAD_PAUSED; } if (impl->state == THREAD_RESETING) { impl->state = THREAD_RUNNING; - resetScheduled = 1; } - while (impl->state == THREAD_PAUSED || impl->state == THREAD_INTERRUPTED || impl->state == THREAD_WAITING) { + + if (deferred >= THREAD_MIN_DEFERRED && deferred <= THREAD_MAX_DEFERRED) { + break; + } + + deferred = impl->state; + while (impl->state >= THREAD_WAITING && impl->state <= THREAD_MAX_WAITING) { ConditionWait(&impl->stateCond, &impl->stateMutex); } } MutexUnlock(&impl->stateMutex); - if (resetScheduled) { + switch (deferred) { + case THREAD_PAUSING: + if (threadContext->pauseCallback) { + threadContext->pauseCallback(threadContext); + } + break; + case THREAD_PAUSED: + if (threadContext->unpauseCallback) { + threadContext->unpauseCallback(threadContext); + } + break; + case THREAD_RUN_ON: + if (threadContext->run) { + threadContext->run(threadContext); + } + threadContext->impl->state = threadContext->impl->savedState; + break; + case THREAD_RESETING: core->reset(core); if (threadContext->resetCallback) { threadContext->resetCallback(threadContext); } + break; + default: + break; } } diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 00c40e1a9..108fafed9 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -109,6 +109,18 @@ CoreController::CoreController(mCore* core, QObject* parent) QMetaObject::invokeMethod(controller, "stopping"); }; + m_threadContext.pauseCallback = [](mCoreThread* context) { + CoreController* controller = static_cast(context->userData); + + QMetaObject::invokeMethod(controller, "paused"); + }; + + m_threadContext.unpauseCallback = [](mCoreThread* context) { + CoreController* controller = static_cast(context->userData); + + QMetaObject::invokeMethod(controller, "unpaused"); + }; + m_threadContext.logger.d.log = [](mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args) { mThreadLogger* logContext = reinterpret_cast(logger); mCoreThread* context = logContext->p; @@ -344,11 +356,9 @@ void CoreController::setPaused(bool paused) { QMutexLocker locker(&m_mutex); m_frameActions.append([this]() { mCoreThreadPauseFromThread(&m_threadContext); - QMetaObject::invokeMethod(this, "paused"); }); } else { mCoreThreadUnpause(&m_threadContext); - emit unpaused(); } } From 41e00148bfa2e75ee72505030f4fd91fe5c13cfb Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Aug 2017 08:17:35 -0700 Subject: [PATCH 062/158] Core: Change thread startCallback semantics to before reset --- src/core/thread.c | 8 ++++---- src/platform/qt/CoreController.cpp | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/core/thread.c b/src/core/thread.c index f17b5e30a..3a0c802ea 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -158,7 +158,6 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { }; core->addCoreCallbacks(core, &callbacks); core->setSync(core, &threadContext->impl->sync); - core->reset(core); struct mLogFilter filter; if (!threadContext->logger.d.filter) { @@ -168,12 +167,13 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } mCoreThreadRewindParamsChanged(threadContext); - - _changeState(threadContext->impl, THREAD_RUNNING, true); - if (threadContext->startCallback) { threadContext->startCallback(threadContext); } + + core->reset(core); + _changeState(threadContext->impl, THREAD_RUNNING, true); + if (threadContext->resetCallback) { threadContext->resetCallback(threadContext); } diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 108fafed9..1372c48f8 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -66,10 +66,6 @@ CoreController::CoreController(mCore* core, QObject* parent) controller->m_override->apply(context->core); } - if (mCoreLoadState(context->core, 0, controller->m_loadStateFlags)) { - mCoreDeleteState(context->core, 0); - } - if (controller->m_multiplayer) { controller->m_multiplayer->attachGame(controller); } @@ -82,6 +78,11 @@ CoreController::CoreController(mCore* core, QObject* parent) for (auto action : controller->m_resetActions) { action(); } + + if (mCoreLoadState(context->core, 0, controller->m_loadStateFlags)) { + mCoreDeleteState(context->core, 0); + } + controller->m_resetActions.clear(); QSize size = controller->screenDimensions(); From 5b1e65052c04b48ba2f5ef44847aa140ef27c2aa Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Aug 2017 08:21:18 -0700 Subject: [PATCH 063/158] GB: Clean up startup messages --- src/gb/gb.c | 1 - src/gb/io.c | 20 +++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/gb/gb.c b/src/gb/gb.c index 66c8c2aa6..c8bf46ec4 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -163,7 +163,6 @@ void GBResizeSram(struct GB* gb, size_t size) { if (gb->memory.sram && size <= gb->sramSize) { return; } - mLOG(GB, INFO, "Resizing SRAM to %"PRIz"u bytes", size); struct VFile* vf = gb->sramVf; if (vf) { if (vf == gb->sramRealVf) { diff --git a/src/gb/io.c b/src/gb/io.c index 962eeb1bf..d8494a569 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -171,15 +171,17 @@ void GBIOReset(struct GB* gb) { GBIOWrite(gb, REG_OBP1, 0xFF); GBIOWrite(gb, REG_WY, 0x00); GBIOWrite(gb, REG_WX, 0x00); - GBIOWrite(gb, REG_VBK, 0); - GBIOWrite(gb, REG_BCPS, 0); - GBIOWrite(gb, REG_OCPS, 0); - GBIOWrite(gb, REG_SVBK, 1); - GBIOWrite(gb, REG_HDMA1, 0xFF); - GBIOWrite(gb, REG_HDMA2, 0xFF); - GBIOWrite(gb, REG_HDMA3, 0xFF); - GBIOWrite(gb, REG_HDMA4, 0xFF); - gb->memory.io[REG_HDMA5] = 0xFF; + if (gb->model >= GB_MODEL_CGB) { + GBIOWrite(gb, REG_VBK, 0); + GBIOWrite(gb, REG_BCPS, 0); + GBIOWrite(gb, REG_OCPS, 0); + GBIOWrite(gb, REG_SVBK, 1); + GBIOWrite(gb, REG_HDMA1, 0xFF); + GBIOWrite(gb, REG_HDMA2, 0xFF); + GBIOWrite(gb, REG_HDMA3, 0xFF); + GBIOWrite(gb, REG_HDMA4, 0xFF); + gb->memory.io[REG_HDMA5] = 0xFF; + } GBIOWrite(gb, REG_IE, 0x00); } From b1b78a46b586a897490c1cefbabbf08302bd5a49 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Aug 2017 10:19:44 -0700 Subject: [PATCH 064/158] 3DS: Remove annoying and confusing shutter sound --- src/platform/3ds/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index 17a28175d..eb34ae878 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -694,7 +694,6 @@ static void _startRequestImage(struct mImageSource* source, unsigned w, unsigned CAMU_Activate(imageSource->cam); CAMU_ClearBuffer(PORT_CAM1); CAMU_StartCapture(PORT_CAM1); - CAMU_PlayShutterSound(SHUTTER_SOUND_TYPE_MOVIE); if (imageSource->cam) { CAMU_SetReceiving(&imageSource->handles[0], imageSource->buffer, PORT_CAM1, imageSource->bufferSize, imageSource->transferSize); From a5852c6e126d82915fb5da23d8d3c347ec9755d2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Aug 2017 10:20:23 -0700 Subject: [PATCH 065/158] 3DS, Qt: Fix flipped camera images (fixes #844) --- src/platform/3ds/main.c | 1 + src/platform/qt/VideoDumper.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index eb34ae878..400147022 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -254,6 +254,7 @@ static void _resetCamera(struct m3DSImageSource* imageSource) { CAMU_SetSize(imageSource->cam, SIZE_QCIF, CONTEXT_A); CAMU_SetOutputFormat(imageSource->cam, OUTPUT_RGB_565, CONTEXT_A); CAMU_SetFrameRate(imageSource->cam, FRAME_RATE_30); + CAMU_FlipImage(imageSource->cam, FLIP_NONE, CONTEXT_A); CAMU_SetNoiseFilter(imageSource->cam, true); CAMU_SetAutoExposure(imageSource->cam, false); diff --git a/src/platform/qt/VideoDumper.cpp b/src/platform/qt/VideoDumper.cpp index a92d34754..c5ed93eb2 100644 --- a/src/platform/qt/VideoDumper.cpp +++ b/src/platform/qt/VideoDumper.cpp @@ -39,7 +39,7 @@ bool VideoDumper::present(const QVideoFrame& frame) { } else { #ifdef Q_OS_WIN // Qt's DirectShow plug-in is pretty dang buggy - image = image.mirrored(true); + image = image.mirrored(); #else image = image.copy(); // Create a deep copy of the bits #endif From 30db4ebee83ce904689e66543078abff5e1e4205 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Aug 2017 10:35:09 -0700 Subject: [PATCH 066/158] Qt: Fix GL display when loading a game from CLI (fixes #843) --- CHANGES | 1 + src/platform/qt/Window.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index f9127fa84..67f755482 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,7 @@ Bugfixes: - GB MBC: Fix RTC initialization (fixes mgba.io/i/825) - GB MBC: Fix RTC loading when file size is off - GB Serialize: Fix deserializing video STAT + - Qt: Fix GL display when loading a game from CLI (fixes mgba.io/i/843) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index be9d6d3dc..dbc3d915e 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -560,6 +560,9 @@ void Window::showEvent(QShowEvent* event) { enterFullScreen(); m_fullscreenOnStart = false; } + if (m_display) { + reloadDisplayDriver(); + } } void Window::closeEvent(QCloseEvent* event) { From c030fb656f69206dda86468549290ba679d37cdc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Aug 2017 12:42:10 -0700 Subject: [PATCH 067/158] GB, GBA Savedata: Fix savestate-related save overwriting (fixes #834) --- CHANGES | 1 + src/gb/gb.c | 8 +++++++- src/gba/memory.c | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 67f755482..1dd1fe641 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,7 @@ Bugfixes: - GB MBC: Fix RTC loading when file size is off - GB Serialize: Fix deserializing video STAT - Qt: Fix GL display when loading a game from CLI (fixes mgba.io/i/843) + - GB, GBA Savedata: Fix savestate-related save overwriting (fixes mgba.io/i/834) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/gb.c b/src/gb/gb.c index c8bf46ec4..6fee40927 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -220,7 +220,7 @@ void GBResizeSram(struct GB* gb, size_t size) { void GBSramClean(struct GB* gb, uint32_t frameCount) { // TODO: Share with GBASavedataClean - if (!gb->sramVf || gb->sramVf != gb->sramRealVf) { + if (!gb->sramVf) { return; } if (gb->sramDirty & GB_SRAM_DIRT_NEW) { @@ -230,6 +230,9 @@ void GBSramClean(struct GB* gb, uint32_t frameCount) { gb->sramDirty |= GB_SRAM_DIRT_SEEN; } } else if ((gb->sramDirty & GB_SRAM_DIRT_SEEN) && frameCount - gb->sramDirtAge > CLEANUP_THRESHOLD) { + if (gb->sramMaskWriteback) { + GBSavedataUnmask(gb); + } if (gb->memory.mbcType == GB_MBC3_RTC) { GBMBCRTCWrite(gb); } @@ -259,7 +262,9 @@ void GBSavedataUnmask(struct GB* gb) { gb->sramVf = gb->sramRealVf; gb->memory.sram = gb->sramVf->map(gb->sramVf, gb->sramSize, MAP_WRITE); if (gb->sramMaskWriteback) { + vf->seek(vf, 0, SEEK_SET); vf->read(vf, gb->memory.sram, gb->sramSize); + gb->sramMaskWriteback = false; } vf->close(vf); } @@ -287,6 +292,7 @@ void GBUnloadROM(struct GB* gb) { gb->memory.mbcType = GB_MBC_AUTODETECT; gb->isPristine = false; + gb->sramMaskWriteback = false; GBSavedataUnmask(gb); GBSramDeinit(gb); if (gb->sramRealVf) { diff --git a/src/gba/memory.c b/src/gba/memory.c index 5b81f1963..022d812a9 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -92,6 +92,7 @@ void GBAMemoryDeinit(struct GBA* gba) { if (gba->memory.rom) { mappedMemoryFree(gba->memory.rom, gba->memory.romSize); } + gba->memory.savedata.maskWriteback = false; GBASavedataUnmask(&gba->memory.savedata); GBASavedataDeinit(&gba->memory.savedata); if (gba->memory.savedata.realVf) { From ffa7e9b8d2bd4a7f30d15bdd4f2f5e14ab6f2787 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Aug 2017 13:38:48 -0700 Subject: [PATCH 068/158] Qt: Fix timezone issues with time overrides --- CHANGES | 1 + src/platform/qt/SensorView.cpp | 4 ++-- src/platform/qt/SensorView.ui | 3 --- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 1dd1fe641..ab8ed1790 100644 --- a/CHANGES +++ b/CHANGES @@ -26,6 +26,7 @@ Bugfixes: - GB Serialize: Fix deserializing video STAT - Qt: Fix GL display when loading a game from CLI (fixes mgba.io/i/843) - GB, GBA Savedata: Fix savestate-related save overwriting (fixes mgba.io/i/834) + - Qt: Fix timezone issues with time overrides Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/platform/qt/SensorView.cpp b/src/platform/qt/SensorView.cpp index bbcf0dd6a..9deb4f5e0 100644 --- a/src/platform/qt/SensorView.cpp +++ b/src/platform/qt/SensorView.cpp @@ -63,10 +63,10 @@ void SensorView::setController(std::shared_ptr controller) { m_controller = controller; connect(m_ui.timeNoOverride, &QAbstractButton::clicked, controller.get(), &CoreController::setRealTime); connect(m_ui.timeFixed, &QRadioButton::clicked, [controller, this] () { - controller->setFixedTime(m_ui.time->dateTime()); + controller->setFixedTime(m_ui.time->dateTime().toUTC()); }); connect(m_ui.timeFakeEpoch, &QRadioButton::clicked, [controller, this] () { - controller->setFakeEpoch(m_ui.time->dateTime()); + controller->setFakeEpoch(m_ui.time->dateTime().toUTC()); }); m_ui.timeButtons->checkedButton()->clicked(); diff --git a/src/platform/qt/SensorView.ui b/src/platform/qt/SensorView.ui index 1289d67aa..d75b5329d 100644 --- a/src/platform/qt/SensorView.ui +++ b/src/platform/qt/SensorView.ui @@ -96,9 +96,6 @@ MM/dd/yy hh:mm:ss AP - - Qt::UTC - From d7fc09768d0c5771f11ad4cf1b40851e7a11a6aa Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 06:56:47 -0700 Subject: [PATCH 069/158] Qt: Fix sprite export pausing game indefinitely (fixes #841) --- CHANGES | 1 + src/platform/qt/ObjView.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ab8ed1790..a4b25f954 100644 --- a/CHANGES +++ b/CHANGES @@ -27,6 +27,7 @@ Bugfixes: - Qt: Fix GL display when loading a game from CLI (fixes mgba.io/i/843) - GB, GBA Savedata: Fix savestate-related save overwriting (fixes mgba.io/i/834) - Qt: Fix timezone issues with time overrides + - Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/platform/qt/ObjView.cpp b/src/platform/qt/ObjView.cpp index 871a95cbc..7201b80bc 100644 --- a/src/platform/qt/ObjView.cpp +++ b/src/platform/qt/ObjView.cpp @@ -248,7 +248,6 @@ void ObjView::updateTilesGB(bool force) { #ifdef USE_PNG void ObjView::exportObj() { - CoreController::Interrupter interrupter(m_controller); QString filename = GBAApp::app()->getSaveFileName(this, tr("Export sprite"), tr("Portable Network Graphics (*.png)")); VFile* vf = VFileDevice::open(filename, O_WRONLY | O_CREAT | O_TRUNC); @@ -257,6 +256,7 @@ void ObjView::exportObj() { return; } + CoreController::Interrupter interrupter(m_controller); mTileCacheSetPalette(m_tileCache, m_objInfo.paletteSet); png_structp png = PNGWriteOpen(vf); png_infop info = PNGWriteHeader8(png, m_objInfo.width * 8, m_objInfo.height * 8); From 32031591233373d20aabbba77faaf860f639f0ad Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 07:56:36 -0700 Subject: [PATCH 070/158] GB Core: Ability to set default Game Boy model --- CHANGES | 1 + include/mgba/gb/interface.h | 3 + src/gb/core.c | 17 +++++ src/gb/gb.c | 37 +++++++++++ src/gb/overrides.c | 45 +------------- src/platform/qt/SettingsView.cpp | 49 +++++++++++++++ src/platform/qt/SettingsView.h | 8 +++ src/platform/qt/SettingsView.ui | 103 ++++++++++++++++++++++++++----- 8 files changed, 205 insertions(+), 58 deletions(-) diff --git a/CHANGES b/CHANGES index a4b25f954..58f4109ec 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Features: - Game Boy Printer support - Super Game Boy support - Customizable autofire speed + - Ability to set default Game Boy model Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core diff --git a/include/mgba/gb/interface.h b/include/mgba/gb/interface.h index 77e7eef17..809c0ca36 100644 --- a/include/mgba/gb/interface.h +++ b/include/mgba/gb/interface.h @@ -47,6 +47,9 @@ struct GBSIODriver { uint8_t (*writeSC)(struct GBSIODriver* driver, uint8_t value); }; +enum GBModel GBNameToModel(const char*); +const char* GBModelToName(enum GBModel); + CXX_GUARD_END #endif diff --git a/src/gb/core.c b/src/gb/core.c index a90479d86..552ad70b3 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -183,6 +183,9 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf mCoreConfigCopyValue(&core->config, config, "gb.bios"); mCoreConfigCopyValue(&core->config, config, "sgb.bios"); mCoreConfigCopyValue(&core->config, config, "gbc.bios"); + mCoreConfigCopyValue(&core->config, config, "gb.model"); + mCoreConfigCopyValue(&core->config, config, "sgb.model"); + mCoreConfigCopyValue(&core->config, config, "cgb.model"); #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 struct GBCore* gbcore = (struct GBCore*) core; @@ -327,6 +330,20 @@ static void _GBCoreReset(struct mCore* core) { } } + const char* modelGB = mCoreConfigGetValue(&core->config, "gb.model"); + const char* modelCGB = mCoreConfigGetValue(&core->config, "cgb.model"); + const char* modelSGB = mCoreConfigGetValue(&core->config, "sgb.model"); + if (modelGB || modelCGB || modelSGB) { + GBDetectModel(gb); + if (gb->model == GB_MODEL_DMG && modelGB) { + gb->model = GBNameToModel(modelGB); + } else if (gb->model == GB_MODEL_CGB && modelCGB) { + gb->model = GBNameToModel(modelCGB); + } else if (gb->model == GB_MODEL_SGB && modelSGB) { + gb->model = GBNameToModel(modelSGB); + } + } + #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 if (!gb->biosVf && core->opts.useBios) { struct VFile* bios = NULL; diff --git a/src/gb/gb.c b/src/gb/gb.c index 6fee40927..3ce090655 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -737,3 +737,40 @@ void GBFrameEnded(struct GB* gb) { GBTestKeypadIRQ(gb); } + +enum GBModel GBNameToModel(const char* model) { + if (strcasecmp(model, "DMG") == 0) { + return GB_MODEL_DMG; + } else if (strcasecmp(model, "CGB") == 0) { + return GB_MODEL_CGB; + } else if (strcasecmp(model, "AGB") == 0) { + return GB_MODEL_AGB; + } else if (strcasecmp(model, "SGB") == 0) { + return GB_MODEL_SGB; + } else if (strcasecmp(model, "MGB") == 0) { + return GB_MODEL_MGB; + } else if (strcasecmp(model, "SGB2") == 0) { + return GB_MODEL_SGB2; + } + return GB_MODEL_AUTODETECT; +} + +const char* GBModelToName(enum GBModel model) { + switch (model) { + case GB_MODEL_DMG: + return "DMG"; + case GB_MODEL_SGB: + return "SGB"; + case GB_MODEL_MGB: + return "MGB"; + case GB_MODEL_SGB2: + return "SGB2"; + case GB_MODEL_CGB: + return "CGB"; + case GB_MODEL_AGB: + return "AGB"; + default: + case GB_MODEL_AUTODETECT: + return NULL; + } +} diff --git a/src/gb/overrides.c b/src/gb/overrides.c index 63adadf0b..738dcd443 100644 --- a/src/gb/overrides.c +++ b/src/gb/overrides.c @@ -43,25 +43,8 @@ bool GBOverrideFind(const struct Configuration* config, struct GBCartridgeOverri }; if (model) { - if (strcasecmp(model, "DMG") == 0) { - found = true; - override->model = GB_MODEL_DMG; - } else if (strcasecmp(model, "CGB") == 0) { - found = true; - override->model = GB_MODEL_CGB; - } else if (strcasecmp(model, "AGB") == 0) { - found = true; - override->model = GB_MODEL_AGB; - } else if (strcasecmp(model, "SGB") == 0) { - found = true; - override->model = GB_MODEL_SGB; - } else if (strcasecmp(model, "MGB") == 0) { - found = true; - override->model = GB_MODEL_MGB; - } else if (strcasecmp(model, "SGB2") == 0) { - found = true; - override->model = GB_MODEL_SGB2; - } + override->model = GBNameToModel(model); + found = override->model != GB_MODEL_AUTODETECT; } if (mbc) { @@ -94,29 +77,7 @@ bool GBOverrideFind(const struct Configuration* config, struct GBCartridgeOverri void GBOverrideSave(struct Configuration* config, const struct GBCartridgeOverride* override) { char sectionName[24] = ""; snprintf(sectionName, sizeof(sectionName), "gb.override.%08X", override->headerCrc32); - const char* model = 0; - switch (override->model) { - case GB_MODEL_DMG: - model = "DMG"; - break; - case GB_MODEL_SGB: - model = "SGB"; - break; - case GB_MODEL_MGB: - model = "MGB"; - break; - case GB_MODEL_SGB2: - model = "SGB2"; - break; - case GB_MODEL_CGB: - model = "CGB"; - break; - case GB_MODEL_AGB: - model = "AGB"; - break; - case GB_MODEL_AUTODETECT: - break; - } + const char* model = GBModelToName(override->model); ConfigurationSetValue(config, sectionName, "model", model); if (override->gbColors[0] | override->gbColors[1] | override->gbColors[2] | override->gbColors[3]) { diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index e3d8b925e..9e2d166f5 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -20,12 +20,27 @@ using namespace QGBA; +#ifdef M_CORE_GB +QList SettingsView::s_gbModelList; +#endif + SettingsView::SettingsView(ConfigController* controller, InputController* inputController, ShortcutController* shortcutController, QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) , m_controller(controller) { m_ui.setupUi(this); +#ifdef M_CORE_GB + if (s_gbModelList.isEmpty()) { + // NB: Keep in sync with SettingsView.ui + s_gbModelList.append(GB_MODEL_AUTODETECT); + s_gbModelList.append(GB_MODEL_DMG); + s_gbModelList.append(GB_MODEL_SGB); + s_gbModelList.append(GB_MODEL_CGB); + s_gbModelList.append(GB_MODEL_AGB); + } +#endif + reloadConfig(); if (m_ui.savegamePath->text().isEmpty()) { @@ -365,12 +380,23 @@ void SettingsView::updateConfig() { emit languageChanged(); } +#ifdef M_CORE_GB + GBModel modelGB = s_gbModelList[m_ui.gbModel->currentIndex()]; + m_controller->setOption("gb.model", GBModelToName(modelGB)); + + GBModel modelSGB = s_gbModelList[m_ui.sgbModel->currentIndex()]; + m_controller->setOption("sgb.model", GBModelToName(modelSGB)); + + GBModel modelCGB = s_gbModelList[m_ui.cgbModel->currentIndex()]; + m_controller->setOption("cgb.model", GBModelToName(modelCGB)); + if (m_gbColors[0] | m_gbColors[1] | m_gbColors[2] | m_gbColors[3]) { m_controller->setOption("gb.pal[0]", m_gbColors[0]); m_controller->setOption("gb.pal[1]", m_gbColors[1]); m_controller->setOption("gb.pal[2]", m_gbColors[2]); m_controller->setOption("gb.pal[3]", m_gbColors[3]); } +#endif m_controller->write(); @@ -448,6 +474,29 @@ void SettingsView::reloadConfig() { m_ui.saveStateScreenshot->setChecked(saveState & SAVESTATE_SCREENSHOT); m_ui.saveStateSave->setChecked(saveState & SAVESTATE_SAVEDATA); m_ui.saveStateCheats->setChecked(saveState & SAVESTATE_CHEATS); + +#ifdef M_CORE_GB + QString modelGB = m_controller->getOption("gb.model"); + if (!modelGB.isNull()) { + GBModel model = GBNameToModel(modelGB.toUtf8().constData()); + int index = s_gbModelList.indexOf(model); + m_ui.gbModel->setCurrentIndex(index >= 0 ? index : 0); + } + + QString modelSGB = m_controller->getOption("sgb.model"); + if (!modelSGB.isNull()) { + GBModel model = GBNameToModel(modelSGB.toUtf8().constData()); + int index = s_gbModelList.indexOf(model); + m_ui.sgbModel->setCurrentIndex(index >= 0 ? index : 0); + } + + QString modelCGB = m_controller->getOption("cgb.model"); + if (!modelCGB.isNull()) { + GBModel model = GBNameToModel(modelCGB.toUtf8().constData()); + int index = s_gbModelList.indexOf(model); + m_ui.cgbModel->setCurrentIndex(index >= 0 ? index : 0); + } +#endif } void SettingsView::saveSetting(const char* key, const QAbstractButton* field) { diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index 0713171f9..c229431f9 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -12,6 +12,10 @@ #include +#ifdef M_CORE_GB +#include +#endif + #include "ui_SettingsView.h" namespace QGBA { @@ -50,8 +54,12 @@ private: ConfigController* m_controller; InputController* m_input; ShaderSelector* m_shader = nullptr; + +#ifdef M_CORE_GB uint32_t m_gbColors[4]{}; ColorPicker m_colorPickers[4]; + static QList s_gbModelList; +#endif void saveSetting(const char* key, const QAbstractButton*); void saveSetting(const char* key, const QComboBox*); diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index d256ccfee..c2471590a 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -6,7 +6,7 @@ 0 0 - 650 + 588 488 @@ -1061,22 +1061,16 @@ - + - - false - - Default model + Game Boy model - - false - Autodetect @@ -1087,6 +1081,11 @@ Game Boy (DMG) + + + Super Game Boy (SGB) + + Game Boy Color (CGB) @@ -1099,14 +1098,14 @@ - + - Default colors + Default colors: - + @@ -1186,21 +1185,21 @@ - + Qt::Horizontal - + - Camera driver + Camera driver: - + @@ -1210,6 +1209,78 @@ + + + + Super Game Boy model + + + + + + + Game Boy Color model + + + + + + + + Autodetect + + + + + Game Boy (DMG) + + + + + Super Game Boy (SGB) + + + + + Game Boy Color (CGB) + + + + + Game Boy Advance (AGB) + + + + + + + + + Autodetect + + + + + Game Boy (DMG) + + + + + Super Game Boy (SGB) + + + + + Game Boy Color (CGB) + + + + + Game Boy Advance (AGB) + + + + From a496ddc0723c9b6f78901576578abe096d3afb8f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 07:57:23 -0700 Subject: [PATCH 071/158] GB: Start building up MGB --- include/mgba/internal/gb/audio.h | 1 + src/gb/gb.c | 38 ++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/include/mgba/internal/gb/audio.h b/include/mgba/internal/gb/audio.h index b1e86e299..6165f6f4c 100644 --- a/include/mgba/internal/gb/audio.h +++ b/include/mgba/internal/gb/audio.h @@ -142,6 +142,7 @@ struct GBAudioNoiseChannel { enum GBAudioStyle { GB_AUDIO_DMG, + GB_AUDIO_MGB = GB_AUDIO_DMG, // TODO GB_AUDIO_CGB, GB_AUDIO_AGB, // GB in GBA GB_AUDIO_GBA, // GBA PSG diff --git a/src/gb/gb.c b/src/gb/gb.c index 3ce090655..3a24868ab 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -28,6 +28,7 @@ static const uint8_t _knownHeader[4] = { 0xCE, 0xED, 0x66, 0x66}; #define DMG_BIOS_CHECKSUM 0xC2F5CC97 #define DMG_2_BIOS_CHECKSUM 0x59C8598E +#define MGB_BIOS_CHECKSUM 0xE6920754 #define SGB_BIOS_CHECKSUM 0xEC8A83B9 #define CGB_BIOS_CHECKSUM 0x41884E46 @@ -390,6 +391,7 @@ bool GBIsBIOS(struct VFile* vf) { switch (_GBBiosCRC32(vf)) { case DMG_BIOS_CHECKSUM: case DMG_2_BIOS_CHECKSUM: + case MGB_BIOS_CHECKSUM: case SGB_BIOS_CHECKSUM: case CGB_BIOS_CHECKSUM: return true; @@ -434,8 +436,6 @@ void GBReset(struct LR35902Core* cpu) { switch (gb->model) { case GB_MODEL_AUTODETECT: // Silence warnings gb->model = GB_MODEL_DMG; - // TODO: SGB registers - case GB_MODEL_SGB: case GB_MODEL_DMG: cpu->a = 1; cpu->f.packed = 0xB0; @@ -445,6 +445,33 @@ void GBReset(struct LR35902Core* cpu) { cpu->l = 0x4D; gb->timer.internalDiv = 0x2AF3; break; + case GB_MODEL_SGB: + cpu->a = 1; + cpu->f.packed = 0x00; + cpu->c = 0x14; + cpu->e = 0x00; + cpu->h = 0xC0; + cpu->l = 0x60; + gb->timer.internalDiv = 0x2AF3; + break; + case GB_MODEL_MGB: + cpu->a = 0xFF; + cpu->f.packed = 0xB0; + cpu->c = 0x13; + cpu->e = 0xD8; + cpu->h = 1; + cpu->l = 0x4D; + gb->timer.internalDiv = 0x2AF3; + break; + case GB_MODEL_SGB2: + cpu->a = 0xFF; + cpu->f.packed = 0x00; + cpu->c = 0x14; + cpu->e = 0x00; + cpu->h = 0xC0; + cpu->l = 0x60; + gb->timer.internalDiv = 0x2AF3; + break; case GB_MODEL_AGB: cpu->b = 1; // Fall through @@ -502,6 +529,9 @@ void GBDetectModel(struct GB* gb) { case DMG_2_BIOS_CHECKSUM: gb->model = GB_MODEL_DMG; break; + case MGB_BIOS_CHECKSUM: + gb->model = GB_MODEL_MGB; + break; case SGB_BIOS_CHECKSUM: gb->model = GB_MODEL_SGB; break; @@ -530,6 +560,10 @@ void GBDetectModel(struct GB* gb) { case GB_MODEL_AUTODETECT: //Silence warnings gb->audio.style = GB_AUDIO_DMG; break; + case GB_MODEL_MGB: + case GB_MODEL_SGB2: + gb->audio.style = GB_AUDIO_MGB; + break; case GB_MODEL_AGB: case GB_MODEL_CGB: gb->audio.style = GB_AUDIO_CGB; From f0686a3b786b0c264d2dfe37080839ba6c9775ce Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 07:57:47 -0700 Subject: [PATCH 072/158] Python: Add basic support for Configs --- src/platform/python/mgba/core.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/platform/python/mgba/core.py b/src/platform/python/mgba/core.py index 6f9897439..cefc97eb7 100644 --- a/src/platform/python/mgba/core.py +++ b/src/platform/python/mgba/core.py @@ -103,6 +103,7 @@ class Core(object): self._protected = False self._callbacks = CoreCallbacks() self._core.addCoreCallbacks(self._core, self._callbacks.context) + self.config = Config(ffi.addressof(native.config)) @cached_property def tiles(self): @@ -148,6 +149,9 @@ class Core(object): def loadPatch(self, vf): return bool(self._core.loadPatch(self._core, vf.handle)) + def loadConfig(self, config): + lib.mCoreLoadForeignConfig(self._core, config._native) + def autoloadSave(self): return bool(lib.mCoreAutoloadSave(self._core)) @@ -261,3 +265,28 @@ class IRunner(object): def isPaused(self): raise NotImplementedError + +class Config(object): + def __init__(self, native=None, port=None, defaults={}): + if not native: + self._port = ffi.NULL + if port: + self._port = ffi.new("char[]", port.encode("UTF-8")) + native = ffi.gc(ffi.new("struct mCoreConfig*"), lib.mCoreConfigDeinit) + lib.mCoreConfigInit(native, self._port) + self._native = native + for key, value in defaults.items(): + if isinstance(value, bool): + value = int(value) + lib.mCoreConfigSetDefaultValue(self._native, ffi.new("char[]", key.encode("UTF-8")), ffi.new("char[]", str(value).encode("UTF-8"))) + + def __getitem__(self, key): + string = lib.mCoreConfigGetValue(self._native, ffi.new("char[]", key.encode("UTF-8"))) + if not string: + return None + return ffi.string(string) + + def __setitem__(self, key, value): + if isinstance(value, bool): + value = int(value) + lib.mCoreConfigSetValue(self._native, ffi.new("char[]", key.encode("UTF-8")), ffi.new("char[]", str(value).encode("UTF-8"))) From 558055277f97168f2b7652f9351b9af595206e90 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 08:52:09 -0700 Subject: [PATCH 073/158] GB Video: Ability to disable SGB borders --- include/mgba/internal/gb/renderers/software.h | 1 + include/mgba/internal/gb/video.h | 4 +- src/gb/core.c | 7 +- src/gb/extra/proxy.c | 6 +- src/gb/renderers/software.c | 23 +-- src/gb/video.c | 13 +- src/platform/qt/SettingsView.cpp | 6 +- src/platform/qt/SettingsView.h | 2 +- src/platform/qt/SettingsView.ui | 162 ++++++++++-------- 9 files changed, 127 insertions(+), 97 deletions(-) diff --git a/include/mgba/internal/gb/renderers/software.h b/include/mgba/internal/gb/renderers/software.h index 4ee36d850..a5bbcb80f 100644 --- a/include/mgba/internal/gb/renderers/software.h +++ b/include/mgba/internal/gb/renderers/software.h @@ -42,6 +42,7 @@ struct GBVideoSoftwareRenderer { int sgbPacketId; int sgbDataSets; uint8_t sgbPartialDataSet[15]; + bool sgbBorders; }; void GBVideoSoftwareRendererCreate(struct GBVideoSoftwareRenderer*); diff --git a/include/mgba/internal/gb/video.h b/include/mgba/internal/gb/video.h index f9648168e..d44ff2298 100644 --- a/include/mgba/internal/gb/video.h +++ b/include/mgba/internal/gb/video.h @@ -67,7 +67,7 @@ union GBOAM { struct mTileCache; struct GBVideoRenderer { - void (*init)(struct GBVideoRenderer* renderer, enum GBModel model); + void (*init)(struct GBVideoRenderer* renderer, enum GBModel model, bool borders); void (*deinit)(struct GBVideoRenderer* renderer); uint8_t (*writeVideoRegister)(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); @@ -148,6 +148,8 @@ struct GBVideo { uint16_t dmgPalette[4]; uint16_t palette[64]; + bool sgbBorders; + int32_t frameCounter; int frameskip; int frameskipCounter; diff --git a/src/gb/core.c b/src/gb/core.c index 552ad70b3..04a042e19 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -187,6 +187,11 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf mCoreConfigCopyValue(&core->config, config, "sgb.model"); mCoreConfigCopyValue(&core->config, config, "cgb.model"); + int fakeBool; + if (mCoreConfigGetIntValue(config, "sgb.borders", &fakeBool)) { + gb->video.sgbBorders = fakeBool; + } + #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 struct GBCore* gbcore = (struct GBCore*) core; gbcore->overrides = mCoreConfigGetOverridesConst(config); @@ -195,7 +200,7 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf static void _GBCoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) { struct GB* gb = core->board; - if (!gb || gb->model != GB_MODEL_SGB) { + if (!gb || gb->model != GB_MODEL_SGB || !gb->video.sgbBorders) { *width = GB_VIDEO_HORIZONTAL_PIXELS; *height = GB_VIDEO_VERTICAL_PIXELS; } else { diff --git a/src/gb/extra/proxy.c b/src/gb/extra/proxy.c index 1f68ee0ee..9dc1d8fb3 100644 --- a/src/gb/extra/proxy.c +++ b/src/gb/extra/proxy.c @@ -12,7 +12,7 @@ #define BUFFER_OAM 1 #define BUFFER_SGB 2 -static void GBVideoProxyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model); +static void GBVideoProxyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model, bool borders); static void GBVideoProxyRendererDeinit(struct GBVideoRenderer* renderer); static uint8_t GBVideoProxyRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); static void GBVideoProxyRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data); @@ -96,12 +96,12 @@ void GBVideoProxyRendererUnshim(struct GBVideo* video, struct GBVideoProxyRender mVideoLoggerRendererDeinit(renderer->logger); } -void GBVideoProxyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model) { +void GBVideoProxyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model, bool borders) { struct GBVideoProxyRenderer* proxyRenderer = (struct GBVideoProxyRenderer*) renderer; _init(proxyRenderer); - proxyRenderer->backend->init(proxyRenderer->backend, model); + proxyRenderer->backend->init(proxyRenderer->backend, model, borders); } void GBVideoProxyRendererDeinit(struct GBVideoRenderer* renderer) { diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 025e1935c..a5f28b133 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -10,7 +10,7 @@ #include #include -static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum GBModel model); +static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum GBModel model, bool borders); static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer); static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); static void GBVideoSoftwareRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data); @@ -28,7 +28,7 @@ static void GBVideoSoftwareRendererDrawObj(struct GBVideoSoftwareRenderer* rende static void _clearScreen(struct GBVideoSoftwareRenderer* renderer) { size_t sgbOffset = 0; - if (renderer->model == GB_MODEL_SGB) { + if (renderer->model == GB_MODEL_SGB && renderer->sgbBorders) { sgbOffset = renderer->outputBufferStride * 40 + 48; } int y; @@ -166,7 +166,7 @@ void GBVideoSoftwareRendererCreate(struct GBVideoSoftwareRenderer* renderer) { renderer->temporaryBuffer = 0; } -static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum GBModel model) { +static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum GBModel model, bool sgbBorders) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; softwareRenderer->lcdc = 0; softwareRenderer->scy = 0; @@ -177,6 +177,7 @@ static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum G softwareRenderer->model = model; softwareRenderer->sgbTransfer = 0; softwareRenderer->sgbCommandHeader = 0; + softwareRenderer->sgbBorders = sgbBorders; int i; for (i = 0; i < 64; ++i) { softwareRenderer->lookup[i] = i; @@ -271,7 +272,9 @@ static void GBVideoSoftwareRendererWriteSGBPacket(struct GBVideoRenderer* render } break; case SGB_ATRC_EN: - _regenerateSGBBorder(softwareRenderer); + if (softwareRenderer->sgbBorders) { + _regenerateSGBBorder(softwareRenderer); + } break; } } @@ -334,11 +337,11 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i } size_t sgbOffset = 0; - if (softwareRenderer->model == GB_MODEL_SGB) { + if (softwareRenderer->model == GB_MODEL_SGB && softwareRenderer->sgbBorders) { sgbOffset = softwareRenderer->outputBufferStride * 40 + 48; } color_t* row = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y + sgbOffset]; - int x; + int x = startX; int p = 0; switch (softwareRenderer->d.sgbRenderMode) { case 0: @@ -348,7 +351,7 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i p &= 3; p <<= 2; } - for (x = startX; x < ((startX + 7) & ~7) && x < endX; ++x) { + for (; x < ((startX + 7) & ~7) && x < endX; ++x) { row[x] = softwareRenderer->palette[p | softwareRenderer->lookup[softwareRenderer->row[x] & 0x7F]]; } for (; x + 7 < (endX & ~7); x += 8) { @@ -380,7 +383,7 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i case 1: break; case 2: - for (x = startX; x < ((startX + 7) & ~7) && x < endX; ++x) { + for (; x < ((startX + 7) & ~7) && x < endX; ++x) { row[x] = 0; } for (; x + 7 < (endX & ~7); x += 8) { @@ -398,7 +401,7 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i } break; case 3: - for (x = startX; x < ((startX + 7) & ~7) && x < endX; ++x) { + for (; x < ((startX + 7) & ~7) && x < endX; ++x) { row[x] = softwareRenderer->palette[0]; } for (; x + 7 < (endX & ~7); x += 8) { @@ -498,7 +501,7 @@ static void GBVideoSoftwareRendererFinishFrame(struct GBVideoRenderer* renderer) case SGB_PAL_TRN: case SGB_CHR_TRN: case SGB_PCT_TRN: - if (softwareRenderer->sgbTransfer > 0) { + if (softwareRenderer->sgbTransfer > 0 && softwareRenderer->sgbBorders) { // Make sure every buffer sees this if we're multibuffering _regenerateSGBBorder(softwareRenderer); } diff --git a/src/gb/video.c b/src/gb/video.c index 6458f89df..f7d56aa80 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -15,7 +15,7 @@ #include -static void GBVideoDummyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model); +static void GBVideoDummyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model, bool borders); static void GBVideoDummyRendererDeinit(struct GBVideoRenderer* renderer); static uint8_t GBVideoDummyRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value); static void GBVideoDummyRendererWriteSGBPacket(struct GBVideoRenderer* renderer, uint8_t* data); @@ -72,6 +72,8 @@ void GBVideoInit(struct GBVideo* video) { video->dmgPalette[2] = 0x294A; video->dmgPalette[3] = 0x0000; + video->sgbBorders = true; + video->renderer->sgbCharRam = NULL; video->renderer->sgbMapRam = NULL; video->renderer->sgbPalRam = NULL; @@ -122,7 +124,7 @@ void GBVideoReset(struct GBVideo* video) { video->palette[9 * 4 + 3] = video->dmgPalette[3]; video->renderer->deinit(video->renderer); - video->renderer->init(video->renderer, video->p->model); + video->renderer->init(video->renderer, video->p->model, video->sgbBorders); video->renderer->writePalette(video->renderer, 0, video->palette[0]); video->renderer->writePalette(video->renderer, 1, video->palette[1]); @@ -174,7 +176,7 @@ void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* ren renderer->sgbAttributes = video->renderer->sgbAttributes; video->renderer = renderer; renderer->vram = video->vram; - video->renderer->init(video->renderer, video->p->model); + video->renderer->init(video->renderer, video->p->model, video->sgbBorders); } static bool _statIRQAsserted(struct GBVideo* video, GBRegisterSTAT stat) { @@ -676,9 +678,10 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->renderer->writeSGBPacket(video->renderer, data); } -static void GBVideoDummyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model) { +static void GBVideoDummyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model, bool borders) { UNUSED(renderer); UNUSED(model); + UNUSED(borders); // Nothing to do } @@ -833,5 +836,5 @@ void GBVideoDeserialize(struct GBVideo* video, const struct GBSerializedState* s GBVideoSwitchBank(video, video->vramCurrentBank); video->renderer->deinit(video->renderer); - video->renderer->init(video->renderer, video->p->model); + video->renderer->init(video->renderer, video->p->model, video->sgbBorders); } diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index 9e2d166f5..cc1d1f643 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -295,6 +295,7 @@ void SettingsView::updateConfig() { saveSetting("gb.bios", m_ui.gbBios); saveSetting("gbc.bios", m_ui.gbcBios); saveSetting("sgb.bios", m_ui.sgbBios); + saveSetting("sgb.borders", m_ui.sgbBorders); saveSetting("useBios", m_ui.useBios); saveSetting("skipBios", m_ui.skipBios); saveSetting("audioBuffers", m_ui.audioBufferSize); @@ -410,6 +411,7 @@ void SettingsView::reloadConfig() { loadSetting("gb.bios", m_ui.gbBios); loadSetting("gbc.bios", m_ui.gbcBios); loadSetting("sgb.bios", m_ui.sgbBios); + loadSetting("sgb.borders", m_ui.sgbBorders, true); loadSetting("useBios", m_ui.useBios); loadSetting("skipBios", m_ui.skipBios); loadSetting("audioBuffers", m_ui.audioBufferSize); @@ -529,9 +531,9 @@ void SettingsView::saveSetting(const char* key, const QVariant& field) { m_controller->updateOption(key); } -void SettingsView::loadSetting(const char* key, QAbstractButton* field) { +void SettingsView::loadSetting(const char* key, QAbstractButton* field, bool defaultVal) { QString option = loadSetting(key); - field->setChecked(!option.isNull() && option != "0"); + field->setChecked((!option.isNull() && option != "0") || defaultVal); } void SettingsView::loadSetting(const char* key, QComboBox* field) { diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index c229431f9..55d2086ce 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -69,7 +69,7 @@ private: void saveSetting(const char* key, const QSpinBox*); void saveSetting(const char* key, const QVariant&); - void loadSetting(const char* key, QAbstractButton*); + void loadSetting(const char* key, QAbstractButton*, bool defaultVal = false); void loadSetting(const char* key, QComboBox*); void loadSetting(const char* key, QDoubleSpinBox*); void loadSetting(const char* key, QLineEdit*); diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index c2471590a..8b470cc84 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -1098,14 +1098,86 @@ - + + + + Super Game Boy model + + + + + + + + Autodetect + + + + + Game Boy (DMG) + + + + + Super Game Boy (SGB) + + + + + Game Boy Color (CGB) + + + + + Game Boy Advance (AGB) + + + + + + + + Game Boy Color model + + + + + + + + Autodetect + + + + + Game Boy (DMG) + + + + + Super Game Boy (SGB) + + + + + Game Boy Color (CGB) + + + + + Game Boy Advance (AGB) + + + + + Default colors: - + @@ -1185,21 +1257,28 @@ - + + + + Super Game Boy borders + + + + Qt::Horizontal - + Camera driver: - + @@ -1209,78 +1288,13 @@ - - - - Super Game Boy model + + + + Qt::Horizontal - - - - Game Boy Color model - - - - - - - - Autodetect - - - - - Game Boy (DMG) - - - - - Super Game Boy (SGB) - - - - - Game Boy Color (CGB) - - - - - Game Boy Advance (AGB) - - - - - - - - - Autodetect - - - - - Game Boy (DMG) - - - - - Super Game Boy (SGB) - - - - - Game Boy Color (CGB) - - - - - Game Boy Advance (AGB) - - - - From 4a83ae20072bd6ce44ead20413bbc5ad8dff4620 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 16:45:51 -0700 Subject: [PATCH 074/158] GB: Boot register fixes --- src/gb/audio.c | 4 ++++ src/gb/gb.c | 31 +++++++++++++++++++++++-------- src/gb/io.c | 20 ++++++++++++++------ src/gb/timer.c | 1 - 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/gb/audio.c b/src/gb/audio.c index adaa44ff4..106e64a54 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -153,6 +153,10 @@ void GBAudioReset(struct GBAudio* audio) { audio->playingCh2 = false; audio->playingCh3 = false; audio->playingCh4 = false; + if (audio->p && (audio->p->model == GB_MODEL_DMG || audio->p->model == GB_MODEL_CGB)) { + audio->playingCh1 = true; + *audio->nr52 |= 0x01; + } } void GBAudioResizeBuffer(struct GBAudio* audio, size_t samples) { diff --git a/src/gb/gb.c b/src/gb/gb.c index 3a24868ab..d4a5c3268 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -432,6 +432,8 @@ void GBReset(struct LR35902Core* cpu) { cpu->b = 0; cpu->d = 0; + gb->timer.internalDiv = 0; + int nextDiv = 0; if (!gb->biosVf) { switch (gb->model) { case GB_MODEL_AUTODETECT: // Silence warnings @@ -443,7 +445,8 @@ void GBReset(struct LR35902Core* cpu) { cpu->e = 0xD8; cpu->h = 1; cpu->l = 0x4D; - gb->timer.internalDiv = 0x2AF3; + gb->timer.internalDiv = 0xABC; + nextDiv = 4; break; case GB_MODEL_SGB: cpu->a = 1; @@ -452,7 +455,8 @@ void GBReset(struct LR35902Core* cpu) { cpu->e = 0x00; cpu->h = 0xC0; cpu->l = 0x60; - gb->timer.internalDiv = 0x2AF3; + gb->timer.internalDiv = 0xABC; + nextDiv = 4; break; case GB_MODEL_MGB: cpu->a = 0xFF; @@ -461,7 +465,8 @@ void GBReset(struct LR35902Core* cpu) { cpu->e = 0xD8; cpu->h = 1; cpu->l = 0x4D; - gb->timer.internalDiv = 0x2AF3; + gb->timer.internalDiv = 0xABC; + nextDiv = 4; break; case GB_MODEL_SGB2: cpu->a = 0xFF; @@ -470,11 +475,20 @@ void GBReset(struct LR35902Core* cpu) { cpu->e = 0x00; cpu->h = 0xC0; cpu->l = 0x60; - gb->timer.internalDiv = 0x2AF3; + gb->timer.internalDiv = 0xABC; + nextDiv = 4; break; case GB_MODEL_AGB: + cpu->a = 0x11; cpu->b = 1; - // Fall through + cpu->f.packed = 0x00; + cpu->c = 0; + cpu->e = 0x08; + cpu->h = 0; + cpu->l = 0x7C; + gb->timer.internalDiv = 0x1EA; + nextDiv = 0xC; + break; case GB_MODEL_CGB: cpu->a = 0x11; cpu->f.packed = 0x80; @@ -482,7 +496,8 @@ void GBReset(struct LR35902Core* cpu) { cpu->e = 0x08; cpu->h = 0; cpu->l = 0x7C; - gb->timer.internalDiv = 0x7A8; + gb->timer.internalDiv = 0x1EA; + nextDiv = 0xC; break; } @@ -510,10 +525,10 @@ void GBReset(struct LR35902Core* cpu) { GBMemoryReset(gb); GBVideoReset(&gb->video); GBTimerReset(&gb->timer); - mTimingSchedule(&gb->timing, &gb->timer.event, GB_DMG_DIV_PERIOD); + mTimingSchedule(&gb->timing, &gb->timer.event, nextDiv); - GBAudioReset(&gb->audio); GBIOReset(gb); + GBAudioReset(&gb->audio); GBSIOReset(&gb->sio); GBSavedataUnmask(gb); diff --git a/src/gb/io.c b/src/gb/io.c index d8494a569..74adc850f 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -144,19 +144,19 @@ void GBIOReset(struct GB* gb) { GBIOWrite(gb, REG_TAC, 0); GBIOWrite(gb, REG_IF, 1); GBIOWrite(gb, REG_NR52, 0xF1); - GBIOWrite(gb, REG_NR14, 0xBF); + GBIOWrite(gb, REG_NR14, 0x3F); GBIOWrite(gb, REG_NR10, 0x80); GBIOWrite(gb, REG_NR11, 0xBF); GBIOWrite(gb, REG_NR12, 0xF3); GBIOWrite(gb, REG_NR13, 0xF3); - GBIOWrite(gb, REG_NR24, 0xBF); + GBIOWrite(gb, REG_NR24, 0x3F); GBIOWrite(gb, REG_NR21, 0x3F); GBIOWrite(gb, REG_NR22, 0x00); - GBIOWrite(gb, REG_NR34, 0xBF); + GBIOWrite(gb, REG_NR34, 0x3F); GBIOWrite(gb, REG_NR30, 0x7F); GBIOWrite(gb, REG_NR31, 0xFF); GBIOWrite(gb, REG_NR32, 0x9F); - GBIOWrite(gb, REG_NR44, 0xBF); + GBIOWrite(gb, REG_NR44, 0x3F); GBIOWrite(gb, REG_NR41, 0xFF); GBIOWrite(gb, REG_NR42, 0x00); GBIOWrite(gb, REG_NR43, 0x00); @@ -167,11 +167,14 @@ void GBIOReset(struct GB* gb) { GBIOWrite(gb, REG_SCX, 0x00); GBIOWrite(gb, REG_LYC, 0x00); GBIOWrite(gb, REG_BGP, 0xFC); - GBIOWrite(gb, REG_OBP0, 0xFF); - GBIOWrite(gb, REG_OBP1, 0xFF); + if (gb->model < GB_MODEL_CGB) { + GBIOWrite(gb, REG_OBP0, 0xFF); + GBIOWrite(gb, REG_OBP1, 0xFF); + } GBIOWrite(gb, REG_WY, 0x00); GBIOWrite(gb, REG_WX, 0x00); if (gb->model >= GB_MODEL_CGB) { + GBIOWrite(gb, REG_JOYP, 0xFF); GBIOWrite(gb, REG_VBK, 0); GBIOWrite(gb, REG_BCPS, 0); GBIOWrite(gb, REG_OCPS, 0); @@ -181,6 +184,8 @@ void GBIOReset(struct GB* gb) { GBIOWrite(gb, REG_HDMA3, 0xFF); GBIOWrite(gb, REG_HDMA4, 0xFF); gb->memory.io[REG_HDMA5] = 0xFF; + } else if (gb->model == GB_MODEL_SGB) { + GBIOWrite(gb, REG_JOYP, 0xFF); } GBIOWrite(gb, REG_IE, 0x00); } @@ -587,6 +592,9 @@ uint8_t GBIORead(struct GB* gb, unsigned address) { case REG_SVBK: // Handled transparently by the registers goto success; + case REG_DMA: + mLOG(GB_IO, STUB, "Reading from unknown register FF%02X", address); + return 0; default: break; } diff --git a/src/gb/timer.c b/src/gb/timer.c index 0e587410d..061fc8f2e 100644 --- a/src/gb/timer.c +++ b/src/gb/timer.c @@ -64,7 +64,6 @@ void GBTimerReset(struct GBTimer* timer) { timer->nextDiv = GB_DMG_DIV_PERIOD; // TODO: GBC differences timer->timaPeriod = 1024 >> 4; - timer->internalDiv = 0; } void GBTimerDivReset(struct GBTimer* timer) { From ff272a5f1d386034377440b1478e46d3354de67c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 20:48:18 -0700 Subject: [PATCH 075/158] GB, GBA Serialize: Restore master cycles --- include/mgba/core/timing.h | 1 + src/core/timing.c | 7 +++++++ src/gb/serialize.c | 4 ++++ src/gba/serialize.c | 6 ++++++ 4 files changed, 18 insertions(+) diff --git a/include/mgba/core/timing.h b/include/mgba/core/timing.h index 634631bed..16154ba9c 100644 --- a/include/mgba/core/timing.h +++ b/include/mgba/core/timing.h @@ -23,6 +23,7 @@ struct mTimingEvent { struct mTiming { struct mTimingEvent* root; + struct mTimingEvent* reroot; uint32_t masterCycles; int32_t* relativeCycles; diff --git a/src/core/timing.c b/src/core/timing.c index 1d22a93cb..adbbfbbf8 100644 --- a/src/core/timing.c +++ b/src/core/timing.c @@ -7,6 +7,7 @@ void mTimingInit(struct mTiming* timing, int32_t* relativeCycles, int32_t* nextEvent) { timing->root = NULL; + timing->reroot = NULL; timing->masterCycles = 0; timing->relativeCycles = relativeCycles; timing->nextEvent = nextEvent; @@ -17,6 +18,7 @@ void mTimingDeinit(struct mTiming* timing) { void mTimingClear(struct mTiming* timing) { timing->root = NULL; + timing->reroot = NULL; timing->masterCycles = 0; } @@ -77,6 +79,11 @@ int32_t mTimingTick(struct mTiming* timing, int32_t cycles) { timing->root = next->next; next->callback(timing, next->context, -nextWhen); } + if (timing->reroot) { + timing->root = timing->reroot; + timing->reroot = NULL; + *timing->nextEvent = mTimingNextEvent(timing); + } return *timing->nextEvent; } diff --git a/src/gb/serialize.c b/src/gb/serialize.c index 1a6ee92f6..78da148f0 100644 --- a/src/gb/serialize.c +++ b/src/gb/serialize.c @@ -134,6 +134,7 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { return false; } gb->timing.root = NULL; + LOAD_32LE(gb->timing.masterCycles, 0, &state->masterCycles); gb->cpu->a = state->cpu.a; gb->cpu->f.packed = state->cpu.f; @@ -188,6 +189,9 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { gb->cpu->memory.setActiveRegion(gb->cpu, gb->cpu->pc); + gb->timing.reroot = gb->timing.root; + gb->timing.root = NULL; + return true; } diff --git a/src/gba/serialize.c b/src/gba/serialize.c index 5917fa5f1..0f1820833 100644 --- a/src/gba/serialize.c +++ b/src/gba/serialize.c @@ -128,6 +128,8 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) { return false; } gba->timing.root = NULL; + LOAD_32(gba->timing.masterCycles, 0, &state->masterCycles); + size_t i; for (i = 0; i < 16; ++i) { LOAD_32(gba->cpu->gprs[i], i * sizeof(gba->cpu->gprs[0]), state->cpu.gprs); @@ -185,5 +187,9 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) { if (gba->rr) { gba->rr->stateLoaded(gba->rr, state); } + + gba->timing.reroot = gba->timing.root; + gba->timing.root = NULL; + return true; } From 5930e10cf42562fd4937ae7eb40d1de39f06a5c4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Aug 2017 23:12:07 -0700 Subject: [PATCH 076/158] GB Test: Make sure to init core configs --- src/gb/test/core.c | 2 ++ src/gb/test/mbc.c | 1 + src/gb/test/memory.c | 1 + src/gb/test/rtc.c | 1 + 4 files changed, 5 insertions(+) diff --git a/src/gb/test/core.c b/src/gb/test/core.c index 09f9ca25a..a8638012b 100644 --- a/src/gb/test/core.c +++ b/src/gb/test/core.c @@ -29,6 +29,7 @@ M_TEST_DEFINE(reset) { struct mCore* core = GBCoreCreate(); assert_non_null(core); assert_true(core->init(core)); + mCoreInitConfig(core, NULL); core->reset(core); core->deinit(core); } @@ -37,6 +38,7 @@ M_TEST_DEFINE(loadNullROM) { struct mCore* core = GBCoreCreate(); assert_non_null(core); assert_true(core->init(core)); + mCoreInitConfig(core, NULL); assert_false(core->loadROM(core, NULL)); core->reset(core); core->deinit(core); diff --git a/src/gb/test/mbc.c b/src/gb/test/mbc.c index a9448892b..5498d004d 100644 --- a/src/gb/test/mbc.c +++ b/src/gb/test/mbc.c @@ -16,6 +16,7 @@ M_TEST_SUITE_SETUP(GBMBC) { GBSynthesizeROM(vf); struct mCore* core = GBCoreCreate(); core->init(core); + mCoreInitConfig(core, NULL); core->loadROM(core, vf); *state = core; return 0; diff --git a/src/gb/test/memory.c b/src/gb/test/memory.c index f4e0ee642..01a4b398f 100644 --- a/src/gb/test/memory.c +++ b/src/gb/test/memory.c @@ -16,6 +16,7 @@ M_TEST_SUITE_SETUP(GBMemory) { GBSynthesizeROM(vf); struct mCore* core = GBCoreCreate(); core->init(core); + mCoreInitConfig(core, NULL); core->loadROM(core, vf); *state = core; return 0; diff --git a/src/gb/test/rtc.c b/src/gb/test/rtc.c index d26cb696e..71d06ced2 100644 --- a/src/gb/test/rtc.c +++ b/src/gb/test/rtc.c @@ -48,6 +48,7 @@ M_TEST_SUITE_SETUP(GBRTC) { return -1; } test->core->init(test->core); + mCoreInitConfig(test->core, NULL); struct VFile* vf = VFileMemChunk(NULL, 2048); GBSynthesizeROM(vf); test->core->loadROM(test->core, vf); From cb7c09e63d88ced801bac241eb4f4434c1a30f31 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Sun, 6 Aug 2017 00:18:16 +0100 Subject: [PATCH 077/158] ARM: Fix MSR when CPSR.T is set --- CHANGES | 1 + src/arm/isa-arm.c | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 58f4109ec..2e2c72a2d 100644 --- a/CHANGES +++ b/CHANGES @@ -29,6 +29,7 @@ Bugfixes: - GB, GBA Savedata: Fix savestate-related save overwriting (fixes mgba.io/i/834) - Qt: Fix timezone issues with time overrides - Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841) + - ARM: Fix MSR when T bit is set Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/arm/isa-arm.c b/src/arm/isa-arm.c index 8533833bc..84e894313 100644 --- a/src/arm/isa-arm.c +++ b/src/arm/isa-arm.c @@ -663,8 +663,9 @@ DEFINE_INSTRUCTION_ARM(MSR, } _ARMReadCPSR(cpu); if (cpu->executionMode == MODE_THUMB) { - LOAD_16(cpu->prefetch[0], (cpu->gprs[ARM_PC] - WORD_SIZE_THUMB) & cpu->memory.activeMask, cpu->memory.activeRegion); - LOAD_16(cpu->prefetch[1], cpu->gprs[ARM_PC] & cpu->memory.activeMask, cpu->memory.activeRegion); + cpu->prefetch[0] = 0x46C0; // nop + cpu->prefetch[1] &= 0xFFFF; + cpu->gprs[ARM_PC] += WORD_SIZE_THUMB; } else { LOAD_32(cpu->prefetch[0], (cpu->gprs[ARM_PC] - WORD_SIZE_ARM) & cpu->memory.activeMask, cpu->memory.activeRegion); LOAD_32(cpu->prefetch[1], cpu->gprs[ARM_PC] & cpu->memory.activeMask, cpu->memory.activeRegion); @@ -704,8 +705,9 @@ DEFINE_INSTRUCTION_ARM(MSRI, } _ARMReadCPSR(cpu); if (cpu->executionMode == MODE_THUMB) { - LOAD_16(cpu->prefetch[0], (cpu->gprs[ARM_PC] - WORD_SIZE_THUMB) & cpu->memory.activeMask, cpu->memory.activeRegion); - LOAD_16(cpu->prefetch[1], cpu->gprs[ARM_PC] & cpu->memory.activeMask, cpu->memory.activeRegion); + cpu->prefetch[0] = 0x46C0; // nop + cpu->prefetch[1] &= 0xFFFF; + cpu->gprs[ARM_PC] += WORD_SIZE_THUMB; } else { LOAD_32(cpu->prefetch[0], (cpu->gprs[ARM_PC] - WORD_SIZE_ARM) & cpu->memory.activeMask, cpu->memory.activeRegion); LOAD_32(cpu->prefetch[1], cpu->gprs[ARM_PC] & cpu->memory.activeMask, cpu->memory.activeRegion); From 8b8d8462720f48ac37a4c12f69deddf14e4fc491 Mon Sep 17 00:00:00 2001 From: rootfather Date: Wed, 9 Aug 2017 11:36:56 +0200 Subject: [PATCH 078/158] Qt: Update German GUI translation --- src/platform/qt/ts/mgba-de.ts | 843 ++++++++++++++++++++-------------- 1 file changed, 497 insertions(+), 346 deletions(-) diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index 8500ffdb2..96a6897a6 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -793,7 +793,7 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. - + Autodetect Automatisch erkennen @@ -829,7 +829,7 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. - + None keiner @@ -880,61 +880,76 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. + Super Game Boy (SGB) + Super Game Boy (SGB) + + + Game Boy Color (CGB) Game Boy Color (CGB) - + Game Boy Advance (AGB) Game Boy Advance (AGB) - + Memory bank controller Speicherbank-Controller - + MBC1 MBC1 - + MBC2 MBC2 - + MBC3 MBC3 - + MBC3 + RTC MBC3 + RTC - + MBC5 MBC5 - + MBC5 + Rumble MBC5 + Rumble - + MBC7 MBC7 - + + Pocket Cam + Pocket Cam + + + + TAMA5 + TAMA5 + + + HuC-3 HuC-3 - + Colors Farben @@ -1024,17 +1039,35 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.OBJ exportieren + + PrinterView + + + Game Boy Printer + Game Boy Printer + + + + Hurry up! + Los geht's! + + + + Tear off + Abreißen + + QGBA::AssetTile - + %0%1%2 %0%1%2 - + 0x%0 (%1) 0x%0 (%1) @@ -1082,6 +1115,37 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.Cheat-Datei auswählen + + QGBA::CoreController + + + Failed to open save file: %1 + Fehler beim Öffnen der Speicherdatei: %1 + + + + Failed to open game file: %1 + Fehler beim Öffnen der Spieldatei: %1 + + + + Failed to open snapshot file for reading: %1 + Konnte Snapshot-Datei %1 nicht zum Lesen öffnen + + + + Failed to open snapshot file for writing: %1 + Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen + + + + QGBA::CoreManager + + + Failed to open game file: %1 + Fehler beim Öffnen der Spieldatei: %1 + + QGBA::GBAKeyEditor @@ -1151,50 +1215,21 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::GIFView - + Failed to open output GIF file: %1 Fehler beim Öffnen der Ausgabe-GIF-Datei: %1 - + Select output file Ausgabedatei auswählen - + Graphics Interchange Format (*.gif) Graphics Interchange Format (*.gif) - - QGBA::GameController - - - - Failed to open game file: %1 - Fehler beim Öffnen der Spieldatei: %1 - - - - Failed to open save file: %1 - Fehler beim Öffnen der Speicherdatei: %1 - - - - Failed to open snapshot file for reading: %1 - Konnte Snapshot-Datei %1 nicht zum Lesen öffnen - - - - Failed to open snapshot file for writing: %1 - Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen - - - - Failed to start audio processor - Fehler beim Starten des Audio-Prozessors - - QGBA::IOViewer @@ -2575,27 +2610,27 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::LoadSaveState - + Load State Savestate laden - + Save State Savestate speichern - + Empty Leer - + Corrupted Defekt - + Slot %1 Speicherplatz %1 @@ -2603,37 +2638,37 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::LogController - + DEBUG DEBUG - + STUB STUB - + INFO INFO - + WARN WARN - + ERROR ERROR - + FATAL FATAL - + GAME ERROR GAME ERROR @@ -2705,22 +2740,22 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::MemorySearch - + (⅟%0×) (⅟%0×) - + 1 byte%0 1 Byte%0 - + 2 bytes%0 2 Bytes%0 - + 4 bytes%0 4 Bytes%0 @@ -2728,39 +2763,39 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::ObjView - - + + 0x%0 0x%0 - + Off Aus - + Normal Normal - + Trans Trans - + OBJWIN OBJWIN - + Invalid Ungültig - + N/A N/A @@ -2783,62 +2818,75 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::PaletteView - + #%0 #%0 - + 0x%0 0x%0 - + %0 %0 - + 0x%0 (%1) 0x%0 (%1) - + Export palette Palette exportieren - + Windows PAL (*.pal);;Adobe Color Table (*.act) Windows PAL (*.pal);;Adobe Color Table (*.act) - + Failed to open output palette file: %1 Fehler beim Öffnen der Ausgabe-Palettendatei: %1 + + QGBA::PrinterView + + + Save Printout + Ausdruck speichern + + + + Portable Network Graphics (*.png) + Portable Network Graphics (*.png) + + QGBA::ROMInfo - - - - - + + + + + (unknown) (unbekannt) - - + + bytes Bytes - + (no database present) (keine Datenbank vorhanden) @@ -2846,47 +2894,59 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::SettingsView - + + Qt Multimedia Qt Multimedia - + SDL SDL - + Software (Qt) Software (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (erzwinge Version 1.x) - + + None (Still Image) + Keiner (Standbild) + + + Keyboard Tastatur - + Controllers Gamepads - + Shortcuts Tastenkürzel - + + + Shaders + Shader + + + Select BIOS BIOS auswählen @@ -2894,37 +2954,32 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::ShaderSelector - + No shader active Kein Shader aktiv - + Load shader Shader laden - - %1 Shader (%.shader) - %1 Shader (%.shader) - - - + No shader loaded Kein Shader geladen - + by %1 von %1 - + Preprocessing Vorbehandlung - + Pass %1 Durchlauf %1 @@ -2950,17 +3005,17 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::VideoView - + Failed to open output video file: %1 Fehler beim Öffnen der Ausgabe-Videodatei: %1 - + Native (%0x%1) Nativ (%0x%1) - + Select output file Ausgabedatei auswählen @@ -2968,82 +3023,92 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance-ROMs (%1) - + Game Boy ROMs (%1) Game Boy-ROMs (%1) - + All ROMs (%1) Alle ROMs (%1) - + %1 Video Logs (*.mvl) %1 Video-Logs (*.mvl) - + Archives (%1) Archive (%1) - - - + + + Select ROM ROM auswählen - + Game Boy Advance save files (%1) Game Boy Advance-Speicherdateien (%1) - - - + + + Select save Speicherdatei wählen - + Select patch Patch wählen - + Patches (*.ips *.ups *.bps) Patches (*.ips *.ups *.bps) - - + + Select image + Bild auswählen + + + + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) + Bild-Datei (*.png *.gif *.jpg *.jpeg);;Alle Dateien (*) + + + + GameShark saves (*.sps *.xps) GameShark-Speicherdaten (*.sps *.xps) - + Select video log Video-Log auswählen - + Video logs (*.mvl) Video-Logs (*.mvl) - + Crash Absturz - + The game has crashed with the following error: %1 @@ -3052,22 +3117,22 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. - + Couldn't Load Konnte nicht geladen werden - + Could not load game. Are you sure it's in the correct format? Konnte das Spiel nicht laden. Sind Sie sicher, dass es im korrekten Format vorliegt? - + Unimplemented BIOS call Nicht implementierter BIOS-Aufruf - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Dieses Spiel verwendet einen BIOS-Aufruf, der nicht implementiert ist. Bitte verwenden Sie für die beste Spielerfahrung das offizielle BIOS. @@ -3092,588 +3157,593 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.Einige Änderungen werden erst übernommen, wenn der Emulator neu gestartet wurde. - + - Player %1 of %2 - Spieler %1 von %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 Bilder/Sekunde) - %4 - + &File &Datei - + Load &ROM... &ROM laden... - + Load ROM in archive... ROM aus Archiv laden... - + Load temporary save... Temporäre Speicherdatei laden... - + Load &patch... &Patch laden... - + Boot BIOS BIOS booten - + Replace ROM... ROM ersetzen... - + ROM &info... ROM-&Informationen... - + Recent Zuletzt verwendet - + Make portable Portablen Modus aktivieren - + &Load state Savestate &laden - + F10 F10 - + &Save state Savestate &speichern - + Shift+F10 Umschalt+F10 - + Quick load Schnell laden - + Quick save Schnell speichern - + Load recent Lade zuletzt gespeicherten Savestate - + Save recent Speichere aktuellen Stand - + Undo load state Laden des Savestate rückgängig machen - + F11 F11 - + Undo save state Speichern des Savestate rückgängig machen - + Shift+F11 Umschalt+F11 - - + + State &%1 Savestate &%1 - + F%1 F%1 - + Shift+F%1 Umschalt+F%1 - + + Load camera image... + Lade Kamerabild... + + + Import GameShark Save Importiere GameShark-Speicherstand - + Export GameShark Save Exportiere GameShark-Speicherstand - + New multiplayer window Neues Multiplayer-Fenster - + About Über - + E&xit &Beenden - + &Emulation &Emulation - + &Reset Zu&rücksetzen - + Ctrl+R Strg+R - + Sh&utdown Schli&eßen - + Yank game pak Spielmodul herausziehen - + &Pause &Pause - + Ctrl+P Strg+P - + &Next frame &Nächstes Bild - + Ctrl+N Strg+N - + Fast forward (held) Schneller Vorlauf (gehalten) - + &Fast forward Schneller &Vorlauf - + Shift+Tab Umschalt+Tab - + Fast forward speed Vorlauf-Geschwindigkeit - + Unbounded Unbegrenzt - + %0x %0x - + Rewind (held) Zurückspulen (gehalten) - + Re&wind Zur&ückspulen - + ~ ~ - + Step backwards Schrittweiser Rücklauf - + Ctrl+B Strg+B - + Sync to &video Mit &Video synchronisieren - + Sync to &audio Mit &Audio synchronisieren - + Solar sensor Solar-Sensor - + Increase solar level Sonnen-Level erhöhen - + Decrease solar level Sonnen-Level verringern - + Brightest solar level Hellster Sonnen-Level - + Darkest solar level Dunkelster Sonnen-Level - + Brightness %1 Helligkeit %1 - + Audio/&Video Audio/&Video - + Frame size Bildgröße - + %1x %1x - + Toggle fullscreen Vollbildmodus umschalten - + Lock aspect ratio Seitenverhältnis korrigieren - + Force integer scaling Pixelgenaue Skalierung (Integer scaling) - + Frame&skip Frame&skip - - Shader options... - Shader-Optionen... - - - + Mute Stummschalten - + FPS target Bildwiederholrate - + 15 15 - + 30 30 - + 45 45 - + Native (59.7) Nativ (59.7) - + 60 60 - + 90 90 - + 120 120 - + 240 240 - + Take &screenshot &Screenshot erstellen - + F12 F12 - + Record output... Ausgabe aufzeichen... - + Record GIF... GIF aufzeichen... - + Record video log... Video-Log aufzeichnen... - + Stop video log Video-Log beenden - + + Game Boy Printer... + Game Boy Printer... + + + Video layers Video-Ebenen - + Audio channels Audio-Kanäle - + &Tools &Werkzeuge - + View &logs... &Logs ansehen... - + Game &overrides... Spiel-&Überschreibungen... - + Game &Pak sensors... Game &Pak-Sensoren... - + &Cheats... &Cheats... - + Open debugger console... Debugger-Konsole äffnen... - + Start &GDB server... &GDB-Server starten... - + Settings... Einstellungen... - + Select folder Ordner auswählen - + Add folder to library... Ordner zur Bibliothek hinzufügen... - + Bilinear filtering Bilineare Filterung - + View &palette... &Palette betrachten... - + View &sprites... &Sprites betrachten... - + View &tiles... &Tiles betrachten... - + View memory... Speicher betrachten... - + Search memory... Speicher durchsuchen... - + View &I/O registers... &I/O-Register betrachten... - + Exit fullscreen Vollbildmodus beenden - + Autofire Autofeuer - + Autofire A Autofeuer A - + Autofire B Autofeuer B - + Autofire L Autofeuer L - + Autofire R Autofeuer R - + Autofire Start Autofeuer Start - + Autofire Select Autofeuer Select - + Autofire Up Autofeuer nach oben - + Autofire Right Autofeuer rechts - + Autofire Down Autofeuer nach unten - + Autofire Left Autofeuer links @@ -3792,39 +3862,39 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.dd/mm/yy hh:mm:ss - + Light sensor Lichtsensor - + Brightness Helligkeit - + Tilt sensor Neigungssensor - - + + Set Y Setze Y - - + + Set X Setze X - + Gyroscope Gyroskop - + Sensitivity Empfindlichkeit @@ -3857,240 +3927,311 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.Verzeichnisse - + + Game Boy + Game Boy + + + Audio driver: Audio-Treiber: - + Audio buffer: Audio-Puffer: - - + + 1536 1536 - + 512 512 - + 768 768 - + 1024 1024 - + 2048 2048 - + 3072 3072 - + 4096 4096 - + samples Samples - + Sample rate: Abtastrate: - - + + 44100 44100 - + 22050 22050 - + 32000 32000 - + 48000 48000 - + Hz Hz - + Volume: Lautstärke: - + Mute Stummschalten - + Display driver: Anzeige-Treiber: - + Frameskip: Frameskip: - + Skip every Alle - - + + frames Bilder - + FPS target: Bildwiederholrate: - + frames per second Bilder pro Sekunde - + Sync: Synchronisierung: - + Video Video - + Audio Audio - + Lock aspect ratio Seitenverhältnis korrigieren - + Force integer scaling Erzwinge pixelgenaue Skalierung (Integer scaling) - + Language Sprache - + English Englisch - + List view Listenansicht - + Tree view Baumansicht - + + Game Boy model + Game Boy-Modell + + + + + + Autodetect + Automatisch erkennen + + + + + + Game Boy (DMG) + Game Boy (DMG) + + + + + + Super Game Boy (SGB) + Super Game Boy (SGB) + + + + + + Game Boy Color (CGB) + Game Boy Color (CGB) + + + + + + Game Boy Advance (AGB) + Game Boy Advance (AGB) + + + + Super Game Boy model + Super Game Boy-Modell + + + + Game Boy Color model + Game Boy Color-Modell + + + + Default colors: + Standard-Farben: + + + + Super Game Boy borders + SUper Game Boy-Rahmen + + + + Camera driver: + Kamera-Treiber: + + + Library: Bibliothek: - + Show when no game open Anzeigen, wenn kein Spiel geöffnet ist - + Clear cache Cache leeren - + Fast forward speed: Vorlauf-Geschwindigkeit: - + Rewind affects save data Rücklauf beeinflusst Speicherdaten - + Preload entire ROM into memory ROM-Datei vollständig in Arbeitsspeicher vorladen - - - - - - - + + + + + + + + Browse Durchsuchen - + Use BIOS file if found BIOS-Datei verwenden, wenn vorhanden - + Skip BIOS intro BIOS-Intro überspringen - + × × - + Unbounded unbegrenzt - + Suspend screensaver Bildschirmschoner deaktivieren @@ -4100,118 +4241,128 @@ wenn vorhanden BIOS - + Pause when inactive Pause, wenn inaktiv - + Run all Alle ausführen - + Remove known Bekannte entfernen - + Detect and remove Erkennen und entfernen - + Allow opposing input directions Gegensätzliche Eingaberichtungen erlauben - - + + Screenshot Screenshot - - + + Save data Speicherdaten - - + + Cheat codes Cheat-Codes - + Enable rewind Rücklauf aktivieren - + Bilinear filtering Bilineare Filterung - + Rewind history: Rücklauf-Verlauf: - + Idle loops: Leerlaufprozesse: - + Savestate extra data: Zusätzliche Savestate-Daten: - + Load extra data: Lade zusätzliche Daten: - + + Autofire interval: + Autofeuer-Intervall: + + + GB BIOS file: Datei mit GB-BIOS: - + GBA BIOS file: Datei mit GBA-BIOS: - + GBC BIOS file: Datei mit GBC-BIOS: - + + SGB BIOS file: + Datei mit SGB-BIOS: + + + Save games Spielstände - - - - + + + + Same directory as the ROM Verzeichnis der ROM-Datei - + Save states Savestates - + Screenshots Screenshots - + Patches Patches From ec1fc632b23749add411a2d9a9a4a32bd957a99c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 11 Aug 2017 18:19:31 -0700 Subject: [PATCH 079/158] GB MBC: MBC6 skeleton --- include/mgba/internal/gb/mbc.h | 1 + include/mgba/internal/gb/memory.h | 9 +++++ src/gb/mbc.c | 55 ++++++++++++++++++++++++++++--- src/gb/memory.c | 8 +++-- 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/include/mgba/internal/gb/mbc.h b/include/mgba/internal/gb/mbc.h index 86f58c8f0..2269e5af7 100644 --- a/include/mgba/internal/gb/mbc.h +++ b/include/mgba/internal/gb/mbc.h @@ -19,6 +19,7 @@ struct GBMemory; void GBMBCInit(struct GB* gb); void GBMBCSwitchBank(struct GB* gb, int bank); void GBMBCSwitchBank0(struct GB* gb, int bank); +void GBMBCSwitchHalfBank(struct GB* gb, int half, int bank); void GBMBCSwitchSramBank(struct GB* gb, int bank); enum GBCam { diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h index eb3f9c508..f971c353e 100644 --- a/include/mgba/internal/gb/memory.h +++ b/include/mgba/internal/gb/memory.h @@ -22,6 +22,8 @@ struct GB; enum { GB_BASE_CART_BANK0 = 0x0000, GB_BASE_CART_BANK1 = 0x4000, + GB_BASE_CART_HALFBANK1 = 0x4000, + GB_BASE_CART_HALFBANK2 = 0x6000, GB_BASE_VRAM = 0x8000, GB_BASE_EXTERNAL_RAM = 0xA000, GB_BASE_WORKING_RAM_BANK0 = 0xC000, @@ -46,6 +48,7 @@ enum { enum { GB_SIZE_CART_BANK0 = 0x4000, + GB_SIZE_CART_HALFBANK = 0x2000, GB_SIZE_CART_MAX = 0x800000, GB_SIZE_VRAM = 0x4000, GB_SIZE_VRAM_BANK0 = 0x2000, @@ -104,6 +107,11 @@ struct GBMBC1State { int multicartStride; }; +struct GBMBC6State { + int currentBank1; + uint8_t* romBank1; +}; + struct GBMBC7State { enum GBMBC7MachineState state; uint16_t sr; @@ -127,6 +135,7 @@ struct GBTAMA5State { union GBMBCState { struct GBMBC1State mbc1; + struct GBMBC6State mbc6; struct GBMBC7State mbc7; struct GBPocketCamState pocketCam; struct GBTAMA5State tama5; diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 0e560e0e8..83ac2f2fc 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -68,6 +68,28 @@ void GBMBCSwitchBank0(struct GB* gb, int bank) { } } +void GBMBCSwitchHalfBank(struct GB* gb, int half, int bank) { + size_t bankStart = bank * GB_SIZE_CART_HALFBANK; + if (bankStart + GB_SIZE_CART_HALFBANK > gb->memory.romSize) { + mLOG(GB_MBC, GAME_ERROR, "Attempting to switch to an invalid ROM bank: %0X", bank); + bankStart &= (gb->memory.romSize - 1); + bank = bankStart / GB_SIZE_CART_HALFBANK; + if (!bank) { + ++bank; + } + } + if (!half) { + gb->memory.romBank = &gb->memory.rom[bankStart]; + gb->memory.currentBank = bank; + } else { + gb->memory.mbcState.mbc6.romBank1 = &gb->memory.rom[bankStart]; + gb->memory.mbcState.mbc6.currentBank1 = bank; + } + if (gb->cpu->pc < GB_BASE_VRAM) { + gb->cpu->memory.setActiveRegion(gb->cpu, gb->cpu->pc); + } +} + static bool _isMulticart(const uint8_t* mem) { bool success = true; struct VFile* vf; @@ -496,11 +518,34 @@ void _GBMBC5(struct GB* gb, uint16_t address, uint8_t value) { } void _GBMBC6(struct GB* gb, uint16_t address, uint8_t value) { - // TODO - mLOG(GB_MBC, STUB, "MBC6 unimplemented"); - UNUSED(gb); - UNUSED(address); - UNUSED(value); + struct GBMemory* memory = &gb->memory; + int bank = value & 0x7F; + switch (address >> 10) { + case 0: + switch (value) { + case 0: + memory->sramAccess = false; + break; + case 0xA: + memory->sramAccess = true; + GBMBCSwitchSramBank(gb, memory->sramCurrentBank); + break; + default: + // TODO + mLOG(GB_MBC, STUB, "MBC6 unknown value %02X", value); + break; + } + break; + case 0x9: + GBMBCSwitchHalfBank(gb, 0, bank); + break; + case 0xD: + GBMBCSwitchHalfBank(gb, 1, bank); + break; + default: + mLOG(GB_MBC, STUB, "MBC6 unknown address: %04X:%02X", address, value); + break; + } } void _GBMBC7(struct GB* gb, uint16_t address, uint8_t value) { diff --git a/src/gb/memory.c b/src/gb/memory.c index 68a8eabc2..5e0574b2f 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -207,10 +207,14 @@ uint8_t GBLoad8(struct LR35902Core* cpu, uint16_t address) { case GB_REGION_CART_BANK0 + 2: case GB_REGION_CART_BANK0 + 3: return memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)]; - case GB_REGION_CART_BANK1: - case GB_REGION_CART_BANK1 + 1: case GB_REGION_CART_BANK1 + 2: case GB_REGION_CART_BANK1 + 3: + if (memory->mbcType == GB_MBC6) { + return memory->mbcState.mbc6.romBank1[address & (GB_SIZE_CART_HALFBANK - 1)]; + } + // Fall through + case GB_REGION_CART_BANK1: + case GB_REGION_CART_BANK1 + 1: return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)]; case GB_REGION_VRAM: case GB_REGION_VRAM + 1: From 3227d74e4d434d497673e5a77589b674e811c969 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 11 Aug 2017 18:53:24 -0700 Subject: [PATCH 080/158] Qt: Change header guards to pragma once --- src/platform/qt/AboutScreen.h | 5 +---- src/platform/qt/ArchiveInspector.h | 5 +---- src/platform/qt/AssetTile.h | 5 +---- src/platform/qt/AssetView.h | 5 +---- src/platform/qt/AudioDevice.h | 5 +---- src/platform/qt/AudioProcessor.h | 6 ++---- src/platform/qt/AudioProcessorQt.h | 6 ++---- src/platform/qt/AudioProcessorSDL.h | 6 ++---- src/platform/qt/CheatsModel.h | 5 +---- src/platform/qt/CheatsView.h | 5 +---- src/platform/qt/ColorPicker.h | 5 +---- src/platform/qt/ConfigController.h | 5 +---- src/platform/qt/CoreController.h | 5 +---- src/platform/qt/CoreManager.h | 5 +---- src/platform/qt/DebuggerConsole.h | 5 +---- src/platform/qt/DebuggerConsoleController.h | 5 +---- src/platform/qt/DebuggerController.h | 5 +---- src/platform/qt/Display.h | 5 +---- src/platform/qt/DisplayGL.h | 5 +---- src/platform/qt/DisplayQt.h | 5 +---- src/platform/qt/GBAApp.h | 5 +---- src/platform/qt/GBAKeyEditor.h | 5 +---- src/platform/qt/GBAOverride.h | 5 +---- src/platform/qt/GBOverride.h | 5 +---- src/platform/qt/GDBController.h | 5 +---- src/platform/qt/GDBWindow.h | 5 +---- src/platform/qt/GIFView.h | 5 +---- src/platform/qt/GamepadAxisEvent.h | 5 +---- src/platform/qt/GamepadButtonEvent.h | 5 +---- src/platform/qt/GamepadHatEvent.h | 5 +---- src/platform/qt/IOViewer.h | 5 +---- src/platform/qt/InputController.h | 5 +---- src/platform/qt/InputProfile.h | 5 +---- src/platform/qt/KeyEditor.h | 5 +---- src/platform/qt/LoadSaveState.h | 5 +---- src/platform/qt/LogController.h | 5 +---- src/platform/qt/LogView.h | 5 +---- src/platform/qt/MemoryModel.h | 5 +---- src/platform/qt/MemorySearch.h | 5 +---- src/platform/qt/MemoryView.h | 5 +---- src/platform/qt/MessagePainter.h | 5 +---- src/platform/qt/MultiplayerController.h | 4 +--- src/platform/qt/ObjView.h | 5 +---- src/platform/qt/Override.h | 5 +---- src/platform/qt/OverrideView.h | 5 +---- src/platform/qt/PaletteView.h | 5 +---- src/platform/qt/PrinterView.h | 5 +---- src/platform/qt/ROMInfo.h | 5 +---- src/platform/qt/SavestateButton.h | 5 +---- src/platform/qt/SensorView.h | 5 +---- src/platform/qt/SettingsView.h | 5 +---- src/platform/qt/ShaderSelector.h | 5 +---- src/platform/qt/ShortcutController.h | 5 +---- src/platform/qt/ShortcutView.h | 5 +---- src/platform/qt/Swatch.h | 5 +---- src/platform/qt/TilePainter.h | 5 +---- src/platform/qt/TileView.h | 5 +---- src/platform/qt/VFileDevice.h | 5 +---- src/platform/qt/VideoDumper.h | 6 ++---- src/platform/qt/VideoView.h | 5 +---- src/platform/qt/Window.h | 5 +---- src/platform/qt/library/LibraryController.h | 5 +---- src/platform/qt/library/LibraryGrid.h | 5 +---- src/platform/qt/library/LibraryTree.h | 5 +---- src/platform/qt/utils.h | 5 +---- 65 files changed, 69 insertions(+), 259 deletions(-) diff --git a/src/platform/qt/AboutScreen.h b/src/platform/qt/AboutScreen.h index aebf1bdc1..ddced8f40 100644 --- a/src/platform/qt/AboutScreen.h +++ b/src/platform/qt/AboutScreen.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_ABOUT_SCREEN -#define QGBA_ABOUT_SCREEN +#pragma once #include @@ -23,5 +22,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/ArchiveInspector.h b/src/platform/qt/ArchiveInspector.h index c7b471335..8caaa283d 100644 --- a/src/platform/qt/ArchiveInspector.h +++ b/src/platform/qt/ArchiveInspector.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_ARCHIVE_INSPECTOR -#define QGBA_ARCHIVE_INSPECTOR +#pragma once #include "ui_ArchiveInspector.h" @@ -26,5 +25,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/AssetTile.h b/src/platform/qt/AssetTile.h index 7d5f77be6..742a8e85f 100644 --- a/src/platform/qt/AssetTile.h +++ b/src/platform/qt/AssetTile.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_ASSET_TILE -#define QGBA_ASSET_TILE +#pragma once #include "ui_AssetTile.h" @@ -44,5 +43,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/AssetView.h b/src/platform/qt/AssetView.h index aabc79ab1..ed837cd5f 100644 --- a/src/platform/qt/AssetView.h +++ b/src/platform/qt/AssetView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_ASSET_VIEW -#define QGBA_ASSET_VIEW +#pragma once #include #include @@ -48,5 +47,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/AudioDevice.h b/src/platform/qt/AudioDevice.h index 3f95153be..0794b3743 100644 --- a/src/platform/qt/AudioDevice.h +++ b/src/platform/qt/AudioDevice.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_AUDIO_DEVICE -#define QGBA_AUDIO_DEVICE +#pragma once #include #include @@ -31,5 +30,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/AudioProcessor.h b/src/platform/qt/AudioProcessor.h index 16a9179f9..1e232bd99 100644 --- a/src/platform/qt/AudioProcessor.h +++ b/src/platform/qt/AudioProcessor.h @@ -3,8 +3,8 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_AUDIO_PROCESSOR -#define QGBA_AUDIO_PROCESSOR +#pragma once + #include #include @@ -59,5 +59,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/AudioProcessorQt.h b/src/platform/qt/AudioProcessorQt.h index cd2b9bf67..0e56907e1 100644 --- a/src/platform/qt/AudioProcessorQt.h +++ b/src/platform/qt/AudioProcessorQt.h @@ -3,8 +3,8 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_AUDIO_PROCESSOR_QT -#define QGBA_AUDIO_PROCESSOR_QT +#pragma once + #include "AudioProcessor.h" class QAudioOutput; @@ -39,5 +39,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/AudioProcessorSDL.h b/src/platform/qt/AudioProcessorSDL.h index 07de6e90b..c2d5d0ee1 100644 --- a/src/platform/qt/AudioProcessorSDL.h +++ b/src/platform/qt/AudioProcessorSDL.h @@ -3,8 +3,8 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_AUDIO_PROCESSOR_SDL -#define QGBA_AUDIO_PROCESSOR_SDL +#pragma once + #include "AudioProcessor.h" #ifdef BUILD_SDL @@ -39,5 +39,3 @@ private: } #endif - -#endif diff --git a/src/platform/qt/CheatsModel.h b/src/platform/qt/CheatsModel.h index 0830d18d1..e3012ebef 100644 --- a/src/platform/qt/CheatsModel.h +++ b/src/platform/qt/CheatsModel.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_CHEATS_MODEL -#define QGBA_CHEATS_MODEL +#pragma once #include #include @@ -51,5 +50,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/CheatsView.h b/src/platform/qt/CheatsView.h index 63ea7bd3e..7e47ef07e 100644 --- a/src/platform/qt/CheatsView.h +++ b/src/platform/qt/CheatsView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_CHEATS_VIEW -#define QGBA_CHEATS_VIEW +#pragma once #include @@ -44,5 +43,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/ColorPicker.h b/src/platform/qt/ColorPicker.h index 720e55922..5bc4bee20 100644 --- a/src/platform/qt/ColorPicker.h +++ b/src/platform/qt/ColorPicker.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_COLOR_PICKER -#define QGBA_COLOR_PICKER +#pragma once #include @@ -33,5 +32,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/ConfigController.h b/src/platform/qt/ConfigController.h index 17079ea4c..89581beaf 100644 --- a/src/platform/qt/ConfigController.h +++ b/src/platform/qt/ConfigController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_CONFIG_CONTROLLER -#define QGBA_CONFIG_CONTROLLER +#pragma once #include "Override.h" @@ -110,5 +109,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 4cd1a9f05..1bbde57a7 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_CORE_CONTROLLER -#define QGBA_CORE_CONTROLLER +#pragma once #include #include @@ -216,5 +215,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/CoreManager.h b/src/platform/qt/CoreManager.h index 78800ac41..da7460f22 100644 --- a/src/platform/qt/CoreManager.h +++ b/src/platform/qt/CoreManager.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_CORE_MANAGER -#define QGBA_CORE_MANAGER +#pragma once #include #include @@ -41,5 +40,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/DebuggerConsole.h b/src/platform/qt/DebuggerConsole.h index 7616b665f..f4bd4cadb 100644 --- a/src/platform/qt/DebuggerConsole.h +++ b/src/platform/qt/DebuggerConsole.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_DEBUGGER_CONSOLE -#define QGBA_DEBUGGER_CONSOLE +#pragma once #include "ui_DebuggerConsole.h" @@ -29,5 +28,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/DebuggerConsoleController.h b/src/platform/qt/DebuggerConsoleController.h index 83e1b53bb..5989b7441 100644 --- a/src/platform/qt/DebuggerConsoleController.h +++ b/src/platform/qt/DebuggerConsoleController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_DEBUGGER_CONSOLE_CONTROLLER -#define QGBA_DEBUGGER_CONSOLE_CONTROLLER +#pragma once #include "DebuggerController.h" @@ -59,5 +58,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/DebuggerController.h b/src/platform/qt/DebuggerController.h index 8677af1c5..650d533d3 100644 --- a/src/platform/qt/DebuggerController.h +++ b/src/platform/qt/DebuggerController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_DEBUGGER_CONTROLLER -#define QGBA_DEBUGGER_CONTROLLER +#pragma once #include @@ -44,5 +43,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/Display.h b/src/platform/qt/Display.h index f413a2b72..c09c91433 100644 --- a/src/platform/qt/Display.h +++ b/src/platform/qt/Display.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_DISPLAY -#define QGBA_DISPLAY +#pragma once #include @@ -85,5 +84,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/DisplayGL.h b/src/platform/qt/DisplayGL.h index c4d2916bd..a1f435fe2 100644 --- a/src/platform/qt/DisplayGL.h +++ b/src/platform/qt/DisplayGL.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_DISPLAY_GL -#define QGBA_DISPLAY_GL +#pragma once #if defined(BUILD_GL) || defined(BUILD_GLES) @@ -130,5 +129,3 @@ private: } #endif - -#endif diff --git a/src/platform/qt/DisplayQt.h b/src/platform/qt/DisplayQt.h index ac7e63a86..b51d40ca4 100644 --- a/src/platform/qt/DisplayQt.h +++ b/src/platform/qt/DisplayQt.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_DISPLAY_QT -#define QGBA_DISPLAY_QT +#pragma once #include "Display.h" @@ -48,5 +47,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/GBAApp.h b/src/platform/qt/GBAApp.h index 99db127a5..8530a70b3 100644 --- a/src/platform/qt/GBAApp.h +++ b/src/platform/qt/GBAApp.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_APP_H -#define QGBA_APP_H +#pragma once #include #include @@ -83,5 +82,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/GBAKeyEditor.h b/src/platform/qt/GBAKeyEditor.h index 6070d7f50..22720ab3c 100644 --- a/src/platform/qt/GBAKeyEditor.h +++ b/src/platform/qt/GBAKeyEditor.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GBA_KEY_EDITOR -#define QGBA_GBA_KEY_EDITOR +#pragma once #include #include @@ -92,5 +91,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/GBAOverride.h b/src/platform/qt/GBAOverride.h index a668a0d57..2cbc6944b 100644 --- a/src/platform/qt/GBAOverride.h +++ b/src/platform/qt/GBAOverride.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GBA_OVERRIDE -#define QGBA_GBA_OVERRIDE +#pragma once #include "Override.h" @@ -22,5 +21,3 @@ public: }; } - -#endif diff --git a/src/platform/qt/GBOverride.h b/src/platform/qt/GBOverride.h index 7c52b497a..82c53ca7f 100644 --- a/src/platform/qt/GBOverride.h +++ b/src/platform/qt/GBOverride.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GB_OVERRIDE -#define QGBA_GB_OVERRIDE +#pragma once #include "Override.h" @@ -22,5 +21,3 @@ public: }; } - -#endif diff --git a/src/platform/qt/GDBController.h b/src/platform/qt/GDBController.h index 25c0a18bf..f2380c6af 100644 --- a/src/platform/qt/GDBController.h +++ b/src/platform/qt/GDBController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GDB_CONTROLLER -#define QGBA_GDB_CONTROLLER +#pragma once #include "DebuggerController.h" @@ -47,5 +46,3 @@ private: } #endif - -#endif diff --git a/src/platform/qt/GDBWindow.h b/src/platform/qt/GDBWindow.h index 4e91c0e90..f185a7df7 100644 --- a/src/platform/qt/GDBWindow.h +++ b/src/platform/qt/GDBWindow.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GDB_WINDOW -#define QGBA_GDB_WINDOW +#pragma once #include @@ -40,5 +39,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/GIFView.h b/src/platform/qt/GIFView.h index f5433ae3e..b138cf071 100644 --- a/src/platform/qt/GIFView.h +++ b/src/platform/qt/GIFView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GIF_VIEW -#define QGBA_GIF_VIEW +#pragma once #ifdef USE_MAGICK @@ -55,5 +54,3 @@ private: } #endif - -#endif diff --git a/src/platform/qt/GamepadAxisEvent.h b/src/platform/qt/GamepadAxisEvent.h index 68234ccdc..34b259c7c 100644 --- a/src/platform/qt/GamepadAxisEvent.h +++ b/src/platform/qt/GamepadAxisEvent.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GAMEPAD_AXIS_EVENT -#define QGBA_GAMEPAD_AXIS_EVENT +#pragma once #include @@ -42,5 +41,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/GamepadButtonEvent.h b/src/platform/qt/GamepadButtonEvent.h index b0751f4b6..0f73dc03a 100644 --- a/src/platform/qt/GamepadButtonEvent.h +++ b/src/platform/qt/GamepadButtonEvent.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GAMEPAD_BUTTON_EVENT -#define QGBA_GAMEPAD_BUTTON_EVENT +#pragma once #include @@ -34,5 +33,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/GamepadHatEvent.h b/src/platform/qt/GamepadHatEvent.h index ea81dcafd..63090da7a 100644 --- a/src/platform/qt/GamepadHatEvent.h +++ b/src/platform/qt/GamepadHatEvent.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_GAMEPAD_HAT_EVENT -#define QGBA_GAMEPAD_HAT_EVENT +#pragma once #include @@ -44,5 +43,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/IOViewer.h b/src/platform/qt/IOViewer.h index 1e1da3c62..c1ae69c49 100644 --- a/src/platform/qt/IOViewer.h +++ b/src/platform/qt/IOViewer.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_IOVIEWER -#define QGBA_IOVIEWER +#pragma once #include #include @@ -71,5 +70,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index 50d670fc2..0fb6b16e0 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_INPUT_CONTROLLER_H -#define QGBA_INPUT_CONTROLLER_H +#pragma once #include "GamepadAxisEvent.h" #include "GamepadHatEvent.h" @@ -179,5 +178,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/InputProfile.h b/src/platform/qt/InputProfile.h index 431bd4b4f..4e43d16a7 100644 --- a/src/platform/qt/InputProfile.h +++ b/src/platform/qt/InputProfile.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_INPUT_PROFILE -#define QGBA_INPUT_PROFILE +#pragma once #include "GamepadAxisEvent.h" @@ -94,5 +93,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/KeyEditor.h b/src/platform/qt/KeyEditor.h index e1a7fa949..00798c56f 100644 --- a/src/platform/qt/KeyEditor.h +++ b/src/platform/qt/KeyEditor.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_KEY_EDITOR -#define QGBA_KEY_EDITOR +#pragma once #include "GamepadAxisEvent.h" #include "GamepadHatEvent.h" @@ -64,5 +63,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/LoadSaveState.h b/src/platform/qt/LoadSaveState.h index 8da0beef3..b762a00e1 100644 --- a/src/platform/qt/LoadSaveState.h +++ b/src/platform/qt/LoadSaveState.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_LOAD_SAVE_STATE -#define QGBA_LOAD_SAVE_STATE +#pragma once #include @@ -57,5 +56,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/LogController.h b/src/platform/qt/LogController.h index db87c9f91..e9f536e97 100644 --- a/src/platform/qt/LogController.h +++ b/src/platform/qt/LogController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_LOG_CONTROLLER -#define QGBA_LOG_CONTROLLER +#pragma once #include "GBAApp.h" @@ -66,5 +65,3 @@ private: #define LOG(C, L) (*LogController::global())(mLOG_ ## L, _mLOG_CAT_ ## C ()) } - -#endif diff --git a/src/platform/qt/LogView.h b/src/platform/qt/LogView.h index 8151b6da8..d037ae5a0 100644 --- a/src/platform/qt/LogView.h +++ b/src/platform/qt/LogView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_LOG_VIEW -#define QGBA_LOG_VIEW +#pragma once #include #include @@ -50,5 +49,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/MemoryModel.h b/src/platform/qt/MemoryModel.h index f40b9383a..ee55a6e74 100644 --- a/src/platform/qt/MemoryModel.h +++ b/src/platform/qt/MemoryModel.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_MEMORY_MODEL -#define QGBA_MEMORY_MODEL +#pragma once #include #include @@ -99,5 +98,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/MemorySearch.h b/src/platform/qt/MemorySearch.h index 8c02aa28d..28b5a2572 100644 --- a/src/platform/qt/MemorySearch.h +++ b/src/platform/qt/MemorySearch.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_MEMORY_SEARCH -#define QGBA_MEMORY_SEARCH +#pragma once #include @@ -45,5 +44,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/MemoryView.h b/src/platform/qt/MemoryView.h index 049c63aed..3af1835b8 100644 --- a/src/platform/qt/MemoryView.h +++ b/src/platform/qt/MemoryView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_MEMORY_VIEW -#define QGBA_MEMORY_VIEW +#pragma once #include "MemoryModel.h" @@ -38,5 +37,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/MessagePainter.h b/src/platform/qt/MessagePainter.h index 24a48b3a5..37f24c766 100644 --- a/src/platform/qt/MessagePainter.h +++ b/src/platform/qt/MessagePainter.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_MESSAGE_PAINTER -#define QGBA_MESSAGE_PAINTER +#pragma once #include #include @@ -43,5 +42,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/MultiplayerController.h b/src/platform/qt/MultiplayerController.h index b7f043140..fefba4cb4 100644 --- a/src/platform/qt/MultiplayerController.h +++ b/src/platform/qt/MultiplayerController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_MULTIPLAYER_CONTROLLER -#define QGBA_MULTIPLAYER_CONTROLLER +#pragma once #include #include @@ -64,4 +63,3 @@ private: }; } -#endif diff --git a/src/platform/qt/ObjView.h b/src/platform/qt/ObjView.h index 1771883a7..f5b628fb1 100644 --- a/src/platform/qt/ObjView.h +++ b/src/platform/qt/ObjView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_OBJ_VIEW -#define QGBA_OBJ_VIEW +#pragma once #include "AssetView.h" @@ -60,5 +59,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/Override.h b/src/platform/qt/Override.h index a7bdacce3..2ff209d8c 100644 --- a/src/platform/qt/Override.h +++ b/src/platform/qt/Override.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_OVERRIDE -#define QGBA_OVERRIDE +#pragma once struct Configuration; struct mCore; @@ -21,5 +20,3 @@ public: }; } - -#endif diff --git a/src/platform/qt/OverrideView.h b/src/platform/qt/OverrideView.h index 5fa62f2ee..7dc148155 100644 --- a/src/platform/qt/OverrideView.h +++ b/src/platform/qt/OverrideView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_OVERRIDE_VIEW -#define QGBA_OVERRIDE_VIEW +#pragma once #include @@ -59,5 +58,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/PaletteView.h b/src/platform/qt/PaletteView.h index d3bbb6023..493e825d9 100644 --- a/src/platform/qt/PaletteView.h +++ b/src/platform/qt/PaletteView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_PALETTE_VIEW -#define QGBA_PALETTE_VIEW +#pragma once #include @@ -40,5 +39,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/PrinterView.h b/src/platform/qt/PrinterView.h index 581350961..ed48714cc 100644 --- a/src/platform/qt/PrinterView.h +++ b/src/platform/qt/PrinterView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_PRINTER_VIEW -#define QGBA_PRINTER_VIEW +#pragma once #include #include @@ -46,5 +45,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/ROMInfo.h b/src/platform/qt/ROMInfo.h index b5ce734aa..f6aa0aa7b 100644 --- a/src/platform/qt/ROMInfo.h +++ b/src/platform/qt/ROMInfo.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_ROM_INFO -#define QGBA_ROM_INFO +#pragma once #include @@ -27,5 +26,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/SavestateButton.h b/src/platform/qt/SavestateButton.h index 3551fcb89..684a02c09 100644 --- a/src/platform/qt/SavestateButton.h +++ b/src/platform/qt/SavestateButton.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_SAVESTATE_BUTTON -#define QGBA_SAVESTATE_BUTTON +#pragma once #include @@ -19,5 +18,3 @@ protected: }; } - -#endif diff --git a/src/platform/qt/SensorView.h b/src/platform/qt/SensorView.h index 78dc4d82d..4cead7d11 100644 --- a/src/platform/qt/SensorView.h +++ b/src/platform/qt/SensorView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_SENSOR_VIEW -#define QGBA_SENSOR_VIEW +#pragma once #include #include @@ -53,5 +52,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index 55d2086ce..0ae5d0b07 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_SETTINGS_VIEW -#define QGBA_SETTINGS_VIEW +#pragma once #include @@ -79,5 +78,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/ShaderSelector.h b/src/platform/qt/ShaderSelector.h index 299204181..5bdb2a0b7 100644 --- a/src/platform/qt/ShaderSelector.h +++ b/src/platform/qt/ShaderSelector.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_SHADER_SELECTOR_H -#define QGBA_SHADER_SELECTOR_H +#pragma once #if defined(BUILD_GL) || defined(BUILD_GLES) @@ -58,5 +57,3 @@ private: } #endif - -#endif diff --git a/src/platform/qt/ShortcutController.h b/src/platform/qt/ShortcutController.h index f0cc90148..219188da1 100644 --- a/src/platform/qt/ShortcutController.h +++ b/src/platform/qt/ShortcutController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_SHORTCUT_MODEL -#define QGBA_SHORTCUT_MODEL +#pragma once #include "GamepadAxisEvent.h" @@ -144,5 +143,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/ShortcutView.h b/src/platform/qt/ShortcutView.h index 94314a84b..434cd82c3 100644 --- a/src/platform/qt/ShortcutView.h +++ b/src/platform/qt/ShortcutView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_SHORTCUT_VIEW -#define QGBA_SHORTCUT_VIEW +#pragma once #include "GamepadAxisEvent.h" @@ -45,5 +44,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/Swatch.h b/src/platform/qt/Swatch.h index 57fd08510..971a620b5 100644 --- a/src/platform/qt/Swatch.h +++ b/src/platform/qt/Swatch.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_SWATCH -#define QGBA_SWATCH +#pragma once #include #include @@ -41,5 +40,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/TilePainter.h b/src/platform/qt/TilePainter.h index e76af6ae3..532db6565 100644 --- a/src/platform/qt/TilePainter.h +++ b/src/platform/qt/TilePainter.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_TILE_PAINTER -#define QGBA_TILE_PAINTER +#pragma once #include #include @@ -38,5 +37,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/TileView.h b/src/platform/qt/TileView.h index 2cdb276c7..cedb11d6c 100644 --- a/src/platform/qt/TileView.h +++ b/src/platform/qt/TileView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_TILE_VIEW -#define QGBA_TILE_VIEW +#pragma once #include "AssetView.h" @@ -41,5 +40,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/VFileDevice.h b/src/platform/qt/VFileDevice.h index e4e6b17e0..180be2e6e 100644 --- a/src/platform/qt/VFileDevice.h +++ b/src/platform/qt/VFileDevice.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_VFILE_DEVICE -#define QGBA_VFILE_DEVICE +#pragma once #include @@ -41,5 +40,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/VideoDumper.h b/src/platform/qt/VideoDumper.h index f2deb1044..081fe3b45 100644 --- a/src/platform/qt/VideoDumper.h +++ b/src/platform/qt/VideoDumper.h @@ -3,8 +3,8 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_VIDEO_DUMPER -#define QGBA_VIDEO_DUMPER +#pragma once + #include namespace QGBA { @@ -23,5 +23,3 @@ signals: }; } - -#endif diff --git a/src/platform/qt/VideoView.h b/src/platform/qt/VideoView.h index e84d63fe8..3535535ae 100644 --- a/src/platform/qt/VideoView.h +++ b/src/platform/qt/VideoView.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_VIDEO_VIEW -#define QGBA_VIDEO_VIEW +#pragma once #ifdef USE_FFMPEG @@ -117,5 +116,3 @@ private: } #endif - -#endif diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 9c9384d8b..0bd06eda7 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_WINDOW -#define QGBA_WINDOW +#pragma once #include #include @@ -245,5 +244,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/library/LibraryController.h b/src/platform/qt/library/LibraryController.h index 7a7799b5b..027b83f31 100644 --- a/src/platform/qt/library/LibraryController.h +++ b/src/platform/qt/library/LibraryController.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_LIBRARY_CONTROLLER -#define QGBA_LIBRARY_CONTROLLER +#pragma once #include @@ -125,5 +124,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/library/LibraryGrid.h b/src/platform/qt/library/LibraryGrid.h index 98a0df630..48f0357da 100644 --- a/src/platform/qt/library/LibraryGrid.h +++ b/src/platform/qt/library/LibraryGrid.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_LIBRARY_GRID -#define QGBA_LIBRARY_GRID +#pragma once #include @@ -46,5 +45,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/library/LibraryTree.h b/src/platform/qt/library/LibraryTree.h index 80e3b461d..c705316bb 100644 --- a/src/platform/qt/library/LibraryTree.h +++ b/src/platform/qt/library/LibraryTree.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_LIBRARY_TREE -#define QGBA_LIBRARY_TREE +#pragma once #include @@ -53,5 +52,3 @@ private: }; } - -#endif diff --git a/src/platform/qt/utils.h b/src/platform/qt/utils.h index 210e1f85a..5dda75dd5 100644 --- a/src/platform/qt/utils.h +++ b/src/platform/qt/utils.h @@ -3,8 +3,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef QGBA_UTILS_H -#define QGBA_UTILS_H +#pragma once #include @@ -16,5 +15,3 @@ QString niceSizeFormat(size_t filesize); QString nicePlatformFormat(mPlatform platform); } - -#endif From f252436d0aa4b09a9d64c0eed869c9840d8541d4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Aug 2017 13:58:35 -0700 Subject: [PATCH 081/158] GB Video: Fix potential hang when ending mode 0 --- CHANGES | 1 + src/gb/video.c | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 2e2c72a2d..bd68c106f 100644 --- a/CHANGES +++ b/CHANGES @@ -30,6 +30,7 @@ Bugfixes: - Qt: Fix timezone issues with time overrides - Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841) - ARM: Fix MSR when T bit is set + - GB Video: Fix potential hang when ending mode 0 Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/video.c b/src/gb/video.c index f7d56aa80..5ed2ab641 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -227,6 +227,7 @@ void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) { video->mode = 1; video->modeEvent.callback = _endMode1; + mTimingDeschedule(&video->p->timing, &video->frameEvent); mTimingSchedule(&video->p->timing, &video->frameEvent, -cyclesLate); if (!_statIRQAsserted(video, oldStat) && GBRegisterSTATIsOAMIRQ(video->stat)) { From 546688f9fb9ea87589d786cdf7a909a34be0c904 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Aug 2017 14:12:49 -0700 Subject: [PATCH 082/158] GB Memory: Fix HDMA count starting in mode 0 (fixes #855) --- CHANGES | 1 + src/gb/memory.c | 7 +++++-- src/gb/video.c | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index bd68c106f..370e58f98 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,7 @@ Bugfixes: - Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841) - ARM: Fix MSR when T bit is set - GB Video: Fix potential hang when ending mode 0 + - GB Memory: Fix HDMA count starting in mode 0 (fixes mgba.io/i/855) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/memory.c b/src/gb/memory.c index 5e0574b2f..362c4b244 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -469,10 +469,13 @@ void GBMemoryWriteHDMA5(struct GB* gb, uint8_t value) { bool wasHdma = gb->memory.isHdma; gb->memory.isHdma = value & 0x80; if ((!wasHdma && !gb->memory.isHdma) || gb->video.mode == 0) { - gb->memory.hdmaRemaining = ((value & 0x7F) + 1) * 0x10; + if (gb->memory.isHdma) { + gb->memory.hdmaRemaining = 0x10; + } else { + gb->memory.hdmaRemaining = ((value & 0x7F) + 1) * 0x10; + } gb->cpuBlocked = true; mTimingSchedule(&gb->timing, &gb->memory.hdmaEvent, 0); - gb->cpu->nextEvent = gb->cpu->cycles; } } diff --git a/src/gb/video.c b/src/gb/video.c index 5ed2ab641..5810be63e 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -304,6 +304,7 @@ void _endMode3(struct mTiming* timing, void* context, uint32_t cyclesLate) { GBVideoProcessDots(video); if (video->ly < GB_VIDEO_VERTICAL_PIXELS && video->p->memory.isHdma && video->p->memory.io[REG_HDMA5] != 0xFF) { video->p->memory.hdmaRemaining = 0x10; + video->p->cpuBlocked = true; mTimingDeschedule(timing, &video->p->memory.hdmaEvent); mTimingSchedule(timing, &video->p->memory.hdmaEvent, 0); } From 66d5106e0b613857bc8aa9b5c8dc42b59b9d12de Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Aug 2017 14:13:24 -0700 Subject: [PATCH 083/158] GB Memory: Actually load latch time from savestate --- CHANGES | 1 + src/gb/memory.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 370e58f98..110bd77d3 100644 --- a/CHANGES +++ b/CHANGES @@ -32,6 +32,7 @@ Bugfixes: - ARM: Fix MSR when T bit is set - GB Video: Fix potential hang when ending mode 0 - GB Memory: Fix HDMA count starting in mode 0 (fixes mgba.io/i/855) + - GB Memory: Actually load latch time from savestate Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/memory.c b/src/gb/memory.c index 362c4b244..25b562146 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -713,8 +713,7 @@ void GBMemoryDeserialize(struct GB* gb, const struct GBSerializedState* state) { } break; case GB_MBC3_RTC: - // TODO? - //LOAD_64LE(gb->memory.rtcLastLatch, 0, &state->memory.rtc.lastLatch); + LOAD_64LE(gb->memory.rtcLastLatch, 0, &state->memory.rtc.lastLatch); break; case GB_MBC7: memory->mbcState.mbc7.state = state->memory.mbc7.state; From bb6728558dfc477e9f7d2c608f3e01c8626d46f9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Aug 2017 16:48:48 -0700 Subject: [PATCH 084/158] Test: Restructure test suite into multiple executables --- CHANGES | 1 + CMakeLists.txt | 14 ++++++++++---- src/core/test/core.c | 6 ------ src/gb/test/gb.c | 20 -------------------- src/gb/test/gb.h | 12 ------------ src/gba/test/gba.c | 14 -------------- src/gba/test/gba.h | 12 ------------ src/platform/test/suite-main.c | 27 --------------------------- src/util/test/suite.h | 6 +----- src/util/test/util.c | 16 ---------------- src/util/test/util.h | 12 ------------ 11 files changed, 12 insertions(+), 128 deletions(-) delete mode 100644 src/gb/test/gb.c delete mode 100644 src/gb/test/gb.h delete mode 100644 src/gba/test/gba.c delete mode 100644 src/gba/test/gba.h delete mode 100644 src/platform/test/suite-main.c delete mode 100644 src/util/test/util.c delete mode 100644 src/util/test/util.h diff --git a/CHANGES b/CHANGES index 110bd77d3..457cf3a96 100644 --- a/CHANGES +++ b/CHANGES @@ -40,6 +40,7 @@ Misc: - Qt: Don't rebuild library view if style hasn't changed - Qt: Redo GameController into multiple classes - SDL: Fix 2.0.5 build on macOS under some circumstances + - Test: Restructure test suite into multiple executables 0.6.0: (2017-07-16) Features: diff --git a/CMakeLists.txt b/CMakeLists.txt index 229d7e5a7..0a6a7503d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -861,10 +861,16 @@ if(BUILD_SUITE) include_directories(AFTER ${CMOCKA_INCLUDE_DIRS}) link_directories(${CMOCKA_LIBRARY_DIRS}) - add_executable(${BINARY_NAME}-suite ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/test/suite-main.c ${TEST_SRC}) - target_link_libraries(${BINARY_NAME}-suite ${BINARY_NAME} ${PLATFORM_LIBRARY} cmocka) - set_target_properties(${BINARY_NAME}-suite PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") - add_test(${BINARY_NAME}-suite ${BINARY_NAME}-suite) + foreach(TEST IN LISTS TEST_SRC) + string(REPLACE "${CMAKE_SOURCE_DIR}/src/" "" TEST_NAME "${TEST}") + string(REPLACE "/" "-" TEST_NAME "${TEST_NAME}") + string(REPLACE "-test" "" TEST_NAME "${TEST_NAME}") + string(REPLACE ".c" "" TEST_NAME "${TEST_NAME}") + add_executable(test-${TEST_NAME} ${TEST}) + target_link_libraries(test-${TEST_NAME} ${BINARY_NAME} ${PLATFORM_LIBRARY} cmocka) + set_target_properties(test-${TEST_NAME} PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") + add_test(${TEST_NAME} test-${TEST_NAME}) + endforeach() endif() if(BUILD_EXAMPLE) diff --git a/src/core/test/core.c b/src/core/test/core.c index 3fcebaf31..10c566b2c 100644 --- a/src/core/test/core.c +++ b/src/core/test/core.c @@ -34,9 +34,3 @@ M_TEST_SUITE_DEFINE(mCore, #endif cmocka_unit_test(findNullVF), cmocka_unit_test(findEmpty)) - -int TestRunCore(void) { - int failures = 0; - failures += M_TEST_SUITE_RUN(mCore); - return failures; -} diff --git a/src/gb/test/gb.c b/src/gb/test/gb.c deleted file mode 100644 index 2a21b3228..000000000 --- a/src/gb/test/gb.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "util/test/suite.h" - -M_TEST_SUITE_DECLARE(GBCore); -M_TEST_SUITE_DECLARE(GBMBC); -M_TEST_SUITE_DECLARE(GBMemory); -M_TEST_SUITE_DECLARE(GBRTC); - -int TestRunGB(void) { - int failures = 0; - failures += M_TEST_SUITE_RUN(GBCore); - failures += M_TEST_SUITE_RUN(GBMBC); - failures += M_TEST_SUITE_RUN(GBMemory); - failures += M_TEST_SUITE_RUN(GBRTC); - return failures; -} diff --git a/src/gb/test/gb.h b/src/gb/test/gb.h deleted file mode 100644 index 572a21466..000000000 --- a/src/gb/test/gb.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef TEST_GB_H -#define TEST_GB_H -#include - -int TestRunGB(void); - -#endif diff --git a/src/gba/test/gba.c b/src/gba/test/gba.c deleted file mode 100644 index 58186cd00..000000000 --- a/src/gba/test/gba.c +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "util/test/suite.h" - -M_TEST_SUITE_DECLARE(GBACore); - -int TestRunGBA(void) { - int failures = 0; - failures += M_TEST_SUITE_RUN(GBACore); - return failures; -} diff --git a/src/gba/test/gba.h b/src/gba/test/gba.h deleted file mode 100644 index 1e50b1d39..000000000 --- a/src/gba/test/gba.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef TEST_GBA_H -#define TEST_GBA_H -#include - -int TestRunGBA(void); - -#endif diff --git a/src/platform/test/suite-main.c b/src/platform/test/suite-main.c deleted file mode 100644 index 2eb03f626..000000000 --- a/src/platform/test/suite-main.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "util/test/suite.h" - -#include "util/test/util.h" -#include "core/test/core.h" -#ifdef M_CORE_GBA -#include "gba/test/gba.h" -#endif -#ifdef M_CORE_GB -#include "gb/test/gb.h" -#endif - -int main() { - int failures = TestRunUtil(); - failures += TestRunCore(); -#ifdef M_CORE_GBA - failures += TestRunGBA(); -#endif -#ifdef M_CORE_GB - failures += TestRunGB(); -#endif - return failures != 0; -} diff --git a/src/util/test/suite.h b/src/util/test/suite.h index dd947830d..5fc85938a 100644 --- a/src/util/test/suite.h +++ b/src/util/test/suite.h @@ -12,14 +12,12 @@ #define M_TEST_DEFINE(NAME) static void NAME (void **state ATTRIBUTE_UNUSED) -#define M_TEST_SUITE(NAME) _testSuite_ ## NAME -#define M_TEST_SUITE_RUN(NAME) (printf("\nRunning suite %s\n", # NAME), M_TEST_SUITE(NAME)()) #define M_TEST_SUITE_DEFINE(NAME, ...) M_TEST_SUITE_DEFINE_EX(NAME, NULL, NULL, __VA_ARGS__) #define M_TEST_SUITE_DEFINE_SETUP(NAME, ...) M_TEST_SUITE_DEFINE_EX(NAME, _testSuite_setup_ ## NAME, NULL, __VA_ARGS__) #define M_TEST_SUITE_DEFINE_TEARDOWN(NAME, ...) M_TEST_SUITE_DEFINE_EX(NAME, NULL, _testSuite_teardown_ ## NAME, __VA_ARGS__) #define M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(NAME, ...) M_TEST_SUITE_DEFINE_EX(NAME, _testSuite_setup_ ## NAME, _testSuite_teardown_ ## NAME, __VA_ARGS__) #define M_TEST_SUITE_DEFINE_EX(NAME, SETUP, TEARDOWN, ...) \ - int M_TEST_SUITE(NAME) (void) { \ + int main(void) { \ const static struct CMUnitTest tests[] = { \ __VA_ARGS__ \ }; \ @@ -29,6 +27,4 @@ #define M_TEST_SUITE_SETUP(NAME) static int _testSuite_setup_ ## NAME (void **state ATTRIBUTE_UNUSED) #define M_TEST_SUITE_TEARDOWN(NAME) static int _testSuite_teardown_ ## NAME (void **state ATTRIBUTE_UNUSED) -#define M_TEST_SUITE_DECLARE(NAME) extern int M_TEST_SUITE(NAME) (void) - #endif diff --git a/src/util/test/util.c b/src/util/test/util.c deleted file mode 100644 index 658601c4f..000000000 --- a/src/util/test/util.c +++ /dev/null @@ -1,16 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "util/test/suite.h" - -M_TEST_SUITE_DECLARE(TextCodec); -M_TEST_SUITE_DECLARE(VFS); - -int TestRunUtil(void) { - int failures = 0; - failures += M_TEST_SUITE_RUN(TextCodec); - failures += M_TEST_SUITE_RUN(VFS); - return failures; -} diff --git a/src/util/test/util.h b/src/util/test/util.h deleted file mode 100644 index 0a665b995..000000000 --- a/src/util/test/util.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef TEST_UTIL_H -#define TEST_UTIL_H -#include - -int TestRunUtil(void); - -#endif From 73d37a2a371c7be8a6f6f3334606e7f22ceedb1f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Aug 2017 18:10:05 -0700 Subject: [PATCH 085/158] Python: Fold in cinema --- CHANGES | 1 + src/platform/python/.gitignore | 5 + src/platform/python/CMakeLists.txt | 7 + src/platform/python/_builder.py | 4 + src/platform/python/cinema/__init__.py | 23 + src/platform/python/cinema/movie.py | 47 ++ src/platform/python/cinema/test.py | 96 ++++ src/platform/python/cinema/util.py | 9 + src/platform/python/conftest.py | 49 ++ src/platform/python/setup.cfg | 2 + src/platform/python/setup.py.in | 6 +- src/platform/python/test_cinema.py | 61 ++ .../python/tests/cinema/gb/mooneye-gb/LICENSE | 19 + .../add_sp_e_timing/baseline_0000.png | Bin 0 -> 1227 bytes .../acceptance/add_sp_e_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/add_sp_e_timing/test.sym | 206 +++++++ .../acceptance/bits/mem_oam/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/bits/mem_oam/test.gb | Bin 0 -> 32768 bytes .../acceptance/bits/mem_oam/test.sym | 212 +++++++ .../acceptance/bits/reg_f/baseline_0000.png | Bin 0 -> 1166 bytes .../mooneye-gb/acceptance/bits/reg_f/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/bits/reg_f/test.sym | 192 +++++++ .../bits/unused_hwio-GS/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/bits/unused_hwio-GS/test.gb | Bin 0 -> 32768 bytes .../acceptance/bits/unused_hwio-GS/test.sym | 535 ++++++++++++++++++ .../acceptance/boot_hwio-S/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/boot_hwio-S/manifest.yml | 1 + .../mooneye-gb/acceptance/boot_hwio-S/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_hwio-S/test.sym | 212 +++++++ .../boot_hwio-dmg0/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/boot_hwio-dmg0/manifest.yml | 1 + .../acceptance/boot_hwio-dmg0/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_hwio-dmg0/test.sym | 212 +++++++ .../boot_hwio-dmgABCXmgb/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/boot_hwio-dmgABCXmgb/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_hwio-dmgABCXmgb/test.sav | 0 .../acceptance/boot_hwio-dmgABCXmgb/test.sym | 212 +++++++ .../boot_regs-dmg/baseline_0000.png | Bin 0 -> 1327 bytes .../acceptance/boot_regs-dmg/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_regs-dmg/test.sym | 198 +++++++ .../boot_regs-dmg0/baseline_0000.png | Bin 0 -> 1355 bytes .../acceptance/boot_regs-dmg0/manifest.yml | 1 + .../acceptance/boot_regs-dmg0/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_regs-dmg0/test.sym | 199 +++++++ .../boot_regs-dmgABCX/baseline_0000.png | Bin 0 -> 1327 bytes .../acceptance/boot_regs-dmgABCX/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_regs-dmgABCX/test.sym | 199 +++++++ .../boot_regs-mgb/baseline_0000.png | Bin 0 -> 1324 bytes .../acceptance/boot_regs-mgb/manifest.yml | 1 + .../acceptance/boot_regs-mgb/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_regs-mgb/test.sym | 199 +++++++ .../boot_regs-sgb/baseline_0000.png | Bin 0 -> 1310 bytes .../acceptance/boot_regs-sgb/manifest.yml | 1 + .../acceptance/boot_regs-sgb/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_regs-sgb/test.sym | 199 +++++++ .../boot_regs-sgb2/baseline_0000.png | Bin 0 -> 1312 bytes .../acceptance/boot_regs-sgb2/manifest.yml | 1 + .../acceptance/boot_regs-sgb2/test.gb | Bin 0 -> 32768 bytes .../acceptance/boot_regs-sgb2/test.sym | 199 +++++++ .../call_cc_timing/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/call_cc_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/call_cc_timing/test.sym | 223 ++++++++ .../call_cc_timing2/baseline_0000.png | Bin 0 -> 1278 bytes .../acceptance/call_cc_timing2/test.gb | Bin 0 -> 32768 bytes .../acceptance/call_cc_timing2/test.sym | 204 +++++++ .../acceptance/call_timing/baseline_0000.png | Bin 0 -> 518 bytes .../mooneye-gb/acceptance/call_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/call_timing/test.sym | 223 ++++++++ .../acceptance/call_timing2/baseline_0000.png | Bin 0 -> 1275 bytes .../acceptance/call_timing2/test.gb | Bin 0 -> 32768 bytes .../acceptance/call_timing2/test.sym | 204 +++++++ .../acceptance/di_timing-GS/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/di_timing-GS/test.gb | Bin 0 -> 32768 bytes .../acceptance/di_timing-GS/test.sym | 228 ++++++++ .../acceptance/div_timing/baseline_0000.png | Bin 0 -> 1203 bytes .../mooneye-gb/acceptance/div_timing/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/div_timing/test.sym | 192 +++++++ .../acceptance/ei_timing/baseline_0000.png | Bin 0 -> 1184 bytes .../mooneye-gb/acceptance/ei_timing/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/ei_timing/test.sym | 192 +++++++ .../hblank_ly_scx_timing-GS/baseline_0000.png | Bin 0 -> 518 bytes .../gpu/hblank_ly_scx_timing-GS/manifest.yml | 1 + .../gpu/hblank_ly_scx_timing-GS/test.gb | Bin 0 -> 32768 bytes .../gpu/hblank_ly_scx_timing-GS/test.sym | 219 +++++++ .../gpu/intr_1_2_timing-GS/baseline_0000.png | Bin 0 -> 1199 bytes .../acceptance/gpu/intr_1_2_timing-GS/test.gb | Bin 0 -> 32768 bytes .../gpu/intr_1_2_timing-GS/test.sym | 203 +++++++ .../gpu/intr_2_0_timing/baseline_0000.png | Bin 0 -> 1195 bytes .../acceptance/gpu/intr_2_0_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/gpu/intr_2_0_timing/test.sym | 203 +++++++ .../gpu/intr_2_mode0_timing/baseline_0000.png | Bin 0 -> 1206 bytes .../gpu/intr_2_mode0_timing/test.gb | Bin 0 -> 32768 bytes .../gpu/intr_2_mode0_timing/test.sym | 202 +++++++ .../baseline_0000.png | Bin 0 -> 627 bytes .../gpu/intr_2_mode0_timing_sprites/test.gb | Bin 0 -> 32768 bytes .../gpu/intr_2_mode0_timing_sprites/test.sym | 437 ++++++++++++++ .../gpu/intr_2_mode3_timing/baseline_0000.png | Bin 0 -> 1214 bytes .../gpu/intr_2_mode3_timing/test.gb | Bin 0 -> 32768 bytes .../gpu/intr_2_mode3_timing/test.sym | 202 +++++++ .../intr_2_oam_ok_timing/baseline_0000.png | Bin 0 -> 1186 bytes .../gpu/intr_2_oam_ok_timing/test.gb | Bin 0 -> 32768 bytes .../gpu/intr_2_oam_ok_timing/test.sym | 202 +++++++ .../gpu/lcdon_timing-dmgABCXmgbS/manifest.yml | 1 + .../gpu/lcdon_timing-dmgABCXmgbS/test.gb | Bin 0 -> 32768 bytes .../gpu/lcdon_timing-dmgABCXmgbS/test.sym | 236 ++++++++ .../gpu/lcdon_write_timing-GS/manifest.yml | 1 + .../gpu/lcdon_write_timing-GS/test.gb | Bin 0 -> 32768 bytes .../gpu/lcdon_write_timing-GS/test.sym | 230 ++++++++ .../gpu/stat_irq_blocking/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/gpu/stat_irq_blocking/test.gb | Bin 0 -> 32768 bytes .../acceptance/gpu/stat_irq_blocking/test.sym | 219 +++++++ .../gpu/vblank_stat_intr-GS/baseline_0000.png | Bin 0 -> 1237 bytes .../gpu/vblank_stat_intr-GS/test.gb | Bin 0 -> 32768 bytes .../gpu/vblank_stat_intr-GS/test.sym | 216 +++++++ .../acceptance/halt_ime0_ei/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/halt_ime0_ei/test.gb | Bin 0 -> 32768 bytes .../acceptance/halt_ime0_ei/test.sym | 206 +++++++ .../halt_ime0_nointr_timing/baseline_0000.png | Bin 0 -> 1210 bytes .../halt_ime0_nointr_timing/test.gb | Bin 0 -> 32768 bytes .../halt_ime0_nointr_timing/test.sym | 210 +++++++ .../halt_ime1_timing/baseline_0000.png | Bin 0 -> 1158 bytes .../acceptance/halt_ime1_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/halt_ime1_timing/test.sym | 198 +++++++ .../halt_ime1_timing2-GS/baseline_0000.png | Bin 0 -> 1231 bytes .../acceptance/halt_ime1_timing2-GS/test.gb | Bin 0 -> 32768 bytes .../acceptance/halt_ime1_timing2-GS/test.sym | 237 ++++++++ .../acceptance/hdma_lcdc/manifest.yml | 1 + .../mooneye-gb/acceptance/hdma_lcdc/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/hdma_lcdc/test.sym | 195 +++++++ .../if_ie_registers/baseline_0000.png | Bin 0 -> 1235 bytes .../acceptance/if_ie_registers/test.gb | Bin 0 -> 32768 bytes .../acceptance/if_ie_registers/test.sym | 192 +++++++ .../acceptance/intr_timing/baseline_0000.png | Bin 0 -> 1207 bytes .../mooneye-gb/acceptance/intr_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/intr_timing/test.sym | 208 +++++++ .../acceptance/jp_cc_timing/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/jp_cc_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/jp_cc_timing/test.sym | 223 ++++++++ .../acceptance/jp_timing/baseline_0000.png | Bin 0 -> 518 bytes .../mooneye-gb/acceptance/jp_timing/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/jp_timing/test.sym | 223 ++++++++ .../ld_hl_sp_e_timing/baseline_0000.png | Bin 0 -> 1231 bytes .../acceptance/ld_hl_sp_e_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/ld_hl_sp_e_timing/test.sym | 202 +++++++ .../oam_dma_restart/baseline_0000.png | Bin 0 -> 1178 bytes .../acceptance/oam_dma_restart/test.gb | Bin 0 -> 32768 bytes .../acceptance/oam_dma_restart/test.sym | 199 +++++++ .../oam_dma_start/baseline_0000.png | Bin 0 -> 1247 bytes .../acceptance/oam_dma_start/manifest.yml | 1 + .../acceptance/oam_dma_start/test.gb | Bin 0 -> 32768 bytes .../acceptance/oam_dma_start/test.sym | 218 +++++++ .../oam_dma_timing/baseline_0000.png | Bin 0 -> 1178 bytes .../acceptance/oam_dma_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/oam_dma_timing/test.sym | 199 +++++++ .../acceptance/pop_timing/baseline_0000.png | Bin 0 -> 1255 bytes .../mooneye-gb/acceptance/pop_timing/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/pop_timing/test.sym | 192 +++++++ .../acceptance/push_timing/baseline_0000.png | Bin 0 -> 1249 bytes .../acceptance/push_timing/manifest.yml | 1 + .../mooneye-gb/acceptance/push_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/push_timing/test.sym | 199 +++++++ .../acceptance/rapid_di_ei/baseline_0000.png | Bin 0 -> 1200 bytes .../acceptance/rapid_di_ei/manifest.yml | 1 + .../mooneye-gb/acceptance/rapid_di_ei/test.gb | Bin 0 -> 32768 bytes .../acceptance/rapid_di_ei/test.sym | 192 +++++++ .../ret_cc_timing/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/ret_cc_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/ret_cc_timing/test.sym | 223 ++++++++ .../acceptance/ret_timing/baseline_0000.png | Bin 0 -> 518 bytes .../mooneye-gb/acceptance/ret_timing/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/ret_timing/test.sym | 223 ++++++++ .../reti_intr_timing/baseline_0000.png | Bin 0 -> 1193 bytes .../acceptance/reti_intr_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/reti_intr_timing/test.sym | 192 +++++++ .../acceptance/reti_timing/baseline_0000.png | Bin 0 -> 518 bytes .../mooneye-gb/acceptance/reti_timing/test.gb | Bin 0 -> 32768 bytes .../acceptance/reti_timing/test.sym | 223 ++++++++ .../acceptance/rst_timing/baseline_0000.png | Bin 0 -> 1221 bytes .../mooneye-gb/acceptance/rst_timing/test.gb | Bin 0 -> 32768 bytes .../mooneye-gb/acceptance/rst_timing/test.sym | 201 +++++++ .../boot_sclk_align-dmgABCXmgb/manifest.yml | 1 + .../serial/boot_sclk_align-dmgABCXmgb/test.gb | Bin 0 -> 32768 bytes .../boot_sclk_align-dmgABCXmgb/test.sav | 0 .../boot_sclk_align-dmgABCXmgb/test.sym | 198 +++++++ .../timer/div_write/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/timer/div_write/test.gb | Bin 0 -> 32768 bytes .../acceptance/timer/div_write/test.sym | 205 +++++++ .../timer/rapid_toggle/baseline_0000.png | Bin 0 -> 1158 bytes .../timer/rapid_toggle/manifest.yml | 1 + .../acceptance/timer/rapid_toggle/test.gb | Bin 0 -> 32768 bytes .../acceptance/timer/rapid_toggle/test.sym | 199 +++++++ .../acceptance/timer/tim00/baseline_0000.png | Bin 0 -> 1203 bytes .../mooneye-gb/acceptance/timer/tim00/test.gb | Bin 0 -> 32768 bytes .../acceptance/timer/tim00/test.sym | 192 +++++++ .../timer/tim00_div_trigger/baseline_0000.png | Bin 0 -> 1203 bytes .../timer/tim00_div_trigger/test.gb | Bin 0 -> 32768 bytes .../timer/tim00_div_trigger/test.sym | 192 +++++++ .../acceptance/timer/tim01/baseline_0000.png | Bin 0 -> 1209 bytes .../mooneye-gb/acceptance/timer/tim01/test.gb | Bin 0 -> 32768 bytes .../acceptance/timer/tim01/test.sym | 192 +++++++ .../timer/tim01_div_trigger/baseline_0000.png | Bin 0 -> 1190 bytes .../timer/tim01_div_trigger/manifest.yml | 1 + .../timer/tim01_div_trigger/test.gb | Bin 0 -> 32768 bytes .../timer/tim01_div_trigger/test.sym | 192 +++++++ .../acceptance/timer/tim10/baseline_0000.png | Bin 0 -> 1203 bytes .../mooneye-gb/acceptance/timer/tim10/test.gb | Bin 0 -> 32768 bytes .../acceptance/timer/tim10/test.sym | 192 +++++++ .../timer/tim10_div_trigger/baseline_0000.png | Bin 0 -> 1208 bytes .../timer/tim10_div_trigger/test.gb | Bin 0 -> 32768 bytes .../timer/tim10_div_trigger/test.sym | 192 +++++++ .../acceptance/timer/tim11/baseline_0000.png | Bin 0 -> 1203 bytes .../mooneye-gb/acceptance/timer/tim11/test.gb | Bin 0 -> 32768 bytes .../acceptance/timer/tim11/test.sym | 192 +++++++ .../timer/tim11_div_trigger/baseline_0000.png | Bin 0 -> 1203 bytes .../timer/tim11_div_trigger/test.gb | Bin 0 -> 32768 bytes .../timer/tim11_div_trigger/test.sym | 192 +++++++ .../timer/tima_reload/baseline_0000.png | Bin 0 -> 1244 bytes .../acceptance/timer/tima_reload/test.gb | Bin 0 -> 32768 bytes .../acceptance/timer/tima_reload/test.sym | 192 +++++++ .../tima_write_reloading/baseline_0000.png | Bin 0 -> 1209 bytes .../timer/tima_write_reloading/manifest.yml | 1 + .../timer/tima_write_reloading/test.gb | Bin 0 -> 32768 bytes .../timer/tima_write_reloading/test.sym | 192 +++++++ .../tma_write_reloading/baseline_0000.png | Bin 0 -> 1179 bytes .../timer/tma_write_reloading/manifest.yml | 1 + .../timer/tma_write_reloading/test.gb | Bin 0 -> 32768 bytes .../timer/tma_write_reloading/test.sym | 192 +++++++ .../mbc1/multicart_rom_8Mb/baseline_0000.png | Bin 0 -> 518 bytes .../mbc1/multicart_rom_8Mb/test.gb | Bin 0 -> 1048576 bytes .../mbc1/multicart_rom_8Mb/test.sym | 226 ++++++++ .../mbc1/ram_256Kb/baseline_0000.png | Bin 0 -> 518 bytes .../emulator-only/mbc1/ram_256Kb/test.gb | Bin 0 -> 65536 bytes .../emulator-only/mbc1/ram_256Kb/test.sym | 252 +++++++++ .../mbc1/ram_64Kb/baseline_0000.png | Bin 0 -> 518 bytes .../emulator-only/mbc1/ram_64Kb/test.gb | Bin 0 -> 65536 bytes .../emulator-only/mbc1/ram_64Kb/test.sym | 244 ++++++++ .../mbc1/rom_16Mb/baseline_0000.png | Bin 0 -> 518 bytes .../emulator-only/mbc1/rom_16Mb/test.gb | Bin 0 -> 2097152 bytes .../emulator-only/mbc1/rom_16Mb/test.sym | 226 ++++++++ .../mbc1/rom_1Mb/baseline_0000.png | Bin 0 -> 518 bytes .../emulator-only/mbc1/rom_1Mb/manifest.yml | 1 + .../emulator-only/mbc1/rom_1Mb/test.gb | Bin 0 -> 131072 bytes .../emulator-only/mbc1/rom_1Mb/test.sym | 226 ++++++++ .../mbc1/rom_2Mb/baseline_0000.png | Bin 0 -> 518 bytes .../emulator-only/mbc1/rom_2Mb/manifest.yml | 1 + .../emulator-only/mbc1/rom_2Mb/test.gb | Bin 0 -> 262144 bytes .../emulator-only/mbc1/rom_2Mb/test.sym | 226 ++++++++ .../mbc1/rom_4Mb/baseline_0000.png | Bin 0 -> 518 bytes .../emulator-only/mbc1/rom_4Mb/test.gb | Bin 0 -> 524288 bytes .../emulator-only/mbc1/rom_4Mb/test.sym | 226 ++++++++ .../mbc1/rom_512Kb/baseline_0000.png | Bin 0 -> 1188 bytes .../emulator-only/mbc1/rom_512Kb/test.gb | Bin 0 -> 65536 bytes .../emulator-only/mbc1/rom_512Kb/test.sym | 226 ++++++++ .../mbc1/rom_8Mb/baseline_0000.png | Bin 0 -> 518 bytes .../emulator-only/mbc1/rom_8Mb/test.gb | Bin 0 -> 1048576 bytes .../emulator-only/mbc1/rom_8Mb/test.sym | 226 ++++++++ .../mbc1_rom_4banks/baseline_0000.png | Bin 0 -> 518 bytes .../mbc1_rom_4banks/manifest.yml | 1 + .../emulator-only/mbc1_rom_4banks/test.gb | Bin 0 -> 65536 bytes .../emulator-only/mbc1_rom_4banks/test.sym | 205 +++++++ .../baseline_0000.png | Bin 0 -> 466 bytes .../mgb_oam_dma_halt_sprites/manifest.yml | 1 + .../madness/mgb_oam_dma_halt_sprites/test.gb | Bin 0 -> 32768 bytes .../madness/mgb_oam_dma_halt_sprites/test.sym | 200 +++++++ .../tests/cinema/gb/mooneye-gb/manifest.yml | 4 + .../sprite_priority/baseline_0000.png | Bin 0 -> 560 bytes .../manual-only/sprite_priority/manifest.yml | 1 + .../manual-only/sprite_priority/test.gb | Bin 0 -> 32768 bytes .../manual-only/sprite_priority/test.sym | 193 +++++++ .../misc/bits/unused_hwio-C/baseline_0000.png | Bin 0 -> 518 bytes .../misc/bits/unused_hwio-C/manifest.yml | 3 + .../misc/bits/unused_hwio-C/test.gb | Bin 0 -> 32768 bytes .../misc/bits/unused_hwio-C/test.sym | 535 ++++++++++++++++++ .../misc/boot_hwio-C/baseline_0000.png | Bin 0 -> 518 bytes .../mooneye-gb/misc/boot_hwio-C/manifest.yml | 3 + .../gb/mooneye-gb/misc/boot_hwio-C/test.gb | Bin 0 -> 32768 bytes .../gb/mooneye-gb/misc/boot_hwio-C/test.sav | 0 .../gb/mooneye-gb/misc/boot_hwio-C/test.sym | 212 +++++++ .../misc/boot_regs-A/baseline_0000.png | Bin 0 -> 1317 bytes .../mooneye-gb/misc/boot_regs-A/manifest.yml | 1 + .../gb/mooneye-gb/misc/boot_regs-A/test.gb | Bin 0 -> 32768 bytes .../gb/mooneye-gb/misc/boot_regs-A/test.sym | 199 +++++++ .../misc/boot_regs-cgb/baseline_0000.png | Bin 0 -> 1320 bytes .../misc/boot_regs-cgb/manifest.yml | 1 + .../gb/mooneye-gb/misc/boot_regs-cgb/test.gb | Bin 0 -> 32768 bytes .../gb/mooneye-gb/misc/boot_regs-cgb/test.sym | 199 +++++++ .../gpu/vblank_stat_intr-C/baseline_0000.png | Bin 0 -> 1355 bytes .../misc/gpu/vblank_stat_intr-C/manifest.yml | 1 + .../misc/gpu/vblank_stat_intr-C/test.gb | Bin 0 -> 32768 bytes .../misc/gpu/vblank_stat_intr-C/test.sym | 216 +++++++ .../tests/cinema/gb/mooneye-gb/update.py | 61 ++ .../gb/window/dk94-split/baseline_0000.png | Bin 0 -> 1810 bytes .../gb/window/dk94-split/baseline_0001.png | Bin 0 -> 1810 bytes .../gb/window/dk94-split/baseline_0002.png | Bin 0 -> 1812 bytes .../gb/window/dk94-split/baseline_0003.png | Bin 0 -> 1818 bytes .../gb/window/dk94-split/baseline_0004.png | Bin 0 -> 1818 bytes .../gb/window/dk94-split/baseline_0005.png | Bin 0 -> 1818 bytes .../gb/window/dk94-split/baseline_0006.png | Bin 0 -> 1809 bytes .../gb/window/dk94-split/baseline_0007.png | Bin 0 -> 1818 bytes .../gb/window/dk94-split/baseline_0008.png | Bin 0 -> 1818 bytes .../cinema/gb/window/dk94-split/test.mvl | Bin 0 -> 16050 bytes .../cinema/gb/window/dk94-split/test.sav | 0 .../gb/window/gsc-battle/baseline_0000.png | Bin 0 -> 1951 bytes .../gb/window/gsc-battle/baseline_0001.png | Bin 0 -> 1945 bytes .../gb/window/gsc-battle/baseline_0002.png | Bin 0 -> 1945 bytes .../gb/window/gsc-battle/baseline_0003.png | Bin 0 -> 1945 bytes .../gb/window/gsc-battle/baseline_0004.png | Bin 0 -> 1945 bytes .../cinema/gb/window/gsc-battle/manifest.yml | 1 + .../cinema/gb/window/gsc-battle/test.mvl | Bin 0 -> 12853 bytes .../cinema/gb/window/gsc-battle/test.sav | 0 .../gb/window/zoos-intro/baseline_0000.png | Bin 0 -> 4367 bytes .../gb/window/zoos-intro/baseline_0001.png | Bin 0 -> 4367 bytes .../gb/window/zoos-intro/baseline_0002.png | Bin 0 -> 4367 bytes .../gb/window/zoos-intro/baseline_0003.png | Bin 0 -> 4501 bytes .../gb/window/zoos-intro/baseline_0004.png | Bin 0 -> 4501 bytes .../gb/window/zoos-intro/baseline_0005.png | Bin 0 -> 4501 bytes .../gb/window/zoos-intro/baseline_0006.png | Bin 0 -> 4501 bytes .../cinema/gb/window/zoos-intro/test.mvl | Bin 0 -> 12321 bytes .../cinema/gb/window/zoos-intro/test.sav | 0 .../cinema/gba/bg/lady-sia/baseline_0000.png | Bin 0 -> 15422 bytes .../cinema/gba/bg/lady-sia/baseline_0001.png | Bin 0 -> 15430 bytes .../cinema/gba/bg/lady-sia/baseline_0002.png | Bin 0 -> 15415 bytes .../cinema/gba/bg/lady-sia/baseline_0003.png | Bin 0 -> 15491 bytes .../tests/cinema/gba/bg/lady-sia/test.mvl | Bin 0 -> 64811 bytes .../gba/blend/mzm-layering/baseline_0000.png | Bin 0 -> 11517 bytes .../gba/blend/mzm-layering/baseline_0001.png | Bin 0 -> 11342 bytes .../gba/blend/mzm-layering/baseline_0002.png | Bin 0 -> 11449 bytes .../gba/blend/mzm-layering/baseline_0003.png | Bin 0 -> 11479 bytes .../gba/blend/mzm-layering/baseline_0004.png | Bin 0 -> 11456 bytes .../gba/blend/mzm-layering/baseline_0005.png | Bin 0 -> 11403 bytes .../gba/blend/mzm-layering/baseline_0006.png | Bin 0 -> 11416 bytes .../gba/blend/mzm-layering/baseline_0007.png | Bin 0 -> 11431 bytes .../gba/blend/mzm-layering/baseline_0008.png | Bin 0 -> 11359 bytes .../gba/blend/mzm-layering/baseline_0009.png | Bin 0 -> 11125 bytes .../cinema/gba/blend/mzm-layering/test.mvl | Bin 0 -> 87409 bytes .../cinema/gba/blend/mzm-layering/test.sav | 0 .../gba/blend/sma-knockout/baseline_0000.png | Bin 0 -> 5971 bytes .../gba/blend/sma-knockout/baseline_0001.png | Bin 0 -> 5978 bytes .../gba/blend/sma-knockout/baseline_0002.png | Bin 0 -> 5987 bytes .../cinema/gba/blend/sma-knockout/test.mvl | Bin 0 -> 29818 bytes .../window/gs-clock-wipe/baseline_0000.png | Bin 0 -> 17681 bytes .../window/gs-clock-wipe/baseline_0001.png | Bin 0 -> 16909 bytes .../window/gs-clock-wipe/baseline_0002.png | Bin 0 -> 16883 bytes .../window/gs-clock-wipe/baseline_0003.png | Bin 0 -> 16442 bytes .../window/gs-clock-wipe/baseline_0004.png | Bin 0 -> 14925 bytes .../window/gs-clock-wipe/baseline_0005.png | Bin 0 -> 13461 bytes .../window/gs-clock-wipe/baseline_0006.png | Bin 0 -> 12786 bytes .../window/gs-clock-wipe/baseline_0007.png | Bin 0 -> 11371 bytes .../window/gs-clock-wipe/baseline_0008.png | Bin 0 -> 10690 bytes .../window/gs-clock-wipe/baseline_0009.png | Bin 0 -> 10140 bytes .../window/gs-clock-wipe/baseline_0010.png | Bin 0 -> 9721 bytes .../window/gs-clock-wipe/baseline_0011.png | Bin 0 -> 8467 bytes .../window/gs-clock-wipe/baseline_0012.png | Bin 0 -> 5989 bytes .../window/gs-clock-wipe/baseline_0013.png | Bin 0 -> 4424 bytes .../window/gs-clock-wipe/baseline_0014.png | Bin 0 -> 4113 bytes .../window/gs-clock-wipe/baseline_0015.png | Bin 0 -> 2612 bytes .../window/gs-clock-wipe/baseline_0016.png | Bin 0 -> 1658 bytes .../window/gs-clock-wipe/baseline_0017.png | Bin 0 -> 192 bytes .../cinema/gba/window/gs-clock-wipe/test.mvl | Bin 0 -> 126469 bytes .../window/tgr-objwin-order/baseline_0000.png | Bin 0 -> 24661 bytes .../window/tgr-objwin-order/baseline_0001.png | Bin 0 -> 25200 bytes .../window/tgr-objwin-order/baseline_0002.png | Bin 0 -> 25200 bytes .../window/tgr-objwin-order/baseline_0003.png | Bin 0 -> 25569 bytes .../window/tgr-objwin-order/baseline_0004.png | Bin 0 -> 25569 bytes .../window/tgr-objwin-order/baseline_0005.png | Bin 0 -> 26158 bytes .../window/tgr-objwin-order/baseline_0006.png | Bin 0 -> 26158 bytes .../window/tgr-objwin-order/baseline_0007.png | Bin 0 -> 26648 bytes .../window/tgr-objwin-order/baseline_0008.png | Bin 0 -> 26648 bytes .../window/tgr-objwin-order/baseline_0009.png | Bin 0 -> 27750 bytes .../window/tgr-objwin-order/baseline_0010.png | Bin 0 -> 27750 bytes .../window/tgr-objwin-order/baseline_0011.png | Bin 0 -> 27797 bytes .../window/tgr-objwin-order/baseline_0012.png | Bin 0 -> 27797 bytes .../window/tgr-objwin-order/baseline_0013.png | Bin 0 -> 28682 bytes .../window/tgr-objwin-order/baseline_0014.png | Bin 0 -> 28682 bytes .../window/tgr-objwin-order/baseline_0015.png | Bin 0 -> 29109 bytes .../window/tgr-objwin-order/baseline_0016.png | Bin 0 -> 29109 bytes .../window/tgr-objwin-order/baseline_0017.png | Bin 0 -> 29229 bytes .../window/tgr-objwin-order/baseline_0018.png | Bin 0 -> 29229 bytes .../window/tgr-objwin-order/baseline_0019.png | Bin 0 -> 29399 bytes .../window/tgr-objwin-order/baseline_0020.png | Bin 0 -> 29399 bytes .../window/tgr-objwin-order/baseline_0021.png | Bin 0 -> 30051 bytes .../window/tgr-objwin-order/baseline_0022.png | Bin 0 -> 30051 bytes .../window/tgr-objwin-order/baseline_0023.png | Bin 0 -> 30274 bytes .../window/tgr-objwin-order/baseline_0024.png | Bin 0 -> 30274 bytes .../gba/window/tgr-objwin-order/test.mvl | Bin 0 -> 332019 bytes .../zmc-window-mosaic/baseline_0000.png | Bin 0 -> 16196 bytes .../zmc-window-mosaic/baseline_0001.png | Bin 0 -> 10115 bytes .../zmc-window-mosaic/baseline_0002.png | Bin 0 -> 10179 bytes .../zmc-window-mosaic/baseline_0003.png | Bin 0 -> 7843 bytes .../zmc-window-mosaic/baseline_0004.png | Bin 0 -> 7743 bytes .../zmc-window-mosaic/baseline_0005.png | Bin 0 -> 6117 bytes .../zmc-window-mosaic/baseline_0006.png | Bin 0 -> 6073 bytes .../zmc-window-mosaic/baseline_0007.png | Bin 0 -> 5388 bytes .../zmc-window-mosaic/baseline_0008.png | Bin 0 -> 5362 bytes .../zmc-window-mosaic/baseline_0009.png | Bin 0 -> 4811 bytes .../zmc-window-mosaic/baseline_0010.png | Bin 0 -> 4851 bytes .../zmc-window-mosaic/baseline_0011.png | Bin 0 -> 4434 bytes .../zmc-window-mosaic/baseline_0012.png | Bin 0 -> 4409 bytes .../zmc-window-mosaic/baseline_0013.png | Bin 0 -> 3886 bytes .../zmc-window-mosaic/baseline_0014.png | Bin 0 -> 3863 bytes .../zmc-window-mosaic/baseline_0015.png | Bin 0 -> 3858 bytes .../zmc-window-mosaic/baseline_0016.png | Bin 0 -> 3780 bytes .../zmc-window-mosaic/baseline_0017.png | Bin 0 -> 3565 bytes .../zmc-window-mosaic/baseline_0018.png | Bin 0 -> 3447 bytes .../zmc-window-mosaic/baseline_0019.png | Bin 0 -> 3342 bytes .../zmc-window-mosaic/baseline_0020.png | Bin 0 -> 3262 bytes .../zmc-window-mosaic/baseline_0021.png | Bin 0 -> 3147 bytes .../zmc-window-mosaic/baseline_0022.png | Bin 0 -> 3103 bytes .../zmc-window-mosaic/baseline_0023.png | Bin 0 -> 2903 bytes .../zmc-window-mosaic/baseline_0024.png | Bin 0 -> 2826 bytes .../zmc-window-mosaic/baseline_0025.png | Bin 0 -> 2721 bytes .../zmc-window-mosaic/baseline_0026.png | Bin 0 -> 2516 bytes .../zmc-window-mosaic/baseline_0027.png | Bin 0 -> 2301 bytes .../gba/window/zmc-window-mosaic/test.mvl | Bin 0 -> 120669 bytes 414 files changed, 18540 insertions(+), 2 deletions(-) create mode 100644 src/platform/python/.gitignore create mode 100644 src/platform/python/cinema/__init__.py create mode 100644 src/platform/python/cinema/movie.py create mode 100644 src/platform/python/cinema/test.py create mode 100644 src/platform/python/cinema/util.py create mode 100644 src/platform/python/conftest.py create mode 100644 src/platform/python/setup.cfg create mode 100644 src/platform/python/test_cinema.py create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/LICENSE create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/unused_hwio-GS/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/unused_hwio-GS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/unused_hwio-GS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmgABCXmgb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmgABCXmgb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmgABCXmgb/test.sav create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmgABCXmgb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_intr_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_intr_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_intr_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/test.sav create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_16Mb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_16Mb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_16Mb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_1Mb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_1Mb/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_1Mb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_1Mb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_2Mb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_2Mb/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_2Mb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_2Mb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_4Mb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_4Mb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_4Mb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/baseline_0000.png create mode 100755 src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/baseline_0000.png create mode 100755 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.sav create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/baseline_0000.png create mode 100755 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/baseline_0000.png create mode 100755 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/baseline_0000.png create mode 100755 src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/test.sym create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/update.py create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0005.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0006.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0007.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0008.png create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/test.mvl create mode 100644 src/platform/python/tests/cinema/gb/window/dk94-split/test.sav create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/manifest.yml create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/test.mvl create mode 100644 src/platform/python/tests/cinema/gb/window/gsc-battle/test.sav create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0005.png create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0006.png create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/test.mvl create mode 100644 src/platform/python/tests/cinema/gb/window/zoos-intro/test.sav create mode 100644 src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gba/bg/lady-sia/test.mvl create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0005.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0006.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0007.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0008.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0009.png create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/test.mvl create mode 100644 src/platform/python/tests/cinema/gba/blend/mzm-layering/test.sav create mode 100644 src/platform/python/tests/cinema/gba/blend/sma-knockout/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/blend/sma-knockout/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/blend/sma-knockout/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/blend/sma-knockout/test.mvl create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0005.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0006.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0007.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0008.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0009.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0010.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0011.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0012.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0013.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0014.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0015.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0016.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0017.png create mode 100644 src/platform/python/tests/cinema/gba/window/gs-clock-wipe/test.mvl create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0005.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0006.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0007.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0008.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0009.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0010.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0011.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0012.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0013.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0014.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0015.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0016.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0017.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0018.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0019.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0020.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0021.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0022.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0023.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0024.png create mode 100644 src/platform/python/tests/cinema/gba/window/tgr-objwin-order/test.mvl create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0005.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0006.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0007.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0008.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0009.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0010.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0011.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0012.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0013.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0014.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0015.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0016.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0017.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0018.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0019.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0020.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0021.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0022.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0023.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0024.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0025.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0026.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0027.png create mode 100644 src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/test.mvl diff --git a/CHANGES b/CHANGES index 457cf3a96..2c8b6aac9 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,7 @@ Misc: - Qt: Redo GameController into multiple classes - SDL: Fix 2.0.5 build on macOS under some circumstances - Test: Restructure test suite into multiple executables + - Python: Integrate tests from cinema test suite 0.6.0: (2017-07-16) Features: diff --git a/src/platform/python/.gitignore b/src/platform/python/.gitignore new file mode 100644 index 000000000..c581b47ef --- /dev/null +++ b/src/platform/python/.gitignore @@ -0,0 +1,5 @@ +/build +/dist +.eggs +.cache +*.egg-info* diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index 2c914eb51..a80dcd4bd 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -35,3 +35,10 @@ set_target_properties(${BINARY_NAME}-pylib PROPERTIES COMPILE_DEFINITIONS "${OS_ set(PYTHON_LIBRARY ${BINARY_NAME}-pylib PARENT_SCOPE) add_custom_target(${BINARY_NAME}-py ALL DEPENDS ${BINARY_NAME}-pylib ${CMAKE_CURRENT_BINARY_DIR}/build/lib/${BINARY_NAME}/__init__.py) + +file(GLOB TESTS ${CMAKE_CURRENT_SOURCE_DIR}/test_*.py) +foreach(TEST IN LISTS TESTS) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/test_" "" TEST_NAME "${TEST}") + string(REPLACE ".py" "" TEST_NAME "${TEST_NAME}") + add_test(python-${TEST_NAME} pytest ${TEST}) +endforeach() diff --git a/src/platform/python/_builder.py b/src/platform/python/_builder.py index 4aa2116c1..ba291ef71 100644 --- a/src/platform/python/_builder.py +++ b/src/platform/python/_builder.py @@ -12,8 +12,11 @@ bindir = os.environ.get("BINDIR", os.path.join(os.getcwd(), "..")) cpp = shlex.split(os.environ.get("CPP", "cc -E")) cppflags = shlex.split(os.environ.get("CPPFLAGS", "")) +ldflags = shlex.split(os.environ.get("LDFLAGS", "")) if __name__ == "__main__": cppflags.extend(sys.argv[1:]) +if sys.platform == 'darwin': + ldflags.append('-Wl,-rpath,' + bindir) cppflags.extend(["-I" + incdir, "-I" + srcdir, "-I" + bindir]) ffi.set_source("mgba._pylib", """ @@ -46,6 +49,7 @@ ffi.set_source("mgba._pylib", """ #undef PYEXPORT """, include_dirs=[incdir, srcdir], extra_compile_args=cppflags, + extra_link_args=ldflags, libraries=["mgba"], library_dirs=[bindir], sources=[os.path.join(pydir, path) for path in ["vfs-py.c", "core.c", "log.c", "sio.c"]]) diff --git a/src/platform/python/cinema/__init__.py b/src/platform/python/cinema/__init__.py new file mode 100644 index 000000000..288aa3f0c --- /dev/null +++ b/src/platform/python/cinema/__init__.py @@ -0,0 +1,23 @@ +from PIL.ImageChops import difference +from PIL.ImageOps import autocontrast +from PIL.Image import open as PIOpen + +class VideoFrame(object): + def __init__(self, pilImage): + self.image = pilImage.convert('RGB') + + @staticmethod + def diff(a, b): + diff = difference(a.image, b.image) + diffNormalized = autocontrast(diff) + return (VideoFrame(diff), VideoFrame(diffNormalized)) + + @staticmethod + def load(path): + with open(path, 'rb') as f: + image = PIOpen(f) + image.load() + return VideoFrame(image) + + def save(self, path): + return self.image.save(path) diff --git a/src/platform/python/cinema/movie.py b/src/platform/python/cinema/movie.py new file mode 100644 index 000000000..c71002626 --- /dev/null +++ b/src/platform/python/cinema/movie.py @@ -0,0 +1,47 @@ +from mgba.image import Image +from collections import namedtuple +from . import VideoFrame + +Output = namedtuple('Output', ['video']) + +class Tracer(object): + def __init__(self, core): + self.core = core + self.fb = Image(*core.desiredVideoDimensions()) + self.core.setVideoBuffer(self.fb) + self._videoFifo = [] + + def yieldFrames(self, skip=0, limit=None): + self.core.reset() + skip = (skip or 0) + 1 + while skip > 0: + frame = self.core.frameCounter + self.core.runFrame() + skip -= 1 + while frame <= self.core.frameCounter and limit != 0: + self._videoFifo.append(VideoFrame(self.fb.toPIL())) + yield frame + frame = self.core.frameCounter + self.core.runFrame() + if limit is not None: + assert limit >= 0 + limit -= 1 + + def video(self, generator=None, **kwargs): + if not generator: + generator = self.yieldFrames(**kwargs) + try: + while True: + if self._videoFifo: + result = self._videoFifo[0] + self._videoFifo = self._videoFifo[1:] + yield result + else: + next(generator) + except StopIteration: + return + + def output(self, **kwargs): + generator = self.yieldFrames(**kwargs) + + return mCoreOutput(video=self.video(generator=generator, **kwargs)) diff --git a/src/platform/python/cinema/test.py b/src/platform/python/cinema/test.py new file mode 100644 index 000000000..684d8fcef --- /dev/null +++ b/src/platform/python/cinema/test.py @@ -0,0 +1,96 @@ +import os, os.path +import mgba.core, mgba.image +import cinema.movie +import itertools +import glob +import re +import yaml +from copy import deepcopy +from cinema import VideoFrame +from cinema.util import dictMerge + +class CinemaTest(object): + TEST = 'test.(mvl|gb|gba|nds)' + + def __init__(self, path, root, settings={}): + self.fullPath = path or [] + self.path = os.path.abspath(os.path.join(root, *self.fullPath)) + self.root = root + self.name = '.'.join(path) + self.settings = settings + try: + with open(os.path.join(self.path, 'manifest.yml'), 'r') as f: + dictMerge(self.settings, yaml.safe_load(f)) + except FileNotFoundError: + pass + self.tests = {} + + def __repr__(self): + return '<%s %s>' % (self.__class__.__name__, self.name) + + def setUp(self): + results = [f for f in glob.glob(os.path.join(self.path, 'test.*')) if re.search(self.TEST, f)] + self.core = mgba.core.loadPath(results[0]) + if 'config' in self.settings: + self.config = mgba.core.Config(defaults=self.settings['config']) + self.core.loadConfig(self.config) + self.core.reset() + + def addTest(self, name, cls=None, settings={}): + cls = cls or self.__class__ + newSettings = deepcopy(self.settings) + dictMerge(newSettings, settings) + self.tests[name] = cls(self.fullPath + [name], self.root, newSettings) + return self.tests[name] + + def outputSettings(self): + outputSettings = {} + if 'frames' in self.settings: + outputSettings['limit'] = self.settings['frames'] + if 'skip' in self.settings: + outputSettings['skip'] = self.settings['skip'] + return outputSettings + + def __lt__(self, other): + return self.path < other.path + +class VideoTest(CinemaTest): + BASELINE = 'baseline_%04u.png' + + def setUp(self): + super(VideoTest, self).setUp(); + self.tracer = cinema.movie.Tracer(self.core) + + def generateFrames(self): + for i, frame in zip(itertools.count(), self.tracer.video(**self.outputSettings())): + try: + baseline = VideoFrame.load(os.path.join(self.path, self.BASELINE % i)) + yield baseline, frame, VideoFrame.diff(baseline, frame) + except FileNotFoundError: + yield None, frame, (None, None) + + def test(self): + self.baseline, self.frames, self.diffs = zip(*self.generateFrames()) + assert not any(any(diffs[0].image.convert("L").point(bool).getdata()) for diffs in self.diffs) + + def generateBaseline(self): + for i, frame in zip(itertools.count(), self.tracer.video(**self.outputSettings())): + frame.save(os.path.join(self.path, self.BASELINE % i)) + +def gatherTests(root=os.getcwd()): + tests = CinemaTest([], root) + for path, _, files in os.walk(root): + test = [f for f in files if re.match(CinemaTest.TEST, f)] + if not test: + continue + prefix = os.path.commonpath([path, root]) + suffix = path[len(prefix)+1:] + testPath = suffix.split(os.sep) + testRoot = tests + for component in testPath[:-1]: + newTest = testRoot.tests.get(component) + if not newTest: + newTest = testRoot.addTest(component) + testRoot = newTest + testRoot.addTest(testPath[-1], VideoTest) + return tests diff --git a/src/platform/python/cinema/util.py b/src/platform/python/cinema/util.py new file mode 100644 index 000000000..3a8dccd40 --- /dev/null +++ b/src/platform/python/cinema/util.py @@ -0,0 +1,9 @@ +def dictMerge(a, b): + for key, value in b.items(): + if isinstance(value, dict): + if key in a: + dictMerge(a[key], value) + else: + a[key] = dict(value) + else: + a[key] = value diff --git a/src/platform/python/conftest.py b/src/platform/python/conftest.py new file mode 100644 index 000000000..d80dcdea7 --- /dev/null +++ b/src/platform/python/conftest.py @@ -0,0 +1,49 @@ +import errno +import itertools +import os +import os.path +import pytest +import yaml + +def pytest_addoption(parser): + parser.addoption("--rebaseline", action="store_true", help="output a new baseline instead of testing") + parser.addoption("--mark-failing", action="store_true", help="mark all failing tests as failing") + parser.addoption("--mark-succeeding", action="store_true", help="unmark all succeeding tests marked as failing") + parser.addoption("--output-diff", help="output diffs for failed tests to directory") + +EXPECTED = 'expected_%04u.png' +RESULT = 'result_%04u.png' +DIFF = 'diff_%04u.png' +DIFF_NORM = 'diff_norm_%04u.png' + +def pytest_exception_interact(node, call, report): + outroot = node.config.getoption("--output-diff") + if report.failed and hasattr(node, 'funcargs'): + vtest = node.funcargs.get('vtest') + if outroot: + if not vtest: + return + outdir = os.path.join(outroot, *vtest.fullPath) + try: + os.makedirs(outdir) + except OSError as e: + if e.errno == errno.EEXIST and os.path.isdir(outdir): + pass + else: + raise + for i, expected, result, diff, diffNorm in zip(itertools.count(), vtest.baseline, vtest.frames, *zip(*vtest.diffs)): + result.save(os.path.join(outdir, RESULT % i)) + if expected: + expected.save(os.path.join(outdir, EXPECTED % i)) + diff.save(os.path.join(outdir, DIFF % i)) + diffNorm.save(os.path.join(outdir, DIFF_NORM % i)) + + if node.config.getoption("--mark-failing"): + try: + with open(os.path.join(vtest.path, 'manifest.yml'), 'r') as f: + settings = yaml.safe_load(f) + except FileNotFoundError: + settings = {} + settings['fail'] = True + with open(os.path.join(vtest.path, 'manifest.yml'), 'w') as f: + yaml.dump(settings, f, default_flow_style=False) diff --git a/src/platform/python/setup.cfg b/src/platform/python/setup.cfg new file mode 100644 index 000000000..b7e478982 --- /dev/null +++ b/src/platform/python/setup.cfg @@ -0,0 +1,2 @@ +[aliases] +test=pytest diff --git a/src/platform/python/setup.py.in b/src/platform/python/setup.py.in index 04c1c0c29..69c69bd8d 100644 --- a/src/platform/python/setup.py.in +++ b/src/platform/python/setup.py.in @@ -1,6 +1,7 @@ from setuptools import setup import re import os +import sys os.environ["BINDIR"] = "${CMAKE_BINARY_DIR}" os.environ["CPPFLAGS"] = " ".join([d for d in "${INCLUDE_FLAGS}".split(";") if d]) @@ -21,9 +22,10 @@ setup(name="${BINARY_NAME}", author_email="jeffrey@endrift.com", url="http://github.com/mgba-emu/mgba/", packages=["mgba"], - setup_requires=['cffi>=1.6'], + setup_requires=['cffi>=1.6', 'pytest-runner'], install_requires=['cffi>=1.6', 'cached-property'], - extras_require={'pil': ['Pillow>=2.3']}, + extras_require={'pil': ['Pillow>=2.3'], 'cinema': ['pyyaml', 'pytest']}, + tests_require=['mgba[cinema]', 'pytest'], cffi_modules=["_builder.py:ffi"], license="MPL 2.0", classifiers=classifiers diff --git a/src/platform/python/test_cinema.py b/src/platform/python/test_cinema.py new file mode 100644 index 000000000..148f6c99c --- /dev/null +++ b/src/platform/python/test_cinema.py @@ -0,0 +1,61 @@ +import pytest +import cinema.test +import mgba.log +import os.path +import yaml + +mgba.log.installDefault(mgba.log.NullLogger()) + +def flatten(d): + l = [] + for k, v in d.tests.items(): + if v.tests: + l.extend(flatten(v)) + else: + l.append(v) + l.sort() + return l + +def pytest_generate_tests(metafunc): + if 'vtest' in metafunc.fixturenames: + tests = cinema.test.gatherTests(os.path.join(os.path.dirname(__file__), 'tests/cinema')) + testList = flatten(tests) + params = [] + for test in testList: + marks = [] + xfail = test.settings.get('fail') + if xfail: + marks = pytest.mark.xfail(reason=xfail if isinstance(xfail, str) else None) + params.append(pytest.param(test, id=test.name, marks=marks)) + metafunc.parametrize('vtest', params, indirect=True) + +@pytest.fixture +def vtest(request): + return request.param + +def test_video(vtest, pytestconfig): + vtest.setUp() + if pytestconfig.getoption('--rebaseline'): + vtest.generateBaseline() + else: + try: + vtest.test() + except FileNotFoundError: + raise + if pytestconfig.getoption('--mark-succeeding') and 'fail' in vtest.settings: + # TODO: This can fail if an entire directory is marked as failing + settings = {} + try: + with open(os.path.join(vtest.path, 'manifest.yml'), 'r') as f: + settings = yaml.safe_load(f) + except FileNotFoundError: + pass + if 'fail' in settings: + del settings['fail'] + else: + settings['fail'] = False + if settings: + with open(os.path.join(vtest.path, 'manifest.yml'), 'w') as f: + yaml.dump(settings, f, default_flow_style=False) + else: + os.remove(os.path.join(vtest.path, 'manifest.yml')) diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/LICENSE b/src/platform/python/tests/cinema/gb/mooneye-gb/LICENSE new file mode 100644 index 000000000..2d7ffa2ea --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-2017 Joonas Javanainen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..ff29c9a761f073707fba7edeb49d832d9d4650f1 GIT binary patch literal 1227 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Uz>PZ!6KiaBrR-Y#2hz~kZ@ z{_p?v%k6U>??~W`SJ7#^sh_)p<7jhhFU!q)@5_~T{8>}h@WZL`;KBnB0ul-|3@k(> zWVm?FX)oQ98~rcFulw}VORMgh?8=^g_gLlH6qirIV`Yt8dG> zm&U3nUn-m$D>7Z~+_u+-LHzHs_PsJY)#twT*5AyH|5Nta?zrXPHTi4Xks7tFIqSb9 zc%IPveg2{K39Gn2tERlYac{~~Jze+A!UHGmB-VdAysOA6W7XHJP-_2S}> z7wPN&K0okU%wi6EvopF|`B>T7nVLUa-FG?g;oQC{wX?RYS6SY^w(`fzQ#%fXg%mSK zembeLAau9)zlfhNk0*5etC80%y*%%{ijkQa=HJeKY5fOeek@N-t`B^@>gF^i8ZLm40rvcUMJ~! z;d5Wa!Ab)QWyPrV%Oy8Y{^$1Q)u)-x6~86T1o+~b*LF?te?33lKxf*!wU_%2FE~(j zKI8wkyr^rDmPQ$Ihr6!oX3py+h;?oAbPZ|0_(=9FLGvsGSC(aLY$RTcR;Pxf`s z;ScL5)|>sL`S7=MVqtun@}{Kkb-lOiR7dpk<~8f`cNa{!y84tXd!*xe>m=6a2Osd9 zYhE2Zi_!Y2`{$Ys4@(1gs!H0p=&$RJo9&x*#9)1m?dFqgnQuSU6gH z!DDgXcCD|MW=50^xRnyUeE4W`6nE*bCIw7z9+%$<-vQh9#$<+ z{yYEh%!)HM_kCQ{%5AjlxHHcW&SNJ{D->L&-ws*3^~;h?3-*|lN)?qm8M)XO-ub9u z!4FDJaOc4?1e&Xngw;>|UgRCzwsl?GSF3e(zXYGwUJMOhckD4R`Tcm$u3dUg?Q3`2 zB$b~_S04Vhl-V`;<9jvFnBYfM;`ZqrRwrhyPgy5cG+TK8BP*aem%ALpWbFTPyb{}} zl+mFUrf|Ob>vsvh=-uHRZu8jHcR!yfXU>1E(|G@sdEw`>)!#0^@oL$I{j*a{KVGoy ze7s!Vkv;O`^Xc-Be((J8z4`0&^5^%t7xc3Oo#Gy_y+hQ|*<@oANq!?OBygyHE*|3E Vf8BS+>0O{g%G1@)Wt~$(695N9R-^y` literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..afb22740c865f23eb9b895d5887aca10cfc53289 GIT binary patch literal 32768 zcmeI4VQ5>|702&;mX&8qcAhH7c}XA1lO~LkrNMQ>su}fFdU>{`SeuRQEZ`dA+Qcbj zO9Sbsn`(+e`(dSDRtPkOv<>|-7z{Hggfo}J{-D&Gn=w|7yr(EStKFG+c&iyJHzR*lltqy1<>nU;Yu+ax zy!Rg-S&M1jv#}me(OB*7gx#!%J?^P~Xm8d-;_hRc)%(TWZ97x%6L+7l|0wrQ=WAB1 z4|u<*@9>sReHt9*L*thxDVW5BBqdW{`keW%BJeseC1{1KA}y@|$7 zZ;B5(#)lkVFDu{e-9oD;0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tm~KLVu=ga2ahkR{UJJ|6H)J56gDW10s3B)85uc#1{*fM3)0>`5j~v$r>$ zh7pU47cV~b)ZpO0eZe5aP1EAGYuC`wu3eaqb>SXN({vp&bRGTh9pDCji0|KTnzn74 z`}czag9+L;Tv5xb9059=mfrR^=Bp~!wyaDBVuq1OINTBm!vL*mh5@xT%``!$(~c7e z7=~q)#QvAsaj*yECzH8cv556crA($+R8<*Ir$Ivp%rBMh?GN?fBjb2)+p5}L16FRY zS85~_3>wDbqG2F!m@~{2XA25rkOL}}a$Q&tV>lXC=(?9LU%a@mU|FVVa7!d`7LdQX z>bmfOs~lhE=DMkrj6+n$i^WW4bv47SScG_6BX8(mE?>SZ$HU4?CAc~cTZYdU z*M}7#zca3?a{bfOvLD2CJsgh5as2u7Fjq9}hij3~^TGwt32wN*U|#wB(WA@Da()oO zT?pf|*?4?lpk1%MUvPb?6r2_?G_GIeX4{S<^YO&MDUkcuFmyeY(z)Si#tt1S6kPYv zp+EpvlS%=fL;~Wlw_7;H`35adq^6xY11nD?lF8xW0|y`<>Y^cE@U5)O&jWS12RnFh zWCR{MDx9HwKHyteSXy!%*r}Ne=+RNwEpP@^!Suj^krC(%Fw+-~_?{4glM?=O}$N1g3c*yt~JlC!6==Va#mycHX+iDbMt*zgk zh_Nl@3KMskX0>#q^QAJ?>y@<)XXEh3yD_n@=W2;u?T5Kqb24UKs+Dsw zK5naX*tuU@;b2#P_n@|?Z)nHCI5RdQ%u`;@)xrg%cV=uNKRY)zGs|jL0e(_&ZD`)r z4(dlal#!SCcz=qVgA!5}q5IowLTX`NEjXD)k6|E6xL6u^#o> zlVg_}QT{@k2fX9wYJ-L6`DZu(L>m$BvE+6baeMF9fb}n4)A(4dfzNa87@x>-%EhV@S@5|^v5hVVC+?XE>!o_Brjm-%8Np3 zu-CY;>Lf3DN%+)pro4qip(Nuadt}LX(cdb0Lny!G--Pr_0+%}GLxWk~;I5FW!<4Qg zVlmL5i#G_%1`ndY)nK1ceuI>deuL^0yktT6)Wb~q2@ZvlDlZw5B~PQjRkA3QU-D%k z{gN=}H!vUOyv!T?R!G%l%2fE7DA=MmHPGJBVY~u}d+295Aw;H@6 zl;7ZrkbZ;e^StES!lxFPavg_4$sjMeU6%Y1{jHM!5Xvw4g^+$pKIckIFGpBLxwDPG zjjGbS#gc(|m+@6)qB>mrexW*Sg!ozbd~c9Vg?lRY_A6VxDfRtr?+?c-Q6*adfI-X3 z@>#$EdQh2@uJM*D8s$x*%1@==@l(%B*Wr6pUzL8>PyLN_joq92d+E>lsUJvJp)<8| z|NeZU%0z$&5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I ohyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY;Jy<0AFnt97ytkO literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/test.sym new file mode 100644 index 000000000..71a70bfcd --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/add_sp_e_timing/test.sym @@ -0,0 +1,206 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/add_sp_e_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 _wait_ly_4 +00:0156 _wait_ly_5 +00:0180 test_finish +00:01c4 wram_test +00:01d3 hiram_test +00:01d3 test_round1 +00:01d5 _wait_ly_6 +00:01db _wait_ly_7 +00:01f0 finish_round1 +00:01ff test_round2 +00:0201 _wait_ly_8 +00:0207 _wait_ly_9 +00:021d finish_round2 +00:c014 result_tmp +00:c016 result_round1 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

*lIva z)3{wD_MzfS3xQgYHu%ya6e+Zb6=YEmmvvhxw54E59*UIImVgCoXp`P^&)(UjPl6AH zdJfsyIp?1HKj;4D-asBQi;GXTu^ZjW*T0R7+^%Ic701|V7GSkZtK0DI8MgAy?IU-m zr+@tL>eYk8M^@guJ$>iHkFQ?YZohu?=#c|&9oTws$U1)D*l{*6z_=;f+18t%-Y%)RW2H6AM~lxVi;JC&*16&Zr7^x(SeSDc&RFyO`kpmE z{)rXvSFEh8*VflIJ+&>wjK7tON->Z&w7$09KC7#f)wBFEm0uoBWlpHnwkJ~QRx6QC zThAV2_0Dps?dl^n^nwZvEs<&#Qcw0qqSX@tB0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm;C>Kz512f3Yudv*iE(c)&AVYFfz{(=>=jxGf!rNG5|H zh-=#V^^u5aR#(SjFk}Dz$;m^9>gzXc^7~=jG%aoo4NXlA4VaI*a1W+wx(*q-j&b<* zaf3LFZ{BR0wr!f5H-iTT4cazb(U(^_1N>M_M$6xrud1kRS@AfG8Adqla0`bG1AI+0 z4A9mz(*!>ja~z+~Ff1!8_P_KU2WvonB$7;KGN_-;#^afcs><V&eRHIUiP@ z&BE1jARnJB@V9O7O%ry5&nNR;H<|429vw|4T^Gio5*n^Jkr*EC?@y%?++f^shK722 z_UvhIM}5-_l?w!Qhg!50HgkI6G9n{7Le%*PW0r$Fvs!_f6; zROg1X8QZZVop#+FJA6J|O*9I8!eJPPy}SBI5gxquv6o4@LOA9x4;=x1=B5CT3VnkjN$4H z1A0ea*JCm0pj;nnH8rhWi{r2d%fDYBc8c4;z{p5>9QMFcANPQ+Fcm#pNDf#)CKrfIT2nAOsfPQy1m^|FCK_W7-~piU@yNL57iidLgboN8QfT7 z{IN6N$R-qKUApnGgTKW_nPTFOzojO7Yw2rh3fJYlcaRBvBfPcJK4Y50l4bzaL|j_gz}iJY25Z*N;qU#jaR zFDa55zZ`j*Co12Hlz@0o4!q{3&1L!7y4>5dt8o8s_ut|7c zfv9l30)_ti zH~l26>U7@|ui0 zUg}91+PysW0~vR{)Qd9IwmkK^j3>R+?_`L-<4W`-8puE9-$*o_2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY XfCvx)B0vO)01+SpM1TnVR|Nh6?;XzL literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/test.sym new file mode 100644 index 000000000..9cc9099d8 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/mem_oam/test.sym @@ -0,0 +1,212 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/bits/mem_oam.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:016f test_finish +00:0183 _wait_ly_4 +00:0189 _wait_ly_5 +00:019f _print_results_halt_1 +00:01a2 _test_ok_cb_0 +00:01aa _print_sl_data55 +00:01b2 _print_sl_out55 +00:01b5 fail_1 +00:01c9 _wait_ly_6 +00:01cf _wait_ly_7 +00:01e5 _print_results_halt_2 +00:01e8 _test_failure_cb_0 +00:01f0 _print_sl_data56 +00:01fd _print_sl_out56 +00:0200 fail_0 +00:0214 _wait_ly_8 +00:021a _wait_ly_9 +00:0230 _print_results_halt_3 +00:0233 _test_failure_cb_1 +00:023b _print_sl_data57 +00:0248 _print_sl_out57 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..34b4c1a3f291f5e623d75df9a074236f13ef3f11 GIT binary patch literal 1166 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QH_r;B4q#hkZu?@n8+Ai!4W zcklny&EhjnWtK)CI=@7B->#dTfo}qu%qG0~R%18$!Kcq}8IHuLNc6EBo|s@E#N*!d z(8FMkyI1DzZGTJWi9Nr)b~|6@7x#9VvU~Tpa&3I{#W`xu@z?YB2z}<#3JcrkU-bOE<0tNsd%fDoe#tW(Q$`;x`D4oUg?aKv;|$lkyjFaDVa6Qit{;0p zTAuSi9nXGu`vVRBHsyl_XwH@4Z2P?9-qD0BC-#N<)&D&Aq@+00_|Y7%-47JsIG?)q zC-1q+gB4ZtWuMzf?S66n`Nm~=TF;9=d7bRuv~By*pNFcilg%SC4U|5kg|~ZOfLzImC6eZR4_IoSQc?GM&s{0;l6`Z_`7-9) z>WHPzz5f4Fyx~9B9TMH=v{ygNUoG@^?)l_B=TttX@|gZ!e>h)!ujKyfuO|OCb7${1 z_1u#`Kji4OO)1*vN-fGRrmx|g|EO#^>-ju~YnpR7SBw7ejQnhC{%CKO)^_VZ2XFoV ztSR-VrLd4c@5Q3ewOvcEZdp>J=n!`$b$YeHO1-M1&-<1J$U)LPR!5@?vg=hmcpovh zd(%I@qtolvv$dGTU4Of}#ufJF9&Gp8KJ6&KeW1yPrtBBu!rRjC9puu}dor(Z+5_!% z&gJ@le{?Uhe--;ze{bvC70qp`ZjEmj9p$c=HD&*sH>>k*xlU$X&iOw-C`e9*t6n9$ z)u!U5*czLN7y*0!w(SZ3f1l#rpB=07oWE}Wf|&~vI|EmAV+mw*_kwdX<$|C2r=Qo- Ul+k;27*x)9y85}Sb4q9e0B=w&YXATM literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..4326468feb14ef113b8d94da0a9ab397a6e15e4c GIT binary patch literal 32768 zcmeI3@oQ686vyv-P3vou>Z|Fx*ZQchSt!w|)LLd%vS$)s+QepSY3qcpplh)TZYt1gKTKq>fiMNxWWNjsqYMV(1j!~7L(IkoZVXiV!{!g26NeLL*xKE5Pwq?If3Wo& z%xk{qoO{l>pLcJeKe({4w2fUJP`>$XV&Ymo^Hv>V$C;1SGp%9u+b7ua8`t*VzIpSf zGZ!!J8Q;JB&b6C2&U|?B!Y2FG0|)l+eq;CgJ!974-G>gdkrBpC*~HfOymNo!{6g!( z_1_<~GXD7P%ljL(+%MO^e!$%`ZCdX2w%VMcvErj%``(;4$32BxHk+##-|k+1KDo5t z2JM~*5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0V1$;31k-; z{4e%JGE4gZ#{=H!V$;gTn5Kb0#BFgLJedrBz^`eot)Y-<*40HKuwvJ)Q>XUsZE9Mx zrltnsrfG3&Zf0+#@wIDB)3!}>?OIS^FraP26SaKG z6`&&#>8*S# z9||RtnGDv?W~0$eMpb1z5&;bzFh84pyg$@~kBsAY+g8=e9Vl#$H&G72e)nO>B0J@87LdRU)fc(XARh9c6 z7?AxSuIoNuAb{(S9)(%aupjP4zRzRFKnJv9VIG za$azM;V|45FytSN;@$ChU|M*;Vr^}$7vsAA@B0f`U|3JyJM_Ub5>Zv#?&<071_fl` z{Em%{j)DfmJB|BSx!HC+F7xrmz%7vH*D!QF9M-wvYR0;{(rL%(>hgGSH{mew2?ik! zXSeNP$Ouq}?_e7?baui^M}-s0_XEDs z(Xp|398PL93c9-+P7B;YRWMz*uCo*RLJW6r7%)3(U5`Xyf=Ykr)!yFHf^j&5mESMm zJH~BfWMZNchcmEP;~CI(ytD9|6}mvaY3h0hH(f{ml9fC$@cw<=G)>M2t2#T=Y4{0m zy<(szKfBrz@OzDiJNUP$fYVLsa3ZsMaWxFz<$=bYKW2id7SlY&vJ_}M6I z4Q){pLaH&Q^kbmgVkITlU#iPp2sQAc${zH$S*+1mt-K~wb$=f(VCc$QLTYfQDTkZPPMRold7pg|RH z;FAqjp}*Wjc@`4DgLvXE+$Df=)04VLi+x@>S9{pAMl3FS68C#2h; zaD*9Q!e3BC|Scxu8<{vK!3U9&qBE+?+fXcUHT#FHX%b-9PVW=R|-A z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la f5CI}U1c(3;AOb{y2oM1xKm>>Y5g-EpaRUDUfR;`? literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/test.sym new file mode 100644 index 000000000..01b7077fc --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/reg_f/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/bits/reg_f.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0160 test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/unused_hwio-GS/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/bits/unused_hwio-GS/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 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. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/bits/unused_hwio-GS.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c017 regs_save +00:c017 regs_save.f +00:c018 regs_save.a +00:c019 regs_save.c +00:c01a regs_save.b +00:c01b regs_save.e +00:c01c regs_save.d +00:c01d regs_save.l +00:c01e regs_save.h +00:c01f regs_flags +00:c020 regs_assert +00:c020 regs_assert.f +00:c021 regs_assert.a +00:c022 regs_assert.c +00:c023 regs_assert.b +00:c024 regs_assert.e +00:c025 regs_assert.d +00:c026 regs_assert.l +00:c027 regs_assert.h +00:c028 memdump_len +00:c029 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0161 _test_data_0 +00:0177 _finish_0 +00:0187 _test_data_1 +00:019d _finish_1 +00:01ad _test_data_2 +00:01c3 _finish_2 +00:01d3 _test_data_3 +00:01e9 _finish_3 +00:01f9 _test_data_4 +00:020f _finish_4 +00:021f _test_data_5 +00:0235 _finish_5 +00:0245 _test_data_6 +00:025b _finish_6 +00:026b _test_data_7 +00:0281 _finish_7 +00:0291 _test_data_8 +00:02a7 _finish_8 +00:02b7 _test_data_9 +00:02cd _finish_9 +00:02dd _test_data_10 +00:02f3 _finish_10 +00:0303 _test_data_11 +00:0319 _finish_11 +00:0329 _test_data_12 +00:033f _finish_12 +00:034f _test_data_13 +00:0365 _finish_13 +00:0375 _test_data_14 +00:038b _finish_14 +00:039b _test_data_15 +00:03b1 _finish_15 +00:03c1 _test_data_16 +00:03d7 _finish_16 +00:03e7 _test_data_17 +00:03fd _finish_17 +00:040d _test_data_18 +00:0423 _finish_18 +00:0433 _test_data_19 +00:0449 _finish_19 +00:0459 _test_data_20 +00:046f _finish_20 +00:047f _test_data_21 +00:0495 _finish_21 +00:04a5 _test_data_22 +00:04bb _finish_22 +00:04cb _test_data_23 +00:04e1 _finish_23 +00:04f1 _test_data_24 +00:0507 _finish_24 +00:0517 _test_data_25 +00:052d _finish_25 +00:053d _test_data_26 +00:0553 _finish_26 +00:0563 _test_data_27 +00:0579 _finish_27 +00:0589 _test_data_28 +00:059f _finish_28 +00:05af _test_data_29 +00:05c5 _finish_29 +00:05d5 _test_data_30 +00:05eb _finish_30 +00:05fb _test_data_31 +00:0611 _finish_31 +00:0621 _test_data_32 +00:0637 _finish_32 +00:0647 _test_data_33 +00:065d _finish_33 +00:066d _test_data_34 +00:0683 _finish_34 +00:0693 _test_data_35 +00:06a9 _finish_35 +00:06b9 _test_data_36 +00:06cf _finish_36 +00:06df _test_data_37 +00:06f5 _finish_37 +00:0705 _test_data_38 +00:071b _finish_38 +00:072b _test_data_39 +00:0741 _finish_39 +00:0751 _test_data_40 +00:0767 _finish_40 +00:0777 _test_data_41 +00:078d _finish_41 +00:079d _test_data_42 +00:07b3 _finish_42 +00:07c3 _test_data_43 +00:07d9 _finish_43 +00:07e9 _test_data_44 +00:07ff _finish_44 +00:080f _test_data_45 +00:0825 _finish_45 +00:0835 _test_data_46 +00:084b _finish_46 +00:085b _test_data_47 +00:0871 _finish_47 +00:0881 _test_data_48 +00:0897 _finish_48 +00:08a7 _test_data_49 +00:08bd _finish_49 +00:08cd _test_data_50 +00:08e3 _finish_50 +00:08f3 _test_data_51 +00:0909 _finish_51 +00:0919 _test_data_52 +00:092f _finish_52 +00:093f _test_data_53 +00:0955 _finish_53 +00:0965 _test_data_54 +00:097b _finish_54 +00:098b _test_data_55 +00:09a1 _finish_55 +00:09b1 _test_data_56 +00:09c7 _finish_56 +00:09d7 _test_data_57 +00:09ed _finish_57 +00:09fd _test_data_58 +00:0a13 _finish_58 +00:0a23 _test_data_59 +00:0a39 _finish_59 +00:0a49 _test_data_60 +00:0a5f _finish_60 +00:0a6f _test_data_61 +00:0a85 _finish_61 +00:0a95 _test_data_62 +00:0aab _finish_62 +00:0abb _test_data_63 +00:0ad1 _finish_63 +00:0ae1 _test_data_64 +00:0af7 _finish_64 +00:0b07 _test_data_65 +00:0b1d _finish_65 +00:0b2d _test_data_66 +00:0b43 _finish_66 +00:0b53 _test_data_67 +00:0b69 _finish_67 +00:0b79 _test_data_68 +00:0b8f _finish_68 +00:0b9f _test_data_69 +00:0bb5 _finish_69 +00:0bc5 _test_data_70 +00:0bdb _finish_70 +00:0beb _test_data_71 +00:0c01 _finish_71 +00:0c11 _test_data_72 +00:0c27 _finish_72 +00:0c37 _test_data_73 +00:0c4d _finish_73 +00:0c5d _test_data_74 +00:0c73 _finish_74 +00:0c83 _test_data_75 +00:0c99 _finish_75 +00:0ca9 _test_data_76 +00:0cbf _finish_76 +00:0ccf _test_data_77 +00:0ce5 _finish_77 +00:0cf5 _test_data_78 +00:0d0b _finish_78 +00:0d1b _test_data_79 +00:0d31 _finish_79 +00:0d41 _test_data_80 +00:0d57 _finish_80 +00:0d67 _test_data_81 +00:0d7d _finish_81 +00:0d8d _test_data_82 +00:0da3 _finish_82 +00:0db3 _test_data_83 +00:0dc9 _finish_83 +00:0dd9 _test_data_84 +00:0def _finish_84 +00:0dff _test_data_85 +00:0e15 _finish_85 +00:0e25 _test_data_86 +00:0e3b _finish_86 +00:0e4b _test_data_87 +00:0e61 _finish_87 +00:0e71 _test_data_88 +00:0e87 _finish_88 +00:0e97 _test_data_89 +00:0ead _finish_89 +00:0ebd _test_data_90 +00:0ed3 _finish_90 +00:0ee3 _test_data_91 +00:0ef9 _finish_91 +00:0f09 _test_data_92 +00:0f1f _finish_92 +00:0f2f _test_data_93 +00:0f45 _finish_93 +00:0f55 _test_data_94 +00:0f6b _finish_94 +00:0f7b _test_data_95 +00:0f91 _finish_95 +00:0fa1 _test_data_96 +00:0fb7 _finish_96 +00:0fc7 _test_data_97 +00:0fdd _finish_97 +00:0fed _test_data_98 +00:1003 _finish_98 +00:1013 _test_data_99 +00:1029 _finish_99 +00:1039 _test_data_100 +00:104f _finish_100 +00:105f _test_data_101 +00:1075 _finish_101 +00:1085 _test_data_102 +00:109b _finish_102 +00:10ab _test_data_103 +00:10c1 _finish_103 +00:10d1 _test_data_104 +00:10e7 _finish_104 +00:10f7 _test_data_105 +00:110d _finish_105 +00:111d _test_data_106 +00:1133 _finish_106 +00:1143 _test_data_107 +00:1159 _finish_107 +00:1169 _test_data_108 +00:117f _finish_108 +00:118f _test_data_109 +00:11a5 _finish_109 +00:11b5 _test_data_110 +00:11cb _finish_110 +00:11db _test_data_111 +00:11f1 _finish_111 +00:1201 _test_data_112 +00:1217 _finish_112 +00:1227 _test_data_113 +00:123d _finish_113 +00:124d _test_data_114 +00:1263 _finish_114 +00:1273 _test_data_115 +00:1289 _finish_115 +00:1299 _test_data_116 +00:12af _finish_116 +00:12bf _test_data_117 +00:12d5 _finish_117 +00:12e5 _test_data_118 +00:12fb _finish_118 +00:130b _test_data_119 +00:1321 _finish_119 +00:1331 _test_data_120 +00:1347 _finish_120 +00:1357 _test_data_121 +00:136d _finish_121 +00:137d _test_data_122 +00:1393 _finish_122 +00:13a3 _test_data_123 +00:13b9 _finish_123 +00:13c9 _test_data_124 +00:13df _finish_124 +00:13ef _test_data_125 +00:1405 _finish_125 +00:1415 _test_data_126 +00:142b _finish_126 +00:143b _test_data_127 +00:1451 _finish_127 +00:1461 _test_data_128 +00:1477 _finish_128 +00:1487 _test_data_129 +00:149d _finish_129 +00:14ad _test_data_130 +00:14c3 _finish_130 +00:14d3 _test_data_131 +00:14e9 _finish_131 +00:14f9 _test_data_132 +00:150f _finish_132 +00:151f _test_data_133 +00:1535 _finish_133 +00:1545 _test_data_134 +00:155b _finish_134 +00:156b _test_data_135 +00:1581 _finish_135 +00:1591 _test_data_136 +00:15a7 _finish_136 +00:15b7 _test_data_137 +00:15cd _finish_137 +00:15dd _test_data_138 +00:15f3 _finish_138 +00:1603 _test_data_139 +00:1619 _finish_139 +00:1629 _test_data_140 +00:163f _finish_140 +00:164f _test_data_141 +00:1665 _finish_141 +00:1675 _test_data_142 +00:168b _finish_142 +00:169b _test_data_143 +00:16b1 _finish_143 +00:16c1 _test_data_144 +00:16d7 _finish_144 +00:16e7 _test_data_145 +00:16fd _finish_145 +00:170d _test_data_146 +00:1723 _finish_146 +00:1733 _test_data_147 +00:1749 _finish_147 +00:1759 _test_data_148 +00:176f _finish_148 +00:177f _test_data_149 +00:1795 _finish_149 +00:17a5 _test_data_150 +00:17bb _finish_150 +00:17cb _test_data_151 +00:17e1 _finish_151 +00:17f1 _test_data_152 +00:1807 _finish_152 +00:1817 _test_data_153 +00:182d _finish_153 +00:1841 _wait_ly_4 +00:1847 _wait_ly_5 +00:185d _print_results_halt_1 +00:1860 _test_ok_cb_0 +00:1868 _print_sl_data55 +00:1870 _print_sl_out55 +00:1873 run_testcase +00:189e _wait_ly_6 +00:18a4 _wait_ly_7 +00:18ba _print_results_halt_2 +00:18bd test_failure_cb +00:18c5 _print_sl_data56 +00:18d1 _print_sl_out56 +00:18df _print_sl_data57 +00:18e3 _print_sl_out57 +00:18f1 _print_sl_data58 +00:1901 _print_sl_out58 +00:190f _print_sl_data59 +00:191c _print_sl_out59 +00:192d _print_sl_data60 +00:193a _print_sl_out60 +00:194b _print_sl_data61 +00:1958 _print_sl_out61 +00:195e fetch_test_data +00:1978 print_got +00:198a _print_zero +00:198e _print_one +00:1990 _print_bit +00:1999 _skip +00:199a _next +00:c000 test_addr +00:c002 test_got +00:c003 test_reg +00:c004 test_mask +00:c005 test_str_write +00:c00e test_str_expect diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

VdxM<5M&6#oP#ZFAPZR(1Qo$a1=$~U%3#7Y%*K1}$$d%v%Rgj) z=s7em?|aU<=iK{w_Z9j_Z>948Hg<7T`Qn$Enai!LrQra3iTPP8)7sa(@+xcl{_?)7 zSFU{b_Sv($r}wp8yL{#Qx8FT`W~2S|GtcbX_2RC3cTZW*?K>Y5g-CYfCvx) zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx) zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c<=xCy=W%_%HT4nIrw*;{ngK-n6PQ zrfJ|0bE}VoC!56&_%&_y>TuXJo13Fi7_oEbv15Dobat*?+tdVc(}aK2U$v^IXVogq z$GUJ2rfIqk8M=;s`1WxFKg8FqGfmqz&2{TQfx!fA8?LD3RgM51jY@Cr8}n5aYg<+< z1~J13g&c07kYRwy;V_H8mN=&YgyVykX8TQ=Ba*j6n{lNW^tv zJ&fUKSfT5lIC1RQgEL}VPIGM>%GVzaX`ZrLov zYZ`e&|GBvnC**ioc`gT6$ANr&vcTWAL7OJ*2A@ynyKXW$I=X*VyhfZj?;&^;| zdi(ZND$Wh!jx#kiHnw%^;2_pF&0y8=`QrMp0_4}nRaLHkbX4|(xUT#C!61%5as=jz zhW&6Y@_8OT3Od9M_ZQ47mD;|2dRop8BDf1-d^{cuc68M0)%FXnFA{;b1q}JeV)*X( zd@x&hzGCe1ucxJIL@YTJW@{r#YT4D8>jsmV#uVE9hs`c-bW z?KmmeWNq9I@K&CEH773eb5(TxO&5Yxue$gXcT5p>kqwpdb+wW4tucn`vrVQxlK&W%+%tr2kJHM z0bR#;7Jjor7sxkFUGL?l>&RcSk~;>Tzn`0?$@#&kzP@xCzTv6Y4D{^Bm%4(17USj) zes?g~V*C!Cb5>*E?iS;>&4q3@r!ec(#Xp9+*`jiii93FTOzu+s88XFlg;Vp+{J{M1 z{8qbtK4#yVAG)X~mz)wam;5J3&$P3=@_G_ZpJ^UT45h|1iLr5p2g8&ia6C*|%byN! zR!)hWmiYL1Vl0yydC*G=rw*PDuY_}Cz7i>Zafr=eJe5wk{1}^deuT{({0N&s-4QnI zcsY>YQNAPp_(6V{%pv~i;-5gdJ^w&>1&p}5X0gNinb$Oa5NqH^2F1sC$+YmP159}sheAn}mu!(G_o2U9GAoo<@^vA- zk}&6YFdybT%^Q3qr0O!|GzOqSBX7_q8+?iWYJ)36c@3@!=`|?sHSWoyC;v%SzXW z3eAfw>-qJnkVz1G{--Tb-G_eu?@`AnM36-<52Y)yH1&e?C%x3Kr7K;ZTDbjx zR#8VHKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y m2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0V43P5cmt2J#Q)i literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/test.sym new file mode 100644 index 000000000..0e9f27e5d --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-S/test.sym @@ -0,0 +1,212 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_hwio-S.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_ok_cb_0 +00:020d _print_sl_data55 +00:0215 _print_sl_out55 +00:0218 mismatch +00:023b _wait_ly_6 +00:0241 _wait_ly_7 +00:0257 _print_results_halt_2 +00:025a mismatch_cb +00:0262 _print_sl_data56 +00:0270 _print_sl_out56 +00:028a _print_sl_data57 +00:0294 _print_sl_out57 +00:02a5 _print_sl_data58 +00:02af _print_sl_out58 +00:02b8 hwio_data +00:c014 mismatch_addr +00:c016 mismatch_data +00:c017 mismatch_mem diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

JbFTHDNNEjU}&De9a| zvCf!v%m@FxC=A?S=nzB@WC+5XgDq?z3t1Ed6~Rdb@uB`X6>-n8u&Q0o*58{LV zek?cl_vd_n=X~zDfj#ti-v8U!#c}1MALiyRx3jjU1MCP3vUa9*Zg~C$*74=#ecxWW z^2PD9XZOzT>-hfil`oIKe)h~Q_M?wIwr|hVdv4x4V?D9wz!Pk0ig8nJVK?vD(aXHf z_tl=UP+_F}bhNqW{R@T~x{*7NH#!eBIuA5D_cl6rH9DC_C+R!SE-zfTTj}+@!ideF zTP2dN+@7v@qrKL#O0(LV@XE_q-Q^doD!;yLRS&*p1zVarn!C02?S0p82{YplrCqHA zvxb&SP3EkzQP#~$OWno!rM1Opm%57irR$3;M5q3q=!_8UxHB_(XEHaGwvst3!m3=W zJ6r97YsG?p%8R0|HFeK;YABa-EmrNWWtBHEH8Pg7gt6*cNOe0U?_*Z*)-m?0+`eCX z3+JzS=e=#r^UfdgUgx)-$JqI&uKgrSxG!)08}F4P{LwM*cTp|V^i2ea01+SpM1Tko z0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko z0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5%~8B6dDZvioL-tkpJJ~0nfD2 zw3;!dX%LTcYs^C=pT`fxHEsR+Xw)=YTjOyUv3vK?qYpmV-Mw*ROAF*p6aG+t-MYTM zb^NdMp&oVN9!%489V&DkW(w*6NfRKg0z;&FLb|3-aP zMQzJUBp_!Pk%+@B5-|+$HO(+UThmMv{CM1P0s+IYtb*A8(svx}0rk;nI-Sp>exZ;^ zCFP7uLfVj)oPw?uipek4{fpmT4N?A`zSg)X&emE_~oB$1iYm-B?WKAuIFwd?GPF zpWv3yL%!}KZ|J|UaN>j<4=XPe;OaO~k53l(+cx;73A-T>koB&cPLGf8-=9vqF65yT z8m>5*oSogdGm}YjgS_L+%uGyd-#$Ey`lcDK89rZJA1Xk7V_sF|`p3s*KgjEPFc=Qw z_(O+au4vc~*CL_`A9(2)=FU02Nrlx>8+=Fe|GB5xS9X*_(d_EAHo}QU;9N4Le z1o(r4uv_3AR0Y$`n+FDU&U)SStm_fZi^y=&D>A^hg!TRqD#13t`nU&l9p72_WrZ$KZ<@N^&rR2nzhotM3_SlJH%*iCgHZzm*(`j+Q?DEN^Y32j z35VK@Uv}}kgW)#gSBRXmnnO3X89(1v>SYTGvrb+7ZKRhiD<_$_<44F8E;XJZQ$ANZ zwdgDkEsid3w>uXT_V0@$7xnatQ(_j@z0ikLdYl)G^#NUB`2O-k;=cug`d zJYVu9;rfy==hv_v<~++AydzxIWy)zxK!ax9phGtJ7~{1DSA^#`_+GevgYv^%l8wUR z)f7`&#a$Cf2DoIqlni6MCfP4MUvispeMy+}1lGfx5AX&L2vWfl#Dn~YydBjx_eP1$n4(Z=6}A2+nHvEb^Gz2@X{YfSxc)rbAzQb|Pncl^>rGBmWZ^i>&m{nEE(D7CWmf{dsA(obb5 z+gMuq_y1c(9f<%DAOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F s0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)z&}FZPYSAR&Hw-a literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/test.sym new file mode 100644 index 000000000..f7b5e27b9 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmg0/test.sym @@ -0,0 +1,212 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_hwio-dmg0.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_ok_cb_0 +00:020d _print_sl_data55 +00:0215 _print_sl_out55 +00:0218 mismatch +00:023b _wait_ly_6 +00:0241 _wait_ly_7 +00:0257 _print_results_halt_2 +00:025a mismatch_cb +00:0262 _print_sl_data56 +00:0270 _print_sl_out56 +00:028a _print_sl_data57 +00:0294 _print_sl_out57 +00:02a5 _print_sl_data58 +00:02af _print_sl_out58 +00:02b8 hwio_data +00:c014 mismatch_addr +00:c016 mismatch_data +00:c017 mismatch_mem diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmgABCXmgb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_hwio-dmgABCXmgb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

LGH>4ZoO92)_w()x`+Xa`GNt_Ee~XLPx>#r15%wGlu`Z_dYi+WD_0LbeapC-(_M?wIcId#<2ktmHZ#{9~$P;XKmT^<= zWOp3+&j9m!-c$Q0!^QFH)3Nsc_bwZ1_;xNHZxw%O6%VzFKedWKwu)@4NcrN~)zanr zl>yHyj@t~n)uNf&J(-#}F<_mnwW|Y3uey4}U47B2^Xn^C{pjDUP)A#Ld!M$sYw*?` z5oY|Lbg8va&d~DdnY=YQ!TMNbrLVlSva$T^N^iNaa%*`_(b=C@bY2wg-jki#lgf`~ ztW@5LvO2HTm#g=}wPwMO@{-64rXQF}kLJ^^#p->HsPYzu#wYWZFjn6Pp+2YLeaMR5 z+l+lHx9`8a(xsc;C2tq=yi3QtH~6jRF?Q*xn_tNkuH~(N>Y5g-CYfCvx)B0vO)01+Sp zM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY;MXTmY%%yR_7+(r z{oCUK&$QLFhB2mT;E!=@jf1C9zz_H}ZS&?>%rt|+L;^iMZQa_@0ddoW zf7IW!X>f4UCd|jWa1W+wx(*q-j(+$Ka05TYw{0^`+cwQ@+dzTA1Z^9xsO43T0G&uk zZ}S`TRTXPnRx$}O!-z&5ZqcY=fYvm_fZCd7nxGR2#|Z=s!?KEE|4Z#S*aPxou}r2= z!1~2vGFd37s*EQRprHfi7mI8ALp}J&INsZ~sy5evm7D988VPlD7{>nnhJn0c&M;G) zEhvmZ4ybtCbzwb>;b>T)>z+P+;>6sXWtpbIEgHpHK>pH_>%s@Fa(s!K>&D|U4pA8| z6q3oMr6jjP0pd-KyrF-obo#U$4=XPg;p#Y$k53l(+cs#^gxwGb$b8q$WTvJLAI@Z4 z7vj(f4Og5>EiCNao6V-ULELfX=clK4?;ab&`lcCa7(QQIA69_;*0`$5^-oR7eh}C7 zP$&|?@yCwAT+y%}u0=l2hY;0r%6p(@aJ3l`+ z2O13DXXe>4~w0%3|LtQlF3%?>M*F z*~P_X9QHt~#yz0x_|C#_R_Frxrm5>g+;koJOIC8n!1E7r(=<6h7&Sbc%fUB1^`?Pd zdgp3?B;09yvya~$jdU8{g6E>u9=^TP`1w8Jh8mn?paRS-!G3}(KBmKi791%&e1bHtgO78fzxM#)9LZ-Og=q5!|-63 zS{#mtscYqPvAdPCBBwJoGn1aqXD9FTlVaJU=VBY-9GQA0JSkNB zi70PdLMo7Ow^%-9BUEx!6Ou2|dp=1Xyxj~lv1pSSY{}#$Gc~eNgB%gC- zKri*Mq;g|j?Z$W|xXNOINSpCZWxP66`$MieWOVX(;s0AY*kovZ#olmcH5gYvSogtD zq!LzAIRMyUSt&jXc!6$H^3pZdaD~IXNm%)-^gDj)G3gpzoBEpcyMF55r7OKQ^|JJ5 z{M3)7E7zJ@`St&-qK-s>2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F x0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpMBo=8@FSv. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_hwio-dmgABCXmgb.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_ok_cb_0 +00:020d _print_sl_data55 +00:0215 _print_sl_out55 +00:0218 mismatch +00:023b _wait_ly_6 +00:0241 _wait_ly_7 +00:0257 _print_results_halt_2 +00:025a mismatch_cb +00:0262 _print_sl_data56 +00:0270 _print_sl_out56 +00:028a _print_sl_data57 +00:0294 _print_sl_out57 +00:02a5 _print_sl_data58 +00:02af _print_sl_out58 +00:02b8 hwio_data +00:c014 mismatch_addr +00:c016 mismatch_data +00:c017 mismatch_mem diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..ca834e18a5af5f709acf3553d285ccfe45e04f10 GIT binary patch literal 1327 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!9PZ!6KiaBrR-k!BYfv4r= z&tHGzE59u&mksl9@i?|=&HuDzwh2pEI6Hs+`u9(-Y5MxryaGEt5{gs|EQMysaQgJI zsJSyu{;aojPu%*qw;PO@LclT~iUVUwct@2a*ne)Z&tW{Wk>Regp?Wrc4 z_Fit%RrH_wU#5;N^6lC6-m(3ULnGfC6-^Ojo^(q6aqRz$+wR-L*JxjqN_i_ad9%0p ze)GJyHqrlzFVuF+{5<#s!?ntdCnp|wvZvqNuw&NE@>7vK0+t6~zARc}Ve+Qs!JY$( zIYMR5Ctg2wzxq2-M#?P0@}_J3x#L`Sd9s4TyC$F5c<8nKwOgB?Mntl02wZbjZx{Eu zt#6`@@}AdTc1?@=aIHrC@%pd(wy)k%B>X%0-NDD{ua_j&Oj{myr{ZDQ21)x~mM^=6 z15fa)r7!FL_V>`vOOyVbzF{MGfBNA!-0JTS1}^qG-Ouw;KY8-f-81W^U2i$ONB+*Q z)~~k?I_;`U>8Q7yanL?)!TjK!m3f|72WKq5C3H34U3BWfsm*I9hFRY=D)Y5Zo|QRW zzRz;9X>e`3a(D2m7>g6LHf%Pr{rt^7O_^W_mk=Wmz_O01FW@-8P z={NbmIeuu~zR2m(!C1R(KZBX3PZsh$WO;Q(MZxsv+a5Ru{Z07Tc$42wCWZG_cciu)OySq>Q zxXw+R_Nzk>5pNi&8KC><_FHOKGHHbMdnVk`mPsMv-2{S2Td&ReZS%K zUCxzyzd9fHxhvWu@&mF%wEy?nUZ^Ci z6pCAiAK3fFg##D^j+OBxCqL>le=eQ(l%1Vx!t?lJaT@)fo9Ei3v-~gGZoOviO`w@C z%h{HeZ!BiL;CQV{t=N2`walNM>?z+}r)#rCT9iFw%$nB0w53}t(BSvME_U%e`yCo` zHI*9<>brb=Q0lOM_L7PMkp;~`@0&YW*W%RvFZ1uq*3bKK;auKNWc>?j%umiT zkJGgIc5Oy_y4I7*i-C8Jo||^naoSe1Bg`k)ZQXriC)11a$s+uHOeGUq-^bS-*e?8Z zx2NiT{yhFhpr03{b!s^5&Jb(`7c6K22`g_X6h0^aK;JQwPs(@>s37!o^>bP0l+XkK Dn^c0^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..3ed5eb1525af5de4118f6d6f650d48b759550b8f GIT binary patch literal 32768 zcmeI4U1%It6oBtcw&^6k>AxmKXyrVI6m;v&n9=wjnD4@7cF+@6Jbe-nMJjI=J(|LAJESP;TmZR_pL?uP*&k z>F}ym>tJP#S6#C9{P^?jn)l5oAN;~yC%ZK7k*+3B(OBt^VOuFTd)!hyYrk1;5~K4r zD+k5sQ#({{5u>lTtxb$B*`JqN#pnk>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvzQ8$%$!OyHl`m#KNu|9d>}qJsKUs|jP82G%H-x)&|ETr>(F&@^rR`e@WNo15ct zm@zYR^yu#0YuEPlG&X|YG%YUc)^&HUTZi$O7seo(rt1))>u87X02i=>zqi*kZQC?^ zdqD$%25lRjsLQ9E0eU(*!*pcbq`L zFf1!C_P^8}2WvolG@4H5a+p7#Pb6|VRh9mD9CWCF@%jAK^&ua8q#wt&t*Z4kVCMRI zrH+Ie8x3P-#xRgK^bDP1x1ga9VnB<<>J+ z3t@gT84h=J)brK%3$8B~gVO?n{1XX0JAnXn3-4FVZE9*kzph_$(F2 zfdH;176U$!2>4-d*KmsS4Z1v$nznyGtUMBlM*I3UZiINqi-LT?Ha|Z#1=L{-vT0L) zKfH9*utWKNz&1TSJL@>GQxgf$2M1xdz!_8p(~TSZ`=KuQaP@`(y`!${@i=r)uMf4l zyE{A44|}lw`vq)AxJ*sW&)5C12bSx&2Xr0JEc|ALDiCj)y57e{*O9+uC3g(G{~#Al zll{T0{{CzhzTvIc1@z8vsAb`l^?PCap)d^oD0Hz!g;^*0Wi*A87oCfn?LRLLm(+CO zx?5tdxkqN^`kQ9{<{p`L<|z-R;VPNtvD9#8d?GbA&Pt&y{M-u9isro&y;FHk#Iz*G z$5UeynQdGBpqn#?-ihAC1C_T#NN^%GK4A?dGuf2O3gve1@$zafR}Ojq*e`pz67sfJ zR(m@Rm721T@lPlJgevXcUC~vLZAadzZyJj19_ep{>|9!V?&}@`zA1*j`*%afGLQ zR@l@bro4nxAtmD}n`Fv2&|XV9=0>uY;%AbWzO)=#PPKA^Kp0ZV@ zTr;v9!!1JdQ}zqhPYFGzFdlk7zza+WRZTPHesn;AmArs13p|YWTF*}k%`fnxQ2heM z$9T#U!lq`KatfzH%0`}Yl}uScdoAT>Li1Bz5~`n)_gv`G7u#7vxxBJ;dAQJAWzj&m z!T7B(Tn0j{Q*}iZgqzq&MPorfec^7biZdQh+ zX{crjg?N#WvP0S(KlCAK+I)5BGt%z*p|46)>gv$9r9JJ3eke`Z<)L&()s6Xck+Kp2 zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx) gB0vO)01+SpM1Tko0U|&IhyW2F0z`la{L2LX0_UMI8vp. +; wla symbolic information for "/Users/jeffrey/Scratch/mooneye-gb/tests/build/acceptance/boot_regs-dmg.gb". + +[labels] +0001:4bf2 print_load_font +0001:4bff print_string +0001:4c09 print_a +0001:4c13 print_newline +0001:4c1e print_digit +0001:4c2b print_regs +0001:4c34 _print_sl_data0 +0001:4c3a _print_sl_out0 +0001:4c47 _print_sl_data1 +0001:4c4d _print_sl_out1 +0001:4c5f _print_sl_data2 +0001:4c65 _print_sl_out2 +0001:4c72 _print_sl_data3 +0001:4c78 _print_sl_out3 +0001:4c8a _print_sl_data4 +0001:4c90 _print_sl_out4 +0001:4c9d _print_sl_data5 +0001:4ca3 _print_sl_out5 +0001:4cb5 _print_sl_data6 +0001:4cbb _print_sl_out6 +0001:4cc8 _print_sl_data7 +0001:4cce _print_sl_out7 +0001:4000 font +0000:c000 regs_save +0000:c000 regs_save.f +0000:c001 regs_save.a +0000:c002 regs_save.c +0000:c003 regs_save.b +0000:c004 regs_save.e +0000:c005 regs_save.d +0000:c006 regs_save.l +0000:c007 regs_save.h +0000:c008 regs_flags +0000:c009 regs_assert +0000:c009 regs_assert.f +0000:c00a regs_assert.a +0000:c00b regs_assert.c +0000:c00c regs_assert.b +0000:c00d regs_assert.e +0000:c00e regs_assert.d +0000:c00f regs_assert.l +0000:c010 regs_assert.h +0000:c011 memdump_len +0000:c012 memdump_addr +0001:47f0 memcpy +0001:47f9 memset +0001:4802 clear_vram +0001:480d reset_screen +0001:481a process_results +0001:481f _wait_ly_0 +0001:4825 _wait_ly_1 +0001:4841 _wait_ly_2 +0001:4847 _wait_ly_3 +0001:4860 _process_results_cb +0001:486b _print_sl_data8 +0001:4875 _print_sl_out8 +0001:488f _print_sl_data9 +0001:489a _print_sl_out9 +0001:48b2 _print_sl_data10 +0001:48be _print_sl_out10 +0001:48bf dump_mem +0001:48cf _wait_ly_4 +0001:48d5 _wait_ly_5 +0001:48f1 _dump_mem_line +0001:491b _check_asserts +0001:4929 _print_sl_data11 +0001:492c _print_sl_out11 +0001:4938 _print_sl_data12 +0001:493a _print_sl_out12 +0001:4942 _print_sl_data13 +0001:4945 _print_sl_out13 +0001:494f __check_assert_fail0 +0001:495a _print_sl_data14 +0001:495d _print_sl_out14 +0001:4960 __check_assert_ok0 +0001:4968 _print_sl_data15 +0001:496d _print_sl_out15 +0001:496f __check_assert_skip0 +0001:4977 _print_sl_data16 +0001:497f _print_sl_out16 +0001:497f __check_assert_out0 +0001:498b _print_sl_data17 +0001:498d _print_sl_out17 +0001:4995 _print_sl_data18 +0001:4998 _print_sl_out18 +0001:49a2 __check_assert_fail1 +0001:49ad _print_sl_data19 +0001:49b0 _print_sl_out19 +0001:49b3 __check_assert_ok1 +0001:49bb _print_sl_data20 +0001:49c0 _print_sl_out20 +0001:49c2 __check_assert_skip1 +0001:49ca _print_sl_data21 +0001:49d2 _print_sl_out21 +0001:49d2 __check_assert_out1 +0001:49dd _print_sl_data22 +0001:49e0 _print_sl_out22 +0001:49ec _print_sl_data23 +0001:49ee _print_sl_out23 +0001:49f6 _print_sl_data24 +0001:49f9 _print_sl_out24 +0001:4a03 __check_assert_fail2 +0001:4a0e _print_sl_data25 +0001:4a11 _print_sl_out25 +0001:4a14 __check_assert_ok2 +0001:4a1c _print_sl_data26 +0001:4a21 _print_sl_out26 +0001:4a23 __check_assert_skip2 +0001:4a2b _print_sl_data27 +0001:4a33 _print_sl_out27 +0001:4a33 __check_assert_out2 +0001:4a3f _print_sl_data28 +0001:4a41 _print_sl_out28 +0001:4a49 _print_sl_data29 +0001:4a4c _print_sl_out29 +0001:4a56 __check_assert_fail3 +0001:4a61 _print_sl_data30 +0001:4a64 _print_sl_out30 +0001:4a67 __check_assert_ok3 +0001:4a6f _print_sl_data31 +0001:4a74 _print_sl_out31 +0001:4a76 __check_assert_skip3 +0001:4a7e _print_sl_data32 +0001:4a86 _print_sl_out32 +0001:4a86 __check_assert_out3 +0001:4a91 _print_sl_data33 +0001:4a94 _print_sl_out33 +0001:4aa0 _print_sl_data34 +0001:4aa2 _print_sl_out34 +0001:4aaa _print_sl_data35 +0001:4aad _print_sl_out35 +0001:4ab7 __check_assert_fail4 +0001:4ac2 _print_sl_data36 +0001:4ac5 _print_sl_out36 +0001:4ac8 __check_assert_ok4 +0001:4ad0 _print_sl_data37 +0001:4ad5 _print_sl_out37 +0001:4ad7 __check_assert_skip4 +0001:4adf _print_sl_data38 +0001:4ae7 _print_sl_out38 +0001:4ae7 __check_assert_out4 +0001:4af3 _print_sl_data39 +0001:4af5 _print_sl_out39 +0001:4afd _print_sl_data40 +0001:4b00 _print_sl_out40 +0001:4b0a __check_assert_fail5 +0001:4b15 _print_sl_data41 +0001:4b18 _print_sl_out41 +0001:4b1b __check_assert_ok5 +0001:4b23 _print_sl_data42 +0001:4b28 _print_sl_out42 +0001:4b2a __check_assert_skip5 +0001:4b32 _print_sl_data43 +0001:4b3a _print_sl_out43 +0001:4b3a __check_assert_out5 +0001:4b45 _print_sl_data44 +0001:4b48 _print_sl_out44 +0001:4b54 _print_sl_data45 +0001:4b56 _print_sl_out45 +0001:4b5e _print_sl_data46 +0001:4b61 _print_sl_out46 +0001:4b6b __check_assert_fail6 +0001:4b76 _print_sl_data47 +0001:4b79 _print_sl_out47 +0001:4b7c __check_assert_ok6 +0001:4b84 _print_sl_data48 +0001:4b89 _print_sl_out48 +0001:4b8b __check_assert_skip6 +0001:4b93 _print_sl_data49 +0001:4b9b _print_sl_out49 +0001:4b9b __check_assert_out6 +0001:4ba7 _print_sl_data50 +0001:4ba9 _print_sl_out50 +0001:4bb1 _print_sl_data51 +0001:4bb4 _print_sl_out51 +0001:4bbe __check_assert_fail7 +0001:4bc9 _print_sl_data52 +0001:4bcc _print_sl_out52 +0001:4bcf __check_assert_ok7 +0001:4bd7 _print_sl_data53 +0001:4bdc _print_sl_out53 +0001:4bde __check_assert_skip7 +0001:4be6 _print_sl_data54 +0001:4bee _print_sl_out54 +0001:4bee __check_assert_out7 +0000:01d2 invalid_sp +0000:01d7 _wait_ly_6 +0000:01dd _wait_ly_7 +0000:01f9 _wait_ly_8 +0000:01ff _wait_ly_9 +0000:0218 _test_failure_cb_0 +0000:0220 _print_sl_data55 +0000:0231 _print_sl_out55 +0000:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd6bdb386fbb43518a0c43b089763f33117c577 GIT binary patch literal 1355 zcmbVMYg7^j6gI7BmEdc3G*X*oR)$S;Y8hl=#ZsACD%O1T7_}OCR5Cb(+p1-vsDO`3 zz_LP@Iwa7@gj}ilg49ION<)m&6vD$p5g6^4XFL0|ANSsK?m73I?|$ER@3rru_S>#> zU1?=yWs5ifkFnGWOBAlKwq&b8-Jq4#G6w`a^w5R!X?pLCN{`i7J`gXO;~C9qgKuLU z>?!H^5OYsNZ5u7NurMJR27`sG)M%c~S8KkAATRaWZ%y_5rK9MH{6I?jo4d5ZDW0(I zsSMwwk*v=XV4tTdjNfE?t&%2apgl&=+S)K5PYI451}=3IO}#i? z<3_kYcf$|_U<^#^SnVe2+;mIN^7I=YX9^!?Q}Nm?JbR;jn?d|Gi-HyC1FA>rg`20s z@S?u)J(P=nZ#1L~^C@yJ)-#b>6NXL)o|YA~p<&A5Y~UkIQDsmW_+Mx@Y!7xQE7xft z%cHj%$n=h-MbvV)h94$wrLI}pz6_XJ%D%pr(da%fQ^F*hJyrvIM-=rjf%M^*`7)>U zZqrhXfZu|K1o;9n#9vedRxf<*Y6y2`OE%cpYqI0&DVB+Rc zJZVs#K68#Yy-;;rBQ{2n2hJ5t7gS>qlPyN~03HCuG&+wREaqC){+VHqSvUE#I*zl@ zvFiB+EXwC%mv}d%v1F4yRPC~2BixM}#vMv<0Srp~)HUuTRwx7!>D=BT#YsTV`pYuz z(~CQP1IbZ}*%n39E8wmt+SmECTwuAlhM?+1NaE!vm>rVENw4NKG@PIeC|Uj;xjpF1 zmv$K)*LwrK&}^?R9Bz>2-%Ecy)|%vdGiu)C$>u78|Y^qnw5#6SfBJ9j^vTd#R4un*qKp z-r=}ea-Ic1XL(FHm6$fV*`J6mjxdUE z9c$wxN4cKKA<7<)M_UM5d@GB9119(gUUe0inLXOc=B2@6LvffGey53SKk!~kd{?jL zBX+aO0{gm=N@dir@6e?4kiskcu9kpITj)NnYTQD1t+K13tlOb7!f_Z%a$eE1Mt!i& zOg!>(g~j-^Q4%Eh)5(-((F57oo+WBo*N|`LxGaSwa#=430RyMd-;kI$Pkg$L`0#n` z{f09F3Lo`+9gx@>(5VbB{gUbfhRs@G55kx1gp<6>##1IPt;zx)rGb(dXI1&$?jfM} z8B`jGY@JED;+~8dGw}6uEhb}=QRkREFXa}DqunYn*Sz;!J!Ri2Q+O3i;DJBd25bAu z6zDB-Y;QDy#6-tI13##pq_x^@L=oGvFt8J_f62~{KMQ;VRmP)pukNU&L3+Z<#XuG@ f_#edn|F+2*D2a`g_Cp;%KS@M*6ufS4%CCO`#W<$X literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..533f1368184b1b1725ab4d7598dbea96b9273969 GIT binary patch literal 32768 zcmeI4e`s4(6vyv-O}p17?Osi-Z}YLe#!#|3N9~5j5}(Q2OPj25E&bu37Tj9a3A#Dh z#5!Zvp?@g;qcCv7(BVIVAVmZ$#Ep51fL-WluAo`Z+j)D+{UY+?6Y->r3d z_tutgRJ*)d%{o-Q-K#BI`+ofCUd{XN^G|N@&|;6~J=4?bDHN01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-Ep8iB$Jga5_8LKaB>_jtfFU1?g~7}GTH$GEMGgD0QI5BN20-MU!JG~3z| z37D~K*Rf-dKi=KFVM9v`#7)!Uwq{Ll@0vB3k9A=TrfIqk8M=;s_!-~^eu!_}XqvWd znj1HQ0)qwGHhiO&-*N`%L_&HSKQUibv9@I;lMpkEXw=~rjT#1MO*0Irt!btSI+1Xk zK)^68t02z5)Q*EaAU_t%Wb%2eUnnG#`Mj#icp?EBI$(aGaBF|42Ok;7v2CkrV-Hxl zv0tf?P)mzp?Am1*$Q#xSE5+4P_W>efC?l?0uV`JO54-R5|(~Q&& zpD*qYD?t9rxT?zikB-WI5ZCokC=$W>M~=W+(Xb!xMLy4?M?puq;rW7fWwVo$v$Jx2 z5W!Oj^HZrvq^qk@uW?>*fAKin7BJ+WOyb=M1YouBe8t?>)*!}p{jc{IvcRyOym#n> z??ggXZF_KVU;q@5f%7{vGd&F&4DU4VU*%@ojwAE&#=tF*=hrZFJs#J&;cUjXZq4Of zck9+b0Cy9Q1D|LV;&8U>IK}-2EpMcz9XJ3xk49s$zP?SHARp?YAz$##%}q@Kbr^$f z-rV004;>Y*P(B~ zh?}O#^}($E{#*`z!c%V;==t|Atc`?&#;-g1=x`)x{05%0R&)5Spz-tl#U8exFl+JL z&7mGvQ%*85;;)b?Tv+)InbO(f;*ztpZE1LEyWP2zw0~b3I;Y?I>Y0Vi-+A>+C-an7 zGVu19wz2e3c6=f|HqOdc4*tdAyQ+DoV)rYHA}5#{A5V`>WJh-RNwMtVQ?WaEqVkzY z2~DKOC#=C#HkWo;vC`>1U%Ac8SHfQ7y*TW6HSF!I-sU}axZIt4j(^tjPq^CYJs4XJ zGp?+!by?r@n#MO`5BwE5i#z#39#ihi!cv>~*(hy`J*1?CR8veD!N7pUs){#KZSzjY zI(boLFZz2d)@7_$o))TkWSAE)bmc`MH8^YBSZSD-JT83dAXDDPsZf&flC84jhv=`D zydacc@=GE8lE9^c`OsjTH@GRJ>M*5gyVwjgXyOe*vca9`uQ%8rl;0pOq~DJ+lQspIsvgCgB*GuMw@=LxVq+b%&{3hnZnrC@~_k>hkrkuh6G-&1xI%I=S z(O++HSt!53RU!Qbr6+hvHVm6r(@bd-qb4XB;3eB-$q4%ECHsW(OFkr|UlP_lhWW7O zgS^3RA=M01p1=S!Sj8LYvcU`JuQzy2D8Io;A^irW=Xl8vgip;eK2uuEDx19Og~J%9GOX_^C&vYul}< zuS>t{r@kv)>047jmi~;N`nh!FR;JQBtp2q>C#ew;AOb{y2oM1xKm>>Y5g-CYfCvx) zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx) MB0vO)z&}jjPp@kDe*gdg literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/test.sym new file mode 100644 index 000000000..062765d0b --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmg0/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_regs-dmg0.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01d2 invalid_sp +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_failure_cb_0 +00:020d _print_sl_data55 +00:021e _print_sl_out55 +00:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..ca834e18a5af5f709acf3553d285ccfe45e04f10 GIT binary patch literal 1327 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!9PZ!6KiaBrR-k!BYfv4r= z&tHGzE59u&mksl9@i?|=&HuDzwh2pEI6Hs+`u9(-Y5MxryaGEt5{gs|EQMysaQgJI zsJSyu{;aojPu%*qw;PO@LclT~iUVUwct@2a*ne)Z&tW{Wk>Regp?Wrc4 z_Fit%RrH_wU#5;N^6lC6-m(3ULnGfC6-^Ojo^(q6aqRz$+wR-L*JxjqN_i_ad9%0p ze)GJyHqrlzFVuF+{5<#s!?ntdCnp|wvZvqNuw&NE@>7vK0+t6~zARc}Ve+Qs!JY$( zIYMR5Ctg2wzxq2-M#?P0@}_J3x#L`Sd9s4TyC$F5c<8nKwOgB?Mntl02wZbjZx{Eu zt#6`@@}AdTc1?@=aIHrC@%pd(wy)k%B>X%0-NDD{ua_j&Oj{myr{ZDQ21)x~mM^=6 z15fa)r7!FL_V>`vOOyVbzF{MGfBNA!-0JTS1}^qG-Ouw;KY8-f-81W^U2i$ONB+*Q z)~~k?I_;`U>8Q7yanL?)!TjK!m3f|72WKq5C3H34U3BWfsm*I9hFRY=D)Y5Zo|QRW zzRz;9X>e`3a(D2m7>g6LHf%Pr{rt^7O_^W_mk=Wmz_O01FW@-8P z={NbmIeuu~zR2m(!C1R(KZBX3PZsh$WO;Q(MZxsv+a5Ru{Z07Tc$42wCWZG_cciu)OySq>Q zxXw+R_Nzk>5pNi&8KC><_FHOKGHHbMdnVk`mPsMv-2{S2Td&ReZS%K zUCxzyzd9fHxhvWu@&mF%wEy?nUZ^Ci z6pCAiAK3fFg##D^j+OBxCqL>le=eQ(l%1Vx!t?lJaT@)fo9Ei3v-~gGZoOviO`w@C z%h{HeZ!BiL;CQV{t=N2`walNM>?z+}r)#rCT9iFw%$nB0w53}t(BSvME_U%e`yCo` zHI*9<>brb=Q0lOM_L7PMkp;~`@0&YW*W%RvFZ1uq*3bKK;auKNWc>?j%umiT zkJGgIc5Oy_y4I7*i-C8Jo||^naoSe1Bg`k)ZQXriC)11a$s+uHOeGUq-^bS-*e?8Z zx2NiT{yhFhpr03{b!s^5&Jb(`7c6K22`g_X6h0^aK;JQwPs(@>s37!o^>bP0l+XkK Dn^c0^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..f3ca735dc3f84c37d001b536484f37ea1120a36d GIT binary patch literal 32768 zcmeI4U1%It6vyvOHt8h0NhfX^r*&v2>k_uLmKck!VI6m;v&n9=nvf3*G0>XOw4l~P zE5^ERQ}jXcMWJAYqQw_MkSGYH7Rq3;blGkNp?-jsJZK+Qtrb7J=*D~Q**ly14S~A=b{c&JEAMz&gITu<+83d zK5Fs7WSVt5#sBy5pxqMzB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y z2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y z2oM1xKm`6Z0)-U@|BHQvERg>1@qlN#(zLoUrfJ}haa$P&Pd<+y@N3%o^|6>~wzVY^ zFk{!Qqeu7d?e5;Vv84s#rfG3oySBG??OM#ox-bUQG+l=bT}MCs3~&QK#5Zj+P1`oj zO`AZ0!2)d?zER6>IRkVeA-#>Cn6Ii>+p>~Lh#5vS>Truj4Fj~M83xqWG}8o~NH|U) zU>KHF5a(ZN$H5+uAB$x&`8?Jy6q3n&UR7m0kpK-HFuzc^u|L#*@Ga*raC6;wT*e_Pv|{@iQxRhhheQ~*bnz2pXZSyprhRIe8IZ1*~!V-S-C!l z;3rlx>8jKQ{S z>FP zS8wmSbr^>;*!cYdz9ZbGrsn1vaX14jHJ$-o$2$wZS)mK$o2IV!anp6=FImYG1J6Ii zP1EH1U{-&BE(bs1sW%Mt{JZDZMZ!Vj*ByLxC=xV&1J4<&Iecr-`04Iq4_i=}wRraW zP!FpqCzu%VSI893uY8A0=}d8P$ywUAG`zIk?p#XRzb_4))o*7G-Sb8WsK9L?9XJsn~|Kjjn)x49jyOl+e6HJYdr^hC;BM zO{B*stie<^mv&jP(&;@@xyj2{!d~OOIP6$8?Cq%DTmAkUA)Fys5O50-hDQO|q6jMepFkrE&;*C_>yi>7G zUR2qG{vL~U85@)*glZlc<^>F0c}_?T&KfsX8s;UB37E7nAytbX_t`Xa@!lF9+V7RyTURlo(hMVXMU!MZCP=1s!NqtfsAsfVR&+l{HO zNWbf+z9n7h8&f}!{*0e`NxE_?Q|TR6|Jt9E)QAWW0U|&IhyW2F0z`la5CI}U1c(3; zAOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; LAOb|-A13f8GXD6S literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/test.sym new file mode 100644 index 000000000..c6f3e5ac5 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-dmgABCX/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_regs-dmgABCX.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01d2 invalid_sp +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_failure_cb_0 +00:020d _print_sl_data55 +00:021e _print_sl_out55 +00:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..6d33be3230c3871ae6494643f5851a09d02cce30 GIT binary patch literal 1324 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!vPZ!6KiaBrR-mZGAz|-Qn zf6ssIa{W!OH?f_RSW;y(@Bgxu{1FC>$|}d#zkmN;sp99ZTMQGsS=8K_CM!3doOs}g zM?#T`f#v(4Q?I|?`nUe>qpICov!A=ow@NMluE$ zW!`^D@IDdz)V_VbXIS;;*FoDKR|H>M-V>90q+!XYlNHzhZ~42}TI*VGhVQ1bxhE}` zcH2vBFPo?P-}1#i*SW4b@sjE?GkI&zv(|x8?HAouurtTEmmNTxJAq1 z9r-~&FF%ba%(#*8bV+30QMPPr@$a^&OXAP%ntN`)!WzDdvBzFl=JLs> z@$6sLS1VL=l$YFTPR!n&e8*4wM$de=B7W5)CZC#5&fLSEKmR&ALv{zZ^_pMMpuxpFATBLB< zw6v6acFAQ)7p&VmoaziL&(wX;KhpfMJtNJ2#}U)2?fcHuZQyT`-y`}p@u**Sf9}6Y z2c9l*nOv|+N|gWIr#o^s9;@Va>J-x2$`wCRYl=Bf7M z_U-$fzbyZBcR|i}_K4eS6$;BfZJ278d-JEvH|LUW(GM^4%Bu>>*f;4tWLY!sK={gC z`L{c_FO$6UZo`kBLw8iw-l#l&AZKIfa{YLTxAoMnJ+Eupo!|L+@Lu$vQ*Oic^B^=A zV5G8`pZAvRnzL)g3W@kPkGm?%mNk818yYJ673H+g1<6ZFP4D*-0o?)l>q<)me{S0n<`ahnzWRl^e9o=)aAJlzy;Q*#A z$Dey&OnMy8_UyIIX?{Kth4cG+{w}gP$6xkoj^LlucVBKOOJn|ZZ^`|cQ|=u-C+eUc z`FiG=yDskvJ{YeHtkd5WV|en=Mq~bf%`PGfoVRo|-Q*9m*-`NOpzFs6r<-}}6ua2h z1GTFhZC=bUH|62)>GB`m&Ute%@ZZw^f8PE0e5Ads?DTOY{Y+2ydS2W0(d*&H?Z<4a zgB8zr_dU`p+qTAU)0(}Cavo)??}8k0fA*4!0+9uib!z^9V%|4bLj8-n)8o&|-BP<~W4dufB7@keH^SqyRa3QD^^mO%eS?83{1OQA0l%oIu literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/manifest.yml new file mode 100644 index 000000000..ac2b1940f --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/manifest.yml @@ -0,0 +1 @@ +config: {gb.model: MGB} diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..749b13ce6e70ed13a053b008f3fa79cb2d2abd42 GIT binary patch literal 32768 zcmeI4U1%It6vyvOHt8h0NhfX^r*&v2>k_uLmKck!VI6m;v&n9=nvf3*G0>XOR8VW7 z6=PkuDf*!JqEN6x(c+6BNEC!p3uUlax@@mjku`{E}g&*hU&bPB*(|+~>3$b>lb#8d+W!CZa`MsAf zUHa;cQ>XUK?(O*D{H3qoc3yX_~RdTQ_PXLsMZXU00Pd;bA8HO06oce6XMUeUU| zyK2k7RJ*)d%{owBxRJ-cdUbd?I`&FxY@Et4E($vx1t*vkGU9%;^j6aliwH(SBo!N&TPUW($ zH9l(b!DO0sJH`L^@u1xk0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vQGH3Eed2LFqFg)ET%@9}_Vy3(||F{WwYk8xWW2TwkaAMk71`t`AxX|}Z` z5-?-et|Lbtd#t;Aj4`zfedf^LbU3@k9bNbin*V;pYBO4?Z%EW7}5M#vZV8 zW4}@(p_UfI*tN?rkTsEp_H$>jWel3P9x@rFj;(0^g!*fBXDc3vpJx8p!QK3U*z z+n`MoPD3Cd^IbQS86DlXFOzXyh(jkd+;J*3J3Bd<&8E0P+;L`R#>Td99~{K`rWvUl zK407)R)GAKaaEQ3A03tbAg=47P$Yu$4;_NFqG3PWi+rAk4}*?!!}A5}%4R1gXJ_U5 zAcCh5=BHATNLN>*UgNyr{^D`CEnvt$nZ&yj2*7IL`HH!%twD_I`d{xaWPxEldGF8% z--(2(+VUW_lVl7~W~zzsk+F9Y^Nlje%Pr&#z(VdOWUk!`X~&-I~j} z?$)h=0PZFp2R_j##Nlk$afM#b| zvZcQt9y%&qp?p5zo1UJTaU3|Q$t3830XQvi2UWpz^XC43=nFC2y(*f$&S2yB3-}Imo0^)NYsBFUtkif0bRF+3{APtNkZ+p0-p5VXk-uamPYgW& z5I0Se>w{VS{ka_cgs0vx(DNUhTNeojjq5x3=wKvh{05%WR&)6Fpz-s)#U8exFl+J5 zjiDY^Q;st+;;)b?oLl)0nbPUv;*ztpZE1LEyWP2zw0~b3I-}qG>Y0Vi-+A>+C-an7 zGVu19wz2e3c6=f|HqOdc4*tdAyQ+C7V)rVGA}5#{A5V`>WJezIlVaI}Ct|nqMCCJ) z5}HVlPgsMgY%cAxVx`l2zH*C~uY|qEdvVy&YS`ORy~W#ku-u({j(^tiPq^CY-5*;G zGcIqaby?r@n#MO`5BwE5i#zy2b}IK|VX000Y?QXe9#GOkswt+7U|_&vRmB^rws|LG zoxG^B2mL)3>oPVdPYcyNGRzAYy7Hos8k{w5tTfC^9u+=ykSTBDR4B=K$yQnNBlOox zo)gM1`Gt^vN#Ih!d}uJv8{805b(qq$U2Fy#H1P%@+2A(x*BfjU%5M-C(r-|DgqO?- zpSq1H593rQsq&IRS#mG>>m~C-`6XWw(k}^XeiQRy&9l70dqS!%Q%+z28Z`3;9kRiv z=&v`pB$VIa2O<3irN?>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y M2oM1x@DCIC6F#B&nE(I) literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/test.sym new file mode 100644 index 000000000..bc2c5e877 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-mgb/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_regs-mgb.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01d2 invalid_sp +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_failure_cb_0 +00:020d _print_sl_data55 +00:021e _print_sl_out55 +00:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a0bbda2fddd9a95609b7060cc3c25d2fa5687f GIT binary patch literal 1310 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 J1pZ+He*z=e_c8zg literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/test.sym new file mode 100644 index 000000000..2c87dce6d --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_regs-sgb.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01d2 invalid_sp +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_failure_cb_0 +00:020d _print_sl_data55 +00:021e _print_sl_out55 +00:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..94b57dbcffd6610493796ab021792f6670c29e49 GIT binary patch literal 1312 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!*PZ!6KiaBrRUYxa9fv2@_ z-@gCa<@&plf3_UqI4RKoeE&_^)gPxQPmze){{43>ho1dv)(H_A1{Nj~GEzKzylm}k z&CbmSE2jo+%f0=7-Q`DByT4pg?A=##BJug(P|c1d!PCDK#LcgN<+et8#qEf%c6a~s zOD}a^qHw8lsMrbn@5iq;ml{1eSgmob`R~bM-OX}5v)QeS#OKCN`266qXPD63g(`dBb%+CX zNybcG`lr%#iplBFwEf>67`Jav+BNA}Y1^iv*eyZpeW%82Nd>)pW0bL>?rhY(wL$B1 z(^om>ruW~O8~$(RImxv5DO2a&$4`<7gn{n&&%mhMMS{WWRIx20vfOX34|oxiT@`S$AeJdKxo zybK-wf8(-I|GsGHq_tn_R|(tLE4D zu(riJU-P7XES~(uY*xPMdbj>-lE)uCSDQO8$*$uQ?;jhh#}R+-ENOf&{le5I7bTBB z$Pd-ZUJx^3+M5*R{pXIJ_pSPGSMCwtBX}gX1WZZXPYWwIY&vJ@Tvusfv-VuZBs=q$`D#ncFIqZZ^1SxP>)AV}yz)=$cbxlF zeKGZ@igy1wi%F-H;#6c8b&8*;G`5S`zP0Te%k5zH2?F1Zz7c?$0mk|eN=iW;Jar5 mENh|`El9zOT;h->{F6OGDkizf{LukW$>-_n=d#Wzp$P!9ABHIa literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/manifest.yml new file mode 100644 index 000000000..0a0ffd6cb --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/manifest.yml @@ -0,0 +1 @@ +config: {gb.model: SGB2} diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..f6133cd5bcb7ea3387197523e050a575db23d691 GIT binary patch literal 32768 zcmeI4U1%It6vyvOHt8h0NhfX^r*&v2>k_uLmNYH8hIQPX&L+FfYC=9*hyi0l(?V@6 zv|_C5Hboy4Ula;fC|Z0G1POvrv`_|%rOS2|1Qo$b9<&c@m5QHTbmKku?43=0@bLZ*U!JV!#?!*weRlzv(~YFM~|_oDaK9N!S23spVsAV zudV!C?ec0h>sWQ2S6i_T{qW;<&HLul4}a#Nr5??DvZvKkG*-SjWUo}(Jnku7vRS27 zj6UL{kQjYtcU6L7^cDAYh|x7ZY8RvLZLgw>(J%H)Wvv+1EFO7GUb)w9_w_u zS?x)#lxjEJ+6z{df4^i^kH2Y!TADhVyS0t&z3a9`nDK|wu9ibNqci)^o>VUDTH~V@ zA55lMw^RIo9}n6+5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; zAOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; zAOb|-Un5XhW$?e)SIGkD{~ix`rmIb>8)KRV{usB_aq#5x_yNDBZQK}(nPyvCA^|gI zW=@?taG<+;^X8Toh?}OxZTj4`zfedf^LbU3@k9bNbin*V;nx084?Z%EW7}5M#vZV8W4}@( zp_UfIn3*vQ zKJYE)FLHC;cwELID&zTlGP$sjot_2_hIbnGuX3|($C3GXW8fCZ^J^Ho9*^tXa5iH*cjj`gyK`qC zfV+vuflo9FaX8y`oZ^0imN!znrl#iS8*w-Tt2LehUB^2MzgeLRbUYF?egn@1t2umU(D>=zVh>wXn6-5A=1>o- zDQB4&@mI(cF0X!vOzA>#Y1vucwLHAM+wNRW+P^OkUDR)V^~_@C@4R}ZlX=RE8F>3l z+gN%iJ3f&f8)s!J2mj*mUDdpEv3r#zkrPafkEh2bvLg@qNwMtlbFtfbqVkDI2~DKO zC#=C#HkWo;vC`>1Q@PE{SHfQ7y*TW2HSF!J-sU}Wyxg68ntwL%Pq^CY-5*;EGp=o_ zby?r?n#NaR5BwE5OMCf39#QVe!cv>~*(mLbJ)oq8R8veD!N7pUs){#KZS&rXb@HOh ze)RWPtjpM>JRwx`$S^Np=*n|KYH-%LvC=Rvd0P0?L8iQcQ=uf|C0k|5_t9T3d08mG zAC4ox?^P#~wZ*Wsc)nQ80Zm}6?(8L>rWP>}7(O++H zRVcr~bs_x*rGvaA8-~rRX{NM^Q4^F5@RIGaWCZ>7l6^w?B_9ydF9~ZN!+cotQQqKD zA=M014q^Zrtl+_^BtPYuBx*uSmb^ zr@kd!>047jkp7IH`l)o~R;SWCtp2q>C#ew;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) Iz&}jjPcM7;F8}}l literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/test.sym new file mode 100644 index 000000000..44fc2036e --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/boot_regs-sgb2/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/boot_regs-sgb2.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01d2 invalid_sp +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_failure_cb_0 +00:020d _print_sl_data55 +00:021e _print_sl_out55 +00:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

cGjBdBGa%UTxA6CBjWp?)B8rIx!h`q=HYz@sw{0%LQt=fh)U3YB>GvlW6sZtJP3~j7$bj%tWWUZ`tnYGsmG4+;&G!=we z`jhEQuQf6>zRR^9V69HEPAhY3T4Vpz>H)1gdyCQPi2xBG0z`la5CI}U1c(3;AOb{y z2oM1xKm>>Y5g-CYfCvzQ|4d-MtkjKVZ2nk%q%KVk5g-CY;D07yUsznZ>F=ujb+4UY z=x?-cGRA*py!|KpyMHghipmQ3_uV_Si>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IZd(Gm8iW7EUgPG-zx{Z?Gp#kPVvK1T z#G~A5^AO2q@dI&9+pr-THO;1`cpOGdO&veJZ(nQc#*KbIz9Bh+%-QX@&vXnr52d$K#IU^BIO^<;4D%zT;pIsE z4p^Vd)%OQI_{coo+qSA!*MQ2^^-3QJ`Td45HDwsc8|Dl%#o2;~Ij8|I7IR%#4`VnQ zR_MAXPaZ!$IcZs@X>f}~a28NMH|M(WfvX&!=jOVxn9M^~=Cj#EVs0+MEt`dW)kogY zKc7E&QjUj}=W=j$9H_@93;b;xeA9&8;Pc6P*G;8{hYuc1rCb;C&!?G8qo9UtiU$?iXBNEC#0q4EZM#cy@d~m@PbC zF?RLpX3XpQ-_I{pfuWu}cNl|fJg%y?-QVBa3m%Yx{X0E9ISD=(o@rda%FVVNN7mzs zfm0y&uVLtVET(hA(Tr`|mdUv8wrxHit|k@(K9LCIVQ*J(it`P=Jdv7q@F1)_5{X8; zyEku!deB8fz7U(8otOaXa1XX+OHU6xbo6kB^7%k)a&mgwabTw=65#jt!ft^xs0yZ= zH}~{FU&!I=4Fl$mzOKjPFoSA;=+)KL-i~?LgVpaBh#loNF)=$^&BGq3^>GjAI-Xhh zW`!B)AV<(nEh22Z* z3XdNyw`QK_pLYHUEd>h?N7urLA3K)UTR(G6<9o3N{=%KpyZJ;OR~}5mR2%r-DD8+o zqVx$@O)_N&6TKE&QVK&$O@)u6K`yH7#dxR1)*Btlv%+f}8sq|ot{fAt278SgD-CkV z6C$SeGv!?z3X+UVu9lLYV7wxEUU;75H^TKKfy*M+LxWM?;D&Hjhbav^#bTgA18)$J z4er5srNKtwc@1L1^%|5OQ+F`sQ5*`ADwk}Qk_Rwek<1FulYB+Eo+QlqEv$z* z&+rBx2v>EPat0I7ppiFdkqy4Yc%{J=;du?N3fF5;+Rr7~AS_<(V@i{_YXC_fms}$y z!x*nfb_>swd_=gOB+PjP>tW7^c!MW|tEQN;9~01E6>p%+1}|c~(%^OBc@0hp*K1IE zo=bitVrqsd=Wr-U`nlvSN@DmE>%s4v`L z{9YU=b(inUl)8;(einZ1@Ux-7>Y}~&)N)fy{e0Eu-Qi+LNoD|`-?EZ?7I1*>QO0Db zzY+?Cc$1Lwq>MXW=@A*)QD6FojJsax`!dv5U;3Ghr@YdyWr)AaO3X=2fZjiK+y3>H z7Dfb!01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx) hB0vO)01+SpM1Tko0U|&IhyW2F0z`la5P{pCz+YF{mj?g< literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/test.sym new file mode 100644 index 000000000..d5e92cd8b --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing/test.sym @@ -0,0 +1,223 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/call_cc_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0184 test_finish +00:0198 _wait_ly_6 +00:019e _wait_ly_7 +00:01b4 _print_results_halt_1 +00:01b7 _test_ok_cb_0 +00:01bf _print_sl_data55 +00:01c7 _print_sl_out55 +00:01ca wram_test +00:01cd fail_round1 +00:01e1 _wait_ly_8 +00:01e7 _wait_ly_9 +00:01fd _print_results_halt_2 +00:0200 _test_failure_cb_0 +00:0208 _print_sl_data56 +00:0216 _print_sl_out56 +00:0219 fail_round2 +00:022d _wait_ly_10 +00:0233 _wait_ly_11 +00:0249 _print_results_halt_3 +00:024c _test_failure_cb_1 +00:0254 _print_sl_data57 +00:0262 _print_sl_out57 +00:1f80 hiram_test +00:1f87 _wait_ly_12 +00:1f8d _wait_ly_13 +00:1fa1 test_round2 +00:1fa8 _wait_ly_14 +00:1fae _wait_ly_15 +00:1fca finish_round1 +00:1ada finish_round2 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..6793b1881ebe507bdc629071217e79444ca09627 GIT binary patch literal 1278 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!ZPZ!6KiaBrRUMyRqz~j0x z```cRd-?B0O`Fg$f#+exH}Bh$y_)GAoCZ7I{+`F7XTMoiVP8N(frf#Fh=dFm4<9RA zJ5%##PtDxhW&h?*Kl=0arReEKzbq0-3<>a6GGiBQ9Efx<_c8-YNH{NB(-fB<2th{X1;?0TdEWcUJ9?Aqw zdsfb_&ggqNTFYUfNZSuf2M?JIc6bXSZfduP*pqudRFd$GJ~EW%f%|wEr1RS}@-_i52Lq zDyJ>`<{i6mi*C_GK^*?clG$O@Gq%5!h2Ee=fpgfzWH@)L~=dYHz>}MQMi6E z?DIk0kCjLEX`d)9*p&U{)&JctWwyne5~uH<6|?X5ThFUMe!jb`qP?KSN{{LIN`2pF z&66)QPoJSaZ%;~k>7)KgrRxW`dxkBZ@2wsw_?an*1L$b0*9nuKcyKLj`?~t-rpS{s ze<)TJO;R=W+Hx#wWpnZ+%?s#FztWmFyk|*;{Hf-P6W4?Y?_Rv`%{GHWKSCe% zrx>1OO8>MgBmYZH?uW2N{9D-+yM&H#wq>9tD0npeYtve~mgAOsP1LjUd~w6K`=jGR zd_Aw{M%Mj4XSjRz#*EBg!N2~Nm93~MuvDu#wWddIyU$rY^V;ll{{{AP{*HTl=&;_B z>)Ye?rd!6BXC-B_u72{odPm!fNqTwB>umwfM|Rs?%9+>xl60f(@0<^C5X z+t1z1I{o57-7mvpAn&@{x?_)jy!872xp`{oIknf~ysDm`maV+|Z7H{F^0VT}BKtNU zDHXMM=a`k!yFO)|-V-zRe_gLn{&roy(lboP{x8QXv5iU@9cp2~*#2eLcK6yfu8W|^ z{%v>Z^{a%r7GIZsseStSuH$dbZM!nx0nJ;(#ea9QMcpq!lapQX@p4DL7ngYdKlm%? z|G#%X_Ayl1NgVgLZ`$R$hC^ymr>HGc`1gY^mid&dJvJdXzqhV#m(kCio~y4+U;QHz z#JcCUub}h9t7R|G`%ZdLvq98x@|quCpE}mqtJ|BuoLyQ_*$J}gif)qY1p(hR3&6RK hsF1=DfVhQ!vd6D{_VAd|qgkMG&C}J-Wt~$(69C4?X;c6J literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..8c71f685e2f8637a6ed613c1d51bc9822e67e3aa GIT binary patch literal 32768 zcmeI4Z)j6j6u|F$jrFxj+gIby^AWXq+vM+8yCtmZCdW7wuYRdF&<}6 z&--%RQn<=TUNO4CN6lh%(>^=jBu2OG^1LoazuH&lTf}H#_Q}LXYoWFQJ3H57w?AS1 z#kO2~r~KK!ySVRc`K$l%ap%?Yce5`k5B4#k)e`|CKm>>Y5g-CYfCvx)B0vO)01+Sp zM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+Sp zM1Tko0U|&IhyW2F0z`la5CI}U1nxV5OpU;QvDc^>(*J)vU{7mBs|aJ72KEq_T0dCQ zY5ag)(^jntg-o-tF%p3pV`ImUKlj|SWoy>d*Mr|QEiTKKx3@1}j`5fm#vq!e>ky&q zXoqhP7qEkW?OM~cZPQ%47BmoO(6-@;x_rtRphqIoTK&d&RmI$v6^(+=FoMB2mtfE^ zK-Vq9>HNI#BkTUD!Tz|7V4N*xK+*Bi#zm|-Aq=ovc2Zb3sI#DEqKI}WUeF`Nx6bevPC zjvpT#wJgೝP1;kHHISzc_Dd%UoI8Hb${os}UbUGTHnu>Bsr@>#1}x z^I_$g3_Rm;h{v4;{jst$Egn}!M#U>_p>_{eKT)-cX zkB<)yZr|S1gZWJ}P!Zf;TpwnD_*%cJ%JmNn$a>({b)PQ~!1+gxK(8oR57#31b9x%| zAQwDe&{s0KW5>jV><>J63SoXM76>d|TFqBIFSx#N7;Xy)@{dOG?sz=VE$pwD+tA=e zzpnrD{z4Q8=9BjhZSaglRMob7db+wm12S-a$HzxUK?lJ*jq6vr*mgWF()U$ za8pdZd)_4fJZzt{L}Cm$USc#Yq|a^70x zf5dD2yd@8>tYOy7EPrDSTTo6jF^ZN8nTxeAh$)=U&&2Y2Hxk)PTt5a<*_8RTF1{uVOwac(k)aq#*}_^bXlyVbX`_BM+x zHC8Jx3T;t;A5UQD%IiYa;H+_Bg+8A0gs`bSOnD!tLQ2L{HprBpqP>#xqR`xw-w4%B z30&qe9tsTc0)GfqjWeZgyI2eqsN)5EvcO8TR|>2Vnp+?&RJTCk8J;pFZ0a_qJdIN! zrOH!!Wy*bMucS;1%}sessBTK=`CW{Mo+o&LkA$i^OgV!ND6ohZXqE*oqrFn#y3pJL zw}k2zDD34aSsyH3?Pf}&7}Y^a4^P=7QwGppN!cMZH|18Lx+$UOL5zo<5Ap)f3RO)o zWiL9Qz+zrNmjzx!d!@izLURk87OGpI@Cr})iLj|DrkuyAkg}eqY>_FiqP>#xd!e~0 z?+VpT$$QSX>Dg8mRqib2ucgX2F0ha%P-py>?=5r`A59fH3@^V6w^!G*eqTf0ZaKZs z7*;PVzR(fK`;}M<0M=VpjCTPSXr(eNO+6Kp-_MKqmFJ~B?uH(brfv6zzAf#J8~UL% zb>AEMxwI$T&@0lEstwKG_rId301+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y z2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;xIYB` E2HQykvH$=8 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/test.sym new file mode 100644 index 000000000..bef813fa7 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_cc_timing2/test.sym @@ -0,0 +1,204 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/call_cc_timing2.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0177 test_finish +00:01cf hiram_test +00:01d2 _wait_ly_6 +00:01d8 _wait_ly_7 +00:01ec finish_round1 +00:01ed _wait_ly_8 +00:01f3 _wait_ly_9 +00:0208 finish_round2 +00:0209 _wait_ly_10 +00:020f _wait_ly_11 +00:0225 finish_round3 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/test.sym new file mode 100644 index 000000000..d8d67a7cb --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing/test.sym @@ -0,0 +1,223 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/call_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0184 test_finish +00:0198 _wait_ly_6 +00:019e _wait_ly_7 +00:01b4 _print_results_halt_1 +00:01b7 _test_ok_cb_0 +00:01bf _print_sl_data55 +00:01c7 _print_sl_out55 +00:01ca wram_test +00:01cd fail_round1 +00:01e1 _wait_ly_8 +00:01e7 _wait_ly_9 +00:01fd _print_results_halt_2 +00:0200 _test_failure_cb_0 +00:0208 _print_sl_data56 +00:0216 _print_sl_out56 +00:0219 fail_round2 +00:022d _wait_ly_10 +00:0233 _wait_ly_11 +00:0249 _print_results_halt_3 +00:024c _test_failure_cb_1 +00:0254 _print_sl_data57 +00:0262 _print_sl_out57 +00:1f80 hiram_test +00:1f87 _wait_ly_12 +00:1f8d _wait_ly_13 +00:1fa1 test_round2 +00:1fa8 _wait_ly_14 +00:1fae _wait_ly_15 +00:1fca finish_round1 +00:1ada finish_round2 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8b90726eb5b0f17ffbdfcfea9b3a1d3dad99bb GIT binary patch literal 1275 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/test.sym new file mode 100644 index 000000000..0597fcf6e --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/call_timing2/test.sym @@ -0,0 +1,204 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/call_timing2.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0177 test_finish +00:01cf hiram_test +00:01d2 _wait_ly_6 +00:01d8 _wait_ly_7 +00:01ec finish_round1 +00:01ed _wait_ly_8 +00:01f3 _wait_ly_9 +00:0208 finish_round2 +00:0209 _wait_ly_10 +00:020f _wait_ly_11 +00:0225 finish_round3 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

t2^x-?qp05<|)6HfmR0Eb*DVzP8C4Z0QdNwcu=7H&D02 zbkr?o9S(8q4;2bd7&`n%5Tppgn1c~kki{$tf{L(7{}9FbYcN5VY3n`r4Yxv>PmCLWcdG72s`|17r_w9ae_m(}Q)-$^gJi~^E88>Ac z+cI(Nx~C`sh}zR?zy__ZBrk1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+Sp zM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+Sp zM1Tko0U|&IhyW4zCj@ef4E`H^k((p`|HlKK>0;9=#+ar-Jj!kHI7G5p{6JjO)~}C7 zO|!l}9)}sbc1=(3-P_c(abs;QjGLy#ZOxkI<~3_DA9dj#Ow)87GISl|@a^LUaTwpU z$uw=-G&gMm4-6W#ZMdQ@uW|nr0ZFt!btS zemw3tKA&M&R!;1H={pYAfc$7QmC9yOKbK1+vRPG?OE zt7|~z>UyP*glcOIW7jUjK;F zn`XFT_d?*B6VyX#qq2i3FY$A^c3 zI^2V8-P+m;4;?-1P(B}sjf{+rIu7jAL<0QwcGxX&235gy^XAr8s0(Abdc%O;(bx5O z96G4hhg!|eYuDm9?7`~q7l<9@Hat8&ULA)$u-L~vpzC;M;WsN(fqc`{^%icrj{GGn zxntn@2e@gP>9d_ef!v1}(dsa^^d8N!$>ULf! z)5!A5i4?q5roO+kJ3TPi*+0NaRtA1za4l>3GtuqJjL7jP2L?L(2h+WecuCRpp)=9D zd7|>ENC}8n+`x-vI$c({+L(X->Z*M9YA|1Ij-4zA^E=C{@{b=XHDwO-&szQomK*aA zMOVU%Z#K-Yw!Y_@##dqu`~^BQJ9#6ID-Wch)f&DxiXG91l}_QRNv8DTK)c1tO1`&T zpFbOIq33?g zhn^4c0#686O)=$39DoALc>!G(cmd;;0v-1So5k)h6|sTX8C<)wZmL;Uqrq9@S+y$R}{{6$E)M1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la S5CI}U1c(3;AOim-0)GP1T6jeO literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/test.sym new file mode 100644 index 000000000..049dcc7dc --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/di_timing-GS/test.sym @@ -0,0 +1,228 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/di_timing-GS.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0158 _wait_ly_4 +00:015e _wait_ly_5 +00:016d test_round1 +00:0177 _delay_long_time_0 +00:0186 finish_round1 +00:0189 _wait_ly_6 +00:018f _wait_ly_7 +00:019e test_round2 +00:01a8 _delay_long_time_1 +00:01b4 test_finish +00:01c8 _wait_ly_8 +00:01ce _wait_ly_9 +00:01e4 _print_results_halt_1 +00:01e7 _test_ok_cb_0 +00:01ef _print_sl_data55 +00:01f7 _print_sl_out55 +00:01fa fail_halt +00:020e _wait_ly_10 +00:0214 _wait_ly_11 +00:022a _print_results_halt_2 +00:022d _test_failure_cb_0 +00:0235 _print_sl_data56 +00:0240 _print_sl_out56 +00:0243 fail_round1 +00:0257 _wait_ly_12 +00:025d _wait_ly_13 +00:0273 _print_results_halt_3 +00:0276 _test_failure_cb_1 +00:027e _print_sl_data57 +00:028c _print_sl_out57 +00:028f fail_round2 +00:02a3 _wait_ly_14 +00:02a9 _wait_ly_15 +00:02bf _print_results_halt_4 +00:02c2 _test_failure_cb_2 +00:02ca _print_sl_data58 +00:02d8 _print_sl_out58 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f91d46142956cb2da784f7759ee9088a9d3c54 GIT binary patch literal 1203 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/test.sym new file mode 100644 index 000000000..0be27e009 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/div_timing/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/div_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0232 test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bd9276589dccc2256aa69325f37cbae882f7ad GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QICr;B4q#hkZu?@n8+Ai!4W zfA9a)&EhvpExfj$IKSlYid{21FHQ?!%vCt~t!}^Yi%-vQvo`Ehh>&6FZcZo^(BW%3 z>bSvT{gg}Fa(_Rz(LJ|4+F$n4i|BTlvU~HlHbp%B(!IrE{rUNOgg$d=g@x_&FZ_Sl z?X`e*M`_%1f#n|En`NVVt~TX|#uv&zKd^c2uTNKw#Lt{B7PCfS`KfnhoxiPDrqwTJ zjaJG(8s9#D_L|Q}*L%eEe+``}A5=VT7L!kx{xR+Pf;{=7afa(%UaP&nFk_B$*N?p) zcg`t)yq@{GZsCb$kn=di*bhEJadTzt`y_*`l>1$mygSw2L7xJyecM)4w_zS{(7DPlWfxr^?V0{}(h<$) zHc?R@?$ua7kI#;BZdvzU^Qn%}Q>mE$S!+`z_HVX%toihf;)~yWZjN#~e%|75*DufP zF579hU44h>e#Kc^T{5p|wq35^mD|d3^Q7|c&3zlYmv(FaU96JiV42H#v#vBH@4I5W_}AOOg=rto&R(;!^2tK)8HQ&{BIMhb$F;$Cxbj#tHPWrVp85UXP`dDfHhWK#O~jlXl^=qiH3vV4ej#GUUw5je zpsOl>tMStAKI8LNrFIqfFU9PMPdJqmH0S!6nt~%X7PoA&w|u&zR3&HgRZZJ(pIv|Z zUipW5PYymZS$DEX&dlZYp3|jD-(~6~3rGY$Yc;@8Kb9rA=@G;e1 zb^n@r{?@PMp6@-vv_dZjzgo0u&iSpglb#)9y!m@ohIpTM)4FcI|Eo9EulZfDtF6dN z{MG}{0ww-w?KWuX4H}_y<}W<8+dJso?X`uD*`58yjL&%t#m>L3xuE|q<57s-u|=Ox zt@?R?l}r8e&l2m6J!>M{X8pbXFkXDG^Hc4`N{wr~_*71PcNKR|+&`H~o$=gz?d1h2I-Blpso;)Nj2F*8xVdxw`tI!s^>Hb!HMSWW6GTcb hqUH&#?xT|6AJ%$SA-NX{mkxkR9#2<4mvv4FO#rs@KBfQw literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..c1584a879901fc42b4ea73a0c0274071dc03b254 GIT binary patch literal 32768 zcmeI4UuaWT9LLYSjrF!o?X7X{wqERQ7E0`@)LLd%vTG7=+oa9b($)!G!LG$BxYdG= zb(+PBdzkpLfiMSUlf4WEqYMV(1PLn>L(B#P9RnSG*nH?z1UH=B*6jSwFXyKEtPhUg z50l>CpY#3w&gY&}@IecOCu8RPsPbf#AFnE#?^nLRJuz{mnpKq@VkelFRWq%&;r)|r z&GjpjH*ehd`Qr;0_Ki=jxpn2n^^ZTjaDJQp=D~xLd*9i+dEc0Ic<-UZY>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;cv=XgR~Y;&_7!fL{Qn;hc&95(D;i^(2Js-bm3fGyQuu+mrfu9944P(TWjG8g zMn_Md-oJnS`c0e4%OP)?7Pq>(rlz_&tVdmV2GcZMhYDTCIQ-=QO@asFkZ*1_P1`oj z=4SA~U_jf3Z}jE2TmgPKETg5LSg)$6ZCQ~BkGYrtyG}8n>9FE02 z9>cJ#v^f9LkHxSD)CYs{cq)bZ>2xHLN~x;Mhr{4Q2dq!0AMOu&@R50Zwry1{?E#fb z`;|TtDla#T(NV)d-Y_#viqnFJIj8|I6mlHc4`a9*cIY^>v!_pwj98Xw8r%W_oC4~n zryU1A@GaNRaC4kcNai6c^QlxMGCdvPmP$dsOy_f^cM}^ zFYXT&pnhduRptKs`(;1K>$=zL_v89w$6!`8?1y`i@ALR^@B`fNe8F6a#I9ZA<8nU8 z;3hyDwwvkw6#HB$l>k{17=5G*TZ3$pwu6F zH8s`OV;;_6>Guo7j&mCxo|q`*;S8+w@eJrX-dXs~3SFSyGi8* znkMIiRc&p_B>aT8UNZ2fzq(xS_f;A9ck`zs{wm`yh+MQ*`JSsX{@9*vWHSo0=H?%C zH?n2rEE7+WLN0yzuCsj7TH@aySWCH!*|~+-!p?=>g&wOlr}WDGkTYEcr6Km)2(X9LcXw9_62U{_!o1p<%j>M)xu)@p*aM$) zZZ{ufkMcqSMlIuKBeyfSL+KQ*8f8i!CORy(q-6S*Dl_MUwOmx$hw(;>tuq>ww}iK< zua^rLy7HcIH8^YBSgw~#o)Iy%iz%PsQjla^vO-FJgYlx|W#PG!KMB{B1TKqM4-E!+ zg9pM@V@xUQ5u1SqWxRn`HrRmiVuMY>a~p(&>o&-}#wC*?rtW0QtGE;-RW4a2B_}an zluQZFl{_U}R}yCa1nXhuao*rd;i?W(&S3%?tl|yU$Ob=Pyx8D|@Z1KsgzGlQ9pI9z z7dEeUGNn>Hm4T#(OIAxsKgNrat-^C9cL>*&gqa7h9%eqo8@w)DHO`a+n1BYWc>`TG zIDzqEgAax0HaII>w?XbGm;749)Fe|b;!=<-=aMy2@*2jAlD`VimAofhSCY@1ZPaIK zSwy+JI)Ar2Te-}F9)Fo}Kii#a%|D;awHj6YF5GD-XMNs^tX*?>Y5g-CY tfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOepN_z$*wNA&;z literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/test.sym new file mode 100644 index 000000000..f5d0a7625 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ei_timing/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/ei_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0160 test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

wrqT1$-OT*KbDJDDWA&0<25T8IH_LQ}!J zTBx3}uG&hP)~!i7&?IemKH?EZD%p1<(fE3ch?`!46Nk3PD8?~{A)*f(Q8w)fy; zY-);eQSM@Q+;jNSlDG1lz09vK+RIUI)zNDiN3E@PWxCz!L9P0L##r&xyB`Lm!iuN4 z*5!5&NXxId9i=wVRG}r}%KTqCdH?Il4qR8Zc3s(R&DqT>yJFS9a5=$i&RlcNnR;{P zwLIr)JX^gdTU{NA+Q+Kz1fuEH%1ZNwI`oDe4hGh>b?Mz}d;YLJ#?1dI>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vOg5P@Qoz#r>2sYTL%e>|@IgKWJnjOjY~5?oqi5{W_qKVaAO?(Rgw zvN}3aDahEf=jhRgAMWbfvLzSwRJ0KATXfgz!i0Ql^LL?QqtP^#&}i5+P0legU>YMahFRxZknL$x@kgfUAHXI zQz_TgG}E;0qS*gZcU|lO@rgt>TPR@tVlkaA6jW9EQz_7)1I8DNt^J`Me54=m9Y<9g zYrx8l^-3KH1%sx!XOC$jZ%#r0tYh;R0*s$BornCu6B!w83CG0Z=F7-mJmez+F-JdYd!Jb-1hbm`VHgC^9xZRSWlii zw81r%QdP$p8tU%{4amU$otc@Q1|0;?G_GIe;yA7=@=_ z^Pab3ho<3bl1bnbkAolfb{(fU-=NDAsp|(0z{=zCM54EM+ct=Yx+usOY;$u{Q$QW= zLAG!2>w|}m8crym57?%sXJ%X%c4|5edVfFc7C3{dV7hHvUmx@ZAFkdsVRqCFBb9;) z8vUVHPtT@J=!ZSn_DyLgs(Ka>j0p+!iu_xVs!>3ktIr z&t4vmvK8e76Lx#gfbHogX5FA(fj;2kR)=4PA2{cZz1_WgtWYcq_@x^md|?7ghG5J!-QJ=4Rz_p|y>U@B*fx z{9ULz>@_Z|GQvw96E<~-DX(KHlw`bQyDWJM?e&u9gyxt0M5umA;Bpb;p}_=ia9OCT z%ap)Qu^4C&;0?mE!L4YoH`pRHzd=%{euK&bykuV3)B&d4kEu{n5uY0vthA4wB` z7m%1q3_z~~x>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F w0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpH=V%$0X?)p^#A|> literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/test.sym new file mode 100644 index 000000000..ddf7da6b3 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/hblank_ly_scx_timing-GS/test.sym @@ -0,0 +1,219 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/hblank_ly_scx_timing-GS.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:03a2 _wait_ly_6 +00:03a8 _wait_ly_7 +00:03be _print_results_halt_1 +00:03c1 _test_ok_cb_0 +00:03c9 _print_sl_data55 +00:03d1 _print_sl_out55 +00:03d4 test_fail +00:0404 _wait_ly_8 +00:040a _wait_ly_9 +00:0420 _print_results_halt_2 +00:0423 _test_failure_dump_cb_0 +00:042e _print_sl_data56 +00:0438 _print_sl_out56 +00:044c _print_sl_data57 +00:0458 _print_sl_out57 +00:045b standard_delay +00:0473 setup_and_wait +00:0473 _wait_ly_10 +00:0479 _wait_ly_11 +00:048d fail_halt +00:04a1 _wait_ly_12 +00:04a7 _wait_ly_13 +00:04bd _print_results_halt_3 +00:04c0 _test_failure_cb_0 +00:04c8 _print_sl_data58 +00:04d3 _print_sl_out58 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4cc1095ac76045182ea615a70719f7a873b83c GIT binary patch literal 1199 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QH$r;B4q#hkZu?@n4}Ai!35 z`g?uq`PSu1tTPo=Bqi;4<(Ii~B;RWJ)7XFg_0|Tx`fzrJjS3MmEZxlsg#tQ!O-CI! zSe#FdlJIe+h8<^Fktzj|gi>{uyC8G9xf>vGb zp8n4{zrHuVo@Vi-8RS3?G4_LxP+VOp_ddxWJLSGtx=n3*(Jt$)9Tv_n#cf)RmgJm$ z&*#T9Yu>=&B_;@FF#~ge_Q-Zb%*}- zUDxx!zny>iolr;iN@cIa_bX@G-?&-V)oCerJ)U26 zNtfMIwMB2%U6!2BUzdFJ<@`rQPHB^mo&K_BlAx9RpRNCXad=8cF7;WWE9w322AAjW zgR(CzH2pp2*BPX!WQy``e({Fgf2P{zRTm=vUVpiE-hzKs8sh7_w|!DgtZV&t{qYNt zH}$K&{hq!Q-DKsm>(d?tmo0AQY;p?|w!f&qzUbqw z7a4!PMJ3Pqcc5Bu{uAYV4=J%TO#cbIu1WEfo&^-Qs`x&pLbWz_NliiPg_b zpDo{SY&dmV^Tv$VV$rYvAHKQp)w$n|cNX20w9VW3xBQ*%q5UWRYyC>J`Ti>P&yCit zccWBdwjICAQDqTX?Y#T+zOH+ptv)wME@yEUS9mQF_Q(8Tex&IAT1CCc%RBBq%He&w*Set z-B149U6Oh)xcaZhrz4W?m)x$czjJZ6{keRv`f@h&)~WT-G@yGywp0^+|02 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..ee87fd9e14b170cfad0e8d524165aa95e3521a61 GIT binary patch literal 32768 zcmeI4e`s4(6vyv-&9c`f?Osi-Z`)&giJ@e38?_r6OME78uWhnMTiVV^Eo`=|8%*b5 z{-`r%9rF)m|0oRHVCe84L6IT|V-9ApI2N)f2r9xR`9p`)DZ?qc=vwc&C-4iC!jH&z#vcvA5;Qg-aKYzjfyHM*FF!pWeIkg`Mknja$#`-2V(49cA2< zjcoldA78ub&cA9^`Smrc8cr?PYGtAPo&pK1d{!B(-SgYWuHCB@zW?&m-|n4Xm}n#JAEvk#}arejrYy^@-#Ec^30Hd|6`3!RxhpK+rc zO_v`?mlyiO*0J)u5>76Z<`;K!;2kUIZ)jQ4uB~eBxN}2<88;NaS`KE7KyNCO?Y7dX z>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;xYY#miwyopeUY0d|NqAWp6O!KYQ~tRK|IE7@i;_sIs8Ce(^jpD#Z0rQDUpB~ zJ9ZpBx_ftf`Q9E{g}a<-wruI`MSatZ)C`|5 zt`8L;fAP4g%JmNp%6c%a>%m|og7Xg^gkI6G9`XY2K0`;t|t=ELA^fI z>gZUp0>@zw)_=c1>=3un(aFjBIP8JNKJEcs$1@ARS)mH#o2IUJa?^F>FImYQ1J6Im zP19t5FsrL8n}u(9>U9Hu>VxwuBB6ls`!;@eAQCYCfXG>EN$Bo?@$3D?Fq>AGH8Xp? zFU;nZlT6(4H_7DBFMgFw>1=VP;#4+Q`YT)P)=JX;tI{{Cr*C=#&2;+Tyn&{b6_g`s zcnM9@P)}cGc%)}&n3b(8{KVl})e5I#_bW3ZCy*K*?im`%3_Ri`#WDv@#qQ#X$`>Lf zIMOpbV!;b-dR$hVYc0GqcSj*N7b?`7W5=qY!nW!ih3yB*?b#RkX9fR+s;z|wW6NO1 z<<;|T){k7%_*SfezbR*C8*gO0a$g2oZQy&Ov^n;W(j#0o#gqXY=(bo@DGXGb3a4YO zTvXYG@vz0(jMd7s!do)X&jk!!d0Ds`>@{wz)Xyc4iJ02Ul(%szNHQ+jC?!9_cun%W z@I1+{h3iQImpROb0>iw(b>XTGQyR92#Xx}uULYt7ti*V&z#8Fs1>(Z>3X~q_l35W` zH#6l?oC=aEmkdbBy%?`a=7i@-9ucl52|d4w`OxzOFYvx_RhKEJZ~zJ{;RRY`fzL5s zD{x78UV$sZ^$L{sa7oq=i&uM?(j@L0K+?x0o26s~<2A`n;dzn|3D=W^o`*0Wdfv|q zJRw{)&6GVj00oxv0=g`47~{19uM5vBa8kHlfzpdy@#m$A`Qmx#lBK!`JQa4(+Kdh@bhXv8wfTQ z?PVwDo8s!ZrRO>$#gLN90zkiIrFa)`fL1CaGSpiOg+jbYNO@Am9WV8u3~jzS^$i(! zz0`MQsORR?Ph>pprG6>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I MhyW2F0=J96-?H@kJpcdz literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/test.sym new file mode 100644 index 000000000..ef6df762b --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_1_2_timing-GS/test.sym @@ -0,0 +1,203 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/intr_1_2_timing-GS.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:01ab setup_and_wait_mode1 +00:01ab _wait_ly_6 +00:01be setup_and_wait_mode2 +00:01cb fail_halt +00:01df _wait_ly_7 +00:01e5 _wait_ly_8 +00:01fb _print_results_halt_1 +00:01fe _test_failure_cb_0 +00:0206 _print_sl_data55 +00:0211 _print_sl_out55 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb77961da7e3261e5d57cdefc5e0db8d295ea3e GIT binary patch literal 1195 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHur;B4q#hkZu?@n4}Ai!35 z`g?uq`PStItTPo=Bqi;4<(GxZ9NWVAGgyB8^=!u2f9w1hk{mZ!aEP%Ve54Q|!_wWH zP&n`OCL6i_uVt1xdhfT(-Qrp7Z<|{D;nxb$Bd0F=zkFtMzy6ey4)=#?K+_c&E(J#L&%X=#i zPCF6&@%`cDleg~w5vqB5<6e!^%eTx~s@k~VN0QBH>EFKsb45=(ZLx}+ed>wL(yseb z??2l}|FOf?o$k*i-P48t*4bXWlOuX z_`mAb{fpO<4&0e5aqi~r&s)CrM}1dMEK$proE^Dm8{7O%(sO+TN;b`kSbo?j{F)X} zci*x1>rJ1%^xw1o(d0c(cs(ySMP6_LB{^6;BGTdKnX9(gxm?}%;PR$@uh$2yVYdkG zx%%1a_2v7KGrUe8jM=i4_r|aP1*I#hKGZ3d@8{fU+dl2_`@{d$ekIntzk2$|M()>j z+44nSo;{p)^p^Ck*l)gH=3SquKcg_KpoDdkU*gkx;eXQ>{d%YUG0LR(yLCS9z@(9Vl{cuH?P$#c2na)0CfLTw3l?2g6i1FV9RpO#NP6|mXv zv*qjR<>nWcJ(u*FcHehZo0R_6$X2_4BFMi<>`Azf(4S%l_FW zuNTj&Q>*;cqnxS!I^6E!Z2R*U*MG79lg1}(*4qw1ToLq88cYH j*#Z%qSRF$R!E^TPahmVW?s>f#R0w&x`njxgN@xNAO_xj5 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..aa8bd6e1310fb12ed9754983d399882e70a6bee0 GIT binary patch literal 32768 zcmeI4e`s4(6vyv-$=cT@?Osi-Z}YLe#89%ijjj$COME78uWhnMTieb_Eo`=|8>n+I zf7C5z9r}mjKMDgU3?2R>3Q`1N%)tm2Wg(4%FlDew{?H+Hj=>bSs;&3jll#*7moS+q z=g_>obMCp{bMEKeTj(Esi;Mq^{h${A8KGOO!e$1PFMgVsm~CPK-+uNI3$iArwXA;S zRn~ldcJIXt7tXzP>eTM>z0H?qFPwktol__8v7dVS>AkyN*tLH5nDxxA{m-zG5ynlq zhpoT#@YO5s!mHLizrJqGhf|BTT3IZ=uRub1RvExse)s6rjauRRv!DI4aba;ftQDRQ zHxv|&m9O{O^>fVy9w}Y4wYes7cX{T)G*@)EZt9|MfmzqYx6is}Tb0ywW%+No@)=N7Lo|(&fdzuywQ?RKv-|(!$c-4!mat>wL}2+O$>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2;4k@{1StIQeWcc$^ZZHfM>eYw5l@rp0Z=iuU#uD=;5*;T}xWbR9Bu9pmur=LT^Y zU%S>cZQC^0t_2Sa8nkV=qA#y<2Kb4DjMly}UsX}tvXV&{GmL1|;TDY=2Kbt07@)0b zrU`x`;W&Q3VOUmP?0@My4%UGDSS+2+w_MA-Gg38tzPLVAfc&N7sw&q%Fd*x}xUL6-kqFK|bO?Gy!+N+D`8*FF20zLT_ZRe) z$!yy;J}&!%5!{6^Kb49^T3c&+wf%zYi^t)#fFb{663>p`58cA^6>}RJ0ywVge?7mD z1%`U^++hr^iG-@!c27@N7kEGh_V3u(=qUJLc&2gvDmUA99GQP9VxSDtz_(Y>H4tu+bQ=D(`<%!g^efwbL(P%8z(XnnFI(b2In$AO)iOoHFl1-k{#pemTITi4kMbzuxwZy3-! z`nsM-KnJz@P^-OtM+H(RV)Sy_;`V!EN~~rs|D5w&nplY zu2-P+7?;e7n7V~2kKk00RJmk8O76vYRWc_$Px3Y4dXmud+n5hMkMjZ_3RiWRasmgS zz%pK-Sr+&b=2$O`G9ae zN$7bH^P%VcyujnaRnts)0tcW#Jujfk0xw~_THp=gc?FIO*DFvu$R$4(F*VDS(>N6* z>$v1{DfuAsV`sYEjBK&m_On(el7NvI?8uvOC3gl zpM}e->sWuVp=d8ZzR(y~Kd=A1BT@`0sVo4jv#b>F0uIof%CHReR70T>Y5g-CYfCvx) zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx) WB0vO)01+SpM1Tko0V4445cm_?t@K*} literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/test.sym new file mode 100644 index 000000000..e94a96a1b --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_0_timing/test.sym @@ -0,0 +1,203 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/intr_2_0_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:01a9 setup_and_wait_mode2 +00:01a9 _wait_ly_6 +00:01cc setup_and_wait_mode0 +00:01d9 fail_halt +00:01ed _wait_ly_7 +00:01f3 _wait_ly_8 +00:0209 _print_results_halt_1 +00:020c _test_failure_cb_0 +00:0214 _print_sl_data55 +00:021f _print_sl_out55 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd6ee7d848ae15809faf9bd15bafcd0d8e818f8 GIT binary patch literal 1206 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 UKm>>Y5g-CYfCvzQ{|JHK0s6R|nE(I) literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/test.sym new file mode 100644 index 000000000..0f55f61b3 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing/test.sym @@ -0,0 +1,202 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/intr_2_mode0_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0207 setup_and_wait_mode2 +00:0207 _wait_ly_6 +00:022a fail_halt +00:023e _wait_ly_7 +00:0244 _wait_ly_8 +00:025a _print_results_halt_1 +00:025d _test_failure_cb_0 +00:0265 _print_sl_data55 +00:0270 _print_sl_out55 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..0090d69bcab0bcfd1de425807d9e8eb6a6af46f8 GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|S$lr;B4q#hkY{F6J$AU~mY$ z@#FvgGj=nC!ek3VlZuPaIbY_n@Y~6E@Z9N5J|%yDeq*wjexQ))IH!zy!5k1Hc3I}E z=Rf})*ra3r*!=#C>x*Ci$e4FMtZeSvho_%c)}`G_zh?hy@iu+Qy>~PIz5Q|h|Jj0> z|6*^RZE|~kd*04}`;5<@_LF<&_@ta2sK#9rI)z4*} HQ$iB}F^?-k literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..ee6e82ca92e219de00aa596ecf16084e105e9052 GIT binary patch literal 32768 zcmeHPZE#f889w*!X0u;OZcJEi!n)jDV%&s)A$%=ydD-1;l1;K2nt-&31w#QlR>Z-! z6w-*=Y8}V1oid|LnHKSb+SZ|+w&Pf5Fa<@nAzD9Zr=!$#T5OBfVQM={ROo%~$-Vc) z@rOUuAD#0~_TGJ;=bZQBx#!*_KhC{y;ghj{sHIOP&}STl9bKtB_pi;HPgJmwXFI!{ zg;@pjSI_>=U99re6I)+Db?Q%hpL}x5#;uiao;daD-XA^r#6r5^#v8Y8`o^YtTZW9A zH*LR}tzFAZQx>v$3!-n2Hx$N~6~-_0#WNSi&XYQEf!G-~8oybI%#AgV-x1PPg^>d2 zP9-ug)&j_*GDa$}A1IOev3bC}9y2I;0RCKww8kz2Sms44@&Y}kL>9zaf%?jTGAaXn zN{K9twE-^oSui6X@c$~2MX`mz{pB2IR1Tt2jVy^R1`+U25sds`l4@jWYzdfPz-AZ) zKy|2*Ww8{fP|%?m1;MQsIK?pvf!n1=Hx+%E;r>ljsndtTtm z9HT05ZwQ>vG19=5d)!*e9iwV+b3AT;e#ht{a4Q5Z;270_yIP1Dbc|}jeO=%}j?oNo z-xs*BV-x{*NZ=|QqnY5w1g_FC(!u>*;Hn&>I&dDZ+n?qb)q|TYaMg~{EO3_#oZ%Qn z!L1RvxMOrNxa|VB-!Y1TyI0^IaExYy`>EHxMh6@t1KhI$chE74gZt}8a|v)4ypg6@ zlCQxZJ4SQB%_?)bM;)UEa7)V~?XhLTnz#C(OTY~ZoVDbwKBy7gjb*OZ){?jSpi9Bs zEpXP7e-K7Va0koW-mNA75R96@9Thlh$v+IEW^k_woVDa1fze!W?+Ki>8)Z z+g}F8`a;gz^5` zz&#~!T`=C?LU6ALTsMsOw+P%jKJgK}7*Md>g%nx>=wbmJM+rLT8->!b@2X;=t zlmM*+RuOQ23#&o;9I&{6c|tS*Y;hpc5}S)F?oqvA8U)rOU}Y7w3fMIQ=BuRDz-|(- z@+!It*tY|2eSVGB0NX2Ifol3Zu*Za2f)~*jfc;j$LN&A&*hwKrxR$O4_D=z;m_h4+ zeIQ_!5xNFgbqTCgnJL)U`4DHvH1BhIP8i|P~2ZSA>U8UlAuFtR+B=A0)~Gi%P=g_n2q(ME8O z2Hhu;H(VQSXjzob7wJpjo(Z~7kFtsx7hf`O@$$|qXcM@<2%N7n5^J2lgu1Sz&EP%| zxbmu*voF1D>5A@t+5)aF_jkCU+h*!ah%BS;QZ!Xq+)W!SoN5U7_)CQTMOv99(7e_pt~oojfhh zL6F1a^@SJ4&xT&;jjN;MzHncB2q!B(4$sA(4xKis(?_eqKIT1}ecfZ6+fk`JailFA zf6b(ZK1`{gO7;D|);K#~Lj#HW#EyjbP@=;4cL~S$sgx+0W#r7#&1mPD@ve3D81IrX zkv%j~_1@Rm(R;$vI^M)96085Hj&BH~<8rIxIc$=Rjz@~hZ5HS^y0SgR&OD3cO4CA* ze!S4fttcS`X*UYl;wl9CjQ@#{>7)Wu0jYpgKq?>=kP1izqyka_sen{KDj*e*3P=T{ z0#X5~fK)&#AQg}bNCl(=kP1izqyka_sen{K zDj*e*3P=T{0-ursBZ6Tcx8ROQ|Nl=9cdtJGW^Zk0%x`V}PntG;Ofoq<%s;^W{#Y!T zj7EdObQ&`@Y}m8sy6Ym5rY4{Dwt;9Ao5Jhr8XN2C_;?=Ij_LPn8b)Xu$8pBqX5bjp z+#HP(MWfBl?hL=52zA;BKif0lrPI?ncznF7^4Nxv$pF>$h6Zd=ZfMYT_m=k@BkVT@So-}ZAko&)2P$wFaxn8zO($z+CyRn_LxY52&%$B&Fm&yRTc*gXGE zq^fQYJhI!b?Q?~EK3(6iLD#w7s2P>=YTm9lxTHa|R^$?VvH&Emtu;9Z~Vjr_ZJ@7rh3N9Q9W zIOcK~&#x@501^CX)Y|Fpwa4f4g~G~}+qM-7`8;@J;>J79W;bqJy}G9dThhVjazjG{ z1HHXnT|9m?nwT+EHYQBYo^D9@{`M_&hIGjlE`M2D{R|}3jAMeG!p10l# zzri%VzED?B&+641H`?`q;j0kyv)M$VwwA|)@2(f#Un+&W1;+KyWca<~^`cr_Uu$k4 z5aPV1efa*xC>W1t-*+6tF`ZUbqOPv?c6d+*>vw2q-8%R%eoyoM@%{p$T+SZP?-<+# z_WIRzO-rTlN(nxju|FTid!ZSC64n_V7jK=k<<&@_I};>n6E z7$1#lTB~WA#`U+A;b(sR@wyPd->wg{+S-amoN?7%gTLb!$LkX{A^n{-=C_@Rkp3=^ z!$w)noRI#XrKLFAtuW)z(R1DAE@5Rqv%Z=8jYp1)dwj>OCt(|@HiDA}{~@#IW%pz@+MBy4Rmp4wAfI`h)#H_yC0I(+8js9PMnfAZw$n#q?( z*Y7ml zrPFfNEK~Y9(QdHGqoe(kCq|!0R%4U%7LLaaR;$lezG``8{e5NtT~oegxqhrQ)7V&_ z8S;J$Q@faQfKNrpBWB1kJLGRTJ{9t~E=yHaSM}k2!!8yxSb4>B{TFoHA zGiHM4>;$toK9!)!@|*-I%XJcrU2TReTA13wl&knugnZfzIc|sC%JHd?!zfB5kC`E#w?ig4J{7Xn@|=(>EY}H%ng{rJ)V$qHaINL41*Tlj2_z_)30|}l+|Kc- z1mCkfC&7NpbrOv2GDH5#!qg&D4)du9dE5;7f*tY?9G?pLH_LNEzHPZqNVDcrT-#mE zGRoQV@w45f;CYtxCOrB(rS7rT@wvsZRy}0i3vbQ#vHozNL{=kP1izqyka_sen{KDj*e*3P=T{0#X5~fK)&#AQg}bNCl(I(c1#n?B^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/test.sym new file mode 100644 index 000000000..b5f7cac3b --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode0_timing_sprites/test.sym @@ -0,0 +1,437 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/intr_2_mode0_timing_sprites.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c0c2 regs_save +00:c0c2 regs_save.f +00:c0c3 regs_save.a +00:c0c4 regs_save.c +00:c0c5 regs_save.b +00:c0c6 regs_save.e +00:c0c7 regs_save.d +00:c0c8 regs_save.l +00:c0c9 regs_save.h +00:c0ca regs_flags +00:c0cb regs_assert +00:c0cb regs_assert.f +00:c0cc regs_assert.a +00:c0cd regs_assert.c +00:c0ce regs_assert.b +00:c0cf regs_assert.e +00:c0d0 regs_assert.d +00:c0d1 regs_assert.l +00:c0d2 regs_assert.h +00:c0d3 memdump_len +00:c0d4 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0174 _testcase_data_0 +00:0176 _testcase_end_0 +00:0187 _testcase_data_1 +00:018a _testcase_end_1 +00:019b _testcase_data_2 +00:019f _testcase_end_2 +00:01b0 _testcase_data_3 +00:01b5 _testcase_end_3 +00:01c6 _testcase_data_4 +00:01cc _testcase_end_4 +00:01dd _testcase_data_5 +00:01e4 _testcase_end_5 +00:01f5 _testcase_data_6 +00:01fd _testcase_end_6 +00:020e _testcase_data_7 +00:0217 _testcase_end_7 +00:0228 _testcase_data_8 +00:0232 _testcase_end_8 +00:0243 _testcase_data_9 +00:024e _testcase_end_9 +00:025f _testcase_data_10 +00:026a _testcase_end_10 +00:027b _testcase_data_11 +00:0286 _testcase_end_11 +00:0297 _testcase_data_12 +00:02a2 _testcase_end_12 +00:02b3 _testcase_data_13 +00:02be _testcase_end_13 +00:02cf _testcase_data_14 +00:02da _testcase_end_14 +00:02eb _testcase_data_15 +00:02f6 _testcase_end_15 +00:0307 _testcase_data_16 +00:0312 _testcase_end_16 +00:0323 _testcase_data_17 +00:032e _testcase_end_17 +00:033f _testcase_data_18 +00:034a _testcase_end_18 +00:035b _testcase_data_19 +00:0366 _testcase_end_19 +00:0377 _testcase_data_20 +00:0382 _testcase_end_20 +00:0393 _testcase_data_21 +00:039e _testcase_end_21 +00:03af _testcase_data_22 +00:03ba _testcase_end_22 +00:03cb _testcase_data_23 +00:03d6 _testcase_end_23 +00:03e7 _testcase_data_24 +00:03f2 _testcase_end_24 +00:0403 _testcase_data_25 +00:040e _testcase_end_25 +00:041f _testcase_data_26 +00:042a _testcase_end_26 +00:043b _testcase_data_27 +00:0446 _testcase_end_27 +00:0457 _testcase_data_28 +00:0462 _testcase_end_28 +00:0473 _testcase_data_29 +00:047e _testcase_end_29 +00:048f _testcase_data_30 +00:049a _testcase_end_30 +00:04ab _testcase_data_31 +00:04b6 _testcase_end_31 +00:04c7 _testcase_data_32 +00:04d2 _testcase_end_32 +00:04e3 _testcase_data_33 +00:04ee _testcase_end_33 +00:04ff _testcase_data_34 +00:050a _testcase_end_34 +00:051b _testcase_data_35 +00:0526 _testcase_end_35 +00:0537 _testcase_data_36 +00:0542 _testcase_end_36 +00:0553 _testcase_data_37 +00:055e _testcase_end_37 +00:056f _testcase_data_38 +00:057a _testcase_end_38 +00:058b _testcase_data_39 +00:0596 _testcase_end_39 +00:05a7 _testcase_data_40 +00:05b2 _testcase_end_40 +00:05c3 _testcase_data_41 +00:05ce _testcase_end_41 +00:05df _testcase_data_42 +00:05ea _testcase_end_42 +00:05fb _testcase_data_43 +00:0606 _testcase_end_43 +00:0617 _testcase_data_44 +00:0622 _testcase_end_44 +00:0633 _testcase_data_45 +00:063e _testcase_end_45 +00:064f _testcase_data_46 +00:065a _testcase_end_46 +00:066b _testcase_data_47 +00:0676 _testcase_end_47 +00:0687 _testcase_data_48 +00:0692 _testcase_end_48 +00:06a3 _testcase_data_49 +00:06ae _testcase_end_49 +00:06bf _testcase_data_50 +00:06ca _testcase_end_50 +00:06db _testcase_data_51 +00:06e6 _testcase_end_51 +00:06f7 _testcase_data_52 +00:06f9 _testcase_end_52 +00:070a _testcase_data_53 +00:070c _testcase_end_53 +00:071d _testcase_data_54 +00:071f _testcase_end_54 +00:0730 _testcase_data_55 +00:0732 _testcase_end_55 +00:0743 _testcase_data_56 +00:0745 _testcase_end_56 +00:0756 _testcase_data_57 +00:0758 _testcase_end_57 +00:0769 _testcase_data_58 +00:076b _testcase_end_58 +00:077c _testcase_data_59 +00:077e _testcase_end_59 +00:078f _testcase_data_60 +00:0791 _testcase_end_60 +00:07a2 _testcase_data_61 +00:07a4 _testcase_end_61 +00:07b5 _testcase_data_62 +00:07b7 _testcase_end_62 +00:07c8 _testcase_data_63 +00:07ca _testcase_end_63 +00:07db _testcase_data_64 +00:07dd _testcase_end_64 +00:07ee _testcase_data_65 +00:07f0 _testcase_end_65 +00:0801 _testcase_data_66 +00:0803 _testcase_end_66 +00:0814 _testcase_data_67 +00:0816 _testcase_end_67 +00:0827 _testcase_data_68 +00:0829 _testcase_end_68 +00:083a _testcase_data_69 +00:083c _testcase_end_69 +00:084d _testcase_data_70 +00:084f _testcase_end_70 +00:0860 _testcase_data_71 +00:0862 _testcase_end_71 +00:0873 _testcase_data_72 +00:0875 _testcase_end_72 +00:0886 _testcase_data_73 +00:0888 _testcase_end_73 +00:0899 _testcase_data_74 +00:089b _testcase_end_74 +00:08ac _testcase_data_75 +00:08ae _testcase_end_75 +00:08bf _testcase_data_76 +00:08c1 _testcase_end_76 +00:08d2 _testcase_data_77 +00:08d4 _testcase_end_77 +00:08e5 _testcase_data_78 +00:08e8 _testcase_end_78 +00:08f9 _testcase_data_79 +00:08fc _testcase_end_79 +00:090d _testcase_data_80 +00:0910 _testcase_end_80 +00:0921 _testcase_data_81 +00:0924 _testcase_end_81 +00:0935 _testcase_data_82 +00:0938 _testcase_end_82 +00:0949 _testcase_data_83 +00:094c _testcase_end_83 +00:095d _testcase_data_84 +00:0960 _testcase_end_84 +00:0971 _testcase_data_85 +00:0974 _testcase_end_85 +00:0985 _testcase_data_86 +00:0988 _testcase_end_86 +00:0999 _testcase_data_87 +00:099c _testcase_end_87 +00:09ad _testcase_data_88 +00:09b0 _testcase_end_88 +00:09c1 _testcase_data_89 +00:09c4 _testcase_end_89 +00:09d5 _testcase_data_90 +00:09d8 _testcase_end_90 +00:09e9 _testcase_data_91 +00:09ec _testcase_end_91 +00:09fd _testcase_data_92 +00:0a00 _testcase_end_92 +00:0a11 _testcase_data_93 +00:0a14 _testcase_end_93 +00:0a25 _testcase_data_94 +00:0a28 _testcase_end_94 +00:0a39 _testcase_data_95 +00:0a44 _testcase_end_95 +00:0a55 _testcase_data_96 +00:0a60 _testcase_end_96 +00:0a71 _testcase_data_97 +00:0a7c _testcase_end_97 +00:0a8d _testcase_data_98 +00:0a98 _testcase_end_98 +00:0aa9 _testcase_data_99 +00:0ab4 _testcase_end_99 +00:0ac5 _testcase_data_100 +00:0ad0 _testcase_end_100 +00:0ae1 _testcase_data_101 +00:0aec _testcase_end_101 +00:0afd _testcase_data_102 +00:0b08 _testcase_end_102 +00:0b19 _testcase_data_103 +00:0b24 _testcase_end_103 +00:0b35 _testcase_data_104 +00:0b40 _testcase_end_104 +00:0b54 _wait_ly_4 +00:0b5a _wait_ly_5 +00:0b70 _print_results_halt_1 +00:0b73 _test_ok_cb_0 +00:0b7b _print_sl_data55 +00:0b83 _print_sl_out55 +00:0b86 run_testcase +00:0b88 _wait_ly_6 +00:0b8e _wait_ly_7 +00:0bb9 testcase_round_a +00:0bc4 testcase_round_a_ret +00:0bd4 testcase_round_b +00:0bdf testcase_round_b_ret +00:0bf0 prepare_sprites +00:0c06 prepare_nop_area +00:0c0f setup_and_wait_mode2 +00:0c0f _wait_ly_8 +00:0c32 test_fail +00:0c46 _wait_ly_9 +00:0c4c _wait_ly_10 +00:0c62 _print_results_halt_2 +00:0c65 _test_fail_cb +00:0c6d _print_sl_data56 +00:0c74 _print_sl_out56 +00:0c82 _print_sl_data57 +00:0c8a _print_sl_out57 +00:0c8d fail_halt +00:0ca1 _wait_ly_11 +00:0ca7 _wait_ly_12 +00:0cbd _print_results_halt_3 +00:0cc0 _test_failure_cb_0 +00:0cc8 _print_sl_data58 +00:0cd3 _print_sl_out58 +00:c000 testcase_id +00:c002 nop_area_a +00:c062 nop_area_b diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..34626054e21293caf7b4334a9deed0b9d2ef9ce3 GIT binary patch literal 1214 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QH|r;B4q#hkZu50))9;BlR6 z`SXALIUTFVzZ!ITrgi<=QGU5iLh+AMvSRxlyZQc%vH$M8WjNAw;E}=x3l1GVrtW4i z^L@~%*I!qyzrAJ0UAwC6$!_y+rC#2#&)Uf7)8(?45BKcBs&}{@M2+k6kjhtjuH0{3SELxv})O z*rfiqtnuIUO??M6~ZU)9!$L zO=;G_+w??3-z+O~+w!j6Ad^8;U|ZJKwv?9_^=4L1tc|L?hH`*g{}=v!LXUJ2Yi zs-1Vu_vY^BJ(lt7Tnc#aAN`fR`+b^(j_=-|_fFiH^B}G0!dH7y#p@4#ZhotG*dR>s zr_syhfjQ^)_o%#l&bLQ_U+noQfw$Im$DSTMdM18-B=;xdzV7P@>s?PQtlaQE>E$~w z`{O-&9olxXbvf$(rOTRQuEb^<-?Ur4OI4%k^OJ*S`;VR%eK#jXvNFYYYi!T-87Wqw z`|KW_Q{1)HEUG70CiUKr6NgysPv5vY$8pY=Q;cyF*t;j2@UP3?sd6xW#}dyc2cH|f zTB%now%)IQUG#B5BNzQ^&9BA8{l#7%eCqz{T477byJ-Jn?GQx++ZR8IbnTK-0z~zYT5h$Hr3w$n3-bmndQ;5(u<4h zJa5Ez@4OZpBXYxT^-upV8EQ{=3mvxjwP*fspTFG~zp1RbcTy{R^2uuDA5(T+JjZfS zCA+K2TBmqJ+0M$?5|eK=xplEyF7D%+|741}N-6iAgbvJD1;_RC-(gR0E;auB*7$4e zZm&RTiR}`*kDI=_Y#%(s>-53BFD@EAxcI;Q>cYIoe|uw+H-1^jZ~S)t;r)uc*74nG z_cLeed3x|}>501xxv}IJ?5?4P=$!olRm%6T&Cq!bDwjN6{an^LB{Ts5pX5gP literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..c7b2b105288c4c5b3c86a482d6489971af04b759 GIT binary patch literal 32768 zcmeI4e`s4(6vyv-$+Fib?OvBz-{xa`iJ@e58(lXvmiSEGUfX1iwzQp-TG(t^H<)gN z`J-+z>(D#(q*uw?^nTtFV~?vT;1U{(p-*N*TpxNwXJG;y1MN5 zXV}a)N+p)5+@Gl|^hK=Wm7p3)EtKaMw|3|qD-`fGFKN|QH?`fdA>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01>za1PY4`{)>H)TOj}c#{-_}V$*8In5IEI&Ta8HMDlt3KwQ&Sua3t} zv#~Lmgc&<`9y_*YPiyPiwSfSPo2JEW<;u3Ul`AnHb>SXN({vp&bRFaH?dJw@7;kSk zP1`oj_IB{Vph4S)EBf*(XMmqf%4q!?^HmkKEi09RF~f+(9B#3gVSuk`h5_1|W}4t9 zlaAx}8-`^S#QvAQ<6sTQkH<5ad>-`+g;Xk^S5-NlOo9&;Fuzc^xjyK@M~>sYZL4a1 z4X9jSuk?{nAYd3fcNzxrhMu8Q>=ry6gBJZmye1$Z;5zSzxFq z&mG3#noO#yZTIwab%6(DVE>MdjgEp3hG!bruX3|($C3GXV&D|W{c9Myo=E82a5iI` zH|KJ$yLq$UkE=-}fKMz2=(54GCbR;|Ku*n{=oFAzJ*ZDeF(qCO6LV6l&TK-cli!f#fn0{Nz?>mA&59r;UE za>u~)4{_5p*&od6?9Aoh8=iXIz@L2o?5b!uXk6RQ?+!(S#&w9Cv6h7I4jRASSBkJH zg;~=xH+my%UOCCc9e;UD;q2nK$CS^MrmIeMOSP}M)o!V#>_4i#GkWHxm(EOO{>e*c zT3AteB?IrBX&mhC%?=HB4-T=4m4lxIT<5gnsrY@$w8#mjhlaWbhqL_;dr9%^p;PfY zd7|>ANC^#h4-H%J4x4V5m1bLt&(AI|=4ZpjdUNdfT)4P>Zh3LXp-OA+F#oLLpYU8u z@qzd)x$C{GJ-Nq-*~Fm&Zb;cBqgxUq5{mpm?FY7bN1#;G95xMYKr z{21dk$+N=qB)=A}Ckb3;F&_#H@d7u5t2#{aZ54}w0zO_KBn#Yy@mhhk!t)9wgzFV3 zKgK0t!GE(zBwP~OWWSsyH3?Pf}&xbuOepG!7L$tcEak{!bHBp(#6CkZ_d zVm|bIkQaDdxN3$edvO2?Eae4sS>OeX*9yEQJg>k>;d%wihq>ejBBth;at5b@WPnR9 zlagOyye9dB@I1+@!u2G1&!vby)xuKBm8F#{y`{!^7WYSe#Jb^* za&zkIGVXe*@5)g3&8eTrc*aXTFGKtVR-z}-0KLQN7W|<|5=4Lq5CI}U1c(3;AOb{y z2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y T2oM1xKm>>Y5g-Ep3W2`>xsvk? literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/test.sym new file mode 100644 index 000000000..4cc8629e1 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_mode3_timing/test.sym @@ -0,0 +1,202 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/intr_2_mode3_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:01b5 setup_and_wait_mode2 +00:01b5 _wait_ly_6 +00:01d8 fail_halt +00:01ec _wait_ly_7 +00:01f2 _wait_ly_8 +00:0208 _print_results_halt_1 +00:020b _test_failure_cb_0 +00:0213 _print_sl_data55 +00:021e _print_sl_out55 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..42de5e8c0e5a501cc4f5877e3bf7302de0704cea GIT binary patch literal 1186 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QH@r;B4q#hkZuFHU-;Ai(-~ z+W-Hj@3rr34Pg>yGJaig>F=g&A2s190j5`vzgFcgIDLM(a6^QE4qwwz#|;)7V(bSW zDMZY9zAd-^_+p!N?MJ_UyBEAW@yk-@GVAH-)s9t_w>0n0dH#O>E`irfSz=*({fqzK zJ$6rVufpEXQtc8zx#R1OeaZT;^ilS^WSNRBrt{8w{IUML?%-J_qpmkulOy6hm48c{ z?oj^}^yl}7cPX;>|IE7b)FN)mS4HJ?NlyiheG=z?9o$%F5`A=+K=s@;v8hIUnMvD^ z9k*G3Y(M{={LaG`5i%^@%?X7VPX4JUyXW1T?~m3TH&N1;iAFE_P_atxa%$xLlYfgHR z=J`4Q{AOlG^gK1XyijRY#`?74l*)ixYF1BdEB<6vpEmfHR(WjK)IX;^ChdE7fcx0N zM`uhfeyf_bGvnB=tmz92o_(y+nEd`=T=#_8b4Aws&3T;k^2Nt0naO)!e5(Ka;oxdn z!Iw$psq)JH$1l3bD4O2LE_fum%H2u+UCpM+S9e#3%IV!(a_4So(fP|K?D^;CEP9=> z_vnpdk;j_9E9pGT%=dS?bX~UMphd)-C66C`3iGxLs`LOFn+|Cs3_3!8M&lAb% zS2(_Y+x5vsF`bF?|GujEu=>}(>G!^cthsmc)-|ii^Vc5atli(dHnxA?8;Df z`e~oH?_u<{{Ph#Ql(NTNaKRFdz_|UqFSN4s<(b0YC;qIn^$sjE$TKuMpMA#v|JfrU zQGV}SzfWWQ{?C4{Y}UJ)J?c3+)9lVBru_f?VSlIIYUcjX<&n%iPY<3gJ&{@+ASiFV z{qr9F-)g^3EbSCo%;p}x;GX6u{~s-%HiusQ9?|K2ktfew;(qb0$C_%NL>>d9c2VcL z@0o7WF{;7;FV9KNKX$WoN$0-g{g1;8_#in0YuY19Q2q3KwW|yF*nNKab?@cf8Sg6F zCOs{mJZs@K@3X5fEdJc{c=G<)B~nM0R%X=2?X=k~QGYtO-23-#&p7$7TZ~UmPM7ht zj=cY=^WLAzb#+Vszcf$2aby1d*#B`1yX|MFpSPH_j5SUrchNy^Y?*^72ZD1x@ha!k Y_bU3HWdFQi4XEt#boFyt=akR{0Nb=vYXATM literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..8196451a40d4d69442eb8d2f94f9ddc0ec5d54a7 GIT binary patch literal 32768 zcmeI4Z)jUp6u|F$$+Fib?OvBz-|Ay~jiF?78(ke5OME78uWhnMTiVV^Ev&Yz8%*b5 z{;4x&9r{7>i^9+eLx*1kL5d&@9gJX67P2S^DuR=I&?0q?!IW)LTkp9i_oeldf(Yt4 z^!+)1?m6fF-o1r>=v`X+d*pky`1d6GhqJJ`LFJPlr=~76v7qk=dzOV*6VqBYKK}x1 z{`$h9`HL67dhP7l{ga29FI~9!^=ogOegAg*kw+grwC|~XTlY^`kL^417#kgBT$J0{ z)>qbEz2YvuU{(43C97I)OSiK{TdgdW8&!z;^AceG{QQzt9sH{!<-iB7Zr2Lmeg4tU z+ZUH++qJ@z?F|J*W91utwzAM%;Fi+7tu8c)x65<)rg_T_Z#*^cTV&RC@$^~OZL5-+ zt*rUw2{yM?El1PkyVB*Q{&wqRd0cHzE|nIS&-dtCRw&?WUe&5?XzI9WTZ9?EDF@VY zC~E|JQ<-eHl}=?xSgZ5zTq^(Y%A|5cfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2>jm&>u#>PYfMvRZ2IC0=WYwM;>fdKeT)8evzeMiUo^%#$N;T=TNbR8me9qsV+a{)W} zH*Ypg+cwS3n?VDC25lSesLQ(?0eT`Kt@S6yt19NUtYi{=h7pZAT%u9K0A14z19EGc zX@Z_eIF8?M7?zb6>tE`QgEb&N7E7mdIn1BWCzH9Hs!D$%0XkH`_Y&(JA$3mW<$2DEtGbzwe?;b@ql>z+Dw;>6gPWtpbI zB^t#pAbxtV`$96!Uwb>ngA2e0(!a>?ZMbdpOh2mZQ_yrKTg%&AjyJj^_whr8oI zJbqc=Z`+`oCaea(U&gy`Iz2de_;5Pyy5NUOC^+L(YI1V-?o1}d1^kXPF)=i>YgcbC z<~PkqP4N5T{4fK=FZZkbj1Ke<4$6Aq*Y!{+62bAujzO;|SP$nSzvuDephvmj`hvbP znccf5CuM)&!Bq(3Q>jQ~-MV_d`g+0n#pAGBK#+ejiF?QIhi>8fim?q1LGvv*eYz%Y|+|xLJm5XgVj*Q101G_-3U&GM#cwFa# zqZ!+=Bb#;I9XtGfoJ~9qe4WvRQb-SFa1`)9;>di-d#5wLSdpXe4M{2g^BYRruDR@zb5f zb~d9hYj*BNA3wQ9InBfyKj$TXe)&N!rE|sEic{HH>96dvTPjKW*Gk`v zoDb8&3d)OVI3lKTsHZP8Jkm2X%*s|4e&TSiYK1egJC#`x6HE;c_Y93>2JZ8MVwt07 zVmI?Z|`}u*i&6w*n70xnthsIZTt#X zTMBo_*1(AQjf?B7A9zmV8!-odj?L^I-pF3%jtsQw<7=a|Gj@;CBUClTlmT>fTdb-S z2C9vP_hT(Qsj?sK?G{^SY*Zc>+Nyzmp1{zR=Y*=kTI0e>{XFGKVN-jV@+J<2l#Hir zkSRYvdoAU8p?N946sngJxGZ2i6d2|OZU|L%nBv96^IMf zD^Plnr_2hQx|1pQ<4{Pc@{~cD@(|itlKlf1w?LRDR+oIwW^ zSj7u8%L1RGy;k6&(7Xbdgz6P29poulKTKZjVM?QT^Fc~KPuV0>M$leM*(o$HuVNaCf=VO}JxJS^>w z7kW&ZcCHM4RoY!I^lfSCSsD7Fw5Pq$&!vf>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y W5g-CYfCvx)B0vO)01^1_5cnOeI-Q3A literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/test.sym new file mode 100644 index 000000000..ded62c5a8 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/intr_2_oam_ok_timing/test.sym @@ -0,0 +1,202 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/intr_2_oam_ok_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:020a setup_and_wait_mode2 +00:020a _wait_ly_6 +00:022d fail_halt +00:0241 _wait_ly_7 +00:0247 _wait_ly_8 +00:025d _print_results_halt_1 +00:0260 _test_failure_cb_0 +00:0268 _print_sl_data55 +00:0273 _print_sl_out55 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..00a9a878eeefae9cfff4963276d50f215ebc15f1 GIT binary patch literal 32768 zcmeI4Z)_W98NlDWxal=Xvok5-;@+Bz>jgKYnaL_bK)dk?d8v^g`l-DNrzU_ zh-6aQd7j%u`=fmUDIYqi8WmsQ3j_pGw^gbvDowRg149Ca)S?W*K7@gaRv5EJ!u!0B z@9e~@l#h%(kK(&~{=CogyuW+jJE>A{bMvz;?0QoA<=>{KZ|-IFHFIo{HL$%*akjqn zGHbkbbLPF>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CJ0aDIt)l5cps06>5g`|34mZPb)$f7Eq@>YI#j^;OlE6+$Ok{mkJrJVESKki znalIFbR<+;t7#`rXd3c{o}p9h7Buuh3}}A8X~KLM!_hE9)4X(Pd3j>OFmzqx;_+Y? z5Wlcsn(%|8H9pJ5H2r?d4_?ckPKQDZ3n4D)H2BLp@`n1^?4?WAc$j%61II`N;_=P` z|6mYwU5C}+a9HuC8H**8v$L_7X@Varq2P?e;Z$mDY+xYF1^ki7P@9 zt3UAIDunUju-mBTh zNIY(uM~*lgI2*qo_;@_vhqYb8DfTz$){az^*;$ym$K&<-e4U*T4|!3LFW9E1$H##> zT!VCVb$7!}M-4l)?hn`|CMG8%5m>3A5a>NUuv%ab%7STUXLmQ$1s~2{)1Y_MRW%TR z4$AeRR(re4g??Cr<>w37&T|kMpZ@?t1OtV7X@OYC2f2-F-OU#GH@6KdyRDO77^;&*qEwa|THncVvbgqShAFuUa=U=_4{9a8qwv+GG zIPcF%uf*V!HFd+${(+Iv=b8mQ^JgIaF?QI6zr?pDY2yItlh$qlgX-TLGtTirdb%>|DC~R^clfI8bA?5u% zWxJK~O|+L%-VmCd^7lfuQv#QDjE4dvyue37l_N~585EO&0tPQ|$SSZO?WF>Tgk~4; z3)L>L`Zb<1E^KlylOD&Rkg}Dh^jaxr&|XTJ7Mh*%6`|TGq372y9(qpk0zVR}Y%=Kz zI-r1?7xN`TeemxYdep`G1c)d_jON=6N^SCjTp)>~kXgsBtotnwpyvA>0j-_*XhVK3tCZZ6o7*Gt=*S{TC~Vrh^S< zH#FlPZ|5`XuAFPVC3kjR%e~#sy0n((*7x(*n_lsH>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; dAOb{y2oM1xKm>>Y5g-CYfCvx)BJe**;J+{OfFJ+> literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/test.sym new file mode 100644 index 000000000..8b0bd688d --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_timing-dmgABCXmgbS/test.sym @@ -0,0 +1,236 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/lcdon_timing-dmgABCXmgbS.gb". + +[labels] +01:5087 print_load_font +01:5094 print_string +01:509e print_a +01:50a8 print_newline +01:50b3 print_digit +01:50c0 print_regs +01:50c9 _print_sl_data0 +01:50cf _print_sl_out0 +01:50dc _print_sl_data1 +01:50e2 _print_sl_out1 +01:50f4 _print_sl_data2 +01:50fa _print_sl_out2 +01:5107 _print_sl_data3 +01:510d _print_sl_out3 +01:511f _print_sl_data4 +01:5125 _print_sl_out4 +01:5132 _print_sl_data5 +01:5138 _print_sl_out5 +01:514a _print_sl_data6 +01:5150 _print_sl_out6 +01:515d _print_sl_data7 +01:5163 _print_sl_out7 +01:4000 font +00:c01d regs_save +00:c01d regs_save.f +00:c01e regs_save.a +00:c01f regs_save.c +00:c020 regs_save.b +00:c021 regs_save.e +00:c022 regs_save.d +00:c023 regs_save.l +00:c024 regs_save.h +00:c025 regs_flags +00:c026 regs_assert +00:c026 regs_assert.f +00:c027 regs_assert.a +00:c028 regs_assert.c +00:c029 regs_assert.b +00:c02a regs_assert.e +00:c02b regs_assert.d +00:c02c regs_assert.l +00:c02d regs_assert.h +00:c02e memdump_len +00:c02f memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:015a test_ly +00:0166 test_stat_lyc0 +00:0175 test_stat_lyc1 +00:0185 test_oam_access +00:0191 test_vram_access +00:019d test_finish +00:01b1 _wait_ly_4 +00:01b7 _wait_ly_5 +00:01cd _print_results_halt_1 +00:01d0 _test_ok_cb_0 +00:01d8 _print_sl_data55 +00:01e0 _print_sl_out55 +01:4ed8 cycle_counts +01:4ef0 expect_ly +01:4f0b expect_stat_lyc0 +01:4f2e expect_stat_lyc1 +01:4f51 expect_oam_access +01:4f74 expect_vram_access +01:4f98 verify_results +01:4faf verify_fail +01:4fdd _wait_ly_6 +01:4fe3 _wait_ly_7 +01:4ff9 _print_results_halt_2 +01:4ffc _verify_fail_cb +01:5004 _print_sl_data56 +01:5012 _print_sl_out56 +01:502e _print_sl_data57 +01:503a _print_sl_out57 +01:5055 _print_sl_data58 +01:5061 _print_sl_out58 +01:5072 _print_sl_data59 +01:507e _print_sl_out59 +00:c000 v_pass1_results +00:c008 v_pass2_results +00:c010 v_pass3_results +00:c018 v_fail_round +00:c019 v_fail_expect +00:c01a v_fail_actual +00:c01b v_fail_str +00:c01b v_fail_str_l +00:c01c v_fail_str_h +01:4bff test_passes +01:4bff test_pass1 +01:4cf1 test_pass2 +01:4de4 test_pass3 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..414811dbed7d66673a70ac82ccca98be528cc901 GIT binary patch literal 32768 zcmeI4Uu;v?8NkoIG43TX={08AO=`ilu~HMIEJ{)9WyaVy*NL6jahg9w$}%;?O#qdJ zXap@#*G)zrR`q3-c%TyM(4?u_Ll+@UVvGs(4ynR2ZpE~2npCE+jZX5q3e+-IYjbwK zb9}DNp8B#E`hCLp-tW)(zVH0bIrkwFcXRWrE#%s$^!`5<7H(`KElnrL8R8<_h~nP$ z!`DdbM>iHfzIE%5Z(g}_IJ?;T$&Fhdz4_xSm!FP&_xSO}`BU>x9iG#d=T9t?>1jem zdYU{ndhxSTAW>2irH+J~R7?I5_x4mNopO^^c>V@FL%=r^rEuD(pDX=T@^+JB^Xq*5}iDHHMW2|Y7R+DPH6y=pjnB!C2v z01`j~NB{{S0VIF~kN^@u0!RP}AOR$R1dsp{Kmter2_OL^fCP{L5+R|S4FnpDMBvJGaTOy#4~K=d ze&_MB%ya8{GzvaV3j_=*fqa7o8qMWoS@^?Y(4hj4&*vYm5BcCH{QNl*k>&avc;@#qr4Up_yc0pc6|vMlC5Ix6ac zUsYW$zn_nPY z+cli*e1k4dq@pY>!OR1JV6dmByBp#mFBi@iYzqt1(?A`bLH6$L?S)0>8t+i757=gA z=H?6oc4{;VdS4&x7C3`4W7^%_+Y5EU$7io;&^y;vH5`Tx>h+;kXJVWIAaJg`RX;0~)^ z7tmKOUhnXGTC@jK^y##}Mf(?6uIgJnyIZu+pDp;vszmhlYhMidNL9K(*c1IkP5yf0 zH)@Jk3+o%kM*qg}#!$q)5smzNWAGaN>P_RPZB`Rs=F>KA(~@3Kz}Ib>$Kr#@@rn4@ zI4ON64gXHUwUV+f1)r7HSxif8d^|ojk<5(PLBZtdOTn+xK12ntOFGH4 zEtz4OKvShxnX15Eqe6U7+}Fnli;~azBv{@}ZD&fTqld zl#AS6OPOPuo$__2+9{#uw|G4CoTUZcVXABr=@NH9fg~+3CJKDO?X?28m}VFFgsFCc z;)^sT8HUNraUwOdrzS|5pedgdDgE4DOWDITJLLhU+9{#uF&+;+pP&T}F;z|w=|%2< z0>iYxgeY)^+iL~hV47Xv0#oe*#g}NxUoe}TBGOep6jBb+l;a}h@43B}@~=#@Q+~!& zJ01q;_YLBG7EFC030Z2kpGfzG93P!RprAoWrW7UVB1($#+|du+ZBPFR54 z@of$}N#%f**_yvi&nJX6ry-#$zOpo*U50D{Qi)nM=abwS%PyZhbPSSEXAGQeM!~19 zx=B>J`&jAjV4=B6f)0O^_Mk9W>?s{d7kji8`Xc#smy={%TMLoLFI1aD@_UcH*W)jE zq&!RO)b$u`9^O7rNN)(!K+WXw(C$3a&xGBuLw_wy{SSx!PS{O5^l!oxe>ikg*b{c> z_7UJfdrCEi7AP^P+gh)BuHWyvGkdi3tr0VQ`(9Z4^v;L(*UO|@CaXU3uKW0ijp%m#c-f=(cLbaf5?h5 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/test.sym new file mode 100644 index 000000000..67acc5419 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/lcdon_write_timing-GS/test.sym @@ -0,0 +1,230 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/lcdon_write_timing-GS.gb". + +[labels] +01:4d3c print_load_font +01:4d49 print_string +01:4d53 print_a +01:4d5d print_newline +01:4d68 print_digit +01:4d75 print_regs +01:4d7e _print_sl_data0 +01:4d84 _print_sl_out0 +01:4d91 _print_sl_data1 +01:4d97 _print_sl_out1 +01:4da9 _print_sl_data2 +01:4daf _print_sl_out2 +01:4dbc _print_sl_data3 +01:4dc2 _print_sl_out3 +01:4dd4 _print_sl_data4 +01:4dda _print_sl_out4 +01:4de7 _print_sl_data5 +01:4ded _print_sl_out5 +01:4dff _print_sl_data6 +01:4e05 _print_sl_out6 +01:4e12 _print_sl_data7 +01:4e18 _print_sl_out7 +01:4000 font +00:c144 regs_save +00:c144 regs_save.f +00:c145 regs_save.a +00:c146 regs_save.c +00:c147 regs_save.b +00:c148 regs_save.e +00:c149 regs_save.d +00:c14a regs_save.l +00:c14b regs_save.h +00:c14c regs_flags +00:c14d regs_assert +00:c14d regs_assert.f +00:c14e regs_assert.a +00:c14f regs_assert.c +00:c150 regs_assert.b +00:c151 regs_assert.e +00:c152 regs_assert.d +00:c153 regs_assert.l +00:c154 regs_assert.h +00:c155 memdump_len +00:c156 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:015a test_oam_access +00:0166 test_vram_access +00:0172 test_finish +00:0186 _wait_ly_4 +00:018c _wait_ly_5 +00:01a2 _print_results_halt_1 +00:01a5 _test_ok_cb_0 +00:01ad _print_sl_data55 +00:01b5 _print_sl_out55 +01:4bff nop_counts +01:4c12 expect_oam_access +01:4c2f expect_vram_access +01:4c4d verify_results +01:4c64 verify_fail +01:4c92 _wait_ly_6 +01:4c98 _wait_ly_7 +01:4cae _print_results_halt_2 +01:4cb1 _verify_fail_cb +01:4cb9 _print_sl_data56 +01:4cc7 _print_sl_out56 +01:4ce3 _print_sl_data57 +01:4cef _print_sl_out57 +01:4d0a _print_sl_data58 +01:4d16 _print_sl_out58 +01:4d27 _print_sl_data59 +01:4d33 _print_sl_out59 +00:c000 v_test_code +00:c12c v_test_results +00:c13f v_fail_round +00:c140 v_fail_expect +00:c141 v_fail_actual +00:c142 v_fail_str +00:c142 v_fail_str_l +00:c143 v_fail_str_h +01:4e22 run_tests +01:4e3b test_case +01:4e6f test_case_prologue +01:4e73 test_case_epilogue +01:4e75 test_case_end diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

sowt{Ib8((~h zt^DTd#Pw^}zCLsD;(@V=l|Nm*_RX1d7vF!te){m?iT%&*-+ExwI=cVJQ8qlxxG4{? zt*^yz`dR2h<%T=|l2zr;SFEb7SCW6)YGvVOIg&0voGvf)hOE=&b4n<&P?}#{IsKLu z@Hebn)~an-(RR>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;xZ4Es ziwyo3`yw|_{{N2$ywk;|)r>JsgLstN;ygrhIs8Ce(>82~MoqJ+DISLr`}UnWb?{(o z>!wY9Kjcl*;TSdY5!9Zb`79V&Dk7?Fs>EfO&d@HNdaKwHyH6a0AGaeO|*u&lh;|I&9H z>;d)BXgZzCp?*G}NaS*=D)aF;_|O6C^ZBLyK@UDMkKb)uRqJa&<@$Q1kA(bw!`Qda zFpxLQ8D@&J1rKvj170lVy09L`a5SvYbRa~Ievzl z>&9X-4_TSdFMf1ebWrr4Bs!V4;7$(ab8vB z`uqE3KgjEPAP^4Y_~XZ6u4vc~*COBNi4)*QxZ(bSd1W%YcaM$9`9TJEA&gHZ!{Ie+ z>U#D4g6oUL;Ix1t|3m`Mj?V|Ph4(AQHa0e6Uf2J9exV8s_2jw37(C-~RkiJ|uFg*I zfDG*4(b16+@WJp*iwZtTid#In1?-B z|NR276WoS}$H(h=*aM4w+ylCfXBK|5LKmnvOS63*Ogk{Q6Ka#AXy`&0fCM9b)s!c_zN` zi)!*$7T;7;x>TI4IF((M-b#<%Qc2i=H)b8IrASE!c?`w zh3G@dtf*;D4i2UUhBAGRdAG(yGt(EM_rlFFpNo-Z;FZ7J-Gu7VNQH_orIe&m|Qw_*+aBA(ejd?I_52Qx6$2EI2+ zyP}UMDdDO~ru1Q=(_&Sn&{u6LydQ1hqRIh`hb*?n*r+@syk&j8T)@zk7lf<9UgO3} zy@u)WV4iBOhAKWyunJ@;4_TZ8e9{e*Wf4NdJRg4xFqX^#j7c%G>LBwAnD_h zE2Lx?<2A{4;dzpe2-lN@IS*hx%=rj!@T73nG*b>?0vasm4RqPyB*tqEUKO6#;Jk3X z2Bl+M@;wn#vrM^!LqXEdC09wwFEL(|{7!hD>BtS``5v{#*>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I lhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5x7$X{s9;1nb!aS literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/test.sym new file mode 100644 index 000000000..96dee6c56 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/stat_irq_blocking/test.sym @@ -0,0 +1,219 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/stat_irq_blocking.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 test_round1 +00:0156 _wait_ly_4 +00:015c _wait_ly_5 +00:016b fail_round1 +00:0180 _wait_ly_6 +00:0186 _wait_ly_7 +00:019c _print_results_halt_1 +00:019f _test_failure_cb_0 +00:01a7 _print_sl_data55 +00:01b9 _print_sl_out55 +00:01bc test_round2 +00:01c6 ly_iteration +00:01dc finish_round2 +00:01f1 _wait_ly_8 +00:01f7 _wait_ly_9 +00:020d _print_results_halt_2 +00:0210 _test_ok_cb_0 +00:0218 _print_sl_data56 +00:0220 _print_sl_out56 +00:0223 fail_round2 +00:0250 _wait_ly_10 +00:0256 _wait_ly_11 +00:026c _print_results_halt_3 +00:026f _test_failure_dump_cb_0 +00:027a _print_sl_data57 +00:0284 _print_sl_out57 +00:0298 _print_sl_data58 +00:02a4 _print_sl_out58 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..b8320c44980d233f9324232988e06d7510cda872 GIT binary patch literal 1237 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/test.sym new file mode 100644 index 000000000..3573e7337 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/gpu/vblank_stat_intr-GS/test.sym @@ -0,0 +1,216 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/gpu/vblank_stat_intr-GS.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0169 fail_halt +00:017d _wait_ly_4 +00:0183 _wait_ly_5 +00:0199 _print_results_halt_1 +00:019c _test_failure_cb_0 +00:01a4 _print_sl_data55 +00:01a9 _print_sl_out55 +00:01ac test_round1 +00:01b8 _wait_ly_6 +00:0203 finish_round1 +00:0221 test_round2 +00:022d _wait_ly_7 +00:0279 finish_round2 +00:029b test_round3 +00:02a7 _wait_ly_8 +00:02f2 finish_round3 +00:0310 test_round4 +00:031c _wait_ly_9 +00:0368 finish_round4 +00:036a test_finish +00:c014 intr_vec_vblank +00:c017 intr_vec_stat +00:c01a round1 +00:c01b round2 +00:c01c round3 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

duzJxsu#V@LWxeLRGC?c*W`NBCT+Hswod2@x)!V8rh;yC zn#GEHnE0|mVGhbBgE1J4G8l*xB&;BYm<_^I@2|VV}Y_?zd>eun{Ys*gqsQ3rFyp3d zVVit6@7{6em{pl6H`+>h{?FI$mcpshv#HX2Z>x2#G^Mo0=ZkZ^=8RS0*SD?8@sF*5 zzi!2n7H#eFwkI}+nDMtVt&{>8!=HXGxxJmWIE6(TKRld9S!ifO$-yD3ua~v3!eb^) z?TG*pAOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z}|J1ab=u z{)>HqnJ|7w*9{P1m79*D(&?K5h_){DuvtY1^i`VFP$zFhSdfEBf*( zM}QxT$!P5x>s1xCEh`>}oMD8+4!3aFFu>O|!vJkfGfnVgF~{-w48yW=V*g9uaj*x} zM zm@~{2XA2(Ypa#5X)OBG!jNxclq3cdhPfd-CSe9uT+`?g;1=LSWxGsF)D#uT9bKPiE z<{>Nd*=#&MF%jpM%|gEBBX8(GIXOKo$HU5VIk-9w)Z>!{{<4*W4+KIX9Dnj8%oPp$;acSLJar2EFgM&^Ft2oa*RHWKIX}qYE`;%kL@3nUT+^%V z7hGR73a14O`N!jUc6>gVEj(W_cGY@1LlstuE%09gIa&+)z-FpHRfRt)_%W0 z>=d`*;qmcW9`?XOANPQ+Fcm#pNDf#)CKrfG71Fsh>?lYwt| z>NNv@;T~EikAyBWv9He+*|Iko62$fuX6XSo?7&tn#t6|yz8ck<(0E3c->9?K(aeMIFuY1 zWF;#DKT)_=wETt0Hf2WCG$aNGlLJHPzURH7Nc#AN$dkNK`9_ok#2atA66s9RWrbT! z`8RH@%x7-}^R>ybbCqCzcV%UM&+$@A<^=z&=AU4tDZf3^2qSK;n`^dy;hM%zVh#MA zJTtrbMD{4pq+zOcd~XzYMs_Gk;i?Iy^kJgYVihIdSEK&$-a5 zPd2f*a%XAjPIsYxjzxT-I^$lUyVzcOI#X;n8u(fGZJnR>1(p@;#`AOaQT58wEA62| zP)TF}px?3*d=_wk)+j?V)Kv`ygS<&ld0ECCuk@r0?Oa^?u8g~0=_fLjTwMC4jHkTP zZ)GU6u$10>^`O51DMti|01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x vKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CJ0aUncMmJgW?> literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/test.sym new file mode 100644 index 000000000..dc2e3d007 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_ei/test.sym @@ -0,0 +1,206 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/halt_ime0_ei.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0161 result_ime0 +00:0175 _wait_ly_5 +00:017b _wait_ly_6 +00:0191 _print_results_halt_1 +00:0194 _test_failure_cb_0 +00:019c _print_sl_data55 +00:01a2 _print_sl_out55 +00:01a5 result_ime1 +00:01b9 _wait_ly_7 +00:01bf _wait_ly_8 +00:01d5 _print_results_halt_2 +00:01d8 _test_ok_cb_0 +00:01e0 _print_sl_data56 +00:01e8 _print_sl_out56 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..de3b4f9865fc51cee35462c22d61a47a552476f8 GIT binary patch literal 1210 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/test.sym new file mode 100644 index 000000000..dae8dc6a3 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime0_nointr_timing/test.sym @@ -0,0 +1,210 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/halt_ime0_nointr_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0167 test_round1 +00:0184 finish_round1 +00:0193 test_round2 +00:01af finish_round2 +00:01e2 fail_halt +00:01f6 _wait_ly_5 +00:01fc _wait_ly_6 +00:0212 _print_results_halt_1 +00:0215 _test_failure_cb_0 +00:021d _print_sl_data55 +00:0228 _print_sl_out55 +00:022b fail_intr +00:023f _wait_ly_7 +00:0245 _wait_ly_8 +00:025b _print_results_halt_2 +00:025e _test_failure_cb_1 +00:0266 _print_sl_data56 +00:0276 _print_sl_out56 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..330cf4ba5be0315037f8db93e7e7f923d238188a GIT binary patch literal 1158 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Se%r;B4q#hkZuFHT#mAi!Gc z_wWDo&HOVBWfn#sQG2;JY;R7INOYD%qhDFA-F)sBpFY23NYLXDV?X#vAwq_wyE&my zK<8X?}9X!ibwCYXH^c{ayzrK0D zCBgg2%1`eP|5jYR@29Ee>y7)hPCHkfyCi&I$)}?gQ}SPZyZA=*wAU87O=Z0&EthoO zm%d&&PxrrF!F{3j!VMN^j^%4Q>bSw8|8XqOqO@TPd+-oOY{4Kf2(tsC0azfY%DqU^2lWS zUX_>kWnB(hM9i6}XSMDBmR&n0tkXB^Up|v>&)#!4#rf_vFP=1E?ZdDWKa9*Gcg=h` z{r}6V4c&47HyoQjx7B3xr!{ZWm2Ku&T83_#A3W#sJEN7X&-YxJwW7{?)e6a)&x)&; zU*+506MK2S;kJ8E+n>wq>ko;4AoAeT)%G=w7SmUy--~;mbHww#i~#H7gu*Gu56VYO zJ$2tzyT5t*4zK*U^`9(ms2{ed(0+Avs)cUc#-G7V@#&|sg64ViM)Gglk;v&8p4nY}yz znDCB!Hl3?qA3S?{p9SB&Z9PY?`TxHk5LMqEGxucFqkWm5Dy<&>seh|ydHf*f&0ni> z%=?^;p1J0?&e1y6l~TT|(PFOj+Wq(DG+uejw(hV6JnccE6B@^JzK1NePmQP#$>08r zb?qLpbjEWtlXB)=_pCc@Kigtz^Ue%y-Wyf9p^Nqx+a7d+pEgXj%RO2t|1Gwpck6@8ciwGzaFh3hRqN)2QuexOi+*0~tyn$l z+*>~J{fiCCx*9ExTI^uwFS+>C?(8MMrAqIm?k7&)E$k^?d;ED{G%%iF83o0$SOw?k z>=%y}b6uCM5Lu_cD^jFvy|KoP^C{ed&36SR{oC*P-KTJ_7XCWodCS#V1Z!HSo8W(js)AR)Gs7&KLFJ35tDnm{r-UW|V>U3e literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..cf04278d835f2cfdaf8ecbfd4d498cefd3289867 GIT binary patch literal 32768 zcmeI4U1$_n6vyvOHgS@yI&p0}>R=|@C2Ufa7^QB*cHEszl3lZHLJ}*a0d0a&uvJ0Z zrn+4t_MzfS3xQe)t@NePQbM61R*7}Nv6(*Q>tDvkuCHXZ701{a=4UIJR@d;> zS+?rd^}}~=-~Rr+%a;#~9$t0#`t4iqeQ^2GHv8oxM-K0QegEbIBi8Z#$Bwh1A;wMF z#x~bC|2f@l`-%(py<(+ZSzPg|uMkQUo=y}NdK#_sg-N9`wveB{=gyzC=J@q(YwpBH zmcOcERb{=lab?qETY}8^TbWV{{*>V#>>L=hy5h-Hr_1V{-2JUu_NN>Y5g-CYfCvx)B0vO)01+Sp zM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+Sp zM1Tko0U|&IhyW2F0z`la5P{_(kXdB#U+jzA4Eg^*9`H;Tn^rQ$G!5cmZj18}NvH7x zaZTH}F&s9{nwn@7M(o=+IeGA4eSLFtRTbn-)8e*nT~pJ#by$zOa1W+wx(*e(j&b<* zaf3MITUt!hwoS981w1gApl!nyeR-85z>h{{wET_rs*2i{6^lX6FhU`RTPS20;A@&; zfVQTYCiu~)xM*U1C7E7m9Rpz5n@Sy|NXEICsgC2Zj z9`9{iRm*EY%w{%!_lxp*PWW0oE#pu zEYmc&g+e$Bs2?A9UHHINj-TM>x{-*?LssU~=~!%hJjN}ZhJ4va-q3$yVroi`hm~hC zaCIE0$0rN?Z5w>kgx%ot$$HmKB>MV}9!(@%7xK^v4ObkGkB;u%olM5LLEdpjM*91A z?ds}6ebWq<44*Hq4;7$(ab8vB`uqB1KgjF4-yaO(_*17~u4vc~*CLC@ncxZ(bS zc_ov(caM(B`9TJEA&ig5gTb|H%X;Pgg6oS!;Ix1t|5yyqj?V|Ph36~AR#(?zUf2J9 zexV8s_2jw37+j-KRkiJ|uJ(5DfDG*4k&)qH@WJp*l>0-krl$4lF%NsN{QCuBr@0Lcjg6J_um=|VxCe9{&n*0Ag)UHUn!4V~ zP1ljXWF>bDJbynoO_TG3QEhFh6nw)|FB|ydpIuuY4AdGA_VBwC!CK=Fh+MHM15eZ% zzwO91vI&J*(=!jd8`->afr&f*&YH}%#V@VNU&&1uonl9^r?|_mE5_`uzfLJG+wugPr{YtYD?!Cj!?wEqgJ%Lzxyewef+0&i=t@CJU_U<1ZW4Vs1LHHZk;Ymk3| zOQu9j?O@9DI20sRE?Fxj4`aL}nHHWWc}}>VB+U7JtcN*|@&=y@S9O_k5fjj$k~df- z8+?QDQiI#V^BUY0uGb)ch)c2_SiIWFlp1kY0g^s0xl&37Fkn7I37M@JyTa8+N7JhB0 zV!i(AoW1(Od`(2Xy5eeUFc(nbDF9eyS#drKI6xbeK^f{Qg#rQIB%r(`>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la M5CI}U1eTq^KNGzjL;wH) literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/test.sym new file mode 100644 index 000000000..ae72e40f4 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing/test.sym @@ -0,0 +1,198 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/halt_ime1_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0175 _wait_ly_4 +00:017b _wait_ly_5 +00:0191 _print_results_halt_1 +00:0194 _test_failure_cb_0 +00:019c _print_sl_data55 +00:01a8 _print_sl_out55 +00:01ab test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..ff8a0a6848d16e122de0249cb3cb9cdafb6407ec GIT binary patch literal 1231 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/test.sym new file mode 100644 index 000000000..87bc44d5b --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/halt_ime1_timing2-GS/test.sym @@ -0,0 +1,237 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/halt_ime1_timing2-GS.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0167 test_round1 +00:0183 _delay_long_time_0 +00:0193 finish_round1 +00:01a2 test_round2 +00:01bd _delay_long_time_1 +00:01ce finish_round2 +00:01dd test_round3 +00:01f8 finish_round3 +00:0207 test_round4 +00:0221 finish_round4 +00:0268 fail_halt +00:027c _wait_ly_5 +00:0282 _wait_ly_6 +00:0298 _print_results_halt_1 +00:029b _test_failure_cb_0 +00:02a3 _print_sl_data55 +00:02ae _print_sl_out55 +00:02b1 fail_round1 +00:02c5 _wait_ly_7 +00:02cb _wait_ly_8 +00:02e1 _print_results_halt_2 +00:02e4 _test_failure_cb_1 +00:02ec _print_sl_data56 +00:02fa _print_sl_out56 +00:02fd fail_round2 +00:0311 _wait_ly_9 +00:0317 _wait_ly_10 +00:032d _print_results_halt_3 +00:0330 _test_failure_cb_2 +00:0338 _print_sl_data57 +00:0346 _print_sl_out57 +00:0349 fail_round3 +00:035d _wait_ly_11 +00:0363 _wait_ly_12 +00:0379 _print_results_halt_4 +00:037c _test_failure_cb_3 +00:0384 _print_sl_data58 +00:0392 _print_sl_out58 +00:0395 fail_round4 +00:03a9 _wait_ly_13 +00:03af _wait_ly_14 +00:03c5 _print_results_halt_5 +00:03c8 _test_failure_cb_4 +00:03d0 _print_sl_data59 +00:03de _print_sl_out59 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..4c77279b4a01ff71458cac1656ce9ee573f3126d GIT binary patch literal 32768 zcmeI4?`uaFRzTfNxZER@)()G9M8*)@r`ZPI3I>5mCr!LG$BxM@Mh zx|*dG_hRCk4TL!;o9xZTV3ff?oFHLkVu;ybpkrXAFE(FvZU}BT%hv8W&&hLBxBtMN zLvwS#=bY!9=lR^{DfC6}%F5a{HrJzk_uJUmjrGi1c7mN@KDM4|)%EY5WgBkaICgh_ z{-+PGTsb^?Y{R`9^S3|z_{!zo_Up%wA3OBcp&f@utdoaMoMeN8jGMBX?TFlZPzWYI zvsV@dJog9kQ=v!Q4|ZwUUv7T;=dR_I*#<59WwDIc ztt|SoJSBh2o?i5dyE}6)Cf4@zq16)sB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm^tbfy^p{|6*SyGo+t99`H<8n^rW&G!6VAZmZ+qNvH7xeofoD zH54+8|G@4GUs*Fb>prHfiXEKlXhkEdlalE%} zRV}RnE0@+QH4>_*FpS}0!$96JXP7C@78J%H2UIxhIIteZa5SvYab{-DpC1~sEYmc& z1%o&X$e);S9QeRhj-Te{IN`92LsZ7o>1cFfBFZhDhImOMZ|FZgJu@T6!^$%mxW?m< zk53l(+cs#^gx%or$b831Bzk(r#}f(1fjD$R!xhJ3qoV@@$z+Th#N+Xik>1|U&h~b! zZ<>Lk;q%4yVFk!v9amMk{+=G$58}G+^92GpergKliiZ7gE%JGuJ`Fm^4fhw!E14V^ z7#)@Kg9z?I7$1uT0yQ>kEhBw16T1XcW(m#{;v4=PSlmR(dh6>;FB!kOhYI zcqJ2KMjB$j}gIFg(+^ewCYT$Kx^|PYj#_xql5q*TZ3*8;)jd z&z@AuarW%-cyKl0Fz^WmAr5=Hh*O+z(DFoT+W0uEJQxgxnwz(8hkU4uhJ3*{Ha0j2 z)Zrd%=gyWEc<88bhVuD&@JB9r;UE za>u~)_i@uSIX@WH(vnKSH$3%{fu8vC`sRS&Ydk!_??Sop$v?)c$*+V@^--ci$AAPZUBRrua5MR-<*O*$P+qHTUElcB&Hyw1sb*Q_T%zDh8CAV)9m&4_w%$Hguu||7 zhU=1+y%gH3%!(Xutgo-Fw?EnalA9DtPF@N<%@dU$M2fG!t*_r|k0n!W4$Cc8XWw4j zlua-Cv!%(g3rqg&fu&8^gOi2Y)G7Yi%s>96>g)@ljWFVF{c?@tJ;|(4O zsm7U7)+rVP4a#@}pKP!N{lx~`gmN2%g>)O_U*RQF!l&+M%F8$uN~*l1SC%}6{$k0r zP;SX{Lb@ek&L3eu%z2bI_(Dk4Vag>8K!bALV1sP%J^G6c=7n+_+!NAmkUz>xvMyM> z+QyVBaaRT-l*bW6gVdods8e1bQ4RY*0#l%p7c2J3hOT{bv_ z{$hjog>oBQ6w+;wKgCOaC46d%DOYhQl&s(-H_DQ?&|fV1vruly2SU0f`J8hN`gApm zD)-kF?sw#>mRZOXC^H`BI`YkhXH)rR!^_XY@AVa|+gF*hH(p$>3ai)FU26{H{7NhZ z04ppj#%BQsXp7P>UF}7e-_M))mDi*{?xs#j*Z#*-KahUMP5oTD+8$5+M*0(O>P_iN ztxnCYl|SZaokV~L5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko r0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-Cj9D#oU?Nvm? literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/test.sym new file mode 100644 index 000000000..1ff5bc335 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/hdma_lcdc/test.sym @@ -0,0 +1,195 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/hdma_lcdc.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0154 test +00:0161 test_finish +00:017f _wait_ly_4 +00:0185 _wait_ly_5 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..020e83af2dc96bedf32eda6147b0817839b609a8 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Uz}PZ!6KiaBrRUYxaBfv2T# z|Gxj)-(yPnPph*CPO|FzeE-e0Bp=C6m!REy@4r{6__^~IqhL3Snmf~E<;If}4?OWm zC{i)7TtDT~w%nhkGsULgUc0?4^UKQEvfj_TrwN`uzt5Zh`PZMpWl1+3&z{q|ZF2j) zS=86K;%3kjHQn2lA$40jgE8k^rd-*0}wduR_9e>q7n>Wptz4CI?W<|sKp2}~n zm2U`rn)3Jg2lJDw^y_?2)ycd+RWyC#;vNful=(g3KNrc#pIs4Aw#fA4E#774^n8C^ z-0|)6n!nE%ycV-O)r@eX&91w>H7k=hyay{AV=ZDF zVq#dnyedB}uW$c&2G7O$=aY5s_N;%N^M7S;{lEAa*{oakua`gVUp&8XP1_5#$Ipwt zMBd-tZ~3fdrsToOA8c#)M=gG$<>sc_G~d^0-NDE6uSI?T>sNVf$NXvbKT=f|JfHi) zsnWpGSaDapzj3;*#{QC(k0mv~#o4&XOunA5Ug^n&KbJN}?An>X+)TP%az3B`?SuVR z8n0rG`(DpCpZ)azTBXCkbOoH;44%2KjXZNb->_-@oRrpQ(|5DTem1)-zQf36`Zc|o zDZVW)O1687C4~s~Y4EGDoAdk0Sw{RUQoZ}?2IKxv&ROj0%QGj2?{{AxeOypzk@)q< z&tl^K*RD6~T0ePxP`2P)>iVwl>Gw-Ryp`F)phZMWNN9qs$BpEsukJ*Ycp9$1oo_o;)% zuGOFKTHQFHwYN%Ld+U+7^ZNTQ$G>)OylT4G^P1uI6Xm*k>$>}%8MMZ(=|0Bp$|>05 zWMYXLY4G$`zg_G6v~yQ(yI(8+y;@}F!4unE*Ic^$EA{gK_JRWaTfe&2e*ORORlw%L zTK^rvI<+qjd;EU>L3)w-=Q~me(SO9{4lxeVKo1vJEqOIt!oy3+i!QIWqyiGOtZRE$<1Y%Z$mUc<$aKCyEAtJ z*G2z1sJx$ggTe~DWM4f5cpqS literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..f0e497f6f96c0cdc489bc03a9b7dbfd44791be81 GIT binary patch literal 32768 zcmeI4e`r%z6vyv-jrFxj+gIb2vd+v_RnB2iZBo-lQ5YWVm27)5LEidCL?nqxZ&)!X7}8a`%?XP`p3pO znDm_=_j}I$yn74&q2=<^G4uM<(S6dY>|($2?XTnGR~neNW-mL!e5`?K&CB0A${KH6 z*>(Ho&Fd%6pWi;VtMSg2n>S8=eE!@z`_0|EcWrxn+v@G3*1m0f_p#w&#!XqrR-gIm z{#2={Tq>8h{26E}+uDA}{2S}Y_65pMLTHfBlihNEt(N=g>Nmfyoh?rVwA}tcT~5(h z@nN^kO1>PA6t3Anm%QTXmaUW;#nWwjy3`<^?p}O3`J`U~=@9`UKm>>Y5g-CYfCvx) zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx) zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(49key@j@6_kGS@QpXJRbkQ2(*eZ zrfHB1b9=NV9L{9$1944Twk#Yr&HDOi6jp5Adi?l~9g7yNSW#OGdDFDGEneKxvUoAp zqb@vyX_~G>g|1^9etNh;9P%qynx<`==E{}efx&>b4d3X?Z@B{eXjDe4Ke1j_QQNX& zF~}K4D3st93K<6Ynr0ZFt!btSel(g$cszz-Sy^%ZrJqP(52z1^lgUg5^|RSnER#`H znU6-nhYnbu%|6;6^xz}&_-xy%THOOGSNAJ@Bve~#7+bd*2J(iPVN#qHJj_82c#(+X zz<3`lcDI7`|WJA1Xlo+`OvF{rC6FevsF7pD!51^@k3@ ztZ3K|_afit;ltpExZ(MNxl*Z3o5sfEe2~FY2@P5VGx;iiBb^Y=C3sqpKC+{7`;5!;sRom|BYHtS*$iVp>9UU0~9}Mp_?qB6* z+lhp%#~TB;K%QU2(Dg_}=Z32pTfaV?cAWL=Js#XmBm#UwA;`nouHY2+8+>^qHEqux z*m)=v4!5?hS_So>i-vq5Haqpxk49mFYJcd}(z0X;=HU!hf4@NNFt_31@$qUN&cIwB z&w#GuorT}5&;{yEQ`cL$={oY4tmKJ-_wVDTX>vYT)z+3y!%ukYRRe$G%;hCPzt?!M znLix}dW}CIa>1JCf6inA$$3rGkesU;ot9DGldKJ zsp-UY$8_&>kKH^Sv;UgzzNjaQp=9yJWU<^Euuc>wlL5YNcJ8tRpIW}!n#OsHv}Fw~ z&#VbD>LKhvChDcl4rZZDr*X#K)9jay<5e9o!Oe2^{53n>`2hM$c>M|h*sDO@$qls-(f zTWm(j_081h&V`$~sInd70gEj(mMd=wZ(d(77cg|?UEykQ*0`}kFPA(aVrmytKEb6R z$+%>ll>8Fo70JuOb0vQet}6*#N>~pK26=;r!c`MYsp%1$fd)0afloGAit$Q=6~c2H zM1<=$D7?lc(;}vJFy&QT3X&?9^h(KH7_UfXgy%{g6Rs->Gk=8jF!LC1@VRhRhbd<< z0S)Hy292`8cNniUxG6lh!5!hc4GKHCBEV(MQZk6~ie#(sT*-~X zbtPfu0j!6a_woj>3s+4tWhW+}!F=98mko|!ywczU;kgY?3)gK>ILIZx5HU5)lnb~N zBx|{3la#!M@rvY+!gD3>3)hw8Gv@>PWHXB?_vRPxb?576S=bY-F&^Z*3$4ZH(}h;U z%kRS7<+ZHOSC_Y&PS4gy)JyX(wFdKkC7uR=wU!m>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; QAOb{y2oM1x@E;}c54R4v_y7O^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/test.sym new file mode 100644 index 000000000..114073a61 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/if_ie_registers/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/if_ie_registers.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01ef test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..367742f57ed2db6e9a1bdea0008b76148f60ef69 GIT binary patch literal 1207 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QH)r;B4q#hkZuFIFv95OCWX zfA9a)&Ek2y+6GEIub+IMGkcrc@rl9$Ehevj|BZ8)K7Y4x!%l?=8J6zmghBxwzNVv& z8!XnRMqVqu``@qq=*w@nyxSAMEOq9ye!u=&)0IzKf~zdnzjcr5$Yd1d*1o%Z$N$9S zw-cf!+^Xz#?wKNYu4;whR;ikmKe~QPus_>&>vLx3{}emZ9T5(06Jv9QzLy7`{^!QK zu5*vbf6E%H$e(A|dqnlUb)6}9sc70X7PX_|kEi~dc)dSq^$fA3wUbL%_#9JoeRIv? z{O7Dc&kxjk%N#rS2;H$9V(bSW?KxMz^1;`X`yIv>jwwEV{ViH{b9sL|Y>3~$z5CE3 zkxvyh(~I(FR`Xd$-kdqDHnBH6Tjb7C3%5UizaJD^l$vF;?D0jlT^@5@Z!yl?E*+oJ zJJ0W0S*!Kk+{~&s(&C(JHxD12^V(HmABBAH@$Bn|#Ru)dSv9;riWAZo7@tNt{ReV8R;LFa@5@XEx7KGMZ}zQg&Q6#ZArTP+~`W#o_MLBEb*I!3u8;Rg!XJ# zH#qbn#rf^kX+kHf&)uH?|7>3MhbZ1}RSL%a7u6%ZJ-1!2;#nVH`s>-+&uqsmb;IA~ zEV>*ey*4uMp>|Q<4n3>+PVz6)W&N&CT)t7y%1-cp$penZh*SuUSXgY^^=qxy^E|oz z`aEu_V8cqM--}-+t+-Vgt;Rg>=b3j;B1>{-ZTt57<#N_;>*wcNdR$h>Zzd42tczd!GO{Lh{6o&E6> v%l-wKjpB~8Gd?ik$ThIQCB?OPJ^P&B=(Of5Rl_a2K?RbhtDnm{r-UW|YFR^v literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..fc0248ce60d57bb8432ea782d7a7ee60967261ff GIT binary patch literal 32768 zcmeI4U1%It6vyvOw&^6_g%Ss`Rlh&pWZ#RukPyk%a`7M_w=a^_Otu<@7wj_uC==dt><~MH z?_2)Lin;|2+KSr7`__e+@w;+CDf-h!U0WiRZn3&M`?k5(de-3NtGC|{KCS+nPS~GX zc})FVtvsRrsg-8Y%8rTs>W%eU?)!_M{jz>$c08!%UI>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-EpRRY;L2LGx)$IX)e|KoAz>j<=xF{WuS7U4EOClbkI@B?v8Td^V%G0p1gSPW+D z+t5#K3!nkQ#+?FnFY+Sk&^HCS>!8A?RAw$^~X z@W7x!+lDLp@+xP5AB)Lo`5W_96}2rZ9)~f*2!|bR;jm$VuW5z>+L~sX;KyQ)X^y z!UwK${wO!sjYj1-jLPv$CLSLdiF3T>yIyNTf!^*Q+xH=BxSWWMVrlU-d04kVMV3*%4;4Og5<3=Q@5rBVrQFzz^mgWcU*x3;yRzG;R^hR+w* zhYFBCcUe4i!_X@l*2A^P=XvA^_+f6izo4&Fs;_ToNcIOK zxC>!^A`uELSyI+3?-yKOGzzB$4Ee|7cy@d~=oX%@m|Im=lO*!Fw~Rh4r6eQ z#Z=X{+uB-MzymU{e+LH#2EYfyGmYz4x!Jbk$b398a0=x9H4I&kMs;pDo3V`>(`nb; zxY6gs)kLGfCme=x*xMzX;(UWIPo$FT{q2`}=`9+=H!K z*W3&b9X;$&J|Bn;3=9rB4(!x;9Q>9R*e!4dRl#)4n&xJx3uCx?!+_q=*Y#KoIw;qN zT8)j%mf<+;!Se4Hh#le9-#v(42H!D7W8nGw zxoMj04`wwtr_=BaPrYp5k9>4)Stw9r+}zIZ4uxurUmvE^=xTJw2`6y{XP^UQ#4==w#%6o~V2w zQvAKGJ-rsZ2&dI$`KkKc%TtSUnW;do+#EYT9ms8;UYy%;sMwHxiGP;yPhh$}_ef+B z%($|0W{LG9*EGHnYv6C#8Q;zu*`Yj?f>tZ|-Y9H|Y*t!@t0tJzi32Sbn^tn2)780C zk$Ntw?8bP|VoQvb%Jafo(AmKS3|)CuxEky=ZmiJ3C69}k+QyXka4JYLE?FfdKf!oO z@|^HI$*+X#NdlKC%!dL!yudBtst!{swu;3-feK#0FAFTkc&WfD;duq3!u1Lip5&5g z5mUD?<#C(}k}8+1k&^o`UXsiR&y##zxSk~R{0`P3nmkPWoJg>kB;d%uMFLB9_MNCaI*$x1G{NJ@T* z@si|s!t*3=2-lP3J?De^Xg!N7*B2JAx96*8Si~2qFmC4C3r)ob(}gCZhM$FND=S&2 zzbbDpIx$lnRnIOw+Z4(NltdZ;R$5kqcL4`zxzZ~`ZKY5kz>5TwXJp**QV+|}mieh~ z$++vKejr1w^HV>S@uZh}QHJ>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) P01+SpM1TnV1%W>R5i@q+ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/test.sym new file mode 100644 index 000000000..78f547ba7 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/intr_timing/test.sym @@ -0,0 +1,208 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/intr_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0157 test_round1 +00:01a7 _wait_ly_4 +00:01ad _wait_ly_5 +00:01c3 _print_results_halt_1 +00:01c6 _test_failure_cb_0 +00:01ce _print_sl_data55 +00:01dc _print_sl_out55 +00:01df finish_round1 +00:01e1 test_round2 +00:0232 _wait_ly_6 +00:0238 _wait_ly_7 +00:024e _print_results_halt_2 +00:0251 _test_failure_cb_1 +00:0259 _print_sl_data56 +00:0267 _print_sl_out56 +00:026a finish_round2 +00:026f test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

t2>wU+ZIijiF?78?_rQmiSEGUfX01w)BUCT3BsaH<)gN zDbyLW4E;k9L}B2Bq0@f^L53g<9n4@s7PBabKX5qdA0k+%3?|GK*Lu%Axi5(#4F3`4 zIV`X5{J7t9@8{hc7~S5=%KzKg{IK%bFSD~3*RbY>BkWlgU~8Bb?0EhK*7DuOgFjxr z{OxP!&h48y*mC9K&wAGWUm>D;fkCbvCV`yW2qhr?4AZumCORT+4h^e$EbrrZx6=tsc<&e{V5bJrN)RM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1x@UIEXmzBD)jLkn+AE`@|Lj;Hb5%`Y@*q<)0-1K+V{<_!B zFZ4HBHyPu>Y5g-CYfCvx)B0vO)01+SpM1Tkof!mfquEyYhvDdgc@^3#L@Jwq>s~BUN z2JtAj+B`(ES^Pj;(>82~MoqJ+DISLrQ&T5S?BCzox^bi54|&tHxV5!)b+xr&J?g?e zn5OAEROmX!;ir!q#38?FlWE$vX>QsC9vDo}w&9Atyvh;a$Kx_u{fYIeirSWyNI=do zA`ypMBw`rgYnowzwx*dT`0=>o_sw&q%JS_V`Ue^PGa2UrQI|g$_!+y9H z`8bnUV8@4DLc0pG=0s>(^KHs`~}k7mLAZ0YmdDz<(oZ@_gFHfYV9X<>zk3^!; z?(WT-p&oS6kT1k$XD23rI^2V8-P+Rw4;?+6p?p3No1C1Ub{yELi3Iq)y|7#0461_Z z=FL4l&=+#Jdc%OZqp$1nILx5hA9{6lwYOs)_F(n<1!Bj!O-#(rR`ak2YJJ=Tx{hZS zzFDCQ)SITRcXQKq*{JHlow1-2@#`WF&?r6B# z_#GnWt;W#Z&Bkv#iu{!|3bW44-x%m*%gSjc?)VF7au;gVV50T zNZ5ZY49x4Px_8FpQ@8T|nIJ1DFQ(uXG)*IY1L@JRzL8N@wleT12G=F6a5lO_IU{PC zlcS@3BV*~IhrFU_`smr{oxD)_LX-r=D{p$<F9^?*{6@H*Byd^8dT21p8{81C>M*5YmskumXy6S3 zvcX*#uQb>wJg-4axL$+OBU~~gV(Lz&Jd8s@Qst7(Qt}|iE0S5^d6F***OP=fzmD}V z=NaDMUE!)OQ_f-n8Z`0-EwaJq7_T(AEIhBl72$dfN(ZR~oz`Jg>oN;d%{9 zPjkulMNG{w2%sESR?Eb0q4 z7}tvfrS9@QnNqjW%+JEF9ey?xSY5Q&o?dQ>sh_O+q&r*;Dai}~^jlVv&jJq6UCNjY z^;bfn5N{Gv9+Pp$D?KJdJL^kdm2uZAeMg4+>PtVC@swBkl??HBS&2D`3DEneZri`U z(!z)U5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x iKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U~hQ6ZjKd?Uw@p literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/test.sym new file mode 100644 index 000000000..d91d4810d --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_cc_timing/test.sym @@ -0,0 +1,223 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/jp_cc_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0184 test_finish +00:0198 _wait_ly_6 +00:019e _wait_ly_7 +00:01b4 _print_results_halt_1 +00:01b7 _test_ok_cb_0 +00:01bf _print_sl_data55 +00:01c7 _print_sl_out55 +00:01ca wram_test +00:01cd fail_round1 +00:01e1 _wait_ly_8 +00:01e7 _wait_ly_9 +00:01fd _print_results_halt_2 +00:0200 _test_failure_cb_0 +00:0208 _print_sl_data56 +00:0216 _print_sl_out56 +00:0219 fail_round2 +00:022d _wait_ly_10 +00:0233 _wait_ly_11 +00:0249 _print_results_halt_3 +00:024c _test_failure_cb_1 +00:0254 _print_sl_data57 +00:0262 _print_sl_out57 +00:1f80 hiram_test +00:1f87 _wait_ly_12 +00:1f8d _wait_ly_13 +00:1fa1 test_round2 +00:1fa8 _wait_ly_14 +00:1fae _wait_ly_15 +00:1fca finish_round1 +00:1ada finish_round2 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

+J(|-g(h9C?b%wRzlvnU8Eij)2!1M8H*gt_8c-{*buUJ?Zv{v*ui zVY%M(cGjBdBG^8YqAKdgNI%k1o>HLSVe5IfESYz@hf?r*tM( zO3Sq}hu^UR{)U#uR&D*7uDiE{nQ=?`SSbfGhBnqWI%W+GvQ}1{XYF-DOua23O$DKr z{$x7SYmE$zKk8Z!uvVv7r>Y5g-CYfCvzQe@$S%tkjKVZ2m-jq%KVk5g-CY;6El{f3~=C%imS|>s~v* z(BEj?;=fYnzcc>H{_Y>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0(UHdT#dp1Vy|&?S}Aldent` zFiq2SsL*wc!%rVKh(mtkM$@!y)7-cbJTRD`ZNn9Pd6gr;kH=-S`V;F_6}2rZk${|G zL?RBiNW?I}*EGWbZA~*x@Z)jE@%aqHvT|boOW$#@2h>NSsZ=(L`ng;pkOEt7|~z>UyP*g#3QPn3^&SysifV;V_OrdKBi0hW&6Y z@_8OR27ZJa?k|{EIz2u zuNb>}bu;F5{jcX2s=!cBo;!@eH6B-0+wSl0?FA3W!2X?{o}2_949_&KU*%@ojw9>w z#K0+#``0jZJr>is;b_LTZOdd_ciT3f4_6b50iQ?&^02onIK}w}U!F)!J9rRQ9*IPw z-QAluK|ScAAzz5i&Q44Kb+`xHvZbd79y)qBL-~9lHaR&x?KrSg6AAEpdttZ08B_(+ zO`CdppfBWb^@ag+M_$45)cUvwbREwu ze6vCqs5ebr@8+iK$X~LOI|iPAfSabt`N623o=gUQ!c(sr_;c@HY!8Q;jT^i8-QjSv z@jFB=SdF3knvLJK7x^n|6lR^Bzd6v!mX$M1-0>IESdw8Mpr6>uASK`3yZ2DYQTnrYTU%ac3T?`eflVhirLWNyR zcNKOYF1Kcm@J~DcgqDJZhofs@#FdWab=J>Z)A&KGfxmF)>@Gf$-O7V$m}>Jo5 zN0dI{s!65{VWQV!OG;sAsj2W`G{{Ajy%_Jb*gB&_c~*FhLxWtv(3KOy)nKo2W2HeZ zc}m38ex|&QLqU>p$<M*5Yr&tU$Xy6S3 zvcbI=uQb>oJg-4axL$+O<6JT$V(Jd2JcdI-Qst7(Qt|-CE0S5^d6F*)*OP=fzk&5I z=NaDMJ>jY@Q_f)m8Z`0-EwaHE7_T(AEIhBlRpELKO8dDa8-&HHeN1T*cMTxvel zBV6(W5mPfvxqw4K($6K=O3AM=UXlD!c%I~S;d+vM&c#kWA7lyT+A97gs$$bJi~7P1 z#*N}Ysk?lCrqpdT^Rw`4ho21vRu}EHXO^2{>Zhwd?G6`1N-_fg{g##Fvw#D1uQDb> z{gqHC#G8baCuQ96N{`CWj{4HqWZd;i-<6@h`qEEiJmr;sB}4pOR$@+K0`&f=JNB=y zv@jw-1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la i5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfC$|21pWlajg|QT literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/test.sym new file mode 100644 index 000000000..d30786137 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/jp_timing/test.sym @@ -0,0 +1,223 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/jp_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0184 test_finish +00:0198 _wait_ly_6 +00:019e _wait_ly_7 +00:01b4 _print_results_halt_1 +00:01b7 _test_ok_cb_0 +00:01bf _print_sl_data55 +00:01c7 _print_sl_out55 +00:01ca wram_test +00:01cd fail_round1 +00:01e1 _wait_ly_8 +00:01e7 _wait_ly_9 +00:01fd _print_results_halt_2 +00:0200 _test_failure_cb_0 +00:0208 _print_sl_data56 +00:0216 _print_sl_out56 +00:0219 fail_round2 +00:022d _wait_ly_10 +00:0233 _wait_ly_11 +00:0249 _print_results_halt_3 +00:024c _test_failure_cb_1 +00:0254 _print_sl_data57 +00:0262 _print_sl_out57 +00:1f80 hiram_test +00:1f87 _wait_ly_12 +00:1f8d _wait_ly_13 +00:1fa1 test_round2 +00:1fa8 _wait_ly_14 +00:1fae _wait_ly_15 +00:1fca finish_round1 +00:1ada finish_round2 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..be0ce56b75d4b4ae2b671c5bd6008b6ad6b0b57a GIT binary patch literal 1231 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!6PZ!6KiaBrR-Yr|Bz|*=h z``-Vl)q2maBx-VcOft;-R(|=~e2JT^ot?Y>{`)7^bo%^Vz6lW;1{NX`GF&`-tZeN} z&CZPnE2jo+%f0=7-Qh=7JGZDeVMah7(VKj>Zm$kbpS6Bx@21C*YYXe$-mE{foZVd7BXiSg=STnMn{3*9 zsaaJ~|7Lvqd6m~SAG3qDKduPAw!23r^+=<_?}RAg$zwzT{Sx-yHJevN2*;^zymWW?nAq)cowh%=d0ta=SM$f|p7oBfil z%5Gm|HYC|IE8bjU^Z$C^&j-&`mCw)gN|}?AdU~_my!LZ<;?LiaWY;d+^J&f9$~lJl zbLap5&CaR%Sio0iW>53o)pFhrH7`s5#u?6jax{38$=yArZ6_0iU#oaWWzR{eecr3( z|M7CuSHG~#&c9P^UboEee|>OHN@H<)>=*G1&$G38E=EpKa4hJ6rYU$#!IIkZ;?+S~ z6D9Y1n@_rbb+gECwo|&to)vyQbbQ(W?h8A`b#0Th|K2;xXKHSDUwB&ABKI1Jn{~4P z_%GhR-(7qzcKJ=_B~OFqe%NQTqI2n|moJ{*{!}cp=)4DO-`S^L{C)2nE-CKeGLb*! zA9%kybUI7FPPl>HVuSJyPWyu|Vw%<4UR2FqwsqpX5b=H2m+f+Xx3jJCqhi(3%Hu)6 zD1~GK3U7>-x#NU<-A2+UHq1NZVQin{vmnliNMr?W?igr)l|LE5?|J!rd*49s&di=b_q+PCi zJgi)V^(Q<|_-osC`Pw{F7vbP0l+XkKM~q2^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..4091efade426f8e98bd4f070bdd1232760cc74cd GIT binary patch literal 32768 zcmeI4e`s4(6vyv-O|#b~?Ov8S-{xa`iJ@e3j;;=kCB7wZuWhnMTiVV+Em&LD3F;h7 zvCf!fD5&_4!oUerhyMtI6hRnsFrr0S$l_GkL~v3;2i6}9rs#@myyu?WmrU?4{}A*X zme=<^=iGD7{k;1M{bQ-s{@=#thm}u$nwdGhf}pxqMzB0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm`6Z0)-}n|Ha-U3#9*hJm8r&n^rf*G!6W5Zq0G< z*$A{K5pQL_@+&!Y1^i`X%i?g7|^!iidtUf3ed@<^frECzN%tv%SxpnW*D)U!z~sw z4A7cp7*Jc&OcQi6={P>0VOUl{oPVhu2YWz%Jf6wq^H{%7NTu?5Rh98%5;Szc{6gXS z{!kA-GLHAQt*VVZVCBYsrA9)2zhO*H8V2%)nPF0#78J%H2UH^Ay09O{a5e1Eb&nl8 za%5t{vP{$97K`B&kUu-?y6}OkTwmnox`~90LsZ7|`BZ9lHpMNUhj>FHZ|Gkv9y=!2 z!_Er@xH=Bxq`7{h>oJD;oC0y~yWz_%P@g zH#}c3S2nwA*YvcU4Y6&ULqK^Z9T$i3IS8#UKu6yN*-5-=O6iscHN7!_H%|c)YuN^Jd70 zx@gE3d^0oS<3Jtm!M1Ga>4Ari3MZ7$2YeF~Q&WxuCpDD<-P;SN1>QkbFx|Ylrw95% z40mrBFgt2pPbOi4Mt|tl)wOON#^DS$e!qb4Ft_pXnVCi$&Oo!qGob7E&cbh2=mPns zsq5X`bRGFiR`SHa^AB>gmbl;3quwhJl`a_sqIzIAHv?o8KLb28`dqbJ}VR z-yAT0xueX#vPNOn-2Byn2wPT;GjW%yRSIXCzgDJlx;(ewEbLeqT-a%c7E<;f3j_0d zrW(ss@61$dgAwa!wU~+Ub<54m4!>{VkoXYqa$pT{morGUHl^m6R7V)nLwOAL$#& zj*j(>jIyeggMSIQE@`C`@jH|`krPOdj`od=WryzZlH%EeC*n8qMCEgl5*+Ir9kcq= z*<7E?%8Q}W(~GN0`NeRlF&sO(6fW&vT2;FLV0BIIDgIf8|)nSaE5?@@ne` zUeowm?19fYx0?@gzjAvPMs49|qp~BuUFj22O*3T(1HBeoQc6Qh?WL3P5HG6iMSsL% ztBnoH<3hC#4e|npt~@KG24{^Ms|@mzM}<%AXUdzn6iPB)vQ3tJAN}=`XN2-fej%h+ z61Xg4J~SBR4Xz5QI!tNVDK-NQT6lw?Y;Y6$>kT#v6L_;U&nlyd73wPM@ZFW$_WfWgI3<4Q#Lq<{(6IpLU|2- z6w+%@d5D)}gRptEk16fqt_4c^c*zb~GK&6s$!?*%lG}y!O2W(|m=7}_;0+!SQq3^s zAq+r+6}*8i8$5&ldV`mR@){f$(rZw8ikEy(_|zOzPUBK2>E|U^%90n*UoZKsP+rL^ zLV6|n%;kt)46&4Qc?JI(s&e}>i~FK2#&6|;N_X{^T&3Fx@ORz`s=Q6m^TS44@>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CJ0a&j|bp Dhb9ix literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/test.sym new file mode 100644 index 000000000..a7994dc6d --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ld_hl_sp_e_timing/test.sym @@ -0,0 +1,202 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/ld_hl_sp_e_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0187 test_finish +00:01cb wram_test +00:01d1 hiram_test +00:01d3 _wait_ly_6 +00:01d9 _wait_ly_7 +00:01ee finish_round1 +00:01f0 _wait_ly_8 +00:01f6 _wait_ly_9 +00:020c finish_round2 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b0446c43a653076edb07f1bf35ff8d448c5a2d GIT binary patch literal 1178 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 R5g-CYfCvx)BJi&S{svlG7^VOK literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/test.sym new file mode 100644 index 000000000..bb30af546 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_restart/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/oam_dma_restart.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0171 test_finish +00:01a1 hiram_test +00:01a6 _wait_ly_6 +00:01ac _wait_ly_7 +00:01c6 _wait_ly_8 +00:01cc _wait_ly_9 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..177f3bdd313d3ef307af49bf40c68a6af9a21644 GIT binary patch literal 1247 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!4PZ!6KiaBrR-Y#2hz~kZ@ z{_p?v%k5i^oQ^moZt2r@Q~!BOLx62W#5ShepMUx^O`pG7Rv>%gfhQgbMJfiCLNjDI zefn6`o=*(AwJrDmoaIMWzT90>EVsV?liL~T6}KXO+FkwI z-Fr=On&9g_=M?+A&C|83dagF_p0$2gfANFBwPp2DZ|=`5=U-xfI#_y3kK$Ir*plOqjNLi^YZ$c9Q*n4sWavS)6pQ zU8ARX{x*MRdHTkiALUyP3jF<5y=Libx7<%|gTW$)(vObUc zW_$2sv8=Lf#ru7eU$6hUaf9NzAI#mQJ~jWR-)X-6KWaJ8mZNiK4HdV*1U+Mbum({c{4?g@{?Ankm%=AJbJ1$neey(9_&F-~EkKVmhSiMnn zj$>Ge@~`GK>x6&)+*R6j`sb$CfnS)U7P*R?sVsO?aGn3+hQy+vGL*LmW@0#qFvnh6sR=(7~(t7>b zr{ecDHycN4ZaJj(oO$u(dza2L)s$Y|s`zWBEib38j(CK)Nu69zg!taS;V#d2^HvAV z$vbm?m2sf(C+~w_eOeaSK$9Ch7GbGy&i9bi_x{Fxx7Su4{Pyd4Eqi*`#;SYMp6;nW zcXRF;*XYw*uKi!@_NCnJ+*2$2W42!xrvCr^L41+< zRa@6hdb#NH+_pPT9<48|`>gXok&Bc$FkB1CGswd0YT`-~*RGZ;yHT-V<@yyT_x`B7 zSSPJ(+V}W*P{IA#A{w5vs`G=ccV1wq&A*iH6|?{7c}WNM$j?*HTy=U^@IiasdXNEc zKR4^h*k5OSHLZim#HCwf#^;3pmTiZx?bCKKett0XVD;onQufyyf8Sd&A#8Kq`aSj5 znf8gRXD0wHm|F2;-h&@I`7St$)z$rEx_|zloXphtU;FRRt=DU?mpcMX-wX0OH5{C` obU4AX5G?R9y+fMk39EiCuHDlmy`@m%A*kT;boFyt=akR{0IUsNc>n+a literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..88687e9c468007878e31da3ac49658ecd5bca8c0 GIT binary patch literal 32768 zcmeI4Z)jWB6~OO%R+MK;cAhKOdrlw8lO~MfrNL3dsu}fFdU>{`SgVcyEX6Yz8;tuScApeg>a2Bvi-kd>}tk$cZQ zx=(TnTR(Q=9IU5%{@ioU{k?k){@}a4y;JPOGuFdspEq=3==7Pt?ew*47}x(_6{@yFEoIUk}Q%{~=v|c@R{#7fuXXBity`Hp{ zXuoIQkJ(Br${OGcfN%Suec?hhvt4Q2cN?!;b^iQ`RSzW;D=QrA=-Jh;?du+V{7{S;50yJgHC!M1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvzQM+lVK1pbS?O)ZiB|HlK~X}f4mVNBD&p5W5%2TQStAFylMzI};=X?As`(=g-Y z$+fi?U+nKca3B~2ziC=r1_lNP2L>=6^THTJ({vpobRF&R9pD0X@DB}{rfr+%&=6=K z(4cL@6LtBNGeA$LrM2~q@v4fsEi01&pJBw~4wrb`FhJKd!+_kHW}2X<(~c7e7=~q) z#QvAM<6sSlPb6}=ViEI~N|{WtsH)PRPJ<2=FuqjUSs(JjNBVJW+p5}H17>cmSL#S8 z7&MHNCk+F6L(kADb_*K%AO^Hl%5`BqjNxopq3f=%udOXCSe9uTT;g%;0^(OzTo*p@ zl=D})xNa&X{os}UVlk6hS;=rI7Qx@rkvG&|U0q+7^I_$s5sRRtOtHw4~JthoPYT;^ooM@a4qtEUbzB#oD1$R=qsO}n_F6v{ecH}A-wYT7otEgpFDSHgJ(Lest$ETIQU_2H*t#d4Z1v$ns)9StUMl1B!-6%9)x(vi-LT?w!Az)57c1{a_CSp2`?Qr z>`=ZRuq`YsE;#Lp*N3_2I`WsS-BzEd(11=B3`RGcC{Yyj@KXaPF$?^7cTM7UjB*Hd%b58dtk=B{f$2B?>wjR zfmj2-SZCunZ{&pX%{;W)!S_bxXyRFARH$l}DU;|Ju~=R4ChJ|^TZvwtR5^|IsKxq> z{mS=+wrg^NCopv7M?%$LuW@0O37+z*u&HBA`6W(;l#HkBlqr9Y_GZdkLi1DJ5vrdO zxYRHn3e4~Vp9xiUn9^}fECvd6@B(33;0d%h3mg!dUmzt^zd+@?JY_-H)T2!K4o-!X zDo+`bDbJ$4nX)J}Kjj-j^;1I6KgW3Jd5IVJjZjsWDc8{f1$OZQJ+i<%Xm1v{D>T2r zM?&=rRL<~}YyuXqjxwc7j5;7?fT!%1DPw4FrW_WUpYmCu`YEC3X^e-S&+`H=2vyB7 z_5OIdtHBb1ScmaxdAu@Q{YIfOY=rn(_;`PiO@=$m_MU5v zu9W)r?ze|y<%p6k0KlMSWqB8HfSyohrD?2bibQyki1MrU`k}v; zrqP|De~|W^ANsB|@yoA7PojbHBY*RdN(6`i5g-CYfCvx)B0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I I{#OWm4ro$vcmMzZ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/test.sym new file mode 100644 index 000000000..273d38beb --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_start/test.sym @@ -0,0 +1,218 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/oam_dma_start.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:015f test_round1 +00:0186 _wait_ly_4 +00:018c _wait_ly_5 +00:019c fail_round1 +00:01b0 _wait_ly_6 +00:01b6 _wait_ly_7 +00:01cc _print_results_halt_1 +00:01cf _test_failure_cb_0 +00:01d7 _print_sl_data55 +00:01ed _print_sl_out55 +00:01f0 finish_round1 +00:01fd test_round2 +00:022a _wait_ly_8 +00:0230 _wait_ly_9 +00:0240 fail_round2 +00:0254 _wait_ly_10 +00:025a _wait_ly_11 +00:0270 _print_results_halt_2 +00:0273 _test_failure_cb_1 +00:027b _print_sl_data56 +00:0291 _print_sl_out56 +00:0294 finish_round2 +00:0299 test_finish +00:c014 vector_10 +00:c016 vector_38 +00:c018 round1_oam +00:c019 round1_b diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/oam_dma_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b0446c43a653076edb07f1bf35ff8d448c5a2d GIT binary patch literal 1178 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

    M-Rz2B1MbZ_p$g ze24x@gBwD*4Q>nRHYn}mC0Q?QUhQN`qqwVsk{(`isVo^nf2CxbP;SZXLb@ek<^jxy znGf*>FAJ%rn6eK8&|nE~pvwj)&|hiro=|Rsb3(ceN=JFgFNIIdFy#_1g_2%ga+xgo z1Nti^e-_Fuc~?lcB%iq$)bq_OuH0F|znrSrxWFQwP@QqF*j;KXKbp|CF`y(e0MKh$2|fk9Kx>pC>FTPu0s-D6pu8geNjLSFbnSRJ z^?m7g+|>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I LhyW2F0-V4. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/oam_dma_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0171 test_finish +00:01a1 hiram_test +00:01a6 _wait_ly_6 +00:01ac _wait_ly_7 +00:01bd _wait_ly_8 +00:01c3 _wait_ly_9 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..ed95678637482a10e6d8c1fd6e3b2edadecf7e18 GIT binary patch literal 1255 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!CPZ!6KiaBrRo}RYYfXBsm z{-6K)>0&b#<#JByuM~W`YxX+`$6YllWqVIF@JhA7em#){#{Bl8U`qcCJs>+k*@A97g`PZM5(uVm9vXY;^4!OQx zXNuXx9*^IlW`Qxc<~+WXyhP6CO3l^MDZJiWfBk*Aali3>xtLsqr6=8-A62S-U9xz&5S8m`W*J$mjD%S0o~+zj;}JjeGOP@5wZwtT|% zx6xaxix(NcNqL&m@lU4Tr1bJi-+LNfipRN*+b_uvfAiuWd!ngJcxSQR>v>;(OFr*# zoB8r!`uEs5^=G&9N?-9c&u>xf`6v?_RkwW zPwY8lBO&v|=0@3$(>4`s*KI6r#)@x0-CU~l)Y)w^mA?Mtk=rOm(1DQkMh+pl+QDuNRJ zuK0C6BeUg`weoa7`_qE|p4$1R^oGArSvu>+-&J>RH($?>bL%!yl}Xte`02rCv&b8M zZ;E*PinCrn-dbnx-@7{1p|Eee%DVI;ENvN(bOekUvP@B70u^1H6}$D1Z|Pm9(q{Iu}S z(U$oMChHCgD_X@b&sw|LOYQ&jAVcMw{;kJ&E?W0lZ)>UqrFcx20yDyACT;)qGdBd^ zd!hGVUD%~EKPc<$ze$$wYVw25>s@=B<9Fe^nxRp2;d5gvktLI4jl8COS9^I>B1Ni9 zumG4cgr8Pk+^KmuD*SMjY`Fd3j!%1DtkMjBT==Kt>ACM}rsavMo>A5LmoD@z68y5) zbH8y#UDteV7TJ`w;YQ)yJI{8;7s>)nc-iL|CS(7XFoov_pX#fo*Zw(w zYqOI{k=z`ad$Xt1{Q2_u*-5s$9i9~dTK#cF_su#VjggKB+d>ITz84Sb;l1?Uum5(K6FkTPMl@7JHPYGxv4&l`6Bc8 z!=(53=X`&^^SS2~e9)Phr`y=MPUVN+hlVcJFmJ_fc8K{{4b$qDeR!DFUcI>U#+NOSlr?PC-ID>&%>A*w z;QwbEf3?vw^OzcJ{Efz$OP3of9#d$%^RXq^`0J0a!TxA`aB2Kbqn7*i^7nTer)S0j zT5fNkDyL|yc)!h7CaZHiQaEq3NuPMS!ed_Xbe+d)#nTNQs}WDP&b^#`x(`0>o(K>D zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx) zB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oQlMjzD&n!M|9a#U%zM()}t;wgK3(sLxrwm9DaJZK^*ccR+y%3o92oY;DNz_whiCt%Wt^?{Ag50 z%RjMRRZ-irVll`WMktiv777^#_?l)Ipsi`934S!1NO(MkVOd#m{-vKtU=OGdhm*-n z2KBSqSS*uKRhf@Q!G{i5pUpnpAN1fO^Z0Drs#@LyDwp>weI!&_X&C+ehJn0cW|$PG z1rKvj170NJIIthaa5e1EagHB9dbF?4vP{$977F1MP(L!_IPigQxqg(J<3u7d4_TSd zWMZ+Akr=m32J&Sec|-rv(c{PEdf0h33*U(Z)Z?24{ z<3Judq2Z3>@xj4On^LJbH^?Uv0|Q-M8#lJLqP}ScONQ?k_lF8lKRd6ga{ry3vLEDi z-RBDias7b{z4TP>dAYDG5C%~Rn@jzTbrA~12S-a2L}53 zzz4%Sjr&)**>)l!>+#0GEs*EeFmyc<(YfJj#@4P)ryXbQT8{^J6NvzyPzdsHwo5q0 z{RUs&NKG3ahMk8(;c!F4%9T(Lx@gE3Vnai{y+9qF!B($sYJ!)J9!@CV55)TV1_lxd zIH|E1_|465THp?g|bnkMIiRZUIlH2j3OUN-PY zzP_+H==U1;HuI-_L9g)_M9x}s{LgufKiB00Y*b;^*tz>{0XD6iVB#q@Q^;Pp?MxrG zrug?q)>PqaerzH!v0YrI1WX6L!mQ#)-i@vl`-PO{T>h5Xj>SjeN4Syo=J*DMNh1V%#qQ)EV z?r!PoNp-y97KKy$PKBT4h02ej#Mjf(-D9=JQ|T6m^trT+_HN_Q2;H+sp^qqP&oTQ7ib_C~OF? zS6YOt#+lNAiDrvUDY=fR>fGsY9T!!$VLV{51;#SvUE$5?Xy*cku6!U|4bB=jR%qvv z$3#qRWy(oh3X+UVR!PZkF=xasT-K`8ZHG%l}mc1{BxT?dHQ<#7Tb9jSV+29h!OAW3G&uws1xNd{O4lc>sVe@JWQ>w*N1xR|hWQ~*z zV!R~TAUs!cy>MMgn7IqAa8x;0) z$!|nVO*7>zE(OU-E;&z1Ucq=t@)zN`l6QpbO7fZW0e!TN#gyA~i?`eI)zd8O304^Q z@@<8N;`8Z3gW=_O;nuQB*5Rwl+w)FLS4Y(IbI&&f^L{0s27r~873WjH1zMu?$WUu3 z~rJu;S>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x dKm>>Y5g-CYfCvx)B0vO)01+SpMBv{M_y<;Y{r3O> literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/test.sym new file mode 100644 index 000000000..ee3bc1203 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/pop_timing/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/pop_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:02ad test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..25b9aab9e32f2a840ff783a93c09ceebafe67a66 GIT binary patch literal 1249 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/test.sym new file mode 100644 index 000000000..d259ae971 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/push_timing/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/push_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0177 test_finish +00:01bb hiram_test +00:01c2 _wait_ly_6 +00:01c8 _wait_ly_7 +00:01e2 _wait_ly_8 +00:01e8 _wait_ly_9 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..724d67aea6df93eb598ef6c72c54f43d70e5832e GIT binary patch literal 1200 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QIBr;B4q#hkZuFV0%6z|&H= zf8T%Y?=dC(PlJU7CYkblzW?T0mW-sMQb_;z-*Y+i?ESeF_FYIQ$S|-lk&uz%;p1g% zXKViKr73%SqW$#D!ksa{UQKbkf9uJXqJLprN-wXd=AL`~dAZJ!O%1DBL)Qhz{@)UC z%Y{qnZTL->iCZj>uRP{q`XlUP==DIeJ-e>1U#|Y|TupYt)`lrcyKk#JGhUfqyOhn_ z?OxY@{`-E{zCH?Hs&o9`A|3OWH@*8Amj6iDbBh1^ufSZ<(@s;YBA1_9k`v^b-@D%G z{jvM(aoZ0h%0b=d+~kOIYzjCPaOsobT=^yW%`d(rZ|htq^gQO;)FT&P9{1oq zceT9e&(`H;E*ZbVE=C@GDs`uR%O#VZ{WIrn>^djeG_U*!*Rz8UdQ2|TJo^;#@- z&++ET6aDOCX1zH1$4K8W@R7OPoasJYB}Y?DG|w3p+gK#Y$@GSngmuni_ul=Yf6mHx zN=<&@V%G8}V}XVmTc~^gv=GSMG<~(pyqkL@KWJ>YJ5kZ`x$E+ZpQ)k!SN}5DryXxz z-M-hW?q)q->(})s-^^VTqP;Bi)S}?$yWXiiJ2>~rHmzH&i#;z?UVK>}xU0{+ge_ce z%fZPHj@U@Z0fPf6HXw-z5=k}rq4(xaDvH&+D?Vk}4-MvmQ@Y1q)vdOFdF5-q)8n|3 z$Ozm2-mNRv*X%vMnn%do^vjz4{QG^sDB65~rMu^iQpF4JF!EdF|B zNs*F+$R3uI>)V(v*w?SnR_DF?~mm5zR5nJoFQ%}=(F$z7`^Wy$Zy_ukjb&gyT)r@fwM71Yi;fBk;y=k1d} zG`H>6d{aGnjSzpVr_9_smbWQK&+FSCxo#QJy!Mm#-|xFWpJ%=ByScFBmtct4Mx_j4 m-!%(xMh1q@NDBwts(-RarcIWY4Yn}^l|-JdelF{r5}E*IMK(hK literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..1a034b1ac442576d145c8dbdc88520c925746ad6 GIT binary patch literal 32768 zcmeI3e`r%z6vyv-jrFxj+gIb5mCrLDymx+*Hu9 zu4b{~{+RgB2Er6%ll?Ooj4~LA6C|um3^5xFbOya-P+xAPwq?H-?~4> zIW#Z#d(OG%-1~X=7Wzk*mY$B8H=a)2Cta1z^eNx}Ha>o}hIuOvvE$6gYM55P?t>Go z_U6_7cW&LfapvO1J!AW8?_Rxi^US9gFKn^jI&fhB?ss=@+%sw&-hJpW8y;rdlr3!I z^SOCjo2y%zTUwgl`Dp&pe0#ZMtfx$}`GIo9=I1wS*>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z}|HB9JLF_%HS{nIZlE;{orq+_a)GrfJ|0 zaVw95C!NL*_%&_q+EB(17_^7sg*$AX4>#~byt&ylZQC@Pn?ZrW0&N?fsO3}603C@)Z|NKJRTXPnRx}DR!w3fB z+=4;F0Ig|;0kt*FG(krq@wmrh7?zb0=U?i09D6{1D3nN~(^x-~iAK|DRh98b1T=KO z{7mNY{!kA-GLB>0R@KrTuySd?QX`?tO2gQ-%P^2PtQl5{s|AHI$N?1&I}YrJF`NxM zbeywiPn{YWu`JUxxCMi_3dop+B+#gne{PMV}%Ki8C$$k*mb)PQ~!1+gy!dlU=AMQoI z&tu0x2f5+-f^{X6LqlU@a(xiNQwZ~8u|Qzu%2K`3dBOdK!*E-`kbg9acgN#_)x!G~ zbE~Sn7}xcG-(ScA!+P@Gp%0#sh^pFlXJ=a*C?EspcXV`Q1T+}lY23fc&9>ulnU6OH zZh<_%hN0`>u+9xdLD+dP7z(wt zY}f$#P!|pPf^U3$co?X|7;Mv~)>e4wsBney{eW*|WOOthhm#tOf^KVr(*k!;6-+m5 zXl;eQ5X0RY2CN;mu16xUf>M9z)zq|lHOAo#mVUp0?-;k?;qmcO9L_+w#xtPncxT}^ zD|CT;)714AZn}>AB`bMi;Qjl!X_{Og%xY~-rQjRhddWafe061Y!0$C4?BJuxfYXY)WC)^vuJqMz*M&V`3Ct%4e?JcNR}r3;g+^wUED*o1Tr&w$Jv= zcH8x{QTwmit{FX12qp?IB??PDjn?VHRHBj3TP&Y8`MKq*tf*bKN?Tjg^vtFJGybk; zS>4?W8h zl^;clZ?I!v(CUmOQymV=&DCe$n_H1h&-t^Z#j(>1{_Kv071^DWg;l8|{Ii;W{0sHj zmqT?hqTKLpXrhJA|p(Nuat7OS< z&|fThMJTuAPeQsSfy*4`LxTa{;GvLeoGBIEVl&X7f;aHV25Zn?Y_MJ^w?SA)w?Y1O zUNR+oYCBV2!>LeG1oL6dW4ytaLaGi^&SL-?EaMGo zWrH8kUu9V~eY_;=fz7KOOsN*53MlE}C2M5K0Q!q1TZD2;ZWq!m32W}h zd|2}#-rx-()dW-aVE`H|=M8k(;5hn=4L%aeZE#LVw?Y00FZs3bsVSyh!l_WQl9#NL zC9k8uSn_9~+>-M`x+VFVbB+2`J&P*$mly7L<*FB1$P=hA9^|_6Erl0S`4+>=@4~%x zm8{oSm9y*4Emnus%gZmf1af{QmI8p4mKEcxfD5!n8I-QhqRa2+P5jE6(jRwIk4jhj z>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y O5g-CYfCxNk0{;LOTQ8LW literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/test.sym new file mode 100644 index 000000000..c376b30e3 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rapid_di_ei/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/rapid_di_ei.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:018b test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    t2^x-?qp05<|`AHo9(TEb*DVy|&33*3v%?YQfpEZZO>j zo2<^5Wy}u_zo=B4P<8l45Tppg(7^}}Mne`AK}Fc4A7tSC!$4uK*w%aQ$$d%v1N%7K zIW#Zt{JH0x`@8oR#^_yKytjp2>Qg@dWqka~3f5S6l$~Y)wt{KR8(u!cnyy|sbp6`3 z@7}s_VgJ~nrk}4|yZY9<7e3i;KYRG_p?%Nq+p>SuI=1iVF*ZERxG3A%mN(uG>Y5g-CYfCvx) zB5>Ceuoe2B-MfB~s6iq?1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko z0U|&IhyW3|>j~s)1pbP>M$M7_|KkB`S}R&b7}GScN4eDc!II752ke@*etk4*nhg!{ zIE>i4cXIN;ftHqy8~uLpo2JEO&6?KMHES>)^TIobrs+CF=sMcr+s6g$;NP^#G;P~7 zH*Eq91RAt$c%m+!as=q{xU^QkFr=C<8jcT0>A?_R?|-q162irs>SK8OJ=7IR&g4`VnQX6U+8Q2W!5RWSh{B0X_ z(}dmN^T~MEO{Mz!jvPs)To?RM2?b}IOpc8W4W-jbF5q{Z(b4|?UAwxvFu!SrD}w8b z^TP}fU+Y&@Isd*sSr7cW9tecPIR4~G=oJO);auc;o;n43gbVI3=qsHb8X6mu{ecH} zA&gHZ!{ODdtNE(?1?Lxw!D#_O{)q&h9iI=nh4mFQ12V9GM@L6SKnKAyjq_Kz*tX-ycswz13grGZ3|)`KbS^lWu^l@y8Q0yh z!{@`<#A3iF5&=K#?FvqDzCo8KQqztcftg1l(P&%S=FJcfc~Our*v7|)hk-i0gKXW} z-VTe78g?kx2W%rFqoa-kJ2jC2y`uwm3!Fh!Fx|Yly&dX;4`*)}&^zk79*;u@)%sAY zwRP=U^ur#k{(b@5DK5jq2J#(uHPn{^YWM1H(wfqyDYc4z%T?r$u zZ&+Au{ls$`--|i$`*o)G@J60e9!^86b$oA>c19mpI)$nxnbM1n4vWnxh2FV_!Y9#Y zo>bY7_K?L^8yl48gjV0%!xI>~@{&+B*lS!^sfVXLD{N{PQ{Ka&kdpC~%Vo+>(OyY8 zBQ!7Nw?g$&0+$;Y4+REzf!jh=9j4Un5|e=fb-X}87FdV&N`Z|+^9sa->J=zG$x~*8 zP2I_qCvYgFRC&rqneq_YD=D)=^HRPdR4*m;{0_!L&tts6heB0drkqCy6sYF~nq+}5 z&|WEUO=w<$pM~lbC>`V}Sr1HJ?PN-Wc&meyKAv)gOc_RdC1sn?yp)d%)k_II_hUTt ze3Tb>TBvG@DF@L31(xvwx-4)S?Ue$r3C$~TPN-gi(hEH0$HJy&m~s(^LP|eRxl*S5 z2JMxUKM2iB`I}I^l)UF+NY6L3gmQBkzpkp-u)w0eaGi0h*j;KXKa?r88IAlb{JO!< zdIQUg_R4b$4KeldvdeAZVo*tD0HEKplDrEzKju(1TnszP? zeN)<9FZ2Ux>RcN7nY5?8(66P5-+?815)BmZ`hSH{gG7J`5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x QKm>>Y5g-CY;NJ=S1)HRuoB#j- literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/test.sym new file mode 100644 index 000000000..a47bbfc12 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_cc_timing/test.sym @@ -0,0 +1,223 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/ret_cc_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:015c test_round1 +00:015c _wait_ly_4 +00:0162 _wait_ly_5 +00:017c _wait_ly_6 +00:0182 _wait_ly_7 +00:0192 finish_round1 +00:01a9 _wait_ly_8 +00:01af _wait_ly_9 +00:01c5 _print_results_halt_1 +00:01c8 _test_failure_cb_0 +00:01d0 _print_sl_data55 +00:01de _print_sl_out55 +00:01e1 test_round2 +00:01e1 _wait_ly_10 +00:01e7 _wait_ly_11 +00:01fb _wait_ly_12 +00:0201 _wait_ly_13 +00:0212 finish_round2 +00:0229 _wait_ly_14 +00:022f _wait_ly_15 +00:0245 _print_results_halt_2 +00:0248 _test_failure_cb_1 +00:0250 _print_sl_data56 +00:025e _print_sl_out56 +00:0261 test_success +00:0275 _wait_ly_16 +00:027b _wait_ly_17 +00:0291 _print_results_halt_3 +00:0294 _test_ok_cb_0 +00:029c _print_sl_data57 +00:02a4 _print_sl_out57 +00:02a7 hiram_cb diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    t2^y-|Ay~iJ@k58(ke5OMFY-UfZM%w)BsKT5z_k6Vz=m z#ad&Qp&uOkqHO4dF^6A7L8>5(IT*o#EM!p>RD@0XK?LiRfx=v|t@qrM`;z(x_R&A* z(7e3!=bm%!@7`M&qj!1v|1Ip|pz_I&Q&X4Mu*SMW>;)EJYnax&@uj1z>B{B(-(9`> z_3P))@0;A;bnWuhE3dzC{@gwGlLrp$-}~&|t@|ddr}iFtij9piF3LS@>+$zO`Q_%f zRYhgx>%G_ArK8pYf4*!jgq9cW{4*hzx2>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c<;toPe#+|Lgw4mx$UU0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1TkofqwykT#dkAvDc_M(*JurU`=a9s|aJ72KFeIT0dB_S^R)q(>82~MoqJ! zAs&Yjd-j|-@z`Unt(!La{oprEi_7};?d|K=V?5@CcMwg}b%@Y)w8OWL3)sQGd9!KS zwrOtO3>pYDXxs2aT|VUq(BpAwt$t&?s$y=-N+iH%7?Fs>B@!_V&^664Ah)KOCg}0F zphE?W&*fIuhkWpnetfrWRjtke zGgs#;btL5X8^)eJhJn1HXXq5W1r2==16nNRx-cKca5T)&bx)l-abkSjvP{$95{Y0J z5I;Tby6}Og9G~any0Mt_gID^q*+gP`I>9BI1%FjX-cUcEKXpouhneSc@N^uA$CU;C zwhg*z!fx>SWW4L9QiFpB52jMC3x24Cf-_DgCnrZo)9EA^@H@`L#L!S*Ur!I_H_dQG zaD8!pm;vHz{i-VGKR77sfnV1Hfp8edA3hAdqF_Coi(JnmM?jBo!Tkk&rPHIMlasPP z@Zc_l@yTR3+|p9bSKTi-zgP@T3kdR0B=GF`e9$eduNb>}btC$9{g3AtqCha8Ja=e= zXFRT|w%yay)dd=mf&Du%F+L7D2%c%2zskk79Y@CFiGfof_pf2-dMu`M!O@KE*pbP& z?v5QkAI>Hg13r-m_+f8XaEkK{x;&AZcJLs~JQ9gUJ36*(fq2M^f_%X?H8nN{)Zrau z+qTY5Saj5|L%BX+8y}yTa2(jFi3I3fU9el=461_ZmMxu~P#1hSd&7XJy`wy0=6Su#>S?ms(#o5wL0zrUB@#EzgeLQ#G9tBcW}{lIpML*RTR7Ng+}O?EX2OleuVA@g)d%lvG=90S$Zx1om^FLx zW-q@hMmfX88^3-gcd7OsnbL*g?3^>VYp#E;&u*Se*uTy7Uer@7ZhFb5ZspdPW>!#+ zrQqV2hN14>^zcac&@e0W3uyRH44w;G;cWCiWmd#ACWnW+hepx^4|+k-^vv1l?L1KV zT!aL~oiT6=PPfa7^Ua0l=hqdo^T9&3Id*a(SlGR=uJFiAxi#|~|FrQ>aG|;IKy)pP z_-^A;i}eG~X?!E*z^~Vt-OU?$M7cK&t=93qQQ8&VsdNifO)_Nw9bFb%PznPJ4TW>j zW}Z~phxU-gT8xd#(?Y8s=;sLxU3pQc8tgSLtklm_o)k8) zyd*R)HY~BIFI;EbDE5{*%6Df<9Y!NR3qNi2 zvw^_sqP_OaQbSDrc-6-p;bKrpW&ohyvXZ>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I RhyW2F0z`la5P`oU@H_pho4^17 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/test.sym new file mode 100644 index 000000000..11f387de4 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/ret_timing/test.sym @@ -0,0 +1,223 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/ret_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:015c test_round1 +00:015c _wait_ly_4 +00:0162 _wait_ly_5 +00:017c _wait_ly_6 +00:0182 _wait_ly_7 +00:0193 finish_round1 +00:01aa _wait_ly_8 +00:01b0 _wait_ly_9 +00:01c6 _print_results_halt_1 +00:01c9 _test_failure_cb_0 +00:01d1 _print_sl_data55 +00:01df _print_sl_out55 +00:01e2 test_round2 +00:01e2 _wait_ly_10 +00:01e8 _wait_ly_11 +00:01fc _wait_ly_12 +00:0202 _wait_ly_13 +00:0214 finish_round2 +00:022b _wait_ly_14 +00:0231 _wait_ly_15 +00:0247 _print_results_halt_2 +00:024a _test_failure_cb_1 +00:0252 _print_sl_data56 +00:0260 _print_sl_out56 +00:0263 test_success +00:0277 _wait_ly_16 +00:027d _wait_ly_17 +00:0293 _print_results_halt_3 +00:0296 _test_ok_cb_0 +00:029e _print_sl_data57 +00:02a6 _print_sl_out57 +00:02a9 hiram_cb diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_intr_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_intr_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..1cadf780c5afc91df47bfbcdbde882f45bae9d0f GIT binary patch literal 1193 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. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/reti_intr_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0160 test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/reti_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    t2^y-{xa`iJ@k58?_D>OMFY-UfZM%w)BsKT3BsaH&Ewb z%IX%gjQK&?7sa6yh7P}of)qh0IvBx$EM)N?s0^I+g9z3s1BJQbTJO0h_a*fY?4xt% z(7e3!=bm%!@7`M&qjzcP_7--2K>76Nsi}*rSYzEmcAN#+DyB7Wc;Q9X^zFs{KU}_i z>GiW`_fGC_x^nUIx39l>_QU(_C!cz1|DI>}Y}q?uJ-z4P(`sPhiu{F$$8_E|-Igl}$x|8Wlr#09= z@~~^&$6B3Y?YIzIw3kHv7WLoi^9HQt4fLuv)xeiG ze;;dQ#hD*(?~O{cCjvx(2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la{KpB{3jM$Ce|(9kJt9B^hyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01>za2;^!6{))Xu&5{29;{j`0D_TVu(=@P0xzzf>lFi}=?3%WIeKcyC z4Gr-)j2It3d2-*r*4B+1{eJM9rp0CL+P1c}YcU@4!aInj={iK{I@;me#|7-*-?Ygz zZQC?AZ2}Dh8nkVAqAs6u1nBX&v{t_{UR5!-WhD~eGmJ>Y;Sz}$2I!h*7?4}jOcV5Y z+;Mz9!?3KJ*#A;@9IOHH(P%1_&0_vsE|JJ)RaN@qanPXx#^-X&>q9>HNI$;YwyIX= zfSIfFl{ymg`we4!+%S+g^bDP1x1ga9VnB<lU7>3-F?d|Ty{H7VM z2(B;A4>Le~tzT8;{09bPJ@D&#AP^4Y_@hUmR}`#=bCK(L>=@_~F1Wv-uXK83WO7pW z2OivoFg}?Khg({z`KtQ`=NF5?X#qk0i3FY#Lp*W0=1I`WsSFs9+}d);>?^gw{xy*uEF7S|HEETG<|qBdM6K5 zz7!z=ac2zNg45-);(T-Ax%oAP?0m3LZH}E<2o`oNtSRh1TyD)A;h%N<6I^I6JQQ6G zBYxPh*kb*}a~j`?Iq>UsW_IyLb}J90q18IRH%dFBJCrV=s!68wqodPe3reAXp`q|$ zw3#PW_M$yxu@+;4@{G{x`}=qTLsy;`ss?+F3oG^Ul&6GE?PkhbI22Mco^qv3`4QSH zDK7}kOZkmZy_CRZ9^;|F5HE0DsH(%1x?V9EC{V`>1Z07`&|WF9QD|O)m{7d}rAK+n zjIgOYneqq@g_J5!*(g))M|&k@R%l+z6GHV;LeFntJoG%t3%n;()n&>oI-o#3FVG|l ze1`T)fy+Yk3S1GYSD^GbPs#dV@@f}T8pK;2r1bHWt7OVB+AAsBh32K)Ayh9V^gM|1 z(DOlF;4z`9DW*J*4k)mK7tm#a<7lrGcv)y(fipt&3Y3oUlphG2nqkU0911D@JmqSc z@@uqLQhqNqFXgX7^-}Vliy=MV%o57g75uuYV#6Yf`oeX_wPH`Hy?k$`)NVBLv+&CX zKkE;yEZVEjEH=c{PgZ==9xeuzWCj5GEi1{pfCF@wGAvEq6;m+Civ*P?q}}mCk4n?d z<)N=hyX%F%D@|R?LqC@Glo$GyH1R92L{FlD;w|v+Flvzq5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x SKm>>Y5g-CYfC&5(fj. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/reti_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:015c test_round1 +00:015c _wait_ly_4 +00:0162 _wait_ly_5 +00:017c _wait_ly_6 +00:0182 _wait_ly_7 +00:0193 finish_round1 +00:01aa _wait_ly_8 +00:01b0 _wait_ly_9 +00:01c6 _print_results_halt_1 +00:01c9 _test_failure_cb_0 +00:01d1 _print_sl_data55 +00:01df _print_sl_out55 +00:01e2 test_round2 +00:01e2 _wait_ly_10 +00:01e8 _wait_ly_11 +00:01fc _wait_ly_12 +00:0202 _wait_ly_13 +00:0214 finish_round2 +00:022b _wait_ly_14 +00:0231 _wait_ly_15 +00:0247 _print_results_halt_2 +00:024a _test_failure_cb_1 +00:0252 _print_sl_data56 +00:0260 _print_sl_out56 +00:0263 test_success +00:0277 _wait_ly_16 +00:027d _wait_ly_17 +00:0293 _print_results_halt_3 +00:0296 _test_ok_cb_0 +00:029e _print_sl_data57 +00:02a6 _print_sl_out57 +00:02a9 hiram_cb diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..92be0be997ba2a79ee53a7a552bed9240f3e9cb6 GIT binary patch literal 1221 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHsr;B4q#hkZuFHT#cz~fTr z_y52CcRP#M1uZTuE=hskQPvhzQ0vAD1I)@td+?R=J^cHg|*RP0Nqi#^}`|D?9z`UP33Pg7St^_O1i ztfG9Wa;me)bg^`6*B+6B+gGiRaU_(YT^}>G?f**TE?Rx$r|#={ zM?PNepT}W$sJ!6MR@JQK=C#Z9E2NJ1JYL>%+H}X?+g_Iq=FOaU@x^kZ8#47$o)_-R zZfvSFu(0*rVmJTTg)2W=&t}Q>n;bOJ7v8M}zVC z`>A~vHx#Db`Ty}nV(cx+@5Xj|Oxv#?y2J7AgK^FhuMLw~&z*^$%Aa65<6*7lN98V| zBb;UzACx>hsMgHF|Ky*8$|Ez&Cs59y7}wDncGX^X0Ug^2-bh}v(|Ls{-6uxtBYR&he#usr8 zJC8=#=ASmYV*37O?49mu({6bEkMH9P<(~e%g@5MM-N$uL*RP$%v48q~wO*^PH0M=x>tpFCe`VSZ8dzBT`$K&2bj4NHPO{^=j`51LlOZa4*T*~lIN}$e!bj(@_hHT*C(!4$k@letgqi-bpB?_zeNjGJnJ&Dw%5LN zxj5tJJ(bq(5tTra52ifEj} z{`$P(n{D6LsYzM#`<1<(2#kW#M^C0-s(PCIe!*Xn=({F=_j(G2b+*6rl(GNIaqDE) z{P=fAz88P0p8VzO?#Jg@FZ^yU{PRV5Mf8!b1->R5n_zhx<^$6FOOER2^2QmH7BsKd RTMH_lJYD@<);T3K0RUH7MAZNQ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..b77fd99f9de559f5fd9b3071976a2b8b065ebb0e GIT binary patch literal 32768 zcmeI4VQ5=b6vyv-&AQhn?Ox5Cuk*3J#89$1N7oG(OZH6C*EU(BEp6wZ7OXAn2Ggyu z$?6uf6#bz1MPcBCGKXITL5d)ZIX0rjv5-YkP!XK;gAS~745sLcYrN;4+?P!J~p?(f}K*oUQD{%7{%KU?;%TgB!Fluv)2oV?t`ymg1zi_FKGnAWoXjK7H_x5hJ8_`-+T|+F4<0Tgsjf^mE%2xJ} z&wKNRv;2y+#ILVeO97TsEN0J?ZuJIo<(6}bGR8_bdgpWHn_IN}4_|)r>z3v6TtLeo z2{hytjqyBtX3>}Dp5j;bsYS22`_3*eHjBHf_W8voad&>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&Ih`?P-AX{Vn|An&}nI--I;{ngK*0hQ-rfJ|0bE}PmCzHVs_%&_a zx^UPu8yllhSTQzs;>5mvYu0SoP+t#m)3ms?wzjpkwqickg?lhf({;$ub@an;4>#~b zeB(ybv~APexDgZ>3~1YMMJ=y#1?Xs0daJ)NUsbWTWyN9;GmKCu!7UUr4A7cp7*Jc& zOcQi8nn-v&hGAJ*asH)FB(MkMhr`KaCWG~}*;p)-QB@g_MnOXd%+F@;><{(eBjb2) z+p1dK16Ho?S860wUvC&=V}^meVP=>Vrv-&E$N?3JI1cQGFzih$XYvZaa_dhTo`$1gSeZF82*B?I)v!Y=?+>3mkGc%w=-0*zCT&dKq zT@w>>K8WBcg!S=wFt~bkwO;kS;Qk^Jcw4}be=LUYj>iMj!t)ht8ydVA*Y&@?zmNrn z_2hepKDb7ss%qOkJ)NDPfDD}9@$u17&|vsZY^cE@J&vR zi~x1G2iv^4qXQl~Dx6S0AMlNij*ll2a8hG2(4C!dTHqa21=CHNIy#^)#Ble90kfml z^=K3(sP>0mZEb7UVjRw3_3sP#X1I-vOiotga0Y5Mo&jCQcNYG#LKnz4O3R}J*^`VvV-0sqNm)L1x@;VR_}%WXYE{8V9?3Q$xeugF~!j zrQs(6*Cj1~CcIsl6FJ`a&`|f_aH{`tHz}MtdM11yPgK4TDZb(Ep<$~ho=SH+tgzUU ze_`>Sd}h&~uMWpfF8TAjm+r|wb+oi5eT;wB@{fP1CBGxQ3RYZQzr5P|iPto~6MNuu z&h6%dJf%FGf>G=E*(i2}A62@ARO3wP$3UmWmXv(|Qe*yXxP=#0_M$&vvDLxD-kl9z;XOMWe+TN1b|Vm>q& z;tg&IsV10Gw^M8e8r1OyKH1=Y^j8{e5Xx;35z=i?e3F+;3!mD>lqYa0lvH_1uPk{0 z{gsj#q1=+M3h9=FnNMLp%sjyxyeFjUFy#yepuq~>pjkHf4E>b`SA=pKTocl5P~6W; zvOd_n+Rc!Ajmh zmknM-f2G0eLb(l23+Xl}9^)lH5I!}{lnb~NO4jp|t7OTq&|fL}y-;q+n?kxJ`OJlY zo@-$-<;F_>wN!=1Wft}X>x|zDy~Xy@gXvEr#vGgb1 z)GwtgU7K3CYyWje8z%xpfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; vAOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW4zuM_waa^n*I literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/test.sym new file mode 100644 index 000000000..5c3762543 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/rst_timing/test.sym @@ -0,0 +1,201 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/rst_timing.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0151 _wait_ly_4 +00:0157 _wait_ly_5 +00:0177 test_finish +00:01bb hiram_test +00:01be _wait_ly_6 +00:01c4 _wait_ly_7 +00:01d9 finish_round1 +00:01dc _wait_ly_8 +00:01e2 _wait_ly_9 +00:01f8 finish_round2 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/serial/boot_sclk_align-dmgABCXmgb/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..4b71b5a29309a0cc3c87a5bf4f68ad24387145f4 GIT binary patch literal 32768 zcmeHOUuauZ7(e$m>u#I0y-o-?bJO`GxV?<; zV@b~U=ls5Ne)pXGSfEQwcgN;-Meh#q9Y$qy1Im{_O-^2{WB#fG>?jMcI;J(QfBhJ% zzkG4(+LbHcy>s^Lo{6dY>ld$Fe&@ZjXExa{?A<%H`{msa?HRWY?mlpkjgB&I$|m;E zr#@RNEzOo1W_$ZbcI??}A1SGS#(aS$Gu%!eL;;-wx(M`LKwpQX2&9IjhNOn1hNOn1 zhNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1 zhNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOn1hNOo7OAT)p!^z@f$>LI9i*=&d8*Pa% z6&7!}i^r@5{{E)5aOeXoP+e8OqFGy4*LvT^5HtQ(`lH1_+Gu!kuXSMe{%3bRZ#_G8 za6fBy@;4vWazA|Y#jg)9F3q-RxtCgMa*D=^w|ebW^R+o1DV(?8nh%K4CHu{JzZhNR zqk1vA#z%Ex^fMpnV)PpyHHgvT+!M(={1<@)M+^`H!~iis4BYz+WS1HI75g$bOa8sb z2Rzf|rj?B`O@nxZ+wwd_G8ue9T+`OAi$qMbwl)@n89R3#KmN=!&CMG&R98dZG%aqc zSGTsVUXAsL3u7=%({-rOb&SKOj~m1x-_~ZDwr!eiZQy~y0&N@K(Uvf^>b8Adqla0`bG1AI+048Ybj(*!>ja~z+~Ff1!8&cE~>2YWz$B$7;KGKine z#^afcs>*yU20nDa`fT?0{(uKBna8nht7>Hrh+NsP^pT4STn2?R|_8I zpa#5X)OBG$jNxq9q3fPJdHnd;m}Qx!!7UudRY3jpwClnP-sSumZmt`R$~EoGG8xEMeB>MY&&-@WDd)q^vsrj|9H_@93;f$Q_@)V`!RM3puA58_4D8#NOu8=Q zp%WVJIFXo`*uFiLN^pa`hN(s>=Nj49I?v*Y!Xk z6vFw355ro~upjP4KF=dZzz=i7^9AclrM7RMn2_s(44y)mpGbs4O-&WN%6Y;4MWb+A zz>xoV9Pf_L2djnWE9TbJ_%W~R|GvLa1%`O?-eC;hV=+~=?Vg^lF7SXEIKSiLV`Jch z;ho0)tK4kcab!K-7`O%U{2GR?N25A7oXyzg&FQr3Zr<$k;clW);3pi0Je=(^o#K9j zFK?u#?b`=C4~HX>j*j+rs0Um$M&S2&H1!70IjgC%E zR`PHLmiu@HbRF+3e6vCqs5ebr@8G8E$iL)Do)~!k0dATm*9WsYJJV_Sgr{CH@TWh% zuqG7r8^4e6(V>vv_yZ#6tQElr{KhYj=3Cf|!mQc3TfHr8Q8~rLi2nePy|DZjfWo=_ zY{@BYE%lYQ*^Q;R{a2}XPEX$U!@*4Qzx;5}$a2aXN%-xccCfoQH8k8kIK+xp8vaG$ zeL>5ejy$T&iW+}nXsCN|IMx58R}@JdIvu&67b;(ilE85H(6H5$NTs`7mY;9Ty*j@t zmzfXdDvM($7J|8vg;lv7hluB@ z*`Yj=f~8jRvr*U@*`jm{S4}Xb9}`^`TTpWS3$?j3kwy-x?7?`8#hQ%u%8SBV(ci}b z3|)CmxEh=_ZmiJ9Ay0^y+QXFhaVkJE4p}21Kf`z#@`CU@$Zv(~K>{!HSPu<`c!OKQ zRUM{OZ4;Y;235R4KsH#5@p6L=!t)wLh3hpaJk24~BBpL-%2PNMAXN_OmylB!FGFU8 z=Rv+9Tn`e~{4UnRnkRUJkA$nbOgW7SXt07esFw}C!g#sC72$aet_#;|Pni;d%`UuW-muL`+RH>o|kdQD?KbjTW>FYTgF|l^g|iyzP. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/serial/boot_sclk_align-dmgABCXmgb.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:3828 _wait_ly_4 +00:382e _wait_ly_5 +00:3844 _print_results_halt_1 +00:3847 _test_failure_cb_0 +00:384f _print_sl_data55 +00:385e _print_sl_out55 +00:3861 test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    g%X`gsWP*YU6bo=o7iAW|4ir#x)!V8rUe~T z&0@tpOnliun1XC>FJptz4Fqw5gb8AZ*g=cjLZM>&V{2N7(Q%wYu{PcJ#zX=t8 zS0a_}uu?k*`&pxt|Cia4JP{xQM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCxN3f$Rc<|6*U@X378m@qlN#(6ov%rfCq5a9fy%NG5|Hh-=!KHIayE z*4M{kFk;W1vuF43Z){w*uC5O9rfG3&YHDq5YQlQdg?lhf({-rOb&SKej~m1xzka=G z+O}z~Uk@G_OwhLBioU$c5#YySGFtt{dR0Yj%ZkS#XBgqI!z~;(4DdD0FhE<=OcVTA z%yE1^!?3KZ*#FXZ9P9!0kw`L`$)J8V8;@r)sw(rb82Hcu>$BO#{Xq{tGLQGRt*X^E zpmKG+(nmsdb%wELk6|Ehm@~{2XA2(Ypa#5X)OBG!jNxclq3d3_aQ5uTh-I0k!7Uud zSwQ{dr0c>5u5$boH`k3uWgfCJpUK4Ilaq07nGEEsKJteCQ&Sf%$nmi9Y!AH}IPH4E|L}F}gXegCRaD%+#jE?sA@7U4Rh5Du$ zsu(_BTpubx{ldJe%Juj4$$pU6^*|sL!tp0gz+BO=AFf3{&yy#?4|Bu)1@lU!hK9z* z z!x&s+F;%tguC9&_@PG{L-_g;L5%9tAOyl}hZno_>vK~(ioC3Lj4MW$XQJou(W^Bur zblP>dZ1MSUHPI;W35OvMd%J>DoNw^uiPW@-30QeJ9Er5GZP)~+;koJOIC8n z!1E7q(=<6h7}egMPQy1m^{RnC`Pt3pP|$BY*v0RTh5W`th+MO3gU|Sl-?!#l*p$Mo z>FbZWTiBd(k%>G0nwsp*h3}~;T+2_FoYMAEPicqUP>S1smb$O&$we=wnMyv+>unlX zPC1i=H{8_scXp=+20Qx)SkX$uPZX|YEq6JxRhbqw{=~pQXa8WTcc)hrNgcZ!d72k0 zUyG7}cu@|#=cdzT`Pqit>$59!nb}~jIyrW(9L()1ugvW}R%}ck=bvW&36>jjFGN0NvxyOrlsFx48qHwxP$+mue>stKm_Vxq%hWhK{JuFqYG zG;mR6AI4iOw#rzmye7Qb-X1Ps=*kp$)!^AbBtFc zZwk+o{7$%@BygFM*5dhgb|WsNoF)vcYPMR~oDnp4T8MT(3dlB`%p3 zF?BmrUc{jwsd7oblst&>ieyH3p5z(fdXg~bcd;JkJjNS*B3#vF%4JMIgIeBTxoq$i z#w!hGgy%K5D_pNZ;Q*IpJ+OGSlPUG$t_CE1TymL|3}L(?*(N+sa+`2HNtkm#*2A0+ z^9C;qS4}eI04AWp65c?U4NhUa(%^03c?~WK*K1HX&LuC2n3`tFH5>|(bzE|Vl>8Rs z70Dlk=Skidt|!UooNv*m8dzMpx1@NlJ6}J?BEC?K@gUz_Xe&OOF0>hbeinXRTgQ3> zOY`=Mi*xl+^~RDLZJ~TnNu&W_onii|s6=?NLyzPR)q z8F#(Xk7cNHap@N_p7ct;ks>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x PKm>>Y5g-EpEdqZ7Qg{LC literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/test.sym new file mode 100644 index 000000000..feb7bf6ff --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/div_write/test.sym @@ -0,0 +1,205 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/div_write.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test +00:0182 _wait_ly_4 +00:0188 _wait_ly_5 +00:019e _print_results_halt_1 +00:01a1 _test_ok_cb_0 +00:01a9 _print_sl_data55 +00:01b1 _print_sl_out55 +00:01b4 test_failure +00:01c8 _wait_ly_6 +00:01ce _wait_ly_7 +00:01e4 _print_results_halt_2 +00:01e7 _test_failure_cb_0 +00:01ef _print_sl_data56 +00:01fa _print_sl_out56 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..df025f2f234e8952ecec20ac525a76efe45ca209 GIT binary patch literal 1158 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Se%r;B4q#hkZuFHT#c#pAj* z?(6^kcRmN$nt6M=DCF9_`)jma_vi_|0EMTuwe|J-3r=6Z%IKiOA;y02kwSzFOLucZ zp@7c0>d0x=UvK>v%h!GS?KSt=iC@#wt2_w_tgDu zt$RbLa@C*bAAV2Ry8maW=If1nwN5)nox3FD5b!f;&uRN_Zx`Rvo;EeZHYHbTa^XWn$>BfG1=ZBN!%r6$ZT@^g^G3ep+v!y^_FRum zO*j4#%9(la?N+f{O}o$EtE)J7vRCM4`x@W3>@zi%UW-hh ze2C?U;%(Q%?b^o=re@B(-Ym(^Z@J@W)rZ>S2Nh#W=9OO4e0@-C{*5r9Td_@HlRw2| zy{P(799^KiJuZDOx9!#PA1Q^WPPOt!_7>jzrP%#Vk?(Orp;hswIri3G+*POM+Wp_N zzu>>7Ewkt6MbkGtZOmKs@ysm#j>Y!+w|;)&>ubKQTf1@V<$tnXuisC&ICIU?FyHc( z-QSij*&TCnUeDtPEo*8+w@DvY1nK@CYH4?UuVt+JoO8WpHd{4jU3trPEKx=WDW;Ip z+53>C_NhDmXY9W_OMJ_xs5z__>0KME;?#fY{?AF$U@yKHCbi+~{r3H0Yu@dd|F~4F zGdgGr|Mz-6``9n1E8b82`dc@9_f`*?xi&dV{pJ7t^O=_`zV~?4hn0EdQ3WN;oBST? zMA$a2KU(|#YLsd3ZCSSZ#TUxE`YeuG>|if1x%kxX>LtIWO8HXv6Q}PM^c4Sl%o-ROEcELao?zVzt#z<8_<&=vVE0q^Rvbr%;8LJ8j~Y m?zTuoP@z~$yaOpx`Gq@Yr#|#G3ne<0T4iP>dnV72y-Bt48~v}-C!V2kgzf_#B4CoA*ke!%|ALf1UH=B*6yBra$oBH8lnuw zIW#Zt{J7t9@8{iH=pTKvvyay%FDj2$@CmE2$zJ7~pGQZp%wztl{p=VEuz5^tT=w>H z)^Ov>p4&HXUVs0>g`FdN8tz=VdE@;LFPvX%zqWVpo*f5wtlBwj9oVt|02>@++?2I! zRqd4RE6q-n=9hf--BLAoYB`QS;M-=UTK~b%tb4_9viN+mINRN9ohp8;G{Z&8aflHbi1{=$4YG;=wnSz{@xlb z_v6*Ce_Jy%JJGD=-e|7NDH$rqDP7$(UR0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)z#|jL&N28e_Bn2r{Qn;h zc&2krD;r~)2Jr~Dxp|0WGWdbGrY&6>iI`@6eJlnewr@Xqa@Ve=rsd0PY9Mc#7Pm!< zT3Qw@!g|z&doWGYb*RvFjKjB&8^j^MVufkiwrQ?d0Uj7k(6-@m7~!zPEgUus@HNdaKwHyH6Z}}raeO|*u&k`u|I&9H>;d(WNHUqppnf(R zk7qKfD)X@z_|O6Cv)PCHgC2Zj9`9{iRV!;i<;r@ckA!M!3}gFt!$96JXP7C@7Cg*B z4S3P0>%w{%!_lxp*FAmuhZ|}f7=G%G+{URe6rqklgZxRefyG0*M&TE zLcq7;opPN@zx&Gc>*$?u%9tea& zIR3~Hm@69g!?nogdGsjwVQ#p;U|y-zmMtSAa(9*}|kJ3Krz1U?v^ zXY@1LlstuE%09gGzts)zY$fG3H?pR(`)g>?pUv!O_u5 z9`?XoANPQ+Fcm#pNDf#)CKrfG71FsiLBorZ6C>J|J$yxpe0ucIr~KhV+F&x%$Wexh)l z)^g_}>y-&n<4^SWck~UUdNzASk<_7ck*9f~@|`FN40QAlSn#Ht4wvPp8gp+>Ey!i2 zg1O4%*s1AYZtL`d+_po-ru1R{SBig(k@+y<_Oh9U)=ym1xFy!WU%@l6l}}`w z@>~k0TE+K9VPj;2(jiAj!C7os|3%<7LUq!t*4*7p^A>T&A!d8uar94}_~a zOsU!=76T2cc!Pj!umt1f2Fr!#HHZq=YfyNZOQuCk-N=-ea41NsT+%Nk_h7s%nGv2R zc|y3JB+U5(tcN*|@CIjvtGY}%hY4s<%^Nhx2H#@5+~B70yasoK>oq9s=8~)%7O!?N zrC!`sfuxU1&XbZMjF%-_h383b5UwW)bMC`>nDc(#;1%JjNv7<^1T?7S4RqPy7{<#D z-W8tL;EZs+28F|1@(U4D(@eRDLqW2JOU{>)*Dzj|{6To03_-nGn zoWun3kNnpW4I~0YfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y t2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0{<<6zX4N854QjS literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/test.sym new file mode 100644 index 000000000..b4a5cd5bc --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/rapid_toggle.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test +00:0186 _wait_ly_4 +00:018c _wait_ly_5 +00:01a2 _print_results_halt_1 +00:01a5 _test_failure_cb_0 +00:01ad _print_sl_data55 +00:01bb _print_sl_out55 +00:01be test_finish diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..4776438956f1106f4ee1cf646921c699f7f1e237 GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHyr;B4q#hkZuZ%r&~{%5yrW1O6}F!9%k?8zaPIWsZYPBx?`53+qBrVLf`#^&i`}c z%UKe`}qR%jwP3kzsrJ&vgzRjT}Q%}A&32XLI zD}8x4jKR=#n?z>H-gO1(75_}_zXiPSRsC^%%On1yld22;Uk#g{D6zVu=4H?24)uRV zlNQXk{?Jsn!9qE7Oa9-?kiyUAX7@{Nu0B2R`@iAqLkFujTvtk2yxa8tl~1ucv9T}3 z_m|p6xaRNQ;uV*!bTzc{~9p>SzLYeW!Cn%t|EJjpHF|hs(f9lvvQI0m*(#!-`IXGvUnR@Ge>o^XW_4ddY=!@ zZ9gvadcs?F>rYodUpw{p!DY8=HFLf+KRkSaUo5@AciP7yg{>#U)=m6$=HYVAWBE?Y zH@sdHyhqK)RPOlCXRc??v4`td@2j8rZ^_w9|0TIzzn^k*;+ik2%4MO)uDRBWJN`a+ zk>jfVewQPq7ps+~Ps(yFvbgIo=UDHxdHH<~FN&By1FeC@B~n7<5PNPLlF2VQEr06m z=*LZKOLdR2%rQI?VY~jL>;4~$JH0I>yY1E(TL0ZYwe#D#rxNQ8J!_<#&;R@WuwHcU zUptHCI#ySOF5J2|OXc2n{Zo&OimcE5E?Be3J4)E@>RUI?xY&lMwBclw;S*e$~DIqF4TT0_V2=RPgg&ebxsLQ0LI}>R{#J2 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..afb0f6c1eded27487928f79d1ad1e7a3f02a1c91 GIT binary patch literal 32768 zcmeI3?`u<67{|}OP2+8w)?4G;wO;IP7D{wgYL%IF*)>UT+r(yT>5mCr!LG$BxT&CH zoo2D(UQB$mL17AIlf4-XMi~sm2@+N&hL{ZoZVc?mi_I6ElY$%0vb8(Ud2(**{)F{; zXm0NJd7kq;=X}mNg}&&@%Gx$I*Qb2@`^3cUT2@nWlAUKhR?D>d#`i9;y1TcJ-J75P z>GJjKhsTfA-M>A5_wvWrukE(qIDY)tp|=n1I6P*ZI&|_B8y;rdl-+E{3%ef9dOgLJ z;`*XzvRGO4+MeRNS@F)FkhNBAvGM>1LMUMW7b_1w+@)oIz4OhVyOvjGo3!j(O;uS% zV}-}vwr8O(%RTvfcI85?czZDSQetgiQd&I`AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2-BLp(54E{HHmCTU-|M7r5U2R&)7}GTHhq$edgD0KF5BN20 z>()@nG^?v45g0K#Iz4^l$fix(wt2k}H%*J%=FQE`n>S-V)`fR4P1AMA&~@~~w}%_} zA-;XPY1+1FZr=_H3?^vX@I)=2as=o|M0(5Ln6Ii>+p?ljh#5vO80QuY8U|=hGYqJ$ zX{HG}5{bt>9>cJ#j5z;N$K%)o@j=IRj$9UPxgbjuKRp}0FFO<7UqhE{ctUEKhK>59pr}R3+9zf z4h@Zu%lSbBPa%wt#R7qi8_V^|=LOdn4#RB$L;ley-W`tzW()f(##U9;U|iS#dw(Gd z4C~2zhdy{lBC2ZJU0v<%pnwdV-?6cg5zt_Gr*Zu%H`|WKWj@{*xCQe38iuZi!#Xz{ z&Dfqjsg&dF+2irxYQkaQ6AVHe&UOi>xZj}VjnuRgCt&5lU?|ku+R_5~P!|pPf^TAC zco?X|JJ`;hZEdjWsBngIf50~~GBy^E!%2-sLASTVX@NVa3Z^YBZEesOVz_$4fVrdA z^+*I}Q0@=CnwuLMFb-$1{QCub=eP|IPfV2Ka0XUuJOjFpcNTuLLKnz4OdmiWdl9=#jS>bzs7iUfWMs%)EIw(=Z013f2PLxV{fjB zO)1QpoqOEf#FmvSOuR)`@|jzU&hiCoi9g@Bmhv}pv&DF^qu5j2Z`T*2_TR(oWDlM$Y)YNsp9cQ%FV$yX46TO|_ZpWsTEFp{ z#?N96e4euh_(TpW&n02175r@EJ3{-EP9fD8Q+hGbZm}gL+q+bqy%wtHMU}(oZ?f1% zqfvQNsLI|RUck_mcZJm8tZ`%c9$xa2@Tpx)`2>eTNybZ7$&z28zf|&;P;SW|g>*{- zmj%p+1_QjoVI57ifzzC|zA8m*3Bu_?6eCKklZUm9CB_Q$Lh`$4&iAx;mds z{aX4HZt5NBO07=Kt&zXwXqiNS2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+Sp|33o%0{!wr ATL1t6 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/test.sym new file mode 100644 index 000000000..27f27b8aa --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim00.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..4776438956f1106f4ee1cf646921c699f7f1e237 GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHyr;B4q#hkZuZ%r&~{%5yrW1O6}F!9%k?8zaPIWsZYPBx?`53+qBrVLf`#^&i`}c z%UKe`}qR%jwP3kzsrJ&vgzRjT}Q%}A&32XLI zD}8x4jKR=#n?z>H-gO1(75_}_zXiPSRsC^%%On1yld22;Uk#g{D6zVu=4H?24)uRV zlNQXk{?Jsn!9qE7Oa9-?kiyUAX7@{Nu0B2R`@iAqLkFujTvtk2yxa8tl~1ucv9T}3 z_m|p6xaRNQ;uV*!bTzc{~9p>SzLYeW!Cn%t|EJjpHF|hs(f9lvvQI0m*(#!-`IXGvUnR@Ge>o^XW_4ddY=!@ zZ9gvadcs?F>rYodUpw{p!DY8=HFLf+KRkSaUo5@AciP7yg{>#U)=m6$=HYVAWBE?Y zH@sdHyhqK)RPOlCXRc??v4`td@2j8rZ^_w9|0TIzzn^k*;+ik2%4MO)uDRBWJN`a+ zk>jfVewQPq7ps+~Ps(yFvbgIo=UDHxdHH<~FN&By1FeC@B~n7<5PNPLlF2VQEr06m z=*LZKOLdR2%rQI?VY~jL>;4~$JH0I>yY1E(TL0ZYwe#D#rxNQ8J!_<#&;R@WuwHcU zUptHCI#ySOF5J2|OXc2n{Zo&OimcE5E?Be3J4)E@>RUI?xY&lMwBclw;S*e$~DIqF4TT0_V2=RPgg&ebxsLQ0LI}>R{#J2 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..8bc8a83e4ca344223cc0b69696d6204004bba68e GIT binary patch literal 32768 zcmeI4@oQ686vyv-eTlDaT3?Opp8C+&ER^U}YArJ>*)xf+ZDO;vv~@yPuxqgjZYt=X;I2BtTyd;c_RymjN?o!hs6 z`S|kXed7lk@7}n5>*G%^U)t)tdFar=z3=SZv~SEly7$OYHayI@DO=g5`2G9SeyzMv zUS8HF%f7PT(aOsv%Uan78IQ%v+N^IkpM^cvDR}o;-=6zh^!)EPzx#X3{K9mLo`1Wg zHm~Tc^svX#W*YO{Q@rE&W*Wq|dskmhJ>5r>c25L|01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>@uQ$`@S$l%|nFOoUZPacm){|^GaVvOlJ#3J05=0qad zEPlYR>uc9WB9>KG7mLA)(b2PK_wR3RUccV&hqz_g+*Yk>ZC$kr^RX^`2h(-KfDFSx zKm63Vfgj=*sRucs8r5G9HV8h7OpY%Ps8> z_247p_}y_-wYmqaT-~qKNXYLu&CyZQMBXqnOp4Qj!WiU$ibh=*_QM#ih8?=@`SWMb zj*Qs0WtrT{R(Xb!xMZV9ICqaj~ z;rW8O(&=5h#>eG+5W!Oj>l2AkXywXkz3O?v{Y9g2TfmTiJdSrq(_mV7zhZ4|Z9T>f z;wg5;QWq_jf{W>!#j=pSGhS(GAZ-%#=tF*=hrk1 zBN{ch;cCV@Ix-p8?dZ@n+)XqJe8ORf!`ZIj6!#mnypg(o_%Q4|9F9cV+BR;4e5i|t ze8D#{F+2>^;XByo&F$^*(ox}r^8J8sWMphCnS_%XkAv>)gwq0dP!&u!ZftLdz7WIR zn8izBmSmPNm47{`On-#i1zGWFk z8#lv1{*skEG4TEa+;m;e2dmoKGa2{^Z@p@uC%?MBIuxuoAMEDej)m&Yf53Ca_647- zH~-pJXkk+dv!|~<>}g^1$^|CA#TSaX>$C3sX?u=8Kd|SDR|?bRWO+xqx4hG7D#x9F z%RN_(R4JS)y_hO3^tRaNN>iy8zHWZ;vSXjy0e?-SuUTK)(E7~g5HtU4VtM6EsuakW zbpu^J>A|6{fk9TXGw>%0&pADRF|tjW7CH5a!NIP9p>*FXUQ#4|>|*3uo~ZmNQUXI= zgF|+ABAw}SSz)Fr|L)9+e0C<7uMWq~%?0zj=T_wR94j?vj`PoI{t3=C{hZT3$ z&9Aio;5E%(#UA*a)4TZ~dz2T_Flr4y8^s-w?Mj!BYJw?!80fUwoRaUGtIJ=CH1VR! zKJ>TPY^AwQc}pl?UoS6U8p?Y@>TuS$v0^VTc~1D$Zl-*OOQ9s=C2M8LZ_r;Ud0i;4 zvJNtKtZmn9FPzfv+QlvnbMkX}ic`4h~Cna6p9FNIWHrd-4TH1P2Tjk3WH=&v-m zEtJ>bu8>}X;sIWg^}^=WE~eCpZ#7U-<0Ttp$q@Q0CEJAZN^Td@D+x0XU_Q)zgg1Cy zNHxWj0~mk?%XkArHaLa;N`nuD@)}$a(rZvW&P#qRd}@X%S8yqm^z)L-Wyzn=Un%*U zP+rOVLV6|n%!L+Xs)@yw*=42KoS+wFPJS zh55RudTrUYwooCcBr*WdZ`%nz1zeyt%8+z*S6sm$ZxU4Akp85XdP2H(EKU7L`du&e z3+d`wn)>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5qNS4 F{0}tMNb>*y literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/test.sym new file mode 100644 index 000000000..fa6a0342e --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim00_div_trigger/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim00_div_trigger.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..2edb1ad917967098e3b6d7101c32ac33e89f8613 GIT binary patch literal 1209 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHgr;B4q#hkZuFHT!!z~h=Y z?f?JN_t@VX#9nB*v`mV>dVh~{K+<+y-IcrS=AUOR`T4Vi!9bj)yE&myK!>mCsN)6; z4zcGObx!YEcl-a-Ejw!N-P$tSE#4|+`{!*}wT^UM=70IjCa(UJmyY&|sK}>wSO1p# zN3}<^Mm#U&D|Fgr`Fh>a2;Cn+Uqina^4Z+V>R-O}kM-y4O{+zpgxtKUS6HpS_09V& z3EoeZetLiSzQXH@kE?^OC0B<|Yu_?wscM7g)9#NN|1G!mXRVJ2TV#6TmZ{qF30ige zH9eoRetvI!J~9zy7$_U6W_Ur@UrPVU4QaxNV!rr>@+^zubIgAC-E$ zXf@Bi>CD=v`@B zivQd+{`8o2#!WVuXR{VA66|_C)1fRT}r@->;;G-`b_eyJlBr32-^@G1k=-(RGIZ~UwUfy$_#q)_J6Ta%se{ohmJ)QfTeaY>QwHL20I<{Z@fIR=R v&SE*w!%Z5K$}S49LUT4=hfwGbu=aEI&${^aCD*Sp2Ng-4u6{1-oD!M<-;Yl@ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..1e639181190cc33eca9a85aff46185e1e7b47638 GIT binary patch literal 32768 zcmeI4?`u%3R(Jd6)SZQe zpFX^L_0Ysr-QAlDw?F*&>Xlvg>qn1H9enHH_Cw>=iG#;au+dS*P1(h^H;mq&^LmP_ z#q~wcbg{DNwJVG3=EOU{Lzc9q$`PLMzah3%x&Qu7E&J=OZ~ol5vO3qKW#4S7$|@Qw zJnXTx#kwr_WKgmAOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tko0U|&IhyW2F0*?WK%o>CLo4!V7NI!l&SUM({vp&bRGTh z^l$?|#9LZS)3!~sr3DliOwhLBj#}R32+)y;^p>BPuc}zvvZ7Il8AdP|=N1ea253z) z45+PXrU^O{iN`%2!?3K3*#A<;oyPi^Of;HKtE!AgBA}rI=4UdG_J?|K z$vD2-wyKubfR)SZl^O|oy@qk%fMFnSm@~{2XA25rkOL|lb{tp_V>lXC=s2^p7cPvA zS(a%U+=4-z1>{dpI}TiMm*Z!+IZik%;}DhcbUGTHo{n-$ry*X}$Q%04%*@Wp@v!nt z2JZ1VLckWj~1Py3ZE~;P}(0VXkP{57#2U=b1C0gWPa` z!Mu{m;o*r1IX{TtE`;&1SRk-*W4T^=zu@}9VK^;d$Uhpzv*Yo=Y~lNgu~k(y7}xdx zo?plU!+P@Ep%3nnh^pFlcXvkzC?Es-cYJ(o3^W*?XulnU5z1PJ!INhN0`> zu+9xfGq!toD&;u4cY8dzns6BS1cMNVyqs)n%n%LlA*T7J+?rVbvZ1zSf71+aYHt}=+BlX$1X1Wvm?tJvinaKHlo?sB#GX zO%~f|Y*pS6sER|WfAkC!60w&P)Ie-l!|>~G0>obH}J^@o6%otuuUkpL0Cw)LH-q9G9`R!CsSU= zp-@ugC2M5KDfE|0riF4#o)^+B33L7k^I^^tyus%}st!{wV*nad@&NFcl=SeDwX$RY{iTv^Lb)aP3h9=FIS*hy%=tKP@T!n% zf+#ny2a(*S20)Sr2it$;%0otq#NmqBt<@fU@e&sdkkGrX-rK|JN)DNWJaZ^8& zuC7N@zn1=ln|e#SQfpIlkHNpwXbD7s2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko z0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpPbPtX E0U|vhsQ>@~ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/test.sym new file mode 100644 index 000000000..f01524dea --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim01.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..dbccb8a19f673f1e89f131f15a7fd420e2943e08 GIT binary patch literal 1190 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/test.sym new file mode 100644 index 000000000..ed41503b5 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim01_div_trigger/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim01_div_trigger.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..4776438956f1106f4ee1cf646921c699f7f1e237 GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHyr;B4q#hkZuZ%r&~{%5yrW1O6}F!9%k?8zaPIWsZYPBx?`53+qBrVLf`#^&i`}c z%UKe`}qR%jwP3kzsrJ&vgzRjT}Q%}A&32XLI zD}8x4jKR=#n?z>H-gO1(75_}_zXiPSRsC^%%On1yld22;Uk#g{D6zVu=4H?24)uRV zlNQXk{?Jsn!9qE7Oa9-?kiyUAX7@{Nu0B2R`@iAqLkFujTvtk2yxa8tl~1ucv9T}3 z_m|p6xaRNQ;uV*!bTzc{~9p>SzLYeW!Cn%t|EJjpHF|hs(f9lvvQI0m*(#!-`IXGvUnR@Ge>o^XW_4ddY=!@ zZ9gvadcs?F>rYodUpw{p!DY8=HFLf+KRkSaUo5@AciP7yg{>#U)=m6$=HYVAWBE?Y zH@sdHyhqK)RPOlCXRc??v4`td@2j8rZ^_w9|0TIzzn^k*;+ik2%4MO)uDRBWJN`a+ zk>jfVewQPq7ps+~Ps(yFvbgIo=UDHxdHH<~FN&By1FeC@B~n7<5PNPLlF2VQEr06m z=*LZKOLdR2%rQI?VY~jL>;4~$JH0I>yY1E(TL0ZYwe#D#rxNQ8J!_<#&;R@WuwHcU zUptHCI#ySOF5J2|OXc2n{Zo&OimcE5E?Be3J4)E@>RUI?xY&lMwBclw;S*e$~DIqF4TT0_V2=RPgg&ebxsLQ0LI}>R{#J2 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..1848096cf2054a58d2d2cc0021f4ad558a4f5d09 GIT binary patch literal 32768 zcmeI4?`uUT+r(yT>5mn73M=RD^;&*wf*!54OA<;gZS*ROp0`{d-!dRA9;oSkJpR?oD?E$^OV4YzL|xidfi z(}!2D9-KJRaQEi??GHb`dS$2m`q86D4!m_>+re?`#DU`{*yt$ZrtD{PvMSTy-+XS?#;cJe6qhEt)2)F0U|&IhyW2F0z`la5CI}U1c(3;AOb{y z2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y z2oM1xKm>>Y5g-CYfCvx)BJj8n$gVQ@-|4Glmh|JtL;eK<`P9nBn5Ka*%uUAd84hPM zc!Acm&6~qv)2ywHMq$MM{TD7AI<#TK)~#MI#7)!UwsB)~^Tv&sk9FZ4Ow)87GISmN z@bqv4Kg3&FOw+bav!w+T7);Q%;f`9~+p=OYh#5vGl;9Q$83t%g zGYqJ$X{HG}8cifT9>cJ#tl0ljClc5L^26a|GLymj*=#J9$*8J~N28#j1LkM5kM@Up zaLG8n+qSA!)_|2O>y;V_dA)|Qf4^ZMZc`1mxqF1^%`T+B9J|csw%SagxdY{$t0INymXWbV9=w$Kw+d!^5dmoEyXwiShA) zfxUaXyRp7$2Fr%u7uSasAb)jSRpt8o`(;0f>$=Yu4C46Hr(v#W*bmntzvr1VphMhn zf5E&`so~*?2{}KA;4Xym@pv$}eto50WxwG1A`v((V8}lf!?WY@z-;0Bim^2{br{$6 z|DIpS0>gUp+@TNd(Wt80c6WD22Phx|`*(bNYz#CQo@rda%FVVD37L;422O$8zlNdf zk%-O>M>Do-S32!DyLNdzxSB`=_=G|bhrM0KDb6=&c_KCK*fCgnC=?F2wY9cFKGa1+ zzTlgj932Jf@D8?pdwV;4bW}J)`F+4QHa0$D!5y_%bwnlKJ~u=4u_d}p|gj!sTi;;;u+Yup36j%OBrvqBfhH%(n{ zWdpqL4Td`V1&P&4AvQcf#;f4?SH1u z_+xiIz@`;u&CWgS39x155)*H+l|uH$qO*L?TH^Qjtfj)W{A?*v>MZq^_S%i5nEiLD zXHHKRL&@Uv$>K_Hz`9tRP6qh6<<-MZerox=RSne}w9WO+Pi+q}<$ICh8|oSy zvby7`beF^O3yrzA7uMx63;tYXa_r)gKR2?pF1PPwaYOnPznb{vUuw*~5MB!-?rd3J zZ~ew=8b6CQ@OjRT@QLhGo=d@0tN7k1bcXjRT|%mHru1Q;!(vNHu5YO}cO~4&iz)}v zAF$YZV~g^JP}P0CynvxA?+B^EUgO3Jy}aZ_;ZwVr@(B)wl8l$EktM%Ef4Srhq1=)` z3h9;vE(@3s4F-9GheE0erc~_}i-87Jyn#nJDKt_ z4uz5`FIgu`9zlP(WJV~r)v2CoXK zCYf>=1JGa%Z=lNtXVG77@V-!PgG)lX4GO1t$uEUZO*7>h4uz6lUUIE0`2+gPC4Ujh zEqPx^wYqF2A2Q@hh)Mf5J^YEnS_DrhXv(j+^?K zbag$N`nB{Y-PBvsm0q2ie_Z~tM(ZE~M1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y z2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;c;X2B E3;J3jD*ylh literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/test.sym new file mode 100644 index 000000000..bcb8a2318 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim10.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..5452e96cc5d06376380b0992801c3fa3299f3364 GIT binary patch literal 1208 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 Fe*tUz9y0&{ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/test.sym new file mode 100644 index 000000000..a981747b1 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim10_div_trigger/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim10_div_trigger.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..4776438956f1106f4ee1cf646921c699f7f1e237 GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHyr;B4q#hkZuZ%r&~{%5yrW1O6}F!9%k?8zaPIWsZYPBx?`53+qBrVLf`#^&i`}c z%UKe`}qR%jwP3kzsrJ&vgzRjT}Q%}A&32XLI zD}8x4jKR=#n?z>H-gO1(75_}_zXiPSRsC^%%On1yld22;Uk#g{D6zVu=4H?24)uRV zlNQXk{?Jsn!9qE7Oa9-?kiyUAX7@{Nu0B2R`@iAqLkFujTvtk2yxa8tl~1ucv9T}3 z_m|p6xaRNQ;uV*!bTzc{~9p>SzLYeW!Cn%t|EJjpHF|hs(f9lvvQI0m*(#!-`IXGvUnR@Ge>o^XW_4ddY=!@ zZ9gvadcs?F>rYodUpw{p!DY8=HFLf+KRkSaUo5@AciP7yg{>#U)=m6$=HYVAWBE?Y zH@sdHyhqK)RPOlCXRc??v4`td@2j8rZ^_w9|0TIzzn^k*;+ik2%4MO)uDRBWJN`a+ zk>jfVewQPq7ps+~Ps(yFvbgIo=UDHxdHH<~FN&By1FeC@B~n7<5PNPLlF2VQEr06m z=*LZKOLdR2%rQI?VY~jL>;4~$JH0I>yY1E(TL0ZYwe#D#rxNQ8J!_<#&;R@WuwHcU zUptHCI#ySOF5J2|OXc2n{Zo&OimcE5E?Be3J4)E@>RUI?xY&lMwBclw;S*e$~DIqF4TT0_V2=RPgg&ebxsLQ0LI}>R{#J2 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..cfa08a828f2663f46733d49076e1af7a47b0594a GIT binary patch literal 32768 zcmeI4UuaWz6vuz}HcfBaw7oUXUF$_}vrwW_skO|kWY;9UZ4;ZVrL8M;1zn3(a8p6Y zI?ZCmJxqMrK$t?=WG{okC<8&9AYn2w#B4BdV_-)fHXk}C1vi{!Yxg_9liyACacn-! zb7*ev`Sbgp^ZVT2E%;!UmY!^5SNoN(f1Q}PQO9a44zrWY$Lg5YxbEFktp3)G1Gi^q ze>ivf^4{?S^>=Q}-a7Zu3RVBq<|~J};J+fp<|}vI+oENEzWLSfTNamQnzihk&DB{& zV}%Djwr8$B%Om;QcI8~1xVwAx#l(|+NND#&fCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oQnCKp?Zs;QyvCb2H@s|9Cw5_Xo6+F{Wvd3vqk6CKO7i z@dI&9Te~(CGR>NrNCZ~w-hJlGzJ04!tzYl;Lf$kjZmU zhi?xzh(mtE2Gg`{)7-EDJTMs0w&9Atyvh~eM{>FM$MQzK9Mj>Yy!C;(QFlZRy zYnowzwx*dT_>o9F?(rCgWo5+qmwr5sJ)k}mN+i;0)X!w1(R5l>Wj+!CA39)tCi8HA z(1VZ6)!eN<*tjwp=(dgu4lv_Ft`Ld6^q5ss>^t4LU;q%4)p#sz|&#S83e}BL12YFrh`2qo4fBZPiiiZ7gFYy^(7?k^mMw*?ION2B=ecswvIJYTW4y1Ewg zy8h_<3sqpKC*M1a!8H<5Rom|F?&tsy$iVp>8yg)39}M4V+`r1rw&QVGk8cdT1@inF zhOURhIyYR+SbKXa z7Y+GBY+_<$1gOJ3*yhb`ZSc_1!wKc{f!OHi*jPLcCp8)czoP?A3%rA>V7hT*TO0I+ z9PZvQV0QF%JraQl%Kf2NOG{G|=HU#Mf4@NN1h&Q)8u@xs;w=Rf^T^0Wdncm^Xp9kf30zUnBN@@)Ea+4ZCkFHO)1Qpx%!}|nJp^knYfEC8dzE#$A{W{UA*XR)`q!)`1_ z?LUh>SM@|8m?%7-C@l3hTW1SXiDtfTarv^NpIAO`MSbNeZEao4Q=0?K_^Xj+mD7oW zFJ;sWboC?$hq?v^S;0!dPZ+KXTJ~aSn=&J6YGZ?gT?0eOzL(shQ1a--(9^t7`Bs$p zhPnoatnOGc)#b38QQLN30I9Vr4JJw7F$rVeG4_&OQA+C zs_eyhv&B{#>y$TySJ~Ig1q@wzN4OfCHEt~5%O%f>nA**hk8vqTGA>yyCBMLUN%Fez zT*>c+>q-KbIjn~UgS^25;i_?_RO}F&fd&=4floGAgYi;>^}=%-goW!i$iKoRQzE8z zGUa7l3X&?9td)`nFkX^O3(u82EnHU;X8sWCVdin(;4|T>4pS~-0vc5E2KBPRHyAH9 zm=&Je;Er(J2KoJ5lJ&yo)h?#gh`S1q^l-^KDH*_cNwQUVuH<&%x{@&S0M^6Ihk1in zg{vl*vL6%Bpo%xpWrLF#FEw~ycy5F9!gU+uk8#NhBBrL8as`)yq?b!JNXhRoUXuJt zc&_9<;kuH1=3KKr)ySgCd{tq-Cs(t`LY_c{aX;6SZ!J8V%C{P|{9U-a&dd6I)j7N2 z{9;X5y;gOtHIVZwu@nIGT2_ot0WZ)RWk`m)OCi6XH}Na4$#~o?JuX9?50`!*7PqC*0DTGL%|gntKfYj-nPsfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z}}y GAn-R>u)*#C literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/test.sym new file mode 100644 index 000000000..b9e6628d6 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim11.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..4776438956f1106f4ee1cf646921c699f7f1e237 GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHyr;B4q#hkZuZ%r&~{%5yrW1O6}F!9%k?8zaPIWsZYPBx?`53+qBrVLf`#^&i`}c z%UKe`}qR%jwP3kzsrJ&vgzRjT}Q%}A&32XLI zD}8x4jKR=#n?z>H-gO1(75_}_zXiPSRsC^%%On1yld22;Uk#g{D6zVu=4H?24)uRV zlNQXk{?Jsn!9qE7Oa9-?kiyUAX7@{Nu0B2R`@iAqLkFujTvtk2yxa8tl~1ucv9T}3 z_m|p6xaRNQ;uV*!bTzc{~9p>SzLYeW!Cn%t|EJjpHF|hs(f9lvvQI0m*(#!-`IXGvUnR@Ge>o^XW_4ddY=!@ zZ9gvadcs?F>rYodUpw{p!DY8=HFLf+KRkSaUo5@AciP7yg{>#U)=m6$=HYVAWBE?Y zH@sdHyhqK)RPOlCXRc??v4`td@2j8rZ^_w9|0TIzzn^k*;+ik2%4MO)uDRBWJN`a+ zk>jfVewQPq7ps+~Ps(yFvbgIo=UDHxdHH<~FN&By1FeC@B~n7<5PNPLlF2VQEr06m z=*LZKOLdR2%rQI?VY~jL>;4~$JH0I>yY1E(TL0ZYwe#D#rxNQ8J!_<#&;R@WuwHcU zUptHCI#ySOF5J2|OXc2n{Zo&OimcE5E?Be3J4)E@>RUI?xY&lMwBclw;S*e$~DIqF4TT0_V2=RPgg&ebxsLQ0LI}>R{#J2 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..9bc1e4e9fdaa4f762403547bf5e87e2e9d034fdf GIT binary patch literal 32768 zcmeI4VQ5oV6vyv-P1DylZC_32p8Bw_St!w|)aqtdvS*UMwu#Nw($)!GLDymx+?=3e zoo2D(K1}?wL17AIlYJQsMi~sm2@)m~L(B#PHwJd(!{&$1iQtAaZ0+v3C-kfoaXH@1A0fH?AGLIY0m7 z*^3wVO&n~zb#4B}*^e$>*kZr-`s)YxzO{GbzH#fw-or=O=qTf+Y+)OfXYS5tuy&5KKOZCdutw%V+s zvBLd6+q2M^<(~XayLzEPe7k-5g~a3iW@-0CfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oQlsi$G?X!M{&mCNre}e>@)kKM1t4F{Wt{3vqieClpGj z@dJKMTe~(CGR?ZWNCZ~w*)ub(+U_5I0SW+p1OV?Wdtrn!DSC@>h%w&96dKIIC~k%;tGeqz3=Vr|QcMj>Vx!C;(QFlZQ{ zHO(-fwx*dT=tv|U_jnA$vNGcQOC67656BON5{Yyg>t{02XgaN`G9HP5h7OpY$voH} z>cL0G@w;uSYGn^txw2oWk&xGG7<={@2J(iPVN#qH6viM2R57HSExFW@l$+ z#>OnmG!1USAWi}KQ&WxuA9%|3)7%^<9F}p2%6K{*jZRHPxuw$(uV~~A{immAXXSd> zc_stTcpUQa%>sYh25p*f8ay7E?>LFX;NYP{iG<@o96F)lj$^TjiJd!>$rv|?$K&JU zLqj`u^!8$X(+rdi-!JYDD?tA8xT?zi4-U$H5Z85|FA%`>$B)CTXxI<;BH!nU6QG0K z@O;5s$>h$R6BBYih~O!N^|4qW(9%+=S2-`Zzi=3C3mEc`M)B@=JTNW1U$M5fwjSfU z{_y>UEHJDm?;ZN!8HuQ>ZTI$eb%6phaDK2ZNzdN5_T@kPmgy zkT3WqCr3wtI(!G)w5hWbUOFnAP`)4Vjg5_u$K!BPqfyXZU2t094yuCbh7Fya&=+F3 zd&7X)QR{jn0uxmFL$CJs)vGZMXRz}71$-yCjgC%ER^o65mTNo%x{h}iezQUs$Tv-0 z@8G8E$X~LOCkEcXkDI2+`CwINXDS6h;jLE;^wj59R|ov{#=Twq+tEP1@h5mLS=Iih z>W$yG<=WV^!mPQ=_xsw|qH>OjZ_%ZE=IR}1@sw5K&-biS{!(tP7%z4g`-?m5=3>KOm5<{y8lIs1I530B-} zU2L&_{bRPhEr*qEO`+9<&tTk+>)n-bW6g_A7VbtJi!}$CZy^xwl>{&ItP zq1*tAdgqUa~=!44}VUvO_4h6YX(=i2n?W)@ZM)D-UYQ~aAa8s{KS891`?$P=y8BI$BhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm=R@ F{{Rx|2uA<_ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/test.sym new file mode 100644 index 000000000..ac4941fa6 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tim11_div_trigger/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tim11_div_trigger.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..de789038832165a046527f6478d88f36fc3d2761 GIT binary patch literal 1244 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 C+XLAE literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/test.sym new file mode 100644 index 000000000..45c4b2ead --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_reload/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tima_reload.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..f4dff77b838ddecdfa524f5f1b15b7be4273cf4e GIT binary patch literal 1209 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHgr;B4q#hkZuFIFv4;A!1@ zf6ssI^Koa^r8XYnNaSe$e7_`1P+w}>%5&R zsl)km#sAtLu_;r<_iMehxYcfS_h^wwH)HcJ_QzBI1)b|(74E|x7?qMb+4JVou6MoO z*7LvZ=iigpc-TTh2E(ly1{NX`bFSA4H~zE!{nYod_U(wgH}CJCzVhns%?;)(w^`r0 zd%cjWd;IiLzv_1xv&fqn)9RA^&tIFtpJx#C{&?PURa3d($8qAZOWp6b$%%Zad-Lj; zc+eu(gyX_-*&B>5tx3HhELp^BHt+2hM?@}65rtv?v&dSd(6^R^aZ-uzpOHFTH16^-9^)&6#G&g%Q?%vRre{Pbj-Q3~7b z^JVYOL>xUQmmnS)nX@@}W65KlYvTHU8P|1x->o~1FX?%J1bZ{{>qRHqXBKX_H??}- zP3`qHrAIA(wCO*IjAi@FUHQ83jE|Xz`Nzw5Pd`61FKSZhy@chL?EVSoJG1mnPA@&l zUN13gyPW$G*D$Ni%a@Bd&%AixjKvS`%CPC%?bfV*chEv&UWeW+3!}|yuenPv#$_JQ z;jWW;b4cssQ?0VFm$50H^|4C(Vt`JpdY>Y@iQU-95X@84-xSvA5VmnM%O1U`c=n?k zi)FZH`{@|)p`;*itUw~``S-A;Axg!+zx})YJXP2Kc`EOe=$@;OwIuic;GDnk&YkXQ zavP`G-M4EE&yBhFW@^_WU9*T=?+?d||F!&C{x#}#w z?-qG4VLJY*ES0T)p2H=@JzOT@PoH}%%eU-YztAu*e8cvfWi~F&a}(~wG)u>n+*)>P zwjt~6IuHHZyH4w7uQe~fXuZyQTT>w@<={wAScM-jd56x^i}jrEZ1~wWa&e(f*R|bU zF@?O=&ARzIpJ&}nylUIPy6u9#PsI5eM(u*F6RM8{HigHum+Aj~;d-%u&+2~{q9fd8 zujo8tUDK^5uU4Ob$?($GpZm^N28!GM{N3z+e0p5-Ig20mkB&_LHFu3gSzq$A?`oPA zta7_l3*X4NUvLfk^W&3qjkS7x{f2*k^8Qyde)*apV|`o@Xrya^xbGeZu^Znnov1M| z>S>;y(r!_a-6+XESvukIgU}0~d3%~qe!Ad_$mK|Jgq-;)5&q1s#!gTe~DWM4f^)WBp literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..c91a236781e110f738ef8329cd9c758fdfb1afb9 GIT binary patch literal 32768 zcmeI4UuaWT9LLYSP2+8owztN)t6uar3ng|cwaUy&c1_}Ko7ikE{WGB}=vu6Tn+iJC zX_i*p!^D>jggKB+_OQWVl)*rpAYn2w#B4BdW1y0U&4CW%`a&D?HCcX^j z?}xcLzdz^uJLhxHDfGe4&p+PAF7zwk{5mmlxq^tnupQy*I91 z`|)_4<2ieF7ClXU1D@ zohr?jno6F@Qf4Ottj4iXT6sD z`O4S7uP@Kfv}n24Tk3L(#)|iP?DDKH$0LR7_VjF{7~Qa^W*fxl79TZ>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOep>AiKce zzosv6v*iE(cs%&$2egVYrfHB1bGyGL9L{9$1944TxiTC!&HDOi6lUz$apJ`8-Ak9Q zUhVZl-ZU+4%a*maE?b86s0(8-P1AL#&~=Q%w}%_VA>Ycin=GLu35Y&I6lWK>n=qfzjo1J-A=_xA@q_{cntZCh2VdqCytex;9uyk5iDvBNNs zH>?>}imL?=b5H|bB;q)*AI5Mt?9g#eojP%1bkwp;)8G~g;VPhha?)|&15Y`Bnw#T9 zA~FwIna^ZmvB}98w~YAn7F8d4L;vaNQ>Wy7*m*V!&qM;WT(Wvfgo$ z$^QQR`;$q>fjo3V!yU)tQ&DR?k^I7+X9CCV==rt9uKS*-mjQjSLegLu0MExp$ZK3(+I2z)MFDS18{P z#70NQ#u5oQsj(RNot6$ei9ncqYxO>BZwWF`=(I~8-+8=tgwk}_ec{qdB zpDz$Q!fj+^VxpRdGqBLdGob5uXW=I+bb)%))b)05x{mxMD|uqz{rkCTnp_{u>gY(P z;Tzt1)xe+p{L=DZz-Qdu#z%*OKI0FFoVRKNPx*}BHsxE`w8E^J3-@|jSXnvE#3(jj z$X>ebl#f|+{P~VGS2&-aDJ4oKYhiMJo;eBJiBka%aMu zlo?Uuiw_QV4Gg9FUT}-TsY7SNPx3KYufy5p&Im&5Y2&AB&c7w0mwfn0TQ z?BrY^w{325Zu_C)()3~eSv*Bhgs_epei^Y~0tCZJ-SKHUi1q@wzOSl@G zHEyiX%Oy{WnA**hk8mnTGA>ysCBMXYMe>sHT*)7V>q-KbS*(W!gS^2#;i?Iy)NB=- zfd)0afnPRQf$>U%)xvWdM1<=$D7?fa(;}vBVakg*6(m(I>64OsFq^3!2e2O2e1JE2S-5JFDSI#h4HoeRx@>S1nU z2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y j2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1TnV_XPe15Z$fK literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/test.sym new file mode 100644 index 000000000..c45291083 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tima_write_reloading/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tima_write_reloading.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd0a9fde5042520886d6b4d966dcaed98768bed GIT binary patch literal 1179 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QHvr;B4q#hkZuFHT#cz~fTt z_y52CZvJ;xYbHq;W;z9aPu-Q<;=wyn;!5f5ZLJSJUB1mA#Lddq&eZJOcyQr?2LTBM z8U_~gQzNgH+U}d4ShzFx*GmyM`&&;#e*6es<+3T*JhRB|_xw%5r}^=k>S=*xdsd}xKOXe|%%8poS?rpz->#_2{r8;q=@iGb zmYR_NHh=s!tyABxm1=)$_oh2XFLfPlSn%uMk16r%9xr|+dfIP_TIBMBOWp*zem@p& zJ^z|LzfFGQVG9WvE*?G%=ZZ+oIbSQ-_&xlaZsmP*--@f7S4{VtoNjT8wd|qUd+Ct> z$~rrrZ#j9&ZSxmqW4YYud*3Hctg+>|zDq zx2P5wtM0NG9a-Dk{fnP&*!$@81&bY(f6KN;T%Gs+3`@L_QPbxm2Xoin_Fi`ND?{0& z(yrWPu{w7xn!cX&o@DW(Y-5R#wR55j58s+@HS5kt4;F9B`S~Ej+WDmMA8AYc3Z?-NsHHn^d{G5fA|E5dJ0{wfEo==@u_(8nt z?9-L}k5}zB;A?9yG_bI}o>HsG_sz>X?5$&8bF75MJ{j}bU&KNt%YXW+CFfVZ`19{UfQ-27>(JD=LSE}8UH`DpQa3ZN#x}5S`w%x{%e2B{O2|+y59i}eDUMb z>dTVs|J~>P2--hsDlp!D?KfZ975-o$I1(rMZTfV4y7kYuZ~pvC`1|kf_w%e5o;O#% z=}}%8d8B)Z-mHp7oel3-PW+jWBEimolBe*)6((aoHS+_<4lZ8sTv~#C^23GQ=-F8W hSGK_u3^)VrIluPlu$9H>ngO6f$J5o%Wt~$(69AY_IAH() literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..56d1303eedabb3f3bed37540caf3fd4281c7fd38 GIT binary patch literal 32768 zcmeI4UuaWT9LLYSP2+8owztN)t6uar3njWLwaUy&c1_}Ko7ikEZC#-&=vu6Tn+iJC zX_i*p!^D>jgel0By$lAU3?rfI2BtNydjA+}ync1>ts6If zI(6Z~uJOH%x3Au~e(KDH^Be3p_wC!e^PQb*ca2#GcOE#%Mn)JnWdmD#X3xDDZ@G1< zG+$~ec_vG>C9mx*Et)KO_|TJqvVXIZ_ipX5nDH3J463(3cC{$)d;D@yzwh39E%(c{ zZ~jb?SxM=r8 zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oQlMAdp>P@L$sx zxLNZ5e>@)j^8;GN7}GS!g}FUk6AouG_<^{lty~!nn`V7|Gzv3z>^N~^_wJ=jSFiSZ zA#a)%w`I#(TbC`vdent6n5OAEROmX!;oHLv;*ejn#x!l)G}o*F4-6J)+weqRKIIJX zqfr^Heq+6=qPAtlVvsY8P$SwdDSSF*YG9QhC4;`>Rn|-)H=)p(kactYFTHOOGSNAJ@B;@rP#*Q6^fxKbO zuu@ztc$kA4@FEe%f&DOsvtfshbNcj&6QiS+Wts-JPzYB6^^=p110Q(G`P1ASClZl) z$jW>s6N^nw#<*p~pSP&`$Q$}kPoF+5=flpkS$HNApoec3_}e!4rU|FPgywk?&4bAx;$F*Y_Zuyt#9H|m>auwwXraet@)^$YW=D)-;t zFZ)4W*Zuxr5a&-#!CKL9pf)-01P(ZXyxj6AD2d z&UOW-xZmK*8>wmg_ruOZp>Vjpy{!%EK^G1ALTqAUWCW*#>Kki*>@2CN-@U5`d#1=ar0tF?9ca?HaStp0p~ z*b#0cBNG$VJe+}rKAr(x$2$u@S)mKmo2IU}bJKO?FImYG1MlC@P1EH1U{*&*It}0O z)~g2olg0Vo7VBhjI@!YKl^0Gs z^r_|d)-={G)mApNKC>>!jK7;%PC1?|`qM`JKvz#{aHwlwkQJ>o{ENVIPRpGOZ&GGN zjW0ep*flVe>U+g43a1X83qQ*XmG4D~f2eD4$m))#(p?VA&o<}Yon4&E%m#AR#j%rf zf!y%i;@tK_#ii-P{Ii^Y0&~r|m%>djE~@Opc#FlB7^{@Ggjd_w%LNQwc~7_+oHcH& z(90!HikRBXluvLfNHQ*2Cndkact!Gx@Lb6sh3iTJmszZb27|o81L3L(rqpZ|n}G&3 zyn$afSb_0MgVn-w8$^WbHYmKtCDS6NZehx+I29ySF6on!dof;-%m~kwJT6>U64v}N z*29{|d4tb|t2#_MhY4s<%NsPx2H#=4(%^>h+y=LW>ozFt;gYNuHm`OurCy9`K+?k{ z8>D0q;}ywv;klBVh3iVfng_5R)_j0BcwM+^k|}#I0Sy-M2D)r;6yuc!9}3THa8|f( zgTi4h`K5@dX{KDnsUYd)l1)%Z=`|TjFD%VJ!S6#>Y g5g-CYfCvx)B0vO)01+SpM1Tko0U|&I{!0Y@0mvz*LI3~& literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/test.sym new file mode 100644 index 000000000..c34066714 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/timer/tma_write_reloading/test.sym @@ -0,0 +1,192 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/timer/tma_write_reloading.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 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

    {_5V8r1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNBUwLovy3FIKY{{I|of)of4AV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyP;h~D1+PDpum9g6 zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5;&tOf4PI)NO-*Z-e`O^^Zs0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PU&&zTowT z^7a2a1Ox~WAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlykhQ>lStpQ#`1=2IunAHiK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfIz_o zss*nksAY|91!o5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV45%fz4Sbkc0U8|8uYj zQXoKp009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7dX!3AmsuRoNp|KA}XK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB=E41-4|JKn~*T z|IfiDNPz$W0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1sCWqc>SS#{r?UD0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5(TE$~3r z3FIKY{{I|of)of4AV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyP;h~Pg4Z9)*Z=Pj5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7dX z)&dV^oj?xa>;KQeCP;w*0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0tFY?TJZWq`TGAI0s;gG5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&U$Xei`tP{vVeEt79*aRsMAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK%n3Pg9WcYl&}BaAs|42009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7csfvg1{&N_h{#Ml3ygH4bE0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5;!u&v z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAdt1d2eVEf2l4g)=U@}0K!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB=Dl3v4fV{h@sQ z{|*5G0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PEj;up{dPau8qte-1W53IqrcAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBl)xWLYW z*B{E)|L+hGAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!8Bj0*_>!Kn~*T|IfiDNPz$W0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1sB*=@cKjf`u`mQ0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBnwTHw*F6Uae){r@@G1St?8K!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZpx^?#3toRHU;n>DK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pkSqtpRI)NO-*Z-e`O^^Zs0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PU&&x8U`M^7a2a1Ox~WAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlykhQ>vvQ8ie@%8`bU=yT3 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+0D*!Fe7NBChw}CRI|Kv>5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAdt1dzN{0-L45uH zIoJd#5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV8qt0z(C_Ka{Wk-ytACfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+0D-IpK9Y3; zIf$?SKL?v21p)*J5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&YTws5}>ksAY|91!o5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV45% zfsbaLKn~*T|IfiDNPz$W0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1s51Dc>SS#{r?UD0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5(TE$~>@3FIKY{{I|of)of4AV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyP;h~I!Rrs@>;HEM2oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkJxYk|kJP9O*I_5bH!6Qn?Z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs s0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7csfr1PCFN?W>>;M1& literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/test.sym new file mode 100644 index 000000000..6e0cc401c --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/multicart_rom_8Mb/test.sym @@ -0,0 +1,226 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/multicart_rom_8Mb.gb". + +[labels] +01:4001 print_load_font +01:400e print_string +01:4018 print_a +01:4022 print_newline +01:402d print_digit +01:403a print_regs +01:4043 _print_sl_data0 +01:4049 _print_sl_out0 +01:4056 _print_sl_data1 +01:405c _print_sl_out1 +01:406e _print_sl_data2 +01:4074 _print_sl_out2 +01:4081 _print_sl_data3 +01:4087 _print_sl_out3 +01:4099 _print_sl_data4 +01:409f _print_sl_out4 +01:40ac _print_sl_data5 +01:40b2 _print_sl_out5 +01:40c4 _print_sl_data6 +01:40ca _print_sl_out6 +01:40d7 _print_sl_data7 +01:40dd _print_sl_out7 +01:4134 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:4924 memcpy +01:492d memset +01:4936 memcmp +01:4944 clear_vram +01:494e clear_oam +01:4958 disable_lcd_safe +01:495e _wait_ly_0 +01:4964 _wait_ly_1 +01:496d reset_screen +01:4981 process_results +01:4995 _wait_ly_2 +01:499b _wait_ly_3 +01:49b1 _print_results_halt_0 +01:49b4 _process_results_cb +01:49bf _print_sl_data8 +01:49c9 _print_sl_out8 +01:49e3 _print_sl_data9 +01:49ee _print_sl_out9 +01:4a06 _print_sl_data10 +01:4a12 _print_sl_out10 +01:4a13 dump_mem +01:4a32 _dump_mem_line +01:4a5c _check_asserts +01:4a6a _print_sl_data11 +01:4a6d _print_sl_out11 +01:4a79 _print_sl_data12 +01:4a7b _print_sl_out12 +01:4a83 _print_sl_data13 +01:4a86 _print_sl_out13 +01:4a90 __check_assert_fail0 +01:4a9b _print_sl_data14 +01:4a9e _print_sl_out14 +01:4aa1 __check_assert_ok0 +01:4aa9 _print_sl_data15 +01:4aae _print_sl_out15 +01:4ab0 __check_assert_skip0 +01:4ab8 _print_sl_data16 +01:4ac0 _print_sl_out16 +01:4ac0 __check_assert_out0 +01:4acc _print_sl_data17 +01:4ace _print_sl_out17 +01:4ad6 _print_sl_data18 +01:4ad9 _print_sl_out18 +01:4ae3 __check_assert_fail1 +01:4aee _print_sl_data19 +01:4af1 _print_sl_out19 +01:4af4 __check_assert_ok1 +01:4afc _print_sl_data20 +01:4b01 _print_sl_out20 +01:4b03 __check_assert_skip1 +01:4b0b _print_sl_data21 +01:4b13 _print_sl_out21 +01:4b13 __check_assert_out1 +01:4b1e _print_sl_data22 +01:4b21 _print_sl_out22 +01:4b2d _print_sl_data23 +01:4b2f _print_sl_out23 +01:4b37 _print_sl_data24 +01:4b3a _print_sl_out24 +01:4b44 __check_assert_fail2 +01:4b4f _print_sl_data25 +01:4b52 _print_sl_out25 +01:4b55 __check_assert_ok2 +01:4b5d _print_sl_data26 +01:4b62 _print_sl_out26 +01:4b64 __check_assert_skip2 +01:4b6c _print_sl_data27 +01:4b74 _print_sl_out27 +01:4b74 __check_assert_out2 +01:4b80 _print_sl_data28 +01:4b82 _print_sl_out28 +01:4b8a _print_sl_data29 +01:4b8d _print_sl_out29 +01:4b97 __check_assert_fail3 +01:4ba2 _print_sl_data30 +01:4ba5 _print_sl_out30 +01:4ba8 __check_assert_ok3 +01:4bb0 _print_sl_data31 +01:4bb5 _print_sl_out31 +01:4bb7 __check_assert_skip3 +01:4bbf _print_sl_data32 +01:4bc7 _print_sl_out32 +01:4bc7 __check_assert_out3 +01:4bd2 _print_sl_data33 +01:4bd5 _print_sl_out33 +01:4be1 _print_sl_data34 +01:4be3 _print_sl_out34 +01:4beb _print_sl_data35 +01:4bee _print_sl_out35 +01:4bf8 __check_assert_fail4 +01:4c03 _print_sl_data36 +01:4c06 _print_sl_out36 +01:4c09 __check_assert_ok4 +01:4c11 _print_sl_data37 +01:4c16 _print_sl_out37 +01:4c18 __check_assert_skip4 +01:4c20 _print_sl_data38 +01:4c28 _print_sl_out38 +01:4c28 __check_assert_out4 +01:4c34 _print_sl_data39 +01:4c36 _print_sl_out39 +01:4c3e _print_sl_data40 +01:4c41 _print_sl_out40 +01:4c4b __check_assert_fail5 +01:4c56 _print_sl_data41 +01:4c59 _print_sl_out41 +01:4c5c __check_assert_ok5 +01:4c64 _print_sl_data42 +01:4c69 _print_sl_out42 +01:4c6b __check_assert_skip5 +01:4c73 _print_sl_data43 +01:4c7b _print_sl_out43 +01:4c7b __check_assert_out5 +01:4c86 _print_sl_data44 +01:4c89 _print_sl_out44 +01:4c95 _print_sl_data45 +01:4c97 _print_sl_out45 +01:4c9f _print_sl_data46 +01:4ca2 _print_sl_out46 +01:4cac __check_assert_fail6 +01:4cb7 _print_sl_data47 +01:4cba _print_sl_out47 +01:4cbd __check_assert_ok6 +01:4cc5 _print_sl_data48 +01:4cca _print_sl_out48 +01:4ccc __check_assert_skip6 +01:4cd4 _print_sl_data49 +01:4cdc _print_sl_out49 +01:4cdc __check_assert_out6 +01:4ce8 _print_sl_data50 +01:4cea _print_sl_out50 +01:4cf2 _print_sl_data51 +01:4cf5 _print_sl_out51 +01:4cff __check_assert_fail7 +01:4d0a _print_sl_data52 +01:4d0d _print_sl_out52 +01:4d10 __check_assert_ok7 +01:4d18 _print_sl_data53 +01:4d1d _print_sl_out53 +01:4d1f __check_assert_skip7 +01:4d27 _print_sl_data54 +01:4d2f _print_sl_out54 +01:4d2f __check_assert_out7 +00:016b fail +00:017f _wait_ly_4 +00:0185 _wait_ly_5 +00:019b _print_results_halt_1 +00:019e _fail_cb +00:01a6 _print_sl_data55 +00:01b2 _print_sl_out55 +00:01c2 _print_sl_data56 +00:01ce _print_sl_out56 +00:01d8 _print_sl_data57 +00:01e4 _print_sl_out57 +00:01ef _print_sl_data58 +00:01f5 _print_sl_out58 +00:0208 _print_sl_data59 +00:0215 _print_sl_out59 +00:0225 _print_sl_data60 +00:0232 _print_sl_out60 +00:0242 _print_sl_data61 +00:024f _print_sl_out61 +00:025a c000_functions_start +00:025a run_test_suite +00:0284 _wait_ly_6 +00:028a _wait_ly_7 +00:02a0 _print_results_halt_2 +00:02a3 _test_ok_cb_0 +00:02ab _print_sl_data62 +00:02b3 _print_sl_out62 +00:02b6 run_tests +00:02c4 run_test_cases +00:02d2 test_case +00:02ef restore_mbc1 +00:02f8 switch_bank +00:0309 fetch_expected_value +00:0328 c000_functions_end +00:0328 expected_banks diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 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 W0uX=z1Rwwb2tWV=5P-mcTi`#twgs{P literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.sym new file mode 100644 index 000000000..c24fc1363 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.sym @@ -0,0 +1,252 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/ram_256Kb.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test_round1 +00:016e test_round2 +00:01d2 test_round3 +00:0232 test_round4 +00:02a0 test_round5 +00:02fc test_round6 +00:0330 test_finish +00:0347 _wait_ly_4 +00:034d _wait_ly_5 +00:0363 _print_results_halt_1 +00:0366 _test_ok_cb_0 +00:036e _print_sl_data55 +00:0376 _print_sl_out55 +00:0379 copy_bank_data +00:0398 check_bank_data +00:03b8 all_ff +00:03c8 all_00 +00:1000 bank_data +00:1040 clear_ram +00:1062 fail_round1 +00:1079 _wait_ly_6 +00:107f _wait_ly_7 +00:1095 _print_results_halt_2 +00:1098 _test_failure_cb_0 +00:10a0 _print_sl_data56 +00:10ae _print_sl_out56 +00:10b1 fail_round2 +00:10c8 _wait_ly_8 +00:10ce _wait_ly_9 +00:10e4 _print_results_halt_3 +00:10e7 _test_failure_cb_1 +00:10ef _print_sl_data57 +00:10fd _print_sl_out57 +00:1100 fail_round3 +00:1117 _wait_ly_10 +00:111d _wait_ly_11 +00:1133 _print_results_halt_4 +00:1136 _test_failure_cb_2 +00:113e _print_sl_data58 +00:114c _print_sl_out58 +00:114f fail_round4 +00:1166 _wait_ly_12 +00:116c _wait_ly_13 +00:1182 _print_results_halt_5 +00:1185 _test_failure_cb_3 +00:118d _print_sl_data59 +00:119b _print_sl_out59 +00:119e fail_round5 +00:11b5 _wait_ly_14 +00:11bb _wait_ly_15 +00:11d1 _print_results_halt_6 +00:11d4 _test_failure_cb_4 +00:11dc _print_sl_data60 +00:11ea _print_sl_out60 +00:11ed fail_round6 +00:1204 _wait_ly_16 +00:120a _wait_ly_17 +00:1220 _print_results_halt_7 +00:1223 _test_failure_cb_5 +00:122b _print_sl_data61 +00:1239 _print_sl_out61 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    dkb{mo3Id9c^k-rq&s9yEUY_vz`oyG29YIq`xBirpd*YW?Pm zqVdhUGY{_H|I4d4Z=Rl-X?*+c{Wo9z-p$vJx?eqecIMRAPJQh3r1Si#bI*&hF;Qoj z#!>N+2mZDnnjvxButdeo-s`kf_%ko8SeEdJ?zw>p%$DleP&es3)-iwQmOUTa7Xq{He!I;;+)Lu37bnc4t(s0YYHJzypz zS6_){E1$|%*81C=tCdN!ExES1`Y^NlqO&63zvZl4_>mLz*EQ~F4jkCs{(&PAVZUd5 z*{lTfc3`Auc*Gg#7tNv^5>^`{J?vA*By_uaT*doyt-;K0zDC8Svbh~G1Rwwb2tWV= z5P$##AOHafY!+zw&MSNWv-jE0zSZ^VBmetN>oHe7e$tcS0pCUWL`u(T!da+1>idxM zPx*u?%A218&sf`f3Y@j*DX_6OmCJWKLub#=JnMX1G^e+uyRp4=zuKCv^Kt3?p>3_M zF|=iMM<17NbbIN(xHVnZLAv(C?@A zaM+QhrKP>SrG@)*UOJ`{2v`>Nuq>{pPoFGQPwj^eg~P5J4j(#15fxgX>(V>N`dyEp zIFZn`wNLJEnw;Bll1XZ_?PxSDOEhZR6bAyfO}PVsaG2smBAxd6Y};{)>iXAlI?Z!X z|5z-WEfhF^v6xI23Z|*s6A6lG2JT-hZk(U;(Mz}UvFn;~DX*3yZlgXF#p9U_?MDb6O*_nFu3fuwWqjOm!eLvMXp~n${paQ~8G6yX9zQQj zCKHeAc52n_g+ekpHsZC4bkYI2@*{!ROQc zGns65aBy}uo6TgXoo3>~J5Hshrbb6|xs)u_o=#6r4h@|+(c8=U!{JD^@cHHaaR%zY zzTGtS{s#y3eAI4P!C)l9<1byJwQ}M4crW^VUcO9mR2IIzXkEG7=;+jxULUpaRY>Dg zsYqnszFNN8^}_p$$LVgN!v4u5-#b1Zt(MNO8oO&(1Gih&=KGg=QQ>_0zT-N2Pb5s! zb$ffeyD1_Wx_&1o$HytA!uK@q-;~95(`ntG?-;rZ^!01omKBd%vhZjjy1MfDOs1>L z=i}YPKQafGSRZew(Q>^dEKwx&3b{>t!VjUfa4^w~2%Y}WZZhCrbjMV9v%8?_T zopjPU;uY%iLv`chlauK*U8%_=#ogU>wa`6iD$~P*ab2h*`71BQJL`YuW${*dVJW?Ie5rrwgd18)y6-Oa-L|qDejR2$yPa>| zg+$4CDNA3zs~_s=%MFk83=NBllc&Epy{`mHH)2m43#v~;YIwM3Xe2lAIj>VJci~3t zgR-OXhUyYjzcWK$GwjKT@^Yy3_2s>#!g5oowm5NhrKxmsWpC-33zg>lMfutPY!*(+g*;VDSqwWnR^p$A$5E9!e=qnX*BroZszNg( zj2qlQ6YP)^H0lX{$Mw|-?yJa~;B6Ip6D&R_Q;L4tyxAj+dUaGsDSa~KZk;m1_0^Oe zD)LeuQ=ylV);z@hY0c;41Yc62nH9!!+&~lTloMEbf)}{HI>9R{@+P>hLT`e_i!$Xe zRGpa@#w{L7Dg83#9-Z=!TwhK3mWsTT|5BlsQm(n&X3d90(s;PD^02R5zbazBNS*yo zxo@$f^3nWahut9Wg@3gA#XxXZ+1+z}wLWgXzVr2tNV&;Kc&E()A$# literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.sym new file mode 100644 index 000000000..8f184d5a5 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.sym @@ -0,0 +1,244 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/ram_64Kb.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0150 test_round1 +00:016e test_round2 +00:01c2 test_round3 +00:01cb test_round4 +00:01fb test_round5 +00:022c test_finish +00:0243 _wait_ly_4 +00:0249 _wait_ly_5 +00:025f _print_results_halt_1 +00:0262 _test_ok_cb_0 +00:026a _print_sl_data55 +00:0272 _print_sl_out55 +00:0275 copy_bank_data +00:028d check_bank_data +00:02a6 all_ff +00:02b6 all_00 +00:1000 bank_data +00:1010 clear_ram +00:1032 fail_round1 +00:1049 _wait_ly_6 +00:104f _wait_ly_7 +00:1065 _print_results_halt_2 +00:1068 _test_failure_cb_0 +00:1070 _print_sl_data56 +00:107e _print_sl_out56 +00:1081 fail_round2 +00:1098 _wait_ly_8 +00:109e _wait_ly_9 +00:10b4 _print_results_halt_3 +00:10b7 _test_failure_cb_1 +00:10bf _print_sl_data57 +00:10cd _print_sl_out57 +00:10d0 fail_round3 +00:10e7 _wait_ly_10 +00:10ed _wait_ly_11 +00:1103 _print_results_halt_4 +00:1106 _test_failure_cb_2 +00:110e _print_sl_data58 +00:111c _print_sl_out58 +00:111f fail_round4 +00:1136 _wait_ly_12 +00:113c _wait_ly_13 +00:1152 _print_results_halt_5 +00:1155 _test_failure_cb_3 +00:115d _print_sl_data59 +00:116b _print_sl_out59 +00:116e fail_round5 +00:1185 _wait_ly_14 +00:118b _wait_ly_15 +00:11a1 _print_results_halt_6 +00:11a4 _test_failure_cb_4 +00:11ac _print_sl_data60 +00:11ba _print_sl_out60 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_16Mb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_16Mb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    io$^_gsX_Li~Ptz)y< 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. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/rom_16Mb.gb". + +[labels] +01:4c00 print_load_font +01:4c0d print_string +01:4c17 print_a +01:4c21 print_newline +01:4c2c print_digit +01:4c39 print_regs +01:4c42 _print_sl_data0 +01:4c48 _print_sl_out0 +01:4c55 _print_sl_data1 +01:4c5b _print_sl_out1 +01:4c6d _print_sl_data2 +01:4c73 _print_sl_out2 +01:4c80 _print_sl_data3 +01:4c86 _print_sl_out3 +01:4c98 _print_sl_data4 +01:4c9e _print_sl_out4 +01:4cab _print_sl_data5 +01:4cb1 _print_sl_out5 +01:4cc3 _print_sl_data6 +01:4cc9 _print_sl_out6 +01:4cd6 _print_sl_data7 +01:4cdc _print_sl_out7 +01:4001 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f1 memcpy +01:47fa memset +01:4803 memcmp +01:4811 clear_vram +01:481b clear_oam +01:4825 disable_lcd_safe +01:482b _wait_ly_0 +01:4831 _wait_ly_1 +01:483a reset_screen +01:484e process_results +01:4862 _wait_ly_2 +01:4868 _wait_ly_3 +01:487e _print_results_halt_0 +01:4881 _process_results_cb +01:488c _print_sl_data8 +01:4896 _print_sl_out8 +01:48b0 _print_sl_data9 +01:48bb _print_sl_out9 +01:48d3 _print_sl_data10 +01:48df _print_sl_out10 +01:48e0 dump_mem +01:48ff _dump_mem_line +01:4929 _check_asserts +01:4937 _print_sl_data11 +01:493a _print_sl_out11 +01:4946 _print_sl_data12 +01:4948 _print_sl_out12 +01:4950 _print_sl_data13 +01:4953 _print_sl_out13 +01:495d __check_assert_fail0 +01:4968 _print_sl_data14 +01:496b _print_sl_out14 +01:496e __check_assert_ok0 +01:4976 _print_sl_data15 +01:497b _print_sl_out15 +01:497d __check_assert_skip0 +01:4985 _print_sl_data16 +01:498d _print_sl_out16 +01:498d __check_assert_out0 +01:4999 _print_sl_data17 +01:499b _print_sl_out17 +01:49a3 _print_sl_data18 +01:49a6 _print_sl_out18 +01:49b0 __check_assert_fail1 +01:49bb _print_sl_data19 +01:49be _print_sl_out19 +01:49c1 __check_assert_ok1 +01:49c9 _print_sl_data20 +01:49ce _print_sl_out20 +01:49d0 __check_assert_skip1 +01:49d8 _print_sl_data21 +01:49e0 _print_sl_out21 +01:49e0 __check_assert_out1 +01:49eb _print_sl_data22 +01:49ee _print_sl_out22 +01:49fa _print_sl_data23 +01:49fc _print_sl_out23 +01:4a04 _print_sl_data24 +01:4a07 _print_sl_out24 +01:4a11 __check_assert_fail2 +01:4a1c _print_sl_data25 +01:4a1f _print_sl_out25 +01:4a22 __check_assert_ok2 +01:4a2a _print_sl_data26 +01:4a2f _print_sl_out26 +01:4a31 __check_assert_skip2 +01:4a39 _print_sl_data27 +01:4a41 _print_sl_out27 +01:4a41 __check_assert_out2 +01:4a4d _print_sl_data28 +01:4a4f _print_sl_out28 +01:4a57 _print_sl_data29 +01:4a5a _print_sl_out29 +01:4a64 __check_assert_fail3 +01:4a6f _print_sl_data30 +01:4a72 _print_sl_out30 +01:4a75 __check_assert_ok3 +01:4a7d _print_sl_data31 +01:4a82 _print_sl_out31 +01:4a84 __check_assert_skip3 +01:4a8c _print_sl_data32 +01:4a94 _print_sl_out32 +01:4a94 __check_assert_out3 +01:4a9f _print_sl_data33 +01:4aa2 _print_sl_out33 +01:4aae _print_sl_data34 +01:4ab0 _print_sl_out34 +01:4ab8 _print_sl_data35 +01:4abb _print_sl_out35 +01:4ac5 __check_assert_fail4 +01:4ad0 _print_sl_data36 +01:4ad3 _print_sl_out36 +01:4ad6 __check_assert_ok4 +01:4ade _print_sl_data37 +01:4ae3 _print_sl_out37 +01:4ae5 __check_assert_skip4 +01:4aed _print_sl_data38 +01:4af5 _print_sl_out38 +01:4af5 __check_assert_out4 +01:4b01 _print_sl_data39 +01:4b03 _print_sl_out39 +01:4b0b _print_sl_data40 +01:4b0e _print_sl_out40 +01:4b18 __check_assert_fail5 +01:4b23 _print_sl_data41 +01:4b26 _print_sl_out41 +01:4b29 __check_assert_ok5 +01:4b31 _print_sl_data42 +01:4b36 _print_sl_out42 +01:4b38 __check_assert_skip5 +01:4b40 _print_sl_data43 +01:4b48 _print_sl_out43 +01:4b48 __check_assert_out5 +01:4b53 _print_sl_data44 +01:4b56 _print_sl_out44 +01:4b62 _print_sl_data45 +01:4b64 _print_sl_out45 +01:4b6c _print_sl_data46 +01:4b6f _print_sl_out46 +01:4b79 __check_assert_fail6 +01:4b84 _print_sl_data47 +01:4b87 _print_sl_out47 +01:4b8a __check_assert_ok6 +01:4b92 _print_sl_data48 +01:4b97 _print_sl_out48 +01:4b99 __check_assert_skip6 +01:4ba1 _print_sl_data49 +01:4ba9 _print_sl_out49 +01:4ba9 __check_assert_out6 +01:4bb5 _print_sl_data50 +01:4bb7 _print_sl_out50 +01:4bbf _print_sl_data51 +01:4bc2 _print_sl_out51 +01:4bcc __check_assert_fail7 +01:4bd7 _print_sl_data52 +01:4bda _print_sl_out52 +01:4bdd __check_assert_ok7 +01:4be5 _print_sl_data53 +01:4bea _print_sl_out53 +01:4bec __check_assert_skip7 +01:4bf4 _print_sl_data54 +01:4bfc _print_sl_out54 +01:4bfc __check_assert_out7 +00:016b fail +00:017f _wait_ly_4 +00:0185 _wait_ly_5 +00:019b _print_results_halt_1 +00:019e _fail_cb +00:01a6 _print_sl_data55 +00:01b2 _print_sl_out55 +00:01c2 _print_sl_data56 +00:01ce _print_sl_out56 +00:01d8 _print_sl_data57 +00:01e4 _print_sl_out57 +00:01ef _print_sl_data58 +00:01f5 _print_sl_out58 +00:0208 _print_sl_data59 +00:0215 _print_sl_out59 +00:0225 _print_sl_data60 +00:0232 _print_sl_out60 +00:0242 _print_sl_data61 +00:024f _print_sl_out61 +00:025a c000_functions_start +00:025a run_test_suite +00:0284 _wait_ly_6 +00:028a _wait_ly_7 +00:02a0 _print_results_halt_2 +00:02a3 _test_ok_cb_0 +00:02ab _print_sl_data62 +00:02b3 _print_sl_out62 +00:02b6 run_tests +00:02c4 run_test_cases +00:02d2 test_case +00:02ef restore_mbc1 +00:02f8 switch_bank +00:0309 fetch_expected_value +00:0328 c000_functions_end +00:0328 expected_banks diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_1Mb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_1Mb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    pW zvR(Gjmp$0|9xCbn&N=t@JLhxnHS{4@ef3~BwJ>D8|LOGfod#7`bx~bb^{PRI8u$PF zMYZ$popT@GyZ6`Yw{AT-b#CY1@7%k4{gqqq97#NV{`|Q!KRxrbUq zE9;1A>%7~d3XS8o^}Z^7cC1Bx&={+-@|HecP=(T?*;045q;f6pwbIL0OY*D5wUzYR zi|(ra{)M}G=?%9&ShcgdIkd0gz_$*!D(64eudPx;&Z!^GjEuT{J^i^%T9sOIE0^DJ zo2@^Zv1q$)k42C4_4O%dxAkGU_o&y~DZTm(>z`hC@Wfy`+_{$<$kus6y^V?j$lgarNrNgzH8kj&9MYS%u7>nMtSRBj5h{dEL_Kt}cIEM*Z>G*<^BNCaK%(tc#lLm=SKPp7llp`i;Gve|T6#-);JX2(4} zQ&VGO{rx?<$#^O?IXOIh{CHoV$sdWdmYcc0W`8Dw%-=X}+y4HChWvUm9uC*nx3-$| zpMPG~YMQBM_Tpd9`FV+>x|#b+*45uXHa0couTMtIT`1@G^t86_-o2i0{eCg~>*|uH zMVj$XCe5=G2*_&X`g-Tq)YO^raQN%bugsEW^7+r5>67nx+_n>mzP|2mi9|;3-^s~| z35lhdXWH!F)-91prTqEkiIJzkzkeMk9Pa80>t@bY>gds2E}cGlG!QVm>FN@nXjI1K z-Y#=`&$q<>6B!C!xF9=^Mq{z|_CtqczT`E{_)6dO^!T`_%dxb>hdVmtqMOL9(7!&? zH!(3enM%o>noLUE-7R;EJcG7pdgxF`ht!oZvwO#pwVOB`j>lyM>-DA9fdhN@nsK=Y z*Z;mq-@I<)YV$X#TJ#flzVewRlmMw z&3aXNNBUJYbGJ9Xt7h?C{nnM#Qt#5h((y#&QZn)7(y@ic?50=T%xAyJ+g%z}!Fnkx z@1Ut2&K&C>8O;oj$Qx_qzsKc!HB@*j)@l9Ln^V^_GLjh{?H@c@nRKxK(p#~I86WRo z+wFd$b2=Y+d(f}qxp_)2@UzS>>?~TRY*!QhIFSL7^^}Ha2EYMozd{I2M z*j_r6TWojg^t14f{rcrd^). +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/rom_1Mb.gb". + +[labels] +01:4c00 print_load_font +01:4c0d print_string +01:4c17 print_a +01:4c21 print_newline +01:4c2c print_digit +01:4c39 print_regs +01:4c42 _print_sl_data0 +01:4c48 _print_sl_out0 +01:4c55 _print_sl_data1 +01:4c5b _print_sl_out1 +01:4c6d _print_sl_data2 +01:4c73 _print_sl_out2 +01:4c80 _print_sl_data3 +01:4c86 _print_sl_out3 +01:4c98 _print_sl_data4 +01:4c9e _print_sl_out4 +01:4cab _print_sl_data5 +01:4cb1 _print_sl_out5 +01:4cc3 _print_sl_data6 +01:4cc9 _print_sl_out6 +01:4cd6 _print_sl_data7 +01:4cdc _print_sl_out7 +01:4001 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f1 memcpy +01:47fa memset +01:4803 memcmp +01:4811 clear_vram +01:481b clear_oam +01:4825 disable_lcd_safe +01:482b _wait_ly_0 +01:4831 _wait_ly_1 +01:483a reset_screen +01:484e process_results +01:4862 _wait_ly_2 +01:4868 _wait_ly_3 +01:487e _print_results_halt_0 +01:4881 _process_results_cb +01:488c _print_sl_data8 +01:4896 _print_sl_out8 +01:48b0 _print_sl_data9 +01:48bb _print_sl_out9 +01:48d3 _print_sl_data10 +01:48df _print_sl_out10 +01:48e0 dump_mem +01:48ff _dump_mem_line +01:4929 _check_asserts +01:4937 _print_sl_data11 +01:493a _print_sl_out11 +01:4946 _print_sl_data12 +01:4948 _print_sl_out12 +01:4950 _print_sl_data13 +01:4953 _print_sl_out13 +01:495d __check_assert_fail0 +01:4968 _print_sl_data14 +01:496b _print_sl_out14 +01:496e __check_assert_ok0 +01:4976 _print_sl_data15 +01:497b _print_sl_out15 +01:497d __check_assert_skip0 +01:4985 _print_sl_data16 +01:498d _print_sl_out16 +01:498d __check_assert_out0 +01:4999 _print_sl_data17 +01:499b _print_sl_out17 +01:49a3 _print_sl_data18 +01:49a6 _print_sl_out18 +01:49b0 __check_assert_fail1 +01:49bb _print_sl_data19 +01:49be _print_sl_out19 +01:49c1 __check_assert_ok1 +01:49c9 _print_sl_data20 +01:49ce _print_sl_out20 +01:49d0 __check_assert_skip1 +01:49d8 _print_sl_data21 +01:49e0 _print_sl_out21 +01:49e0 __check_assert_out1 +01:49eb _print_sl_data22 +01:49ee _print_sl_out22 +01:49fa _print_sl_data23 +01:49fc _print_sl_out23 +01:4a04 _print_sl_data24 +01:4a07 _print_sl_out24 +01:4a11 __check_assert_fail2 +01:4a1c _print_sl_data25 +01:4a1f _print_sl_out25 +01:4a22 __check_assert_ok2 +01:4a2a _print_sl_data26 +01:4a2f _print_sl_out26 +01:4a31 __check_assert_skip2 +01:4a39 _print_sl_data27 +01:4a41 _print_sl_out27 +01:4a41 __check_assert_out2 +01:4a4d _print_sl_data28 +01:4a4f _print_sl_out28 +01:4a57 _print_sl_data29 +01:4a5a _print_sl_out29 +01:4a64 __check_assert_fail3 +01:4a6f _print_sl_data30 +01:4a72 _print_sl_out30 +01:4a75 __check_assert_ok3 +01:4a7d _print_sl_data31 +01:4a82 _print_sl_out31 +01:4a84 __check_assert_skip3 +01:4a8c _print_sl_data32 +01:4a94 _print_sl_out32 +01:4a94 __check_assert_out3 +01:4a9f _print_sl_data33 +01:4aa2 _print_sl_out33 +01:4aae _print_sl_data34 +01:4ab0 _print_sl_out34 +01:4ab8 _print_sl_data35 +01:4abb _print_sl_out35 +01:4ac5 __check_assert_fail4 +01:4ad0 _print_sl_data36 +01:4ad3 _print_sl_out36 +01:4ad6 __check_assert_ok4 +01:4ade _print_sl_data37 +01:4ae3 _print_sl_out37 +01:4ae5 __check_assert_skip4 +01:4aed _print_sl_data38 +01:4af5 _print_sl_out38 +01:4af5 __check_assert_out4 +01:4b01 _print_sl_data39 +01:4b03 _print_sl_out39 +01:4b0b _print_sl_data40 +01:4b0e _print_sl_out40 +01:4b18 __check_assert_fail5 +01:4b23 _print_sl_data41 +01:4b26 _print_sl_out41 +01:4b29 __check_assert_ok5 +01:4b31 _print_sl_data42 +01:4b36 _print_sl_out42 +01:4b38 __check_assert_skip5 +01:4b40 _print_sl_data43 +01:4b48 _print_sl_out43 +01:4b48 __check_assert_out5 +01:4b53 _print_sl_data44 +01:4b56 _print_sl_out44 +01:4b62 _print_sl_data45 +01:4b64 _print_sl_out45 +01:4b6c _print_sl_data46 +01:4b6f _print_sl_out46 +01:4b79 __check_assert_fail6 +01:4b84 _print_sl_data47 +01:4b87 _print_sl_out47 +01:4b8a __check_assert_ok6 +01:4b92 _print_sl_data48 +01:4b97 _print_sl_out48 +01:4b99 __check_assert_skip6 +01:4ba1 _print_sl_data49 +01:4ba9 _print_sl_out49 +01:4ba9 __check_assert_out6 +01:4bb5 _print_sl_data50 +01:4bb7 _print_sl_out50 +01:4bbf _print_sl_data51 +01:4bc2 _print_sl_out51 +01:4bcc __check_assert_fail7 +01:4bd7 _print_sl_data52 +01:4bda _print_sl_out52 +01:4bdd __check_assert_ok7 +01:4be5 _print_sl_data53 +01:4bea _print_sl_out53 +01:4bec __check_assert_skip7 +01:4bf4 _print_sl_data54 +01:4bfc _print_sl_out54 +01:4bfc __check_assert_out7 +00:016b fail +00:017f _wait_ly_4 +00:0185 _wait_ly_5 +00:019b _print_results_halt_1 +00:019e _fail_cb +00:01a6 _print_sl_data55 +00:01b2 _print_sl_out55 +00:01c2 _print_sl_data56 +00:01ce _print_sl_out56 +00:01d8 _print_sl_data57 +00:01e4 _print_sl_out57 +00:01ef _print_sl_data58 +00:01f5 _print_sl_out58 +00:0208 _print_sl_data59 +00:0215 _print_sl_out59 +00:0225 _print_sl_data60 +00:0232 _print_sl_out60 +00:0242 _print_sl_data61 +00:024f _print_sl_out61 +00:025a c000_functions_start +00:025a run_test_suite +00:0284 _wait_ly_6 +00:028a _wait_ly_7 +00:02a0 _print_results_halt_2 +00:02a3 _test_ok_cb_0 +00:02ab _print_sl_data62 +00:02b3 _print_sl_out62 +00:02b6 run_tests +00:02c4 run_test_cases +00:02d2 test_case +00:02ef restore_mbc1 +00:02f8 switch_bank +00:0309 fetch_expected_value +00:0328 c000_functions_end +00:0328 expected_banks diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_2Mb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_2Mb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    W7#<-d17_1uY?&|tVmSQC~{)3BWsIiF~ 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. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/rom_2Mb.gb". + +[labels] +01:4c00 print_load_font +01:4c0d print_string +01:4c17 print_a +01:4c21 print_newline +01:4c2c print_digit +01:4c39 print_regs +01:4c42 _print_sl_data0 +01:4c48 _print_sl_out0 +01:4c55 _print_sl_data1 +01:4c5b _print_sl_out1 +01:4c6d _print_sl_data2 +01:4c73 _print_sl_out2 +01:4c80 _print_sl_data3 +01:4c86 _print_sl_out3 +01:4c98 _print_sl_data4 +01:4c9e _print_sl_out4 +01:4cab _print_sl_data5 +01:4cb1 _print_sl_out5 +01:4cc3 _print_sl_data6 +01:4cc9 _print_sl_out6 +01:4cd6 _print_sl_data7 +01:4cdc _print_sl_out7 +01:4001 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f1 memcpy +01:47fa memset +01:4803 memcmp +01:4811 clear_vram +01:481b clear_oam +01:4825 disable_lcd_safe +01:482b _wait_ly_0 +01:4831 _wait_ly_1 +01:483a reset_screen +01:484e process_results +01:4862 _wait_ly_2 +01:4868 _wait_ly_3 +01:487e _print_results_halt_0 +01:4881 _process_results_cb +01:488c _print_sl_data8 +01:4896 _print_sl_out8 +01:48b0 _print_sl_data9 +01:48bb _print_sl_out9 +01:48d3 _print_sl_data10 +01:48df _print_sl_out10 +01:48e0 dump_mem +01:48ff _dump_mem_line +01:4929 _check_asserts +01:4937 _print_sl_data11 +01:493a _print_sl_out11 +01:4946 _print_sl_data12 +01:4948 _print_sl_out12 +01:4950 _print_sl_data13 +01:4953 _print_sl_out13 +01:495d __check_assert_fail0 +01:4968 _print_sl_data14 +01:496b _print_sl_out14 +01:496e __check_assert_ok0 +01:4976 _print_sl_data15 +01:497b _print_sl_out15 +01:497d __check_assert_skip0 +01:4985 _print_sl_data16 +01:498d _print_sl_out16 +01:498d __check_assert_out0 +01:4999 _print_sl_data17 +01:499b _print_sl_out17 +01:49a3 _print_sl_data18 +01:49a6 _print_sl_out18 +01:49b0 __check_assert_fail1 +01:49bb _print_sl_data19 +01:49be _print_sl_out19 +01:49c1 __check_assert_ok1 +01:49c9 _print_sl_data20 +01:49ce _print_sl_out20 +01:49d0 __check_assert_skip1 +01:49d8 _print_sl_data21 +01:49e0 _print_sl_out21 +01:49e0 __check_assert_out1 +01:49eb _print_sl_data22 +01:49ee _print_sl_out22 +01:49fa _print_sl_data23 +01:49fc _print_sl_out23 +01:4a04 _print_sl_data24 +01:4a07 _print_sl_out24 +01:4a11 __check_assert_fail2 +01:4a1c _print_sl_data25 +01:4a1f _print_sl_out25 +01:4a22 __check_assert_ok2 +01:4a2a _print_sl_data26 +01:4a2f _print_sl_out26 +01:4a31 __check_assert_skip2 +01:4a39 _print_sl_data27 +01:4a41 _print_sl_out27 +01:4a41 __check_assert_out2 +01:4a4d _print_sl_data28 +01:4a4f _print_sl_out28 +01:4a57 _print_sl_data29 +01:4a5a _print_sl_out29 +01:4a64 __check_assert_fail3 +01:4a6f _print_sl_data30 +01:4a72 _print_sl_out30 +01:4a75 __check_assert_ok3 +01:4a7d _print_sl_data31 +01:4a82 _print_sl_out31 +01:4a84 __check_assert_skip3 +01:4a8c _print_sl_data32 +01:4a94 _print_sl_out32 +01:4a94 __check_assert_out3 +01:4a9f _print_sl_data33 +01:4aa2 _print_sl_out33 +01:4aae _print_sl_data34 +01:4ab0 _print_sl_out34 +01:4ab8 _print_sl_data35 +01:4abb _print_sl_out35 +01:4ac5 __check_assert_fail4 +01:4ad0 _print_sl_data36 +01:4ad3 _print_sl_out36 +01:4ad6 __check_assert_ok4 +01:4ade _print_sl_data37 +01:4ae3 _print_sl_out37 +01:4ae5 __check_assert_skip4 +01:4aed _print_sl_data38 +01:4af5 _print_sl_out38 +01:4af5 __check_assert_out4 +01:4b01 _print_sl_data39 +01:4b03 _print_sl_out39 +01:4b0b _print_sl_data40 +01:4b0e _print_sl_out40 +01:4b18 __check_assert_fail5 +01:4b23 _print_sl_data41 +01:4b26 _print_sl_out41 +01:4b29 __check_assert_ok5 +01:4b31 _print_sl_data42 +01:4b36 _print_sl_out42 +01:4b38 __check_assert_skip5 +01:4b40 _print_sl_data43 +01:4b48 _print_sl_out43 +01:4b48 __check_assert_out5 +01:4b53 _print_sl_data44 +01:4b56 _print_sl_out44 +01:4b62 _print_sl_data45 +01:4b64 _print_sl_out45 +01:4b6c _print_sl_data46 +01:4b6f _print_sl_out46 +01:4b79 __check_assert_fail6 +01:4b84 _print_sl_data47 +01:4b87 _print_sl_out47 +01:4b8a __check_assert_ok6 +01:4b92 _print_sl_data48 +01:4b97 _print_sl_out48 +01:4b99 __check_assert_skip6 +01:4ba1 _print_sl_data49 +01:4ba9 _print_sl_out49 +01:4ba9 __check_assert_out6 +01:4bb5 _print_sl_data50 +01:4bb7 _print_sl_out50 +01:4bbf _print_sl_data51 +01:4bc2 _print_sl_out51 +01:4bcc __check_assert_fail7 +01:4bd7 _print_sl_data52 +01:4bda _print_sl_out52 +01:4bdd __check_assert_ok7 +01:4be5 _print_sl_data53 +01:4bea _print_sl_out53 +01:4bec __check_assert_skip7 +01:4bf4 _print_sl_data54 +01:4bfc _print_sl_out54 +01:4bfc __check_assert_out7 +00:016b fail +00:017f _wait_ly_4 +00:0185 _wait_ly_5 +00:019b _print_results_halt_1 +00:019e _fail_cb +00:01a6 _print_sl_data55 +00:01b2 _print_sl_out55 +00:01c2 _print_sl_data56 +00:01ce _print_sl_out56 +00:01d8 _print_sl_data57 +00:01e4 _print_sl_out57 +00:01ef _print_sl_data58 +00:01f5 _print_sl_out58 +00:0208 _print_sl_data59 +00:0215 _print_sl_out59 +00:0225 _print_sl_data60 +00:0232 _print_sl_out60 +00:0242 _print_sl_data61 +00:024f _print_sl_out61 +00:025a c000_functions_start +00:025a run_test_suite +00:0284 _wait_ly_6 +00:028a _wait_ly_7 +00:02a0 _print_results_halt_2 +00:02a3 _test_ok_cb_0 +00:02ab _print_sl_data62 +00:02b3 _print_sl_out62 +00:02b6 run_tests +00:02c4 run_test_cases +00:02d2 test_case +00:02ef restore_mbc1 +00:02f8 switch_bank +00:0309 fetch_expected_value +00:0328 c000_functions_end +00:0328 expected_banks diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_4Mb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_4Mb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    wV5JCfyNOSX?9$2oRR?PFE-6ys)|W3XzpGwJw9mSQC~{)2~WsIiF~ z)-?&F3@=qxxyfLKUW}1J0wHZFtQUoOyBKW=bYg}Qp{NuFTL(?i&3fVfb0KSo=-hqp z_v(}EUiD@d=lJ&$9i8WW-|u;!=Xbs%$c4Y;w-5J7Zl6iN_p|HQ-`ke-cDz{e<<Ox>d#(yra5soTc3~X=||$?#Gjs-IB|ZW zRnJCp_X}%_&A2#z;{1j2nXnWVZ^p%4&Ba@Hk}E5(Eni+}q{X}Czk3kjYo*@{;T!ou z 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. +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/rom_4Mb.gb". + +[labels] +01:4c00 print_load_font +01:4c0d print_string +01:4c17 print_a +01:4c21 print_newline +01:4c2c print_digit +01:4c39 print_regs +01:4c42 _print_sl_data0 +01:4c48 _print_sl_out0 +01:4c55 _print_sl_data1 +01:4c5b _print_sl_out1 +01:4c6d _print_sl_data2 +01:4c73 _print_sl_out2 +01:4c80 _print_sl_data3 +01:4c86 _print_sl_out3 +01:4c98 _print_sl_data4 +01:4c9e _print_sl_out4 +01:4cab _print_sl_data5 +01:4cb1 _print_sl_out5 +01:4cc3 _print_sl_data6 +01:4cc9 _print_sl_out6 +01:4cd6 _print_sl_data7 +01:4cdc _print_sl_out7 +01:4001 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f1 memcpy +01:47fa memset +01:4803 memcmp +01:4811 clear_vram +01:481b clear_oam +01:4825 disable_lcd_safe +01:482b _wait_ly_0 +01:4831 _wait_ly_1 +01:483a reset_screen +01:484e process_results +01:4862 _wait_ly_2 +01:4868 _wait_ly_3 +01:487e _print_results_halt_0 +01:4881 _process_results_cb +01:488c _print_sl_data8 +01:4896 _print_sl_out8 +01:48b0 _print_sl_data9 +01:48bb _print_sl_out9 +01:48d3 _print_sl_data10 +01:48df _print_sl_out10 +01:48e0 dump_mem +01:48ff _dump_mem_line +01:4929 _check_asserts +01:4937 _print_sl_data11 +01:493a _print_sl_out11 +01:4946 _print_sl_data12 +01:4948 _print_sl_out12 +01:4950 _print_sl_data13 +01:4953 _print_sl_out13 +01:495d __check_assert_fail0 +01:4968 _print_sl_data14 +01:496b _print_sl_out14 +01:496e __check_assert_ok0 +01:4976 _print_sl_data15 +01:497b _print_sl_out15 +01:497d __check_assert_skip0 +01:4985 _print_sl_data16 +01:498d _print_sl_out16 +01:498d __check_assert_out0 +01:4999 _print_sl_data17 +01:499b _print_sl_out17 +01:49a3 _print_sl_data18 +01:49a6 _print_sl_out18 +01:49b0 __check_assert_fail1 +01:49bb _print_sl_data19 +01:49be _print_sl_out19 +01:49c1 __check_assert_ok1 +01:49c9 _print_sl_data20 +01:49ce _print_sl_out20 +01:49d0 __check_assert_skip1 +01:49d8 _print_sl_data21 +01:49e0 _print_sl_out21 +01:49e0 __check_assert_out1 +01:49eb _print_sl_data22 +01:49ee _print_sl_out22 +01:49fa _print_sl_data23 +01:49fc _print_sl_out23 +01:4a04 _print_sl_data24 +01:4a07 _print_sl_out24 +01:4a11 __check_assert_fail2 +01:4a1c _print_sl_data25 +01:4a1f _print_sl_out25 +01:4a22 __check_assert_ok2 +01:4a2a _print_sl_data26 +01:4a2f _print_sl_out26 +01:4a31 __check_assert_skip2 +01:4a39 _print_sl_data27 +01:4a41 _print_sl_out27 +01:4a41 __check_assert_out2 +01:4a4d _print_sl_data28 +01:4a4f _print_sl_out28 +01:4a57 _print_sl_data29 +01:4a5a _print_sl_out29 +01:4a64 __check_assert_fail3 +01:4a6f _print_sl_data30 +01:4a72 _print_sl_out30 +01:4a75 __check_assert_ok3 +01:4a7d _print_sl_data31 +01:4a82 _print_sl_out31 +01:4a84 __check_assert_skip3 +01:4a8c _print_sl_data32 +01:4a94 _print_sl_out32 +01:4a94 __check_assert_out3 +01:4a9f _print_sl_data33 +01:4aa2 _print_sl_out33 +01:4aae _print_sl_data34 +01:4ab0 _print_sl_out34 +01:4ab8 _print_sl_data35 +01:4abb _print_sl_out35 +01:4ac5 __check_assert_fail4 +01:4ad0 _print_sl_data36 +01:4ad3 _print_sl_out36 +01:4ad6 __check_assert_ok4 +01:4ade _print_sl_data37 +01:4ae3 _print_sl_out37 +01:4ae5 __check_assert_skip4 +01:4aed _print_sl_data38 +01:4af5 _print_sl_out38 +01:4af5 __check_assert_out4 +01:4b01 _print_sl_data39 +01:4b03 _print_sl_out39 +01:4b0b _print_sl_data40 +01:4b0e _print_sl_out40 +01:4b18 __check_assert_fail5 +01:4b23 _print_sl_data41 +01:4b26 _print_sl_out41 +01:4b29 __check_assert_ok5 +01:4b31 _print_sl_data42 +01:4b36 _print_sl_out42 +01:4b38 __check_assert_skip5 +01:4b40 _print_sl_data43 +01:4b48 _print_sl_out43 +01:4b48 __check_assert_out5 +01:4b53 _print_sl_data44 +01:4b56 _print_sl_out44 +01:4b62 _print_sl_data45 +01:4b64 _print_sl_out45 +01:4b6c _print_sl_data46 +01:4b6f _print_sl_out46 +01:4b79 __check_assert_fail6 +01:4b84 _print_sl_data47 +01:4b87 _print_sl_out47 +01:4b8a __check_assert_ok6 +01:4b92 _print_sl_data48 +01:4b97 _print_sl_out48 +01:4b99 __check_assert_skip6 +01:4ba1 _print_sl_data49 +01:4ba9 _print_sl_out49 +01:4ba9 __check_assert_out6 +01:4bb5 _print_sl_data50 +01:4bb7 _print_sl_out50 +01:4bbf _print_sl_data51 +01:4bc2 _print_sl_out51 +01:4bcc __check_assert_fail7 +01:4bd7 _print_sl_data52 +01:4bda _print_sl_out52 +01:4bdd __check_assert_ok7 +01:4be5 _print_sl_data53 +01:4bea _print_sl_out53 +01:4bec __check_assert_skip7 +01:4bf4 _print_sl_data54 +01:4bfc _print_sl_out54 +01:4bfc __check_assert_out7 +00:016b fail +00:017f _wait_ly_4 +00:0185 _wait_ly_5 +00:019b _print_results_halt_1 +00:019e _fail_cb +00:01a6 _print_sl_data55 +00:01b2 _print_sl_out55 +00:01c2 _print_sl_data56 +00:01ce _print_sl_out56 +00:01d8 _print_sl_data57 +00:01e4 _print_sl_out57 +00:01ef _print_sl_data58 +00:01f5 _print_sl_out58 +00:0208 _print_sl_data59 +00:0215 _print_sl_out59 +00:0225 _print_sl_data60 +00:0232 _print_sl_out60 +00:0242 _print_sl_data61 +00:024f _print_sl_out61 +00:025a c000_functions_start +00:025a run_test_suite +00:0284 _wait_ly_6 +00:028a _wait_ly_7 +00:02a0 _print_results_halt_2 +00:02a3 _test_ok_cb_0 +00:02ab _print_sl_data62 +00:02b3 _print_sl_out62 +00:02b6 run_tests +00:02c4 run_test_cases +00:02d2 test_case +00:02ef restore_mbc1 +00:02f8 switch_bank +00:0309 fetch_expected_value +00:0328 c000_functions_end +00:0328 expected_banks diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..282b639d387e28e53e036f95db55be9ea28d2419 GIT binary patch literal 1188 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QI8r;B4q#hkZu?v@==5MY}; zZ{L6I<>FB;3Df5?rAfA15&fAp1o-t_+x56Y|UK0j$$ z`?e^JrZ~`ceDIGlbbeGk5|6GxhqoU(FFGH z&s$urIaBZDxkl`L%lGrBg{1-uW94Iq-75SCw_iSIDzZ3IyZ2>o`HAC?UE;3RY~L8$ z|65E}ed|>Yv%H?gYwwk@XWLv`@vZ)o^6pz-cdUP4@cwB3ia2*uFa2F-+>df?t6+&t zJbGlZ+`luz!iQIz-H&2Ed1B4Sn*Q0EcfvQQs^#(5iKJE4=RUSoUWZT%2FZxn*7VUOTmCX9J$dxmss>ipTzZdSs8J zj@SW@mP&fXHuKiMkz>)z;Jg}0o$P5=F!nN(dm;pFNlzZ6Zm^3Z#AnSToI z+ppQ{bRpV%!>en1zrK9r=^JUw$hTdwqHOj>PJ_6Ay}?&^mW+BUGwDs|Lax1zv%BbSC7RnX8aIJbzQC-m_0B2$J~g&KlCd# zui04q{HPStr1SdO_HTbS8RmOR@coKwoXT$f^P^RT_Kk(R4*6|*;1fH=Yl3Ld!-qEd zm2WrwT+|GaUlRQ#?ajL0=zxv$RgULMhMD$Nf6j@TuC=;WR_yQY=15?=nq1c#_6g`rJ7A=gPOgeq48O@6XpWt@3_*+ciyo-`4bhR&#twgaP*_ k91)7hb4al~R0RJqJXDcW*B5zU3Mzd(UHx3vIVCg!09gb!Gynhq literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..6ad98dafc8c739a461b75c4fd4bcd44c3c28d851 GIT binary patch literal 65536 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 I?lpn`0&en2?EnA( literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/test.sym new file mode 100644 index 000000000..113503729 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_512Kb/test.sym @@ -0,0 +1,226 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/rom_512Kb.gb". + +[labels] +01:4c00 print_load_font +01:4c0d print_string +01:4c17 print_a +01:4c21 print_newline +01:4c2c print_digit +01:4c39 print_regs +01:4c42 _print_sl_data0 +01:4c48 _print_sl_out0 +01:4c55 _print_sl_data1 +01:4c5b _print_sl_out1 +01:4c6d _print_sl_data2 +01:4c73 _print_sl_out2 +01:4c80 _print_sl_data3 +01:4c86 _print_sl_out3 +01:4c98 _print_sl_data4 +01:4c9e _print_sl_out4 +01:4cab _print_sl_data5 +01:4cb1 _print_sl_out5 +01:4cc3 _print_sl_data6 +01:4cc9 _print_sl_out6 +01:4cd6 _print_sl_data7 +01:4cdc _print_sl_out7 +01:4001 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f1 memcpy +01:47fa memset +01:4803 memcmp +01:4811 clear_vram +01:481b clear_oam +01:4825 disable_lcd_safe +01:482b _wait_ly_0 +01:4831 _wait_ly_1 +01:483a reset_screen +01:484e process_results +01:4862 _wait_ly_2 +01:4868 _wait_ly_3 +01:487e _print_results_halt_0 +01:4881 _process_results_cb +01:488c _print_sl_data8 +01:4896 _print_sl_out8 +01:48b0 _print_sl_data9 +01:48bb _print_sl_out9 +01:48d3 _print_sl_data10 +01:48df _print_sl_out10 +01:48e0 dump_mem +01:48ff _dump_mem_line +01:4929 _check_asserts +01:4937 _print_sl_data11 +01:493a _print_sl_out11 +01:4946 _print_sl_data12 +01:4948 _print_sl_out12 +01:4950 _print_sl_data13 +01:4953 _print_sl_out13 +01:495d __check_assert_fail0 +01:4968 _print_sl_data14 +01:496b _print_sl_out14 +01:496e __check_assert_ok0 +01:4976 _print_sl_data15 +01:497b _print_sl_out15 +01:497d __check_assert_skip0 +01:4985 _print_sl_data16 +01:498d _print_sl_out16 +01:498d __check_assert_out0 +01:4999 _print_sl_data17 +01:499b _print_sl_out17 +01:49a3 _print_sl_data18 +01:49a6 _print_sl_out18 +01:49b0 __check_assert_fail1 +01:49bb _print_sl_data19 +01:49be _print_sl_out19 +01:49c1 __check_assert_ok1 +01:49c9 _print_sl_data20 +01:49ce _print_sl_out20 +01:49d0 __check_assert_skip1 +01:49d8 _print_sl_data21 +01:49e0 _print_sl_out21 +01:49e0 __check_assert_out1 +01:49eb _print_sl_data22 +01:49ee _print_sl_out22 +01:49fa _print_sl_data23 +01:49fc _print_sl_out23 +01:4a04 _print_sl_data24 +01:4a07 _print_sl_out24 +01:4a11 __check_assert_fail2 +01:4a1c _print_sl_data25 +01:4a1f _print_sl_out25 +01:4a22 __check_assert_ok2 +01:4a2a _print_sl_data26 +01:4a2f _print_sl_out26 +01:4a31 __check_assert_skip2 +01:4a39 _print_sl_data27 +01:4a41 _print_sl_out27 +01:4a41 __check_assert_out2 +01:4a4d _print_sl_data28 +01:4a4f _print_sl_out28 +01:4a57 _print_sl_data29 +01:4a5a _print_sl_out29 +01:4a64 __check_assert_fail3 +01:4a6f _print_sl_data30 +01:4a72 _print_sl_out30 +01:4a75 __check_assert_ok3 +01:4a7d _print_sl_data31 +01:4a82 _print_sl_out31 +01:4a84 __check_assert_skip3 +01:4a8c _print_sl_data32 +01:4a94 _print_sl_out32 +01:4a94 __check_assert_out3 +01:4a9f _print_sl_data33 +01:4aa2 _print_sl_out33 +01:4aae _print_sl_data34 +01:4ab0 _print_sl_out34 +01:4ab8 _print_sl_data35 +01:4abb _print_sl_out35 +01:4ac5 __check_assert_fail4 +01:4ad0 _print_sl_data36 +01:4ad3 _print_sl_out36 +01:4ad6 __check_assert_ok4 +01:4ade _print_sl_data37 +01:4ae3 _print_sl_out37 +01:4ae5 __check_assert_skip4 +01:4aed _print_sl_data38 +01:4af5 _print_sl_out38 +01:4af5 __check_assert_out4 +01:4b01 _print_sl_data39 +01:4b03 _print_sl_out39 +01:4b0b _print_sl_data40 +01:4b0e _print_sl_out40 +01:4b18 __check_assert_fail5 +01:4b23 _print_sl_data41 +01:4b26 _print_sl_out41 +01:4b29 __check_assert_ok5 +01:4b31 _print_sl_data42 +01:4b36 _print_sl_out42 +01:4b38 __check_assert_skip5 +01:4b40 _print_sl_data43 +01:4b48 _print_sl_out43 +01:4b48 __check_assert_out5 +01:4b53 _print_sl_data44 +01:4b56 _print_sl_out44 +01:4b62 _print_sl_data45 +01:4b64 _print_sl_out45 +01:4b6c _print_sl_data46 +01:4b6f _print_sl_out46 +01:4b79 __check_assert_fail6 +01:4b84 _print_sl_data47 +01:4b87 _print_sl_out47 +01:4b8a __check_assert_ok6 +01:4b92 _print_sl_data48 +01:4b97 _print_sl_out48 +01:4b99 __check_assert_skip6 +01:4ba1 _print_sl_data49 +01:4ba9 _print_sl_out49 +01:4ba9 __check_assert_out6 +01:4bb5 _print_sl_data50 +01:4bb7 _print_sl_out50 +01:4bbf _print_sl_data51 +01:4bc2 _print_sl_out51 +01:4bcc __check_assert_fail7 +01:4bd7 _print_sl_data52 +01:4bda _print_sl_out52 +01:4bdd __check_assert_ok7 +01:4be5 _print_sl_data53 +01:4bea _print_sl_out53 +01:4bec __check_assert_skip7 +01:4bf4 _print_sl_data54 +01:4bfc _print_sl_out54 +01:4bfc __check_assert_out7 +00:016b fail +00:017f _wait_ly_4 +00:0185 _wait_ly_5 +00:019b _print_results_halt_1 +00:019e _fail_cb +00:01a6 _print_sl_data55 +00:01b2 _print_sl_out55 +00:01c2 _print_sl_data56 +00:01ce _print_sl_out56 +00:01d8 _print_sl_data57 +00:01e4 _print_sl_out57 +00:01ef _print_sl_data58 +00:01f5 _print_sl_out58 +00:0208 _print_sl_data59 +00:0215 _print_sl_out59 +00:0225 _print_sl_data60 +00:0232 _print_sl_out60 +00:0242 _print_sl_data61 +00:024f _print_sl_out61 +00:025a c000_functions_start +00:025a run_test_suite +00:0284 _wait_ly_6 +00:028a _wait_ly_7 +00:02a0 _print_results_halt_2 +00:02a3 _test_ok_cb_0 +00:02ab _print_sl_data62 +00:02b3 _print_sl_out62 +00:02b6 run_tests +00:02c4 run_test_cases +00:02d2 test_case +00:02ef restore_mbc1 +00:02f8 switch_bank +00:0309 fetch_expected_value +00:0328 c000_functions_end +00:0328 expected_banks diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/test.sym new file mode 100644 index 000000000..9217d7990 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1/rom_8Mb/test.sym @@ -0,0 +1,226 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/rom_8Mb.gb". + +[labels] +01:4c00 print_load_font +01:4c0d print_string +01:4c17 print_a +01:4c21 print_newline +01:4c2c print_digit +01:4c39 print_regs +01:4c42 _print_sl_data0 +01:4c48 _print_sl_out0 +01:4c55 _print_sl_data1 +01:4c5b _print_sl_out1 +01:4c6d _print_sl_data2 +01:4c73 _print_sl_out2 +01:4c80 _print_sl_data3 +01:4c86 _print_sl_out3 +01:4c98 _print_sl_data4 +01:4c9e _print_sl_out4 +01:4cab _print_sl_data5 +01:4cb1 _print_sl_out5 +01:4cc3 _print_sl_data6 +01:4cc9 _print_sl_out6 +01:4cd6 _print_sl_data7 +01:4cdc _print_sl_out7 +01:4001 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f1 memcpy +01:47fa memset +01:4803 memcmp +01:4811 clear_vram +01:481b clear_oam +01:4825 disable_lcd_safe +01:482b _wait_ly_0 +01:4831 _wait_ly_1 +01:483a reset_screen +01:484e process_results +01:4862 _wait_ly_2 +01:4868 _wait_ly_3 +01:487e _print_results_halt_0 +01:4881 _process_results_cb +01:488c _print_sl_data8 +01:4896 _print_sl_out8 +01:48b0 _print_sl_data9 +01:48bb _print_sl_out9 +01:48d3 _print_sl_data10 +01:48df _print_sl_out10 +01:48e0 dump_mem +01:48ff _dump_mem_line +01:4929 _check_asserts +01:4937 _print_sl_data11 +01:493a _print_sl_out11 +01:4946 _print_sl_data12 +01:4948 _print_sl_out12 +01:4950 _print_sl_data13 +01:4953 _print_sl_out13 +01:495d __check_assert_fail0 +01:4968 _print_sl_data14 +01:496b _print_sl_out14 +01:496e __check_assert_ok0 +01:4976 _print_sl_data15 +01:497b _print_sl_out15 +01:497d __check_assert_skip0 +01:4985 _print_sl_data16 +01:498d _print_sl_out16 +01:498d __check_assert_out0 +01:4999 _print_sl_data17 +01:499b _print_sl_out17 +01:49a3 _print_sl_data18 +01:49a6 _print_sl_out18 +01:49b0 __check_assert_fail1 +01:49bb _print_sl_data19 +01:49be _print_sl_out19 +01:49c1 __check_assert_ok1 +01:49c9 _print_sl_data20 +01:49ce _print_sl_out20 +01:49d0 __check_assert_skip1 +01:49d8 _print_sl_data21 +01:49e0 _print_sl_out21 +01:49e0 __check_assert_out1 +01:49eb _print_sl_data22 +01:49ee _print_sl_out22 +01:49fa _print_sl_data23 +01:49fc _print_sl_out23 +01:4a04 _print_sl_data24 +01:4a07 _print_sl_out24 +01:4a11 __check_assert_fail2 +01:4a1c _print_sl_data25 +01:4a1f _print_sl_out25 +01:4a22 __check_assert_ok2 +01:4a2a _print_sl_data26 +01:4a2f _print_sl_out26 +01:4a31 __check_assert_skip2 +01:4a39 _print_sl_data27 +01:4a41 _print_sl_out27 +01:4a41 __check_assert_out2 +01:4a4d _print_sl_data28 +01:4a4f _print_sl_out28 +01:4a57 _print_sl_data29 +01:4a5a _print_sl_out29 +01:4a64 __check_assert_fail3 +01:4a6f _print_sl_data30 +01:4a72 _print_sl_out30 +01:4a75 __check_assert_ok3 +01:4a7d _print_sl_data31 +01:4a82 _print_sl_out31 +01:4a84 __check_assert_skip3 +01:4a8c _print_sl_data32 +01:4a94 _print_sl_out32 +01:4a94 __check_assert_out3 +01:4a9f _print_sl_data33 +01:4aa2 _print_sl_out33 +01:4aae _print_sl_data34 +01:4ab0 _print_sl_out34 +01:4ab8 _print_sl_data35 +01:4abb _print_sl_out35 +01:4ac5 __check_assert_fail4 +01:4ad0 _print_sl_data36 +01:4ad3 _print_sl_out36 +01:4ad6 __check_assert_ok4 +01:4ade _print_sl_data37 +01:4ae3 _print_sl_out37 +01:4ae5 __check_assert_skip4 +01:4aed _print_sl_data38 +01:4af5 _print_sl_out38 +01:4af5 __check_assert_out4 +01:4b01 _print_sl_data39 +01:4b03 _print_sl_out39 +01:4b0b _print_sl_data40 +01:4b0e _print_sl_out40 +01:4b18 __check_assert_fail5 +01:4b23 _print_sl_data41 +01:4b26 _print_sl_out41 +01:4b29 __check_assert_ok5 +01:4b31 _print_sl_data42 +01:4b36 _print_sl_out42 +01:4b38 __check_assert_skip5 +01:4b40 _print_sl_data43 +01:4b48 _print_sl_out43 +01:4b48 __check_assert_out5 +01:4b53 _print_sl_data44 +01:4b56 _print_sl_out44 +01:4b62 _print_sl_data45 +01:4b64 _print_sl_out45 +01:4b6c _print_sl_data46 +01:4b6f _print_sl_out46 +01:4b79 __check_assert_fail6 +01:4b84 _print_sl_data47 +01:4b87 _print_sl_out47 +01:4b8a __check_assert_ok6 +01:4b92 _print_sl_data48 +01:4b97 _print_sl_out48 +01:4b99 __check_assert_skip6 +01:4ba1 _print_sl_data49 +01:4ba9 _print_sl_out49 +01:4ba9 __check_assert_out6 +01:4bb5 _print_sl_data50 +01:4bb7 _print_sl_out50 +01:4bbf _print_sl_data51 +01:4bc2 _print_sl_out51 +01:4bcc __check_assert_fail7 +01:4bd7 _print_sl_data52 +01:4bda _print_sl_out52 +01:4bdd __check_assert_ok7 +01:4be5 _print_sl_data53 +01:4bea _print_sl_out53 +01:4bec __check_assert_skip7 +01:4bf4 _print_sl_data54 +01:4bfc _print_sl_out54 +01:4bfc __check_assert_out7 +00:016b fail +00:017f _wait_ly_4 +00:0185 _wait_ly_5 +00:019b _print_results_halt_1 +00:019e _fail_cb +00:01a6 _print_sl_data55 +00:01b2 _print_sl_out55 +00:01c2 _print_sl_data56 +00:01ce _print_sl_out56 +00:01d8 _print_sl_data57 +00:01e4 _print_sl_out57 +00:01ef _print_sl_data58 +00:01f5 _print_sl_out58 +00:0208 _print_sl_data59 +00:0215 _print_sl_out59 +00:0225 _print_sl_data60 +00:0232 _print_sl_out60 +00:0242 _print_sl_data61 +00:024f _print_sl_out61 +00:025a c000_functions_start +00:025a run_test_suite +00:0284 _wait_ly_6 +00:028a _wait_ly_7 +00:02a0 _print_results_halt_2 +00:02a3 _test_ok_cb_0 +00:02ab _print_sl_data62 +00:02b3 _print_sl_out62 +00:02b6 run_tests +00:02c4 run_test_cases +00:02d2 test_case +00:02ef restore_mbc1 +00:02f8 switch_bank +00:0309 fetch_expected_value +00:0328 c000_functions_end +00:0328 expected_banks diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/test.sym new file mode 100644 index 000000000..95fa3e20a --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/emulator-only/mbc1_rom_4banks/test.sym @@ -0,0 +1,205 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/jeffrey/Scratch/mooneye-gb/tests/build/emulator-only/mbc1_rom_4banks.gb". + +[labels] +0001:4bf3 print_load_font +0001:4c00 print_string +0001:4c0a print_a +0001:4c14 print_newline +0001:4c1f print_digit +0001:4c2c print_regs +0001:4c35 _print_sl_data0 +0001:4c3b _print_sl_out0 +0001:4c48 _print_sl_data1 +0001:4c4e _print_sl_out1 +0001:4c60 _print_sl_data2 +0001:4c66 _print_sl_out2 +0001:4c73 _print_sl_data3 +0001:4c79 _print_sl_out3 +0001:4c8b _print_sl_data4 +0001:4c91 _print_sl_out4 +0001:4c9e _print_sl_data5 +0001:4ca4 _print_sl_out5 +0001:4cb6 _print_sl_data6 +0001:4cbc _print_sl_out6 +0001:4cc9 _print_sl_data7 +0001:4ccf _print_sl_out7 +0001:4001 font +0000:c000 regs_save +0000:c000 regs_save.f +0000:c001 regs_save.a +0000:c002 regs_save.c +0000:c003 regs_save.b +0000:c004 regs_save.e +0000:c005 regs_save.d +0000:c006 regs_save.l +0000:c007 regs_save.h +0000:c008 regs_flags +0000:c009 regs_assert +0000:c009 regs_assert.f +0000:c00a regs_assert.a +0000:c00b regs_assert.c +0000:c00c regs_assert.b +0000:c00d regs_assert.e +0000:c00e regs_assert.d +0000:c00f regs_assert.l +0000:c010 regs_assert.h +0000:c011 memdump_len +0000:c012 memdump_addr +0001:47f1 memcpy +0001:47fa memset +0001:4803 clear_vram +0001:480e reset_screen +0001:481b process_results +0001:4820 _wait_ly_0 +0001:4826 _wait_ly_1 +0001:4842 _wait_ly_2 +0001:4848 _wait_ly_3 +0001:4861 _process_results_cb +0001:486c _print_sl_data8 +0001:4876 _print_sl_out8 +0001:4890 _print_sl_data9 +0001:489b _print_sl_out9 +0001:48b3 _print_sl_data10 +0001:48bf _print_sl_out10 +0001:48c0 dump_mem +0001:48d0 _wait_ly_4 +0001:48d6 _wait_ly_5 +0001:48f2 _dump_mem_line +0001:491c _check_asserts +0001:492a _print_sl_data11 +0001:492d _print_sl_out11 +0001:4939 _print_sl_data12 +0001:493b _print_sl_out12 +0001:4943 _print_sl_data13 +0001:4946 _print_sl_out13 +0001:4950 __check_assert_fail0 +0001:495b _print_sl_data14 +0001:495e _print_sl_out14 +0001:4961 __check_assert_ok0 +0001:4969 _print_sl_data15 +0001:496e _print_sl_out15 +0001:4970 __check_assert_skip0 +0001:4978 _print_sl_data16 +0001:4980 _print_sl_out16 +0001:4980 __check_assert_out0 +0001:498c _print_sl_data17 +0001:498e _print_sl_out17 +0001:4996 _print_sl_data18 +0001:4999 _print_sl_out18 +0001:49a3 __check_assert_fail1 +0001:49ae _print_sl_data19 +0001:49b1 _print_sl_out19 +0001:49b4 __check_assert_ok1 +0001:49bc _print_sl_data20 +0001:49c1 _print_sl_out20 +0001:49c3 __check_assert_skip1 +0001:49cb _print_sl_data21 +0001:49d3 _print_sl_out21 +0001:49d3 __check_assert_out1 +0001:49de _print_sl_data22 +0001:49e1 _print_sl_out22 +0001:49ed _print_sl_data23 +0001:49ef _print_sl_out23 +0001:49f7 _print_sl_data24 +0001:49fa _print_sl_out24 +0001:4a04 __check_assert_fail2 +0001:4a0f _print_sl_data25 +0001:4a12 _print_sl_out25 +0001:4a15 __check_assert_ok2 +0001:4a1d _print_sl_data26 +0001:4a22 _print_sl_out26 +0001:4a24 __check_assert_skip2 +0001:4a2c _print_sl_data27 +0001:4a34 _print_sl_out27 +0001:4a34 __check_assert_out2 +0001:4a40 _print_sl_data28 +0001:4a42 _print_sl_out28 +0001:4a4a _print_sl_data29 +0001:4a4d _print_sl_out29 +0001:4a57 __check_assert_fail3 +0001:4a62 _print_sl_data30 +0001:4a65 _print_sl_out30 +0001:4a68 __check_assert_ok3 +0001:4a70 _print_sl_data31 +0001:4a75 _print_sl_out31 +0001:4a77 __check_assert_skip3 +0001:4a7f _print_sl_data32 +0001:4a87 _print_sl_out32 +0001:4a87 __check_assert_out3 +0001:4a92 _print_sl_data33 +0001:4a95 _print_sl_out33 +0001:4aa1 _print_sl_data34 +0001:4aa3 _print_sl_out34 +0001:4aab _print_sl_data35 +0001:4aae _print_sl_out35 +0001:4ab8 __check_assert_fail4 +0001:4ac3 _print_sl_data36 +0001:4ac6 _print_sl_out36 +0001:4ac9 __check_assert_ok4 +0001:4ad1 _print_sl_data37 +0001:4ad6 _print_sl_out37 +0001:4ad8 __check_assert_skip4 +0001:4ae0 _print_sl_data38 +0001:4ae8 _print_sl_out38 +0001:4ae8 __check_assert_out4 +0001:4af4 _print_sl_data39 +0001:4af6 _print_sl_out39 +0001:4afe _print_sl_data40 +0001:4b01 _print_sl_out40 +0001:4b0b __check_assert_fail5 +0001:4b16 _print_sl_data41 +0001:4b19 _print_sl_out41 +0001:4b1c __check_assert_ok5 +0001:4b24 _print_sl_data42 +0001:4b29 _print_sl_out42 +0001:4b2b __check_assert_skip5 +0001:4b33 _print_sl_data43 +0001:4b3b _print_sl_out43 +0001:4b3b __check_assert_out5 +0001:4b46 _print_sl_data44 +0001:4b49 _print_sl_out44 +0001:4b55 _print_sl_data45 +0001:4b57 _print_sl_out45 +0001:4b5f _print_sl_data46 +0001:4b62 _print_sl_out46 +0001:4b6c __check_assert_fail6 +0001:4b77 _print_sl_data47 +0001:4b7a _print_sl_out47 +0001:4b7d __check_assert_ok6 +0001:4b85 _print_sl_data48 +0001:4b8a _print_sl_out48 +0001:4b8c __check_assert_skip6 +0001:4b94 _print_sl_data49 +0001:4b9c _print_sl_out49 +0001:4b9c __check_assert_out6 +0001:4ba8 _print_sl_data50 +0001:4baa _print_sl_out50 +0001:4bb2 _print_sl_data51 +0001:4bb5 _print_sl_out51 +0001:4bbf __check_assert_fail7 +0001:4bca _print_sl_data52 +0001:4bcd _print_sl_out52 +0001:4bd0 __check_assert_ok7 +0001:4bd8 _print_sl_data53 +0001:4bdd _print_sl_out53 +0001:4bdf __check_assert_skip7 +0001:4be7 _print_sl_data54 +0001:4bef _print_sl_out54 +0001:4bef __check_assert_out7 +0000:01c8 _wait_ly_6 +0000:01ce _wait_ly_7 +0000:01ea _wait_ly_8 +0000:01f0 _wait_ly_9 +0000:0209 _test_ok_cb_0 +0000:0211 _print_sl_data55 +0000:0219 _print_sl_out55 +0000:021c switch_bank +0000:0225 test_mbc +0000:0236 _wait_ly_10 +0000:023c _wait_ly_11 +0000:0258 _wait_ly_12 +0000:025e _wait_ly_13 +0000:0277 _test_failure_cb_0 +0000:027f _print_sl_data56 +0000:028b _print_sl_out56 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..78773f1a841361789c0778417da1f8003b986ac0 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62asS`bDyMij3bW*0J*sd}X7_u( zOOLwgxz`fEHj|CAW_Ry=L0=ltzLls;31gk6l^8+9kFW@Nm~yMsTcF@~38 zM&5zi1nwtU4hKq@-x1{mn-9```wnLE*V;w`eW_aF8c~vxSdwa$T$Bo=7>o=IO?3?o zbPbF`jEt=e%&ZJdwGDs_gF_7O+)*^-=BH$)RpQpLIX3J!Py>UftDnm{r-UW|^)H>C literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..05b502f2679fe959f5593400f6298c75dc42c4a4 GIT binary patch literal 32768 zcmeI4VQ5oV6vyv-P2;nT`eI!7tPg$3LW!M9sWP*YJ(Kv_CN`|4trNO}U5iz4Q$aU6 z&0@rTQ2eriFa?>iFM=>+AczwrOb|mF2ZL=4?C6K#ht3VbfwOGQ?zt!TC2p{O*K^vu zy#G1po^$W--COX3uTpujjoltl?)^47IlYWEHymasnU5`Fnt$D?(`@rdDW_~(< z^XA@(1Ir&y&)h$M@#c-q_In2p9@z8Yo{f9Qts{F5A7LXSjGMBVZ49+ME{9X)*Hh(6 zpIw54r(*INm)Q;N>)O8IGTke%~SD+=?JAN7`7Q$e=ipKeq%#$_;GDcyt1 z!Xszlv^CGKpIGz3e8qoFQN|$ScAl47@J8z6wl&+sK42{W|38a_Y5XF976}u-MF1@l zCVq>Y5g-CYfCvx)B0vO)01+Sp zM1TkofftrQ>kGSbS~w9P0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO) z01+SpM1Tkof#-!luFl|pvDe8Q>F19JJkxs9s>Yb6fj`2nJ`SF27C+$Ew6$v^5z}mH zip5~W*x1>#`}Vc8tY7c-LfkYhZmUE58obc;D>m7yJ_0C zX|}h60)q+KHe6B5s~iD37L(rEH|DD<*0!v89AbtM4kx*V!-fG`(+mS@Yno|-j>VEm zkH;`9D<}59)X60Ffc!`#mC9zZel8b}XS1p*OEYiq#D zwe?DkguGtE7#lMTtPH>!wMbe!iBSEM@KEoG!1UyFwO$< zr=}bSK5&)e^V}RK8kKQ~%6K*#k55g-xn;8uuW95B{qy+?7vy+Yc`gUnWD@f6$pU}d z25p+K8$2GF?>MQ{z`&tHsg&bD96F)liW7;6iJd#s=>#{3CzIpjgM&ME^z>kT(+pJ& zpD(TtD?omITvg@z2L@z6i0it~7YgC{x)L=w16T1cpT4;#{;v4=PSl8UD}LsUH|v_g)A_vC(j-F z;2Mjms%`i5bajCOGO&Ng$45s&gW;LR^{d=$JDHUEcw*ob$o*>=x*m<{+;B8wTef5} zj!(+(Yim50NTNJqzp4Ui9Y(U33rCMQQmfI8fR zZQ9h?2@f3=&QLxd@Qsd+k0+C`Q{!>aU0twS;0&sQ>4puRozNFzxO&5Yxue$gSPW)R z>kqx!+FDyN4tucn_XT_>xQ&cVPS)bE2kJHM0bR#43x8Rm3*?)ou6JuHu$sGgF z-^WeUv+-mXzdIUgHvR<9Evqr`O0)6D)?$$56=q$% z4R5JgP%bfX$KOYjyIcRlnbNJ|)!F3i_SwGK9kzcqZvQpgds|Pr@4g9I=gRrif8Jwr z^s?piHY{&!(bg_&dudaM8Grj(K{=Bu`!Yt;V0UkNXt;ZDh?T7j{6^tAuNAIGwklUe zPIF>tsC#fY-T$VW6iFYw9(kE3D&L6|-*ETPu+@`DXSy9$obwkxnp;`O&IJm!$+2_u zfx@o&m4)3$%PpB>{L{)mfq8%7jmQcZ@nGG;D(hEX)A(7efzR{mEyktiB)a^`p3x`5Um6vRmB@dv#S~4q?Tk?#MZb_K) z=a>(3p5P6>6jF7VavcNEppiFNE*pG{{%V66q1*-!g>)N~_Vbdg4;HU>Go?w~H9$!Z zFS$&X457bTvO_4hsKL((|65c?U4NjuJ+Tc^6+y<9~ zbQ_e8@sihsPt7pp77m4yUS4vAEcpZat0jLC$}Ra=NVg=Pb1|sr{Vc9LTEgEfRcu;d z5l^VWcv9>wb(CMtlsb%NeinXT=VkrArA2$irG=)bdS}UU|q>37`JE7H~dZ0a}CpK?>bm#$2GYVmpb#~Q7J z2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y h2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpMBs%Z@DIb}DE$Bc literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/test.sym new file mode 100644 index 000000000..cfaa2ab88 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/madness/mgb_oam_dma_halt_sprites/test.sym @@ -0,0 +1,200 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/madness/mgb_oam_dma_halt_sprites.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0199 _wait_ly_4 +00:019f _wait_ly_5 +00:01b4 hiram_test +00:01b9 _wait_ly_6 +00:01bf _wait_ly_7 +00:01cc vram_checkerboard +00:05cc vram_checkerboard_end +00:05cc initial_data +00:05d4 initial_data_end diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/manifest.yml new file mode 100644 index 000000000..bbd7d13ba --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/manifest.yml @@ -0,0 +1,4 @@ +skip: 60 +frames: 1 +config: + sgb.borders: false diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..e35683164dcfbb5435767d753a4462ddc70f3ec5 GIT binary patch literal 560 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62asS`bGZqKA zJ29*~C-V}>QAqX(@?~JCQe$9fXklRZ1r%y{!N5>zz`*b-fq}tl1_Oh5!JJ)zHb4oc zByV>YhX3vTXZ8b4vGa6s45_&F_WEhQW&<9V!2cWn*Sm&t9O0aj$CP|zuIt)ojeg9U zUA`xivltv25cq&~!@G59bC~w;+T+xa&#>&i%1&m11y&4hrd_9eVOCaQ(C$rdYov?%&*v2$ zkNLezbk%~p{Cm<^A9u;x{joRmua#SOPi5yPmj(ImBK-5cKmKemkQcP+`}%i>MY&Ev zRKEu6rp|4fyVu{9TXp@V?{C%vA&eXWbJ-cDhu@s>pQVA5`2*{LCqNtq)Hj@jI+$E)vfK~GXZ3y0Y$jg&4h&b-64!{5l*E!$tK_0oAjM#0U}&mq07S+i zh89+a2397<+6Kl}1_tfw$3;;zbP0l+XkKZlT3a literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..9df4d749dac105b324ce16c667aba189ff236fce GIT binary patch literal 32768 zcmeI4UuYcH6^HMP*78_d+gDk~9V>%9+Ad=4*k&S+?XlQQX4fNW)>mlgzdz_g|>g+MTcf=NuwQbX{v-V_RL3B*AUB@b#E3<;zWt(1H2 z**h!eB@cNp)aT$C&F`FZ&$;)Tdj)#%tgk=W#_o=4AO3rO{{B|h*>-`w#*%C+GrIQt z@(s4_-7)ew#Ll=*~SPL z7yIsuGiT-)b6)hAGkTOc(GlhZhneHK%yAAeC)>vy`#I*A4s$qX?#wanzUXmx^eA_u zBis!RbJugZ>m1^4wvW5^bKEr@?sCq9q__;uM&T0A?8)8|w0a^y1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&Ih`?hZP}yMczt}g(3hDnp9`H^#n$a}I z3-S+=lUyLx+f?ZSMl z3(sJN!8v4bj(+%=5C(pT@7rftzHeFk_JIO}3Hmnzmh$`(Noo0ee7xHXB9dGS;tDf}mX1brsL$ zKtl)2uT&oG5B1j?-$pH6(E0OT-Vk5M@LmZh;yDyrqek7$`zO^8ur7r zsP}pGD(H+b++Q%SVsUbEZcfb)BDf1-d_JE}@7U3**V-?*KF@>G0*3s90MAY$0keho zE5~lx(ur}-zkPlo3k>V2bB8{-=W@F4`-6l1{h)vh?BChh>1ohlc&2gvx-j1_6jVN* z7&rxL|C%P}o+mylBF{67cimDc3|%*oz}0vj@X2H#279}SQ=V_o>O>mG`SY;yOeULk zoc;SDAL^nZU+~S(PfY=Jcm_Lou&)nZIx3u@dOzTso}Qg86kw+Y0qFjI*e!4db;)%9 z{=Pow3o%^1X~Nu5bDqn=3|jr6S8s23H^yNPwtl~W@2aq=srmU<9QMFQjeCG|JhSkd z6}mvaWpVBZ;~e=bR%*w<`%elp3^hL()z?=l!B2SWEd#yq$9vuBRHymXN%3?k-D&;@ zJa_C(sULQlUmmUXutkm8H}8HuBtBWA-C*)be5$2EJpGhHyejt`h%TpZ`-zMr?Go$@6!j<;`=vUtg5{k zHIgN>V{BlkI6g5jHqIJ$3I2I-Up1GN&^?K0YuuQ5^YEoRlqIx|RKbNYwr+ zQ<4({;}iB^zE~OvS#71O`s&J4)$&TJ+L|1@wwkJ*Tz#r~>QZB8>9V-G#g$s^sy?6H z4kJF@v$n(jm#AreqQ28}^Q4%_DeXuRrrIXnDcKjALcwK8oVQ=9y09~2B5(v(O{cu z@E7zq8$6IIZt$6uafA9Rq9hxJ#p?r1>yS@vP%&Eq>4+vAZ1(<<~)Y^ zFy{-R!B3>rBc{EA0cfyUG~lYiYv^w___b7VgBw!D4eFOg$v;V-USirE9111dMak`| zKzp4$@oyN1Jx?^^Vv+((z zb~cjSQuDXpSnKfg4>o_`q-!ZHUjl&bww)KVfCKc5HlbXDO;;)>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x OKm>>Y5g-EJpTIZkrqmJu literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/test.sym new file mode 100644 index 000000000..bb4fc461f --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/manual-only/sprite_priority/test.sym @@ -0,0 +1,193 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/manual-only/sprite_priority.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0180 data +00:0214 data_end diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    rmfW}YKx^EAg#IX^X~h; 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 U0hxeIKqep)kO{~H{yP%*4_)>1YybcN literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/test.sym new file mode 100644 index 000000000..fdf31f0d3 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/bits/unused_hwio-C/test.sym @@ -0,0 +1,535 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/misc/bits/unused_hwio-C.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c017 regs_save +00:c017 regs_save.f +00:c018 regs_save.a +00:c019 regs_save.c +00:c01a regs_save.b +00:c01b regs_save.e +00:c01c regs_save.d +00:c01d regs_save.l +00:c01e regs_save.h +00:c01f regs_flags +00:c020 regs_assert +00:c020 regs_assert.f +00:c021 regs_assert.a +00:c022 regs_assert.c +00:c023 regs_assert.b +00:c024 regs_assert.e +00:c025 regs_assert.d +00:c026 regs_assert.l +00:c027 regs_assert.h +00:c028 memdump_len +00:c029 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0161 _test_data_0 +00:0177 _finish_0 +00:0187 _test_data_1 +00:019d _finish_1 +00:01ad _test_data_2 +00:01c3 _finish_2 +00:01d3 _test_data_3 +00:01e9 _finish_3 +00:01f9 _test_data_4 +00:020f _finish_4 +00:021f _test_data_5 +00:0235 _finish_5 +00:0245 _test_data_6 +00:025b _finish_6 +00:026b _test_data_7 +00:0281 _finish_7 +00:0291 _test_data_8 +00:02a7 _finish_8 +00:02b7 _test_data_9 +00:02cd _finish_9 +00:02dd _test_data_10 +00:02f3 _finish_10 +00:0303 _test_data_11 +00:0319 _finish_11 +00:0329 _test_data_12 +00:033f _finish_12 +00:034f _test_data_13 +00:0365 _finish_13 +00:0375 _test_data_14 +00:038b _finish_14 +00:039b _test_data_15 +00:03b1 _finish_15 +00:03c1 _test_data_16 +00:03d7 _finish_16 +00:03e7 _test_data_17 +00:03fd _finish_17 +00:040d _test_data_18 +00:0423 _finish_18 +00:0433 _test_data_19 +00:0449 _finish_19 +00:0459 _test_data_20 +00:046f _finish_20 +00:047f _test_data_21 +00:0495 _finish_21 +00:04a5 _test_data_22 +00:04bb _finish_22 +00:04cb _test_data_23 +00:04e1 _finish_23 +00:04f1 _test_data_24 +00:0507 _finish_24 +00:0517 _test_data_25 +00:052d _finish_25 +00:053d _test_data_26 +00:0553 _finish_26 +00:0563 _test_data_27 +00:0579 _finish_27 +00:0589 _test_data_28 +00:059f _finish_28 +00:05af _test_data_29 +00:05c5 _finish_29 +00:05d5 _test_data_30 +00:05eb _finish_30 +00:05fb _test_data_31 +00:0611 _finish_31 +00:0621 _test_data_32 +00:0637 _finish_32 +00:0647 _test_data_33 +00:065d _finish_33 +00:066d _test_data_34 +00:0683 _finish_34 +00:0693 _test_data_35 +00:06a9 _finish_35 +00:06b9 _test_data_36 +00:06cf _finish_36 +00:06df _test_data_37 +00:06f5 _finish_37 +00:0705 _test_data_38 +00:071b _finish_38 +00:072b _test_data_39 +00:0741 _finish_39 +00:0751 _test_data_40 +00:0767 _finish_40 +00:0777 _test_data_41 +00:078d _finish_41 +00:079d _test_data_42 +00:07b3 _finish_42 +00:07c3 _test_data_43 +00:07d9 _finish_43 +00:07e9 _test_data_44 +00:07ff _finish_44 +00:080f _test_data_45 +00:0825 _finish_45 +00:0835 _test_data_46 +00:084b _finish_46 +00:085b _test_data_47 +00:0871 _finish_47 +00:0881 _test_data_48 +00:0897 _finish_48 +00:08a7 _test_data_49 +00:08bd _finish_49 +00:08cd _test_data_50 +00:08e3 _finish_50 +00:08f3 _test_data_51 +00:0909 _finish_51 +00:0919 _test_data_52 +00:092f _finish_52 +00:093f _test_data_53 +00:0955 _finish_53 +00:0965 _test_data_54 +00:097b _finish_54 +00:098b _test_data_55 +00:09a1 _finish_55 +00:09b1 _test_data_56 +00:09c7 _finish_56 +00:09d7 _test_data_57 +00:09ed _finish_57 +00:09fd _test_data_58 +00:0a13 _finish_58 +00:0a23 _test_data_59 +00:0a39 _finish_59 +00:0a49 _test_data_60 +00:0a5f _finish_60 +00:0a6f _test_data_61 +00:0a85 _finish_61 +00:0a95 _test_data_62 +00:0aab _finish_62 +00:0abb _test_data_63 +00:0ad1 _finish_63 +00:0ae1 _test_data_64 +00:0af7 _finish_64 +00:0b07 _test_data_65 +00:0b1d _finish_65 +00:0b2d _test_data_66 +00:0b43 _finish_66 +00:0b53 _test_data_67 +00:0b69 _finish_67 +00:0b79 _test_data_68 +00:0b8f _finish_68 +00:0b9f _test_data_69 +00:0bb5 _finish_69 +00:0bc5 _test_data_70 +00:0bdb _finish_70 +00:0beb _test_data_71 +00:0c01 _finish_71 +00:0c11 _test_data_72 +00:0c27 _finish_72 +00:0c37 _test_data_73 +00:0c4d _finish_73 +00:0c5d _test_data_74 +00:0c73 _finish_74 +00:0c83 _test_data_75 +00:0c99 _finish_75 +00:0ca9 _test_data_76 +00:0cbf _finish_76 +00:0ccf _test_data_77 +00:0ce5 _finish_77 +00:0cf5 _test_data_78 +00:0d0b _finish_78 +00:0d1b _test_data_79 +00:0d31 _finish_79 +00:0d41 _test_data_80 +00:0d57 _finish_80 +00:0d67 _test_data_81 +00:0d7d _finish_81 +00:0d8d _test_data_82 +00:0da3 _finish_82 +00:0db3 _test_data_83 +00:0dc9 _finish_83 +00:0dd9 _test_data_84 +00:0def _finish_84 +00:0dff _test_data_85 +00:0e15 _finish_85 +00:0e25 _test_data_86 +00:0e3b _finish_86 +00:0e4b _test_data_87 +00:0e61 _finish_87 +00:0e71 _test_data_88 +00:0e87 _finish_88 +00:0e97 _test_data_89 +00:0ead _finish_89 +00:0ebd _test_data_90 +00:0ed3 _finish_90 +00:0ee3 _test_data_91 +00:0ef9 _finish_91 +00:0f09 _test_data_92 +00:0f1f _finish_92 +00:0f2f _test_data_93 +00:0f45 _finish_93 +00:0f55 _test_data_94 +00:0f6b _finish_94 +00:0f7b _test_data_95 +00:0f91 _finish_95 +00:0fa1 _test_data_96 +00:0fb7 _finish_96 +00:0fc7 _test_data_97 +00:0fdd _finish_97 +00:0fed _test_data_98 +00:1003 _finish_98 +00:1013 _test_data_99 +00:1029 _finish_99 +00:1039 _test_data_100 +00:104f _finish_100 +00:105f _test_data_101 +00:1075 _finish_101 +00:1085 _test_data_102 +00:109b _finish_102 +00:10ab _test_data_103 +00:10c1 _finish_103 +00:10d1 _test_data_104 +00:10e7 _finish_104 +00:10f7 _test_data_105 +00:110d _finish_105 +00:111d _test_data_106 +00:1133 _finish_106 +00:1143 _test_data_107 +00:1159 _finish_107 +00:1169 _test_data_108 +00:117f _finish_108 +00:118f _test_data_109 +00:11a5 _finish_109 +00:11b5 _test_data_110 +00:11cb _finish_110 +00:11db _test_data_111 +00:11f1 _finish_111 +00:1201 _test_data_112 +00:1217 _finish_112 +00:1227 _test_data_113 +00:123d _finish_113 +00:124d _test_data_114 +00:1263 _finish_114 +00:1273 _test_data_115 +00:1289 _finish_115 +00:1299 _test_data_116 +00:12af _finish_116 +00:12bf _test_data_117 +00:12d5 _finish_117 +00:12e5 _test_data_118 +00:12fb _finish_118 +00:130b _test_data_119 +00:1321 _finish_119 +00:1331 _test_data_120 +00:1347 _finish_120 +00:1357 _test_data_121 +00:136d _finish_121 +00:137d _test_data_122 +00:1393 _finish_122 +00:13a3 _test_data_123 +00:13b9 _finish_123 +00:13c9 _test_data_124 +00:13df _finish_124 +00:13ef _test_data_125 +00:1405 _finish_125 +00:1415 _test_data_126 +00:142b _finish_126 +00:143b _test_data_127 +00:1451 _finish_127 +00:1461 _test_data_128 +00:1477 _finish_128 +00:1487 _test_data_129 +00:149d _finish_129 +00:14ad _test_data_130 +00:14c3 _finish_130 +00:14d3 _test_data_131 +00:14e9 _finish_131 +00:14f9 _test_data_132 +00:150f _finish_132 +00:151f _test_data_133 +00:1535 _finish_133 +00:1545 _test_data_134 +00:155b _finish_134 +00:156b _test_data_135 +00:1581 _finish_135 +00:1591 _test_data_136 +00:15a7 _finish_136 +00:15b7 _test_data_137 +00:15cd _finish_137 +00:15dd _test_data_138 +00:15f3 _finish_138 +00:1603 _test_data_139 +00:1619 _finish_139 +00:1629 _test_data_140 +00:163f _finish_140 +00:164f _test_data_141 +00:1665 _finish_141 +00:1675 _test_data_142 +00:168b _finish_142 +00:169b _test_data_143 +00:16b1 _finish_143 +00:16c1 _test_data_144 +00:16d7 _finish_144 +00:16e7 _test_data_145 +00:16fd _finish_145 +00:170d _test_data_146 +00:1723 _finish_146 +00:1733 _test_data_147 +00:1749 _finish_147 +00:1759 _test_data_148 +00:176f _finish_148 +00:177f _test_data_149 +00:1795 _finish_149 +00:17a5 _test_data_150 +00:17bb _finish_150 +00:17cb _test_data_151 +00:17e1 _finish_151 +00:17f1 _test_data_152 +00:1807 _finish_152 +00:1817 _test_data_153 +00:182d _finish_153 +00:1841 _wait_ly_4 +00:1847 _wait_ly_5 +00:185d _print_results_halt_1 +00:1860 _test_ok_cb_0 +00:1868 _print_sl_data55 +00:1870 _print_sl_out55 +00:1873 run_testcase +00:189e _wait_ly_6 +00:18a4 _wait_ly_7 +00:18ba _print_results_halt_2 +00:18bd test_failure_cb +00:18c5 _print_sl_data56 +00:18d1 _print_sl_out56 +00:18df _print_sl_data57 +00:18e3 _print_sl_out57 +00:18f1 _print_sl_data58 +00:1901 _print_sl_out58 +00:190f _print_sl_data59 +00:191c _print_sl_out59 +00:192d _print_sl_data60 +00:193a _print_sl_out60 +00:194b _print_sl_data61 +00:1958 _print_sl_out61 +00:195e fetch_test_data +00:1978 print_got +00:198a _print_zero +00:198e _print_one +00:1990 _print_bit +00:1999 _skip +00:199a _next +00:c000 test_addr +00:c002 test_got +00:c003 test_reg +00:c004 test_mask +00:c005 test_str_write +00:c00e test_str_expect diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    AH00 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 Af&c&j literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0001.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..80da05aed24ee160599434f45ae5ccac50b65395 GIT binary patch literal 16909 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 BQvm<~ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0002.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..ce543d08689b23b8ecd309824e7a6d0eed463582 GIT binary patch literal 16883 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0003.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0003.png new file mode 100644 index 0000000000000000000000000000000000000000..09b67566268d744f2179e51fce78f412b6af61e2 GIT binary patch literal 16442 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 N$*Id$OMm|U{{XG7NDBY} literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0004.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0004.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae596fa2ad006759dfc2d7b26807675399ef53e GIT binary patch literal 14925 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 LNkvXXu0mjf5^wei literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0005.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0005.png new file mode 100644 index 0000000000000000000000000000000000000000..48ebe894c2a240379f6592bb8f88194d63e8728b GIT binary patch literal 13461 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0007.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0007.png new file mode 100644 index 0000000000000000000000000000000000000000..5c567dd8e6dabf4a6ca436b7f26980bec9be0207 GIT binary patch literal 11371 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0008.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0008.png new file mode 100644 index 0000000000000000000000000000000000000000..19e1814038edb6062d385acc0f984c9e7e36ad5a GIT binary patch literal 10690 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 KMNUMnLSTZu8#FHf literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0010.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0010.png new file mode 100644 index 0000000000000000000000000000000000000000..51fed1cc5742477bbb12bd757d33bd4505d3844d GIT binary patch literal 9721 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0013.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0013.png new file mode 100644 index 0000000000000000000000000000000000000000..311173c90f489be5a993cd182631913c53c98e17 GIT binary patch literal 4424 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 R&woe&`Z`A1KOfme{0D6U*UJC^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0014.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0014.png new file mode 100644 index 0000000000000000000000000000000000000000..af9d6978ccccc6c65508be501ba4928f6848fb0d GIT binary patch literal 4113 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 YX4Y-f!XA-M=U;t*KFmbB2J$%ezW|p6wg3PC literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0015.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0015.png new file mode 100644 index 0000000000000000000000000000000000000000..567d5aa0d4b8508cebe81ea7dc442baa05450779 GIT binary patch literal 2612 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 G{QW;x;sGE4 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0016.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0016.png new file mode 100644 index 0000000000000000000000000000000000000000..323eda5410ab903bdf41de13c3d897500503340c GIT binary patch literal 1658 zcmb_c`&SYM8|EXYtjzS}g}gD*FRZ*oFxkPpqiG*Wnbpj2pBho(C5@@`6SWxwW5Fh+ zP7_4SyB3LoFlpr_Cr&^&X^5KQ1!szymU#W#|FHL*=XuY0e|Vnfoadak;B5G*{d;Zq z0sw&hVWF6a-MzSr3J`FY+uPDl0071TVVHo(%!l(MO&PObgd4Jm zIW&+S?sL1P3jcb8_FI|-KYc+6p}Mz7`Gh)8ji^A&;{Hko3G5}JYw9D~t3To}SL2mu zu!*vPPCl4V`03vTjd#fd~9idv6wY<8Xs-G^R5&Ruf|)|(pYOFe%C**80k72t)>2hBnkyBZ4^nZjpHsP>=X5wL z&b0OPE|RYfw&IwnN?8vLg^YCeJ?6VSi(&WKXo zXU{HzRxT?4*qRga8m;w6Nh|Xk3Z^Xy+r1JzZG;AA>F|Zf_wvn)t6!|LQd71rBpAN2 zW5?_{1xO6fIt4dOX2`dFXOpzgZtNh-*sm(4GP%vDxhem7IP&Ficg8zzh^khh&)o9T zD1Dx=W(N5j=XI@t+=sgO>NADDVg3iN!(aP^uv1&(W9{54r{1vs(?lvJX3;Xuj&bA3Ml(!*eXNV$cF}kp@irc`k`os@rirSejh02f z*s!G}uKg(atAHRmzSiA4Dh+{rUjA`ev+0cQ2c>{koa*bLRWk+Ld|GY&(YuwN%QR_w z181d+c^~CD^M$dM_!IRV%(=-zd`psjle2=hcx(y3O1|WC;lg7WBXVL8s-TIAiSww1 zde|in)ghFax0AQ038hGAzc;j}CkwoJ4AM^!4_y;i>1+T9dWf8B3X^6UpH&Cy>g6$xYKN*OJ9>W zh7JffzDvq3auNqsL|1%lLLB~D=(2jSQ41^6P@NR>i+a2E)Xm6)668b6=Rpua&5+*C z9jXaOnF2>_DQR8LH$rZCj~o|09XLS=Szf19?dB1m$ hL#9wh5QmQ7Jj0>&42&}$zmo@9>gnp|vd$@?2>|nm7exR7 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/test.mvl b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/test.mvl new file mode 100644 index 0000000000000000000000000000000000000000..6e42cf4f887c39c22bad84b213c42aeeedef3953 GIT binary patch literal 126469 zcmV)OK(@baR!jf^0000000001000010002?iU9xs000010001Z+U$J`U=-!O@9dzJ zqP5H>Qkx*KyKriK^sqb2L!d32osHHWaqTg%?xe`Yt?gdkdb&$;*3+5C5A z=X-zO|M!1<-!~JMVH_JTd?NYVFa7D&iJ#W$ul&b58XBAbVcGiTe+V!*9H5IYVkR)f zW63mT!sIGuLhAepEW_9|6XExKjhQgrj&j!ajm(6-4(pozF23kKA~JsmT8DUR9L#$@ z%JMwrcoAVUd1fN>f8e0Hf0kiplzuOs>|o{w8Ro5Lgst>jIeTm0;5;IMHn#CU3VHL*-~X?F`;R}JWY0cl;-qsYO`Lenhd%V7kz_+d6yskJ!7<_N4^iOR zI8M!eCTI$1#*Et>LlaJ4jnKy!=2vh3>TQ3aP*{oqnl@piK2$%ujU%1@ZtktSeFBR- z&Z6sI&Dv8x;|hk|Ui|&}8Cw04&ob-}iofr`@6Kt=#G9|M`OCFoZ~b2~My0VB?_kHd zch-#Uzpi1JH?|*o^fl&h{8$VI|1d)%^x<6(a?+eht>?$4bWi)^-&Ozp&GYX4?7v*eFn^j- zJ$=!o^lRHS`<6#Pr+#kex=$_r_N|qx>QZ(>A&B&aN|Ns%`l_G z>n4@QV3_0X(fL<=C{h*!`G4-HvpmM3vnxI{k_Y9Vbe6|>=&`BZLE)tm z5#tj#&wKo=a~+4y-Y`i%Kk58a6@`~l{AtQm&!_*Mt|&Iuj@tK%cXazou}k%5m{JP6 zN5+Q#cK+!0pZmEle=cqH@4SCJx$)+CuUyxA`L&-iefℑqNc{-X&k*cYCLNhGFjg z>?7_&kcz);ENuMer4wCK0vCL`;tJ=S3qw_(tG;gO)mzt2cNIJn?|nrmY`ovgFz3(s z$kcN$oK!h^rt{*8%dY<9KQEom6eckD*f!2FM`6M%6P~~5m5t0j*)JYj(C;{(d41~I z&lffpn5^R*Wi&{tZ)Zn0mwX8(z8L^&89^-n!xK8wxk<|Kjss?E7N>7vExzeR2Pd&)?X0WB-lW z8;{+%>88y$J$Tc@H*LM?(VJem>Ghk;o8G$V?VAcWF>B6QbN-qsYo@N5zUGxRudgxJ zytU@-HH9_%?|lBwzB~Kx%-(tI&i!{ie^=jK{dZ;WI(FBlwVT&Ixc1?-Th~6i_La4- zuQk`cwf60`g|)9R=iGDtJyY(Pde8KGUb*M>d(3;@y65eC3is^4_xXGK?(M%fd+)J( z_kZpAul0Sc|7+Q=9sAm*jhi<^pDnJS+8;{cK@l_r}76}Yn)%-1sf1GIpB7(eom&=HTIbsrPqxl07oTUH!;2?c z=i0@jRBLAZeA8JUVVIk5`z6C5!u}6FAACOe{6F_O(_zxV^X6v?{I5S#2>$vryzuMK z1pU9Jd&7q$nGY7E-#%E_@Y@Ha*55w3Ve@b4-teL8W?w-c>ML9})Tg_L`YwBBi0+-5 zK8E!2Zy$_Bhtr>_ei9BDhl)ch9&}CjDC}Le&oInfB$Cg)H2O^Uh2jyx(TYR8TUDj? zZIZCQO(>_x`Wx+V98_*8-AJ4pBf|RDR$;xW3gf146Ixr_1oiGVK^hY_D*v(NkFDQn z%O9U+qrY}@99OODdUcBDs~4?ptzOh5f+C<0^(TTk1nWEwDnrCUUrQ0?}V?iJaP!ym^?25~k`E>b`Ua9+XdCE_?Q=jH8dBER7G zbLc-lfG@8gaDH3|g;58`2}lztruXAIh-<+jME474I4X&Pqe%$b_pNgPHSksjEB%3> z5cH3eJ|I+9pb`OZu#)$Vy0+q@?v>O^FOM^|BY--iW!|7wJ1$U($_9cQYV5C|_=t?= zSE4CM&kIO{vZ?Wb%E}5JF@tDpu#&3`pfmW&V&7Ey?fQ<}KvbQ=huaqrh8t*|0%JO% z7{8QXAb>Vf=cCTlh5*{&_m}lWX?#$1KiWyxr|Wr67%t+JC>Tq@&j*Efb5K5hD{8Uv zW%Vx4-|Bn50R_~IG@ z!e1)16cDg^5N$#@1Oz~79bBc~>km>}QC}27_^hO4f#TTUo43cwZ;cO{!p#-|(Vy}9-yXly^dH+`y zl~rI=`DHS3Ect~|<1=3U%fl}@4*Ca!gik4bWeJC6 zyl#)r=&o*WoSPkOL?Y)TCsTfTpk z{1}~{AC>_n{-`Xft+C@*X22BnT$vmwZ!)%hQzS6)f2nu(B%x=z0DWobzWm%KfqN z{Nr+eXZ-LHe{8()GvW75^UcC^bNY0mLScGgIyZg#G3nSbq9f9gBL%qU+?)8CZkmN@ zxPFzU3r3EU1?0f}{v?8bU%>TrTpyE8{P{%Tp$8O$zeoNjUo}r6)|;GZ9zni^f`sG`NM(Fg3H}H`zd%q~Age6rFIZ6! ze*_%(9?;I@aq+}oBLXA?)?W%essN8n`GQ2dDh zTpA#FrRe|4Af!W3u!sQc=gZ_1SINV62-+XPN>C<$Nlh2ATymF!!S_FY=1GJVUOkES z4HFHYRCoxfE&eu%r(ea;(KToDH}0eNF+O&3t9ynC-BU{bzQ?bCLV>y8gTK)8Z~h)= zv+GBNNDq|P@1zwKeS!KR*^whw{gC&Y$othIS>+U@i;ZIsTr3@tE-tgL110w~Kr);R z9=^hLPn19dn4 zYz&Vt_xmDap?)W)S^VWDLa@8c?hBOWok%*O_bW$DRs~=|c*l{SWeOyKjQnE^fWMM_ zJUK=_{<$O{NBDR8NwdH~LcTd&viR3HVw|3TCGamw2R=T~UmxhN5A@du`s)Mz^@0BS ze^7tHkF6}uuhLXHuF*WSrZ~OfAD*Q~`@o*iES2a0S^?p`d?n2Y2zGpqTz=#g9GRgk z_pgi7VM1xzX4w5Fx4e?3Q>}HdO2|Ldp*(%SBCZm63EHz3L2Ev=GJy1aS@&0>dI4+g z3BCK6xXBeL{{MLS4t%`KY{om8&fdu-;?OPp z1b)JQ)^2sqf!?m5-7*sx9>vmmHvgZuTOQ4IICuw#wtLY7=nk)!;b+hOPisFj*)iMU zsF;9a8H-S(+00+u0~>$$!RLd|f8B?9l6g|73Dwlp1Zzgl6~X;WKN{={{ydnh3GlUR zLu)Un|7P%?g8eI>+nw3{$C`D)k6wBHl|+=jp{B8BWlep}$e9nmvh?q-G=pyjZws#A z#kGxV=hXjT*$BOgkCR?XQpY|Vt4k@GKVev0xb|GwaT!BUy)g6oIN zEzzbI?|X4(&8!-Cji+Yh{I4~yEO+_24&xGzxT1)_g8V^00q()G*MEgPYDu-&T5>BgV(x5wbuOZR@SyS_R2 zk3pM0Z+$0&T9E28{`j9=^K9^E#W8qh>Ax-e0#bcG_=O;yDVHx;zlbRPsqLRt^PAvn z7z4ZghnG=_l&(~V5u)^^aUR_d&f)R5%l|^L=H+#<%OByU@_z7@aoN~%N9sc912v0l zs2qwp!rRvM7e4w0x_e-0spKz|wY`MD#WgEx7uS@^veV-Hg<^il*6L-3iULJ@1k|5TQZ{VDw6yHLNIz7Xs#-Y;+ezunci)|N59 zTG~*=8u35X!LHBT`hUCY$X&#TrTe9NbvhJ>>PR@c96KFPIR3liNyje7j~%-mdmK+W zo_74ivDeY^SNeaAX~ZBj-5gc*XIm<5!MfJKTpnhkoOD z%`xbB-SJz;|8%_JIPMs7yXzjypE$GTcQa4@WcrM9!|1okZUZ1zL!IqXFC!|WvXT=qQnBkcL?N7>0N$2!>xwvxSoox*;M zy^#GlTg6thQ`w8yY3y_>{S4N{x>*l9lbyx>9s3FPV)m2lCG4f_W$fkbr`W$|XR}_` z$MUS7ox{#$=dttIE7%3>LUs}RX)FC_*w3{aaN*sIxV*lXGA z*w3?HV3)AhvrE}!Y?zI(b?kEX2KI~WjqFWU`kUEX*jw3uU~gkruq)Ymwt;PAMYf6k z68mNLc6Jqe2fLbWX8)00!`{i>#ja)7vFq6uww2w$e#J_EH~Urg9`;`LYwSjL6MG-~ zb@m(VH`#w;zr}85B{s^ov0K>t*$3DM*@xI~v)^IA%YKjjXZF9b53`S0>0_+S#@Tju zE4z*TKKm%Uo$X*BV|TDWV1LN|h<%*xWEECr6Kof|lYN5y@9dN8F80UlZgvm*l$HKz z_9yIKwwq0|8k=H!*nRB3u>0Acvd^#w*k{?FvCpy3voEj**THJXV}H)R$R1+< z2m1>vJ;O5g`8|F%9lGz(*AIQ;&|jK<`=O3Qj~&|a7pLEU=%q$dbP_{gNfuFS%^V6syP%q zRDOTF^lO&fxrAuul3By`a4+#Jx$V%3Ln{x}AENu?rM2QB{UwVpU3}K!vlo}@amkWP zm(XswwnkC**>8Zb{eiY}O`oDxRs!OR4s9gF@ zbf)nuVXV|QrG6>Z@4bwF?~=3?|ElXhcfBQlVE2Fh#c#a$ZqvW9JIKvU5N6!UOjM&eFi;egS zTTh3Jk#M6}H%s7yL7wMDqB=h>ilJJ>4Mh-!I3hi|9u$NyFW8S8(gO>%_!0%g#f9~p zIZ-$q5rhyua~>|Hp~r*52CnnD)uLe-Aak{$=Wodx*$A$$!@V5JH-h{xaw7kRDgG!A zGV+n5h7ozgG$MI3XQjVR2%Ap`f|rYd&v2h2W=NGtETayj8yShjH0Z+N7keYe_wkOloO8ol=uY)q1;u8jnha=!rr> z*Y%W^&=90*>4YLD6N;wBWu@?tEEft7#bO7uMl78(y0h7In(9lHMm>!o)5vDBsl4^} z12Y%2_l@x$^uNc)yFD&<2d{RtY1%cyLQN1nh(KXZAMbpuLy4+U+F@BJ2!{=Hp<&S2 zQNk)W=TqX*PTE66{Big?;jnP{I)kUDeR((U=G?r>`S{pT-H>FSXa2^Icfe05+*l`+ z;U_58xdoAS0r74(?|04=X1XFJEYMyjKfXL3pT{ZqW`_Mi!ijK!n{(05B&4z)w{!bE zHBOh?9S#Y=ln_aS2NGb4Ua$pNCDWbH>wB|$wo^B`0hwAw|@iiGQc;c%!SDAZYdmw0|zEyYFCYm4zBb%gbXP^1AZ^$WpJX^&ko z9^%wl@xsVc2-B5SJ`mgwKGe+yA#2p;jXZ#y&*k#DTad4TNVh}`$b<;!mPP>JIsW0jmaNIQ0z-}+nQ~AhPI2;KJnOnk*8U4CQb~WUMAzp_9 z038w{C@F8fNhC*a6Um$Xx#oU-5VA<8JBWl>c?vVFXw8FWvrh6VZ=@1x8xS5}TcmbiC=QB({s1CSohTz`3a68p*gU zD{(m{%W`L2mG`P@Qc;r{BuA<|JWlW8K)8l*UX4qh_#X=H$E1R@;|~Q@K2eBECkir3 zicKLr~)YV3`o@ys*3g{P>iN1nnrK=Kq0CUS5yr*|JLyz ziST^*?|8T13UV{uLHEoW&r)}dC+rl0%bdc@r5?B7ch?BK%kS}UZa3%Q=q($QlP%NosKYH0HiDSAMx zMXZBTr%w^gLd4S9wS?Q2Cb6}(wW&pH5v}*fAd)2)gt@`+m5@|n==#=HqE?}`rL{?H zYF#ekOMqYuhs8Rfwo&B64G@D3Bmx^6p{<%~c_DL6B$UtHfl6gsOtWuQF5h#zVRYS& z`aVHeL-~d%_8TothS~bdydgfPXT^+}5g{X}nFh+w-vZtLgup}p^Eu;gXtSM&{ls!0 zyA?Gv!Y_qh5{!`Xi~Nuw7<%q7scyqQpy!P)M9d6A-rPQDS~oJ{VAkv!G|cC^P=!87 zhv)Lf;87#rWth!ICjX;+J~v>RI?`cOI@}zm3OpD0dz|0l+>fao_n7K(aw_kx>Nqjl z+_IiqIPp+SJ^}rHLQ>RGfxsngX_w{b2|)OS3M=8`DB$BRj{79%;xBQLa_1|07gcbb z`HrfXQ*{|mSHkUdK_z?QoG|mdZk|g(NvnJX7l-QjZX6}HfymY%8H6H+Wsqc5PU^Jf zPeB36MHv(;(nH;s8b-If+I0!&Qn%Ax-Q)DA)tp@5l(Ou2~z|Q zQMitGhQv8eXlS>H7FFi=^aYGK^;5e6yD;`d#v$;RB8s=&)-)!lxekdn{G@96F~P`NKw^aoEV{ zhx0=@2rh%lr!V7{TOu%XLeT%P0Sx#C`CACTDBnQ&zkwvmg+sZF@Eh2(zk%L2GC2V< zj>^9sLvg+G*Q{ zqhxnTMWSaZKynfLF)}%dzX|`6!ab8xT)wp8^SV`!%cWk%aj#D0xZXa_`AOa7{9DJr zAj}F0w(m7Aes~vzChT<&=W`33uL2gllOE41;V0ncoKW|W45a-zC&mnNf^!NN!0rcr zAQUXUk1^&b3}%22(lg1O3&)Lk;!DuJ{{pngm)uc zL3kYD35071R}e0Dr;TiPI-lDMWwtkKfHKD30mys}l-7*|Fs4CLXb>4HC=Qb0hRd*> z6|x@$As-R?&4_r58HwETT4TtFgp7fn!?~WGuo-W^6rHfs#|z)T_)`A+lIDX|TqEx_ zu95dXpveQ#y^5g^b!YTE{99AW4&-G`zeVotO(~hKRByHoR;F$!YC5kZwUm<8;&SiK zn5?#S%Wcw8MU}ET2?;%I4CQ)sGR}?CI|<2ufM=XZX<9x*G7z_H8=nk(I|jaz*-X(t z*Ys;p*Bc>gRLC><=Muev5Cxtyz7>-d2}ZaS?Q9!qf8L~54x;^L zvHd%LW2)_!!`Rv9_z}Z+L^2GdH==v<1Jd3Ht@KqK*P(LmHh?|uc6G#6{Dl1J;8b^< zbGc>0`a>s%^*>z_LG?d`u$XFzfsx0NWNH_=57x{4>~|3k2h%GV?f3k}tzgJ4@>^n* z7mONuU!#m}Q((U+mJb3?;gfD>m3nyxh~ti5?sOk_3!bAj9`_|d$S26Cv;lrq<=%uW zr)9ZY)8a{*{-ESiXPYGHT0+tiaXH2^s;#G~DC zj5={Y+NOX{H27dzo79z12eu`8(_51-XWEn9xrExSCKF0Lp~Fuyx|E|vs#i68k_ost zrJ~A6`Bb<^$m{9Oq!rAMxR59cRCT(V9P-V=3XF0HcB4su)@33k#xWS>$x{XN~kV zR|x0Lp{`6CSkD@e0Z@8I9!Tm-nfp-pw4owgMR*+H1Z5TBiL!8QZ`#NM_qlFhzgsuW zZY^s<9vFL5xUU;Vk_Zk(8rm@pz@&klEC{+2_HoAOiO90n4sggX_w121Bm9(Rh;^FW zAcnpR$9|^T9=#YNb#XK*E!`qr5^0xe8syHUg4|gnv|kdgRdw)Oo1{q63#q82X4SUN zqurV$ckB9AP0tP`G1vo%wpedwOHAo%izU0Hn4(EZC4IRsna&Qu$L-B^^}--e8D#2^ z@sqRUfI&Dnbk#_kxn8Jj+)Gitp|C{`hIy z-_tsr{wF=r-g}LmNeopo4HKvbLfk<5BS?P)=`&lTqeeSqfZSr>b zxt)M5r$$xS9b|vNZ0I-d1a^xjU+=+$u-&id9gB zyDoKducD&IKjls1Ku9th%ok~jE2}P1>SF_oz+8dg# zX^DZ1wl!(!GOV?@feiGDvW9$DQL-{zKeR;wrCVDcA>kAqXqQpHEiu@+ zfMPhp1J~r9Q-2At(P`StZ^;F}5b*%fbKu021@GhiZl6CWxDh(j=L-|)BXjs*FboTy zCkvmS>2?Qs!Oi=57f(Lfm{~S!W5122vleb`OL$a-a%>9FA zZi~^cwwvHOGnY)|^64Ig_aMt2z)BtL(~`z>iIka1_n0|-Th27vA%=26;WsA#tg(;B zZ~yUqF(J97yEYyh_<<@LH-KjzfEbhJha=M7U__HH4i8Au(rvNmH4q#(0BZ_ql{k7; zvBWAy7fK{b0v5ar-tUDHO5)bXp))cJB;a;fnc4-K@eCmxq~$5nZ^s>Ba~i3ClR zLwmG%j6&ih9OL?{6TUZj)4{o%DZ{ z)B-6(h&fpV<~PUi)d~KPz1|V%(c+&uBl1=}505eO8t8r2l)M|0URD(q7nN(h&pcjqk^zX{0}*TwW9DzPv%~ zzP3SB7V)B-<|8%*Bg(>tIy>AQ?!L?|NK;*cbdcj^qRX7Ta#;=Or&N&VyF{Wo|2Ft) z8G!s}aOa)_+Ch<&Kokz|g#Ot^<{W4b*!x*<^$$`;LeYB^=w~^Gj*4aCM9~<8xs*Ux z4dryL*H8xzcBwrFyLwYe=+w?+A`WQLu+xY@O%uGKR59XR0Js(+@SfU%+ zHi^64QY_v{3_=1}CUyZyQ8^}oAv#G8s8T2HbrKuN7@uw3YG#|P9^DEQx67$SLOGby zy5o8(o{+UT5~;})>e3sH#k=DeR|S$N7T=2&DBuF{N3njbxY3HbJR;jhj$EuCjPRK* z5KQ%md#2A1E1u@@JTza&c`dyAYW%^Frv`$+?ePHI6~KKZ0xBUAD{7oBz6LmVRk&!; z#)s5Cm(L>J<#YNXHGWqFo`XQ-6IO&kVHe*JCeh&Lg`=s}&C1bS4mP<7EteaDnp@r6 zZ>;Wz{|_y9G&R`#Mvs_#xz8{U4&`&*@MjN-{l?LpksHVjnuEFQ6NWkTedxmP51M`V z1LtkXX4~Lu^9lIHeeim>8U6Wvc_Xh4W?)O3P*;j2DuZEe&;FTO(*S4Ydc|H9{}0JFji1?Yyo*ls>&IA}v}LiC*i8bYCV2+T|`< z$NdqyDFf;X*M&1eIFtiYHusx8UtQs z*vPWp9tGynFGYWWaNKR^MmH*}^rllvZ$gVfpjxt1(X?2%uF*<@2IB^O8;g@(my$5G zRf)8(hWucU$6)^}u>W6x{r>{;KZp#JGW)+1_WwcH{|Afqzfx}hr?a=fcFo-i_x34^ zOcVC+t;)?WrDQ{Cmr)-X#$}g+9`B`fG;3XnENOURStE;ae+0A{MEXLB62q3&&+UZa z&v9N?1srtF>-6&;xaMw-{ByYHUKi)Cgy-(TnaE9EJP0m-!1Dj$-9za+tqB6Jhl{w} zkx0OvKMRxpA6`m}XQ!V(Goat|r2pa04u}A0E^8)JgLyTTS_Pl>s7XzM!A|}!P5T+v z+~1%GD><99CI#*ErrB>a4_Y(o)`GHOHq*)&tuEupTkBrpaQbFSZxqwNhV-|Xx8{sn zU&`cP%VbSj7`N6REE5}@sprWg?|Th|touy!R^5!e6wewvrQ!0Ma|Xl~oC+#GUn<`= z;%UL#?90GDp*Q^}%+)#B%yq@|WV@6vrlWgt*jy^V5I(I+Hcn% zLeA*ZBd8|LC$6R`#XLwK%H5JNGITGAtiNm;`@U?NJ?Mg4BSc1ibtGpt*S(Ag-N@*v zyxl)_M0Ab(_fY=eqYxOW?yzCJgz85!hSkCl+H@H1NY=oOOlpW2&ge@I^=Z11g1!ek zA{DwTmDW?~thMe>YZf~70gO7z7m2gVWy?a{i|R#Ci=x+yvK|J}d09kWy?{pp!e4cpeEV9ez|g4V=H(pMYwKh61!Sko3@E9Vg|pTgNP;F|1-jVI9#_? zsBPTIha0x>d_xyxLaI^VyP9hGZ63(L??G&T9U2kJl#nU8As*cT<9BhNFfMg#5M7E& zk~0P$T7m%p8Gu-lZ28w(G7XWOmg7nC{}bi@|2wQNg+y_=P`18Q%ZJ?pKX!c`TEJRx zhM<2(L$#Ww3dw|a4a|g~n$oU84Fz})*Cdnb z)p|k?zR&gl)cEWF`JNR0AB=ds`;_&6@K#FKj%!*fP5LTH^B2c^l3kFiJs<-L?sz7l zb{qEm#h^9+KiIq)p6>v7KMAC(SA^%gkugQG7KYcq`v+g`#~42_3y#v z^7Ze*W`KA|Y}V45Av1DI<|QN7H?sdFlE|AG&{2wD?C zXoQvoFBmopFR*&#^gd~yDUjy`MtCXZ5jbb~hhAg+-{4uE>v z7}@`07(+R0|4;HVKCGnO5vA81R+4T(Npe9s&GFqj$6tE6o9~5OP!|cJ0`^njjv_vE zzmF)aUG52iQGXZ;M}8I-!aoGa2=CDULJAm3fMwN|I$;NVg6~29?128+3Al9G6lsV4 zkxP?)kKyaPu_(E27vh#z`nWe+bs(R!3<2DSVXk4wH4ME%cE4mzpv4p;qpC)iqGnWZ zik!?O$gzj}2j-BpxT1>UOyFD;PPf0Le12VoJspX-orrQlX@AKW{R({>4y`EL-x6L) znV)`t%WkbVy&KZWpU@I}G%dYnx0VpJwB`r?@LL8yP zr4sIBJpU@ZkpwyiCW(}QqtO+Q$?$bL<8rinn*>kIO3AGCrSUP?*l}soZn$e)iSM<5s1NSzksR=Wq%5UVl zqAD5;cq*xkk~H#$^3m{Jo;N=wPAuD7cLTD$g!n$TcZ_Cl5P>MDdcoX7<1 zQ#GR}z;CHIY!c*~P!no8MK%geXVM-zd+~r)2XZhK4Qt(zYy{W}mh3Rh(Fbiw(xIz+ zVW_JrQLoWUMEYCLzH~4fiS)wC>ZN%+3h%|)3Nwr@oaHY@4r+QTlTK*^@bWeM;gV*j z(z*t}KTT7B*34WQ*E%@_`hfL?%M{v-+hiT+@34PUPicDafWGK-`!`WwD)_9fpKkxA ze(kfVYu{o2CLAk>r_3$ZatiFfmr`Z>Pe58S+m*>0){@I>FaV8P>C3eCpU|c%3{r74 zEjLin@txKaT2iA~dRggCXS3aqd^8umH%pW;_NHllO3xt7Na(bfl{GY)+y=#A49c*N zWZYNKRg0in)rEV~3$&{fq*IgBow!K#rc%9Nd;2x#eD9v!UFx1LRTI>t=0~I-(EnA^ z652vUP!}u^aO)Z*vupr}glnPG7J!M8&S1|$PS^^PyQc^$=zHCD{4+0zbDX*mal>_y zI)Qf;SdY`pLRYjio{&1_gbIo(GQ#yD+u%MWh-3>egmEdUCZW@m_)(MG zPAM8KI#@9rXPCbLKH5|@lSrtR?@Ml18=$O`$8AlQj?8~2m7DSAzg3uMNT-qf zfssejz?%OiAwIGughpCejTYxf0Cs!6gya|f(X5S1lP59K0vL2;9S4G=8T{x%6x)A< zoq#k6$%=yp)9g<>%tmW|hvs}J&nV@qbgKs3$)j;=eus>L(epbg2soHSa5CxNilrbK zFz_j;n_k>ZrZnT$$gSW^Ye^t)l=k{rivyPB5Lq9ItiN?V%$lzeY;*r~O;0XH(F0r`^A$>j~ArD3uP^^7?rD zx6+H!sYT1`gy3oRZ>8coT<273*ndG=Q^2Y1zhsQKl1QuRtUltu(AS86O^iWntqCxz zW~q(6w*L=4Abq*Fi2ZKe$am{my&L^$$%7Q#AIc?>Gf~=F1vcnxWZ{D5`yhu*7)V_h zct}c;Cl>y9!|F>d)E53=&u)4_pQb1E9cm)62LShLq~p`7|3E?&gsXSZ+i;8N7b3ld zf06?b48hd1eDQsPvz~gV_5VbhEPppD_j;i7g!^L1*DaT?|4Z%BSjJj)wQQsqt-#Wp zr*Ogj68ZmNbeX1{V>Bg>`<5vHnGuai(MlLr+W^IFv8cQcsOf{i$Zd(mjg%xAeHwh@ zzWeQYEz;Uh%uuFK##9tx$3o=r{5K2_i~|r%KY@4H?&b5})~Yb!IZmG3$ox0CDd;wu zWyc-bc1i~o6SeY(bl18O0cHwW4^}=gvj1q1kyA3Qqc|P*gDPvO1R=80P@E216u6Kz`iK^2}3AT7h4iKFH;S47aZO&Qv=8c((-WlPvWxOJ=D zs@!h1Nb6E$U>N>=t{a$E410S+0;HMnVe+>|{@bYjv4p1GKkzli_K#W=gYroKbgD)B zsy7K|DczM$B~|O+8;-KCQpNrMT59O5DoFLaYt+L9uoT%SbK?xMEeWL0Abt~ZGTpz|N7Tti2=fYODpaZ%v;OTi^J)g%G0k$qPo`Q zP2%!Kv1R>m`sL;6X+d!LdJyuM*SfxSR%>|qg>wQG64?$5VTY&TYWD^sjophP5oJ+0 zLh}>KB3~p8Fk~&WVzhh-0a1|EY%%Nk7SkkIu?1d6m!v8>90?6dH3!{o<`dC;E}xL?scgA4|E-Z;r-hp~ zT33-2Ynld7rV~Vn+MQ6M<@4XRFK12N$4Ro#yem>k)*>FnH!KcX%OfJZL&PUZ%&Qb` z^g!TPaDs|U>8jpkK~~l*TLLzSC5?b_APk07)LJA+LJ}f1oC}oQrpmntJP71>147U> zS{z1QdlHw5CU?gb*eEJ&oTQ@lYKh(i+={KqRJ($4?pD-9GEM&Pt*_-uxK|B2=gkyk zLIScuvvd>LBJooHw3Ye?^?*GDTh20p$S{g48tgGzCZIh6*8102`)btw{8Q|!M6$TQ z-dY$V`zmN$w~TM74bt;B^#2kKD3^wQKVQ>$9q$uf^0yEKf$;3TElmvo;Q;`U&x$Sl zv(L8ppY`8t!@jAhxS}r-bVvx$U!&L>5h;Bu;g@ocT@9$aS21PkBAcV3U@e;llh zgtG5o-&mXC+}3IvSH!&+l#>&_KFZa7w zzTum>QuWPrtBVAedad9h)tdt2L4PP|a1rr4d^$i1ztV8q!9`%FqzWuRMaDH%=}vah zsyH!pf^2Eu+|CsUzAPHky|k9RB?`N}Ef(Dk z=i@*kstS-Fp*@LcqS}Q`=T5eCAY(m&Oaqy9B z*AFr#+Kuw}LTtQ%^l4Nn8PCtaxBVW-gecX2KEkg+ zv(r(jJF}Dg9yGWI`e#h}?Zxs>)j#&O7|Uk-3(DV%@Po3oY}ZYz5s-C87doa3y|axT zacmy!hqay0t+>zg*AeVn9%AAOrt=C`Wrs zjpF*oDj56&@DH?{ZX{EK#_;-7`T9n#xV|wovc6%jkLdRLhzWyV*R44h%fF!IBpb6< zK}erL`V7+3_Sbk`?~=yMZ<~W=b3e_>Hs`=OnMAyNemigRM~+yAvR$pDGubo$|LQH$ zme>~9xhafQyJDHB7SRxN!irYZ_U=Sdk9VsHaFR-PBd{-9>xhy<7*BPpu|%vbhS80+ zL3(b1b4&yo8dZn#yeRTDTx6ILjTK$r3js*4vCH!lF*X$T8i@Wk+|q$(i;;)>>(dS)fY*z%YvO#;h!Az1!Gfr z;h;MxTvj6pQ-jvO$rb3C1UNduG3)Qf*!6c{SZbGIZ7KM7dOO)4QRy&bL?n^``DuDH zN*aUY4|tepFXTX4jVBFdz{tmvx)Dof^W9nU?eZqg8qs7@-rj?lAOHEi5&LJ{=l6;i zlpfw=+vDk{=tV-9a#N;IZg39DYez zkc}k|7@a(??>&&sEJQmNfz|b2z(dV|rw^wRRDOE6{Ok1Wbq5Q1T2^RzS%%m;f+{nNqzjgrSqZjBICt%0y z8nkvvnpx3={Uh4z9|+%xds~a)u#s}ANNccSe^)M->Df!zr#X&+oQ-)+AF||umb2u+ znbxQJ3Emj0)fk5XT5P3xysVfntxwUD*XW;2aePw6{i}-Emy-2&vA)y`6P{)mVSS661MjpB(d)uHn zJ7Y9cN3&kG2XB3%_WJ*pn5E%93GDmi&Zp*@H1ze&9Yv;7WpyFO^%Zavcvj$Yk7m@huRf7)caDbhOL zxM44*m_chdF&aHiDD~lfBMmjAouWSsongdW>Rc0j1tFCxy?=oAZ{D6O?cW?UQ%A+p z{!J4OUVhB}P1D}LNe^@qF7jOvXIlr&T)WY)CQJiV+`nm-_HQ=llFhV#vv2hN&5y0G zy>iO>y4njG>gp=%MRC?TQN+2))6mf5j;w8Js$IK63^iO|SKC-q*A((CZ)yx)*%aYJ zO`)K$+`qyXu50v#8`t~7>(+Zi>ly<>Lt`MctYKwnS@^C{5SII#>+9Cf3WORf19Kvk z*UxFZpk{8}1vW4<@Nq><@G}Nf~E7CLbac03E6E}A6b4u1E{_cZD?$qSuZxO6V|S1 z6sQgB(1!JaTD0TJx`^*ew51m9I5Ypu@G&#o%NREwp5YTBJ|W!5+hpzBt!?sGQXSwA z)h=Hj35jJ#1b^#iu3SrXSSLhQL_(2>IO?d2tgPkz4RxSK-XC5co--!BI4|UGteqJY z*MaEay0PisKRyVf$8${DG?;WQ!(=mqPlCBu+$9^zxWZebiDOmDxjeYI)qr@hct`Ge*gIs4fk z(*J`c{cp*zK}-K@=z#uII-l>m!+`9{qVRO_`GGDxJGj0y%wwcBKo6TkWH_g)i&B5&V&Eoz|Uu3Q5 zt7{Nz>KYoC)`f*-bwPhP3|Klk^A+Ku1#+tce1TrMzowYs$88Ro}56@X4 zMCPnK6FO*Ke>Uvh**q^Wv*~>&qyJk$$??$l=;nIHr^84-gs35GE z&3Ngp@Z!H@I9>YL#aFLbeo%&%S1g-#2u9-&{GnC4wG@)+G4#~1{vO%?);w5xe@zCy zT0WV1LlW zVLGLy=`}j|8%k-~9r$@1rZ26H_rN~1+do)rzb(YXtesPgr$Lv-+n%;<+qP}nwr%&c zrtR)&+qP}nw)x-rvf1p-Uhd6Fo~oqkO{J=mIyukp-G3d$Bn&G{C-=IPUb8 zxn?j3C=E$HI+GwyS@>`an>c^Rr?b0}v6}wY?%4G+Y z=AW;L4TJPwZmsFRCLO%0U!+NtZQ!21m{%7Yw_;ljP@HRbsoHRQ1Jo41dR*mVXsfkp zZrOUYz5P)DzH{T#h&##6`0WsfV04#`eLc7>&oH0`t2`d8nrU!n|50;eHXOD{Av&9E5zqfDD zkin16b=InHo4x)ZTZjYjbCvM*Qmko_kab`AzstsSpyadWyNu^j-MKvZ<^{XRVt|~d zS0HNM-#_7SBIOAfRM(#LaW9va0;FU4?3|n(-^AKMp;3Fgu zv1n0G2Sd(;xp&YxKi>7~bmEImyKl{tW&QV081pAtP6JafOOAYo6yEvbAO7twZ$**M zM^eJTcTw&f%%$djUF#GpONS%4w%PV&uFh|Xm}>|8((h?w{ZIrwbAbZidI6f3OZ9J= zPl3r#g{CWxd27HTl9qpmo;vk$nop=+CXuSOcz%O2{1Qa(VTGNg;%1RX`9oO0r7M50 z*u%qh5(lLLC&io7E%(xzX?lGWJAsd)O$6KxE|31LBA#Kq$1WZX*>~&J>&_Fpqu!6F z4ZT*I$0hJia<}^n`kqSv(d)+!bW@KzysdS z%=j#mE%}*!CntFB-U#M00})O-&}piqUR22y`0u+q&b0Xq_zge+u52$%mjL0w=q%O= ztOCLbPp5Jv>9YUNe$ES^H~!f!YNd5I;-`71m$iiJ2`~jyYI7+O^F$ASbl*APV-h5s z=>NKt#He7;B|_V#sU7IWtT=6{n*>doe!ZNWPQjD#u;uiv^n1OxFg1f)%VVLfxXX7mGorJeqe99J z(7s7gy`iRum#)02H0-1%)m$WEz3J>zy7W$_X4iQkE4Kxn-+Hax?6X+&p*H2WvzgKI z`+ch9vjVFmZpW{Leorg}qf|BO;5T@+3lH_swui@ERJ>Sw#jRB5$u0%os@k&CtZqAZ zr^t=^jena;MLdgg=~VtntZMixGFp6jY|U9NJ7|Y}X$ax1(Lh%gk|zSn zQ)dRY?x%UMCk2ZSIb9`pWVYA==kNM)qxsIj?toBV7NJ}uXCFlv6j~%mE)`OP#2MGF ztW$zm=5LAHJ6U1i)RVN`+mDvw0EuY>%@2*effU2|-&Jv+ZYxl7$8yH$A1x>W`V7Qw+PGB*myPvw;~@X|BC zp72zX!~>GbcgnRJ>!#XcGZh(>lA~m}E8O+;rrjcS9i`10I{d+r=|jC0x?Mg z9)tSd?IP87E)ZCzIE<$>+m-RF&qr(`qftPkGd*jt^J#ljO(X)M)mT57{6Pi~iCtszFuKfQs5opXr+R4f>i6{Vl#4 z2ynH)#%=`^kaTvp&XO8$?!>aZB+035wcUCer|GS*azVT5)&k=7m2z#Jj2CI;hUyOP zb*1LQBI}7@JesbGlWObaic@!2XWdfm=OQUJfewd--!LiXit&P98xj7RaWikGlSA2|aVJfw?Ih%@!6#y&a z{ZF>+G@!#qhDfI5ybs35BNfDuPLru*w1o(Y*-i%b_GV&suWJ{(SsHBOHKdcp%+=ZzNNad`1S znLQ^3#4Y*O-D~H5$UWYg{cd%5o%mTwB!}v>HS!2EcQCEA#_+Lg=MP@?cDjRX#UJ^d zep>Q}HCCLXNRNARBAd-; z&xg(1llR{H-CaArUdy%1$>e+hg)l%N^d}GM8(?$>keUPhr>T4Q6v1dl-Gh|7f@f){ z=J!m?P-@g>rMv9bPDc8WY7q3s1(*D0voI=#Yyrl7q_G=ctBuA24S8F1OGPNDm2Pl3 z6z{a<@{SbR4%O++LKg}Ry1MLztT)f!ZruFI+A?JIJD)E7nj*S#cj>6G9MBO#XuHlz zBeYlgjpfT~%srZ?C*8Q(wdNR^l(kdJj9Y~p?$>cKG?eE&dn4rqA23NZwj&{Djl|N~ zvFbk{UGF9(6+&5E5jbAGcgdaYRIpr1Z}&BN0zXa`!ZOm= zQn%PIj!*EQ9Itp9^Cx++o@m+J<%J^ZoLZ^9CU(lr*zzqSvCPQ%~n_s$CR z?4Du(2m<`fF3VeP$WzvrTpd*w2celBJXg!cP8p}tjJjJmat6mHbujN`;!eNVXh177 zh+@20Eb093PF%WjSO22lU7md^3$C+_FMfp>-3ZQFN!P#91$Wp*hF1$5D?t{j`PECeG<)acn+AG)S<)a{N_j z)8TmYEMGp|?RrP)Sy}m&r`Z@zH4J&uO9FasaPPQl1gMVkk8~&|u872Ts z^K;_x;_r$Cz7l?7iWGGnr}^9}>TK3z%_`h0Q~u5e6GiL331@2u=h9%KQ06JW#UR8` zns$&AxDqM_7|iInM-eqnHeR*zrFm01nw#RW6!iqSE>;*SF`Da)B+2gWWBl#myV&Kn z3LtGC>-*=ryN-Hss$_@$#0d1mNrk8J{M|1LU*673)IJ$m>E7x4CUs}$Wu^=JmUYNs z+}ozrn70tmS7rR?UGu|qU+(c}JlF~yW@LO|oS}KieutdiVSVMnOv%SIrHtUaA|0or z_k7y-GYuwVNJCn-2g~!{z(%4@F0!_EDcbBZI7eeAJNHWkVEfx0Tq8{mmT~v-K&QJv z)j4B#{VwTy@%&S)go6R%T@Kxy?0I%Zy`cr06CwIoZpjz#iNul;b;ET<%PXQdc7x0! zl*mu=i6awf783 z21p)n{}oMqS2eW1Y8AJ8WIhTEZsu6zJ?E}q5IzkMg=;}X7*ioUFgDuok}*kQsJ`H? zyxb4gsR!4vSon6l64)setJ?)&+zNO{0A>e8`x#3=0lZV>SXFgatUnfuW8n8}JeIQ& zn*4K=9`oiUWIv7jnqKJ%r#XQ3sZf@GCN^fhsY$=`O~P$2!gBMYC1ITY4#5B?Ckhlh{y@(&D1-BfnU8GEc1?Q8!Ow_0UrFG?>k+eeycp@ zJ8(g&&{d0DBR>J6zL*Pvuoilnq=$cu_Jl=HP)R$^p~%|6;)2tQlw{K}>GSd*XroQ9 zMKL?aMQZ^HHv)#3hJfCSqaW%)yDoqw$)9>)T`V2|t(lpOr^!Q!fZ%LYqCXB!cU<#| zeW~ifC;5a`{_2EP)l5heS=pVxBuM$M7zEh(5VAQ@G}=&dYIFIRKME?L;o-B{=oL`I z=s>Sgq1edzA^V%HMM4bGh*kBX57({tt{0hpY!hZW9An7nwi5RnDV76G>y-RX?3r91 z^ywc}exHWrx^W6&MvLltS)JAHyIaefl_&JGT7Zj>sn>fG@#YBrx2~2B|L>lPL7a-$ zoLvJm7d-#op8e)m8xC>~)o0)14ZwET4Ff_hk7Gki&&S?R2*vB|u7+D(kM-v#qzCR= zqOx*lFRe|0-SWzyT13n8D!#ss&&_SS`s(k7Mhtj0hhC4Fm5Yk(irwC%R{D=bG#ztV z+VN}-4>#rWrsCIBeofw@4(odN!RV?eoD=%I><-&YKbKU3H@}lg$bh`|Ztsx>KLl%y z{bryx@ICWJakNLhMChgo+H;XO7;O_zjz8if@Cp3i&0^#B)Qwn|yvthafDslO0{a;> z>W`@#D;W|e*oskNl9v(A>01s{pMoD02nC@-c574E9 zg@YJ9g=yWGqVRm?m}Bo<8zX?xu>b|tzW_z}`|K32X^~jzZO9X~B#vT0HBnUa4a~71 zRGH|tiO*i*DKp7zR#=~_sL{pcn6Vr$>S>*8%*2mP1C4`j$pQYSA_UhTBBJ|^*uUFS z%AJ1jOYtm}*OkZHsWWZ$C0kcD=~ArL!P(x&8ZC3L9&!;Ol|lC<>?F}mXAoWWIGnty zJau^1iy&-f987)|9DbI*Qd;k0Z)<2`I8$P0Hs?>fgV+U$4F_#@i|^!CTqbY2Lgwwtf~W1ik-rxK&i; zZB9;laZaZqkB?1-xt!g~6)2CoT|Hmx$@jKxg(!NP$@7}YT9$!3E*(_nTE4%)3s(o(217n3}Yl`oosBZeBaF^!|pls`v*z*21|XZpF1#6}On z&Ee0yZeYZB1FqaFe1ma&Gt`I>)ZWH{CV2@A1A&Cm#gPlB1&r0(1fo|BPa#cJ@}Uz+ zGZDpq#xC6JbsOtXOWn6o6GhJE_6H*bI9>0K_LE*;ZW*|o-j0Yie|o^*>Wan~&&mKN zJa=DZvMA8>a5~O?(2Vr5B1kgH2}T*{Soj%PZSG#m0}~bJnd`+|8*jy%&5bD10~R#I zY>jFKQHv$-R?Mx}0j4(B{nt1v_-h;{D=ouOnQYKeTrw!BYGk7hl{vYMuUqfhAAbB1 z^0_=;KSUNH>qL_pl?pe0_OtJ5uRX1W`_1F9*zEH9j+UTjS2j}6%Q&}kW%LT#b(Y`V z!(7F$=meh3mx~pDwq{GNy&f9ZEns&1Zgqu@`)^@ZaCx8BD*WDE8m%joRX;10`?o7M z3{tBqwEv{E5pi%i`CViWg}I=h_?>@q1$A?P^O=L~xb11W$UW-`1*)UiN0EK3Lk4F& z_&jTcnFXzwKQn=#b>QHHb+@84eA)|3+tcqfI?%&=-iUF#Rd$QJ`w!T=DRR7$-+%kR zez)ShZvWxnU>AB2nzO>7ALQ7(Yr}?lAjr%?!Gwt}FzR6y4={(ieW^`D!C9HS=Lf`G ziosyo-t#uS_VBP+vHJqPnqI$w(zh;7tmj2FB|{aK!o#*xFwx7Up+3`YBlq7UoP{Z2 zATiLXC8FnWNXJwAvq@QF36Eev+kP36t%OAN+51?Q36mn2g$MYinS8sC*p0G730&42 z@lzhFWcCWe(kCRDktz0wjlJ z0g7VT24%h_24}2Z!l6)%*4ZduFCXEx$xV`Dh9I51*TzqW^k3{)o$bYA zb-?D+g}k#C+RUX^O_9L_hQmeCS;$~$>7|!OX ziBSdzj}qrl-kZ`WcFYjX93*{B?>Aji$!_Gb-_oq2Du%$Jq4(oO$t_XtR_Ryd;bVO5 zzK?qUROfXWPLD)E-=0#4*K~5w_--h-tvNHAS)B(-v{KONr1PG3FGEjSuktszAFhDg ztU6>hdw;i#nO(M8r>4|QXYyQMH&nG3UM!gU+r1Mjsa+GRs_Fc$cu^~|+YFtu-MDFw zW4LYog>hD{$Q*C9T-|^lVxK=n*TEc*$>42wb}jE3vl$-RNrv1}6aCW)ZLbM#Fm#zR z4?Ft2;wdEXeY);I&&TV|+i*__D`$3^yh&G(J)heo&_V zISVN3f~jRWdJw4n1qO+_k(rg%_$&?x0=leB&sy~YeHQScS=-*Sv=oM4g!g42=h?K| zId+2i()Mfz*;-M2PgqFIa&hjK4x6GSFb`$CN7&3wD;k?b`r#UdWj>x`TJO#Ff!Y21 z%CZz8q@8?*?ruIKucG$~kTAC@w|jX=>TcI+zf9QA(6_jtpxoN{VNOcQ zM_xzFE{0wCigvRsLhx+<)${%O!?hO(3eWlf6+#S%5yASujAfttZ|-o;A;!E}keC#y zKrOBj=rOF5$BXTT?7GVTnde0sVkDzC=;0w(Pm++IXh5_Q26i3alAFg7fx$a;l}VEW z01^FXv%0?^eQ|E30zVY9a4#YTB1q1~I_Trg7k8JEWD4~E`N4auKlGH-RM~aeyX0O5 z=`2ao1^%ItI`r-+NKA)%<;?Fq`U8LL=rM>=5Ga6(HoxjNU*}L^@Zd%9e!dA%{?Y`o z3Kp{)(xs;D)2GRtyz66vM0Y@4hY&~Y3wlg3kf!bS|1360*EvUK$$LIvJQ_$p8i*%@ zCrgk6-mjb{%V4Q3Ltr+JBq5UGL%gYe(K!qrH_?LnrTYpLd_LxCw<8ldI5cngoVFYs zq|j)1W87}FUrPiSv!)CWXE%3)=9`Uk+Mxfa&1M#tFpLT`Cyh{*r*Byuo3VchwLfh0 zbayMQ-)y4|TVKv>cTO%Sv$5Z%@bsqocZ+bdG`F=?Rke9;w&d_EPE1U6Y1q>Q|LxR3 zFJ0OEQS8#OOZi)#$FFT&UxIFv$DeJ{yuPqN>hjP1E9jJoQ##-CaKQY*$7g27<59}A z+NpAOdBFVj9G%fQsdDmj%NULJsS07EvS`I_6|;TIyb&a_xKOWc8HBxN^8eN{UXQS(B7K%FUu;*t$`Z zmM4bpxg0sRIzifGQ!5*0OCFTGL`YCtT3cFM3FeK^!D$|@^4E`YbjulG=|E+FU3kPQ1Mo*B-C)jU2!HE(ZGB zu$Y*F-w!#*R>yFEuV^70oU|`yJ{lgF6?=?f&227zd&_8BYfE3)SCYvYH=}E4(o(G; zt^8q5h(=OxZtgd(mo_gZj)I`Fqy(KY#J@Fv_VnO71ZL?sCNII={8e?@S=?EFA4I#d z^k9rLeW}U~^RIN>tS)mH9fF1y8GVsCL>6We0jafZwyob9QMvRx_)UN*u3tbXa}kT* zdO?ghA=5d^9sf;~hAcA*<+Ql8RA=t({*YoO%c6fcK93WBQKlN7!RX8!d}4z%J$_6Z z4pSUhQR%O^m{~d1+hKIvu{yaKmX01$434I*0fIPw<3=h(Hn=f{&4l}H=;cF`Y8`w+ z!H%#7xt%F-tzQh| zH^30bypA(tnCiy-nx<+zpBP)uueQ5^%#=L~X(3 zYl_kZ(<_FZD5T0?@w5BbFtC?Qy+K`)AZzB0JGxT;m`KlUrG&+vRf7Sje(U_aBKhvByR}< z-%qUK+p9I9LlkA8rlR_?$onfxSvk5S;wvlKk>s2wVp5BDO8UND@CP4RR^%8XN7jrX zrVWrW!=zH1CdE*7ToY=_4WjLW<;>#~cdMV#{DICh4()_;c8s;ox zLQ=V6>N$B-jC46_ryzBGL*1C2BNJRZ2CJXmp#y z!sU6V3@4|>>4Ud)GOc-X6+_?H5!crt$mWw^sbqZAD43hvr@e`X=m!1a{wt>sR2hG> z;~>y^nI=rEVJDdd>Q-D%#5}AtEhwhKw<)rWcdvKtWNsI!rs7?jI2;koajIkRIm}GK z!vs#e9ClJ}E-W7qwhq&rlw>?_r-Z_etdSJBnaY1jW1ge|RFuYuB#B1@5YjUn%eN88WP)_kBUWdsQ2jwz4P|=4R#(ow85xV9&B!Uz$?J+* z8CAqkZf0gZzZmro%GLS=QYI<}v(+*Tkw7&~>gN_aWq-*&()Li=OR*kNZ)9S%lCsRO zKT7?^j8JTm%3qHHSQuu8vpV4JzT8CzC3 zSvdIbs)i9@ zf>xgKO;uxQJ2I0T*j76y77vAq>P6GFtLLueTIb}+_T@9Fx$3H*;qry;*LVQ_&l(R@ ze9e!rMD}i(w2O;NHmg8atMl^>)f_cth-8r{xt!k%3qo8tf&84|NLE`yhe2JY=Dg+( zRFdiF)@;~a*D=gOYfM3PntwlkDq95o&XaIrEVtT<#xSt=JB#Xp%~N~Cc%lQJdV1p6 zk}^8H4R(n!jW2)~%X%n>TMK|W&6kVkK9{+5{9r~Hn~OJRiHC@X3UNO70r&O0tUZGK zPKD@IUE`)n7-g!MSuljcL7;cYvw!JpUwAKyP2$5G&4WkPTti<_KU^!;l@S> zN{nHkH`R$sQc+ts0gu{>i9I75>S`-R!+WYBNSPbs*F(+Af}fmyJUR&S{|xj`)hwQg z)q}6-PTf(Ic;zod-$U7{%|8Y>85)i~A$FC(!o~hZjsYz?0gV)~1mjE{*+@??6a-=N zBosvh5(B0gCaQx+v>6tfr^bW;5eWvTc8X=EL^Ma8XF3o}w=EaduE$d75Jedd6{}u| zHXcfS+NKVVXCyVusMCgqmCVLMcL9@~Z_=hYnoDnDB8Qz4n?JNX5EzCWwe!{lPK7Z`^NoDAP27s57C6&Hn6Ja}YFyhqD|4%cVQ6ek886coe+l-ieo zs1Fq{fk^EnD9ET#$z(G{-OR>^cT!}mBBGv3XZk&DV8D}%L8s| zuunUtv4Qr@olB=6J0O>QQWu@%Rxyj=3X0gR*L?9=;AzQF?%>_>$2-zZ4VF69+5r`Tn7RNkD6tq43%~O#A`oVIpky*26`ZS z!pXQ76llT-&zN;!I1fc77ZjT^f)EBamkX3mVyuvF)xnjJ>oEitX@!dyC{bpaoIV0f z?h>duT#rPwOMD`wIsQu_q?X}Zx1>0C9it!LeXaR>&v$?h|7O82@f01l;dn8Z51j@F zB*xJxkP66=m6rHy)49YFE!RP_sE`x{6-!LSbZIF9Lx2~}aVZ!)215b7ivk(w5$RC} zjz$4}5jm(7nBtWXl`L`#6k193k6_@pt(6ZL5MpD*Az*eJsOeyPmTwL8fY|VF=(bkt z%BJ@=I%S;xV8iLrVU@M8KJd^@i4hP_%*}(<;+MnSJSqzxJq3(h~y9BwL6Q zZDY28m9E@KarQ?K%BjtJvM|T75D*CMSLy3?=t;Dy*sY4bgW~-eYkz~q6EF#%Mlca$ z+5%reYFca`LIV4Cs?}38jj^B6EXb+&1+we?-9xwN=iDKI!Z=z za)x4HVItf9hK7lPgF=0a0F#eG6&3pc7kw8K|1gSrl*yi8^tCP|xQ;Rg1wk%d0G?O* z7nGD_0|k!yfc<~`RZ7L3PC|kbr}#UD~68-AD@ss6qGAmldK7yR%2x=c5 zH$@O1yA*<(TQqYw$n(vtcBI+5q3fJ+cD6ygl!XsVyE5Da>LH!4qoSMkPTgq}eQ0ke zn)ag==M)@umaIGQV4mN+6z0)s-0=N+=D7Knd62Jx*%y3cg9p-2`q>^0_wiZ%NgE}X zep`sTAA7Rl9p_Z2JNot(%pPV)<%$J4K}{l$TTfmwXP))4Tr6Un8U(NK=Yj6i6t6+8`XYMe2iJ-3 z?7{iO;CM+voRm*crJJ@)4)>Z6OdjD41c}pN`5c=v0cg%}`n&Y?_aeLRxfqU*k5fD# zW!A3FrlA(LFMlkXc%Tw>`#*oRvppvI+dqH3KWe;AN3k4Gtk|58Q(VHr+F%oQ`ujhu znSNg^uO-91%k+U3cvCw0_hxG8y2PZ$nK?ZGKyYl|-T}loej=*gq5v~}BbbV>3(UUF zvul%4g=|j$tBB|_3kCP$zl<`#dN3$=Ej-3QTNkE#Xu>Xl)a)+oH?D#Wj~{Eo$I#4! zk9rqijAE^k3t$Xu<)k13muF--KhO~|9^V*2u&2sOjmu;vj>_j{mtLEgSh-bl{9=f2Zi z*->F89)+Sa(XW=Hfs5LTN*kERr?3>Z(RdAf0euw}Jv}|oueW=Y(RiF>qP@2JwtB{} z7tCU|VjdVFFqldr7E4aj>JeQ5|1X+Yw~<=H*^49LFWx%;=AI49&^Khig8B{3>QxPO zir0CI*Py^7-j!TbW~P)BSwW&08rWnmmTL$@a2vLa$4)j{h>K?;2Z2JiB}~{jLn+2u z*vh!k{e!oX3EwFnljD+!t_f+A=_nMP9m*T>p;#MWccpM|b2xs;SDV~vZ9 zl9O}I>}-iVwX&(%QY?Ly41@6}L^!BH0Jc1cJso6+*=&S z&X|lmJ2o%_xbMLj`Nu~n>RWEMZpb3RDsU>u43841uyY}VCiE9yQt#8Ry;i45WeCvZ z-LfiRT@|k*PqP9iSg1HBm4bTb$$JzwnSE{qQ&I#D2mzN!tSV65!yqE<2rPX~6)6LZ z6;+DG{gh=_PDlX+S5^ZBTnRV<8lu1x25g?zgnops9LN&9yXdY~g8;lkG#a3ydXrK9 zglvZ@u%G4Zu}L2jt6zJW6CBiWfmSwwPQOM*P)5*bl3;}*lQgP42_1&@5c0dej=qR7 z!(F{nSa;Lt>10RR7<;+f6Ix!E*%dx#{~b(hceu#Q7)EJ6f>aZ4o=r0<@{Lh;Jx z`5YDMZ6&appb;MTzd$elK;S&semFQdPHjW2Py(Sg$!oOis-`mU4kWp;UeG91MY{_k zNyJ~+1bI$}3zK46OfX@_ZL;K(K-s{axW+X|A)`iDA||0s4?{5An7mh?Yxa9i_~{ZM z2#o?D_~x(Iru(S`4M+4 zZ7f5HGyL;-#~ad*IblC7_uls!_j>|yeEkYga}nq#)6Pf`5~@Ay31*(YWy{PA-R$iA zRqgD?Cj<3s=%Ta%nl&XR>nseNsS;L5d zW+f+Qsc2{FC~Ie`bl6K5$j=}3@QA5= z?2yad7s?F}x8KTpudDI2gLcX_E8&^Ni&X<;{FnZ0eNoCu`KvmOmuyA(o0X#kOJm5x zP-pN^QF7!nx+)189StZz3=6382?#YZws(6Ld<`#zxoDu3fbpufF{&y(-HGJA(Un!H zzqpf{o$xB~9gpD^( z7Sw0luB`C4l(xLQHa8cQr67mX{6-vP(L3KBRJu2x?Ai!3d^J9e}78e&>1AK zv6;;U_?Z^I)C)mJy}Lk?@uvD(D%v^Asa@A1H;<1h@aI0Cbv7G8NA0_AZ`>U*iaD#P zso7PZ-+NT18a!@2j>TCiGO(W1d&n@M~@^IWA3Iu^wI<7@(599%Vqm|Z}S(& zfr0U10N$t2CH=9)?`}?qO=AhDzgb++(A^~VyW>TeUxf`bze6D;(iLwBFLH}7pWp_~ zNMtKDEhDD(2%$tCS)g+M0p1n_c@kRtk#2@dRIoFz|9r4w8962-cs?vNc~+OS|khV)jCbN{EbrtL9ywDxpui49xk+PpMI9 zfqk>Ggb2Xp+L)6i?(POratE1qPoPu>l#D)SIpU#rOahz1_j^SwpJzGt{xA$!mIn3= zD|HegM3es^$fN$fb{yzEf>=+Jm7SnZPGkEZ#63#JUi%IFd~Q@$*!-(|&QzjP+d%s{ z?7Nr_@|wZ#r5Mkkx9g(m`J9DzCLhr%<-3a<0mp_3S#|AwQn8 zR%5%-y}!npXIIhs7Q)*DfkM7>lVv_k@y;#n@^8XCLqC3Kg*!>pSHmRRK7ZOJ^j*BK z;q-dZ?APMw;B%BlBzJL+B1r8YgwaLbWIj{@_-kh{kZ!+AxZgsADo|!~4-%7`K<7+( z!wK+DEBh)D@3~0vW{9njX+m{QZE(WlV>B};+|STFM=?8JmlRi|1qck-_@!{*0>J*r zUs*)Cq(r=61N{ntc|$)wYreg~o-hX?L~vhVZ&G&-;hss5`-ACC|HM_i`Qxx4FTp{C zFy?=D>fSEg{a>Jg2u7=aVvS(?!`4$yPan)A|okhWGgmK`>H58H;aoFFBbs&XHZ?b^QiTg#wDiBv1 z33W&%{fykg7K&G{KvG91sbxx$axW)3v|1YJ6P>jS(tRwl$*o6^gk;0JT$Z&sl!kT@ zwT55-?8GNBB;3(at8kBO;PMtImx%w?wq8mrNKsmOHncXFZj>c@*|| z!S5RunX|YA+ydo#7>gIQZDRX7q)hYfEOKl157NCz>^exf)tr*G=p3U~=)Tb-@u0|A z%@l<;e#42nXFU7FpWslWm#HpWhW`3kUt;P*29hbs@+thCKXix$jkW2i`RG)S8p8-| zyD9NY7;(Ikw+^KP#3tiR10-0kT}Hzdp7j|5SJ_I2r6W+kDK*MMbgc)DI%3kfiFqEO zMQ#d1HIRNKA~Af6<>9Hp6Tl{ zZZ$aCUkGepK>U2j#te6Pm-gl!VT4}IxzGXuRpgQ)jeRT|dorddZOBTet-Q_C zjLb3Cwh8~{fv+}Vb~&$59haaZ+p@-v6SH_1kfEC%=?jTf!i*@xT-zS6=Q&8D^6p}T zrKh(;JhE`3d!8#}WtI=IRonP=U9+%b<5tqFY;t(hm~~w>y9fNy zXMiq@+5g4D{TQ@riGSZ`EgeNj50|d8Jw8{-lJE2MXo9!xd1ziqgvt@3L3C4%r1bdd z@# zfu67zR-0HDb+;m+J!a236@tJLy&4jkR^q5m8CN7XFdCPaxe3?jHpWDfg zJk2aAN)xh3%2FC0gi&tSCb#v`4_Xv#x9CwntbLXYt0+Z8`|H~sHnnzq7w_qp;E*Lm zPa?F+%x^Ch=vqkDi7T}y8l(9I6%qgnf4^hZt=1I_mJ#mt2k}VBlEYVWEnt;(r+%^^ zl>Z%FzV$PFWV4yEgkBhdRVfSZ_cd~Nw|re?Gdx<$M_*e!7+ejg)&tz28+x*h{Zgk= z{-5^C9ZW=Om(^aUcgc*-I2;2!x_=3E9cUlzMQ}_DFF~4IxRVe|IoK5jO3m}~Pf^s8Dyu^F{FqyCrz zRCjs9{^_&#eY?@$p8BVZtnm(h__InnrkeOhh?v)(!YX|@;pVH-B9D~m1_@cercJab z@rW2DsHdQsKh43`VweXI4OO#|HFk4;f~!m#E;QAiTZYwkR5ER(OIr$qU*m@s6@qhaKY32FY{BIxP6f<{`x(H z)`=UTUez2wK_7)7YhV*#Tiag`cEWj&e~yn2zM6Y3F4VD|aAOie(oeD-OxgA#i{aMT z#ToC40N&qh(UIT$g2<}@&iBr9XPbWCPEPurzdSRehM2jF8@vjJRf68%M$Ch7NX8H} zvvDZi^~*IaBe1mu{m8`8mQZ}H-VQk*H6ndMBC=fbctRkg=g_8i0E#KLm7`{tIv%n2 zIV)>*dR8JbD?q}a(+>LXQ4k0p^74cu=nJ7B6*IHa0}FS}-(r=?9kG<)eFNDC`p$Rq zlI04Z8XQNQ(f~Y&Rsb5&%VoZIS8~tnp_5ram*%5u@r3mc46vW&7SO^Z)9QBUVA2n< z?xTkQf9==pCwqIjch6Gu^E$8maZYSj)WFPzi0AJ;*8!Qgh07PAsVs?4cC+xMTv>>B#zJ&yCSDYd`+HB ztQ=E+@N$My`}cPUc;?iPq%S(Rgs)%6qyW+KayeC!_V5Z4*fL3HMm5PQLaKo@-lGqm zjh)6}xAITT*(H0S*-^dT8~>im#+s>`6g>v_>hq1|XVX=`?V^s}tC~yvb(Hm@%Z%+u zRRy#7rqli0_)Zb;pM~z?&(&=O*Z4E}>z!4%4jb`RSiRHiftu$Tk8JHz;nEGP(<7dc zY`Gkm(k-stcZ$=?85Mc2w3^DQ%XmEk4>fna>xYZq*YxN9-8yS7B|hr2Z@Cw_Qha$& zu@_j^nY)iYGH2K!PxPSN*W5wj`2qPzWguQfpNjD^VLvw;dzn`U?K`*a3y*HI>$wU( z9o|PZwrTxlZotX9s1;7*bC>kM+UFe?8`m)6zE7Cm_uic*IzFf zn~R&3n;K1%JYPIJ=Wk^sRW42zmZvy53aw3pcjRToP<0vB7yxEHQK+ufZdJZ5@> z+5gyxk9?<605)7)y@KR7pYShCZy z3AjT#Pu%FP4?I5IPTeis4X%6EzNKdSbGvJ_SLvU)w1uiDmQ2ap@s8*)|N611$zV}& zDNJTfbP9$&T$C|T!n%caQ!6d2V(G)U_8wb&z&#( zi`gy=$^d=J<}_|;f5~6PHA-5l7|)zdq{-g#-e4Di(2IhhE+~ECTQhyO+uN>qFL`~w z_`SSSxl_o8-2;jTgJAZmz0bSR``7zSulp_yPrN?}w_X=m7o6|#Si=62l0uhIrf%^)!!rV|KjU1LEQ4C>@8OHfUR&*3?@7XT3 zk5U%JkG>WakBRaFUL7R0ja4SDr%(SD*wc-7vA*iN@x^Rar{=bsycgg9dUmzNpt|#8 zwGzbJVqy}h1SY-Cs4X8XJa^FB}Ag%DF(qB}pAAAdX>nG|{{cfJQqcAWs1eKLWY zs}H7g;{I?Qf7`d+VSm%;po$ctwEkdTkn+TQ7zdAM4hXT*OHb^isAI1Tn=RPkBz(lc zmC)LfC`m5O7tRlzGG-~UNzN7PEl>h^PdD_(KZQ8cyQL1(lG8TE{oMsx^87P}lue*6 zst#C>f*_3V_xNvrzdUv;z72JYd@!2w*T+0F>dz;3`!j_;!+E73RRkk@uS(IS20icH zex&rMEiCJ{mD+87*>qRI00*aM?&c32m4w_CPqZ6MMqG|Dc`C|RqiT%g9u9!J|21~w zZi&n?;8E@b5b!CmyDJ}}P9wWfqzKtF^m!W%{Nw;SRmFz`sDWj@(xwB~P{PjQHQ-*jwuGIv4a&wh}*mYU3#rY`!W7nXiZ{8~Sz^=l7>|W?F z7LsSb-S_yze??Z2F@A?0AD3WfME}Xb*Q7^69WKM2n3I~4go7n*D-v-U@V>*Bgz|i& znp{VV^YR@>c$Em9;MfEl#K<+2S-eF_9@qWN06exSO(2hUYq_-@ybGiRhsM4JK0iQ^UC z?qZ4xv)K3Pk8?k$?=2*YA0#me#i_`TQrUfW17Ab$@AUomO9FABkGN5c$;nURWufw1 zHm?5aMcW=AJl=(H$ZRE#pB$ymiMaNzg|5e@s*KK;If=Aw@Bd%o&Tuob;r&P0m0p(y z*Nr#|3s2{i6nbJZETwt!`10d7kFZ-z?G#ru0UD3uLL9cvccAv|AF_{35piPzuu6)? z6AE^ccv$#S+Z-{o46o$ilRe#Lp+S|FdPZfWNkDkSQ_l{$SOOz_%Pax2juhb&6J6f_ z2upVXsNLV?b9&OvzzcIp%6BhN;nYyynz0mI>a93`>t7D-@|_vgwy8B;$Prm=y_HK* zwO*qHKjDt7M@|~3?(Ev2mrggqOD{|{u92b3R$GSKc8mNi98Dgbw0(1}K~FpxMzYJp ziGQBo1pm73nH0KC1|NKU^nsh`E7buto6A^6Hnx8cYN9m;`&F!V9=~2A7J3r=Zzp!p*dk^2GCEvaNhaROCMCjH) zO!XEh+UioUS1J#p&Ado}_{BRSWu$Sr%KAJGQ6e}aP>=pjW91Qox?W|qn|b#-7ihX z1-jgYS?8+Nw&*`3jy8uL@IKO|$^9&xh?g@=Yz27NPJCafdbscsGO^d~tTlVOqia#B z<;?a}_G$$-2j4LodcBti?))aoSEE{}gufhEWKS4{_G|OsYms<$0XygeCKQqWoNyok#HsPX4Tnt4qViwOMiv&qtp)V#e?YL7R}o za=Z`i9zFWag~>;dt=)LRG{xJh@J$oriHVr5d;A!kU!a>3z<8J`6--+tmN*4Mn=GOT z@+;&Dq;UKtJZ&PEH9#4{5MiD zAB;7bDpBaWThY%R)()mjLSGeW$LoJYX&?2v_X6dAoDSHzst)o(uC}Z8&X?~Ie#gGv z$(^68!eAdScwtSwvURhP;%_@EWXl|XcyVqT5%JWjKHQtm#J30$FeHK3_1}d0HyJ=YWwWJR z8h>0<*Ul>YU+`M?^DZHrrmg#AUs)Uh2&OqYrEU85N@sZJ%G_ z%|2#FSmF&X#ti61}eDktRA0N-%%Xc71>=olJ<|yD2JucdD7_;hSjZ7*P1ctmPHr@(@5O^(Ryg%zz zRv4}Ce7JYAC&?VOX>+3G?Tq<8IA~J>SIgH=>s1rS(Z2Wb)82!& z(}$2wSuWTp}p(^e*{hw z_gJ=3+86im0z|A60SU>T^3j2px@Q~jySjjf`9Zg3`bOGT!YWnt+ymtQ{K1PZH_oIp z`yX}J9<_cwImUhvmUU`=MY0RlI>4qPJ&vwmQKC43mlbnrwV6bc4h$!=W+F+>XCta* zyEFcZ&&Jw(a3f~o(eax)quzecx<)9n4>#=PwA##Ob+74Xn|74DE_ThGYi6uN~Jv_*zhIY{RiQwe~)+DJO`^ zlzjQz9aVBN+35Nw5y|qjI)zw?qB;S|6gNszo@4ls$qquEdbybB^oLTs)|1kd1I(PW z4BZ&!KWq4(BmcI7{K9Wr0gak2JG)m_K0(0T8=^u|JxwO}Brk~+`olmGdjB!ZYfP9iSx0U0&9v=zd^ zH0-z-$byH6P!?I^G#cGzhqzIm%W<>BHZPeIr&*RjJuCwQvH0JlMcoD3Ds^(PTV|3g zUJ5kYM;oQ3)NneYCN`bgye<7F*19$(vUciOjLugqW->Y3$sbko1jz~}FjU+a4?p(h z*O~d3-QXzzc4;n5I3s%{PnA+EAG=mOU$s`!u2yS>le{<-85v5X}|i+zHI z0D&4^HyEWa`@6+MX2I6Ou7~5R^2xbQ^jE4g^V!-nGpaK)6}@(%0c34s|5g$qg9D6V zXffhwwK@s`5)$Sb8uR8Ml+sZsqhfC1mf_C_l=oZ&4} zOil}_;jM$QL_$&b2qqC079By7QL)V20-Ii8pS}GuX1#h-==R{Ao~CN}RFTlk`CQo4 z@h|!rF_C$)N;J;ienv6Xbh;^nVxf2d*JD zjTo8%u%tyt^)o_ZcLKpq%u!1fb9tgZy;u83UvI#~<>vGh#`&ooL-Gz}Dn(gdtibYg zmkN4SvgQ&jw>HPXxI-N7)(iUFN*KENN%pwhcegdIWw!$nhMKX@P^B|j8e$d(K~70~ z3+|>QELqf&t1WZB`te`a!p!~NI;+~Y6j3(>3`8IV8HB7RjUrcBm+cwp48#v>bO_0m zo{(2E1VX;=90>NiCQ34>$Y^AIo~}iGQgn~M%;6vgf9?8=9XxNFK@@Eu*cHO8&w+^g zm~zjyjnw~P2FLP+XY)*LOAgwi$L;x$?LCu6N|6M!{{#!eK944lu{`1_mthUc20y>d z=6?$Kt_9vtJ@0%1W_4cc$h7 zKZlx35IEUEa;E}+L-i0TTdRWwikzrXNCIH4Z{#|5Mk2r@kzh3dbO_a53lo7Rr?wkD zgBBl*CPgcQ^B-{S9svVahRk8`6EUPA8C7N&IK4<=%%b>qu8FdiEY%AJ>;9>bt&c#&GPAxCiMA+9JxcEL_bzSeCLFN^&vdgvUlyKB*&jsfeaZ8CHfnIE>P#j zXY}^zBcfjRjfe)pCLXq85qLvR_AJ6ywZmfcpFmnqd%z`hW#fSX@WPjIa1uHybI?U4 z{r<;-8DiZ1&Gc2pHt=Stawh)e47tFBLt}1?iFkxp)GqZMJuE6-s8p=Hh&Qygl4!T-isp2&GWi)L44+^ z&($!^;fKL043q3`vC#2Ldihy6tW<+s9_UtD0j6Da5s@vj;P`v1P^`j`#%Qf%?U+2~ zAh(q`x}#JC8(M^L99P-i#3qel4fi$WNIEA9Od}xqd1CUc4e$*%(u37f1{NeS>HmICwP8!8!}Fio#_ zM*(&e(v}um7v+P2eXSt*h|jRlRMC5?}X*4%ckH7Jy$~XPQ*|YcO*E1Orj;` zcP?09Qc`)|9cYxEa4pX`p81O7m0I{)d)W6kwjcJ|xEM5`z)lRtUvXffe`4Sr(wL~- z)0J?S4C#~X!Dj<95^zHVo!r^(pB%WwPCL3X(73)|a6$If353v*E9loo{fGFW?fPsfU#A-YGI zae7@QLu>zn8@CmHT(lLVo*8M4xrDKVJau|;coT!=N;r%`6?#i2V}7Nz#}4nmtA-5) zB)pcCSMQmHYHL7eZ4B7qUNJIANA%ma0z&|EzpaZZRvd3d5Y^`$2XP zU)dwBGF3WF8}HG<+9V9sH}Q5rE(()I5-qPc?*^MN#x-1Wv?yA@BBeghC4?3^&xW7{ zYCO>1;jw=Qw3?+&L>?|3UJH8wut+}p(bW-uuulepDAh`@5l*qF=sa{lI}rAee3a@5 z!{Gyzg0jJ|tz<^v0Gu`Uig(^!@dTP%cn2bJ5;iF$1i)YP8^ZVHoafT(WPkS4-zqYQ z6PXiyS=KW^jR!a&?sT(QjDSS2hl=H2Xp zx7;q`hyd>T=Q?<+@U0B}ITg5A;($PyGKow7y16)v;uyVCFn-FA%9p?!PST2!JLI`O z*)y}YZ%^br{`bX2&yIQd)TPl5!@k;brl>?vNlfUuk&pcO2A@RGg~+*bx274Jkr~^> zuF>5M_@W72!;CF8AUw1&wYeLGV+m~c2pjoSKZkwo86@NrG^}2i{KonCYuhxa%N%Z& zZXQ#-0^kL`(xxoG+1XoJ_{|I)@+ga{u>%y=BH!NWOMIm&vaShwA$cbW(&v!~y7J8K zIbV`g`YMYJK~b;l@Co#Ie9EsOg!_~EB@u}r++nugfX{1{p#N?^9?P&gg1|Q2+K;N_ zMZG=aA|Zi)I|y2Q4hnS(gF{}=jlJpsxT4Q!8st>1?^CD$zMe;N*c4cQzQgeC^Y!~X z*k=q#X%+JN`*n(b*$17*)`!!(cI#35!iZlY=pa@T`gF&ua_HLfsrE{|L+k+J(Zr|a zW9l4x`|+lh{psm^$bE1&U;Kud{d8ys46p&lHB^zFu1PjLpg%*2H_(dziq|WD@Jzu%FJ#s;yQ0r;(9MDL?R55@6h1(f(krC z9taedjK{zES+)5rYY|-$Lmu@$^5k&i6f>JCN5&?qmc6?C{L}+TR$F2E%NAjj zCw@bqE`J1+YA0Ryp|93^ovd=@5+esv0A93k#1YwGxb|p&so0WmeAZivJZP^w5=Bo@ z0uBQ`J*m>fwHUFP(%>fRQH#$`X6F{w1<3Bj!8X80jPlP_HHFAm$P1fO@uZnK;<3X| zLsX!6RuWqj*UMNo;p^kcz|G0t+jINF&Jggk7bC(_`C8gyLIo@v%tcud@h;haqA8Qy z^tBOd2C^3`9A1r38=K^Rjq2|>B_M2k(8Z_*hUB+=zx#k!l=0b3I{itbyG{>6G0xAg zuLoB_5%`jb-Df3*!NKm?I#l;~NHCywbe!u0=CKnvXgJ1Fv27?avBds@@Ph$yh@B~; zOKPkXHk+}>3m~CPAW|xYU*P6sHU7prn`tl7mHQLLr1BxNHi)r^NIcS*EgbL~m^Yj$ zRuH2;6&oqCEL(Wt*fsBcw_i5(H7e~3CN0G5@y0FmbaEE4Ys&djQML>rmhJKgc=ciq(%$mybK6 zF8_d>CY;5jzGIx#r2gh~GMC@ydN%nu%Vv|=^uE5roVh-m{{mOI<><-7%gg25F7 z2OcMaY_BOl{0q^>SWcgQ%nBTo3PX3%FvSuq)gBLw2qX!+fF+}xc7v#-(iar*RR}4} z6RS~b6kerq&Ki$b_w+IDfcV~a5Izk8{#kM4BNw;l8u(ltWk)9my`?38yzI#r2Htb_ zi;KU3Ki*rw4i3+s2Sdr??{D$aqb2l?i4`1GAz5nl$D#eo3@~vF66Il0Xy{!IH1mNn zAlFS%j08zZ>1Z@kE*=3HLOeVnk?;ER6dm>a3NRTVPqS*a;74Yso&1mTe->l(HKa+$ zE^~oC*PA~0Y-SfQRTpQYE9S*?StU6lp$bB_xAVKZl%c_(T|R}@HgpfXFH8~&2Lc0q zW?UnLRsQ+;pnKre`L|tR*Mq^1o7sH$4C7wUm-}ylNdymg%7-fs6pJRHc2>o^V)@=) zeZ-LXRW_4$*SmYK8iXPPnw^a?d~(}gF|ab~V=Gho#OqxR!MoUpqM%zZ`nn{x2d?pX zuTup*{8RSiIedgO=mjZu%G%g|yA(391+RDajTb&+v<6Lv`^b-7t243f{`!I>hs^c$ z5E48R%d3i_4y?X@O8x(&qEI1cp2l7oDvsbTU|dNZt{ajMozxIrQ50cUC!iKcfg`Be`{DZu@2Lk3?7BQ9fR%bt0we z)8JUze|++r-uj80a*bED5f~YAgiwiCnp>Zp56I8=>xb8lZ9ZcL1YoKWaIjej!?dE7 zW{GL6LfeP_YAC@T&75TuN!Trh$3fa4D(VR#<1#0J6y|4ua1^9g&=;3L?dg^k18RDj znK9z&#q!7442B;mJ$)tXT3H)$kFEN$sr7`!4$LpJJv>cwR>Qvlspc zAuT(_ztdVE>I3N@tN?o9^DiB4dFW{nQwS{55@VpQ(`6Z8cY%n<;xb0WKx%z>`^PQt zeB^M&0a|1a4~gru6I?m$AJVw6L$R4H=nHEpA|6GeuMEWJ<2C>6B7~M2JWYgm;b3I@ z$&O>iwP%4zjLS|&imZi#0$EGPDa^RM5{wE*cgnMjVuf3PlRicZWWz<`k371B>J-)F&5`sMiu>B}SJ>4piMrzn`0hbzHN7&gUWz$SyJw?r-X zl3<8{q(%UGV+6N^wxy_3;d?}+l5v=WLcC4H0LQuIqi`yQ(L+gQp_(pDhEBS#E%0V! zulr4NV();}b3w*4=zpy9XIpO3eD0-i4IHlf$|YoXzDw?A)h=?jD0E(0|YH@Sn#j_#9&7#rrCG-eU@e@x%}oxw-D*Y0N1k;%SGqzcCOw8S7J6$LLhbsmEvpl!28G_LYAHd zgtO>E)^|cQm1NOOI8{ZJ;n(D}b8)sKxTn%qyvZB)jKib+7GO6IKpKgVr9_>H>P?#C zUW}$h&?$oaZ&saLA@b`t9$BaQAIX7Zin3Q`8>Uo?rNC+=sk3h88K8ikJS_ zz4W(8VxGxMz03ccCq7jky4Zm^3gGkBElC={rX$2WQ>F+)JVW+zTZRw+h>`_l^Z+RL zW=N%v&=VCt5lcTKy78#+qBHxD7I#u77Uw9gCIN(teJYDm;6tkQJ`p8iKP3I&_`&DZ z2oRxt@@vfN?sGK``Z&P*U-81q`^T-tyrRoXEH<4X0wTgN%XM9wS5k^$)E88Kv}Ric zjPnyLFsO)o^(JZT_wr5Hh|?qX4!=&Hdj|RI=I^7`dNC?-$cJioIC0Di8&Vt8srnC= zmlnsE@f$3n%lL2N{*u8>1w}8Uanm;?^upDBljpya#$8-+K5~v;uD}e^qFz=9%Be4^ z04DqQCpe$@8)5(D(}ziy-O<}O1#+o6f@T4V9+&T6MJ^0wQ#=oo!Lx~5K+zF3W8Z9f z?D~y{L-xct=6|oa{IZ#ubS|0RN0oG*fo78~i?nI$E9`DGOWB%u@cyv}S9AVlD%nRA zo&kPzfT3>UuT1MwAk~!vNP4xfFL-n04_(!}ToS>*x?siPCkOrl?x2TIac-fQD+t`Ta81r0dlIB?ThG*aP(}St}vd@mf^4u1i z^Tj97|962%awU5>IKM5eHJQ1pqf$A1vdsAZxAf>?ihnV-<0HPunb#nL!vEi`AD-z% zflEKwFRbdel|}haRgEj*L^BOOE^8%`x`JQ0Qs$qFnx*sCbCk|N(i5Tc*rn7D1J$78 zvK%F6X6ET;;L0zyETOC{u4hO=3?IMwaudxs^b#P|4koUHcoVRPb+w^W*yw=+?cZG$CgI(V9y~0*r?tQD@k8*15 zI@2FD_}`hB+q^q?AKhjjQ^uT`u*>ziSyyy_60gd@A*mXso%|UPnibT4&hAaF8=vf8 zyBoe3hgj^M5wta}_4<#uhn~MOnHGK9tNldl0{GKdnbfWzqoO*zU0UQtV{kdp>04?G z{+k-3sAz7rkpOd*^G3~~Q0^nJ=Frc&t&E_FRrc>!hm`r(D2+8+HrxyLuR*vn{`d3y zAG$L%4$V()Wodh{^J$0MP>-Eei1w58MhbQFo({AbL88k&Nn@R9o4|5OC)O+!T68m> z_txGFErq_Q?|8WS%J^%Eq!G%s|L_*|Y}dba)DG(Tbq+eeW{q(vIJcE=mo3%msZj@| zSlcE}IumcrE$7WgrsZ&zA)1cDGak90A63Y2E8 z{RXLKeXC?E_kj%PrIcmMb`7aqten&BOjW>CsXD<%fr;$#27#!m_*iWdmdS!h`Zw*A zX1vL7~Yc?SImCYSu{&tHGJuYB9>>!yg%chaZz2oOynw-ZXQoW!Y23Hs;i0U(%+KegE^e8+&Mqc}EIf_^44c?|(A-4j4gk0e&0+y9tCd`; zl(bgzI(HnFrP43zFxR2aUyZ{FZI`$Qg;pGwqV5x!=2!2J>8fFGrsf|T%-KMJjcwk1 z{LerXpG?qpsbnpBr$d-d7!ej^U-+J4$jZbqv{!K!|$^aGS- zzzibIX$}Km6z->rnOV#F`at^&QJ<}P^}4Hq>X+|ue(F<4^c%e8yrnEQaeUEwsI#nEHwGGiw!^6< zfA|&T3sjs7jK6RL%uM`u%GJXupwmXN^a3SnkjZ^z)CKnK?@DyK_w!(#UPbp+jq-6r z04Ht4m!mp8i8uY&dhY!et^|l(+OPA6H0o%i+^Q2Y*uh7n8k$^G5{~mORR*sZLwq zRQxvCGeXs0`Z+3(>^`xE6l!P(UL{DNGmN(6glBBcBqnvl zZ;H2F(>ENR;q{WdJ47x^H~*TX_2oR5F6qGl=qLs1fLVIxeOUP~y*nIT4e z_hcTDRU6Y(>pRSYyux#oRTDp{DNz^kUF}{F#4UL1`qjStp$thZzeC5EFhyrey)Jc& z_x@f;Kqj3{aU-c*v4B^;>1ML~Ijyn!6cJ7zle?$Lw!5{9IP5`KB&q`!$ku8Hm+n*S zL^Hgog?0oT%|#du1KoFWe%J z;utGurmT}Ux>MbzwtSnpeEHCoI_Mi$+S-h}(p+L9Uu_t+CfI2y|F(Z^Z#&RY`&(=s zt=j=Y>=>H-0Ag-OZv6GkHaX#km0!1-k>988{;LVIt-SM|3jFC)apzmMb~M&f4Ab%t z0VHo1($X$R4Xzan-q%AWlDV!{DjSLLQI}jl|6_@hj7cZ%lUYGgZXdOe8hqw9o!(!n zuRoK2d_S2vDmmccD()H(I0pqFEkU7ed#*c5a4Cr87hyMh!c zM>>SaypEoE#F$&TOOGzA(`dYZc80L*&q-T)Aq#z7zF2Z9!aTax<@#iomQtJUy+dCu ziAZ$T_|WFiV7O%4$k^FZtB_ALFt5}Fjile@YFUb!Hgve>lKNO@IkwJ8EOU?4DlWLM zK@RqPyW+nx31aeFi)!cSCzWu{x3BsaITfGvl??X&wgT$DmSJ!q(8wvDs&b5Q^MyOz zR<6&(Y=Nx(qGxE{?4q=)&}0s7u_|rz1BPr14oMe(G0z4 zd#U?7CJD-BpZZ%1WUYmGrT-S)8N@bIhFp5SmM0>y64)XJx!-f7>{X7U;GD#7jLN%x zG35UV38->pxuaZd(?AU_Q|C~f!Tuw|s)EppcuqHgb_qJj4;f5Y)RWi$ml@zn7Q&fW;g9 zkgarW!O<+c2~Fz?&zmW7HHO-$S7UZWP53GT=DKYe}3lSG&>CU(L}og>Crmz zNiS6X>m*QeXcg1))$}0h2AAV)e-HaB*WD}Y=w}%sygQkc;i)Z7Z7@~4r$Q7YZY#Lo z*=db;@UM+EUiH?|DK1znG*h&kWy`hEUeKvVScQ-oeaD!oB3Z z8=2387ot+WH5I)B6xCKfhGWRKr0i)cZkEVrg1mE9z7qs`zbciMti-cut8IMVZ|p>u z3{#exfUQ!yt<`m~m*uVNtbf^m@ILuH6Yj@hTP(kiPr2Ya?KgDt(u|+u$UAA{u9Y)o zJAHu}FD?*2xq!kp(k?MOJ@*F}PNg=A*-vai-h%FL9_*a-yoAa<&7XJWK~d9xuA4W- z{k*XAbe?^Ojg)Qmm671ivb*Bt}qYtf@D`#l<1!2wwLgc!(o?_>iVaY~!8 ztg&VC`r>R|NXL>h0Mi2F9J_ztq=EYk+OS*$jlB`xWKZ;gdX9iY>3Q}?`rmCvtofs>ZjdnXb!0ga(`r+9B2RbNC?S;kR5vJquxAebQmekFt#g$C z4SYz#Zg`}q3LRn!!`Xg}&-C#vRXCX-V4!`(B#UeJu;Ms2i0<(3kF(be_*L(l+}DY+ zTW7BbV&hESHD@Nxqw1%@8`CZ~)IyW(F*ZY2lOBN&2bGo_Jz4ueUfBSj&2GZXQVQqu#Eockden_-H1DW)9aM)q_9>xi6^0L&i zUw0k;Bep9(9V+Nm`_ekVZhD#Sp*!b7!3+&}TlOGGYI7;bP!+d|sm)H%=UQr}sLTiL z-Baam9df)o!J6r3-{kzo(&S3+s#)%uYQB+tmrjy06>o@usTmL4^ zpq$h)0bkQC2XYTfjVW!^g+Y5^WSU;Q1vPSV!)=62y%NSjQ$u#7yuNQ(B;lhy(T~RY z{y}@Zx*vP~c+Nle)bOrtEVz-?8*Yv8+=+)d!Xxn;=SK&T@Mdi+c#-v*TzqViEzox$QQ@ly3<0gV3TxO z+>4D^4y*3UjCpas&1ly_V3%w+yX}bsK>;$6zt|8M^Or0A5IB6)^ouv~b0OmiYF&S{@t(~e- z1{)PqBYVuG+igo&_Rjt7+y?#Pq4|iQmctPsI3{ZU*I^luoiG^nU&ggL$npNB*>^rY zA4R5w?u=BZmO^AdmPY%86s+UJ-su=^%kllAkX^vT1W! zH2GguXeX7v3)4ZHPF_vFKsB_z=<1|UgUeU34!aiK~VKseu+_)B=+#YOR#|5Oci-|;_a zRX-aE*Ep93ju1QkS811BREi?;V&z>SAobvTN-ICY3IKjt{EgK8RCu^0AbO-Z0jdv( zRxWY!ldT!Z@(M@K+&a&HI=gKylI~009Nfv;1M{9mu*i2mq(T{z0@c#BlHAt@IvGq8 zlQ6l;Jgn%zci$Z(%L?%c72L~skfPM?dQZid;qOuXb z?Nl1v6#7BD#}92;1V6QrqbM3e8iy$laO5wE8|~dJgliULxgrr)8i=kvO%_~>y9xCR zTFCi5=I-)rWnvQ^>Q0St85rWAO||-uBeSn{^rB(8uX(nCwTfjaINh`&-&CvIz=4&x zYump=HH&(Y?~!c@=G(?2xs7D>`3r*nmUdOL`wgb!KL^9MrR<${-C@o?Vk6o1ePubvb_`P%dJB!y??#1F~}LK28C#3 zIM`eiSq2{P8_KS&39Yo#A+J)-TeUgi)r}s_84EP+o#!&io$4AqcrMj4(Bg^(+;AHE z&pCOB&93XZ5e2L3#T4N9AfEwVsd>}NT>>@4j;8U&Y6kZ3EQLggk7YHEWyPk0Hds=r z$zL=2>uVoP4co+O88Z`31%LnK-?umTpHx)DKne)?SRB%nQUcZg2a$`q~s?I0KvipkF{`{TgK9<$Jsy@fxbwS%-uq5#g z^BtD2sB`p1sn&p$z2%3`@aso)|l+s$Uc0?uoqxhx#O@wX6ASC;@KA15EKz+65liQt7ba{t5vBGV79f2!pAVv0OB}`asD4oB?nu+jXbijo z#srSvyB?FxSQ;fg#FU)D%rT5Vy5l`)5pkb>=%sL1@N<3yu(f39b4zSD3BzrD6z!P6 zSq*O$xTyus6>Z>Oq6>Oj-Vk~gqQ(8s9%27gYX030Z0`|q=v1h?phf|T3gZW9 z#5F{^Q)kVZuCD>&Us^>#l@pb@GDNOrF4S6WC?jnQ{1(5IF^iSkF4j7nzPqzI)bN<0 zskE{w!a9kZ*RFyr#Oi%aFrj#4v^TV}b)FN-;n$=fHSW<~3uKKoceN2Yg8aWIsf36S z?1BS({dp6ZWs6n|iTA%Zwk1#S=di7TMZuTqiznJO|IButL~skxo6kZzkqgipvLOQ& zlCNSPcaCn*9t+7hpv6{`Z|cLJZ(?rHTloKJL3Ay+L|`}=T*1GTgxr8B&8^-jyK1pK z2RL}waV}OpzUL76qNGDJdKN&h@jMppJ`;uz@BX6-Immatj+#UFlA06)JD<6y!*1zGB{D(O-B~%A+2VS(uczyE z^l}BL&A&T4m>w~0F!`2@K^Q4E;zLk3uLl0J=TG1{{ISMz!(A4d(ft#a(cV?c$Am772vgah@N2^s#~iB!VkdH7af@&9pLxDNFjbkL zhD#KplCEU#{kS(Khhkj4&Boqqyg;lIX@5Os;}wbxiJUrQRi7*|(Z6Bp$hH4u1Am!= z)cPiooZ!m<@SIPrF*mup7vESisQ(Hq!HdGQcO-;AJq!q(G+m^j;8g-(ohn9HpUoVKE?}1i-T7#p-s)wb1w)}fySFt{1y^_(UOJMGEkz}uK4t_f294v7xA<^}Qj8&!m z{+&IGeO8XLE~0ClZR8d#fnPeX_QbY#1KW+U|3<56%-r9R)l@t+l2=vJ@F3HZbn~8$ z>xg|&Sd+cfu?af1v(>7{FN%p=BMoDF1o7tIh{dVQWKJ93+ywo}K8v;KI<%3?p3Cknepth7Rv)=cWQ zw{1f;^-Frf#ehj9 z(0whYn@7THe8Ozx*9xksGUljW=>)_PJBcN+x6V}A(~^T^5tO*WN{p+`g&bgK`n)3>e3mPL>$+X8Ro%_E1hj=fGv;e`9hzn>tZKOLf* ztGq#+d#*h|0z1)*R)6^+kXGRbxO-W@l=?g~HL>lA5lrVlcu%YkrmMHDa^>N;xKFjZ&sb(+K>np8UK==FlEOgD?b>1uc&AXMCNDezz6gNy7>@SBqJ{&yU8 zmbn&;J@2*G72yOfG2~#HW*>(WONMIR-C1C+1xrxIzv%regALd*RT5@571$|=>zfF& zVB(82kIsZYbRtjhjXk$7JVi6nHV>WV;=NjlPbF>34!OlEEcY49c1?J!TS)h?Wlpv& z7vy0%#VoTA%HFhwzgh=Fgty2m=7xQu4SY#@h0i^iVsniIL0i`zr>xy@1t|CA`MW%a zVJaJm*6WNB+$4;%Z0I39DMo(jbr=o_z5tj>l?Xh+g}9%aq%0u<2riBzx)ZkV5bNd^ z4)RucWJcHJy3Oyau)y62=#@uMpleh zCA8|(#XROX;hBquwoXL_F;raHkv#Gi0m0_Zr0@?RNjU13k1tr2d||voXSpzaxK6zO z8~7D~sEpwGwwPbNq_zw`4nbK&%Ij-*eQ37Hi;LtX>iCeY%bAsCHb#0-UeK2oak!e7 z7X7baF)p$17yYzS9dP8WWB9BN@gtjb61~+ERu$qSw#`Qx9uS5vGL%i0PaAGQrg7#I&_gg9C_iYW+ zD|~w9lZ|xBaZ1)9Zg#?J_H-YrBU=8nRLO0pn^TA$0Nv1s#SxqoE}jL3*&lz)+V5o! zF#HM+5KtM>SaQ47CA{5^z3k}=CG<>nV$sNydPj1E4cS8EK_1cdWxf5t^IhudA^G(W zOmQNxK1khdiCkaA?Vp}7*8SUfJ1zjX@_S8@OGUX$TZBJ4)b&&kbz;OZFZ%uZspQsu zvEF46b5H!P5AXZTGZ11*2;xa<@UNR%bN;@sTRt(kS3=!K|w)75dAeP| zB-A8?WFCI+_5K0Rhv&o0w{!N)oNMOnS$nOu>4{&(1bvH?K`4BI2FEEbGnM0{AaqQlDVR4mgpWQ(9*(yBK^dKFtsI z<%E8@hilggN<;-Dt&x-z|LASf1g7!Zk|O0F8DI1yFjm}tu=yV|RM zo)z9Fo3;JR@=s1Id0$zzDuS4s&@=sS%5QfhQ|>U$|G8TEaihTAxN6n;0snf^kTkV} z2=x&NOMOzyf+A(+L!4tr5E4La#7kB4w2RsUEwyh7#SHc*9wkVXo}!fh75RjFyCT3U zD`l)gSnEY`kI|LxEng&WhtZXV%&0#{;rx3q{;_C(P|qq6qN$ZKd^$B+!}Zq2Zgl=K zvH6F}oY~6HWk&x;ad|df?k)l?|A7=nu>70?c1AT9zctn(!jaMM*FZc$k~h7_sih1aSECDY+`juG0=t0x=6avS9?2PbnrWalR*N1R`G zAhpEguFK!Kv`Cy((SEr6Ocq7*1~rW=YdM~@Kp0wWEee}KXYEVDa1av8{5Q*!(B>0Y zHwFVWuK0@3_Q-!(QW6OvcVic|y_!asTK*3BVYzZG_kFPuihA|@w-CPR9l9gZarH7C zpY}twKvPDF?618W-bHi42>M`|KH1CP5#ROg&6%FV@Q}-IIg0oT|K3+wzyg!FZdg>{`qVTu68*iSPo~9kn%fFk^dA54@s!8L$Pb@~C3N?Oeq!bR7aSfl+Z;T&3 zXjn{pidMX3juSVqGZ-tFxh>Dn8k z+``@0dHosDR?DQ_sLaH_u^2|#%g^g$cIvGG!{HEYsATi_M7a^g`(L5=Xz(G=2yF8% z(vy-`_mMCE=Mbh9cvAK^ z%k{RC$eMhtM$+cb4)r9~@-0UC`$bN|M%2M#GT-V_)}HLdV}D5Pbr)R;W4tsPc%~sR z&TSE=Ea0I8+PJczOX6R7*ebq1*i*%`2m4VRm8ZbXpOmNIAHSbwczM`+e?0=O=zDlW z!S}EXcGkq6eRTD%qhwiC+DF|!pOS07wTDS~SF_(d2t^OW**Fa7(A&7Frvmb6>L^pwIw_wJ ztFycMj0%o78}hc>)i3&KwBO8;Y+~7r#E*Sc@><}0{w z(_`#&^+ao5fKmhTWhtipY9Ju9ZvdJ%TtWw zR;h84@3MZ8&7Sx91>w(^V0|aCZlxw}%H!hZ2gx_E(DXKx9Mk3Sm7SkHC6?Ibn4KhO zXzqdkOmquWtB&oZ-HyhiW?+m~X4&Vh$JB-@e5JdSzNyZvo?0qrKSaFJGkmAtI*|V1 zm~nd1@4SK+dwd3ANtUkl(Wkn%Yskr5(LBye3e&mFRfoFn6>kudr*~G()`iMl%f38t z6d#%jn74Jr{6`Gm>k>qI(Nlff9eVcU)tp@|+qkVj$v0UAMvQag@DmGjGaw%0W!92b zUh^&0tTe3DF5L7ERwFgp_K-x708V9VTtf7xamvu zUFKG1b6e@R9Gi|f9PLYZbYcpB;utDpYK*WqrsN6z=6u3ZJ?Mdaq>AJkH2QYPHKi7!~PZhz&7@ft(OZIf#ODT(-j1zTX8(5%R%-lR@?kqW`@#H0*?b4kE ztogS-ZO$1nHN_5ZjeAvoxOa?qF7ZbU2zc-vyvAbbg#O&b1}BMNbc_67Q!?%i6h%&6 z7~IthkLAYtsp(S1k3-fPmiNORi|h$GdK+=^rB=+-lSfXF_r8x~0@mCiO%FZEZ0}0i z1wU<5RVsT%-u@f<&g$2lx8I{%JzOS5m*VOdt|Yb()r+}l=Oi(h$&FJ<7g@YZX_8vB zHs~VkZ+xHdh<*6b*|%F!-{0IUSUvlhrTEC-&uNvlOMY^EY0?W~P?2X-FCRKdoRKKl zD80ahCv#OTri5#2+^u{$K7Qj+CG>y171PF!51sG8OdZz-YefdxYmPADB1X0Ej^m8^ zrW;=q?SG?pwjUn_P8j`1V4NkL%vB7*jEA1MR8Ty zB?frDYdid<`BMto`wlNvA_FUy#iupJ%4df!CbyUvQQgo~Xp^lI_RV-&Cw?7eY%MW; z#j6CfnE7?EHuZui#t}n0Df7alQ@PS!n3dm~x^6PH^ce3{OB0^S` zX9k|K`=8A(7o#iE?|$+Ra2OekhUu1#i%lGTutwzHm*HqrntKrQ@cMo2^0&xd#bH%K z6e?!PFzIwf0qp@paEL?&o0xQT4v1%?JIzfSGa?oKSA;VScFNL^Jq0TVcARlT&CI@}O5P+I^iDEp+^9C7%n!{;f~0*xjky|3d1Bxt?j0ZN5BB zjOZ5WL`%NW$hNQSk(-i;$$>Y7IKZzRA2{_(%w_D%HqV<=L!-iy){ zZ~Ke0d9wFhcXy*C$4QQ|^{-H-d#q-$=@;?R{EvscWw0xf^^f2WSsT0ah&{AdM!v!2JKXJH(k2&FU6yQouQe> z{Yay4>NTbNV_?vLaNjTzBmd|5l8*mE%m&-?1KBg5wI449u*Lc=VM|YKvh~wb+P}pd^|F4@vyXH2PLFC0R#3eO z=Ji-!3Itos%VnGwScR*yai2(dM~p%g z=UOfWz{mFHPOTJ+R=(Ey8>vI_fiK$PZJL?fl?u%5SN=^YIqDcfQ4Yl45B8pJ z48U)p>W@=iAJyqP!Grz;?N*id5d-YaY=-jE7cIig60t!UrbY6Tdv!(IZtcNZ z(LAe0ik5kP_{pG9_lUWfjo9Qcv#x z?gc(`CF90N@o^r)^MsSmSq16|Y=VbByC!VQM1D$I{GPViT_5b#=6yOnPs+yGss_Wr zkkm4lw)jQ#Qsyv>5r@xJ#N--BYIpQA4JElgEHcAJD} z$BJ|oJ_!Q3-R|4sp$SE-ont@Nnq+5F3>?rBvyZv=aKFSNaEs z@5^yKCL5{SE?n14S%m)%Psy2jyOfK+5LYS-47%|ZPW*O=E*MFWo_)kUG+(Av_IWhd z@g?j`5sNZ~-76VP*n0Qgp=3IU@MEXQ?qrs;#;S^NXTUb0G~up+TSU%;I=8gefSB35 z!-J=P&Z&QSq2X~n@!uQ^opj!`rM%wc;eUAJ=_4`arrX|{yjp#0KXK9{erb}-TW&vQ z^DaYZj)Q-m+W+wA7E5qLrkOFUh05R0=8v|ou9?NK>wiZ@>%}s_gmOWCN)HHMVrtgj zTBwH-7H)3656Nm7VefxM6j_;Z&Bw;d9px|*?k085#squ=wKIS9FzF5~qN4DQO!Y+P zvFdk8ZzQ3=MBoU1_fP$p5`M4PZ^?wDuaPuIq$Lot@sKoqT21Un7JeA}T+03_vs-jR zKWFnGOfm0SKRh4uA>Wtg-0HyMwTZH2rBZ15GseV6uv~R*CUmh_+FZuIG2>t{&+-&Cl2bT(yhXZMHmqE$eJ%Ge z73X<1M8B{_xND8)fQMeCB0kBSeYqxdQJtIPN{`(~J^UV$u1Ldw&W_z+j&Lc$%-EFr`x+cCm2a*N3 zg}Ao-h5h&oK7DVaS;#>Zg_U^iW?LZXpiGn|*qQOHk*+x>$E4vkioGwolCTDbb8fVK zs8VXFM=wRKz2yv0z88nOC5Ko=e2;O9PJJDmZ&AbY48_$4Fshje^%Ch#T%!n)^zy+s zH^VtJ9|zxFQBYHA&^*R->%sqObwh1Vp!)R1FDnuMaZ55;#P1b4!uD5uFXPTXnFhNq z$*Bekm0PL%wdH#MUH>Q^AL%`=ck}jB`Ry-1Zra7>Fiw`<eX)EgadTzzO+h#|D9&i{GA;aYCT_Ob|yNqhUVQRbpq&a;{iq?B*Dfz1dp zd}{A6m&penP}2l==vxa5>T7L11uJ4Q0f?mAiP)bFN65SI9=F{8(B@h7hkQr8DsHQR zJ2|a7*j3t1)|E%`nxdmSk;$!!E1t0$jh#|DCdE)r*?%PwO&l$_v9FwwCjrqTNmIgq z#4276O*y|fxS^}4e?J!W%E|xyYQj$fPv-8y!)IoE$nY9vL@uR=aB`ABuuS_#;3-K^ zX@#s}{-#`dkUdgAW5RxRdsvm5QpSkwZvP~m5iDj;6DRiqtD)x+BJ{E&<#g$WDuuJ5 zSjbI|t6__n2X@}CeGz$~r#v1BlFD`+__*1!;w_z}@MSZ3{DpI_kfaw^EOg6Q40mGh1ikz$LbG&ud-)1?JBU^DgmB6d}VBB?FTEz!GF@G z32Z+*jM480E@A{$tUW-ybMo^wud;@&L?~c zc(Rufc3k_M5(hO}O)7VM2^qPjqEEkpUM%slkRwZJR=kWH9}Ort(TnNV`f2}Kt}VGP zF(WN&MiUiUS7XJ;k2ISLlFL?(9bJobKNFUH_55hXTciZ7&U*5)=CrCWdYrlPeCkKn z4!89|%a6`&^CEe8P#nI9=sYJc(+**KE5{}^P?Sb#lE7WU_xcl$(|O!2j7{NWbhk6wV7$TEmUpc>9 z)z?;&h|wSD^V;9tV6q{8-zGrB5T$3`{}QWa<&7yGE(cDxl#-v^_V8XrZ@IKXQa4?N z4Y7(TPcr2mp;)&caV$MMl8juHKKt@t^{14RrF2u}KtuFjrrZ$%dKIf6gj5gc{Kni^##*O%X z9CpvHxN0XiJbK8TfOya3g1}inKb(0*QRhzZIxT1H^LK(rt?^o*-Lq-qU&{?k(n_6c zPA=j2NyzpdnQ-0tQPvUl*j<06_9ifu_gv<#;0#MlTtH?ygv?QXpV zdz)Jd&D{>n`M=SS!8Siw=%$@ct~Jw^yDeu%A2-CiD_xqBb$=?9p``mtAlOszMkQJz zi7^dYKDBaFs{G!&*C9@~EZ^WURE^(KdvLqb-GlGd#&hgVVYJJc!uL7W9;Hz@8xuvw ztjH`C?!i~5i0*vVv?}^xf$w`NAF`r3v<1sYSIpk-bNeNRAdAakzm(b<>+hB$uO=Vx z_(wan5GDPtGq{sI`%V1-rzi&ca-&$J%U%I|S(&3EihW)yE-=c&k{3vLdF;-}3Rt=R z;`W1UyE9Ad<9piL8WYn;(5!Y+2u|rm-?OV>@yh`+zD9RES{hA`p$Eg+mpQ9imz~3 z-RnZrNYj%^DeIYVNx+`{oa9aL-KNVpVwi{9i_AX`X#!1A|DkRKFKdR}4IzRUKy)2y z95>Iw7uwY<{f*% zK93A1J)VWN#4hLZX#hf4El}L0M%v{kAw{4%(BN(a+*PFW3g}Zf9iD2QRt2xpaNtfBxcXp5qGo}U8F181UWe(-mrW7x+t zQehmjKc&wEPG-m9J(j(cIv7K)MT^qbfiyropxh9-6P5;%ovF|5aSMgKdY~;@oN$K` zhzBfNCAnrng#H?j*#8db%mzz$)O?_bn1|559O$)MH-~#EW7w`aR@len_ zL*;er>hNyVRz4a2dAOG%DP<|~VVmktNz4hdKQWMhx#(yYU~{JSBZ|Dm(}cXdM%EWz z)U`Ph?H$|$DTFjAg!Ud7udB$~6a&*T^cZ_PL>2V$>0?)|2H%`p%b`<%ciPk~tzNWVUQV9`>XNN!5GeW}3os5`b3$Rl33dpE`0K$g?&~$< z7Lp-0`qWw)cP!DNRSM?;#YruMNu5gW0CMF)Y=uAtnbn1`4M+e;M{*+hNc!*KcT7gv z5<|X72md506y=d3xQGEg3)G$x0z!ZTIZj0?9P{!HXTF&59HLRLp;c^#y%a$H@_teb z9CF>?{^Wb{{INe^w0^$VmM^pxiBw9;v#KOH+TiTNL*0-HPy*N*0#{K}jB2tz_s}v& zanOwebzcyPriIw^#{0j9e53I00^b4s z{>|;$#8`5MmO0jmBvT6v3q1aGb4@Z!gpQ*ZxOSUIqz8evK}ENIZ|}b>7ul>XOUWC` zW4|M`)E$G@4?%((3lvG3^^>WETgZS!vbWqZ{1_9olYeG<^36Fn!G`DyDmGwdxfz7s z#Y2`UOMf^!HcwKO!w)`5%(zoyw;Ms;4C5k~LF})xf64KG566qU{H0o^c2Me*J)ypI zjf@;VgAi-^-Uw{bZQC>QWF%-(QZ&QhI&6)a`LUD^xpuSlBl}V$!$c~|L->K6yM@d+ z{w8+K@H3KSkLvo@KIR{*eK!lsPPA?05g@~%o=J9}83KQkNC$%H!p^xADDs$%KMJk_ zjL5Al0##8fymZU!%j0;61Zw2d zAM9tQpb7VtGjnBZmy#eiu9ce8Twl9Z?|zWJO0E6xbJ)4nKOn!@|0gO`pYKbeFVz-f z$j(E{ko3E^Ma=STWj;`{l*Z=y$KE{r;6*zC3wg!#b-apjXul=2dj(CSkpYm6qU`ft zVH2t;!1%mwyZjcQ)}UFH=M()ru{HX@%&be{)=WUYh_X*yF(pf5?3~FVs`s_WzQ7SH zS7_fi%{aG0^lT9ApK=pFe##R6Jdk$|6rBL>^~%&__!hk)c0zmAeV8^FwQxhZ4#Vew z#*F)`VgJ>?qjD`KQ#C)UG>}Eg{W^cIu&Z7$EcR!jikSBl!9zkKu2PWeukzl?0`{%% zExNFrcIZUrED@D{m>aa0i2AVLRn4+GcQNG57$BVF0r2IiWxzLv{9iTcj@$3gjM{Sv4bRApJUN=4S?8i7q)l{*g6B`XOSAfLdaW> zVPA&v@#H0V^^}LJM5S3R{-~R%I!Der-C7agaC3j>K-Qm?X4{^NmC+xhU4*kp(gtC8 z@nH)d3Cg`oxN}q)a+n1ZJfHM$L~&28BbrJ;sp=!q6&wXdu!8Q{CBxY_s)Q5YUlz;=rcLd>v*(d zM{?pzuquZRO-F9uiE3*2+-N%Ot1o)D>CD-MSwn1>=d0-aU>w%G>vg{=$*laZ=!xTGF!}|Gg9S{Q;+IgkFrs6ovcrUar=>q!uOXP z<_4o}j;`geHDik=Rs$-6ToYGpCko2su6NdoO1Uc>5!q&LtYSlebZUTeL`LP==ic4s zyk^T$xI|8u+w17_iyos}kxSK-JcET^o-ca4=`K#^bc41M_o%)qf#hB`7CZ`S_p_C; zeCetHRp};M2Q^wPN0fZFY{2uPgR=GW$V%&CcqnioAgOpw&YL;e=m09LEqY}rAO6Wc zLQn3#Fq|(b>8XK8m#CA1`}$9V^xu%${u56$WwD}`;5nnzfj)s4xPeoc3ctg9=J^3ku+o4;2rn5(6jH$O}RZr_=fj_&2$Y5YL+^GN&^ z&r*EFxsRCCM-@VhFR+TKFFtZ69|hq9?_DCEQFlDGAOsXh0ko!|_IdGyi39aeXafk& z`67BSM3~3nXlYh-_OLoEk&~L}QM5NKVboB`g=Yja`J$7bt!)VclsH+`V5m4@b1WHZFgT%lqgeq2R z_Kxw1FY+kwXS5hXvL&EbCkKy^4{@(ix`yt2W8?L1i+7aAxeafc?*jHKH;WUCr$>t_ z5;VY=6Ew9xMSl_o|IRc-EFPSs-tbX6M46_7C;t3Pf~wT#PW$9)&vI6(*HfSagNaIL z$CrNiln!I2O^*mVs9IxWIE8+NOO22&5ERNDTq|~S_v}@{{|bnw0s!BNnliVyW5GE?{cn1-51-oxP~?Gm%i`Tt@~Fi06p zFJOY9TCWy_^Q4hjkWVp4#K8f??>sx4Wh?#CnWH%&YC&I?wP0~*@@?Pa=_5!7FYZNB z=+t!czNakbbk{IDxyay{lcg^*SzMTHhM1=+Kz$GgFx?LWGLv{8bk-=@SCRQ|+CxOv zmAm2N#5_1PkglLTwy3!aMC{f^cTR<#((E(DngFV%1gDEdn4S{NDMl}ONv0|5JcZNmK5*dB5L&w z(DxYi*GKPxDgR%Z0&0&>3db%}9(3S81f7dgmYB~0a3_*_2?nO1KxBTu+(Sj&;#Hg) zcmuTzR>|aa?&Mf*W6r-$*n$cu_Nwxzn87UWlQ>w)=`VkV-!Zv2ETnyPr7@EQIAGR( z@melKBcY6A3s3_8jZ_JjsFDy^ zR$RFRiqdgU^hjRue{z-8&`IqmwDyJp&A0!ePuadrMYJ;uR>W??*5Nc2abOICQ3wD5 z3xm*_pbCY*Nq?Vm6wn~(vr2S2dE_7wB!iBnz>cUT3l%mgr%nt5pHsJ7P6*H^zA7h> z$Lw8BA8gKq=kWPKU&ea=7h8BS-!`Bzm&i_Pu8$IaPJ;A?#4|}g4z#A-!Avi~%Wwbq zcyx*Jm9l=lwD~V1J~JMZ?#b)bZ`GEVZa~d#V&2wB^Kaq=Ew%v|^OoP}X;*u~DRN3F zqBN|MCt?BYN_B1rQd%bP5}|l@?G+IaRDz;QM*4TphJoL7myS;B%S86k;E zexo$0?zF|nK%Nr?2&$9Y$FjJf9#pPG*!b~RY91fp!*KqeA!7$2@nAz#dT)4oiAZt5 zRh%JM36n(#lcV|W?(*d!Zk}<3HXo|u`qUx*%Yu9!*SSK8i#rW!1?cq6M;ZXIandwu z6f@|jwb6Msznpc7E;n`yfIdwAi{TTm)&C~jA$A!7c8QcsLIlYSnNOfJkLejh+^yre z3i2HANIweH8J^yad>Tl}+g2F)0Kj=kMU=R9B=-d|Y?+*Y!y_K#2h}F$odyml=dX3X zsqUik3G2~+X3`xb%)^HLh0wMatP{c!eMCvHAA!^D_cx_^=R;T4=i8~v;($K@mgPht z%5(7x83?!*tltM7h4*(3tUq1G9)TW2km|i(dD}r%G8f{2?{lNWgYxp^0nY4`64|t#kcxK$ke; z8-?6Ce+XuNCI!LufY?E~(WLjz?aX9ulKs?)jr>4=py-- zK3~L!Vr@I{V$+Q%szVgp@8%CMX#mL_beHx!sPTsN?GEt}Cy*Vrg;-1ax}Y(j)vl|2 zD-v6+Omktj+YFy&h(Rp-oSg@$o1&2KiJvOtw0-gQ*`|5(HdBl%R* z&-k(gOfwttBrov_LkQ%5sSI4@d3go84mH?C*R~`|{4{Nqvi&$U)XIJtfLue6U*3d13}ZQUIG-4)-pd*ZP)dZ9hWb^ z+>`vNzorBAj=*=^Hy6rjC^`hjg3i;Fgty6>YWr_|cxLyKQQ9bxW;h57(4je`{Xh1p zD=drk&ke`gB&-APH}YVjH8U*k!^T6gl$)ucCX`NX(~s+*?T_}M*8%97jLOvxw#kPE z{QIw07Fcd#Z^2nluFKu-l9SA^Xtb9)cH6{;A%?-aO}qyNoB2B zkdLsBKgK&y)ZXLA9`ZA3mWqhkht3_r|B)_`7*K#zyO20-&}HcC&X!m+=dyAtcrv=- z_vuv|!0NqXlzj_j+yfFrWOHY5;eNm@IBNrLB@DiHV5M zB19H!-s^Kz-T@ss^r3X1<*ZmEt3#Fq|442WPM)Zk$1rg9Fei!St3+O&Fm*pt9-X_Q zG3P7|$*N$}Ub-S@#5-W6VsVxwFea@-lX?QXsmKsC+v%71h$1iByVU!h($VC+Pf;A7 z(I&yHc$r7sc9S-Vrz47xHM5w{OAM|3_%bQ~M%WbqzOFI1TjaG25W|iis@~lGeFkBz zm!#MLT72-qUcx1-?%XCkF14xn77(h14;hM`+F)`f|pf#{1Pb27H)pr zhYr?|MP z;^-#8#km(EwTaQlZCO$7*o}TEh@JBDX!}C3Up{H-sMzLlN7YgQhJ+R8IL(X8a$DC> z#{Xa%!d`4r+iuyfEKx&CiGjbGlJYqHb7_ftV80t%fwqV!_y+*>&8>rc;~3a!m19oo zgzEH{C)OtdHAbVwcH;uZodilf5AgJNd-8q!-I2+^9u_+>iwxoKr540 zd&Rw;`4Taxp2A-O=qjc;_gnpm+PY)T@S%2a11FC^N~Hck;XFY~b22&PVQJ3>r1t>o znV1RS7Dd)wFpzaG+CV&YcfiDlh-A1%hMxM?j&A;T4yr|u(zr`2=e^58vn~Qfb;|Qb zIF9Kgw<#7+(6T^>0th?FBJ*2Kyv1S#KR^&ZDA94^gjnI@kbU zAi9FS5Qc{bIkbT`I(pVu%(b+CmnvAx@Rp-FbNvKliprsH4ELh_a-Voe-B~WM-2iFOPN5~ zFwmZg1fZ{B@Q|U2Fqu^@0pdxK{OYTjOo@M>?496WvPT}eF*i=GF*Rz$$IRL5eySH)lh1 z0@X>wLS!<8!s$n0D#pPVfm=xEpP4PIp?ZHs9@=DXeWSD(n~?P`Y|m*#(UsLktUV>? zK}>qPaI@0K)|a(lcx(Z{tU3J;#(8XXhTOuU`p?^3FtDN{RO!;so4xx6QgG#c@TfSe ze;)YYk+}SkFEv{z;6Uw)c|C``VS5f>$z;xq`{)S7ya9`gYygw?q?-a5t{^S%7fn1Y zVsW%w&hQy%Dr0^^Qb*{J;47$I(h}ncGUZkTl3APIjvDFp#s;kRKnYpTLZ&~YRIp#8 z0EPlYHxCE_G99qzl^~6W*RD0+XC(!RD?xV7QQk~+{!3TiTqXM_YRsgQy*dOh+GVdG z9RMxgf~2CDDSEId|xIx9r++9kTivbb?E6;$-L$n28*7VoAiS zZ=9#~Z8HQ_g!`gj5cKze>jtN`>aeF_L;*5K>G4&QfPK7pK(KFN<89F#NT;+K`O;{8 z(&o7+H91mx4oO=WM0;w{dwF|K*?#O6bqE&Sc@%mD_(5LUEVgZ*S5#FjjP>$X#LLs| z2Obn8RxbF%XWBtJ6%_)4d2G3?HyF2%E=!^qB1VY$4(E`YG4{Wp*VOF&gspOivCVCttw-CsQd2TW2{r?8Q!jCwer`)8nGN zZ7vxwJ&!U@9+|;9oHx*|n&PNb*W0qwldT96YUn|H=;IUy|J)B`2-EaK`|76850uv) z23)!PF!>lM!oxIXM35~p;zOsCdH-{{aV43X>t67nDb;<^AllalT z9rok4e z!Y)OoSS9<83(A0#D>Fe!z4UIN08?%wkh`!%+c zZiz&nEHzPjcdjy8!M^g`JZlnE3cs%#S=4iAsas^*WSg^LH3-zs+cu#OQTJS9`#ez_ zfzy4`CfkiKEX*tG?OgU|O((#D4FQ3sSvcxfS~G>V2tffw!}>O7)Vm**YJ@Z#LmdC* z>vvzRBpQi&d?R8>Pu6<2}8DhLNrFFm`ohPyHD9F!N+iNWP8 zt>>!Cd|)fsrc&p++oP1Ol5S}1!@j9Kir#oyLi&{ zLYI1(I^_$JFW`-6NW-4GPCSXi+T6f@06AdTm`F^OdExeQ>&PsxCzz4scb%j?mUr)a z#5F6f@B){Iu_%ixsO&z`J5;sbca8UAFhbJm} zu5)VT${$vZ3JU9I?M@`Uvl^Y7)a#w{*CB%G5z8fiVF#?T!&I2`vM2;EU1kIJ1p za`G9z@ueeE=&xCs@h>ymvijd=n@Z47v1{@U1_VK~@yHuoSz^)c4^kyl<&QVMltgV_ zT?omsMEex;ta4pI{d!ZMCZVR%m3fYnVx^Dah6-(!D`M8;6#7$VPVcnSmIBeNZKhYV z<=JyAo9wXi+V;42i*;j7?^fsAo!fsaqJzTy<10Ci|C(W0+l5%j1$7-yuu{hy&*te> zqxzmGe8hXPxO`3YZh!DLlXykieliPrzyCP%x>f7%+KfivZk8B{cQ!ndC|I-VX58UZ z9&+!Dd3WdOB!$rq((p~P$-FHaS7Fs2KvWOYE1vjyc|r5b-_p=l%x6cGSS7q#nsb*v zMZFcu;wt*&@aWbEo=KtM`g8+(s!ZNg=S%d?+d)1C0sPT^ExoN8O-jk-tqfnx#PrhB zFsn(MkqnyP!Kn5jkOiHn(+jb2G2mmzM~Il`&A_m)c{nr7LPjbNv}U|JowJH0l)rPY zw&WWrqm;IC>{RGYow&M~byaDl$qV%f^`gy^Ds0vtW}CmN4&6dp_3C1|O4Tou@Y}W~ zt$GOKWyRj6hZ#BP8^6pO+qCONzUm6kp{e?&S*tn9)S0^s39s((bI&TT-!n6)?fj<% zrRO{qsHkB3S1SCn8ZKU)oRB0A2Rq(I`>PO#ibj7;y~%;q^7eB+yEakQBE$?5%#>ga03#A~0i zyaCFxpz3Cg^HP2Kklw$k6L_=o+S#8STcyCMX8nUKR0R2!g39r^Q0*?}_c_9q^P%Mo zbO!bqGX5U#-P;{F!{o=HgEY>bD!i@}{CXtT=aJY%t$~m6wKY4VXOIY978qb_sv1?zfH%yruz^t8YN-=vW9GT2cvR^XuEJz`de~cui_0c)7~ z%Wo+|<>CCu>jAr*R%HQScgc6RM7kU|ZGlt$z;(joNoBK*7j{2%qGM2RjvQsA{S5kc zlk_BqLks;ivUz=3;HH1*%%94B+Wq3p=_oU^R4%G_HdD*?$o!E}1{x}r0Ztq~T6B8x zrg|$V+oF3tx2Mi(=dqciOU+41q!?G^ns_t9=smb?@_m)mYL%l)z6WjVQh*<-Z<+kx zIKS4XgL!b!A(8zS#xazsGf`5(w)YN8ZYlji;Fz&_s$aB5@A!6t32oAAzPFsy^gnsN`&jaF&oglS{-;L!j+S8V zMHl|othYD(ANs@XdhMmxbc_X8n$*AKy=JdwyOx!NE}o7EYA?mO#Pr!8!9v=X?u%bH zre8ALjmy}$!BHMl*f<59cQBe8bEZMo=Ph#1QaSU!DliH2Q>nW2t4dHlF@HLDQiMQ# zYGGx0>%ogb3VAnoPs6iSjY9aFTeX*%8axhY&j5#KDc@iXXGo%Yua8aQJCT&E>lzhTTqYqVz9x`J z3*~T+J{Pn(yppnb8nu`25+(84yfGpOJmYLi(ubt-qkpA;SFXF?$zO#PUKn}cDD ziL3A^nC>a)vA*MW^;qB&l+mNI;}3@A|G|G|)^Df(bPPlg1@>X;brKAl_fq$SR*W7* zZ7Y~E5_8UF>h9QAU$U?M`j$Rtu;j&yPSOkS`>9$ZO;a8NMqzM^g+}_C)BO5*$?)xWgM61K?LLV3%cBTdJ1|pHSxadRv9k{IGpHY5uW)B6 zoY^ZG68MJb!@LoU$roIrN?-SyGnXkjoA^2Z4_~q#v;~>*H^?r^tY@r66d%7VihcqY z3vN4BeU7UM4`lj{IQ4Z(DtVrb`l^w%k#U@GzANtV*!ARx5FJKid+e|fpuCq`a^N&-?e5Z!&=5~#ed$o8-Hlc&FCRkBdl^f+0Ar~JPqUS3>rG$ z3HorSNW3REIo4R~iF_8OJ6LmD>O!G_oi^VWt^PP~C)uh|U&1P~a0xMpkyIb`a{Kaj zR_Sw{CqsU1e+gTcC+feyr4HSRzw`7C>=_Z0YIm%hDwS0RB+>%!_k7lV(K2NY zaU5N#nVK(HchTy|Yhda7?eTo9f^+6gZmBgQv!`&}r+D|7eDdLVYF-gzQEO_oh^@fJ zM(Rt$TrVoMu^;M(T#>XQstEJ7ACgx1zP0q+yU5#^e>JLQdit94cRpOv%uI< zg3oUS#`dg3{&0-pqCGDB8Zq#iIc-vzbo?^|WmSKOr?T3i&i^6pESu_Ry0(qGySux) z26qSq*FbQ0cXzphyA#~qA-EIV-EHF=_I|jl-hc4Um#L{)v#PqMXZozJUdQR+RMzu5 zRr}!&mUs%QNP%cZa=@%{>co{h-_?rb*+jHT%<7u1-hqv1s)-ERP4ceQe>D9p^Inic zw1??dX*V?eipeJ!zmQCBGc_JA-q^7$iWJ6XH|>Y2kDiRHKS)(TJAiIpR!XbmUi3ZK#kDu4y-V9^yTe{`-T38$q*ZZT$G_GZH+x*~1 zt-3J_uAlL;k9Dg#2;C^fS%qf3HLcP<>DC?U59(QCO|-9Nds=}oqk7$HOG3&)tSh?% zO$F8ZTA!0dljec#vaQ7TOE)O7IiA#x8#8_Ap@Gi<&g~*eXO>xle>A=E-sSFPd^{XI zG@q15#V3Ky9J7mQn%;1SiJO5C;_nP`{l~WsE#&DTl)FW@c1J-r;PANP`rwiJbYTk- z(ww23{H>PycXI>t_3fedh{&dxJ5{)T)-6_dB!lqJp+X8^N)(w-eT}p?tf<#P7qJdv zofGn|_Rd*V_@FSZy!S*OHjN*+@kctmK7CFCkdN4_oy$1JJp71P>Ry)1LSqI?@1~%2 zhJmm-z+ljzSe@c<1~0JgwTuwIiORA+wfR_A{7rQK2Vc^e22}+ui&~`7Y|{jYyDH4p z|8<@k2S2j*7P&tpT;2b5GCQ>OwzkS>lWP27yUFk*ttRU7f$0q?|E!eP`h$COIA``M z^G|qq&XJtw6JBp=f23R-m5N zvG5v}psR#fmtXh_8PV`3lC^!@Ls`7`1D>jGH4UNggnBEn;KmK^BdM^}*W*ye@8761X${+WF*H?pd&!pMN}G(EOSIWzFu z%Yx3_*On^U34qU!qFV~fqmXxcp>uOWo2Zu`82Cr0Ec7=A8 zqeL&-?JBfmr+(Qx?p|wU)I6AG&#rP8yb+O|@S+B>D<>NE4tWtZ30$u?67fWM%6-@h zZw<%Zo|A%IR9210AQWji~;SJQ+Ya74PPKz`pZPH9g9zw5I@C!E0+Du zv|TQMxFrpKF$%aR3gWkMYPK@;E`P2sT7kOdoAx7kGSMi==Ey(WEuBv}8Xfr*553>j zo&vstRzdEfHG4rQ05ZAjZyu(O{HEv^s>?*JhF&3cI8U%bARnm2U4}cmDlY%;=iOi~ z_ny!;y-K3JonT*dXM%?3NW`9EQC;bl4ljr&#N{kS;7&DrJgQ3aM8-WxF`K0w4E=P9R3M+8-=m){m`yIZxlnH;a2PP@ zvsH3+iuVNTo9gH185z&sd26DwX7`;g?L#2=NlbcEu2Rj2_0}(2e`j^cJIE+tKc0^v z+5L**9n{|Rm!0l>lUoOTdPG|~&r9mo7pspzl;8XQvsXz>EvLcw``Ah~dkv?H6PQr& zv*&$dmF=IVsvx|tN$T^ci*n6a<1@iU0@8H}_B+S{N<1*`ed}M4(UyhquGHrX;$?pK zbccz`Sq2UN9K2!TEpG=9s!?29OSM33TT^5IzGF-oH(z(_*t6T)Yh-3DT@l*xiJXav zX)PE@ZIn@rEJ@htLic0GtYVXt$QeAS6#^?l-FYT{eeloLgNG=t<7OtlvlK$jjhWeS z*+%HtUDzCxiMnxrteCSs?L=EE{^UgaDBrVtTb1`+wxs8Br&8!4%3hghW_D&KfE5EF zn9AcwV6M7Ve|RkND%NmG-m{JIh1ZLLrYJ)vsfyZFr_GEOEh_wJYZ+5=ERz!0!aN^=*pgb!enhq;E9)3dXWZS-N`Z<3W9YaOq1r-c z-2OvrZ3`Ou^TwJdwu}QW0ZxiWb}4Ty6PcUF>wvYvk^)1xj?N#l$B~4$47$YNO?a0=;rSfF6bI>*K|r&#l(rgo^$R$>(xG2J-X5v!=E z_?vQ+K6}AJIn<5#EvFNm-QHdx(d;y@f8TsJ$-e)-8(%jf43{(0FpY~4%qq}0BE0_6 z?&0zD5~gxxitQw5RJYv5Cf*^6fh1ov(jiPU`h63s&ikrvAeiPU?9$4a>$9pVvU0=W zb%$9pp4gdgXW+jCNGTpH4_M`0;FAywgCJIY7SyNvA2u<(gwZX>){?+=iScv!o}JZQ za@VR50_zeC(+WR{SQ^!=t^5>-QgpjC-R@6ScSUHj$Kb0#1WO*Q!#uX-;2=gGNmp9c zjx9Dd3Tfof6wbxs$|bO_&B(bn{a-^e^yf|S`Q6)C>0h*qvfE^gk$~toY-+aYGDwCH z`7N1P9KvHsEgD;dmN#+UBJu!AK8O*CcIq)|&I&%L1yoqWplLo>U3z9n{HkxtqDXng zSPAg&Mx}-hMTlWr%7d?%J}5Y=xJV;nd|KgjD6vY)>oln`;}exiu0a;#&n-p-SkdG9 z{Ckl#okrw@%K7K`zK7PX!bYX!^)gg&t7Gf9%hm33)Q$~|5dXeBrd(jfCTDvaJSnhT zWKU)CXkc%aFdd{5{w?g{nKFlOeKFT7DTPRin?)laF*7cu*6@-TY4GX8^&H$1Dxsmd z;h-u^R%B5eQN}%zypO<FUWraO=^D1hO9usaPmTPk$DshKYPd@}s8+MFUxIT)UkyDp1&oo2WnNIqW%N)hDo1 z#nBx6Q0W{-?ig=6*Hbh>gk!Sb^n-u;*Y?URB&jzPTaVf-_O{~*xHLco*j#6Drv zv~VXFvWPU-UFaXpRSZ9ehjgtNXrgdzTQA>3_tb0b zBQpPwZ{xQRoDs4=)l&+`W1eaRsowLVk^}XpgE=JK;q0ql2!yZIbY{pZ;Y}KD1ur%?%82J><47Vr3%Bz0E#vo2Pdnit?}|d@OSVbyN8Ddt6S&hcuT2S=Q3~pSXBS&7Oz3<=uTpG|ZP#IQT@OyNE3N}^#a_q(C#Sp1l zp5_aPqrfVqb|~IRFp=b$P*ou2aMy`q=jravo52F7m<;QFAwbDjLI+TS4$qFD*zsfc z*Cc}?xe@vi!`{svT}N?~p%%e-|!Wd+ECM0Mdd((NQ#5 zH*nhsP!=>GJV?63B|Q|8@s_*cMaswtjLS8~jwPKzVxi_*sWu;wr9+{8@e|GDLuNVLjsG1Z_`_!XZP9U{)BsK88tl zuY4l6tP1|#%A8KXo8_t}4fSDh?-Skc`5%fuj|<6UR<&|?n5&;*Ll37|wm`@$tyj3m zK=?vTM{&$9bW+c}wFIKs-h7~1Nu|es2lyzzw*p5X>ot)hhgKUap(U}9#l~6UiBNE> zs&Ep55p6A@t4Jl)BP6dw1*ujgENx1JT{eO#Ug zqQiF*pGf2KT*;J_dPI9pb^U92#jsu~MzNfPKF1a@L`lPb%ZGIeY$72aCCQB~b5>wu zDjht%8VwKk_SQx#s|xxZy1)n`W9$yl6rmLm-Oy44h`tqN3N3CBJ2{9F59u?JR!nxauPVNQCZpfz)+7V8bn1=Tlns%b3@~a#;7ACMO*%*#%GzW$l#O<3RgrK zpjC|V(u8)X`d+!Zo0NV_yVJIASOr=2^jn7v0fhvZaac>MB&Wa1YIKLk=tgm;4H1G= zzq4b6^emi+-ku)c(w5$*;#iqrC?C9DKcJAAnUN@nNzgIql3}Msn)K7e{Bri2#rinF z@y%NXcBq^%07J8q`-q$mj?>T1$-bqvz1`xRP`(MC?|3L)V;JF}BI6_4NuIkj6ZwG% z-pfYY=`z%%5JBA=Q{A#d?pCe!3I1mYJTcKg`G1)qTJ^2?Xb_en?|2$CQPj{}kttU` zFR~nWz>!w!31Go zT^1r%lRL64%348*7ebacRnf%CZ$w}IcTFL)ePZGJ7cY%Ce--Qv3vysTsVxLcF(TT{ zZTu2P#Vo{fi$NgBrc0bFbo(s??ih1v36T?WfpSn`C{-+EmC3rub2VpTc0Q2dHp|8gU6`$5N)j$!^9KgwD^K5&39Th#%C_xnoi*@Po22 zkw&riU!&mjA$b1Y(84|SD8waJw$TuRjuqzpcn4d9e=5OH1NsePW$XwwUQjX?eFO8; zF+5)mJK9eQ%cZ!s_F9@nLTk7oWxMl3Fa{_Z|B$$%=t9}fv<=cOG`L5imP~_yiGz`_hjBq)cD;U5J zh4f_qh)@c?{}tMXri>WLRDCxJpOldmE)EcUkW*Bw(ENE35+M4o01v9~)#ZzI2F_H8 zVbKF(hV5$=1`*0crV{1B!C2u^3k=#X+2I;Nh9O%}#l=|=fCg$fk4vi{rM2njGXE_xy`(364hyn^xegctUZwUHJTt*e2=&hm#4& z(@S3oTTsXWV^~21kyXn6(f*DCsPK1YEUJoU%KkV{FW>wOu*p-IfM)1(za1?Pxd_(Bcp&Tkvp{hZFRzcDblWc0#dzCXIt&D`l!R($6)rv5t;DHKeVIFcsBXD($PVfbB z0+~uA6Vr8+6XhFeLI(|*OV%zqFpT6( zv&{3G)z8OsOPqGypflYK`Xw_DYs~pgJaP{Wx&!wrHG*6Yqri;I!&p9b#vFEIQuYH7dL}*)wfkb%7q@D0V`8P( z2Uiox!$M<8O2i6SG%q$m1c~cOzfzvq zWvKf!xSC+cSd1N2VZJ?bmoKuS>~3|ik3FEr&t9!S6RER!`G~6e^?9+3dU))8@f|)= zjd<3q?ljNO08<3^vvw@EqQtt&8y*h!ZS&4qM8!3KF`qm4QWUOQQrjv?{C=kadmncZ zx^+1t-5Z_IQlyTI^hSzhl}N3Jv}nW($Bbyw+3p}u-hw4jVi+Cx+k5w1M~*9lO~N%x z;MD0ywPw2P&)(jcm!G}&3$R%!x^{Lf_l`YYuhJ~s-1o*GJKsf0X=Yi+MY6c=4VJ8e z?0v)HwQUU!N`Offp0r|3tqJ9xW#6CI(tU%1F05rd558O=kv%KyTBz;=AN$yJYqWI! zOr;B0AqaFs8CAWM(am<=s0Dl}z~9+K@;%VV0?P zV!Q>Mtiy^_A14@)HV|3^NA{3iPf{BHwab`_8I?#60q<-rQM6Lzg zl=pYZ^2zfp6VEVwKEcJ1lT@NNX01xs&hmBpUL604fw(X&4*9vV`1OS^>xue!%~2Op^4ObKu3G$}i|*K;FKV(+EjPelOnG;d9M2?4Wqqh;V$hMotuCH#I7hQ@m3WiW@K0C`SP)7 zq0Wlo|H&!xi-PdVLlz>XebDy5{_V&@zz7ElQfOZLJ5W5LliblmD21f0kMSvB1CN0C z#v$U`IaSXG8&avWpO^3Z&L&aVgbx6;e5j;!P;%AUF2b4b>n~|(X|cR6tbC>D-%-fJ z2W1Y>usmTvjucb>XXXD%q>X3k|Jh|%*Ue^rKNKHdf5=n>|6l58ds7q^&wN^i#r*+F z=+wRQ{=~i2df+>+NyV@F&XX>?v)}pF99{KAdcms!Mp>RlO@>md zybne`y*C?n^<{Eh&0gAdGaYTPx^+6{K0I8LZqV81qGw$?u0_5 z<-5L@Lk3D$goL}}y1G9Brt?ERKXc$8S$XjNL?Fr!6qBq#{)Y!&N9tSo=xAKrHJN!I zqj-M@mgwb1APnHJik^D8ttfE&#bvjls4viHGqSDCBmdna1U1A1a_#~z){M{l(m;O$ z${|EiE#ULQBjIwR?Gcqs#QUyOCF$u2_3@f?tHEX}oi*tRwXN0ZY-^GK&fOGy=NS#{ z;F^<(7>by$D4e62ciz|JpIekM8EHa7qSytr zM7oYcP&d2px_(I!&pW|yIh){WBRg0F{=>m%H_qkXHD_n!V>h;c(E2VFxYOnPcyxU1 zFi=c;(i5?F-Ss{>DhuJh4mfMw(bN+O0{Lt1eDu5_pU#<#8&xl{8VZPOMh%-pWQe24{73uFhtKt%v{3?c{K3bSYvKU+P$Ena}){+t1;& z|4~!J!sbMIqbJM8&dkis&1~1_5=fVkl{GOlH<=q3_0z9$rrXgdt&`x}f|f~vQ=4D! z)01(@x+B25*U~(&aofP2k8p<1&n1O%O4q(UOGQtwJu@!uAt6ievWE}gV3~tzKK&S6 zWa)PAz=sVH3$G!{yGp21?vKp@`Nc`AbApPYYi{qW>Z>)sOf>5D{8taZ)!1rII#_#o znX@4zB($>Xx1vBw3}Jt{Qg3p5pAGmr>6qj?an;-XX@|^ghZCVq9!>X!+wkIS2wV+G z{izn$ayT$JI{I||<+gDj-dS2@4lk(|Ft*~*+daMGApsHIoxj#-}+x{}pwnLAW-1xT`9!+Gy4+34wx2(Lpt4pXppqJ(iaq(_OMFq8&$9MB&h6kQC z6^frbI11Xn)xpEl4>JbJihWY9leWJ~(%6}MWq6p$24KmusulHU^iZN;`^TI*HulPR zdZs|wt1j{IgeVTi@a;|J*qA3n3a)3zR>Z8#7KQnNFSyOsFNL(!OuDnZva1da`r@HE zez#@wdWXt95ED)dpAdG?vA!f(J!>$OoK)z>*L@k5m#L~)$m>fGA; zFvt{`dpePl;_B>t_AkNwo*x4#%VAx|XcEX&43*vR+m_urOW1(T?Q}Lv6dOZn&t^7P z*&6xLp6whZyO1+W@2_&A79uex77x}jx7BQ}XqqE~+sQmCgi>&Yn_2OxWeCZ#GWFRc zR|u2{fy$dD6if)@%K_H(1Q+h+wE+4oOu&#o+mrt@%p739cJbs-OnKTBHID%NzUyMpc)EGHQo9MkD}A{lXOnHUUE)`CJsNj? z`C{*FJ)C5Es^hfY_3IMaVb^Kv{j4OQn{4~Ngf&U5%kFk3%ujg!{w#g$`M_gthyK0o zM)Gh_3jT#Ge27G-#Vcb>vx%gy3ljTy`iOs%EvY!t?qEr4L<;ny z6o4f`HWO}A6ruG2sOY(6lw=)ponGvn#h0^SuM1u9rdgtd zb3NQ2*r0`Fkszg06fXTDI-TwHylFMG#EaZtZf>$h@*>;Gl&R%EAidxf zP4|tj1!buv8nYxg7t%~}<>-hF1_N#k&FQvJQ@t@Vl@OuOCe4`#r4$qt$Pi3AobP`+ zidE$FJHNS-W<;!}9_#5@jN$K2%+Qv`iMlm&H7nERj4S< zqq@41XQ$mpaEFNB!!up0));@I#b)e6qOdnW^VIxk8ZlM;GL*fBsvjxJ*Q64#Kh_0D zb{SqzCUI?H>?hHQ%E7^LN6_s_X<9yEG>yIVIkveV-7IwMZTNE|2)OzI3tNQYb9&q^)`o~aMaiDz;fPdgY#fa1>E2e~=Vl6TTKLPu>U3rH8E=H@ zNRC-aQ6#|`(sZwON+->Lbv85TGVgbA`%WwZLdsk%EG&S#FQxr;HZ;`W)TCm{Ai!#{ z_E8;$TQXH6*J_eVk}(oL;w`gzZF(AR2LNGa68lTIX)Sk-2=9awflz|pez=tcn}8ad zm5o~tk1uh@YN?TVC_`qEpWn?9?Z^(zf&yDow=YHyw;9E3bYGittihT=5XH{2d?9lf zg=GBK3WHK$SxWgqSGh-U`}!pz%QIiCLBa3ePSw>;wv&?+QJD2FmRY8EmzP%@OU6!l z_H|~9GnbdwmJk0_j9 z&*eg|4^Ju{JH7)#Lk1``48f1{H0yWYS81M7t*Q+A69(zLxqB3xBYK}yHZ!MwTcGHZDgZ(NoN zog_`Hr>7M>;jL$hM+#%_jrZ(04HcyO5%EwQ#|C`m-RH9Emr zKk$3gN=QT6VR+4lWxQ!pINDYkNZpSy*$3bz5ALrv5OyJ{jn7?pnD%E`OwMK`!j+_}R%^#v2{Dp{iG~;a;BTi@;G0En}|Y$FGpxpRw0b*%E6dkuoDa?2;3G$V$Kw{$(diD#uTx3iS?WrC%=Wq?sYI%1F9 zRgC+@W{dGgd|7PocR4vu>0M)Xj{)!cYWDj!spAd)+IlAA_CP6M!+q>)_G>|&ecZz~@M_&NyInEzyM4Uz4n0^-KbZ6s zScA^n8I9XSClzYpRoBZR_db|ksfE1F^Vu;n;J3GB>}y`@eu<&?ye3*(0F4ZW`FT<1 zM(Bt&c#V~-v|M}zt&$5oju=aKutw#tJ&h#R8f@Ojn;Gz5ueEx}jjbd;d7U0p-ewB( ztNU2(e6zrNdY(KGS!?oLo1Kj45@h`?kG~*s`{ttuWA@f0FyOBo5s^EybxuM!SvfZG6m$Mtgc@#_)g8Ds}`5AB$j{Zne1Zi z;c2hb%O>XhxT>l#*j`N4IWS6)|3lkfiWNAjiHI%#mOfz-E^chi#Te)=r&I`gC)q(4 zn!^Ws1_|3&wH8J@eKI;qYpfPPX3vUM{VpO;y!fQJo+kzug;3vFB^q3H9nvlOJ2UaS z3F3F_Jm1jk>ubnR*2~S!MoZG7pWN`C9&PPji&zHL7a@UTiL>b{dFbCh_+a_2gG;s> zOUimn+~5@<&^z>3mRxm_%n@qrtejZA+S}`$I*ExL(OZ`Nn3)Zrc9@)w4?g}?0~lsz zre3u1bc!kKY3G+ic`&ndlzx%@{GFbta?OfC(B?a~J$ju3vHJDAe$wW9de>yPL3VJ9 zSbq~5ItS0_L)ZuheAO1m)L|NN;{Sc~^FVVdPM8}NRST31|!v4~2p%?O=P@6AfcV0V)6K-%xn zdGCkpMPI2jasQ#ViWsA-G80V*drA}4y5&o^p4^EocPwvd%@E}77@K+gmhVms_=~i5 zWre*r!{?;AbuZn|3_RO$xN6H9fK-5k$8k1o7BMGAg)o~gDCPk7=-D=qQ}|v!I0-^j zTz{4?tRYvc2p*rf0{Iyu?3gC4@*4(Kv+_By-$?Ee-bj1H>fio5#+=ga*LX&U8B{8{ zay`Nm`cOvdJOd)wg-8!o&4&<#M37o&^yS^?#`~00v8NginN(ymY5w}7{JV>&hC>%7rMea>1HoDxAqxw)aQ%p@3h=8OC+-q1zqc zdBbN5=EK)SaPCc@c6P+3hLEI^LLVUr&T1JdO11vfrbb~tOh0k;vi9Auhgguhe!a3_W+eh80(uJeDp|W{GcE!(xd97JP#X1+R7P-rCQ4T&HEOhALk_vD>uCV`sP(H7 zx6-}ZcDXUQ+&o00^`}?LV6OOFRcH}Gl4_9(O8pMRcR7X$izSA{a<;e!|^Ce!{{-y?KLmvkfh` z5)I~74JFiD3xsIT;lg42&Xv{8)N3*2rdC!R^f*@tQDK9oI%-xr94JM|CGysY9_}hb zK_ssx5TMi61G43iQ{0az+4jgX)tbh%^c3GA(eE9?F<=?kATM1cPfw*mXRiji)UKhl z`<>E8nD{ zEkUX&!KBX`(+qK1cG{}_DN;Kyw-n}wF2-fm?*fQ5Qz?H(-HhNA7m z%rqggPL%rQ-Xx0Qq6)7+zE>y+&!yHDX(2{$l*7iHm*B&C)z2i|j!^xY~vb+Cg_a3%tZ%XJ*g z{9ZvlBO8$jpkqGoQs_sJwZhDp`h6)qn-MeY9F4$b3Q#6O!v&EssOU?^;oadgp-)er zOtis84KDcXRr0h1)vDH~_^8U2;Pmq4SuadFap0(tE=Gf!)Tljga#)`W9XE7l#R1G$ zV2;_KWD9>QE1kL7S<}J8Y6u}C3d z{;BcsFE3ZS?c7^4IOr-^Ow6RDq+B2|t)YO-yMBld_+YRER*(~xI89HQf_KGo7?Nx0 z#A|n`(LTN8W*P^ckp&0cA$<*!F9wy-KtEvK>bl_WCGyut(C6pNH4I2KVU0MS)$ux) zRm=}FaPfXvbXzn`^!uu5#j+@&___C-sTI2D5DpCcAUY}f)78~EK{(|_A5K4mC7yaN zT5ZGW!y|><*yF&CI|gG1Q!0&yxw0HgQG`+sV-kimGL&(&*o2S`6l}k~tJDEYY%4Mn zh0pY@lrYb71tmYy#EATivV0Z8$%PEz`mg&2c23pNSe6Y1A+& z)Jjo*{t;9)1!&+}o&N%bom$wrnv$>;LtJyWhKmDY=7hm{$$#L>oOQ{s&TtHbeVsx3 zF+g<36rsXo(*0ADEhPMPOcZ!wU-ePFL5h9!K7@YhVz|Zv|D%GP;3d)V{FiNRObN*s)i5Dj>nUi5SCwa;) zIrZ+ppm`-U6Vp>xPhl)nNe;nyZ`QGJ3y{-X8T@=$A!Kz-B3FsgAyfLl6Qplg;^yfH zeh@(gQ}^SpZ(PO4&3AE43ypwg*GcR8L{}3^>#Adw(#KE<5la0vkeiAK2F~(H@zTis zPc|wW0;{%dL}2@&!a!=MDLi4Qlv;@xbP(OPt4)SK;dabvp$tVnw?2W|(Wfv;rvz-i zxz7yOQPeL1T^OOlu!0US7YfAO+r~F))zB7i{riH8wW-dALwAESK~gKnH3@Ge6U@nu7}Z0Nf>k zVP8}7uGqkjs9UOF$cnjV~+w~=^X_5f85pk zy##4|&;S%Z(+=fdVZ3pSJ-I{>i=@(dsee6mP$%&W-WT!@Teo0;PvspK8547I@rN6u zY?ij4x@4FL7t@oOOvXIY{zb(72PvMAL`xyV2G`?%*`QH9Er{jy-P{%PRfXvO8(hhx z08qhy4$!vtAiSZ*({neX5?9%(9^T~aX1!CK5bKsWykuScbqJIvI&M&aLMFDg-W=4B(IgAgv3)1IEgU3DAbXpB zLw^tYSl+tuZu<|*FZEn&tzIogW_b&nVif$SlObsOmS zZ9DCL7vaMR0t`R`o!<7~h;IhXftp)_?7ier&9@5FK z0ym=BV9iyNot2K_%^#&pAwUrLZi$*jZy?20e^#L3q*8%yjp2q0uOdxhuB^6?Nx6&)A5a58kZ5<8g+k%*ZhAYt!VSXt#nS(O38fLp?2 zMw#?Sk!Q1h@Z0yD$61adB6u8Z>Ytn1U*DmP&J3Q&sN3&?#WHAhn zGy#Y8b~o_;Y=EdR{BT~fu>3aOB#lOx@)+9H<@wq==EWI`muL8psBV4EKXtkGWw*bj zmx3&|zHl-sFNJ5SUS7B8!)S$y zq@ro}UhYvCVa*%3BYt!Hh_AaCy>q8AJD>ayyugqku+K-(4oDcB4b1Qz3M+axodXSX z6ac@JoVdak8u~NI4eIR{dN<$KMEttXDl7$*+8%VIf%-~n4&I)FehJjT4m2JNDv1YU zAhxAj75sHSKXP(wp*xz@$C5faoktP)=}7nROO)bAqN|k_O*US7(An9TX>NJ|#rT39 ziI8+IUMw#XM)g4DnuEHFNr>(Zv)p{hMJ4Nh)g{T_{NFYSibA<60Q%3ctVY9Pre#Z~ zQq)G{P5T>=h{)4u^-E{JKCGvCY+aRuwMb>9HC7N`6Mi`-7etvTS=0STLMxt*{X&x8 z$8z@Mo0qS)T28DXsLk8+V@F(*w;Cc%62t88C=fq=5Gsf*@G2dDu`@R}3%hdum;(x8 zzyLKsa>35M0Yiwkchx%K0aWxPz_nwsj7<3MUM*E{M;me%Z(ESA=xy?@8iYBD%ZwfMM}_ucpEUwHfI;3WC*i{d%|UuNw zivXGrVCXc4e~GaF8bLbSC|Dc}1M0V9G34rQ>~Yps@p+rJEnsgRJcTx_s;|n-L)Rm6_u}8*je-Z_`#1?Q~Qj|r&Y^huWRXE z^F%mh=fCoht#8n2#KMfP>?xdNiv{b)#+ToS^3RfKypnCatTnz>=}Nnx{%==X&lBls;g|~akWb7Y8P;Mmbb2^X0mkRkjO0fEc9LN zEcKOnxihk^xHDp&_1bcD@NjnKwI~3E3;Vf0!t{-h$(C0vwScz7Bdt67DctEd+^)R=Z#{X8= zs-4sACa)=ImZ0-{LU(N>|GteI z6xFYEjh_w>3b}F-BTFdNjatk-Q90GW8%*u~_xZNDQPAJ|p|W1kU;7Dp)BGcXJ!$p7 zU0&nEo=c1U)RM%ZlE#Wa;g4m_+51^mWRCK=$$ub=zCEDAU1GVj^V7y%n%pg__*==K zv$8Li72ou~9f1u|8-aOJqQqlbqKn@qHxNY_?M9?q`yX`+y z=Rk87f|}0^vCG~MD~@le@-9zqf<~E@#GkyANKWD{$Pv{6~E5^ z*T+ea`1>R3fH?816?72cofACh2jLI9pm3s|fZB`;(+1iYarjra|K;s}sJka_0I&Zq z)&vg3HI&pDVEAvNVA>?^bN3Pz{BNYaXbU94%$q17WKH&@Faha}bcWGGPuAP>K>rN&xPew0Wd%Uem_ zdw(I56M1$61JT#eW&e(fvZ9K^=Zky_6Vkq3Wd?=@*o*>=9uRabKFcGf)p?T-T z&D)u%7s3A@J_{u1@33e)&{s(N%{LTPW&cfSg)bBymFl({b16U^8dLz;FAoI2?JW## zKrRyx?QKK5lW~FGcvE@$%S9P@91yi@QRnIph7XD_h*IhkA%leOD$pIS_kxHn8Xjti z?4*2ERfcEEvrjCs@4nEahUVwz9kN%5wzfm{)nKr!m`K6taJh_sk=h<&5XvijlH>JS*r%IUi`amk zGEttcr~&5it^|#xc53q(W6(xLsX~yz#I4^ zyI_WM-P&WguJ-Kw)2KZMX`PbW7)1;U~wTy{%(woEg7R{i&Fnu7u*2Dlot@#Q$8ie6IDp^ZMut@Qqq07Z^TcKX`dq?s?Pel^<%`(m$EH!z@bRexHpD;h!)g zD}Tby?zYX}l5W#PAE=0+3!eDUv17-EO*Bb?NJ)=Z(>PGfy~Wnqm3VQ}V(`}rR_-Q# zvGEr?0dy+GoIolM4~294-3krD6y4GV0$E}OEb7M(bCc_H!|cUhAllPz!qk{YBS(<* zyO>>Is@Q_Y4fn8NW|0!pmR5(6w8mU63}y`!!1xxqS$$!&Pt-P@I?NvE!^!T9Dn`Hh%Ev~7n{wnzDQ*aCC2nF)#$vb_W2m)8^u|pFX zv%H)q^f)cvf{pOL7@OAg{%nD9bL|$3pdw%z800hr+6M%LTED2gfA&uu%$0uPe+Aqu ze!3BU9QA{98o*q4t>?F7qmDBmLaubzk8Q%gaeJsp%umAc{S+HqutVOAlt$;<_5OH1-79m zG$_mko<4EkseNT2|1&K4FC}Y4{QMMLtYOYxnH{{Vs}dJP2Fjw_;}5_C#q@)3q1^>4 zRoB3y;$VEnq2rFj&{$Zqy!WC=#^?8fvI(!)k#q*A75ZIH62Y>~- z{{|-+nQne|{3Vp0dnI5~mZtnb=%aJUx(n3v7|o~-7@%1?O%`{29Us3NxH+7v_W70K zqK#Lw!xxyNJlFAUF5=-_fcWKPt-{>=gWwSR@OkpYGU_n5WMN@z9PogjO5-j-M4Ew9 z(VXSokFe+r62b1M+@b?~Elg~45;EQTV@+n#Pf59%b93Z%YnS|PG5#w39%DCh`YtHC!-8M(?d%9L*ZABt+_g*TY^f;@IJ~#F*BdtTf;M@48b*#n2PaPP zu}iFWbGdYX0!-6Q1BwO(k_ZdGO&^I%%wMjrGy2w~p(p2MsYVicdg|-dAAjaoD5X<# zVKm^VHet^Uo|q~%lnK5{iF`Epe1Bu(ZGN_KA zTi0lCcXtc!4#9)FySuyY;J$GW?(V_eEx1E)2@+g4un%9={c%s#y{FEf>6z)7p025$ z?ls+OJ+EGz5*|AoRj6-8H}g621KJF-<#5GJ^p!z}y|vpVOs{3$XUK zhej|m17>)8Qr?wuhrVTK+=J3uihfhSxbUSUBysB+s=SuB(&nt)hRR$jKMX;c3{P7R zzmHF&c0fk}xI+(3Z_GDKMq~`JwkZ`swGSXjhw@b_i~`snkw6xyT*d`7J`1d zzDnxx)e9md;CgxhB7m^#!`{UhRg_*OKEa^Q5LSSN7x1(0X0`~-x(V1{#K;0BO_}$! z#5K$Vev7agf1E$RN?p@o;th#zgTb3R{t<442BmhrC-v>O!rH>Ah=7Fvob`b2D$>D+ z{I8+LByVR<>yV4*PRqN-zKgPblIUHduy$8jr(@u1L<1(n>sGgyX1q*bb$R)T>GDt& zsgS_}AnoVd7IYAAHOrq_eE{rha8ljhdw|sZP-)GGXWCiSvA;_o1{0#gD9yf{$lO1K zz9zu(;d7`9C*s=2l`2i30_F$9wBRtwep>r5rGb^fH@OP`RJcJ!JX3&<)x*fMB_h7p z%Lxgd3wZq&R%n`GVa0MTAed9u$2E(7-MC_o#g;@I@etAGBj94CDqng zbvq0WrGOwY=h1SRV_9KYQLanZ)_8QoxpQ6f+ZvkS;#*y&tD4&uCYxRc0oTF)vT&WwMW4Q1mLU5=bf(y%8Uo1CI{u! zovAm2kvE85_2Po4Qma3YC=tX;x;qSEC94?+U*Sh(Fqmn*Vb0kbY4x z9T3%5Uf&t+ROY9iV+|DBGBC_TzoIl!KPve4MI@IrV0-w!PBgtYVu6vx4}PZw5h$>p z-@Bmsc(sFsh+RnkVf0KZ4L?>sIwHlic;ZbEt&C}4wNTHMFL*su+&onxva537<}PPk zQ5(Xh^$r%1%l|5Lb|pSAGlD|LkRjvyQ9gAP-Kg;s)4)&{fr_b-yvECv5NDqI4i5U{ zjK0fiKU*Uo@d3eUF!hGi)KbJ~M=fKgsJDr3scq><_96E}@ys8L@Q|CQVLU1sh}$R< z%eb0we08$)bcA)*+^$2*N1^#wTv+yfPwv(7A^f{-54`g5)Rn4nU9m`pu|fX%Y-RmF znKMwtXUMIkAqeZ{X~-J$Uw3->5^rk{YRAPtAJT^k0Po0y8r@s=!|epttM_8*KZFBc z^_ml7fMy{0qvTa5t8dm%RZ^%@B(`f&&*gt=Aa4>=ykG;e9p___n}a8;JGj8+>*)O5 z{LCG2&JVgEs6LFJWG7=UFL0p4k&cd_$SHXjEUW$fo!bunr*Ki7NjAEWsVQ;#r;l8x z!ojJ^`;l`&CKly5cW@WRhYAI2TJLjU{zwny=**ixN~}MPCX}&g>?Xsg?8l$ceXp_w z?+fFmcF|bZUO?aU{>M*3h#haHe+~F}*WQA$fFERE{pE^%pd1+ z1TZ|IkZk!T&{GVd2EVXGoQ7qx7~+XUOX5qi&n1;THm<~|KSa={R0rc$(mu}Br^?d zP^QO-3EzIkMnVclHtkXYPBC400+ZE$-YT;+!@N5GL>XlDg}h^It0xs)>k%jp8U^Is ztjB?c8BM$fFIIb$;T~9?!4`#$pW>UT_Jm^32?cZ4CG@wg)<)YN9y7+PZ~Ey0@6km+ z44LbZ1}{fa%=_57|84K{{vzjpEO;$=B?KXzRNfF-D=SgJgT05BZr_D(=}N!7*h|0D zmOnd0^o|gZ!=?1CUdNS`I4ktS>aV5zm9*hjC2xY?O*lA}6KB;+G%-(bez%mAb!~*v- zbiq_sxo`HC0cNqU0AcUjm-m}(S20G|LV-_qbTdJ~m!WW0gI;gY!sV#DF)4Nxsnf^) zh$)`)UUkFm#T8l*tB}VHwuo!bp5LnH+C$+vULCiS%oebVyQ8(^eS{hQe9ykkdArvg zgs9(co$0NkqNAhZvzB3MI=E`O6A_5_7`R3^8@TWG)UkI$D)Kbqp3l_Yxce_;4;BqC zps|4V?fdi1b=mc=>%K4m!H4Ga>fTNS0PiEPz2H{Ew>m__w8~{UqpDuRxVl#}u>95N zVFHQQs2wzTjf7_WydSP?)P1wRjTdPg@VxIW9{(Ek+TJOPc)u#@q z$Mwh)a5hY2QNXJMsXe9rv)^v(yzZPw> z5K{B$Zm4Xiy=DzJ#tqVZ_S|a=-@yqo{tlL?@YYq))zS4?&#*L33p9LmT=%xz$p~yZ z8O`hRk9ZQ=x*N$;p5~qQo*6ohJZ7EdK9ZSC$ly(DO9Pj_P2JW{_OXC}y>;DQP4!_5 zRd-j1R1H>r3aZw;R-K(!Ial{qzxJM`oDnU1S4UQpX#rH)Vs`9N4qt=ZwO3K4>|;xhXOgM_|tksxOK+zqOy)wi4f`v z@A=-NU4c1;_NgE8UD-CBQh7Z!wR&$Ow&@WOw;hMxm3u#kxe_w(!qyXH@A3{fGobM6mz;Zi`!`> zqkN71S>1eP`-#PsgyMH)r)4zNJNGGV3ah=@eK^9G<#tNdueFyGZw*Ag5AC(z|_>fxY{=A)JANY8VRPf!f&67x>D60*Xc}>ggtBZbn-ao>NxJ2 z(I0FpQ!+u2rD`)@ZSstG*>Uf6$3!&EfNboFS>uu+nR;}cniqBEPaIz5_d=co^6H}t zsf}EgOl1y5BuhnXUfPX?-CB@FFo+r9D2W4ja>o zu9l+#TBYf90=K8udhEfuL3GdZK? z;){mp4?Ypg3nT7E%Bf*p4aMO!cEiyHjp*w1*+#kPO7r)H#vp#JX7W0SWyua8jv;sB z3dy+=w`#Syr-mZ=0DELrG!MUYryUd>@J2aFP@wmiby(_5>SZLMmepKxI_$(vW_`YlJ_j!gf%iut0A3!+Qb_W0s zI=gaLUH|R-HXHCxuiUibaGWd-h?Ris4cYzj(!;;u7&Cnw{Ac>;{o?$D`8w|qu=3C) zjC))IUSGM2ZpZ?Bd(YFTF30D)%UV_D1_{|}gEi7y~Ns%wKw(;_|kn09QZ)fX|FK^Aw zsTmvZ*f{d(^&X$9GX6c3TvV+X5)@y}0+KTC=yo#kPiqAEgj(rB@EcX=Adnnip`|5Z z;9@obP9kbqrOK;!_}f29!&2{4bNwH?i+tF{diIW1AE}3FOZwghV_CndEqM1_?;{N~ z`eu#HW6Wb9_%blaQ>L?RZ!H9j+BphGj4rjQj}gxO@?zABeJp%InVE6nYE$o;|KsHq zSx&HR8v&{fsnu`mO|27o*BYpHDJAniul1g4b6WE&D}AUH#lx-{^ZCj4?hD?;@0z3< z1NN%#1RNh`rO2Qao@0L!rRshwsFYKeSeId2|C!T z4$6I1KDN3L?QZ4vc6N%eTdp$iV3gzFsnRHatQ*%+ZDqe&O6r*fSsjxEfR-A2q#~2f z4`Y7J)q-Mymnb<$m3o@%MjeB^3aw{L6IfD=c{}aa;7avKW&;052OrO&(f1CUq4R1D zq8)~yyO~fT?OH!Nk-lFoO9t6w4GxM*AHX*sW99m}iWyZ%)84$i(k{oBWuiNkQF_R6trv6XI$5zk3zr_^w%+6--5v3>j54JOLA~>U8 zo2S>;m)AS%WY#-JIA>ll1!z%6y!`H;!?qxI(aPlcyLM+v8!JoT;U}eoZt=Hi9g?7f z(`p(qll}bV^Nl9XCH}sq(bmzzwKc948qXL^GQ~~9#V!f)mI~&gCrJ|9qxkE~84#)= zzwA45U8T`=8`FIFRr98sYX55u(y*qcWm&nyw1iEJUXQD}Rh|G1T1v;qGIV`9 z*;lRl9lzb{{DfLL<#qSnZylDl$Bh0)f+if5Jl&5QE82=>@1Q~>!xUo!RUN%Xet@EF zFZ)hrbMgM6KHZPC*VjesPqbV#tYKhhPfufM$I*9TEo*akchB4hg+Ox&_aGs-$vG+$4PsCBj3wXJXF$xSL2|U z-QU{A+nuHo1BFAdut&7&FM?O8IZ7I&!byn))xXslvHfEfSNl?Xxh>JILHn;T4^#bD zuNf=#fR`g}B%_Vahk^->>!!aCt2=cyEtx>lKj5=Qb2?xT=-<4=%nW&!6%<|9YQAl$ zzq!1>zkQ&Dpo+Dl=)04@z2G<0Jb}d^C$TKLToFBh6zn!a<=MRbjsz7r?nDqzC)ep8m`fxeziO+^L$d+S?X zA_B358V6dQpZ`hlDrd9`>cv)-$`xggYT@|i!||s7FRQY{V4gn#SW~R9vR;*(Vsg7w z!@V8W%L^!H-Mo8iRch+}IdH~9HI)46Or;Dge@eB?)B0g!wCGAK$|@F%&6gVy&b)!b zSN=66C2l9@)kcmx`Wh{JKkSACuYL*yxSV`lUeP4-*3#^0k}FlKg{r^wvs|u<_s!~x z;Z!wpaF8q0%gsQ@j0hf(8_e6$&$H*N0b=Mcr{~NioiYUZ%q21tdOKk)GkJ#AZe^MmSZjlGU352mTRC6IYk&Cf ziuvWrqDfu^)(;y&w|p_NtGu#gy$#jRb}LV%*7hsUwxXV{J2VSI<$9^G_^KD_D_;bI zs9lqWR`2`kd07UMLRsh!y0x*BJHXVi~ z!>H`S!;yxEO)R3(U<&Qyb|QBDdu7!~(B&GIZJji6UB1z`%L_8!|JGoq{Kmxrz}zx6PNRl3=@zdA?cwO;1l5C zproYa2$1y@_d)6?53u&fggD;=j;C)1P#z>B!erFu zllJE4DMUmlC@A(QC^#qfPOw5OYC8Gd6Sv1iEr7;RefeNwfKOn+o9{b9g&?&MC5Hh1 z!G6MENGO$f2o(k)@xTTdDe>Q{St{|j%C~Wo7P!)gNVGt9M~%Pxgjcx^Zgxz{gWq15-I@q zmjQOv8PzQj>Bb!$XdC>P6FMO#fXu--h-PV8#)dNI5^JP2Lfpsio_*ogVNjXMtJ}Pr zIFX&*RH8=E(u#swi5$?8Pdq#dYEIR);rzfM@2o|5U#n+iUjB=$FK2JxhTlN8xdnixW8!w&Xkp-H8&j!XZ;>TMPb_AfF~Y`2uU|I<>i0V6R*uH)elrX&G+Qjg zM~JCV+{Qkz=gORMtz=L3k@%aQ+5WBmN7@S`_ms8I$k;hD{}i71ayp^>OvF#-(lzhj0SW;#S(gR@FIf*nl}vOJq>?g-5roEhM6-yfD4iPmru=l# zlQj9qMG-!|@tBQcsm|WQAds7tM(a{N?XNGP&RDa~55PP9yQXD82-k@SUSFrn!*mT^`H>N%(WYKD68Qe7_WonU@zGS_AD?1Vkk{5uMLwTsu*o+b1cn0G!DazU ze3;ZC7F1L%h?~E@A_E9^=#G9qVFH{akK#3y6f|OmDljti{d#uXp-S*pDEf7y$i5Nmi*gE4WBUD`b}=EdvvPO8?OKsIha&v5mRDnpk3QEV z%umk#mHaaP@J9u`qnidNWfA!jm{(`2JkJ<^o$m{s6z3#l#`6qJ&a*wnKC%YHS)MzrtigTwQTuq2~|b;}qOyO*CAdz;!Q(inEfV;nHrs zhJmmK5iTTAqsae#(}T#j`C&~Pvs)1PXs#gE9lXmwd{RSRbe&bkRf_FFBPJi+PJLv9 zOPnkrmk2=|nHn5?NKe-**^Y35@Ech{J;X??U3TG{Ejd*3Lcw@``ml$V9_CG>B*Q0x zfF7DgRf!;tIzz27__jo`i9k-!p|Mq#vpcn6GTEXzq^Lh>{VssO*$VXPrwX-RvtB5- z=G2QFch4vPbs~)FzBcIhc}K)iwYG$RtAl>;8~?)0tXQ`dFYlqBn3egv)i>snhnz;2 zJtBwq-WzH8CHGm=iC)!NjnPM5D}VOoZkNZ~Bj^4lJ>YG|=dYSGU5|_ZJJFOjE5Jz* z_m=1Z!p%KYm!%Y^aH%#)&Q>wg{aZRbJ044@M4lD>R<|@lS9uSsM!t8c(^1*g({_ytJ zt?mIEB7VsahPw0yqHOQG#4vUI!_QIZ#BU04@opX3wC1iQi<#QAe$X8W$HIzbslI+@ zdC-<}(R7y-n9&L$d<2f|EjAVEfYBVE&=+?jB>s~gX>lnzE(g9ArO$y@ zW=M|a9L+xj3Ub~8P*pq;8u(4jUjlJWH29(qz6ty-w4vk8>PslL*u8ty<-7RtG=&U& z9ORmFLtlTb$vQe20AK|kKtxK=WCO7>$7f09*@metsIf7$82t_rRmO25^h&rhlX`YaioXp%Uzij%Q6PyRclqtJROh{N>E5hgXmQb=_u79fD72L$;|TNV?P4jmf!EJ2d)> z?Z%kt_3+Y}nwMmuJ~n2vgS&`3%$_Mvv z*9VDd>!-32LOTTu5!r5q^v#AdjyN?*vaG7A^s9}8Bw^jb`` ze?=TXWog-Yw_RLX*`>V?6Ti+4*6;3D-O zs5)vGBU!%vAIVXMe?8t1QI*C9m{~1l!w9v^{ES?!Z86BpQR6v?l-{d3`#4gfTSvxv&J!dsD)WMwJ>tvaugKd*{*%9^R~8h6kF!`C;DTWzO=Eotn+sbC+~_TnJAFsT=}O%9pfVYS&n_x z)Y+tmXFS~}U0*X}eyDsDi+fY&oiI1)Y<3>MSyj{|H`{zA(;c}IsX?C5BNmSdSlrLI zz|Zc=&R)5GU24S|CCg3d^Ij=%D9NzC-pNOG26xBw&B)!$&h96RzWMiXX*0v=kP#Of zk9Breeo193_ushJYN-DXr`eq;MB(L{X=Egno~0tQ0Ex&(C@&bObW%CKTxsH@*h4HO zRunY~={zzLw!YGn6SG&3v|d58P5SFE!qpRUC*D4_e0|OCZT6LeEO1#emhXtH*~-3dyx;UsIY^Cy!+tiBnSVN_y3H zs4K6!Tkir+2vP!83DbII*PDDNTjdz!ey1~(-ZfP=h4}K{r!NHJ*hfVgE z(%Gq$IiT)%KDC7O+np5qoeQi=Lh|v;mm0+wWBbSW$(Qu&y2i%V zP;Qp26Kt|G}M_|b85Wy5dZ z$NnHXkh%7fnHj=E-kx!9V{2p0uc*u_CpfsfMmm(*vSK#CZ0A=the?GK(GD18ou9q( zM@z>FI$T`Y3Za|Zk9CJcv9J6P&dAvms1J(>nfZVL83C|1fU=tKMK-#6tS)bZr-v<@?lPnc3!nV4syV`o3f|MDouYVMVdErSM-u?<`@ z0Uz9~wvG$ky5DM%pR>3VJ}};_rgM%)uHoLM^MnP-txQvC0TkEei>ZY4ee*hcleetM zQ3S>tNzbW+jPr(_x+MaXQhnUdM9%%z*Ok#8MZ-Wz%JJ`@C4Z?6CW+Y* zUv-0ESgtv_!o0h2P)*@oJl(2V-Qpn^p2x4?8Xk^Fi`HNoRD;SrnH)=L;)sgO<^2|c zd$~HxYDmat)6HH&hr(}uh9m^XAUhy$4tE38nci=FWJ{BX&M$GAiuQqq!Ze%Ot6K#W zaAtaEc8~KSn+pcc3Yv8Lu0*QyS-V>&y{&oc4p@NTtMY^zuW=pBMC3~qk7=xUE2=1&3wP# zyz-d|s2|7Zc@u(vP4JrFvI3Bkc~6KwcvSYXGeAC~f--3EaV1{oPvsL76l4KTO0pQZ zuBY-7z03o?rd;IXW2Y(}Q3M-EcZCs`n-K^v$eAh6H@vt53YeH>N5vIv34Xq(MSH4u7w2n}=0 zEr&3{4;}y99&1#0SnuiZixg|Klz+H6qfCq}?7aQ{#gaO9-eh`Wy{D^FQf5}$D}%b8 zA<%y8_-yO&?5qt~Go_fUjcciKOk1l*m}a`sqT0G7gEHP7+1Wn(CmvB-+c_=3 zFnVA}KP}b3jLpA7YeL@Zil@s_L9dNK@kWPHv}q`@_=aWH=bYKY*3ow&Y2i)nZlmpM z_3Ca|^gO%=+{EC$*$-MOCUlFLd@H|BPSPJ#iXJ767#T24>QLo~*PqiCtyzuF9DW}# zG8F^;r=(xd55Ovl%qL)C&J*zRaGcFiufRoLYee80c&7iT*Ky`p54oqKmtdDW^NE|c zp|aA}rr;fKG$0n}w!GBZvIMdAePhm`&6#W+koJxRft#@{I8Z{R{EL1qZ zyn+5! z3&<)wCY^7maH8bNKNNIuFZ224KXm&q^OyLX!01Wjh>}e|_-G@l#0+?<%^~s0X(ue8 zP#at6EG-!d7cFFIAvBzmzoZ`s6*|Zvas3TG+en+b-=O}fj#5n_$Rn5sFd^7qvz-)| zt`w537b?-7ELodE(>=wf%+N&-Pq~=nLXQ>_Dfg;1=w$*d+>tQ_b1$c*ad3W9HB4pi z)3RQ>(TbRsNHJeSt|vOvX;b>OHq-5Y*BJ-l?A&Z>nB)+g6Km@2b{jH6`X}}TI<4+o z1>83zhvZ1H<(cInXeYek_TL#e5G^cscr>K0uC6)N3I?kCXJ_o*2T94|c-qcaFL&k( z1-Mg~Se)I^S{4^G^i@gDQ##&v0# zlLyzC@?R6Q9oC@$569d3-%Q86PuR{lv{P3W?u_-^@87FKPcjul0>^7i#{ji;iT3Uk zAfpkBm4=fhz0l`?mBf*5T8YBsz$xhFSU{sWhc4>-)O>LXFlN%NWx`Crf?XF#+C zifuKpa8P9AQCNfJ_5__3J_aNALxZ9;9&NccZDdA8Jv1cl0u5vm=F5b@iw%Lyw3-=m z{#n3p#OA|A-`*>JEGN8wlXxf>sr+bfuLR{Q!MTePb-_=&#A7@V#V4Hcel!H3q4A;_ zu#gr(PygG8lA4No(^0N#f%NgYCU^d|MM?v1eYv|!fwmbTL{|Mn%EH3JkCPVseLvZ} zCiP1vW%n;??U=VO?w+HFk{TD|GblfPSJJODika4t%D3JY89?(C9}Z7CT4i*|A9c`3 zhgP3292T8z=xMi=(u@He{_O8_w3VFd%oAFSujT05js7dGpB`T|jj^+LC7#%}s;T9^ zs-Ul8s${ABlmW{)q&+@9{x@>7=HJM{;Q05gRQ|+o*7$6XJ)?j-qe0q#57)gH^$Xs` zMbS(tPFe>+#~4sU>$t9BD|SQcaPonGCXxq^{z(3$T5F_2<7+~Pd}Un6DI?+4@qp_a z{3`K@(;wm|Ql~gL%#*I@?%hdW%K5ZA>3Pb*8>K<^U&pNk{oF1h-j1UfgFRzgt#Ev3 z?K8Q%ut{_fe%a{Sa6s?acCX!lZ7U#1k>)4daoyy2?KFMWeP;DWyO-g$FjjTrWx72N`%K5X$Q-{^SpOffoTaviqM!)rEDXo7?Pk&5Mf zy4U6(?q6bLrluW=B#BzfNS7{c!k!cA+cBw+u8osmQ!G(*xX58WO>nK`w<1$zdwdxU}9MY({wDG)D6eQ zkQ{GpkZi`RnZ~<7p%Ytsy`?kbSgg7W_AQt`3I2uzx(^KViwW_5hp=#Vc3usyfZ^Il z5d=6(_lJxuLtJ*oIl2X*j($6p}Tc`+r9RQVgzG5=z2A zeSu@JOqeNK9+H?mAQ>|Z87{e%g##(NcIe+6MT-*UyTk!NQY zrk%~rOWy`3IXDxnZ3?$jo8zsCC zD&nz00UjPpc1@nZBJE-=d9-ZPV5FIW0A$nKdxeBgxWQ5diF-L2VH5IMB-_LVsBD0= zOz;7lJk9ITB)O3KlvbREq@)D1ZjT1VSVqRWyd?IxO?_cq3hV1$XCzm=bYw{i|95qT zNPGxI3Z99| zavk?yM+b)nU_ombD?;FtYZnb*(YADMhvd)cRkr*R$KIW8g?sqAtJtQn;1m@@KA z5;dEZ3Tzm42ED?_)+U+LBz0)^ss6#aadfpL!lH*kZf~|{h+73+=?F>7LUVL-PDzv$ zZ_kN&G5#3_>7vLP=2})hoqPzNo^bEqAxC0_9lFK{)46U$wAleVk;19K6>BtRg?(XR z{)!SYK_a?K@&j2tDK9}HbL`)pmJ~DHODClC3esrJ*Y``1W(}HY!_$AY&u@+<73wh5lAFLu*Z=h_+YOny#kkP zWP^~OGv!7Qu`2S>#V>ER<+-A95xHLYXA|U(pZ447OC@Mb*%%UWjpS4=h7r4RjiP5PBBsDYs8vV+6lwaRo*pDTdaeIO5Z#OpuADoU@ z2&0cM)cSOd{RtB?eQ6}SHt;(6&54R%DNueVFC3ajmegaw66!j@{~hA214(n;q(PBAXg zh%j)p9Pl3S9^v*HWaJrtk}{w)%}6jV;MW3GLl?P? z*2g$R%+;*f@fxVPghA2-)t4||qtak&lLQp_hUV&!TZemo73>>KB*TLMAq+22jF)#g z?4u?dNm7i0c#6+8L8G=Cpfc5)mzv4OXz`pi9yb8PhiekK#;Frl^e<7Uj>f>7&m;2C zRUmP$cY#4_8AdzXUUl7METu_yecK|*jXUIp8*l}p@yyrV=BrwnD{~n-WUSoVodW0!U7=@P*BoiHO0cYn5G`YsI@J{ zv10Q@)(42pi6|wd?{O-j@A7u$MEr|-0^TIuh#Au z=^x+Z6v{2;zfbM}FkwEPA>S{}x zFH{xo@V*YWeIN)F8-0abM@v-NDZ9?F@QWGRvQjFaua5+ z{>kUz(h%v;DTV}WV#{}Q6Yx1`hu2>WW2;2?^0TyBeSBkfv7bp}qm6}FN1WMMv9|{{@jK@lZg#p{u zC}mnAf6sYPm;I9cfsb&h2Z0Ke^^1KTjU9x8LQ9n8$72^lcqCp++RBk*>JW#FAqejj z^;=lsVwd7)VML3K7~W~v`!=Ey?h@4B3X;vzl0_c76BLNCxkmkJYur9XkbNHjGb2e& z1C=-rv!}dlSCzpIPARRtM%N3(5FtU+KYU%GksM0r+!Vv-p8A9@lIDP-B0_T;`;w{) zeA87-SUn$i&fhSK+;Peeu~$`}C^?O1`e$!9*~Gbg&$KHl)v~gK4GxpglU#dPH-jo| zE)Az**6Nc=P}j@Qhz%u3PnqFbp^AK{Ckyr@zZ|{|t)-1jswLx?IHL6%4Lh1bt)DCT z;ag)D5hyGn#G^JS3aJFtT$1(A+(uPNL9yGj))at!vLVR^%3j<+>t^sg_Dj#^i#HsQ zo|?ufI0|3>VuO)Q5&JF(B5#9hq(alPc`Ay}v&80x9f&e5BUeE}F%O+vL^#|OV8CWh z_u8i_bw?L&T3q~`3T3Az7hnj^g&B3En};NUE!99T9dX(e<1bBq`cq7pnM_U?^FG0< zE^*%yn&_~=Ipi1BrXV^jD4#oq{xo;M$5w@+#UxxFYN&vCX@UX)?D*HDxGeP3<iS~1 z@9!S!IV227kN@!#f<@u?xtp6H+!*f`m$T{6|(UdRT#%A~^&t|114&bO$a8 zEK^5?Y@;777nYj}B|8a{mRr4=Za-x~bEYBVWk@b@g5zdy7Q7S%)e zEYS<5KM?b{pauS-K5pp`J{M6fZRhfAmeHP)ucbPY{JZZBQdgIW?5RaCU&4?(2zSx5 z#&1&jz#>)DdW1V&q20?DBX0NJ-C$T8=l)>Y)$8lN%P-)ij0?RWb{5-JyOp!Kp+ZL9 z8OH5;R_BF*eeA+Ot)1RC(Q;$Lf=5W2larQwB(JOW6AbN2YcPjvz0RKwj!pg|s{$qF zDNdF79t3OqD(HayI=oYF!iU=QON=3SjW#`VLnhvFzwg(O2hr@xaA>XKe*Mdvb!KtU zqw;B=#lgnPGC&dCVb#HK)gdJ>HzvAkEu-dr)xnJ+*|^IhCGYC052h=jY5nj$gJqq? z@GRN5(?b@OTQPT^IcdA+0KUe9nD88ILCy z$3%V0djzrS>VlLnca(XcFYtd$O_z;lQ*V*38-EkhXy}V})x^@qmQik`hMjgw^kBRE zBNk-EQeeSBMXhV#jeQOA#I#TM`kq%%fVzgPNP=mpB2&?d;uXOGkAh?g7+GAw{_Mdk z7KEet-~w=7m2E`dikoPy+2;MDvDRAUf8IG{lqk>m+Q$6r^Qw%E5kqjh-Yd0V?GIl2 zP{kBAjf=ZJ!IAJ{1c}(V*re`lbN%im>#QInpy@W|6P5dmiN*RE$`LME`}b|+rgxrV zG4W_{BsNrnDsb>1lK~$tl6tGvMWlsY2yodkSQZ81F#Xv#f zf&xh1L2efb?v{vU%B4Sx#R|$hNcec~G7kJ$pJhfvwcbaOCK6+_&4PuTZoQ0*9b%5n z4c*9m5bvBo?2f>c4mFVqbMvQ7UB@ZB__1V_YbNt{(n1!bof_@c&%OB~f7r18`w6Sb z;Uw$d)kUgNlOcMY=fdi2gHVZ~8vnoNpKYFoXDtY~A9Z)P@;v=#3%>Y_s}33HPR)iX zi~2ljzI_H8p9@&QYPjAr5ve>mD7HzNy~eLHiDFork#NkR7lAw*)f4t@_j4bj90Hl} zA`Nr;hE&6d#p$tY5v^2OCY!2Z=2T>OBy0C0yhnVAtVX*&B&+Tg#-}fukE@YIug`SW z&xzJA&*uN0*Y; zG+Uj&AAaDoxugl!d3$@SbGNa0FUqtBz1ux42Ul-{$=TZJszB=ESJ%7#Pyf(3ci#6* zx2{mocF1~V&hGa11kD!q{1a^1t#p{ew*TED(eLNEoB)4NCLaGGIS~OTPy)Jq?}kLg z+F#oG-Y*Z({GBDiPc>;?}1$br(M_z6bOs^rESAGn|S$RPua>!E#nDtdu&;5t86RK@yD zXRC(yn^WXD5x=4fbmrMlP|+jg^8VTnF%Yp2+sv^Y=SR+Nku@7gDSC@=U4Rq_y8 zb*GCrjrHGsC`=Sw6h*|Y*E=@#Al&T^`Y=8u!q7+fEqk@S7iiM`A1PBR{;{im8fQX6`3mz;K1(hI>EJqL! zB#H`Bvq%$ZOF~J{T{!1_%J2Joe$Tznz5iYInc4Si<~8qmv-8f(?#vcx^OEh=RgRZO zZu|(`6S-;kO&jSIma{ZIo)JHDzpPk3^N!Y=6kjGrnO?+`KYeTKbb+ehA<8SC&sGD8 z6%%Z^40wmu!sI%mT@>PHLT5M40^O`07R$y@B%bIoVRlo8E>0w(yQ3qx<2#KP3+`87 zUzVx$B1LxoZHZ`PH0PentgO4DyDEf}>*DZ9yxHMv`BPFZP|i%{E?F4OA9?5mNc~JE z{j3*MKR_29 z8@-SkfNy=jKYX=|!DUA$Su*R+Y4X+UU9YMxx8J{c8DPDC^NOFYlJ7F?r5lOU%{Af8 zGt}Qt9l z3_kX>m*O|bk=@-#LS^XYi=QQ>qf<_e-hy|S7g8%WTl?#KD)rI*YjT-;P8J+J*)Ne^ zQ=wW~zzKt%>yxN}S93P)D zWHD3};PvWWlDs*qhi_ss)I9T3pO@+Dq zV~iui_*t2_qcg>?XzBBvopq9l&R8s=dX+jZ;W~wsJ>>+7#=A?0Hda*Ne~!7>co{R* z%1OO5VGxj*S~fAIF{OF`HygiL?99xiC8(38vg|0opL?_^_(*$>?On$$(-QAED`9>bt zx9u#`e&gAFo9u7wTy@!TNH%1g!H6PrqX5#uuMA%oEhs8swF)bGoEyDbNo$Mks*ESe z*2cMiYSB#`l~A>%n(K01Y(#iK!Wff*$U2D@E==Zho#XN$EuMB4bDkP`bC3$=H_0)} z*&in&6lMb)Cb`^`XMV8RpIhN(bdyLe^ZMBAWvAv+K7Wmw#J#-M@6sUT>j>{lBymHW z&i4ha{7Ch~b%kXd_G}L*xc<6qLJ~Lg`SWCFD{J<5_d0ic={vk*;KbYWV=a$sYErXN zg>Kn8k0(C6y?mh7!XF*}4u8oRA&g zr~-0>NbZH+O@jk5S(hA{j0N=IL8`n8fztefoRee*|_MZRFhsu^FD z{<7sAF=008-8&@UCykU9^-XO_*)6xd847OfLauhaU!36{``bIWh9b9J=x>qw+J58R z=H|KW^6#^Fs(LOSe&xj)0p5Tqt+rLjKP&&jkRKMt(czO+185eLqbd;7r)+hqqEr@%T)&T4QmAe0xNonP(+ievzS6 zsnBVczE1E%@la%qQE;RET`hIsBw2waxLR^Cn#k^oUKE3!>KU&iEcKF%_UH$Xyk9v>Q^sPNx^NEnh#|4Kv5$sJ?e%A~y^ViXibxUxR4{$S(v z!0HvPdZ(_N8vm|jq`W=xHPip(ik6497nmO}uUPwj!~463Dt2VNN-VF4=S#V|$A+s) zky@Sd4i?=ypj;DwjvaQ#!7J0@u6XN;>b)8I?!J|;JMUw;3a ziE^KJBmYD4cce|^nMk8Zv+tTdie<`W$TD=af_0(^m&doOYkvx92@`xB27ukBukP$X+24UWb25j)T}hEL{w^5s#F?QDp%@PYE+t3A}e*t z>q!PA2a*;EOTv)w0tLZR!9u}m!2-b&=ruS3v?WF;a2K#t$ZG|QphEBw*a?&+PAG6y zSZZVk!D4|aR0WEG*+h&22900fil8iztQKfPUeF_OFIWfA6B!D46^g24oxl(}1(kwB z04I^Cz+PadU~q}37zbbzi3qkTMPpQ13{WDqnTsVG1?qxT0u3k!ECV7Exd^rzMN8r; zKtf3%9l#{w5mZ%~y2MGK24#cA05Oq`psL9jr02rwLd{m98_+2#(;iu%M=!fz{5K%>{EMsG}G^8Jrh$zx5LKLYK zDW{>^P;H1dG`dW>kX^c6YF$QM=q>}YB@@HMlN3lxzpI!knW~#A znyQ+jSgJVVyQ-!LQx#KXA0!qN>XB9?Gm;Kz4M~->lC*@hk%S^y zkrt6QkTgklBvXD$4XEhJq-_0K`@kX>1e~DO)5l5#Ygz zYJ37!34YVBp+rsK2SsSx>5C-(DUte--#*)czue=Nbi`%q_JQx~dwGK7 z#>+hMictMkz++%H*aEHrOTcp=5B#|R%{uTLy!MCKecEdJ#Pp)+1Jh4pb7CuElVbB@ zvt!F*cT{;)`BnK=5#u+x6uCah-G$kMIe^*i`;7i9|7+dXx^LF|b{~8Oc}=gFJ~eGP z{Yq3Ix+|&_T@pP!e1Fk1>{HX}QB+-i6;}!CZ0|_$2`G2!#u@2XFOp%V?1R%Cq5xQBR(ZQ=RV;+<35$|X8TchQTI{z zP~jI@Q1=hGY`o`&d3ZC~;5D*uB>C;b+$Y%3hqRN+m!!OZm~wLEos>bd&94^PZnOD( z_?33bpLQ8r{XhG>GBDX%5}BO#aPLua$meZ&3wEB@@7@~y*=E0l-q z#Y<7D`HL-3smlVNEVe4rdAIG^;$`kvcGD(L1-|k$u(Nl+s^3=wKcXF+yu*I?4xP+e zJ^TGTbidT9+wX1CDXlfO_iNJS*DAi;#jJe@2v()rE=o0ixpkF(W6imA8(xj-%RL1; z&uf>wJkXzdA+YNE(hXO329|y|dvhf$u;Tl&i&vf_`=V321L@ywW>Ta-5*(Lnro8)+ z%ybX1Dbj6AHLAJx!|H4)b6eNSv@4x8V?Q*{<}$iH!RUp>S}d=cun3Q9mbjaq=wW+{fL>oMB1&Fyk#;2QhMKr_K5VBlomwB z91A~2=&en|?;|lG&))S0F0$a>N0;+eF%>^2BlK8@1P6LM;lwVCshm!yUp#zQ|L%dI z+O+76Xr~-!-MhP+TZUM_N8UX5hu-PSN7O3x-DMS@1&5m3eWamL8yuruemRXe*XgC% z8v8l2cFCh3y`&WwbJsmSw0+<9;TzEO$zP#^U*)Eht4{Z_ z5pCBbOi=0FLhq|>5m>2c*s!z{FIoJh*jupS6T3KEN@fYw@bCXD+bOuHLd1WNFfO_p z)z6xK4cP?>^N+@C4&O|uzMLkn7fvpVcRuy09}u`HC#j|B1?-Ld%)u+u7u{V+8hu#D z-VL3o_E(ND*!QLA)3Y<{U)?!uYfE@uxVxJ$a^LcdX5ph&uaSZa%bfQcJ-GJO{nV+B zleR~q(#KjCojP>*&6|UbpKqS@Zs>VD);e=C?sa?zWh~+1^-=L_^sBy(#156QWn;(2 zv`eb)`0~$egI`eg_M*G9_sndERtLSqw}aDx?I`Yu20tTE$%txl2 z5oDz+FoKkbu5&Tae-KBI`k-9*V6{DX1>6pP09S&I!2as&#GvZ4;AzkX_*T6hSYQ1b zm;^h(jo@1_78D&dVj`H!nA%KxrV4Wf(~#-pi0D%6(&mk z01ZdcOmn6#b1hTNQMrItajAkTRj`67IkeUZLsjsi!C zqsT#V5FBL=l7q%7V3jJWQ-MQZC=?i}Nm3!LAQ_UJ91ZTG;YZF?2+9Nv0+OKCj4nnN zqazd|lp+)(P!Wg-{07M_h`8)xGwH3f#h!cBlTweq`otL z`m$QtO3bX^S*rg32hp5HlgqMaNa|kdet}#kZ6Z9JKqsjkhVezA9l@wqE zJs;t6+q6j1g!zbw=ZVp|)W0`5zW}p=+OFNI z1qpf#GO#1u>hK4Wg}fT_I`}U7L7RpA1A(r;-zxTO@-rK>(dF+?7B(gepVdeP zYRIeXG0_O2(YikPtiF+ZE3gYoT_*fhL)HjnS=kd)Z_%v>&*<_mBn#ixkX-^6A~dZb`v$TM?72C& zCfu54EeDG&2F2QZX^Ie0BiR(#x&9IXI-v=cfpjYb09&dv-Qq%?3-8g`t5IdwVz=yKFF9hYue? z`0&};Gd!A#mk#>r@Si6Oztu>V1X6768NN-$=7Vjze4}LHwHk?4ApGDe`|>UB_9pn~ zmFe=GlZE$cBrw}9km6v^PP)bQZkjM3oO`8QvM>=P^z;}M3SzPcC;5cKGi_;%AwPj2 zhAhFkQcN*;I-OBh$LZ@E%KFKfOScs9^<6216dCz4o#FQoPwf5QXBnKDFJ4?Drp^n# zFmG~_|KFPZen|22RpdkSSyb*MzsPU9DSqNQk7J6D$QS=eW7Nf;@ACL7>MN(GiGMQT zD49vWGQ{|MledgM+N(a3FDRY9jCZEw9_o35r6zf?^z1R)nvACV!lJ*3CYyNfQc`Ev zD+;cZ923~{1QYQ*ree>4SqxqiO}3Vwl9EouJfc*R9SY%mV)iYEUv>T?e@yq?9tf+c+>M7nCOnrh zSFmHgpu@7cf(Pac3J2#Y+hIz?W4P|JKj$fBR&x~Iyz!Oy<}@~5_{W&WzwAZN+k1Q7 z-U-h+du{(k@&2oz`&{Y(bIw5F_>7@g)I~SAEsywFmnxC> zA2FBVoo4%v+>w%Uk5daV#h$$s++4YTN0mC_I-4%KU!a_HSv-k4!nz z-@1J3=b~C^Fi!r@mVE;M0B%l~`JQz?`ag89$%FO1d}^Cm222Do0M zjqJql*;MD3SowxPqHH%D3Sp9ea=fr?p_mt81(UYIq;!~sgh{b5VHzfkz=Sp(F|T;p z%m8LCz(kDM-vQQ)SvoT?VGRd!I9S2~=FA6}Hv#jAJ4YMmYUghLJNUqRcQ|Z^!xlK~ zfCF6deDH+#n?@UnzHsmuZREgui(#Gf0oGd#>nw(K7Q^)x!}ZREA^1Oxg8$RTxd7Yh z4e!0@_Hb~5?T6=-B%y&s%A(nUD5C3J#QHN{IMg@~JO<0L3^C7~-<8dY7s8I#IK+~` zjy6Dyg<)D#6jAoLJzLHzVYg-z3nKq2Kd)pyqNK2Jm&H8qseu(;*~Euf-(HqPCq71X zb|Cv_<6b6~y_J{?S7s^V>5Vti*UeQ*w&x#x*(5n^L|1n4d_D5`c%gGv z27K^W%0r1V11fBbK^Nz}G;}_~<%-*xjB9^IF-%6vzxpWrL&na5zeiVih@Jem*GNR^ zT>QUJ$`~QiO$%GKl%{M0JYBEc`mZ7O>-6IIq@+)=S9xu|uJmrxCqG|XDwTK zY|<~`48HUT*UzcbH9qa@C!_j2*xog@E9<(=!4$uK=)=Tt$-z~caV3_YM_!ZOA$2&j z%4^r~k7y?Sh&-q>E&W)@OSO>2x6NY7EBqf;3T?MvY73-aJb%Nlski?8zJ04Sy-)mM zv)AiQoXO1(X=cT>LFs;nU&e+mqPzNTJGZfgZ+p@Ek1EgIYeo$l7CG6}rM2(XEx7Wd z{#D+Hc(@UpNzfC-jD<{xv1+sO*CFWldcx9C z5phsIW(q^RJ%n5Q#NTM&jjU;`a59U=&;3j#Jdf(Zg`7Pb__oXO%MrV{XI~iVNwNl64gOhvqaMrD^N9DZk=p9Y%{)LHmYwhjJ59CW$1O+PQ z{OIbn4{5G9oN`WLd}cJ=-B$Z1qFpx=f3S@{1Mu zC9?k0W!4tMYwrZjS`5n>_W76V9{S6Fh-R}Mg?=6RHJeoSfGw0(KNH^qB?G9k@{oc4 zpE&_e9^0GROUo(wQKazkb~C4-ZRO>)2b|6hm%qDruIS3~;Onj)u$i~^IXN}sn;E@0 zS)*??7u&pq5ensm+yXR^0w{Qk7 zwDR=d`es=ZBN=x9@zqZnrmgtZ9Ba9_Z0qUwf-%-`2ye_xdeYW{WA1reE)qss~~KZU9_m07pw@O70AKPy@Ip@ys< zC|eWAT4_&pvd4Hg)g9U7$`iDGvs;RZA&=Q4|DUg>*49%`WJDajF8^-9{j^k0^J1lM zmbqk-gAyg3RzfS3&|wE}rv|S$r$5KAKXnK1qXv(VNxrmMrk_bxOO$w9ajb1Mc*<5B zze05$C#T=vsNXlIzjJXvV?%@Wl77bOhE5G${tliOO6akJ7pB3}y4~Mt*iVN!M*S0O z8=_a&W7alU!}6L2XLVj#PQUY#{)qJr(QE3tp&1jQ*V)w;+}fqoLN8Z1{%%oh*spb` zzhX)M?Ct&v!~W=;{tBc1=sW#!i~HfSaZCEkZuQ3*_B+5SM*VF${o=*_ZFl;`OZxq8 z_ZP3LAG+NyHtf%a(~bJGZ}p=W_m}SEAvJg>>M-YZ_=(BF>Ke(yK+1A^{MB3RE4MH{ zP5C-}^JHOqjbwSC>$O{$olW_=eE70S-5!7Q7RI9qzCN{H$TzGZTiN5&Z!xwu`C1L; zFXZn{5uU1%oDZa+?D3hm7~7gS@GDLi@}p9OF*Oo$AO&I1zJ4oOm!Fy}Tove=bBnm6 z3C{LT7Cx?#tO=wz*)zPG;A=p*^|ERt@D=8Id-m_Qh;W)NeM{|o( zn(?TM3T7j%(L_`BLX^K4-!-C#mKAR%2gZ z71K<9*W}a`>EKlFqD(b>&=o)s5LDd<^i}HuhTslpD`Wu$Lwe9YXdQGO zQipaxtDsQG7z%)J5E)X0w!AQ^TyR&p8HGg+C1fXLU&^LsCq`Arfcjt-xF7rmt_NR( zWN0H43!xx)$O<|EErJd}8=#AjCgcNs1CM~+pbJ<9#)DE22_}MW;5*P9JOi{{Dn=5u zSO~JYzzX^Z`U7Q`=$9gpTul~|Y%Q>Zy1^hY4w$_(f#hmY6v)Psr2-|vGUy%X0a#bl zFZt3iNW3ORQDPxj0l^CsKz=pn5(A0Xq97z@Oof026qQi~Tb-gTSt(fm!eA6BuHFU) zLL=Z>uoQFvA}(i9sy@a|y3VRhKDARtVNYLm(C)USca!HDoA>t-u+g z0^CHZf_#BYMY2|402PB=K-DRD(rub z+ilx&+rTJ&-Ah8nbkG6!K`FxtDVH|SIuDV1MkA;rwFIrJeC9~Aa}?3{Zl9yuwZ2gn zG}(C1#^?PJfulOf5n2GI1CJ6skaUEp8cvghgOtD&ATz-l>5Ir!#c7Z>Lh9gcpfn)_ z$wB0*;j~DukRo^)NKIfUQ#1uJph1EG5{n?HR;rVnAXP96c%I;gEJhI2Dm6(i5DL5o zkZ41707HR+ zmgx!Bf*cxKL8kK^DN_}k0V5LF@TaT=aUcd>Ba^8JLO@~yRavGXhz9Xyj@_5(?RW9i z%TDOX=1=mq=8k?p<6@PDG^K`vIz#0U!TJYZ2=ax!{0GEIm29Tyaw1%gwJKk!iRutyFewF^F#izp?J-qy0Ug`PtqL!U+y|so{ROOXTrL&%nh`p$W zOOeN~TX;US@G8lxKWb>^cKnulw)UDm?hPjm&4Z5Ly_&7EW;gsG_ieMi#}EG!4X<%K z@nO|%+o<58rc7bUrbQpjVh-eH4h<+DTIC)5bXDd+$(92jRvxlF6I@u3IbE{sg4Dg; zBIkH&XjWLsk&E>{?UohC>7!ZkB}BrF?EZwxRp^21#y8D*S1MO}SS~Lz&TQM$=KMn< zOecGv&+H0zsNFdt5{@fIKd4y#aU{ATuB&RCwXPUHmV1`-cBrLNR_t&@9zkTRxbAe_ z^7{Jgt<$tkg_|ZfrECgVDkV~XS87rIab)Dc#pld)HYO}SdsEw{pH-3f>xpHLj^5vO zKc(|)*x-g}H#jfsS=_Ps&w{|ovy;Pp@5&yXynk@%6sNcN<))=#e1TRs>v~SC{0Pa$ zm}ucjcK&k$&atEIVNE{}+ng6~@hK4FCF>Wxwe1xzotpjKaf(tdRij?JJdp!Qby)FD zGK{LR&-C-QXS;2t#lEXo+%n#wLKqhDX}&{Au5X@x+i*cD0WX1nf)9`0Vat_fm1a@1 zk7K06;BBxSEI%3^_vm8~zk@tumBU^1VpaB=yv8Ql1$s4!%t6ZPgn zSg_HTuDY4m(om{1p!q5>RPp1NF?HuJ%_XH{#?Ecck77!@1Is$XE>?6Oi|#nGjvdB* zSvOWO^IJS8_f`H$*=JcW^$q(waV%mcT8#eqR{qaMD#B9Q=_$Y1 z!cLq@&7jz~V0}cEo^l_axZz0u?DLE~;+3fhD`}jkoY2CiPfb`$(Vpye!`aKEC3(cO zsm4r-a!awND9aO{J7qiUXC+;kN6ebSSV&Lj$rld$SxcAX5i_SSR#Fd7`R*3#)hP`9 zhkUXQKa0#GrcN=IO0B)v8;0@QM827_wRyy(sgVqdOG~k@NW+u8Y}mm}`aX~Q+f+^l zWo=7@kI2@OZ8=2L2+)0@D-VOvdxF1&7{qF+{;rH85D<>2_KP*C);{> z)=b)y$4#0NXHf7h6TTv(Cw1wtmYGzk#n(b=(c)_*)oa1*5V?6$mk(>1OMCP1m!>>2 zWXoGHJ4HdB)K$Z915D=OX;ao2GK&_*4$)pu>dIkXbLns%K5;4}L$<1gu~QV~Nwpj1 zr2gGJJG5au2Yhrisb3G0J7%lrnWytp>rw3(&T9;JDJHbmS*eFZ?GEf zX^#TVg-Nb`lLH{?nxpu=PM(gj>!~}|tTy5nw^ummZ5%5b{#XO=C@btnEbSCV+&Eh6 zPo7J0=e z8p%bHu~0lPi^MAgEMclg9s$VH_#opM$1ufP!30R88ek5 zy}<)OA+1xPOgS9gWy(ZGdVoH_Jz9lAwDLHr%Y=!J^aTk(6-}%#t2~bG!jRx|Wcbr! zDnJV01vCIFfJ9o7f|jx=3TI4Gf;_?9z$03n0$te@jWZ=FLR&#EAd{A_;H#XA!kLgz z&<^krP)Zw8;3(&!aTpQ;+5&C^IEwHGc5#pzkV?x|z$z0^mBu7xXgjzccus3mC{`w* zD@{pA$Q|4X?2rhsQ30x(Lnjj2}PM{;%YGg%$3z!MyC-@>62v;?-rXU{FO28}0 z76^hs-vkblswy#rh5(`h6+R!PDofTw4ggn?ik7%QS^!>At|VCtVF9+H93^pvFo0$g z$LJ`+2W^bLYwC!MbO)a&6r-Az?ixC(MIHdpBoxC}0(VUu(a;6J3BI?eS(%KC3hwJVSu(nkgcI3fF;cv!POvZ zK~=ykf~zG_h&%g#c})P9*Mya*=v~GIJ%A2z*PxC>Ci3AemOsJAkf$ zSCuS=`TzuY81RMfQ425cDD_AR9 zBdn463R);r#e#U;Sf9{Teg@+!CZ)|xzM|*HSITd?_N=bs*7^UCM9)l~Hzf@9UNFt& zU-(OyNB$HRA&b8?dC10Fd^v!b(nsAp5SX^(gRU~g40EExUy@m<`z@)%Nto`crJ zwO%-RvI|$~kOH&+I0v)O!=#*Am=rZfa)n8@KVZ_(98#G>eK5*`iH}Ua|XW1cvAAR`P~Svaz2`vhSHkfi3wU0KXH}+ zZvok2UaiiT&S{>E+8c~hCZ4@dsBirj#gKUy#u zSX#4cePh$P(mxBO4xw@xGd_sv3>C^zmL0h*A+RPAgnFUacIgJwB^5vsWWz%xT8Dh64i2d zP5wv2sMfn{mAki$iwBYX2f})CsH^?Z$Na&y{Bq%+*tAXg%eP8yHJ$p@Wdi3v(*I@i=|mO{U~zlZ-r#3DypQ0IoT%S%+p_d{T2ofc8seh*Er%>PAEJ1bl}l5P zr>x34UJ`Jie)}QI=f|%VWL+pBY{)C(F3$-r4NWgB+4-hXvwcNHaM@^jRf+FRV=6Dh z_kGsC(Qr zy0`-Sam2SGq^oqid|k18WM`Yavn@n5STk59SR?O3{L)=EyKuYA78-cU+ZfAe=V_$2 zw^`jQ!}}*Z{JEB&)-R038ZYOyjV)iiT<_$M4Ht6CKX!kD^KyO>4ieX~4w3`NA^|kE ze97`f3#3tkGpiQX%d|$^%CP-^^iU0YRO<{_x&3Y@jqp%@Hw#Vh)fGU ztqu1UxGs=ZEz_(bhRgpX2K9=q$n4)DFs1S&#iYH`U$0Mp-7b~s?ohQt@4e*rRz?QD z2p`bHPQTuH1dnGfWv*r}zco04uXd@fs*XQJpl*b3Roy_cyVcoqlK;JO1EZ>8uuOSX z$GD}|V=L}ZU*X#sW7ru#agMZG zwz+hi{r4v4M#H?Jj?ipt zq+gJEy&|w2=pzGlyhqc#pnJs`i$4;9X?z8|jF59a=V9PX+aWkbbuOjy-buJ7{kF#015s6ygOpbUN&%nx5H9-~ zR_b3jS0z>tE)oXD3STyx-`Omh(`Ho!rwq=ecwA|1oPBc+R$>I3+dp^MsT_jLKSf?a zkgf3eUmHOj8Q= zp2B*@?f&PY>8-q%aQEjl@*fu}YWv5lrjb(NZVdjXY~=5aI4Ih@kvFY+Hjj}zwf6eF zGhv4R_N4#eTun=MT^SqT2xkVvnXvz4HV`PPaOSc&VPXS8cC;iLe`|C=3x;m> z1ld9u-hiQHobVkCSHtis46R`ZlOthxX>@=N`?xs_Jz z*mV4581}{r)A<8g=7Wv@`f2`W)6Y)xjK>E4Z+psr(#;ReIozy^Y`$$w{`I5(yQ${R z2Y&>2T0YeA4?`;tv1Y zbEuqL!rlK}KLn>SFw>KX|L(Jn7h&@L!?TVQ&-YjJWkvi)u9Q#Gw!b%a(=^fr@5|w& zPEAX2^U@bSf9ih`u`O+LiItvml@@Bo)R|1#-aPrbVZ58@f+yQru;J~HZ2i5MPZ(7+u<^E=}aD%Hszc_v2K~zAv)s8wi%8# zmyYLg6Q|-bDA<;XouYV8Hg zR<~e$MCP7Ui($H%^m88m_o=!JnPUsaSETDnH5-QM4SD#>Q~4RPbuA1Z(OOTc)iB3Q z+Mb6`ni|TWyyElCoc{X1{`$Z9(|i*bJg1El4gdQ@Johu7PnMEBIGq3I8L7eZN0JXa z!~DU7mHdyR%I%}hlcMGiHg;@i==BB3&`{x7SpsJBPZTLSP4f7%A5U_3;_ zUU=kih=ugIr~GsaXRGM87hY{R#8P_3Q+~LG<1T9V!lQ?Y9wH|%d29=3o5&%6MlC0} zin8areg1U{p@riia!998TCkf$4w*9BJmU2!wRFm{7VH*LS%xeukLo+^3?N8ibhMZmq;s9W}YWsK8$x4(K9ItQ)klWMw5u7 zIRnpR&dJz$86L*sHo^nbO=9-coa{I!!;TBf70z=qJVJ3l!hOU`$scp075Ce`yl7so zotIBmNt)+I$AL0SDJ=WU%h5~cE3C*u!e*@f@m z(M=fdH78%2myw=x^6PmS9_9*-;UTgS_F-7>&3V0AR&(;Af9i0U*GpBJ)9Wy=m%46V zzVJ^SDf7B?=k-o*lVK*dl2LOjC5w#yd!+EPoa~G+ipDhNL!07NaoD zV&mCaL)XTfh?!Zd3UO1@c;#&&tMIpl(ybSTp(BG~dtPUEGP6$Ge6>9t)I{9eL>$hb zllqIz28%B?_)gUm-J0OVS>jMe@nk*Gw~4!{iTg8y0jAF_(1IC6jhLN{JVKy2@FgnX zy7+D8wZf(W{mypLJ#^=IgtAoaKK0B6=f+m{wYL{ub+ZkoxJII~{bi5e$S(hCt-i?C zl+My*t`~BSj}Y_1#qHx<1JMLp+WE9o&tE=M&P^YZKA@t1QWM@@dozt~cB#W8XF}nC#uQ z8RhyYgP#+AWg%f?B`6*6Kwvb;>d;Hz2#t=^RES2pnhKOaU7D|=rlJvW9O$O`qQ((j zx=dq7r7kt5LnH=d0s4SdBp#Fj$ON>amZGaNX*IMEd;q*lNJ27H$xGm6r`3^`|1n`y zq*#RdYtkrE1D-Zo5UEGffr7ymz+PHDqD`?4;fu~i;B-lgpiuZ>11BJgHiY1y3Gh>Z zByA`Vv;@3q*$6D!)ntC=Xl;TYf}v8mgror-22tPzV1&j|bTtwfgHbdNGF-_OBTxj@ zXjnzoVu23mO~WEt#sXE)hE}Y|S|V5io}m>ZS*8LMJUJ7g*rQOXEjR)CCqyXA3?VD9 zGa&-aLJEAqii8Oi3r$-4uXz}FvPBCKfuJlFXoDW`8Y{(EpaNRc7>bl7BpYb$zbCq| zifkpx8psAHR%D|j8zCbgLXoX3*#J2MI{|wzn$`#4(K2NSOXDJa6s&1`;l~|LfU~qR zM419rL9z_;05C|os-O*EBV@MFL;_Vyq5|auR0Wwi#7Mv+Wosc~f?QSN0J4#Cq<{g) z6=lW(H4sZ2e%wGAz_YUBDEnFAV!oS z!?h~$k!TQ^kV^ATa8|@DATNxx1`}z{$ZSQ7B6&G<3`jyoBW92o1la=G4R|0iNb;&k zKd>(W33MmW(XI%=RxmRm5kN&6!jnarv^a%XB|EexVpefnqYKT%Mk>Eh>C$52Aq9{I zBqsPGOx1Bpq~*|RuouWzWT0@0j_Ls_I31E6bP}`&f@seZp3~|Obabvl01~I|sA#O5 ztAsNosY3g}Q^0HB0`P?v0zdqbtBf;Znvyi305AsN(+uF}KL|>di%BZb9`HEONb`lC z`>50rsKYajA&SK)0rY2xfEG5AnurUFP zW+@7`&(H6%P=dqYNJ251g%G%d@LDJQ+z881un6?0QBjpDf(>9NZ9;*iE3gAA;I|R< zsQ+tnSF#jx1N;*(D2kF`H&~YdFK#Ldyukbf2C7F@q7Ib;90XoVqBy@q%2t=CLeGI> z1Y1*rf^vWe1Y1L*8L1noE;s@@LL3?uA@K%h6LbMDP%m-`(-5A^41;fo_}9uP-0th4 zhy<#d#2Mrwsfv;n5GFysKw=GY66ER<0}!6Z)DTPnas`<+#7={8$&<3ZiVDJ52iiflXs0r9FB2aJdV9AE_@s~ebH2XXs!C| zdz|Zd?lGZHGyPMABK^&w3cm{93S!)*xLt9coey0KTpqeSbNR!i$mM~{QEl)pP6QGIL4wJz^*+s+SLo;Jqk z`7UaRAE1=n3&qZ6oAe_}4&JO!<86w$K5C(L^WO2NIEydxT`{+C0Tzr)G9`R4Sww7WJ#4Z?G@faL}awdYa-R%SO0!0+so>z{j!b1TXS z`S5LSs?4Z=V>uz$l5=yYK58JQWOptWd)?qeYJV+HC+2D84uW0rb-xeK`@h|mwbh>) zxWJ2zNvz!6W8qMLjdvm@wQ|2~M|ehAL+5}A&nG6k(!a;tp)qbCo<|WTkaxLSl+`D# zm15HAAL{!1cq+m?@^)9-vJWBsr93BLC3!PzIWYs<=-2<8w_f;`?8aKb&4_4>4$i#V z5Pcl?g&1bsep3*!Gc>GV*&Dkz6;g-y;c4AE6&K3Hc%wMG8S?1m?s56%(RbfHUecp0 z{* z$mF5+rjdM^&?fB(oGGzoU;C)V`1v!UiqP6ux`t3pr5Kf(ddt?opcL1(hWSl5Mg$4l ztmJR|F__1);v{Z;KiW_8Y11h6PV0vC>k7|^9!T*j)VH5chwN)^n&N&xAN9p{XW53a z8Cm{t`5!|$gzsZA%)0pRQ@g*^?KJs_{FvC}Ggy5hr1UGUChwe9Y5t+`-?KFlSVM5 ziQGm0liWi7KC-gfWqqnmrSL4z1Mj6R%x>U z+1@HLi%J^Q3O-EjdQtW#h8|L}M0=8P#A>kPWRb>k${Di{%9U?kQ|(C5-j?eh>O{u*f8w)BC~vv zzSb`Wsqc&mzVvQ89$TyWGJn<6eJ7-+iZnw^<2Ge|TJj^!U4!~ZSV3cvJpH6z#Q~%0 zrZW#pgd6x9mB_TC8y8w-IO ze$?3Z>$P1+SBdSY?lz4aqpzQ%ckga=VSR{<+PymwYaD(c?2l97Pgee4rG0r^6Un#l zC?YBXM53UgtRkxd2?54{ z1Oo~L*^WV=}nHdZPnA#>&AC~O%2iI@6_}1nYX;; zQeF{QG+hUmzzID_RP*H3iQLmWiz)G$SLU_eT|JVpGqK(1wN`xQ95@&x=4r}zhmfGepHP%hecyp88 z;<9Gx4k{Z9{o-)^xDqMn3OzY_Qul+`mn_>oSie^%uO5A6Z2j`7%U4@h)N8&dp`Gab zvduwbBzpsvevQiBcl@|{xo~t#)`fUBAExp{-@bIcrWV$^^k(gWvkuFpBhA)G+j3EH z$Z7tX4m0o*arUJj^}p|!?%R_bo8)X66|A=oY0w`Z?fyOoCyRFf?y)uLnLB*m*36^g z^e0xj-vj%AuNsXn)P!%eUbdl~a!U2@pH7%gcX{y1t2mV_zjt8byUy<>@201GM{_6* zfgVEX!B>XYT6L_@_4nTW#!EZs|7iQJ{Nd+jBhQ`NMN(n%`S!N@?$MQm9J_l3WioGO zyk&b_&WwK%_;wfH{&95FdZk`h=LPr3W070qJK9d{F_x}GIo@;2lo;o~va>s@i5zv) zUA0j*lg4&Wc0cg745?pkRFJUTlw{#!HqRFg-t19F^X47Me_d6sbN#D}r< z$x)EsuZ1|xfs+R=0r*d4@+omtheLK**|XB4`gebOy)O;?ppE~iddHpT?$bNk{go3y zcUb$|KYsXl{loR^E~lYjdnY`-mub+V5%=%d9vK0l_8w=?o_l?Q=-RHC({W7XlC`Rk zo=$2;-^QAuXZ*@|z*6%OwbG?eX)09E*vkobJGiG;D?_s!uE0hNB zF7wI=I5KlaCo;N?x39GP47ue&ntSrM>)5=P7PC>jnQd(TA?x_DCY?{cC!eUS$R&It zxm72>Pum9Y+uYR;cI)&3kyfZzr#?Y;yV|L3eRMEj)H?Rqn+uB5xajub_~ZHZOVZ~WqshNhi?@4HwA>at1v{K)77*$ZsM zijCjqwuOlfO+Ozi%-O|)Q*+A>J`6uOD!IfzCMu3}#(x=l+-YA~2NZo&!CBx1R4e>j ziGm8vW~aoW?Xgb&n)qi?UL%@vp@q>7Pndr(tI|2D-B=tl&=0 zXP+J#TEFY-E`=o_Q`jd(Zw~oyXf8KKzjlseGzLMDfU^+%o zPYyU5rLAvoJyz1HrEvM~&_VjKeViuU2*q3GSNPfoqv6aWI+-5G2D2L;J)15kzAig{ zwIgQ4V@be3&77replHjmvq)O5b$#4S7sOF1{Qr|qJ-W)B75z$Q@Tl{6#CeL&es)F* zo1DV`l>z;g0nq^T5t|8>?=9Ivr2+oy&J4u;6vXWXkTCSb0#4W=UJN3BkHm}XZj0;U z#e3_k$SH`Z6hv|g;!X-8Ed>#q0xk&WA7_AT!a)#iVEuffuztRMWxX`MUTR;DyPslm zTMVw!H{VYTOwX#iXPg*4uEJN!Wk-;ObBIHaTsD8!2o*GqTQOTEwISL{bT zOo7@mR1Ake%rH`K$W9eFcb@V^pUTiffN7f^;*&nLUJucwPwmu0eAK5l=z-=GUTcI+ zHMmv|KrjRJ_XE6$0ea;CFMPnTVt|Jo2=JV|ZZWA5FTU+S>C=OTG%{xzkk=ZSlMTqw zM&?ulGPsc`Xh4QEB4-=GCIik+hUkjTNVt4E{09eonjJpY0iR=sf8~I`W4C}^?$$?q z(?ju-$pcB`{^Z#-zHfm;Uw|wld~bN6IAo}Dpn8bv_A3MSM`J`Yp}0XG(Wgi4)JJ^Q zqt@%A#*`~ho?(qdVMAe1BXOpo@Q+5~WCNL-4E>RW8cZ&nY9QM) zz&9^(mXqK~=vhpHwq=J8XnRg(V+UC82jU_ISd{~D;RDRAL(I@dmFWi1An5lb1WO;$ zsYl3gkgX%)vK;XD?PNHT^jD%31X{=J6)({hCwNZITTVhM2PEMGu;9igx?+d3lbX69 zVllj249uevyDF>di#kZ~f*pQ>fNi@B@E$3Hbgu;t>;i}70>=YIFqv3jOMTW% zHVjSXi2;nvA_GC>F^l0$G9BQ33s2^VfiVWa6H3EFhZgJ20cp4eA>(QI0xR>g1wofd z_Vrzqy1q&Nvl0~gkEZ^=vdmy9b5TtcxV77ZA!ad|{Cm3g*8#AaVwO>u$jj{)k5nL- zu5_SXhzqem=`daE0hi$U_p-%**AV8Yrvv|Y=*TSaHT_D93AlWb2(9?ZMINOl2ydOK z2Q*jR7I)O+w9n&V=ke$Tcs=SEW3*msRbNF+@kLolCclxG6x_^UF^n839&1`8jfXFk z*%|WvII)*igb9j5Li9D0_=90#z#upU(F>CCe=LxxJqu*zMKU!vo-!V61D(NS60l2K z4bL8#GC^*ed!%P04}Lgom|-)u1Zgmb%~p;4a4MeC?Po*1vZqz1wP@g8JH1_;#$ zQ5+yX-$We%aT^d-0HO{+)Bx~WLsA7u>HtX%0IvbAs(`CH;Hn0IYFMfOOC4aT0W1x` zL=`Ym2Tas}K#H_ofG1HY>3?^n4#k2-!NtLlZ((e1lg3z6m}qjDWb%JT9%n3g$UITL z=qpg)zul!nmoGSu;=SO`Fg6K|AiOs<@oA*sW~;Uh$se%liV4K|h%xpBx$dm5TvsyN zNu|s5XV8BKl|1_gJD~ZmI0A!dK3sZ(u7X)eM1UR?5%izvBS89<7TdD?FG2HH9CZUA z;uu&65Zb=|D0>ER+mM|akQM)PhXu-=ltP0cx*E_QFJ1}m9kBq#A*uo=|KFV!Ko{xk zM?6g-A7+4V^Hl?i%9gQkF)|zi z-SiI=7wiH1#!^n@G(pS{dHMVu^Z!ey{B)uD;!k&?%-9Op58upGC05$irg^-{-FX>}xslDh z7Lp)>?%#JznY4kf^7peF`%lr$ZF6fq)BweWy)-fwLa&_nmpAxa3eJ9Nu-ss7auz(4 z<0&|3D~Y;rAX-U;Us_4*q~RvM&D0=CJyIM89%pY;qaca;NB=>_#v_RqG zQ-jDYbCcO1=_^Qb135Qk!U(#c8TW^qP__SvXtv8g&maQ7X8&TO{l|@9H(D}DRIQIp zfJOTInnkH28FrHRg29#GFu{dKMT*y=GQ3g$L-N!A;EWKyD> z4U_K>qGkrQ5$|B^PO*4>0lw8oX_!9h zFxBs(I*%~`i$t)9oa$e*c}}=oeIBC_kFPpxgXr4<9^RQy^omxZ$-`l~_HmF!Z%!Di zF^|ax*|OE!@xi>82$jnTU!5neFvRR2{?`6Wc32>NZYBemsqxInp5sD5tz!Ymn2 zrTZ*Cm#eIFv70bffV2%BLrzQs45_*`ji`8?w^@=bR8 z@#(wRGx^TUH@tTL=_u^U>K9&T0@~b5o$_6^+iXkiub%N}J5%a-)wS@o>m$*3T;Us5 zyY`4<>5=i%=r?Em%e%5BA0eyrXL2I_sbB_;y#~)KSj+& zv~3(z)6a0paM>EH4pV&b%yVxjDZmdhzMy7n`)>aKF8KUc4+x?)YNR zLdh?AV6?w}ox{H{DtjL^y{vqZ;EFvKd+|8(y>-FE+!sIB^0iRNQ=}yaep}w?-I#pk zUuc#0?jIX|-)Pu>DQe(Y!HI|V2i#sYoPKZ6B6EN5R6x=muuV1idMTFi(CvW7P=n*O z;-0PLpRQi3?Aa3b>Fi&N6A!pfkdy`vr$R0xey;gT7~B#LzKC{qGicIB>L%F@?hgkS z{%K6Uu+T>~9S^t7c;qsfZUM_3R1DwWBGV6d>u7LyGaS8i>&ipNcWz}3XTBM94{C50ETD8Gb$R&8fN%O5(>Yf@+O)ubtmGESO%EPgDR{9HM| zo_&UWkUawg657HTVLf5rtGdZ&duHUbGcnaitBzLxS;gz_8y)B7gA1na&8|0Kk%=Ans<0@QS8hZ=dM`1j&%f_5g+|$pDr3rUCE%x6sgb=USU;hk;+ORK z*Q5EoQu(;&1uyg$a#y#+*H?kZq@G6RCJl|n6`Qd-G3ZZ+#>at6eDYH|G*w(YDG!t|t5Lg4%k{8# zSC^pDsJjW_crRHvLEgwtqwXO{!pjk9gxzwCEMEG~_E1*UN!shno>xvE*s1*?FtB8w zyH@_)4qNT4{8p##>brfm(5%8%<}iBozUBTAIl=dW^MjuTR|nq;&f4$T4ct@wXni56 zs1wtG>HIx&-1wvWg{MV*o!(cB4sLu>8rfocu_~a-w+fB(-gGeWvc$I^(qAIX6+RJG z3gd!pyC+1I{rp6#xokotH>aa4bcxknP(zb^i%mTCD>3U$WZgkMidT!w?j6B#H8v(f zUQ27E>G>(avzwh& z3X}E&YKZpK-cNS}3zZJKe(J`|f0DW_AMoF;Zo6Mt!)bSnZb83B-^O}^wOgq{_= zCfPmdosu9*x(@|cBE8=!UX>=klO|5c8jSn++4T#<6>MO=IqE2!5bs0rFOdp5#r|pH zku!jX!UV#5lz|kh+-KT~5sfAgoh1z=%J3}cMJ`{=%<#35~xKkWU&;$26dvUTv z+FnFO=?4s*G6L>p4btmBXZsJq+8HMCkD=P;?9*^IXujtd?s_v$xf$1VSu899@{NFe zW8iA$pke*z@^(gf!eeIqQ{-2Mc3L>x-O41i?+c@x#R$9on7qN9eG<;z;f{A6!}&Jj zAk8?|WpQH>&}#&cz>Xq5CaasX&%(*N`h=kqV^ywj_7OPwc`CDwG26yKJx`@N!wHXk zC?p?BxetZtLn-v3kbNjrAN&m;{4*c?eINW=A1enqIX@MenF`HGg}zFK7NkO-r$XPP zLSLpr^HZtraD*)!aR!cXf+M`(h{JGlRw}cdfox+Szc7#;3}h<<+0H;^rBctp2~T}w z*kgiIt22zz6`00c9gV*%(ML0uqb?6~7^92Ll$LOg=c? zQ?)9xH~h?x0nITBk9^g0=5UieS9lw5_nVdw?II-N(e&Fhibt3?Hlc3J#I*F`Wrq%B zMsi!=`{+koDBHWbnNYi4 zpj{QlJ>b3&<+r|iD;zwh9H=W`IGVpq=^%4*7{iM82vUKL8|OMGiBxw|;K zxVap!AasRF4`f1VHcqKVfqPisZL0h^Hm>Ff_naUIv&=$WSCJT77)!6Yzzr5)FiX=F zc(oc_d%;D_Dho}@a>{zjT8b`Z2}LbqIWo?-2F`U8T*0ixY2e^EW!x^DHqIQUgfqlJ za3(kv91I7wfKZ_LU+}6KO3XM&jWYMB;Jj#y=p1Hc)jF@`usDEY$FbwmIdrb3Ktu3A za7yr1a9p%eaw zHg?Kl5MNfUH(i?;r(C1RRpwX=VuH?9tngg7cR3_ZgJWa5a_B&Em8Q+65ah zyDir0svvJ%=XheaTCB`ijl7v%%c^13vS_S2lNyuSubdx()ffW{<%~7Vo9HNXEczxo z27L=1$G^dk=11{k`8WA7{9C-***cXPm0Ex!7A(bVsaoN+8nFzq8g`RZ+r$|R(v_}| zZkKM5npQ2vFU70lSK+n1Rw5J-%7sznTjV&`I#>;?7Dj{B1#n6QW*Ez=C4DQir|A&3*$3FrbtLAJnGz!N|OB!R1dC9oH1i#$Z;q6pDCse)8bsv(6- zm2p}!P1zcmj!eNygIlp3xNwMEdU|+ccK?Cr5z&cFvG}-9PphdDO~FTT)#{W$!i%HQ zd23&(CI)$1h2m_g-|x&Qo*uGbS0q$|e^Lh$bv`L&-Q1~E zLE2^XgJjE$0aK=2rng@t-z!(=?Y0ljcu}7$n~?M7cgd5#+t0k%*46#c#@BI@{J5>6 zjqqKh0G+8G8Az7p%Ue#(_jYv;oMs|sxCqae&MwLF&Qns~8iJX#v&EanMtP@DLU?!V zOwPr0st3}0nt$>guZmeyg6{eAtc;LwR`Ry`8_meEX*Jrx-Q$3IUT=qPz*D~$p^WkS z9%d0`#&om$(_JHHbCFLp@}r&pH2;>{i@$xSjd7s3S#Yr3EUoqRS5}980Qlv-kl!a- zdJMi1FIuIEFLcmzsqVckt6-rLO!18!KIt3#CXCDHB;_bVxpCdKx%A79X5EFwT_J|K zPmCEkKF08>`96!sCoKeXGgi2bBfxJ%m8nUQ-3e#I4s;03BdZ>S?L$-jUdocOX6=N_ zH$$i)n*|}26BqOP!{$Ug_`E9UyLb7!cU8%}=QoJbK&dXFc_F#Q&%;(AWxn%qFWw!o zZfxAFIN=gMj-HKcO=O49$94$sa>UFg&x}-(A2F(0=iSG9L;2jHgpP73%h-g^0ikx( zB$oVH!7cOk#=Jf9E{lytkWe{|wPK?2{rvJ-#t-VRUXmW;L#HY=`KL|vF!|$%?t@!; z-!C7h%#wjLnk*sBcrtcCmyxO-oFBuMe>OHnzwebVg^R*@!(%g&Yi0w1P2Hu~oYFm6 zk;CrAYVt412*J5|(k!rEq^TKMe26?Wv*ll?xwb-qBkXr2KyjdDnH;+ZbZptgCVYTu| zH0*}FFdBA!o+}NzF3*I9RnLRau&Q~pHQ2RztQzdHN>)vGl^v;^B1kXYoKf?6a7Y&Tkg? zq!%`eJJZq4;Z&i0e0PCm7z<>|%K_F%$|Aj@$uR`5fEU^-Kt|J$!SSjcp$h9vL3oTB zuga_PnkE}qK&%(KK+)PslMTsW0s_SJCLusjq_9S$pcfAVdIhwMlM$KxsOp~kIdgBF zJD1Ih{9tC}KTrJ6N1QnM`R6rn@+SW*@`q06_=dOkxAxy-`yaO3<2${zzqS7!+y4L{ ze|Ok!>+c=c^49*={`+b_S*_N9YpK8N{rT4Z*8Y2GuL1ogZJACdd7ighk|deU=3hN< zI2^QhmOqcmUbnxrr|kCn);DR(yS=|(c?Pe`KTYROr<37uxVhT_^bb$N>2&f6rf0Lq z*=+XZd4FeV*^}ONa@cru&y(RmI`;LgZ{p=0L4dW*Cu}yG_8z@n?^{}i(z&g(1wmlj zXa1eE=Xow@?p-H&o+nANxywJE&rW8%bRLi9-gUC~Ce;12i(pazJLfsrN6s^yPDRDM zvUR=Q{1*D{H`4x2dUNOVn{f=>-`~$>GrWdwoyQ)Y`S;T9V3#CGn|n+r7sKIjHk(bS z)9Lh5_7{F4X!bkjc|MyxwokR!Z$qzKt(D$ukBv#P1K-!T{)YPPH_-l$AP7JnW5Bmc zuh*MSr&mryL$B8xf1dW2y+42Z?Jr55=Yrjnv)O93n$H)L$weE@Ns>T~-PLO44{Q^L zAD*V70({R0Fc|b?DDXek{@vkl@cLHi`G0u7{TABa1@7CP94g~>%i&gb&$IXCch~-s zBuR2|R%`CZ$9q9DjspnPKAz8DDu6zu3bJ)Jo9+GLQLa)$|7%;n{l5O`+xLw^FTGyx z==Yae{zYUyUjUQI1-m-3s zIei>-A`~4)#{;70Ek|aMo4L_dG_K0titnxe;Z-(d4qOczyYs+{z9PSa^ zqwY3Q?d?;&w0}dmzhUc}04MA9FD-^0^!ss^744SSKY#81zl%>X_1fL!-5v5pKBv>^ z<>imD$-0{=<9hx9}+%x{<-)yD!JO z?4<5B27~X~{pk1iJG{wXMS{Ru8~mfM;`b-}Mq!d9C(uh0`A-^um`>%3D4s9y#r@en zb};zP|M$1P?tgmOi=Mp6H_FM6KTd&*iywVczaO8RoB-45^y6#>oVZO%l5AR|@DJ1J zY&JX8=)EM#^ZZR=zscWU{%~>e}fuGnp1N&g#%@;HSldVdcFR|gIMCgeyjZ1hPeEaoFA}u zD_`E)e=qGpV1HBB^DXUvuxznR&nMIK$trtV^ z_S5bJiFe*RZL`sBF15GS?;~Fhw>FID?ell|nIy?S{2G4M=gITx4v4yq z-qnQx;`qY1BuQwCWnur!>4tCe`;{aK^St~=U&XJGcLL-*-vHeJAkUf`5Lnw{`H#4^ zH~GiQ?+eZN^wG__1jN^Ib2|bS^9+b$1>_bWNeZCI#x^^bfl1H+hrelH01EB=4fg0%>Z1+nW(^dp`$mew+e% zwg!@@(aM%LCjBPAMd?Oe;AFkJ19EKuV*ykEV5|b-7QYZ*N7Plk5sx?d?MV==t&ZPO z!xvyE)Iu8|?iwIMQ9G$wE?2-H2IzJ_{3EXUP2S{)Smr>wG_ZP?<^~ug09qSB>k`lw zfL2m&94la57$8X=fGBu_^_%?T#aMAPE8rah-#7sx1&|jd)S-Ow+C&LJ*8o@z@U+T+ ztIIWStolvWg8$FMZl<=0BM>7!(j**15i|QjuPm0BcQ4z zuOkP7?&R-!D{u0zEm?5`Bq{;oIKtuc59u;Zm+3H3!$eg^RYpl1{PJ>ic{y4atP7HO zn8ZWbCyK%-3P;0mGz`1lq}xpvt9-G_e+yyHx6gl_&qO7ON(6xrLMZsGr(i|B5Ev#3 zNV*BI{5%7q@B&!nDR4eI$7y9T97U2u0jtaaqy8JKev`k4WckBh%V{zM{-6{}0VR}q zVe-P{w#sc4#Yq$=rbuQ?5JOlL({&C+QDXwe zK?xK(1j4ugFcDDM92mw4uz1da;jj;At$|f~1ElE&c$}T%7!QDT-(@P;Tl-u4pVeOK z5}0Kfpf>;)XX0IsfOmRpfYG3VbxsHj;}9qcfMu$IVc!C)l?HUAfh;#r=YLBQ_;hj( zl%>IG>wu08>S3auR?uos5;;$Iul=R{-`fAx+6giOY}NPe??)p*iKUk>02OIqG#UXX z&(9A)QE8wmGGH4-Kvif!(xfZ*k^r%a{M%FH8tNkIVG;ota3*HljesPMfyyTJR2eV9 zXP}=XK$dkmkp2DN+W%$RgJ=y@x&pALzP%_G0LlW(dFl`8#t~2%4V>KFO@Sl{{pRH| z!$CP)8z4{$NJ8;FYn&fiRQ>I20ZiYI0Bi*0l?I}2lS-RJO(C14Ujpgp6)r!dDp~=_ zH~E*Be!l{ipHm)P>QT1Xbsz3w9Dg#U$0r^S;H#c%YPe5UFAPy4zTlgk#(vmC_C@ z0raNCsdT;C00|K;trSz@LgK4c=}#)8p^#I^Mc5R``y*ge%z%rb0*W#Kg1`V5qY$9J zfpJay-#-7fKcCV9ct7p}d9HwqNeC>S=0K&v@n(_2W`OEOz{%z1*l$)XP!_FNV6ID` zABDhlI>Pz?ZtoUAlJxxB^LRf8f&gGR9sy}q0C$%|U|np0IEsKuTcBHyD*%-q{}y`l z?eic0*^SaYggm8Ul__8`OM#2&2w2P(z|HlAN8`!({1lwomo(Pm_-q6eMFZ>QLxw~B zhKxqY>oW`esN)#{}Hb!9(h5n?X z-GyKXt0s(q5CHk9P$hth3}AE#5QI24__}RDyU{#bj z-aPCB%%3!nTLW05fFEb)z|(RC^x_bZ;xm_%5wJ)%z%VhuMuO_?ay(TGqidIGgnGl;cp^zUREuP+Nbaiykhx zt->C#$uuw;N5IYH2>5U#i@Zlb9dEJVfG!!;x(b1Oli@~&^YIAhee4DyFzWY!EbIRz z{q-ilanWXu)5r4MZ*EiI;$j3CQv%nQF>rlT0AWW1B{9I(0;b$R?S^|7)ae}t+^bOn zj4qqV-$l{~9u_HXIFRU6X0nn?^zBcQ36=|Ru$y;Ezj!((2Esr3>WFf z3Gm_i5g*P|0DT#&a}D(42pA?IZi=ATb^TEUymLTq=6DONyF@_CcUQxD)WVWLfBu{T zwru8yOZcy!L_n5lAYB1mUXFl=4-Y^YmQd5=59d-xFUO4)lW9b4oze{qu==cV%;{`6 z#@ZkVthKZB5txpzu$Cb3?ee|-`PTm1X_peV@?-^KGV-UZM?gmSQcKWn1Q)Y08s>x7Y4Yw>H}$d4Ku6bqNT_lB5r$88}n#vW{IW071xj8UpiKi6g7!AcER&AP5|Gq_P*l$?54S z5Xs12&+Aq|-df^!JV*e#fJ_o63IS{hZfF=?TmV+*Kq~72jQT(lE5OP`+HD9_w#3Ed z#cwU47Rkm=*BL-3#>I+;GTc0^fLU&VQEeqAP`}z6T>@u=OWx$SC(r9gpwt@Y09ed6 zz@>Gy%{ZT>K{MNfjML-fNs2$6h)j$%2KpZK& z=FSZ;7${tdX{RGu92dZ_9|5vtkXdbT`5yIaVF1oAB49QzfpoP2K1_Q+l8k|Lxda|= zZvaaQ=wbxessM_j3z#AWR$GAKAjCnrtm^yOLdSh_@a3(2uf5w1s>=SYe^;JPPywt~ z8{l>-PZnU48z5cW1KH$mbq1JH3g7gA?G`$8&7uoBxR9>hx(?oM>2&IS z-rA-8G)dCW+28K`ky!v?08mB|F7lV>6_AnQq7CxgPX~RVf2x4_G6gO#7f`#+E=FRN z0gQ$UkVV&O@|l2Nc(a}5ta>5N2Q1Y`m&+xtkcWumOpnj|P{;pP>&AZkG*5BXt2kxa ze&}?W1IZ}C;rk01BST+ZAd0bEa0;Og?x zA6xhDfxNXxQLtLAdcDEl==}GOm%v1VYs(bpW*8_15<{ys^x3c(`Fk#5=Q9_6QEmHQ8IunG9U;dobq3<0hG{l0^ss|=r3C6 zgt+9=GzCUyBiy{hp%{p(#=;ewcV|5oc?+*bc;`-RfaOyPtO|gBEYb4_D2>K}o~i?= zc>Egy&2PLtiUO_ex9|U}+HJW6o;E8yKh8G5)%gf0QNY8~0%|BoqJ#v%>o~FCa05;` z>QVzyE8EVjH831Tz`M!$1TY;9U;^B9EIE_7G)&Mq(PYT5^84EexSR}uE-5e=0%Q_r zPd7l)3!$bQqElz<97x2j%m9QMU0?TrI2;3)lRF^GN?g(@R^H$qaPuDE_LBx~&H(~7 z0v?}J;Cv9l@m_vwKWtBuMC=KzHBaZ}eGeCBxV^amNC6&yz6Ks=Ghp+{ z0Q3RkP~jX8f~ej|;UXK4iyV(enItQP?j-zy%r~h3bZ%%C-n2j!fTJa*CKwu*r*Sjt z165Z8{TLwA;NB!%Xuv1~jH3itu5)1gJ^|Lb!D;^U zF8jE$zmgT$?~Q=lSqj`<9q;Hj`FqOkOaqfi2#f}O+_RI2ggn_=sscwp2JaQHOmo0U zif0}DP&iF5gNn|ZVO`Rm-_`oK&_GqI`6j#)CJHD`2n>5YV53usBhH(kZ<{A(e-TYRvbh74I3wus_ zIJz5_5_SeKLOCuX99I_92?8JQ7Qk>g0p7_}t11Wqt@HY6dv=>7fHpy$Dz2 zz0`o-*^hQ0XJ$WUihq7Gs?bQNES09>o0Q&ttE@?^P^^&%d z7b&ik>RK+`XrPxUU`s2=*%G@G8hR7j1p2Qo@+?G8Uz|rkoQJ@Cxxqcza3Ovwa28iB zA;4%5LLDd(M18nf0GE><4uRr&PB$s=E{a3k`d78DAr1jklt7y0K-dj|z65FraoHO4 zhXtSp3NSjr(Rmp-LX`tqp>brtru_98LVxV@!vq&3FRBedq5u^GJbjj!0w1eF0KCL_LcF*v$)*owE$f5@l!o+AlyR}rvSq`>3j1@O4caX~$K?xG5{q^ucm zu7b#FK-a3M1ajR2HuD8eQ3^ia$@|%ru(kr&6eTWhr^IV06J}GHQxE{U6ws7_lrCsz zu__A=%K5tCNdjf@DYhXlv7+;fK0pC*f71uH0l?ED1!S$c*|PL!Faf~jMITtsGGHWu z@p%eZy8`;79Eig@f+$0wWETXk-U+E@^BSp8RmDbY zpch3OtuY3rdQoI7k2ep%!^8d2{V}H3>j6Q~4FYAYu@D5xg0*J3UWHJC&NAHadUXH2 zYy0Q;K9q_p7a9oY1GO)r<(!o#D~V{s{uwa3xWg+-@ZS>>9HN9uZq|l<1RCI-)X*48 z-bJKUuZ2;`)=w@tKiTP{YI05VIw z(7@v32jJ#D#no*JFu?U>0(_cp096>^{%Hwx<38~ClmU}*9~hwkYa1q=L@S_@8G>|p(G3?_Nl~QB$mboH%$%FGy{(AKOUd2 zi@eP9^YbaNT0INywcbQgPtgDJ)%_+Uj-jhqPZYQwX!o-`+3`5WJ$IoT z>Al7oiw-|IU{vUj9VH14?!7ny&fh1%J4ulinjwiqA_8TpsI(GTMH(#WfZ03+Le+RPk~jd8 zE`S<`z|CC>yuY{rW@!nW_p#Q<*m63KfFjF)PoL!NEK3|j<)8YqZePq7S+0NiW%b>6 z!}k6vQeux-C9jPVhpE;^CRnY zd)NSH1B>%bZe|l8tt_xwLrnml9wvPt`)mPg>Q^xY!jO`ZFbuiB{QyjE9zqbOr7@v4 zI&?1i_WoD{$_5C3kOzxGS)na8wraC9Fj$W7kMx8p%d9Me02KvTWw44sY4m*ls4&Z1 zVN4kH%5H5ip|sIP>CIZHUKHtK9&Ay)$+}pTc^U@2vRn6Ir$gXqd}T~msVE>&HHlK) z05FwR-5{uKlOtl4vfC)=XuEZ+(Q1My=xE7Z?#F!~(?!tHVYhh}_m4{;T^r!yOlFsq zKvrpB@o~<#o-)7iy?BrsETLtUn$Ga(h`YPZu*CZ!SzNgEywY856k7t__=cJRsV4L@} zL42gWWg5ym=UmSvaC`k8xVig;%L9?YYcU%Ev&RgVEG5)Piu_KeeP9$vz@ulo#ctiaUomDUDDRI?Nlp=y_cg-}tNI0O`x>2_5-lvx`VS9?wtFiAgWKtTXlZGg1M zfW_q)nA|LJQ$PZ#hd7Avo~P4k8_-f$@%$_S@>LGJ6DW)J zt;-mR-a0=6#EYhj&_l;%dH}WSM4acF+Vv3bT^u!r_uE4u_^s%NXlqI0mKUjZ*%TT` zdJ30G5+@OEJV^!-P_#_aAjp6s(|9cugIh{;a+BeTwCA6mpbn=mRt6Xj6maojgyVDb z*$wdh^g~FPBuPmbn!3BK*SFRvFjgsyd{P6(gRlM)mXwrX7^)=nM+3$Pi!e&5AgHOZ z)yTJo3Dk~!W@6ZxLjlec*cqbO9DGV-K!^sLaX)zf#OHy!YgyvlLrpcRE*b%3l)aH*{} zYuu5dxmQUEj3tR`6$1CSBVZ=QTf04=zyL~0468z}t)$HIPmAZ<%c)zg#zLSlhCtQ4 z!ihnt08q-hk)4``$!)sE=8OB&c!)<)t(ZY+n=9ep78?+tEJkwHtp;U+0Be;T6=*DI zBc_O;R|NrD69q;_Do0a{AUo<41x9N?71{(^MKKXx$8SKg@E&JNK$jcfW;y~U z&l})YGM*)B%M^Yq z2o7BEM)oxdj6zw9(P)EGMk%EYfvw@JAwU|9u`04e0qfdqRSHaGD6uFNe>=OHmRXKMH$5CS!)) zVTVUWOp$tlA`Fn|1UFQftl?ExcPTD*pQa@+o`5Sp^7ugl<{FoxWV-;hWh)Cg#|r3n z6CkGo0%Bk|%xR3^2zJT@Ct(77_~{Y2yqW-&*3{tU;dWz84N|2{5Y+s()_bVZ6(6og6FbyW0dQ;GAtvbEJg~av_@Wo<0RJBoLd_cSY-pFBBiwn0s>TK^3a4< zsUSjlM*tS14N;_`2y6YAqKwH=AvUB`QDCClPDBND(Zt7D3OxLH2`rwU0EQ6`OojyL zb^($&$7j;_6;P}+Fd2rp>UH9TkSE(F6>|R{CL>@z7r*tsLaZTfdN>41nt!ENz{$h> zN1S6$ywNg?t8MVh6h#4UZ95on6-UK<+~gUq)akli{Xl!P?6ycp_L{TRA{?RLx^%hK zCO*D0ar&Z4fno))SZqql_mdHjEgkg>6xK9jd2^p7CRD1%Ul5^C+8ConRlENY%4^|S zhuCd6D=ms5BmCJmKS%voj1XesK?=3mn6e~EQ~)+Gjsbx+QKSM_F+!NW)kF~(rL74f zC4~X1Tw80#(;i@Thy$XiU>VG%jO)CCSM`J6oCY?Qwet zIjyat3T3jbtb@FeCRr&maS4UscorkmY5fCO_U^Wwz5nPIlOx_fKxy0hrMGD+qj)3dOGyqU4GCP4_ z5SLsK7%M!)U?USiucvfmluk@&5*3QS!nr%BxeT?l0?=9qfwCw96G#{(z-Uwi7A!<6 zsC^hjk#prms`i)Y+W9SqD5VT02oxGa9uWo+6ktr28enuW!nx-*Qhq=Iob^Y*{3*jN zF_qBq@Or#o;1o)oF0d+r>17`mVUQIdHmh6U!%Yfo^rn5=I7ZN#d*EO_0_tL-BGV6j z+zi*+%h86lR0nmbp#Y0C$H9G+C|vmgu~H?DC@j3@tp*^iXVn0X_s~GuMhf^aj(~Kz zVYe!Xi0BD1Ci0^3XWc($z~npvbY9}>Gt~8*D1nEo369l?h3<;6hrm<12GWgquRj0} z4`bl|egll6p1&huX{F9^#;BM(0%GB1wgaM2BR8%)SH5#CI|mu2*3(wm0BsBwgHghS zqneZlfk7!15J$CpL|bKzF}92p0Sbe)4Et)G=e=GS1V(Ny3QWC>h{b}TjNF6w`zzJ# zFO)Bez$V%lWAi8q6`a2x0mDHL7*8L7QPT8@JQ3-!?}l?=)Qf;0`+eZ!!wqg(iLS|k z$9w|}&Hx@CHDFZpWW}8zA|RfOd$a;wMI4 z^+5EohFYx{X$&Gchf+aJXNnS3D3Fg6Rb=L`vVR=b_az1DWuk^)pjtH#GF<{Z+>UV5 zRK@Rf|KSN3k78h!YX5ZB&j9059~Z%pCtC;0BIEI(Tgr6DtPTNsgGL1lFBaE@aPD`a zUuB+cTQ)8JS|?e{rvQ5~JFp^7AMs#FK6m^5lRaf7 z;__JomlJ{72AEzXxJ*DKxu8L1L7`G^w-(HsE{nlPYVrfQiH2?D3S~% zGM4}q6>y;d9v@e&o)@r0xJ*f@SldGb=dE%VvU)@*X~sh2>es*kWd`2g+mCRzoH#AY z0>B0am`wV>JK>I!IxY1L#BLR-w80Hbg(-o`hB$k6lV!M^so_AJI2ur41ZX3%#^!7y zo4jF5f#|Iac2iPnWre}H;$;@v)&g}cj&vn)bA>DEJ01lVa(ld}5u@pz&!|wl-lUBG%_8+nEKj&#s0UqAAp;i z2fx3R2e`SFNlgmS;vFc#fqOVI_$9Gb3FNZka54n)bOl^ZL*Rav0a8Y^wya8nBQw`G z4>ag{;?#uRe{76A*xN%G~Tsm%u4J{L_#XjsRHu60J1HE$1MW$O0HH*i6u4?=oBI@(s+#nB zI49a!3?PL)*46^&qam=A8YHU>SWIK!>@Ed{$rxBHGeB<)@OYm9kFzx{b6Vo-9EF#hCNT<;rR|4(oNg1QRacuP z0A+A)K*F<7aakcI`3b+2L>3Z9xk9QuDwV+>16`VlA8zk)IRJ8clXcPKTZrVG#Avf-sT&Sbd-$n>zmZCebd|L zaRA(>1ui~NEg6P5 zKSn$RFe~tE`+SItay?33SQ+9f@okDFu*?B2$6X+mne*bKjlgA((Cq`~;|SPfDX`4< zfMTo!^GGDP7)2&hDo&ulSY?fgC<#Jk%OFTpWP+~zLTI%K0);XJ#IgFd`&a88pj#vA zqhwHCyob89xXiwm1R!zLN-s%|UC`85e$**&z3BsSRRBMp16VmMih%2d#;@xD!1XW& zW-Ei!yFzceu?C{J4|RfZp)_zgIs;awz)iR755-ds@Gh$WOpyV-euQ(<$&A49uurXs z>jy74pUBEBYJMzF37@F4rN z0z-Me1hRTMnFjh<2}E%MjIRRV>}&~)CVd=HxqU2wVG;pPYYi-yAAs@rK`Dhb+IvE9 zF}%VU3z#Uv*d*!-F)-HDB`rU%a-hf-x^{^emnmtCO|H);z}=?@Ygk;}03YseMB)=o68H}bQlAlR|PJXmZmAF zC_)=^d3^y${{1S?aOQiqS_FYIHUchW0z?o1w?EBr>q?5qg6~(Cmq1nJxaoFM$ME9p z0T_)UAPg0dl^V!51{j?UfF$nvvn?J{;6hRomfHPnJ@-^VuQLry#aK5M*h~|@>)TtLl9FlHqiF+;ySv7bAp1yygUktg1$3$n$2 z+EaZh1N6moh`{lr(V3b*UCU}IBI0?F$y5P7z)Jb+IKsKu>bQHA1IB9L!$biOa|1+$ z24*v{(C0vf1)ejpA`Ng?8~orXO_?%>t?hR0elIs~cm$=$aK~Msd4GI($%PvBwIyxtibxVq-VJcsvGvx_<=17~s=$4&=Q) zFdZwLGftKnzB%gyxAV;RLlTdCFNq<)xZk+WtE;t$$zHEBB_Zy<0!{}3ZV62}Se|Tx zSZ?gea=ro1&t;)kjWgoKWUrU4k`&?|faD&Y+&zqOET=2=^iwhZz`rqFfNlqzXQLka zL&dIEmTLal+W2F&HNfre?`t zv{(T2MkCmH;b=Ke2csyA5=9^Ul%^6WQw`kS^nu}J3XFORc(@w-{*g>TQ7HX!5BTsy zic5%<`S~)ZLiFEw(#Or$kTtPYOV3EQM8eJz+Q?QLe3l%vdKh4RKLEy8YvB4rgv$oGpKD+;Quu_@1i;OX34yXofkarf z1;-sk$w~n_$;D4pA22opPM#N2)dlC`?Eny{5a_lPuz2e%r7+7l9{P)`YL{Q*DnBl= z0#^l1jS8SHTT!`Oo~{&HWeWuEasau=S~~9d`l171D-QSeUVF1g)fyLLCy4x+0H}a&kob$)zepPZoo;g%^&PctuFgY} zf+9W#TC(l7;Cd`*^{E`9x~-0SS)@{9m)b#5h&Q_=fsi4qqE5Tfl1s42x1^BDj-l@|8uqBTLEZtsMnN{ z$hBx_DQqB6ws!xf+^Z|?$DwKKNsd9&)Vdw_J=oh{%4$|X^OCh5mK9T8`4iXOWph07 z3lxw90ku(6cb0p&CA&F4;*alkLwuUi{_XBdt$ORFhYc`@6TI}=#alc8-1qeD_+<+L=tfBrv8Ov&EJ<+{i z@ju-jhxgvDwn{EGMSD{iHJjQ>2#|VG?m79!90y;a6Gc&Ptn>!ZRR@S-KXBG}gVP*t z*sTF1@0HwzzwG+Y0Gviqkvmt5kGbn=TzI(7^qnOCNI&mleFxB@q`e%fC*S$58#BO^ zMRT*%oS-Xfk;wT9ccFHJb8y*~HpS`b`sDTQwYd_h3a~+!mI@ar*UY3Iu9`Cdc3T45 zY6qpFp2eQ2Ox_n_7V0*A;h&X>?qHUYRo6uOzc5(1{kfsRv=VH8>>2O8Ru zQ@JJS|G;140gXEp!SP;K?mfAq(tekGr`IF0*1QaH*;@CcfA9hL6%gaPF^MFO>JF4~ zxn7^3TOZf0fN00ILsu0}uY0leY%X_Tt?hQGTKlFvQst12*Pbndz*KIZniE@E7W1C$ zjDC%c)?AhH8v5nIa8I21Q5__`Noebw#qr^{BSq6D^* zI`6Jm)N^-NXBSdKG_U_0^yx-dCt7b>oo;vUv(;03@4D+g8Pq&bYbS<0)C14rj<}~- zmp^sQuPA0OX1AoVgz~#8^4|et3*78tpc_WCU@FUdwjO8&Y?Z|7YYHezv2r}Xfx%yC z-3)Zy8{gUS#nfo7{H}FJ?p%DQ?PF>IT0})%oJoK~cA$=_mECS@VRz>R`xe==K%76o z06wl#zu~qX-enz1XF}}DH>g1ulyUEoaBhEulz0|1G;qrj3iSQUA`j~1m(AMlzCf0p z->*Fbjax0E6jrGnws?mS6ZBp3o?ZR<|={-oPISGk|o zQ~$cyrjD*yV{zU(cCAJlhlxACtSI?w0PV$Su{Wyv(u77k>Q(DkS5&Q1g80PWJzyNM zmTBSsPq7Y-b7XZaIIWB~4ds3vqmZZEZ7;Ifa)Z=9kcyM_>e)ledXqv(>I+O`uNGiE zfF5|+_8qI8fR=I<;@kCCCim(3UHbxSRnERi)LdA-FqeCTUEB*E#6amH@U^y%oc^d0 zR^LSwb=fg1EBB?_+N+Ube7`Dw4l3JeFA;Jm+6Do1>S`CAKy9s2U1ciMiKBfS%T-Hb z5S&L9FY)HX-cWl_r*2of7U7^<9BYn0=w7Q0k;|U3ZUy=0NS>vFmQZvpV-&>m6+E1oA)1`D6mb@!;&{;eB+GjiXiZ zbD%4rlj}fN9+w`Y9+%s^U^3dleYYDFrBy*2(1Edw+0EJYUESF2p36+F7LBHj@7fkr zt-qSx>J&eyIx)wL>^%!~Bn~TAhFJJb4A}@+0j)9Yt6KR>x7w_MnAHAdD@cXmtJ9jPJ zXOZ_~ z=ie!D`RRiJDUL!~7k|VmcDltNXg~pfxsJg**(g&Hadc0A<-? z8wO^9PL!0N(=hC!x{LUi^z7o|V)}ghVKi^*WWFRx9Dn-sG?`og0{4@XlgWh3%d3Zn zyTkq4YP&xiU0h5rFR#|?Ozg-#qssf3E7#{iu%q}qyK8{`wMe+99P%3F zQP-cd0*Gs;b!?p?)3(NQWld{tPQ4z9?Bk4!Q0zR>@}9Tg{1~2LDo>!*j=pakJcK8k z^{W0Z|Loned&|6KAa*w#!Sr6kq3h}u(`3(a(b%cG@WLfn(@sVW+TLGUeu4vK=3wrk zm|miGyZ^cI`6P}9MX@f+>dI`h>GkwtROsS)u^c@;e^o=bCH?&Q^J;Z-eT@V6q3kJX z{q(4{Uagkta@lf&dIr+Et-8e{ThZo(-;mMqk~FNkTD`PS{X4p5R;At3iLH)qtTKSu z0knC@W&LxxcLTUh0{6yn^z>twsh{Xy*4pLyMlPPYpZ(L~5)FCn?Blg^XWk1<9}1Z(M1KoI( z=h?+5DRiL=9gQa2VbWO_o<@Ha(;}XJ9Nl>b)6O~sS}*6mN#hN;m*`m&kNh>#G7xL^ zEVG_*MJ!t4U}NgC%Pqf?-^X2K$0a`a@!RWN7lYCM`EJ1x4-SHn9Ahc(Xd%YuL@0Mg zuXK%5jJ|igPHnwIZjqV&o zmlRc5AW}VvD{EbsFm;(Cx*iofiKo$#sHP5u3uJqJEIwvqiT3;+-L8+zXqS(wx;62L z4k>#O*7XQl$*U)lxa|)X@i_Lq_6m+WFW|T>mE);sGk24eNU6 zW3aA&LYKfh=?-znY^w$`dnSm{wXxLhv^`F&nrgFql*5V&wp#nhMKc&}Ez}D*)1n;S zya+n(k#%dGjnzSYi>>@g*NNW$sw)>GGDZqi;zB1acb>ZrYh5IH$3Gp0T^n^fxo2e| zlv1xzNSF7)-7eNYJvDi!dlFb4?z-bql#aUP>~YU+cT~*>##+U4o4k*zh8OKy?MK8D zMrW8EiE?}Jd8S>q#_!rYWCtS5a@bK;?AF8X2 z@vnzGITh6N8&pu|A!=Q}LZ+%`5CSgi!>MNlHhkwy2S+>IsO|z=;8dpk<#|OI9#2gK ztRq9YcivT+-7y^>5oqUp`E8Z<&iOiP&*#)P4!Ej)M16T~p25~wVacU`G1LxHImpq2 zeZMs@9FF}vIJv$U{HV9J^RC6IUP0-Q*^Q1W-Bp zvFEiY%i~b+9GZGI1bbN`dt*A*RC{iUU0&BH>DrU8oK~nWpnc&{x68Hw@~S!i{x1eW zlNRD%67M??0?$CSWTpoS7$&j2=>6E%w;l}Rc+gqp+kQ+7e|x%F47+eLeV*s^`JIA>DE7T8+B>zpd&H^mu0K#UZ)V3Yo8qP;$h3f{i(kr31r%bu8S38C^xU$V z4UMkK6aCBj&`HHqZnKmE_uAENOzsO;Up%Q155Yva+Fp;Hr`QeNhb&v1#UvIxsJ=(WBVjKmmUP~W6MEq!h!6YiM!J;+(jO6 zZ`+#kbC6Dm>A28+dj&%`4kw8ptLx|ZdDX0$77XgU?t9e{{(bjo zl!Nji4f;cqLbSE5f8iLKwXv_DS(`x69N6j=GzTa_b7k}^Xs*5u%~jR?7BsizH8g)s zvd`Jo?c#KBd}~`nCzsdf$z+sP+1l)(8OU8P_Xny!Q0lG-rMf=iFdm1 zPT*^N9eex#>G^;9zvln1!Sp7m?Be12>|#tXjFk@K=xM&_Ufmp~DA5VdlX`*5Ln!ZG zEddZN>l?||#$3mqhqSMI9Orb*`S7Xd=PU1R%^$62F`WZa{T?_;EHSMsNfYeZ;d@fbCzW_ znyooRbNhscXbzNm1sYlOYA3+9sIw)$x%qZ9 z0~)Kb**Get@aaH}(rOq@!s%r=y$mle17ibY{}MgDC-#N;FCt%CCj7`9@gAI9JR#e-|J0e|{WfBK*QpZ}ln!(Bf6 zJpXhz8cpU8({#0ddV11@etf+DQEw$dG@M?RHy7_mb#=4a1pM_9&5Ce0SY2wXr*S{M z^~$)-K#%6}wnAg}aJS>er4z4cwLYpcS_gXsw`QjL4vn36+4}tHRw_;_N0bK5E?hvT zfrnSXZf-8X%B>}kB=t22IS~!r6*Nc69-`SZV<3q-uc0|mN6_5Xu1>y!W@``8Y{>p9 zXg>an$F9wT=dq~Wc6yTn_xDXfzA)^vwc+&geLNYZm7uvC$Jsdg^Uw_FX`GFtY#c4q z`r(IB&|hlo^z{Q@7xRtYwU$KDk>O4sUEDtE9kvzTz1^CcmzO zXwCKm{P5DIeLfHA_*n53k3r2({?niS^yR<)ulrY5*;BSHbe?C!(Kw=z6s1*Or1Q!+ zZ}*?Al@Ddq>!+J+)a&P)97r;2w65@r*dFcm*tI%5Xr6NOY&?x_yHNbAzN4g@ zHN~4}3)Z>-CRa_r3jQ`4d&GtWn<@wr0h8Pl#?QEM2-(C%5CfUp3pT zm00I5uR(Kr7D+oD;>h9l7`32{=BCFznoX;7TWD^s#G|=^GJg@8fj{!c|9heP?%37y z-Q{#7-smWf^kN1B8oGSsv>uxN(>K2K>uIUeQp=aRslJ>K)AhqkNBxBo1i_(OFpAK6=70U%vSCmBHXA-~P+`$7YI{uu>h{rD?PWlR!eW7}IEojGMbsP3=V^5Jf*bDunjWBOsTbkPa~Hz> zhRKIna(AbK&U$n+Oz(GXw`1Dc`$NJTJ8M(ql%oCYp+#Ks5J<-YYupR-gb=aPPsdjZ%6Z?sh?UDbONO}DO?x2h@)8R zQWxvX=ke2B2_&6hwKX^7J4YTs^A(BX!P(@tDAuOf&!)F}HA^~YnMt~8HM*K!jH<%w zyW`{gSH)WUdJMc9bgF}g+Fl}t7MeY3Pft&!<%b`B06u>F=yyInJ^lRo^Kdv^tyTi- z!SJUV)16QXe5s&a3r|t6P-v8UqbggcQVCcDeNl*K_P(wyUBXQP?(p{GX94N4rYD74PjNhwjZOaC7xxVhdWY zR8-%ERx^j<&CUt|#8M>4Zn~Q7E&MQScQg(?avAwJhOL zG#`gDJ7dC8X+QE&k$nzAtAfDta63MIS{9C3o=-+NMVZi@?qmq#RdiLAEmv#VYTS{u z|N2FVd_F%ry}f^^3ajrfzU6?wmQ>aZ2K7Tvl0-Ar;HLlI;jWyvoN@h=pkIGhv8 z3+WlW5J2g^pp=>k3c9V;njMPD0-v`b)&`Z$*Q+?P&x_^o>@vB#n_i5n+t2M2ej6zN zQaL|61@g-_pxbVWo-8TJwZe4*)MuQcHY22AUoXNwe=?qm8}WozuO zEvNL2X#T2rG|xVM+&D}Rde?1CM^S_6ZPj4fx+3VZQ69FNE)MXn+jc&@04b3+n*9tp ztv6BB`vNtzqlT&Ztd_Qh}+9@G}TyIuXcL{f|u^4QZm`z>YTma|i=TA>haTEh#9ChLG?qRYjjoqrC zW9&A+JbT^C0XrtbS3%sa=3!c;7c2L|e-+Ks=~RqD`JOIs3f<7KHkv)A1t?t$JK1)P z!fuB)!&aDP+X|RVxsP`{HR6F6ToxY90@kw3qo^ln-mKU4GV=iR27}Fd-5U(rupWMY zwqF0df6|wn!Mmw9hZlAf%J4Fcc>%56<3GPItCba6TycH#4?acfAse1Cd+0>r5jg`qCXi;IiP)$}nKA_$KBuVlTny1rgmVN5?-)Gq;-&kb#qw#IJys1CWe%eE`d?xqzd7ghaxc+5* z=MBL)PKv@|+BWp3C~{fZ2!OD$Oo9>{?o>{C$@|tuv)9TV&Aq|kOKazRz3vSLtDm0* z#QpxrtLg^Re=d~yyQ3NSoE7T=mBeUkrl-UB`~Fe`_99M3{io;8fU(>1<|2+_nTT8# zT0q%GrzqN^?ZvUI2_T3@R;T`0Ir-##{Kx>vD|5a&GLP#(nx0X|qS>zUB(?fcJZ}F%2}BW+&scg=yM}P4C*qeh@S# z^8SZCG;h{x!EqGz)|+*&H&}1hsNy8L0M_f(z-egtT(4I?Vl)_hFYnI|EpB(rOQ38; z_S=&QcHG--(C;K^yx^98$vJziT@U6xr9Xb2q6tWMkb7Bu6ObbYFLa0k}~Nmp66?Q)~uL*HH~VW(>2!Jw;dOCN0|d|G2)L34xD&3e!qtT*evs(XLEUJVArJv0vn!z}yk z&Bwv;?3>WsUYVt3p87})dkpVbLK3{Fo?oiTa&-6A^BquRi_x2Rpa5|GcnOhwVD)#>=O%fUOqu6hQd zD7go$jr&FNQ`w$UCP7TFL@@dKU7qc&4zI^%eWwBUHru$K+ zqAGm?(;qyP1;=$ET^0Cwtn8wBy=kF&y&Cjt_PklIJ(}0+l}Gb>^*k61v(L-DnibVf z^xU-2-0^6(#&|Txy|@*3tlBleJ(`2gZVBMO2AYBS)6(kIWc-w^%{n(vaq0Q7w+KhQ zz64W%ve*HT3W}@3#=-n)q}W0a+284kI!C#7xx0!bX;9F&;@( z5Rgb@i*@$~XHqaIY`bS^vx~L@{<9dPjp67yQKVde{^T*lna_9Z>nf?d49EbAd z%a_mTQY^f|;QRV>^*k7!tyjX zZ~%mHl*!8CZbaWR`0_jtyWOfY!0`>RSrPa@by+S`9l1!S)#>SQ*mp09n43khmMlNu zlJ)87k!gH?T{(1altmUNHJXe3vq!Vn&=OnmXg|=LFL;vu@%EeiL!Np@6&FzR|G1TU9@7W*@F^ zKCf1%b;g;^iXezafG!FZ6hIJ-o|en=@p$%>(^^tQl57RmR;Mb!wwUzi)hdqStE>G% z-`MR`$NfASj{UkK?T%{2`Py`Omn}D&w$^V7f<_Z~CXV?z6`C^oQ%CKIu;H!xysI`i9gO`nqfmrygv5(9Dd3P<@-xN{acgOY*o57 z$Amqrpfl>#;X#k-I38%zja-TKvd|F}x(K3C6vwuur;{X6!4eR-Tb;_*hr8Qvxt>R- zn|t%}b6SQ`@HG3@S?hl-nNFvBXiglOo z((?`fDZ{~fK6@R_!|%@y%Nf2{a^SV;nlGd`?bWGyAq@Vj)H5*M%=^R3OV({Aoor^0 z3_PrXX}+yK3?hoQQRoRYHC}IlAFr+)c8?&~{A|ywz&8$D#ZE(dYEj z>FE8j&*kapJxm0Q{nM*FTlP!r)ildBtU2GvfX4%*G|1;#M zDgP>($Dh+BF8J5tB)eXYV|HP_n<@=_e7OAha0&DV6Cc@0lH_@Qe9G`n=)0|(2d!x5 zi@LeK&wI|hL-kyr_~o(nb@jZzw{@j9 z)@=lL{eBE5wW)k-1<^JKj;=!7Zx`JlUWF)BG78OOjAlFwZpExH-*0GAB zqPS|`)!w?XudPe*!nUok-}MGSk|cW}mFaZ)I;PtT6|{Nw9;Uw=9G{Q4-854tgSgSn zwpev~ACe?lFD~_NbXN5AJAz;@(6C#Cg+}9ww{Gyg=-pQ4D7_>BZg1}f7iWvbv!vHa zMn`Wjkp0DPeW0PYu$QaRVzItL_+u zjg+$}3Y!dKqqSGh%O6VMI!f>KC>g{+J@}BQk6^UEyt==?ZD3dKO$KY_pT&c5drKSo?TIS>B|jYQg;!+RC;z$pd_Nvt z)t}49FJHbamyhG|a4u5*?PU zY91R9YFmDtavZXVL;pse=iU>t$GO`+zMawF_a=g;QrkVe-rcQAZKso1U=8{eo!XXo z)?XbI28n0=G}-JmuJdX-X@(%F?jcLZe!9!goyqldZ-E)b zk5K@qC^}T7vw1N{x(8>iF}j!7RDOuImyL2QwY|F^wa?ifsGsg~VBPJG;AS>kt=1e< z;eWYoHk)3rcW4v>ZJ)-T4sM~j(a_h^*;y_Gqy9{iWInHRQ3l5fdi=7k*H7y7J{)fK zs=6)jtg*5dV6dBS^~+}cU2h=ay(4JW3qUgLe%Y*hy@Bk%6HVNWDGHk9rTk^HZgYd~ z?)1LuVB(Bltx&3&9CcZ^Meo|lrS-q{c;yInM+JM%9zV_+ZFl_jyUN&ubvz26KGj5d z-R<61mQVad-XC ze`>1M4u=DHV&8GuwJr0XR$hFuDcV-Y;er)je0=Wn=g)hX&UXED2f@}`kXGu zQD(#04mp}&>%zUV`oVDJL&U!_@@4qlwk3WVVC!<01n9cwe zX_T!^{FMZrKU4BNKcvy?wT6auc>jj`Y+-$Td3N?e(A>LDB#yng%RipaP8>=Fuf6N~ z{gIug)2Vo!54V0ipRHC$GECm_a`6BWpM!Czq4#jypxIlHEi}hT-*YCfo?p?;>_*7L zSBdE>g^*tHX6(t{;-5#=v#x9(p62Or__$iFZ)P)KwOT*j|HLsdT3=re=kxU-sXO-S zHvaJ8a^ri6A9TB6Rh4pWqxilk_A@;H z67lho*=%;mI@as0$8_6gcZlis36oaB25>!{wYPrD#dzuTK5RD+qkbO{J^f-iU7)Q~ z4>UADTQ~18ja`i{`?OE>%8&kL#b~XfNEZG%pN#BsIUEjv)oPv29zSm1f84%53chYP zj9leUJ&h%mIf^6sl+-0%=;3e}N3kfv=x(5=@pJlhPMoic&*|rUT}UWh#OE7nWomF&&GZ?LxsUDA_&*^8AnAvmz+}s6sdVI(VycBtMJ{eV2 znfCE6=QxU=7faU7QR~)snJ+k)56jV!(z^cpY`)`R><_woKfN-83dPakUN<=z~Y*X7F#y3W%T|L4c^*Iz)6wbWB{J5(f@Tq!Z)a>#TC0LiaP?^H z_H6bT9GfT7y}nXiW$f12Ez?-HBH?=o20qRjSVP2xQSM-!u|`Sh~iA0M!e z{S4{jhp+BVhC30KqsZP<$$QjA|oku8tDbQY~;`b{ZD{qAc|96j7DcYr=)kH zgI-BmDaDe7Ly?%(o!SHyz@XwHwoe=as*{J-t;rF$h&=)6YTZh0&bg`$K z`=?`C)j2$x_m)8YD%ohu4&V41*=YZ9w9LJio#~>xJNh7^E_M=+X7i%dU)P80@_d-? zKfl#zN6(EG^T5{iPW_i884Wu-9rbiM`tfq#Q}i@%oOkhHzHc1|)y};HyS|lO-{tEo zkN`dm{_TZke1Q%*>d^J(Yd0QM$>I_Ljyv_v05+RVOw$S93TRrG#=$!Ky!4pJ^_U1^+|V!mH}xy=l-I7uO#&A<9_B5zMF8FYo#}@ou)e#im$Z{DxPSXivt9mjkpe@2Op*Gv`51Sz-L%i$6!xf@bRB>ceFKM(a+XUWX|#8lCNZ+5hQMt8P@+_l0dCE0SZaoqofbh<{!2 z@v=P6g?p@4tM-x7+LmDCFiV7*?9 zSH*gm3@@(P+DHY_ZnbG$>X+(q0d{MEprej{DT-p9K3-f*fyc*t;PUbcD9qOta~KcX zm@bPnj9;Af_-9m%7SXL$H=~w4(5BbHtMAgUk}O~Llif&7)mSTk5#{)ol1_Jyz5ui? zgUZHn;tO9S!$~nDaXv?r@6F^jFM)M$x0k+LTucSZz~$xD2f1 z+E>8(tK{E){NMA(|HZ%k+yCHO{?nhHf&czL{yKZ>A0?g#AAULf^QC=WmlK~-_v@Gj zUm+W>GY$T#WP?NM{At z@BiiBf&cg)|JO~^zM|Qi`@QS9-0ikQfc`23A99R?#SY7zzjl{w^%))O)g8zDv!}_| cOYr>v0Vj!3z2T)WuK)l507*qoM6N<$f;acXMF0Q* literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0001.png b/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c9f020e0094cc7c2b8b72f138d5ede41427de4 GIT binary patch literal 25200 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%0AcOBtlhp?N4jv8?8OQ=&)o~xAX2La`hn_8KfDS8 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%0AcOBtlhp?N4jv8?8OQ=&)o~xAX2La`hn_8KfDS8 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 Ef~S>6_y7O^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0016.png b/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0016.png new file mode 100644 index 0000000000000000000000000000000000000000..47d18f16b37ca66776c869235d1bdc8b7c064497 GIT binary patch literal 29109 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 Ef~S>6_y7O^ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0017.png b/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0017.png new file mode 100644 index 0000000000000000000000000000000000000000..99bf210acd9c37f92ddae3b86153c22f2253c19c GIT binary patch literal 29229 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 N002ovPDHLkV1n-@vbF#K literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0018.png b/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0018.png new file mode 100644 index 0000000000000000000000000000000000000000..99bf210acd9c37f92ddae3b86153c22f2253c19c GIT binary patch literal 29229 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 N002ovPDHLkV1n-@vbF#K literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0019.png b/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0019.png new file mode 100644 index 0000000000000000000000000000000000000000..f57bbfc95abd583b7afc6b7c6b0a3e0448535332 GIT binary patch literal 29399 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 Z{|CZ*5`9pIYPkRa002ovPDHLkV1m`NE_VO` literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0024.png b/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/baseline_0024.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb4e868de0ce8bc14d0564847c23b3ad73af0df GIT binary patch literal 30274 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 Z{|CZ*5`9pIYPkRa002ovPDHLkV1m`NE_VO` literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/test.mvl b/src/platform/python/tests/cinema/gba/window/tgr-objwin-order/test.mvl new file mode 100644 index 0000000000000000000000000000000000000000..77dcfacaf8764993d1a1e67e70b3c67d0d9ae9b9 GIT binary patch literal 332019 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%0D>**lm(5Ez5OmIe!KqdB{*&; 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

    0m$O)ADRFkYxjT@1Tr8-`%VF4gPPZv&xqVi zE66e*z=0A};gd8jkoqP2r0cY;Z%{LDnvPajaVI1E?h%{-t<(%u{jxNl)pYGvhWPO% z>k>(J|BdyceCOg4jtq$2T!ww5^ZQHs;6I>}jNCM)pcT*W(Ba8HaIj{~fIH*EsC6KO zyMSypR)m$gk1x3D>`-MkLtH)qbliOk7#N±{yBB)}21ZqIh2m420FJCDu}qsE6} zL<6170`(emIen$!)NE!|SfP4UNf%7(@lySsFtrY~Ya?8sI>%*sc zP+tp#Z*{O*Z-Y*Fvd$j1tRQ}TfV6k#R$~Q-UwU%S{G%0tHrtDSo#VI0pE3$x^iGd_ z4DkP3C=BSNN329_BC!}@bWFl9ZNelFuG@(p1xPHxb8aMR2ykub6U%>|tg~OHwyL%R zdU5Ul{7Vo2dC=aqTS2hg5O{JB@%jC-#+`W3&huz`?!i~VEZb#KD+rPTqACZ0_zJ^< zpIw^)A67{L`s=w?36MdG>hOVW1rBaUY=qTD%B>(6>)p3KSLB{PZ0kU-zSEg^=N|P3 zr$*8{`eB>JX4{{dmEjL4|E?Lt`%eL*gO&@0y#lGD2qLiU+h;CCW8tgYw;6DAeAqWR z$g;=WE8SQY#65m5P@FODB+dgen?DE;hn|wYJHJ0u6F$-XY(*ub{JjB0umRkYRuEGQA7`uW#hZk2L~>6pbuSQ&5f&Zi z*}+Sxv{O9rp9K}D6agP4;)mhl!`{n53RRzHcMYFk6p#Z7kTakF;g9przY(ujASD4_ zDGX>Ph5VG<_#}gTu;m8Z;xfjKR0^!;o&sVw6)m@$ck0IP{)q9zlvYl}_2+v%eT2UF z>|+MQS#V(-_-Y)CuzcHHz-sb30`S~B0$i9qKCC_(z@EK3ip36acn3(L1YPZ&9^OWc z){;H1g9q2&1M?AFIj4Y6*Z^`3A4t#X{r3dcy%XW9yc;0Mm&k`U@3gG<)M#uFVMqf} zW(Qn`b^(L_##N#80$($#O%@7ws^y=ug?0(V^h|%>Y)(vohrm1r5T@~5w);}QIr#aB!c>U*H;~aeRvHZVZcK$Ds;5omnS=`|m z_VccG=YNO?uC)Kl{QuJa|E@~q7C86)e}4Aq8nBWrcx^lOpbre3`@e~s|C{{(Q-x-{ f_kZgD|Ee1J+}0DO{?d(?lg?+K|2hizuk`-_cXI}Z literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0000.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1b2c32f20523dad77ecc55c15068b6df462a41 GIT binary patch literal 16196 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 W-7QY}Tzq%O1Ej>|#cD(ig8nbj<0Ml6 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0001.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..53aee91ecff513f21ca1cf0d988270813a5c3537 GIT binary patch literal 10115 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0002.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..237eab692139eb9da195e92cdae8373cfd4deb30 GIT binary patch literal 10179 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 Us`!3$IFI0siq=c`3!4xB1MGy1Qvd(} literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0003.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0003.png new file mode 100644 index 0000000000000000000000000000000000000000..05f308fa48ae65851174f043c63cdd78aa789179 GIT binary patch literal 7843 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0004.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0004.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8b94d45615f0642b8feba0b790c5fe37be5055 GIT binary patch literal 7743 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0005.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0005.png new file mode 100644 index 0000000000000000000000000000000000000000..044cf6ebe06e6bde2c0e3650bd8cfe3e1c7b35e9 GIT binary patch literal 6117 zcmY*dXH-*L(~cnG6#+q!PLv{5xIm~b@6z3R3f;fz%T`5cWJa@CQ_DT5#VQbUCvB<48p+uj?C zdDI{0ti@x)%EMm}R|->?r_+(pVpA5j$slJ{yoc#=Mtm=hOzqAj(h*cazLV#zmdfT5 zDE+)n;$g=hzdrBjy!+#HW<&-&tj@FBir7Oqb)@Iqyx5!fOg42dh@7q$ZixLnkU_Po zQvo(A7_e+F27}f6+S2r>H3DbYt9?aZ732(LJE`|sAN)3gK%PZm>tC0R|0YsRW1VI* zBhex+DpK8>?tgrJO_=#A*=5P~lQn%Ml6K_e&iN2DZvrP#`Uy*2Y9u&F5km^AqjE+j zRDTrPx%DVrl_|GTn*}HrPvV{5U8OwT?5Or>dfU`MO&58i2a$V6%-f)c)IOi~4jeR{ zUV^|JM+8Au+^9lYGk zo!4Vh7{b5tsEFyx(eHgCpl?E--70DMDcHhU-l%5F%zq(jreeC%J*A_Y zS?(I-9%%H#EJLX@zIIJsp!%Hp_@XP~3cj?oCp^X$Fw#yL0wE;@@ap@RLrP_Ak`ict zz_V5Ia8Y#>fS)$o@mp?SMnZs{i^s*=t5rcc!fq{ZV+?NWH<^lD`fHcPhG(Lip-`I~ zmX#%Wfh$nz-`G$Ea@yK$81UFWA_xNjZeJnn-wHjB?^|~ekmDvbI)j!c z(*n#vDSYyl+7BNp@=HkZN|i~i;r*kdH~p1VPUL^3uw0tjYBLFGoOL1VD}*{Y{g7({ z^{tG)hV0EiK;p!JIs*`8_RX1>um6>D;PqQaoT8{a_xkQHUrvEzyy2|Rns;$QQ0stN zX+KQB_2jK~B~Hp;%%>0y>EqD-X~i`p?3OtQka*r*4u$TYeYHR@)v%8uN$h;r5)11_ z=g>d`fRhV;Q;^X7uf0k^vX%JOh^tON30DTXk@$(KM3vdUxAE9*GL?TLua+?oJbFeM zuR!Y5IA2<YUx!eCpi%Q89+w)ZE}`KCgOzN6pWN9r1Mzbw|6K6i_SrkamY$ zZD@htcG;&UGkBe}#D0Ce75|Qwgcyqb-`rexr|Gf)C(% z+TH=~E?S14qqRmPd7@r%jOS`v z=n=ldS^{B(m7CzVf1|GMXLhq!pv?Lb?g5BZS^)eacg=>u6UkOIecyVBNVF0H@L_jx z@$Pg-6bwAa0^FTkr1?EDv$Y)Kv@orga`Z=DsbvJ~n=hS&rIwp#m~vgW@R556y$!e> z5zz%JV{aVWUiEddPe7!O?(Zbk+J5L}Yf~FMMc_s&zu~$zHsw zM}FV9$2#=(YZSwi<7Ovb%~=bG>b97OuH|;ayi+EcOluJu-Kz^TabG@j@x|T4Nn2Yi zX6$O%zYPc=04yJ9Dv!KTcaG{=IQU`eCs|f;SodfWZDgFJ)_m)bH)-EIB;?6HDAhon zb@3uu$?JYWBQ>i2$dW{i`II?k$zP3lcxp9J4Aprlj1&=Y92`o?f1MB^GMWO8+20wS z&)XQeK7!@ZOwFV2L@%Dbb)5CRs0$XWVt*jsfVFbP?aXnWQwKnjypU03-v$eg5xY{jW zy3>IM9$z4i82D!TCfvKhPDwv3d*WqSRFBVN*l?rkKZ(vN^TC{CQ60jW{AD(iSMQkQ zxH6v4^hg{Y*pYMUs&EL<5riJkn@b0g81)`i@rOH&dSS z{^b(Npu(Ta96nJF+2^VdjPrEZ6*Iay3%pEXf>Dofx~U)GN@9Jy(mZt!ka`Pz{VZjt zOJhY8CQsKKSag2Is_kxJUKDhOs%HR=%7BvudsQ*0i1_R4vs}5LF&;4*HXxgsj2qfK zWdEpqvk=W*YQXZjsIqCV_;0lUbSAGg{>;=V*#y<Q+dS}@*%QYR35+7N zf)`Nc5w^}m^msLtG+*gfA#2Jy!e6Z)#ZS${`9UD<*;B~Rfkzcio8F#W2aDkzbSVp6 zPbau}WtPRCK%pA~_j>)d22~u|d&BS^ESR`>9foKFn`ca7m>}u7*b-myb=rS*+8;AN zQpb^8c@^pCA$aU~VSl~3Y2mAtF;9{y*)%`8=IZG^GAe;eVad5?U(CptBYRr| zx7=2*BHf@xmLYofiB??U3%+!KU;eZGp#hAl>vwAa`S5>5+#e7ozAj!>R)A%)iDy~G z>lnD+A*@TJjhD#P`nFAnmkT%7$klGi1lZ~8hzL(mkra*{0ianH>zkK16~{@dmejR|YErrM=%_d7WOXV9TpW&=56IsYl1GnqiJ z-AS2ww5vbRlh3*n)?o99F~nL3^3;ucYQT;PWe?(R3UeG_4&ttl&zza zWYT822>65UkSaXA0Ir>y{Id5{l}%i-X?$l{w#q+Ffn7usb|&F%EJNZFfDbBi97ZTvASY1 zANBMwdvBKhH&3G8M++}IdCr(E0lWmGcql=wy>VnAD4zD!l~qs4qTHk3SoEi+PE&TY zY(}&L@+%n!Sdgt}!Jgj0w5;{pAg$#6`*@N6CqMphs!RU% zr@F_OGBa`wIb(U-6$D2s15Gl&{0a5^GkQwlR2-jxnWa*)8Feu4#!Vcx=OE|HLXu;C zmvm+G#e|g8I1aR-8KGNE8y{`__VHbB&sF+{ip7^ZC22vrRpFWD89zuuS4xa^Us-aR z{cSblCWfzX_*;f4FL9oF{OEFGDucMcn4TW8hT-;nWlcF0_hPjr`{nlBh(#dv%nC~e zr0qubdOAn_7lK_!z4Ef(`1Qw}ut?{5L$ilAA%s1VJVTa&e9!~?y`y-DyN}7chpnV2 z2fnp~tVA9t1n2-U$OTpowSNZu}``Nwzt+v;OViLlO5O^*@lt1hX+7y=Z#l!R_tEmK}3P{J=owMfvPGkSGV%4=@aX07kJmwh11EuP*3LuOn`{ef^S#0qes z$`o}0rf8dPDse_!uGYqU`)v`?c&BlbrHg*0@dd8-4Uj0w8w)?VNA&mmCyY7NHY`lD zsGRPqJ6ag4bqK}t*C%yzsP|50j9O$~mt?7u7@d~v&&%Jij(K9u9qBz`AkJkOJqQ^9 zInrV}9p7<7HagVJ;>TCo*S>LTap`5m(oSr;{FSNqVg3{*_VX5ke#6dY)KKZ8m2?J* za0IFQ6nhw=3)FqleQ8YQ^lzFJm39o7*jsLYtL5Me`Vxv2bGnSLe)HU>;36j;@7{7?yy)O;BBZCs*+fbA5Jd4?RnWQ5srkExFwjcYNAT`?TB^ z6ZQ{x{w?f8t}p14>7QV|d^ZxK3^lFd3EAj1E9Qmyiv>Y*GXv9_sCKUMV}LCDnOy{gDWKHy&Q1>ZwiK7_jIA6 z?N^5R6q8@{za{<;Sv3pc7jqg`lDHbtbNNp!AtI_*i0>W7vVPBll56DH9S|P+tiv4p zz)Iu+cV)eRq^}jdLX#p+2*9lFITOIL^cO&b;?2qjP7qUfbscdg*ZbmX!o55kLO;{- zyUNl360Jx^PI}=C=ujLkYRmlM#{cnEVKcCUYBir^BT%m$s*h=~nA%fTp_ox!0qF!7 zl_Yx?wlq^RU=34w_ua1PuErDPr=O+2D4L%Ni+@}mne@EB!7Y&5@HgtI`lF(jy-68b zpxfyCC45i*r%(R>I6%dYfBK-BI4jfTBf{$t+*G6e&XmyL+JbPd-kC3y*6XBB`%Fmm*r4K+&&_1v2<}}5*30w+38rN7eN3wyJ@^C$~GUz=oo9CxJI14JrVAqah9pXKW6QJ&MrF-o$U}n;~m0CKYxy+Q;!^>{Q_ak|@h7ra1DS$(M1L z>Sxfsv?9st>-DWsv}(hl&%KbjiyZEvx1&XG>1S!Z^Z5_6tU+CT6U`h`<4=0_dLZu)ZQnhbIjlwtoYBf1njxgVtE@4`6X)yDxZTdKS9m?F;I&NK9r)$(qH=+$9jE5I~I8&u52SHuYP*k)Cq@~ZN}7R+k#tU z+`>jgSK$BR4aZ@Z4e4AWrB;YlbULJ_tvG(re)En*cZZhW(lst9_xjL}E)RFyb?k*0 zM9pL+iV%t0{#P=5Xw(pC9qIG-Jp5~BpqMxwOXmLx^!WoRqO2@H?^O6sXcYTK;P9l; zN~^Aetgd8Yr%+`X_sq?Fg;aHmYeTR3W5xyb|FkcKA)oiV-Z8gsNirqS{%omL^%k6* zsc$EnVF3I7qCCld!<6I$%DIuH>X2Q@aJclfF!9?Ih5R(n>GJcs91;|xv`T+>>TuGM z`9`WMD=|zD9#_JD(boCD6RSAb)Og-+4TLXfa%hgpOa8RQH69`yg$v|Xp_C`=QAFb& z2Q4zPuWpl!_{XZ_0MqA^;GU~bBVJi^1-UQ1E7E@-yVu`QFr=amezZKg8JuoA3U#P^ zWvsn%bpOAiP)KZkjQnE{<~Req-t;+6+|83-D1G3$+0L3foVSc_SU)~^{!2H_>-J;P z9)qSWXX}^9F&8JNF-IleO%vw&n@LtFc8vwqj^eG>0#C^YHce%he#bn0gw+p|)q0Ve z0-3|$x2J30&ZU1aK?8Ib#dQ(xR25(8ba%<{C^_v1w3pE976^=Q3aCROK+c7b4dF?IR$cCIcAQU1ylYW zp_Jx2>DBX)ju@dVIQu0xTXuMwd5o5`D< znZ28kDP)3Bf)euqFQ5Ec+}27&5V2SS9ZJzux3)JfWQ1z_ocFRqxorQE7{z zW#|LICvUG2w^cTIX9t~JoI`6HcoK}iXlPR{M+5~{(@M7!*OiPOD1WGFYD&Yk*GAj& zbf*lwv^ra?CSh;H|GO9T19L+IIGj3PB&XHJvZoy;p5L!O;nacL3Cd0GXy)se{9bYq zwN1>TNCP4k5CF z#YkGaVfYUGS5#U}jBC=ogC|02;%5P2;ePk>0EH-iuV}Dj;AeQUsAMMF?G#PD1ZR z5=tncg&vZ8y!YO9*L}aWX6CFlf6O`0*?T|pJ3Ib`mO3>BD+K@mpnj^M`toYrzq&u) zyms|$YxV;H089~2Rh9Gtaxl3%j%?GPdOLPlXEz&8_*tKc3nu%2o%~(K#9uez*9?uE zXzinGY}{1NQMi6Xxh7N25NA#PGjb=>*YMiO$4CfAqgef~_D7a&3mWg}tXp=HDWFx& zwTT8oOq(x@ziPDA{#MxO?%N3Yuwm#>{2ueXoip&v$H!+~1AD%zxEzAby@SsK*TntM zwQDR)&(0l`p_(7GTiW$t{$Y~<>0W;wOGX8qf206&{vJN*Fc?Dk^9L)k_H1bP`qHis zYq)y3hQl*7gQ9_3XvXYWNae=)r6S=gVId6n+4M)Me&0}O{cjAvA`2SiThSpp3B8vh zvpN!8c`uIJ1v0Or{rO|a#eRJ*vmALbR6k^RB(kWm+pmyR`tDMmv-RckSjx#%#Y0K4 zm#AKSeeYgh{`D|NLyjW!!i z_13iY*rOJjAIJ3ChVGi?e!AQkeTKu!7BLBPeiFKj`S!5w{+8XX`)1~nfks?o752yF z`hQT!W~&^_;RP+`CBx>+bHRnCmrluo?KF)er8j666B3o5b4Statl9@P5RxT`M z@bfTo`Jn0ZdD?4{>>#P|cwTbZ?dqqpqacpVyB-vTOqKBZnp6La6Yp`QTpOmw2Rj3( z5A>{*P8^xG#9wpkC9re6!Ipfr34ynVDaOA_OUbsjQQ~`mh)Wfopf^)vCf>f^bh=mH zY8Fk3m%TsGVt1ll((x^5w!;9SNxwc^=Av|%A70~diS%$3Ji-_d{&WpKA|MP^NFxf< zMTX$|WkdVvZYl8Lf%@fq3eqRdJ71kTynQJEIq*3`#tGLRI%Y6-t8o%@%*UA=D_r!e zdMIjHtR;K3SY_SwY5a4olJ7Bk{5D%rgf0$1ljrsn$+i#6nkVpXBWhdV&=~M%ySB;f zbRCa@O;0&FY&$mmXn^HP$3C2rB)JEYG4juyl5vcgN~Wyyo^dvMORYOj5)A(95il3} z+kD$6(i69&kNJBAOH*4XQ8hRUyt{>~D9%D*)7^zmWvFT-o=0qPKb-D5fM}_0?Fv44 zXy2rTVlYOJ2x=wS3;_UAvHWVbzAIBgi|qM1wtFaMEWS(>o?J!I`?-AX+X+_VWCd%T zW3HoFj$?nXk~tD$dsxu2K&>U*-d5Y%dJ_<@YHel3H{zPD-TOnT^I*El;@eSY$E}1IW_1}4_KTl8=B<+7``TClZd6@-9d5!4 zFbM^jGTiCeM%}__`73{9M(5gCY@7X#5b3;y;nu1Tmbr%pJGE=*Nx^?{;K$M-8 z_5%N@H)fHwdgM^Oz?3HP4tm$Z(9qZ@eoG`SP6dk{Kfq8g@U*w-jNkA6tu)dW7%0P* z!uWGk8PtdxvlL#v7LkGenNj;b<_kmUqbYHQaD#EZb9BQ2Md-%X#2SK$dTPCo-vEdb zp>GZ4M5U!&Wu;Z6V9XP#SMrBEXK1UF{r|#87*3M=$ zx%@LT7A7?qZiPJij5}Jlw`+K*?-~{sB%42BAzUc|S|4LY|Mea2ryv7Db^)u-`G2kt z%xGA<>Sl6YC;~JpT&GN5Bz(QoSiWFVmLio3A4VFg51U-vxR15B5?7f>Nz+jks8=;G zcD~rppsl8>G%P6Z$-Fu5nsK(KSLLE)@aO8wii(xr7&wP)U*5R`2GCiY0G?PrbbcK( zMV=%Q{Gm42qaFb8=E|HJ7o)FA@@^j_0pvfTr3X(}nORE`LPdSW>)W-aRr${zn_-48 zOzI`)quhSDTU&FdJtgVv>tk3S9&L8vnmnt4^)S;U#}(aJAEs*5+T*zkdl*Eit2p2p z&fjYBbcs?s89o^V4*qMsvnfS=@{GPbcPL@zIcMu@q(TdChO!a@mf>-WI_-~*6@*knGCg~6!+B3P@uzo_9#GGTIFi^yV#~%^e!xq9Bg=w3Rt0r2M-{WC zcfCHn{9U9+eNBM>xpru{h|JsFVPR^YHZfrKboKsal)O?05y3f-@_;l3^EL`S8f2;M zR1A^@)U@W@01TtXmcI>Rl5LZvwlQUTY8_{3?CSJao}V?()}JpcY47$Ny~IuteDM>= zS1AfYW>Yp_dlL~}vtiNzpWMJCubTEXEJN>TTVEtUk=H!J`3nX&VrCwlC03b>6$W6c zOkp02p0?`|sFC5C7LyL`W*_m*&joz}Hvtrb4<5)p9`*O*VHf(9DgWk)rKlm1Bk!sJ zm!aooPi}IAj9R_PoXK&>#&M_In#P5`>AdDPx+uk-{5w(_IZxiz*%wVPxJMVz(V-=N5!A7FqDBu8*R*R^7nIfO z7;IxqY;)D=x#{GHymz!MNjQ8ec<@jXm@Uxa4%cp|=u|e$+#JS~bLj9kbmPiClhagtPhNqIRui!T&t^|O0^R=)M zez)VDd0>_N196R8Ay(}=6AgyXwW}<*>+|@F9e8NTqV_hTH>rWb zB;mF{Rc|?s!?oNpN9(%X;vM!5(MIwW(1R@LYLzS%2#HBwrE_As zt+}~rP%3oOE7$Jg6(%@x&hwI)cJ|BRnWt=!gMe#@e1xw|)=+IvZOG*j1w4(BD}fUV z;g&LvM&IJ5g0FSX&Bf=HePQ@i!|-3Y(Y2DT3l4>n_2xl*cSQ~NkaRp@+_Z|BvF6eb z6DHT5^&qu2SLdqUUf3S?^ux98+V(tdk2cp^^ZIO+PGZiqHd^FsU;b5CU2T8De-QDC zQlkhv6XPwj(1R!*qxcW~TZMRQZxd zjHU6%L)Yq+?=(iT|3{RxAFFY(E(B&YQ5szjOxZJVves$8o}yoLE}hHE$-3dYbNEK@ zN3@12-c!r3{k1{{X}&=Vg|P@T=wNT?E}!Gx9rFZBhf-2Nd$^UIavN2NbF>u6Rb2js zf;VKutpw)M(>h*nl0^G{)})PgN#koNH2jXPmDiDLGF-(#CVFR6)Vu(Iui=#>orAfV z73a3S{hvlb;m?&C7)2QUm*p0}%mdx^SVx%w0J^rW=bZCMk|+B9S(VOf6nztcxb$lP zAh4Bqfwjo0WY?57+2LuEBeQ_Jh?x`*rY=HO%2Rd+4&@US@wFM_ftY)7jZ}@mc)q2e zZCAkALGNB=9^9G2$v2}um$5X-u6*mtN!vq z)ze;;=hDK*2@*lsB znJY(zy^JxBxA^GTz0f81+!fsZj;}KF+CG12R$E4}RezW57Whb}X{7396SuSDA40%$ zzMP(mopWI()S6iU)@R!M-Aq7KEby|BKWE_=JVS^q|8x)3!9IeuRBe!`7})L%uKvS1 z|L?fMlxBqFk%s?5=`z_ESk+v0F|;g-8)Eb#6ZO`k{#C-)Tmzycbmj5P8Zz{;)~A;4 z$lk7|kWl+l2bsNZ9g#t=Ud)htaJ`ziFxbOlAAL0T$`h?A9ag(MGwQ zCdW~dKZU_s?E&(Cn&XrGFzLO%12y3!68@iOuv)H!h`p(OZ2x5ZCNkVWkm9XU7Ex@b7K=B!t+Xf)VD+o~fy~1#uL{M` zo*ga?@H|HCz(sUwn0Xq^m4o+rYjmu)VHGfN1l6^gO|eqY?X= z)h~t$#zS|26-$%LeDHqtz(&(stmQ!;uG>?3Pcs?eYFr?64}Z8(ly^<%4f`BxUuo*C zYOR^w85M<4cIg$ib>r6yh`r0bUj|LdC+ni+Z&YzJd=v?rg`qo*&yqJ1R@wRM6d};i zL?5s{aB`QKm-6IDE%2V35=URqED7LH|A*`)rzqR@dLru5RPfCUO;pd#C{W>CV3- zCX#%?3hK2C9N>286zhKaVgt$ZtnO;HXWxv%KmWt)^=D`{P}aV&{&9qra*?dIyx`1P zM6S8Lg{*(t?0o8lrsmDwQai)p{j4ucF{zM81?4`XW8*5Ft~tR%W5b1}TQKajlvtNt zmJGdJQB=1ajakMZ7YRYI3di+$&tUR~J6YY8z$=UF`_I`ofu9<9be@G@MtCerp;&Fl zx!7N>v5FHvAKY5Ooq?!6@0!r&f!TUfA$`9xAjT}=egX&{u4aA7w9>WjDk1^b0EV+j zIVUQ3@4m*)3E#llNXTU!61!w<{GLbi|4oFCs}$-l8jvt;r{T5;*qfl~~(%fIaZZ*8L|-ka(t_b<@?LxhP@^V9A;k}7Pvup3c? zKYlcWNHKJ;E;X0eo-auFMf$1Wo$`&wFj}pK7C>(G1?K5vj z9Q#Oi=kxuVV@+Gk+;WzHuhUSu&j++HR{UPhE!#9-MG0 z2ysLs zJ11#43_9A4o;JKD7;2YhnAx|;ZZ8Yaag7Z#*EMVz7ZeODv;Gf-{En|%d;`lJ2t?(O z$C=zm6#POJ{f1xsU_=NUV+D-g%;t~`S*^=dlm^l~ZeKswdZ!BdoP{$ta9T4k)s0_| zFZf5ALknBG&21ac@c2~4pD^{}?xg&F6YZkmi;=U!-kt$S-jl_oj~PnEZ3#UqPJF6} z?uLsNOZY8!`^o9=l{4Nr(XQphf4I1-VFyiX;%V=?7)qT*n4Ubxv4ft(EJY+cSD2Vq zcB{cSKi;R9cZu(s^RB^$mto9oPV%c8at{CK0M)O(Sc&y+>w(Ff0-yB(|CFfI#N{Lm z2$#MWzF6o>;Y%F8i zTe`Gx4x!~{vzX*7xhtZ=0z5^fo@K2ajXJ8=9doLlvq@X9Y=lFHDSP!cim;?iBxV&i z!w3c&MbP0lj9dd>#Dd$D{!vJh?otD0j5oz9pnvhxs*>l*ITS@x)YyRn5Ht#5N6sAS zC%IxvpEITo8L9LYa0Ad zKwI$(pjz%^{ZWmm`HMkY=abrFghU!r41Ve%eST)xeca#;Tn^p5W8Z5NQqAbzf3Xnn zbtv0?0w-M5n#d8xsZy)2)OHl1TY?#?3iKNeLXJ$|J3D8G9DU0PC~fvS*=cFPcl7gc z)cNTwKGtdTxLw%Fs)M1qiiY!uILb_(Hk)j4lU|kDSR1i7Iw;a8b(ZMbw6r&W8vpSL zjiz|aJdsUvygrWuz?=)!bag9vSvIlg81hbJrhjK}U+vH%1jbD>+@Br@M53pAF2=mq z&AR=5>vp)+KHu@iQC2~x6HRp${Jn5<&Cpij1Jqe9FSps;pMyiNWr)yw2{tK+Cz{KO z@S|2sp5`2F31X7V56Fq@?I6FJu8k@0T0}lL{H9Z>M}Db@zoiIjVKW->A>^QaVpyBS ze8N+9H+&e)NV4WdH*4bCMuFOZt6z`)&;pEsbK>52!|}XUko`;tq+ThnR{|1T z5n)|1>BiLDxGn5?um)*{2Pk6n)7?Wk@YyR_$ZqqhX+&vrNe<0Q$6pHe1QK_NmdvG0 z4QIl(cq+?sPCN*wYeg0kJLi=MJG57}Q&M{xa7FLrQ*}5|Xt$FNpx25`-jLD7l!D3Q1#hG=aTa7B>IkJ^3s^W!-i8Q5gYdg4(QfsznaOB z`LN;F@}C~I*(m6bEY1BmKkhO3QQH`nkcS;4bXJqAo-aQlAM0v6_7#PzpQdkZ6roI0 z_C9n}%I2G=Aq>7R8>Ci~JX!9iX@i{Fiw?9{zNgq}h`7)80fYP7vSOXv!{jwuqm5N_ zkM;eC144(>u&|-4p0gkdK&v2*E__$RK%}kxIXjN<2?@Ar$pfB3v{b8t)8i^q#q>&J$hR#74I$v@S1V$J_a%hPGDF*~anIT3}Kthpj5QY*^ zx<$IX;0|okNe!U?pn`&?!9N9efBvq`nnqABupd#0DxTcv6|t{edp%Nx^wGh zZK&}T0|01$YN{z4BQTrkP#E)QMrSCo%{a%81bDexo8bf1b*thf4oQN}C>g6kIe1E{ zz`&0JZp!Ys7>=^aOhGc2jr_45LY6&4`N)x)gYaSNf?GZ0wOn|z!rx}1)h5v5e4c#S zi}%exEihZAIIw{kGiQ^$#qAT|{%7Zj(IBVq7)H%mmdx#o@0pyzTW+>1>bHoKACmXxLypfoqeSarGAc( zHk2syJRG6zjeq;4m9zILODI#q_@O{4sPKgCopB9 z*MA}^qm4Z(vXr?_(a`8EuF%7Syh^u|MZ-%?C;)4kzO%HwSb>vsXt!unYE#yiYi}So zv`HS})K-=XUlAfwURgee=FGjx5(N3YMTzhlc^Yc++i?1QbR*fGc^9>FE0fvgrLJ-R zwOc@|{;9>`X#KWdC_F%6P+MFgKc)VAXd`w;pPj0nTKhsG{~A1eJ|JMFcea)A%tu^z zj;H%(n~HqBxKDB)N>{rm+Um4UDi5#uNl^yWAFAUT2Fa9=Xj0&ogE=;x4V2QR04a4_ z9Vm-YExVT@hKP*-t*(5-pqI+=?gjJ!$0hf`(AnJl`jxNKZh>6|4$*k-o-s-1izSKDQi?m zN5%eBowHD8s-UTAZq_LZ2AqQ0Qj52ZqT=G>NC8x+PR^u)n6#_2=g;AuZXv#yKC2T? z1KFj>#(HYA++x;~r~o6akOPZ{;(H*oN4zU*?w~Q7jbTgo+0iI^-(fPqqtstxi2)4n zGbs}iKAurbV&VR=(N_0*#U#ns7J^ z*Ble`KVcl@B(IMy3CnYwe@Kn$G?74;tbSw6H`>DGR~iumUMPfiei&UnKF4FHA~_`t z{=D$ip|5h_Y+J=1^wL`4dVn=XEqm}~8rf|XFRx^HCljDC#A?CwfQsR^Ngt#<=)^`L zNTi8%(zpBGBQp$uDnSigO29c-FhSiTCg%BBa5Xg0x&hf3Xdh6O-$HF;7kCdV)l+v$ z7unI#yXNk3nRDbj6gWM8x8XfCy&KW5abE)|P+Vr=(-X6qZ&A$3M2+rs)6Kn28vV8F z^o2Tp^lJAF5R)p$M-+X1IQBU({Cfu5 zffG1$z<~m`?2DdI1-3;~&vU7la16)2w8X>xv6x8Rprg|XkG*n*5D@y%{)X%i;)QBQ z?I(W)`UBq8%%?O^kuBHN)eBpm)>-z$?>OH7t%SEeTk@C$I3+=Cxx%~8dISso}!J^id~Ti zEdrL=Cn2-4MZ|~c=@YXIXiS_4uY>s>`C%R{F+g`-|E?5X(s@lB=pbpMx(ZyndFSru zI{KL-aYHl!04bLP;9eWao1|(<6rFxdF_a8FTN@-MPAkymDzEjo^9k{_GVy{9O)HY{ zgF?r*F*WlC=a)BHc&!kkW!05F+}`^}z}dzorYKCw=N)W1;6N4sA|@@e6-xzJuur|z z-P}}bBKsA1I`(05`3~D>x>I6>9 zK)vJ15SJ~t0qu6>o=1w!isS^aD*W_qWWS6}dbX22*i#C9F>qe5KjB$czY5O+m zT37Dw)YH@z-=Sz8wSq<+NMZ17c^4>KNZ1T@#)c1g+V#w>XZnMX_#g?{neg}iS3OYS z!nP#5pdH@=eXXwk{#Q32)H+fmKl+=w)~$e5J~1mM4e`i)$C{-9$b!b~lOH@l+pmr*$yvE159mmhaRYipxWD-T; z0rl?%Sr5M1(`5AV^BF%D5;q`n=OG0UA8&=?8V;!h)(yORk+*eLTG3r;pIH!()OuBJ z=m1d;=MhAf3u|zOdRPBKc9cknJ^VS~$vB?|>cP=1fs=uB!mnPIeEog5e6?Z)?QJ{T z$!J2*pRhZ(eMoFk1-w8AmOt!vjX51G z!UvC{MO@75SCGv&n4z}8!2rQV8Ozx7=f5RuPMyaE8yV=AFf3-$aqb(fxut2R zFu#_u2#Eom{dy)pSD+sCqFrLtTnH_ZWaZ{xpNCZbWncb#h%`$?ay3=DwY1KFqlPb6 z!X?mYdczviq=x+VT&+Z4#*G9&`yyUdxHe`ReTW##>50gjO3^?^pZ)W+|V~%CX-6@4~+2`U9NA>DVU&{f? zP6^YeJA^&XXX3L874my|xL0r29>JUzxj$y=yi>n#GtiiHn)j@}wj`fxVs*!(eo@-H zpq4h9Z#5Y4dX|X`mORMmP|4LbVfA<*4-4&nW0q9h7p{#3ZRqqlTI<5HfVKN$&rj9- zJu>*gVYygr%$OlVn%z4(;CH686wJ2&`rRH~ibTIKDO{a5t19nlD_Tn2>s^r*{QG*3g}mGJe@_@DW-*5kO*toK z5#JDGMs`T9id_Oa`4Oz_!%#}vXN~IRi+cNdwMv4jrOnUc!F?!tZaN0{iO(M&nft0% zZ$xm$XA=xeMqd96<&e5R)DA*MWdQ?F7!QN}sn~ymlHPy{{_&7Id1cO+)qByTh30Kb zp9H;Z?_B0(=TANK3#bR!;%XRUXBjDvB#<*k8hA=h8~SqjWq0MC$qgWj7wroHzTkJinjV%}A-zm&O{pcUdfy$lfmmFSC!Lw~pjRGnq++(_D+Wjm$M%LK2;19e`%LGj*{z+%vY>vBZE^EbO zqhP+Qzy0q@!(LTH2;c*g(8Qw0oDMHsk~1#6MBX+TI;NhKi}ARQmCYbSUkpT)n9Rwb ztu&X$pJvfpg0;2GZIkI8nzD8rY3W!=5H4?S13hy0NKVMeN^iYD|8Q+pbKOmS{^$8PmP{ zX~e`6PalsELE;EaDP(URk9&vrEL7TarnMwBHnXFbR7{ICf~;|lyRYBpLkPi_F@Ckn zBizp-kNdN~3PBzaYI6`tja0-@%G|eE*fBjmTFYFyr*WApwaC8b92?HVs71Y2nm@Al zq3|rdTA+et?UGh3yTv(~(T9RXqT;jme!G%2Me7Y)|IqZ`RB*+RrtGw)uB8yW#=IZ) z5mywM4p!AaBG@)_WNxhmrWvSMxLZ46)G}BcAG^(YNN*6&}R!Cc{6| zyUSMxv85kU#74bXl6oYKZ}RQ(3?gmof8?h#p3%w|Wh$Kep9bhZN2~V@9LJ@K;3>5{ zcoi~nselgJ{)x$2o5H6(?`vtcVbv$n+sUK(;UyO=bgAO;N&2Ld!#8Zo{zO@P;SG6H z!@5j)Lri>ne>7pdXOfC2n*Zs#tb@0!b8v!AcQB$rsJY)V{_aKk)np~f|45Ux7)Uak z`$wtKab`(bzM??P5#xy?J^_U)G^m>g;!+^srp<0f*HlxJG)E-`EKj7dp8SbiB8UxU z)u!5576T6iivm17{bNM!%G(DU%FQs-5gIqK^7y`T7$(Tz-21 zFE|urVKWc-cb6qZi}@sx^J)L1PJ>IYb-%2JJo{v7006)`yX+2c1`%a>J8|#s@BtH3 z`RT~C4{7ZA8XfrfhH*S(Q4gP%ecyjFk+;bds`PT2_v=4i=|fe-qr3m5?qnRB z0nFp10`|!7J3*c+ESf}*SO_e0aYcysuF+2^_a;$iwAZsK*R({<@iT>c@kXgcuuOeD zUsh1x9hcdKs8WvOG+;K5Uq_*+n>haeY$4;gS~-Ky16QLY>~WH`jE5F{n~1$YnN&nU zGSU0c0*?~hC!JWgp~txHfv^2EMex0f(dL=hso+dn-Ez%3)rCq>djujdQbOK8jJ54I zlUhC!3N}?<@04_R%;#|LrsM|J+BjqXk^eU(g{4;Eq)l1zmeQhK0xE;E^GWA}9?ZH1 z>+T?Dg~V(CxMEf9ZmCw=`yAGwqZ;z*<6i%YI)WVZ zH?mA%`eJ=GVrZ+gjqm>X3aD^AQA#3`t4HK&J=((Q8y-Y-9wtoB=n6YD2p>oc3}h4S zQoMXQL!VGxUnX*63Zque<|tna_B1pAJPt>U1>PGQeq8ur2lw#X{&3jqh>#E!D`QLJ zQKlhJI{zh7!*;btHuqzw@6QZjZgd{1DmH=g-z2YHp!nHGD(ZeVexWxr*@t@A5~kmP z1H4yhWijmHGB$eDnLe!6ycsW~3@5(jmd|4<3|%k3SnV7xTyz<%jHr48>x?t;)OB+u z_y5}I>+Q-jdxE6m9%6gahloxh8r%g!8 z+{Dh<5j;K=;F!Fwgs-$v`=~Odw0;N{Vp2e<^G*X1cA5VXl-A`^Dh(#AAJm=+WdzuQ zLagg5Os{yi$&LF;Z_EIUWIbD1r|(TEj~%3prAZ<1+_!nzg{$dx_F;-z5?5+u zkRFpeUbS23Hy({xT)NzbhS9H!AN26OCDo@*-+!II6+3?3@euv)l7z8XWI(M`CR=k` z?mSAzvCJrarIXTgnO|UoF4zqEDO*I+JBe91ZmXg)YU;00MX{8rr#f}_tRMV(pN?@@ zK%7;WC#fJNtw+unE<4#Vg&!ONJ5a(GpJikpSx#h`N9>4{pEQdsw$)YvUUs z0HA2pP*yPX$=u7*0h>)__XYXV%s8-dn_wf?LB_b=i~S=uY+)tjsc*8u*1F=}IKPJSX%Y(BblT31KbS7aC3zoML#8vO*5CrtzD zdd!Aaq@Hh{BzooBTFhYf_LZnlGT(WjlaBY`XW5Hqo{!gly$@b2QFxbmAFfTqC>uW~ zBSD`WkSZt>n!T%k>e?EcaDQ8x+&O%UMg!qxREwWB_Oz$<9_u%BZy1?~Yu&3JHW>yAcUDROQl|b$oDe#U)Iyrc`S6 ze}Tq&w_K%_u(@WDE!TP+@as9?9SJJ*>fh# z&09oh0KVR-8=3m*w`;?~v1te0vTgPeC2zDF)$YJi>X?=Di&-mWI-GA;fVWOjUtdM- zg!s{|zf48XT#pOCwH3?tZQ{)t+@}gqX*JB;F|Si_F*x0FBS;t&5pQg9uk;QS^VTWx zZ$6)u6~AcMKhu%}Aiiv-ZO5WF$)nPmf7GEaaStd-N-Fto^~S(b%ykMZfcx!^JZzqFQVXLknt1uI+nUC|qFTXA7ePuo=x=S<7sn4)wG_=!T~XwKBouFisYc4M}K1%UwWrHluEG+H@mzNKFokxbIUtjw2Ri~PoD3&i{97{JuNzXTo zM?TfKlj7q=``Is#T$Z15e09F8ca|A=^xNhyIUgCz40E?)T0q}(snN~6@VW6y6M+*)+|R)kOxJ%zr-4vfd5KG_Nh{N5=vet)3#SbQQy7L~xKL zAB%&_V!SNZ<3*g7$$gD#EHNF+&`z`dj!}21*D(x>NjgmPfuajt@4lbX~u$TZ<(I#ffSW3(OZ$AGpXyG(pQAqw)F7z+YEkqqR;m=!+f?OY&*Q<{mr-}R;lts4>c-6=O8gt8{6Hx8dANeELAfeEt9Ks=5rLyeoGRVAIh=gg1F zLygljKi7jn-GROwN#~QB(nzI}e2zqtJIu8^*um5O8YQ7(+(TvOn8wwDV{U+VqzU^@ zs@0d+IBh?MB0?#G$1}MLS*8Ko5EQ_iyZdru6=5Fw$YqIzxZ)GyAe{Uaq zB0Rhx;Xd%|7hz%gl(A;g%3)fm=sC^!%qhYTsaxxlB2vl1hn&;e)Qe5tnQKT%Z`48Z za*dj+5@{Fd=U~aRlZOvXd`m)@cczST5&E^a)HZG11#BZ&8KYGztax?`Y^qOJcKn=+_LY{_M`9)Wn9pPtj?+v@IGS2LAFDeIft77O|k zopmAL-L1Gm12;6{KOBmm@X0~; z+)G)9oy9QGe%q6m-p_SXs&dm%mu^J|Ma!K7`Uu@$=AG10Ar(e2y_1zPX{u7Skq~ub>;l<(Z`SL<%F{loh@6`5-ru+-T>2AK=!3>D5b0krH(x{6uSaqI+zh z>YFr{5(vd%2Z{$3DorHmUf6``PQ&GJUEX9WPogva@=c-AHhw&*6)1fA@;+cEls3_? zo^LGL9!-BpaFL@gGEkh9y|>{he87x3M6*pRQd7s%4>w{Mc+@-JoBSpY8Ti zL6|}C$5c|`Q1lnI*rX3=5a;8(-Qv|sCrzV7qcNe~jZVrbBX*j2R<8c2vMwo)&{z<~ zIEJh}l8?>Tz5wE|HkohaTRkizNt?}WWO@FC&%S7~OmioV+i0zKe*IJHQOBK{m^npZ zhE#4NV5y+edV2(=1g_}ouco3BnV>W%hw(VURXu_GnO#y-o6B}kNmDA5t{VM|r5mRpN7AMwn!U){?& z6!*8hC>jVtXZs0A;FO+?=P9~D|LaP@3+^@6HQ-#d2xc}>b>N$XjL+mpNM)@@?%Q}8 z_x&yn+bbemL>?{-u9Zh5P8?F`;yv@Ts7c2kk>W1X4q|4{k?jiCRo~8e&YB}5p-h6& zEc!7Z*=+`I=)Z1|kRRl`1@K}lru>%Ix(~R+(@}#U$w*}a2E^+W>_ypbVPS@8C5eND zKFcIz6u*!a#VE!rLHE%NUYtMcHZQ7%>5Mt<=DCfB#}1R-Uujp=GZwqdZxUnpk5))6 zFjpn++P6&pS@#c9e{V#CiHS{*92g(RZPUzQzFYbXajG6AB~yh}kU8B>`aJeZpY`1nG#f-QjM$Yi!?r&*yCC~Irjfp{q+c;47+MoKtU~%2o z@uzvQH8pdJCj{aZ*tmpE9504L?*4sY^-_80wD7pg$+;55`<+gjihu1t*~U(RK%|1Wj?i6RC2=?!AtJucU&VAFwsGA>{K zuVdH!g4D|@r6)S7(BJ0`;X=T7$oDTkDbunxv~Y{Jl#AtS-FE%tKrmm6)Ipx0P574y z%}B9xA4S|Sv)l6?kd+C$150}sN)<-Yy*KmNV%<{uv4K?2D)|r+cGTP;Hl$ zcMyYBY#6LBIQt#_&UMnGlwl1tBc2`twhVDVG3L#d>=timQBv|lBMLYeRY(S`m3$@T z|;x~9+_koM;Q)8hmBGjYOd5t0r zHAoJ@P4~b8ts%LkoG~&!U-Us%Nk)`!U|*uP-0C8Rz-36AUVe^P?mgZKIne8rkXwEJ zQPV$m)bqgoJtMJ6GB)CP6O7MDqvp}Cg zao$%?u73&cM_5}sUmzhMwcviVdWa8_1hGnES6#ZQX=P^?4;2|ciaUW#{vJC=p7YE+ zD#t7_DYOCcExqAK!G0fU0ttNmby*vGXD$+$inAjfg^>cjGadMsQyLypwWmemD6 zpwUdyoUaLo|MBzxwZoMG8=G;hp8@SDR}N+^SC$O43@f>9(`xU#X6xms5|3X|pjkYz zG>p34xNyV!&AUy{sw^~s)bDs>g8_`oKxRU-<=)RC!Bndb2}Yq^1;VDa*|G2UqHw7Q zIe%-cM)Yy&gK@$jcL1Pxv)$OoDJB$;{I@>kztD%Zowp9*)+q_(0Kr`+?^DyBvBquD z2jL-!Y9g{i>6eBzT77o)n=m9J=(Vj7zv6*ziNn?W2v=Pb9+;3C*q9^DobDdWZ2bw} zd2Mq`@t3}v>PPI0eFCgjXX2@u1)*Y-LxR}%-b&K^dB*mb;FLp5>aV1_UJN8@Fi9;g zF%)T)v9(N92wxeOs<>&!D;B^;*B#cMGRRC>sU<#*wEwKc9?>R_s(9)6nF!SzsVLz& zRB!+(G^+E8Z}+@m3DvaOa^ew07+Mif4^2NrEB#kNsA!S7KABIcnEC|skht)cJ-Aqi zmYmYxzHEuc5G^jZx<}wHcE0UG5o^HPD?_bS8o54C4gITRJ*u1%DD1jUL14PA`^D1X z``X?&jK@lA_PkH#%(>bMC_eA3Ke+q&_H?3jg?qClhtwbE0zCeIxNRaDK%I5`87z{J zsV34RnXlt9Z;2X{LTdOMT^>zKpG-v+CLzs>IL2W+}g4J9V*K`*x1sMQJN$x zzb>AaV(48kEbX7x!6&|Aro1n0${dfs3ldnF;=6NbLKU#ieg?Y^vcy?&x7rCd687v!xG6F1fa@KGr3ZPW8ioy8B=Kq_JCE%O zj%HdJ?4DgE5;*cCY;KT@Q+qW~C_*tBE&J*Wp4YT~#KWPnPx5~Sf$;FarHJeDpN5!1 zJMuhJiw(d3YeD=c-CbT=-5jg5W6A$=fXoVfdgzI&RwJ^FJ0+scQq&M5|F$77N}ee4 zem`(inZ(bLPV%`27K;M>wZFkMY2t(+Kl>m`yY92jL{=MjM#R&W27eS|~F%adR@-J*N}BFc3aY$PFu7`zbb^KvX#UviU6uGRtk(F4_}V z9n8S(%bXXD-f6NNDzjIFz+y1S0e$ODf05x24t{w}XI4hR7QtZ5HLRHnI8`Z^DDv$V zYTn9qR41HoG3!)sPrW&ugtV!?JLpmpIyqZN5X$q}Jh4`tsv5DU4y?%EXV z(Zmch4pIkke&t<^g(~?^XA?4w%V*9-KdE88*^}?<4hN6vh0U?G8YwZZ9HxNPGET$) ziqvqF;bA}dwUr~*cys#lP&}b|y{yw3-5v0(J>=SW?IO^GIa<_SV0)^czq00luR5k1 z*OK8v6O&s>!p`<~eXD6fZ}_e!NoloYe_6*|*G{4&=fxA#g2_xPrW1+ZJbZ(3N!$*v zx`jM$4LK~FhbK)JNEl?3Ykwd&I(5rZa)RjtgEQw)uiQH?_YB@Tl>fNYLtZAoW=gM) zU8_0GDcRsC_#)X&N}?^xWn}9K02vwhzhHY9xj^Yjp>_sdaG}5&^-5uSMmW2WOI2f< zPeTnEMA;AimqWji8sVL*`zCDgU6nRR9ktEhl$l_RbxT<0+|&f;S^P<1>g7~r{1w4! z$kOg(8~X)v@|#PVVT0C42*h8^>3rQ5WYYQT@r{!oUBS&&Xexrkp2OqG2n)53GW-&aVXosH1Nb4!@ z#>3bu`!>4?vs)KQwpN#v@Jn|s+VBDEpPa_HxVI<{Q6n!8XQAf}MUw50Z^caKrXAML zT+McmW#>gVO}jKWogAUp$1dlhP%r%>P4Xc_m(M1Uq1bDDDQ8M_xx6Z;B7ED+1T<8h KDOV`I{O~`TqlISx literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0009.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0009.png new file mode 100644 index 0000000000000000000000000000000000000000..35d54bf965786659ce85d3174abf8ff63d580c75 GIT binary patch literal 4811 zcmZu#cQo8v*B*(M(R&M`TqJ}jqxVh{Eh0pZ8cfs-Ve~|lVTd3)5uNBQ7-h7mqnFV| z3!_XJUB0>R{oe21yVkeX`JLZ?d!O^{=REs4C(1xiivq|B1ONaOI@;<+`2PX^%OSmi zpIe(CVgLZ`2OV`4W4{bcrji@mEaW}>X6R>Hv2$d^O`aFT&0aPxG4ZkYxejjlqa$5f ztWJqg0vcJyKU8iQeTwb)_|VO^#I(J$AjgVsRO79ayIsjB(2r7imSVfJAmR816dNw; zrmb^_#<0wY9Q1jZ#YW@{9WBIgKAod2w&s9wIPo*dE}F4VQm8X#M53`F;-?x$dhu9^MUZ&v?Uf@hzs zzD;cgFBRaNpy|i=uIaDQ!S3i0>nJOFBotVg!%}RcB5u?X=J+LyXh^%e-N71ApgMJ& zLUH&~fN2wQcMLPM{jG@ZBy)PP zYOI%1QJ{E*fLa*F`|O3z{q1}&{pxyC`g3Sy(jyfp!*6cH+-R0AZX)QHtvjx~d?*O5 zrfYdXl08gnQ(`s^Ck!sgvjxA>yKqF5KscsvF?w$~SAzJ{A7`ZMxc~8F3TI3USoSlh zyxKq}vky&BH1F#D?1IAmh& zxXQ@Po^oLb>?@0?FQ!9NfXEu8CdmPXYlmhR+tU6f;H!G^XYm#YQov!7Mu+D&G%5H& zdSpZCxX)x=O_FZsVUEKEjt>3Q)$4b&IAkf)p!8}t@L}CCS~#SZ=ZI?d^P9^H(-|}V zoq4(I-kd#Sh;o7sVz~A0*HfPr+$nh|WHtEgxATfSjD1ewMxE1U~R8HoR-jrF!9$ZvK!R?~%o;>G*2T2kaC( z=Z5l#+Deax3pTR=nK`G{nkc$pF!b1X2oV3A(7j7~P(G-vyo~vLiuUkHt}k1hZMhv&Sx+;&%A{7;2@Al-dd0CimK7k5dC$2UV}E-xSX zXc|V$IV>ou`u?nW-pv@dZll)(;&_AQy|{eiI+2k+P8+rUj1!0fTLlW-i6N~bWp)Wl zQ_xlf^JYs%&xUhNrZ;X9h3qEsAD$X*oO#>vnlRK|Sv)oDZk?VAtH*KPRED-*B~1y` z2F-1t3fnBrR?d3(NydDnb4 zjN$21<6ma5mA%URHPToRyY+%@LH&ojUtR)2PR}=x6B|h5<}$OPY~hH4nC^^2qop@`mRx+vq)VClRfR-R&7`uIe3hQalz9K~z_DN&WRjif+EW7X?6U`wqbQ z;kwo4RD~kF*tU&mKsHz`3jlTJ+$$&{~#M{{}L(>kkEgfhw z1h9dPCto{mjIU1l@upe`Cg}nyYw4vXGt2}zlUU=LK^x3fXJEr zSDkp74&Sc-P(0gpZZh_QxnAPiL%PC#4~jI~a74;eHeU`Xy>D2Y0G-p$ADawrxjPe; zyTLW-Iw+OQ$qQpx^pTLK%cR-YB7~qt7aqtv_dLq0T>^v@&fWy%4A<$o(MM|!MYMiN zfpurwD23t0(^WG1-A@}^Fz98GnK`8TZMB}W6|zuOaL!!qdJhcRLW9qS_Y-l~QXNo|WM_gc>oTvg_B4FTBr&0w#d&7m z1~V~oqe1OFF7k8+O?~TFD1K?&T z7)8(NH@tpK>ie3a9!c?0oh(tppZCAQR=(E>GryWyH9#Q%Z^D9i^}>XHa^`?cE^jCj z{=9W~fmv!bK`O+Y3ik9I{9#m~Iv&0h1nc73l0Dn~(itN@?A=D*QKxjVWfm6R3wSUq zaI@Wf|D}&p#TBZLk#(ViM}p_A`C1W|YeR$*uo=VruTJ@H^0R>(Raj!pPbO3PdUrzY zOTa>vs&Ad2w$Lrh-0>{I+BonJLHk+ZA99u@-=C>yoea#5JyvJyTIJDqcCl}>dEC3g z7aAWRXTrPz?EK&MOGK8I0A!TlVbJ3Yj44ZCH{_2AZfpNak)R+noHPA|pN5HmXj8ak zcV$bz0`wr`X%WY~!oU(BqMZSP-Gn*KQ3%n|39WE;k5xAn_TBZU52Z z|4b4cYCA#=xGf16zR=anF_+lVqpMc0@9zwqZu5}>zB`xLIwriq>#a@K`%)lU*@)K5 zq1 zg)34@+#E2LBtO+6qOw-gp4L}|oF|r~DW4zvy;T$mZ9g7B5N^;j9yQs3tU;zIm~mxJ zCKCCJ;Vs_sXlN<?ay^b261cH$siVU%S3}Kvww>-z1c=b8 z*iV1$-9J;PGE4H@q4&Cs3(fe-djpX|bnoUZ`x%cIzJwbTtt)tU1Z1qGi_m(5gKGQ} z_;*PuYorzBYKvTe8SlErhg7J1q1Q#G#;R2#6Ng?Sitd}3sJr$o8K0QXn}eMj{HPAh zVrkHE7kyg<*A^FQQtU@`K!1X>Ms;igP9&flAg}tjar=uowRE`O*tV3wTQHEq?p<;U zc;_GIvi@Dxeo;dG%(%DE`_%J?f!^%tFifyzX?gFRSfPpi+%}{_ud#)Ubjm_UA;k(g zTb?(K{auA&u7_EK4uhn;mk+j=^F$g(p-ZMpQhLCKRlKh9SM`z0_ z=h31EL#y0knEm)9Q1@)2FP1RdvE&FEB?xaHX~ag7DpGxwR~>t)+#2PYaH$=g2-PcT zzBZECxnJCl<-m!zjPF)>1amfXREM;kb)U&V=csXFcY`gE$=x*ehVKhJm9+9s{UO=D zjbq+xW!(2W)~et$D>QRNiXXZf2OT=XAS6>q4536AR?c)#@^L0L}!mL4d$b_VggJ?P=Ah6oD#NAAif3+;1N*9-{&|3pp@-1qFJ7e{>&Fi1S+V$X!e zx`8_K)?XyY3)O%3_Gf11(>Ar+BOc+qWI1Gktjm>_y`_%U)cYHs;6N; z18^XdGB4lwR{pMV+fjX#JGv*VCi_K&Esg1_l29VSjs=ZQhy!Xi$D^8^sG z=u4Iz@$gJS$fNi(aNQyRcR8iU9xGzb9DeQbuf{ z7+o=|;m8g&1I7GU_o!9ra+!Q2o|%mCW;JYkuaOZUo*lu1wJ$f~OL~F$=83M)#$5qr)Bf?jFYqWJNA_Z<>e>x3nwb*mFK|3V+# zZ)LaLRe5pBsz^4PQf8?QzbncA-$&Qa5iCIePDmLS2DRqBr~h|G>6l^rR^Y9jT+gCO0%c&b~tnwj@p;MGFdb`F8?-P# zuE|OD_H0ZKrZ_k^gGkaW=@tNTo(C4*<-ve~DCgiNLxHqjvXya-PB^C?$#L^qAuhY0 zA2Z-IXWr@U+{1qKf~IT&HX}f9r{c~>kt)#@X65aOU3;(Eyg+}V@34c*WF{r%k1y7o zS_?jB$)0LCRQe)#S-8elQ_=CfG{KqR1NYHr9@zfuB)H=`^gKOVdqgt0A3&YP^T)GI z?L3SnI%w-2!mKA5O=F>P5}4#Cb7QTMlWLe^$Nh!U-~jNIw_FJNhxMu(zt4zaxh9XY ze;=Xwy_DwC*|N&KKr|}(P9iY|tqHkRf?TXZ64z0cAbazX!kCVGxQN2rFuAhw3MX!r z$O`U&!w#&56){Pd2Nb`1N-*Mu=KU zZZgvx@C}fVt&j#Pm)|E)eweudq?(Oousy+jbX^g>>=I+GKGAE*d8(*$)cKagToT&2 zxwO=iZhFKdos48^=Lr8DbU{{q389@v=A&fmqr(D~N4^Ke2U9MOu3!A_6$dZ6EYHg510DP)y^-nWU5LZnP=CAf)L2Tw~i;|PixF~O}B4{R~ZW7s|JV+ znXY7ZAuf%K**G>~dy=WiHokW@<6L1PUqqRX(_^w}=aE>WBwLAG;T_I`p)5JVd{`ai wwkMg(ud)zHnvTrT7`qm-5T;)h6tJ05=|DY5)KL literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0010.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0010.png new file mode 100644 index 0000000000000000000000000000000000000000..8b555e49e340a6470ac8e70e446456b4a3e70ad7 GIT binary patch literal 4851 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 JDivNq{tr7Cbld;{ literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0012.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0012.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4165d5eb95ffb6b03be0cc219e3869ac1d1045 GIT binary patch literal 4409 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0016.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0016.png new file mode 100644 index 0000000000000000000000000000000000000000..d3636525a0bfe1de818d0dee5349fd92870b772f GIT binary patch literal 3780 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 Wd4fsX9Dn*dWzf??z^gPLJo_&-!b`{i literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0017.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0017.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6086460d2d57660c138051f29843ecc5c5fdc4 GIT binary patch literal 3565 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 AvH$=8 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0019.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0019.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9b989e9a5a9a288b87e34815572faa572c6eda GIT binary patch literal 3342 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0020.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0020.png new file mode 100644 index 0000000000000000000000000000000000000000..706120316fcdb1c3c208342d05a7b084ca92c0f6 GIT binary patch literal 3262 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 J%J6c`KLBMdLBIe2 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0021.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0021.png new file mode 100644 index 0000000000000000000000000000000000000000..792199be69a35dc73b4c30fefca36331738ff7e0 GIT binary patch literal 3147 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 mhvaLQepugp(EkBbs~|`K literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0022.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0022.png new file mode 100644 index 0000000000000000000000000000000000000000..08a6d3dbae13d1b468c57d8edb4537703951d2cc GIT binary patch literal 3103 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 Jtk7}@|2HMP-Ln7y literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0023.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0023.png new file mode 100644 index 0000000000000000000000000000000000000000..57d99fa3c21aa9a9dfa08c756b0efe261dd00320 GIT binary patch literal 2903 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0024.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0024.png new file mode 100644 index 0000000000000000000000000000000000000000..a49291156c38d6d78b152c3373bd7c664d4167a6 GIT binary patch literal 2826 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0025.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0025.png new file mode 100644 index 0000000000000000000000000000000000000000..1dfa40cbebb653dcad91370a3c2eff2794c9079d GIT binary patch literal 2721 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 E1CJojZvX%Q literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0027.png b/src/platform/python/tests/cinema/gba/window/zmc-window-mosaic/baseline_0027.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f6dc6f24cd93444ceb121dbba41c9dca4a2ad2 GIT binary patch literal 2301 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

    97Uwl`E3 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 RZpGzi@7tMgTa9IV{U>9%QvCn` literal 0 HcmV?d00001 From 65a7233d5f555637628806fa140036d30a2f7821 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Aug 2017 18:35:17 -0700 Subject: [PATCH 086/158] Python: Fix test requires, run build by default --- src/platform/python/CMakeLists.txt | 6 ++++-- src/platform/python/setup.py.in | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index a80dcd4bd..1d6fe6656 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -34,11 +34,13 @@ set_target_properties(${BINARY_NAME}-pylib PROPERTIES INCLUDE_DIRECTORIES "${CMA set_target_properties(${BINARY_NAME}-pylib PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") set(PYTHON_LIBRARY ${BINARY_NAME}-pylib PARENT_SCOPE) -add_custom_target(${BINARY_NAME}-py ALL DEPENDS ${BINARY_NAME}-pylib ${CMAKE_CURRENT_BINARY_DIR}/build/lib/${BINARY_NAME}/__init__.py) +add_custom_target(${BINARY_NAME}-py ALL + COMMAND ${PYTHON} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build + DEPENDS ${BINARY_NAME}-pylib ${CMAKE_CURRENT_BINARY_DIR}/build/lib/${BINARY_NAME}/__init__.py) file(GLOB TESTS ${CMAKE_CURRENT_SOURCE_DIR}/test_*.py) foreach(TEST IN LISTS TESTS) string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/test_" "" TEST_NAME "${TEST}") string(REPLACE ".py" "" TEST_NAME "${TEST_NAME}") - add_test(python-${TEST_NAME} pytest ${TEST}) + add_test(python-${TEST_NAME} ${PYTHON} ${CMAKE_CURRENT_BINARY_DIR}/setup.py pytest --addopts ${TEST}) endforeach() diff --git a/src/platform/python/setup.py.in b/src/platform/python/setup.py.in index 69c69bd8d..27d86e3f6 100644 --- a/src/platform/python/setup.py.in +++ b/src/platform/python/setup.py.in @@ -25,7 +25,7 @@ setup(name="${BINARY_NAME}", setup_requires=['cffi>=1.6', 'pytest-runner'], install_requires=['cffi>=1.6', 'cached-property'], extras_require={'pil': ['Pillow>=2.3'], 'cinema': ['pyyaml', 'pytest']}, - tests_require=['mgba[cinema]', 'pytest'], + tests_require=['Pillow>=2.3', 'pyyaml', 'pytest'], cffi_modules=["_builder.py:ffi"], license="MPL 2.0", classifiers=classifiers From bbb74a47a1fe69870c651c93ed31337d52243535 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 12 Aug 2017 19:01:17 -0700 Subject: [PATCH 087/158] Python: Don't bake rpath into executable --- src/platform/python/CMakeLists.txt | 8 ++++++++ src/platform/python/_builder.py | 4 ---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index 1d6fe6656..0322e2fef 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -40,7 +40,15 @@ add_custom_target(${BINARY_NAME}-py ALL file(GLOB TESTS ${CMAKE_CURRENT_SOURCE_DIR}/test_*.py) foreach(TEST IN LISTS TESTS) + if(APPLE) + set(PATH DYLD_LIBRARY_PATH) + elseif(WIN32) + set(PATH PATH) + else() + set(PATH LD_LIBRARY_PATH) + endif() string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/test_" "" TEST_NAME "${TEST}") string(REPLACE ".py" "" TEST_NAME "${TEST_NAME}") add_test(python-${TEST_NAME} ${PYTHON} ${CMAKE_CURRENT_BINARY_DIR}/setup.py pytest --addopts ${TEST}) + set_tests_properties(python-${TEST_NAME} PROPERTIES ${PATH} "${BINDIR}") endforeach() diff --git a/src/platform/python/_builder.py b/src/platform/python/_builder.py index ba291ef71..4aa2116c1 100644 --- a/src/platform/python/_builder.py +++ b/src/platform/python/_builder.py @@ -12,11 +12,8 @@ bindir = os.environ.get("BINDIR", os.path.join(os.getcwd(), "..")) cpp = shlex.split(os.environ.get("CPP", "cc -E")) cppflags = shlex.split(os.environ.get("CPPFLAGS", "")) -ldflags = shlex.split(os.environ.get("LDFLAGS", "")) if __name__ == "__main__": cppflags.extend(sys.argv[1:]) -if sys.platform == 'darwin': - ldflags.append('-Wl,-rpath,' + bindir) cppflags.extend(["-I" + incdir, "-I" + srcdir, "-I" + bindir]) ffi.set_source("mgba._pylib", """ @@ -49,7 +46,6 @@ ffi.set_source("mgba._pylib", """ #undef PYEXPORT """, include_dirs=[incdir, srcdir], extra_compile_args=cppflags, - extra_link_args=ldflags, libraries=["mgba"], library_dirs=[bindir], sources=[os.path.join(pydir, path) for path in ["vfs-py.c", "core.c", "log.c", "sio.c"]]) From 828be44ac23704a09e6caa1783f495f1c49ecb2c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 13 Aug 2017 13:24:51 -0700 Subject: [PATCH 088/158] Python: Set environment variable properly --- src/platform/python/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index 0322e2fef..57ca9e1d5 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -50,5 +50,5 @@ foreach(TEST IN LISTS TESTS) string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/test_" "" TEST_NAME "${TEST}") string(REPLACE ".py" "" TEST_NAME "${TEST_NAME}") add_test(python-${TEST_NAME} ${PYTHON} ${CMAKE_CURRENT_BINARY_DIR}/setup.py pytest --addopts ${TEST}) - set_tests_properties(python-${TEST_NAME} PROPERTIES ${PATH} "${BINDIR}") + set_tests_properties(python-${TEST_NAME} PROPERTIES ENVIRONMENT "${PATH}=${CMAKE_CURRENT_BINARY_DIR}/..") endforeach() From 04713d9de1311b24aafd96fea9eee3a62345ef4d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 13 Aug 2017 13:25:12 -0700 Subject: [PATCH 089/158] Util: Remove elf_repl.h check --- CMakeLists.txt | 4 ---- include/mgba-util/elf-read.h | 6 ------ 2 files changed, 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a6a7503d..4e8a8c7c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -607,10 +607,6 @@ endif() if(USE_ELF) list(APPEND FEATURES ELF) include_directories(AFTER ${LIBELF_INCLUDE_DIRS}) - find_file(ELF_REPL_H elf_repl.h PATHS ${LIBELF_INCLUDE_DIRS} NO_CMAKE_FIND_ROOT_PATH) - if (ELF_REPL_H) - add_definitions(-DUSE_ELF_REPL) - endif() list(APPEND DEPENDENCY_LIB ${LIBELF_LIBRARIES}) set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libelfg0") endif() diff --git a/include/mgba-util/elf-read.h b/include/mgba-util/elf-read.h index e3886ac64..86683ea82 100644 --- a/include/mgba-util/elf-read.h +++ b/include/mgba-util/elf-read.h @@ -14,12 +14,6 @@ CXX_GUARD_START #include -#if USE_ELF_REPL -#include -#else -#include -#endif - #include struct ELF; From d68e12c35488fea86dbbed42e9d44427b2211570 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 13 Aug 2017 16:00:42 -0700 Subject: [PATCH 090/158] Python: Python 2 compatibility --- src/platform/python/cinema/test.py | 6 +++--- src/platform/python/conftest.py | 2 +- src/platform/python/test_cinema.py | 4 ++-- src/platform/python/tests/cinema/gb/mooneye-gb/update.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/platform/python/cinema/test.py b/src/platform/python/cinema/test.py index 684d8fcef..833d493ed 100644 --- a/src/platform/python/cinema/test.py +++ b/src/platform/python/cinema/test.py @@ -21,7 +21,7 @@ class CinemaTest(object): try: with open(os.path.join(self.path, 'manifest.yml'), 'r') as f: dictMerge(self.settings, yaml.safe_load(f)) - except FileNotFoundError: + except IOError: pass self.tests = {} @@ -66,7 +66,7 @@ class VideoTest(CinemaTest): try: baseline = VideoFrame.load(os.path.join(self.path, self.BASELINE % i)) yield baseline, frame, VideoFrame.diff(baseline, frame) - except FileNotFoundError: + except IOError: yield None, frame, (None, None) def test(self): @@ -83,7 +83,7 @@ def gatherTests(root=os.getcwd()): test = [f for f in files if re.match(CinemaTest.TEST, f)] if not test: continue - prefix = os.path.commonpath([path, root]) + prefix = os.path.commonprefix([path, root]) suffix = path[len(prefix)+1:] testPath = suffix.split(os.sep) testRoot = tests diff --git a/src/platform/python/conftest.py b/src/platform/python/conftest.py index d80dcdea7..6690268a1 100644 --- a/src/platform/python/conftest.py +++ b/src/platform/python/conftest.py @@ -42,7 +42,7 @@ def pytest_exception_interact(node, call, report): try: with open(os.path.join(vtest.path, 'manifest.yml'), 'r') as f: settings = yaml.safe_load(f) - except FileNotFoundError: + except IOError: settings = {} settings['fail'] = True with open(os.path.join(vtest.path, 'manifest.yml'), 'w') as f: diff --git a/src/platform/python/test_cinema.py b/src/platform/python/test_cinema.py index 148f6c99c..61c27bf7d 100644 --- a/src/platform/python/test_cinema.py +++ b/src/platform/python/test_cinema.py @@ -40,7 +40,7 @@ def test_video(vtest, pytestconfig): else: try: vtest.test() - except FileNotFoundError: + except IOError: raise if pytestconfig.getoption('--mark-succeeding') and 'fail' in vtest.settings: # TODO: This can fail if an entire directory is marked as failing @@ -48,7 +48,7 @@ def test_video(vtest, pytestconfig): try: with open(os.path.join(vtest.path, 'manifest.yml'), 'r') as f: settings = yaml.safe_load(f) - except FileNotFoundError: + except IOError: pass if 'fail' in settings: del settings['fail'] diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/update.py b/src/platform/python/tests/cinema/gb/mooneye-gb/update.py index e192abac7..6f126b349 100644 --- a/src/platform/python/tests/cinema/gb/mooneye-gb/update.py +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/update.py @@ -41,7 +41,7 @@ def ingestDirectory(path, dest): try: with open(os.path.join(dest, root, fname, 'manifest.yml'), 'r') as f: manifest = yaml.safe_load(f) or {} - except FileNotFoundError: + except IOError: pass dictMerge(manifest, { 'config': { From 3f94175189a5ef2ab971714b2d265a23957888b5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 13 Aug 2017 16:02:04 -0700 Subject: [PATCH 091/158] Python: Better approach to finding libs --- CMakeLists.txt | 3 +-- src/platform/python/CMakeLists.txt | 17 ++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e8a8c7c4..527dacdac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -615,8 +615,7 @@ if(ENABLE_SCRIPTING) list(APPEND ENABLES SCRIPTING) if(BUILD_PYTHON) - find_program(PYTHON python) - include(FindPythonLibs) + find_package(PythonLibs ${USE_PYTHON_VERSION}) list(APPEND DEPENDENCY_LIB ${PYTHON_LIBRARIES}) include_directories(AFTER ${PYTHON_INCLUDE_DIRS}) list(APPEND ENABLES PYTHON) diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index 57ca9e1d5..a6552cbc5 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -1,4 +1,7 @@ -find_program(PYTHON python) +find_package(PythonLibs ${USE_PYTHON_VERSION}) +find_package(PythonInterp ${USE_PYTHON_VERSION}) +list(APPEND DEPENDENCY_LIB ${PYTHON_LIBRARIES}) +include_directories(AFTER ${PYTHON_INCLUDE_DIRS}) get_property(INCLUDE_DIRECTORIES DIRECTORY PROPERTY INCLUDE_DIRECTORIES) set(INCLUDE_FLAGS) @@ -6,15 +9,11 @@ foreach(DIR IN LISTS INCLUDE_DIRECTORIES) list(APPEND INCLUDE_FLAGS "-I${DIR}") endforeach() -include(FindPythonLibs) -list(APPEND DEPENDENCY_LIB ${PYTHON_LIBRARIES}) -include_directories(AFTER ${PYTHON_INCLUDE_DIRS}) - file(GLOB PYTHON_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py) add_custom_command(OUTPUT build/lib/${BINARY_NAME}/__init__.py - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build --build-base ${CMAKE_CURRENT_BINARY_DIR} + COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build --build-base ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${BINARY_NAME} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/setup.py @@ -22,7 +21,7 @@ add_custom_command(OUTPUT build/lib/${BINARY_NAME}/__init__.py DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py) add_custom_command(OUTPUT lib.c - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py + COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py DEPENDS ${PYTHON_HEADERS} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py) @@ -35,7 +34,7 @@ set_target_properties(${BINARY_NAME}-pylib PROPERTIES COMPILE_DEFINITIONS "${OS_ set(PYTHON_LIBRARY ${BINARY_NAME}-pylib PARENT_SCOPE) add_custom_target(${BINARY_NAME}-py ALL - COMMAND ${PYTHON} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build DEPENDS ${BINARY_NAME}-pylib ${CMAKE_CURRENT_BINARY_DIR}/build/lib/${BINARY_NAME}/__init__.py) file(GLOB TESTS ${CMAKE_CURRENT_SOURCE_DIR}/test_*.py) @@ -49,6 +48,6 @@ foreach(TEST IN LISTS TESTS) endif() string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/test_" "" TEST_NAME "${TEST}") string(REPLACE ".py" "" TEST_NAME "${TEST_NAME}") - add_test(python-${TEST_NAME} ${PYTHON} ${CMAKE_CURRENT_BINARY_DIR}/setup.py pytest --addopts ${TEST}) + add_test(python-${TEST_NAME} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py pytest --addopts ${TEST}) set_tests_properties(python-${TEST_NAME} PROPERTIES ENVIRONMENT "${PATH}=${CMAKE_CURRENT_BINARY_DIR}/..") endforeach() From 0ba31c4e674a03c20c3798eb3e9994c8a185941f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 13 Aug 2017 17:34:05 -0700 Subject: [PATCH 092/158] Python: Clean up build and tests, add VFS tests --- src/platform/python/CMakeLists.txt | 33 +++++++----- src/platform/python/mgba/vfs.py | 8 ++- src/platform/python/setup.py.in | 4 +- src/platform/python/tests/__init__.py | 0 src/platform/python/tests/mgba/__init__.py | 0 src/platform/python/tests/mgba/test_core.py | 7 +++ src/platform/python/tests/mgba/test_vfs.py | 57 +++++++++++++++++++++ 7 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 src/platform/python/tests/__init__.py create mode 100644 src/platform/python/tests/mgba/__init__.py create mode 100644 src/platform/python/tests/mgba/test_core.py create mode 100644 src/platform/python/tests/mgba/test_vfs.py diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index a6552cbc5..3bbeb6a83 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -11,14 +11,14 @@ endforeach() file(GLOB PYTHON_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h) +if(NOT GIT_TAG) + if(GIT_BRANCH STREQUAL "master" OR NOT GIT_BRANCH) + set(PYLIB_VERSION -b -${GIT_REV}-${GIT_COMMIT_SHORT}) + else() + set(PYLIB_VERSION -b -${GIT_BRANCH}-${GIT_REV}-${GIT_COMMIT_SHORT}) + endif() +endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py) -add_custom_command(OUTPUT build/lib/${BINARY_NAME}/__init__.py - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build --build-base ${CMAKE_CURRENT_BINARY_DIR} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${BINARY_NAME} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/setup.py - DEPENDS ${PYTHON_HEADERS} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py) add_custom_command(OUTPUT lib.c COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py @@ -34,11 +34,18 @@ set_target_properties(${BINARY_NAME}-pylib PROPERTIES COMPILE_DEFINITIONS "${OS_ set(PYTHON_LIBRARY ${BINARY_NAME}-pylib PARENT_SCOPE) add_custom_target(${BINARY_NAME}-py ALL - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build - DEPENDS ${BINARY_NAME}-pylib ${CMAKE_CURRENT_BINARY_DIR}/build/lib/${BINARY_NAME}/__init__.py) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py egg_info -e ${CMAKE_CURRENT_BINARY_DIR} ${PYLIB_VERSION} + COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build -b ${CMAKE_CURRENT_BINARY_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${BINARY_NAME} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/setup.py + DEPENDS ${PYTHON_HEADERS} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py + DEPENDS ${BINARY_NAME}-pylib) -file(GLOB TESTS ${CMAKE_CURRENT_SOURCE_DIR}/test_*.py) -foreach(TEST IN LISTS TESTS) +file(GLOB BASE_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/test_*.py) +file(GLOB SUBTESTS ${CMAKE_CURRENT_SOURCE_DIR}/tests/*/test_*.py) +foreach(TEST IN LISTS BASE_TESTS SUBTESTS) if(APPLE) set(PATH DYLD_LIBRARY_PATH) elseif(WIN32) @@ -46,8 +53,8 @@ foreach(TEST IN LISTS TESTS) else() set(PATH LD_LIBRARY_PATH) endif() - string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/test_" "" TEST_NAME "${TEST}") + string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/(tests/.*/)?test_" "" TEST_NAME "${TEST}") string(REPLACE ".py" "" TEST_NAME "${TEST_NAME}") - add_test(python-${TEST_NAME} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py pytest --addopts ${TEST}) + add_test(python-${TEST_NAME} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py build -b ${CMAKE_CURRENT_BINARY_DIR} pytest --extras --addopts ${TEST}) set_tests_properties(python-${TEST_NAME} PROPERTIES ENVIRONMENT "${PATH}=${CMAKE_CURRENT_BINARY_DIR}/..") endforeach() diff --git a/src/platform/python/mgba/vfs.py b/src/platform/python/mgba/vfs.py index 48d1e6794..dbb65b4f0 100644 --- a/src/platform/python/mgba/vfs.py +++ b/src/platform/python/mgba/vfs.py @@ -11,6 +11,7 @@ import os def _vfpClose(vf): vfp = ffi.cast("struct VFilePy*", vf) ffi.from_handle(vfp.fileobj).close() + return True @ffi.def_extern() def _vfpSeek(vf, offset, whence): @@ -93,14 +94,17 @@ def openPath(path, mode="r"): if "x" in mode[1:]: flags |= os.O_EXCL - return VFile(lib.VFileOpen(path.encode("UTF-8"), flags)) + vf = lib.VFileOpen(path.encode("UTF-8"), flags); + if vf == ffi.NULL: + return None + return VFile(vf) class VFile: def __init__(self, vf): self.handle = vf def close(self): - return self.handle.close(self.handle) + return bool(self.handle.close(self.handle)) def seek(self, offset, whence): return self.handle.seek(self.handle, offset, whence) diff --git a/src/platform/python/setup.py.in b/src/platform/python/setup.py.in index 27d86e3f6..040be3fdc 100644 --- a/src/platform/python/setup.py.in +++ b/src/platform/python/setup.py.in @@ -17,7 +17,7 @@ classifiers = [ ] setup(name="${BINARY_NAME}", - version=re.sub("/", "-", "${VERSION_STRING}"), + version="${LIB_VERSION_STRING}", author="Jeffrey Pfau", author_email="jeffrey@endrift.com", url="http://github.com/mgba-emu/mgba/", @@ -25,7 +25,7 @@ setup(name="${BINARY_NAME}", setup_requires=['cffi>=1.6', 'pytest-runner'], install_requires=['cffi>=1.6', 'cached-property'], extras_require={'pil': ['Pillow>=2.3'], 'cinema': ['pyyaml', 'pytest']}, - tests_require=['Pillow>=2.3', 'pyyaml', 'pytest'], + tests_require=['pytest'], cffi_modules=["_builder.py:ffi"], license="MPL 2.0", classifiers=classifiers diff --git a/src/platform/python/tests/__init__.py b/src/platform/python/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/platform/python/tests/mgba/__init__.py b/src/platform/python/tests/mgba/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/platform/python/tests/mgba/test_core.py b/src/platform/python/tests/mgba/test_core.py new file mode 100644 index 000000000..03cb72667 --- /dev/null +++ b/src/platform/python/tests/mgba/test_core.py @@ -0,0 +1,7 @@ +import pytest + +def test_core_import(): + try: + import mgba.core + except: + raise AssertionError diff --git a/src/platform/python/tests/mgba/test_vfs.py b/src/platform/python/tests/mgba/test_vfs.py new file mode 100644 index 000000000..2315e2a32 --- /dev/null +++ b/src/platform/python/tests/mgba/test_vfs.py @@ -0,0 +1,57 @@ +import pytest +import os + +import mgba.vfs as vfs +from mgba._pylib import ffi + +def test_vfs_open(): + with open(__file__) as f: + vf = vfs.open(f) + assert vf + assert vf.close() + +def test_vfs_openPath(): + vf = vfs.openPath(__file__) + assert vf + assert vf.close() + +def test_vfs_read(): + vf = vfs.openPath(__file__) + buffer = ffi.new('char[13]') + assert vf.read(buffer, 13) == 13 + assert ffi.string(buffer) == 'import pytest' + vf.close() + +def test_vfs_readline(): + vf = vfs.openPath(__file__) + buffer = ffi.new('char[16]') + linelen = vf.readline(buffer, 16) + assert linelen in (14, 15) + if linelen == 14: + assert ffi.string(buffer) == 'import pytest\n' + elif linelen == 15: + assert ffi.string(buffer) == 'import pytest\r\n' + vf.close() + +def test_vfs_readAllSize(): + vf = vfs.openPath(__file__) + buffer = vf.readAll() + assert buffer + assert len(buffer) + assert len(buffer) == vf.size() + vf.close() + +def test_vfs_seek(): + vf = vfs.openPath(__file__) + assert vf.seek(0, os.SEEK_SET) == 0 + assert vf.seek(1, os.SEEK_SET) == 1 + assert vf.seek(1, os.SEEK_CUR) == 2 + assert vf.seek(-1, os.SEEK_CUR) == 1 + assert vf.seek(0, os.SEEK_CUR) == 1 + assert vf.seek(0, os.SEEK_END) == vf.size() + assert vf.seek(-1, os.SEEK_END) == vf.size() -1 + vf.close() + +def test_vfs_openPath_invalid(): + vf = vfs.openPath('.invalid') + assert not vf From ce07344c7d87d8759fee16a64df78c516ee599bc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 13 Aug 2017 18:09:58 -0700 Subject: [PATCH 093/158] Python: Support loading from a virtualenv --- src/platform/python/_builder.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/platform/python/_builder.py b/src/platform/python/_builder.py index 4aa2116c1..669473e90 100644 --- a/src/platform/python/_builder.py +++ b/src/platform/python/_builder.py @@ -71,6 +71,11 @@ for line in preprocessed.splitlines(): ffi.embedding_api('\n'.join(lines)) ffi.embedding_init_code(""" + import os, os.path + venv = os.getenv('VIRTUAL_ENV') + if venv: + activate = os.path.join(venv, 'bin', 'activate_this.py') + execfile(activate, dict(__file__=activate)) from mgba._pylib import ffi, lib symbols = {} globalSyms = { From 8ee270f3f6b5d7e09fef98a374f37bbae947f4d2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 19 Aug 2017 12:01:04 -0700 Subject: [PATCH 094/158] GB Serialize: Fix game title check --- CHANGES | 1 + src/gb/serialize.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 2c8b6aac9..c32a6ac37 100644 --- a/CHANGES +++ b/CHANGES @@ -33,6 +33,7 @@ Bugfixes: - GB Video: Fix potential hang when ending mode 0 - GB Memory: Fix HDMA count starting in mode 0 (fixes mgba.io/i/855) - GB Memory: Actually load latch time from savestate + - GB Serialize: Fix game title check Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/serialize.c b/src/gb/serialize.c index 78da148f0..ac5c58ba1 100644 --- a/src/gb/serialize.c +++ b/src/gb/serialize.c @@ -23,7 +23,7 @@ void GBSerialize(struct GB* gb, struct GBSerializedState* state) { STORE_32LE(gb->timing.masterCycles, 0, &state->masterCycles); if (gb->memory.rom) { - memcpy(state->title, ((struct GBCartridge*) gb->memory.rom)->titleLong, sizeof(state->title)); + memcpy(state->title, ((struct GBCartridge*) &gb->memory.rom[0x100])->titleLong, sizeof(state->title)); } else { memset(state->title, 0, sizeof(state->title)); } @@ -86,9 +86,13 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { } bool canSgb = ucheck >= GB_SAVESTATE_MAGIC + 2; - if (gb->memory.rom && memcmp(state->title, ((struct GBCartridge*) gb->memory.rom)->titleLong, sizeof(state->title))) { - mLOG(GB_STATE, WARN, "Savestate is for a different game"); - error = true; + if (gb->memory.rom && memcmp(state->title, ((struct GBCartridge*) &gb->memory.rom[0x100])->titleLong, sizeof(state->title))) { + LOAD_32LE(ucheck, 0, &state->versionMagic); + if (ucheck > GB_SAVESTATE_MAGIC + 2 || memcmp(state->title, ((struct GBCartridge*) gb->memory.rom)->titleLong, sizeof(state->title))) { + // There was a bug in previous versions where the memory address being compared was wrong + mLOG(GB_STATE, WARN, "Savestate is for a different game"); + error = true; + } } LOAD_32LE(ucheck, 0, &state->romCrc32); if (ucheck != gb->romCrc32) { From a714774a2598c043c3c4183ed2825fe8cbc1b748 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 19 Aug 2017 15:59:17 -0700 Subject: [PATCH 095/158] 3DS: Support debug libs --- src/platform/3ds/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/platform/3ds/CMakeLists.txt b/src/platform/3ds/CMakeLists.txt index be3722692..c0f2dd35f 100644 --- a/src/platform/3ds/CMakeLists.txt +++ b/src/platform/3ds/CMakeLists.txt @@ -13,7 +13,11 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format" PARENT_SCOPE) set(OS_DEFINES COLOR_16_BIT COLOR_5_6_5 IOAPI_NO_64) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -list(APPEND OS_LIB citro3d ctru) +if(${CMAKE_BUILD_TYPE} STREQUAL Debug OR ${CMAKE_BUILD_TYPE} STREQUAL RelWithDebInfo) + list(APPEND OS_LIB citro3dd ctrud) +else() + list(APPEND OS_LIB citro3d ctru) +endif() file(GLOB OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/3ds-*.c ${CMAKE_CURRENT_SOURCE_DIR}/ctru-heap.c ${CMAKE_CURRENT_SOURCE_DIR}/socket.c) set(OS_SRC ${OS_SRC} PARENT_SCOPE) set(OS_LIB ${OS_LIB} PARENT_SCOPE) From 323a6326cd9d9f90f08e4ebd2c5b2f84fcdbd533 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Aug 2017 23:08:35 -0700 Subject: [PATCH 096/158] OpenGL: Cleaner video output size changing --- src/gb/core.c | 2 +- src/platform/opengl/gl.c | 6 +++--- src/platform/opengl/gles2.c | 1 - src/platform/qt/CoreController.cpp | 12 ++++++------ src/platform/qt/DisplayGL.cpp | 2 +- src/platform/qt/DisplayQt.cpp | 6 +++--- src/platform/sdl/gl-sdl.c | 5 +++-- src/platform/sdl/gles2-sdl.c | 4 ++-- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/gb/core.c b/src/gb/core.c index 04a042e19..60e66f4fc 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -200,7 +200,7 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf static void _GBCoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) { struct GB* gb = core->board; - if (!gb || gb->model != GB_MODEL_SGB || !gb->video.sgbBorders) { + if (gb && (gb->model != GB_MODEL_SGB || !gb->video.sgbBorders)) { *width = GB_VIDEO_HORIZONTAL_PIXELS; *height = GB_VIDEO_VERTICAL_PIXELS; } else { diff --git a/src/platform/opengl/gl.c b/src/platform/opengl/gl.c index 9f259292e..87b679c6b 100644 --- a/src/platform/opengl/gl.c +++ b/src/platform/opengl/gl.c @@ -110,12 +110,12 @@ void mGLContextPostFrame(struct VideoBackend* v, const void* frame) { glBindTexture(GL_TEXTURE_2D, context->tex); #ifdef COLOR_16_BIT #ifdef COLOR_5_6_5 - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, toPow2(v->width), v->height, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, frame); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, v->width, v->height, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, frame); #else - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, toPow2(v->width), v->height, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frame); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, v->width, v->height, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, frame); #endif #else - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, toPow2(v->width), v->height, GL_RGBA, GL_UNSIGNED_BYTE, frame); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, v->width, v->height, GL_RGBA, GL_UNSIGNED_BYTE, frame); #endif } diff --git a/src/platform/opengl/gles2.c b/src/platform/opengl/gles2.c index f7db81a52..84343e35f 100644 --- a/src/platform/opengl/gles2.c +++ b/src/platform/opengl/gles2.c @@ -318,7 +318,6 @@ void mGLES2ContextDrawFrame(struct VideoBackend* v) { void mGLES2ContextPostFrame(struct VideoBackend* v, const void* frame) { struct mGLES2Context* context = (struct mGLES2Context*) v; glBindTexture(GL_TEXTURE_2D, context->tex); - glPixelStorei(GL_UNPACK_ROW_LENGTH, toPow2(v->width)); #ifdef COLOR_16_BIT #ifdef COLOR_5_6_5 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, v->width, v->height, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, frame); diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 1372c48f8..a639cdf46 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -40,8 +40,8 @@ CoreController::CoreController(mCore* core, QObject* parent) m_threadContext.userData = this; QSize size(256, 512); - m_buffers[0].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); - m_buffers[1].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); + m_buffers[0].resize(size.width() * size.height() * sizeof(color_t)); + m_buffers[1].resize(size.width() * size.height() * sizeof(color_t)); m_buffers[0].fill(0xFF); m_buffers[1].fill(0xFF); m_activeBuffer = &m_buffers[0]; @@ -86,13 +86,13 @@ CoreController::CoreController(mCore* core, QObject* parent) controller->m_resetActions.clear(); QSize size = controller->screenDimensions(); - controller->m_buffers[0].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); - controller->m_buffers[1].resize(toPow2(size.width()) * size.height() * sizeof(color_t)); + controller->m_buffers[0].resize(size.width() * size.height() * sizeof(color_t)); + controller->m_buffers[1].resize(size.width() * size.height() * sizeof(color_t)); controller->m_buffers[0].fill(0xFF); controller->m_buffers[1].fill(0xFF); controller->m_activeBuffer = &controller->m_buffers[0]; - context->core->setVideoBuffer(context->core, reinterpret_cast(controller->m_activeBuffer->data()), toPow2(size.width())); + context->core->setVideoBuffer(context->core, reinterpret_cast(controller->m_activeBuffer->data()), size.width()); controller->finishFrame(); }; @@ -736,7 +736,7 @@ void CoreController::finishFrame() { if (m_activeBuffer == m_completeBuffer) { m_activeBuffer = &m_buffers[1]; } - m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast(m_activeBuffer->data()), toPow2(screenDimensions().width())); + m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast(m_activeBuffer->data()), screenDimensions().width()); for (auto& action : m_frameActions) { action(); diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp index 113f859bd..fa2b4da47 100644 --- a/src/platform/qt/DisplayGL.cpp +++ b/src/platform/qt/DisplayGL.cpp @@ -391,7 +391,7 @@ void PainterGL::enqueue(const uint32_t* backing) { buffer = m_free.takeLast(); } QSize size = m_context->screenDimensions(); - memcpy(buffer, backing, toPow2(size.width()) * size.height() * BYTES_PER_PIXEL); + memcpy(buffer, backing, size.width() * size.height() * BYTES_PER_PIXEL); m_queue.enqueue(buffer); m_mutex.unlock(); } diff --git a/src/platform/qt/DisplayQt.cpp b/src/platform/qt/DisplayQt.cpp index 45ba297a9..bb321691c 100644 --- a/src/platform/qt/DisplayQt.cpp +++ b/src/platform/qt/DisplayQt.cpp @@ -57,12 +57,12 @@ void DisplayQt::framePosted() { } #ifdef COLOR_16_BIT #ifdef COLOR_5_6_5 - m_backing = QImage(reinterpret_cast(buffer), toPow2(m_width), m_height, QImage::Format_RGB16); + m_backing = QImage(reinterpret_cast(buffer), m_width, m_height, QImage::Format_RGB16); #else - m_backing = QImage(reinterpret_cast(buffer), toPow2(m_width), m_height, QImage::Format_RGB555); + m_backing = QImage(reinterpret_cast(buffer), m_width, m_height, QImage::Format_RGB555); #endif #else - m_backing = QImage(reinterpret_cast(buffer), toPow2(m_width), m_height, QImage::Format_ARGB32); + m_backing = QImage(reinterpret_cast(buffer), m_width, m_height, QImage::Format_ARGB32); m_backing = m_backing.convertToFormat(QImage::Format_RGB32); #endif } diff --git a/src/platform/sdl/gl-sdl.c b/src/platform/sdl/gl-sdl.c index 5504673d1..5ee7beccb 100644 --- a/src/platform/sdl/gl-sdl.c +++ b/src/platform/sdl/gl-sdl.c @@ -33,10 +33,10 @@ void mSDLGLCreate(struct mSDLRenderer* renderer) { bool mSDLGLInit(struct mSDLRenderer* renderer) { mSDLGLCommonInit(renderer); - size_t size = toPow2(renderer->width) * toPow2(renderer->height) * BYTES_PER_PIXEL; + size_t size = renderer->width * renderer->height * BYTES_PER_PIXEL; renderer->outputBuffer = malloc(size); memset(renderer->outputBuffer, 0, size); - renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, toPow2(renderer->width)); + renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, renderer->width); mGLContextCreate(&renderer->gl); renderer->gl.d.user = renderer; @@ -69,6 +69,7 @@ void mSDLGLRunloop(struct mSDLRenderer* renderer, void* user) { #endif } if (renderer->width != v->width || renderer->height != v->height) { + renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, renderer->width); v->setDimensions(v, renderer->width, renderer->height); } diff --git a/src/platform/sdl/gles2-sdl.c b/src/platform/sdl/gles2-sdl.c index 81daa0f90..05d49f9b8 100644 --- a/src/platform/sdl/gles2-sdl.c +++ b/src/platform/sdl/gles2-sdl.c @@ -98,14 +98,14 @@ bool mSDLGLES2Init(struct mSDLRenderer* renderer) { mSDLGLCommonInit(renderer); #endif - size_t size = toPow2(renderer->width) * toPow2(renderer->height) * BYTES_PER_PIXEL; + size_t size = renderer->width * renderer->height * BYTES_PER_PIXEL; #ifndef __APPLE__ renderer->outputBuffer = memalign(16, size); #else posix_memalign((void**) &renderer->outputBuffer, 16, size); #endif memset(renderer->outputBuffer, 0, size); - renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, toPow2(renderer->width)); + renderer->core->setVideoBuffer(renderer->core, renderer->outputBuffer, renderer->width); mGLES2ContextCreate(&renderer->gl2); renderer->gl2.d.user = renderer; From 448bc200c36c68a1250a2eb0394f5b90a2f75bed Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 26 Aug 2017 18:23:29 -0700 Subject: [PATCH 097/158] Util: Get rid of _to16Bit --- include/mgba-util/arm-algo.h | 4 +--- src/gba/renderers/video-software.c | 9 ++++----- src/util/arm-algo.S | 26 -------------------------- 3 files changed, 5 insertions(+), 34 deletions(-) diff --git a/include/mgba-util/arm-algo.h b/include/mgba-util/arm-algo.h index 1c603ab5b..2c80b78dc 100644 --- a/include/mgba-util/arm-algo.h +++ b/include/mgba-util/arm-algo.h @@ -7,12 +7,10 @@ #define ARM_ALGO_H #ifdef __arm__ -void _to16Bit(uint16_t* dest, uint32_t* src, size_t words); - #if defined(__ARM_NEON) void _neon2x(void* dest, void* src, int width, int height); void _neon4x(void* dest, void* src, int width, int height); #endif #endif -#endif \ No newline at end of file +#endif diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 2ae1cf838..ab1552500 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -641,13 +641,12 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render } #ifdef COLOR_16_BIT -#if defined(__ARM_NEON) && !defined(__APPLE__) - _to16Bit(row, softwareRenderer->row, VIDEO_HORIZONTAL_PIXELS); -#else - for (x = 0; x < VIDEO_HORIZONTAL_PIXELS; ++x) { + for (x = 0; x < VIDEO_HORIZONTAL_PIXELS; x += 4) { row[x] = softwareRenderer->row[x]; + row[x + 1] = softwareRenderer->row[x + 1]; + row[x + 2] = softwareRenderer->row[x + 2]; + row[x + 3] = softwareRenderer->row[x + 3]; } -#endif #else memcpy(row, softwareRenderer->row, VIDEO_HORIZONTAL_PIXELS * sizeof(*row)); #endif diff --git a/src/util/arm-algo.S b/src/util/arm-algo.S index 084ab39f9..5f6714ba1 100644 --- a/src/util/arm-algo.S +++ b/src/util/arm-algo.S @@ -4,32 +4,6 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #if defined(__ARM_NEON) && !defined(PSP2) -# r0: Destination -# r1: Source -# r2: Number of words to copy as halfwords -.global _to16Bit -_to16Bit: -push {r4-r10} -mov r8, r0 -mov r9, r1 -mov r10, r2 -.L0: -tst r10, #15 -beq .L1 -ldr r0, [r9], #4 -strh r0, [r8], #2 -sub r10, #1 -b .L0 -.L1: -vld4.16 {d0, d1, d2, d3}, [r9]! -vld4.16 {d4, d5, d6, d7}, [r9]! -vst2.16 {d0, d2}, [r8]! -vst2.16 {d4, d6}, [r8]! -subs r10, #16 -bne .L1 -pop {r4-r10} -bx lr - # r0: Destination # r1: Source # r2: Width From a14126c9775379eb52f8b9c1add0ca96781f2f05 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 27 Aug 2017 23:39:16 -0700 Subject: [PATCH 098/158] 3DS: Transition to using RenderTarget --- src/platform/3ds/ctr-gpu.c | 15 ++++--- src/platform/3ds/main.c | 90 ++++++++++++++++++++++++-------------- 2 files changed, 65 insertions(+), 40 deletions(-) diff --git a/src/platform/3ds/ctr-gpu.c b/src/platform/3ds/ctr-gpu.c index 4f446e649..fe61c0566 100644 --- a/src/platform/3ds/ctr-gpu.c +++ b/src/platform/3ds/ctr-gpu.c @@ -27,11 +27,13 @@ struct ctrUIVertex { }; #define MAX_NUM_QUADS 256 -#define VERTEX_BUFFER_SIZE MAX_NUM_QUADS * sizeof(struct ctrUIVertex) +#define BUFFER_PARTITIONS 4 +#define VERTEX_BUFFER_SIZE MAX_NUM_QUADS * BUFFER_PARTITIONS * sizeof(struct ctrUIVertex) static struct ctrUIVertex* ctrVertexBuffer = NULL; static int ctrNumVerts = 0; static int ctrVertStart = 0; +static int ctrVertPartition = 0; static C3D_Tex* activeTexture = NULL; @@ -174,9 +176,11 @@ void ctrAddRectEx(u32 color, s16 x, s16 y, s16 w, s16 h, s16 u, s16 v, s16 uw, s if (ctrNumVerts + ctrVertStart == MAX_NUM_QUADS) { ctrFlushBatch(); - C3D_Flush(); - ctrNumVerts = 0; - ctrVertStart = 0; + ++ctrVertPartition; + if (ctrVertPartition == BUFFER_PARTITIONS) { + svcBreak(USERBREAK_PANIC); + } + ctrVertStart = ctrVertPartition * MAX_NUM_QUADS; } struct ctrUIVertex* vtx = &ctrVertexBuffer[ctrVertStart + ctrNumVerts]; @@ -217,7 +221,6 @@ void ctrFlushBatch(void) { void ctrFinalize(void) { ctrFlushBatch(); - C3D_Flush(); - ctrNumVerts = 0; ctrVertStart = 0; + ctrVertPartition = 0; } diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index 400147022..2892ade35 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -92,10 +92,14 @@ static C3D_Tex outputTexture; static ndspWaveBuf dspBuffer[DSP_BUFFERS]; static int bufferId = 0; static bool frameLimiter = true; +static unsigned frameCounter; -static C3D_RenderBuf bottomScreen; -static C3D_RenderBuf topScreen; -static C3D_RenderBuf upscaleBuffer; +static C3D_RenderTarget* topScreen[2]; +static C3D_RenderTarget* bottomScreen[2]; +static int doubleBuffer = 0; + +static C3D_RenderTarget* upscaleBuffer; +static C3D_Tex upscaleBufferTex; static aptHookCookie cookie; @@ -106,10 +110,24 @@ static bool _initGpu(void) { return false; } - if (!C3D_RenderBufInit(&topScreen, 240, 400, GPU_RB_RGB8, 0) || !C3D_RenderBufInit(&bottomScreen, 240, 320, GPU_RB_RGB8, 0) || !C3D_RenderBufInit(&upscaleBuffer, 512, 512, GPU_RB_RGB8, 0)) { + topScreen[0] = C3D_RenderTargetCreate(240, 400, GPU_RB_RGB8, 0); + topScreen[1] = C3D_RenderTargetCreate(240, 400, GPU_RB_RGB8, 0); + bottomScreen[0] = C3D_RenderTargetCreate(240, 320, GPU_RB_RGB8, 0); + bottomScreen[1] = C3D_RenderTargetCreate(240, 320, GPU_RB_RGB8, 0); + if (!topScreen[0] || !topScreen[1] || !bottomScreen[0] || !bottomScreen[1]) { return false; } + if (!C3D_TexInitVRAM(&upscaleBufferTex, 512, 512, GPU_RB_RGB8)) { + return false; + } + upscaleBuffer = C3D_RenderTargetCreateFromTex(&upscaleBufferTex, GPU_TEXFACE_2D, 0, 0); + if (!upscaleBuffer) { + return false; + } + + C3D_RenderTargetSetClear(upscaleBuffer, C3D_CLEAR_COLOR, 0, 0); + return ctrInitGpu(); } @@ -120,9 +138,13 @@ static void _cleanup(void) { linearFree(outputBuffer); } - C3D_RenderBufDelete(&topScreen); - C3D_RenderBufDelete(&bottomScreen); - C3D_RenderBufDelete(&upscaleBuffer); + C3D_RenderTargetDelete(topScreen[0]); + C3D_RenderTargetDelete(topScreen[1]); + C3D_RenderTargetDelete(bottomScreen[0]); + C3D_RenderTargetDelete(bottomScreen[1]); + C3D_RenderTargetDelete(upscaleBuffer); + C3D_TexDelete(&upscaleBufferTex); + C3D_TexDelete(&outputTexture); C3D_Fini(); gfxExit(); @@ -204,18 +226,23 @@ static void _csndPlaySound(u32 flags, u32 sampleRate, float vol, void* left, voi static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* right); static void _drawStart(void) { - C3D_RenderBufClear(&bottomScreen); - C3D_RenderBufClear(&topScreen); + C3D_FrameBegin(frameLimiter ? 0 : C3D_FRAME_NONBLOCK); + frameCounter = C3D_FrameCounter(0); } static void _drawEnd(void) { ctrFinalize(); - C3D_RenderBufTransfer(&topScreen, (u32*) gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8)); - C3D_RenderBufTransfer(&bottomScreen, (u32*) gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL), GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8)); - gfxSwapBuffersGpu(); + C3D_RenderTargetSetOutput(topScreen[doubleBuffer], GFX_TOP, GFX_LEFT, GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8)); + C3D_RenderTargetSetOutput(bottomScreen[doubleBuffer], GFX_BOTTOM, GFX_LEFT, GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8)); + C3D_FrameEnd(GX_CMDLIST_FLUSH); if (frameLimiter) { - gspWaitForEvent(GSPGPU_EVENT_VBlank0, false); + while (frameCounter == C3D_FrameCounter(0)) { + gspWaitForAnyEvent(); + } } + doubleBuffer ^= 1; + C3D_FrameBufClear(&bottomScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); + C3D_FrameBufClear(&topScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); } static int _batteryState(void) { @@ -234,12 +261,7 @@ static int _batteryState(void) { } static void _guiPrepare(void) { - int screen = screenMode < SM_PA_TOP ? GFX_BOTTOM : GFX_TOP; - if (screen == GFX_BOTTOM) { - return; - } - - C3D_RenderBufBind(&bottomScreen); + C3D_FrameDrawOn(bottomScreen[doubleBuffer]); ctrSetViewportSize(320, 240, true); } @@ -296,9 +318,9 @@ static void _setup(struct mGUIRunner* runner) { if (mCoreConfigGetUIntValue(&runner->config, "filterMode", &mode) && mode < FM_MAX) { filterMode = mode; if (filterMode == FM_NEAREST) { - C3D_TexSetFilter(&upscaleBuffer.colorBuf, GPU_NEAREST, GPU_NEAREST); + C3D_TexSetFilter(&upscaleBufferTex, GPU_NEAREST, GPU_NEAREST); } else { - C3D_TexSetFilter(&upscaleBuffer.colorBuf, GPU_LINEAR, GPU_LINEAR); + C3D_TexSetFilter(&upscaleBufferTex, GPU_LINEAR, GPU_LINEAR); } } if (mCoreConfigGetUIntValue(&runner->config, "darkenMode", &mode) && mode < DM_MAX) { @@ -355,9 +377,9 @@ static void _gameLoaded(struct mGUIRunner* runner) { if (mCoreConfigGetUIntValue(&runner->config, "filterMode", &mode) && mode < FM_MAX) { filterMode = mode; if (filterMode == FM_NEAREST) { - C3D_TexSetFilter(&upscaleBuffer.colorBuf, GPU_NEAREST, GPU_NEAREST); + C3D_TexSetFilter(&upscaleBufferTex, GPU_NEAREST, GPU_NEAREST); } else { - C3D_TexSetFilter(&upscaleBuffer.colorBuf, GPU_LINEAR, GPU_LINEAR); + C3D_TexSetFilter(&upscaleBufferTex, GPU_LINEAR, GPU_LINEAR); } } if (mCoreConfigGetUIntValue(&runner->config, "darkenMode", &mode) && mode < DM_MAX) { @@ -423,19 +445,19 @@ static void _drawTex(struct mCore* core, bool faded) { unsigned screen_w, screen_h; switch (screenMode) { case SM_PA_BOTTOM: - C3D_RenderBufBind(&bottomScreen); + C3D_FrameDrawOn(bottomScreen[doubleBuffer]); screen_w = 320; screen_h = 240; break; case SM_PA_TOP: - C3D_RenderBufBind(&topScreen); + C3D_FrameDrawOn(topScreen[doubleBuffer]); screen_w = 400; screen_h = 240; break; default: - C3D_RenderBufBind(&upscaleBuffer); - screen_w = upscaleBuffer.colorBuf.width; - screen_h = upscaleBuffer.colorBuf.height; + C3D_FrameDrawOn(upscaleBuffer); + screen_w = 512; + screen_h = 512; break; } @@ -524,10 +546,10 @@ static void _drawTex(struct mCore* core, bool faded) { coreh = h; screen_h = 240; if (screenMode < SM_PA_TOP) { - C3D_RenderBufBind(&bottomScreen); + C3D_FrameDrawOn(bottomScreen[doubleBuffer]); screen_w = 320; } else { - C3D_RenderBufBind(&topScreen); + C3D_FrameDrawOn(topScreen[doubleBuffer]); screen_w = 400; } ctrSetViewportSize(screen_w, screen_h, true); @@ -556,7 +578,7 @@ static void _drawTex(struct mCore* core, bool faded) { x = (screen_w - w) / 2; y = (screen_h - h) / 2; - ctrActivateTexture(&upscaleBuffer.colorBuf); + ctrActivateTexture(&upscaleBufferTex); ctrAddRectEx(0xFFFFFFFF, x, y, w, h, 0, 0, corew, coreh, 0); ctrFlushBatch(); } @@ -623,8 +645,8 @@ static void _incrementScreenMode(struct mGUIRunner* runner) { screenMode = (screenMode + 1) % SM_MAX; mCoreConfigSetUIntValue(&runner->config, "screenMode", screenMode); - C3D_RenderBufClear(&bottomScreen); - C3D_RenderBufClear(&topScreen); + C3D_FrameBufClear(&bottomScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); + C3D_FrameBufClear(&topScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); } static void _setFrameLimiter(struct mGUIRunner* runner, bool limit) { @@ -845,7 +867,7 @@ int main() { } C3D_TexSetWrap(&outputTexture, GPU_CLAMP_TO_EDGE, GPU_CLAMP_TO_EDGE); C3D_TexSetFilter(&outputTexture, GPU_NEAREST, GPU_NEAREST); - C3D_TexSetFilter(&upscaleBuffer.colorBuf, GPU_LINEAR, GPU_LINEAR); + C3D_TexSetFilter(&upscaleBufferTex, GPU_LINEAR, GPU_LINEAR); void* outputTextureEnd = (u8*)outputTexture.data + 256 * 256 * 2; // Zero texture data to make sure no garbage around the border interferes with filtering From 41f27bf617daa6daeb13f9fba97fdeac1761bee1 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 29 Aug 2017 21:33:26 -0700 Subject: [PATCH 099/158] 3DS: Minor fixes for GPU issues, detect usable cores better --- src/platform/3ds/main.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index 2892ade35..7912ca8b0 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -227,7 +227,9 @@ static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* rig static void _drawStart(void) { C3D_FrameBegin(frameLimiter ? 0 : C3D_FRAME_NONBLOCK); - frameCounter = C3D_FrameCounter(0); + // Mark both buffers used to make sure they get cleared + C3D_FrameDrawOn(topScreen[doubleBuffer]); + C3D_FrameDrawOn(bottomScreen[doubleBuffer]); } static void _drawEnd(void) { @@ -284,9 +286,8 @@ static void _resetCamera(struct m3DSImageSource* imageSource) { } static void _setup(struct mGUIRunner* runner) { - bool isNew3DS = false; - APT_CheckNew3DS(&isNew3DS); - if (isNew3DS && !envIsHomebrew()) { + uint8_t mask; + if (R_SUCCEEDED(svcGetProcessAffinityMask(&mask, CUR_PROCESS_HANDLE, 4)) && mask >= 4) { mCoreConfigSetDefaultIntValue(&runner->config, "threadedVideo", 1); mCoreLoadForeignConfig(runner->core, &runner->config); } @@ -441,6 +442,11 @@ static void _gameUnloaded(struct mGUIRunner* runner) { } } +static void _storeCounter(struct mGUIRunner* runner) { + UNUSED(runner); + frameCounter = C3D_FrameCounter(0); +} + static void _drawTex(struct mCore* core, bool faded) { unsigned screen_w, screen_h; switch (screenMode) { @@ -989,7 +995,7 @@ int main() { .teardown = 0, .gameLoaded = _gameLoaded, .gameUnloaded = _gameUnloaded, - .prepareForFrame = 0, + .prepareForFrame = _storeCounter, .drawFrame = _drawFrame, .drawScreenshot = _drawScreenshot, .paused = _gameUnloaded, From 10b14f90d136881c6cf94d67cd809b767a8bde88 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 2 Sep 2017 15:05:14 -0700 Subject: [PATCH 100/158] 3DS: Improve graphics pipeline, framelimiting --- src/platform/3ds/ctr-gpu.c | 59 +++++++++++++++++++------------------- src/platform/3ds/ctr-gpu.h | 5 ++-- src/platform/3ds/main.c | 46 ++++++++++++++++++++--------- 3 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/platform/3ds/ctr-gpu.c b/src/platform/3ds/ctr-gpu.c index fe61c0566..02810e221 100644 --- a/src/platform/3ds/ctr-gpu.c +++ b/src/platform/3ds/ctr-gpu.c @@ -26,23 +26,21 @@ struct ctrUIVertex { float rotate[2]; }; -#define MAX_NUM_QUADS 256 -#define BUFFER_PARTITIONS 4 -#define VERTEX_BUFFER_SIZE MAX_NUM_QUADS * BUFFER_PARTITIONS * sizeof(struct ctrUIVertex) +#define MAX_NUM_QUADS 4096 +#define VERTEX_BUFFER_SIZE MAX_NUM_QUADS * sizeof(struct ctrUIVertex) static struct ctrUIVertex* ctrVertexBuffer = NULL; static int ctrNumVerts = 0; static int ctrVertStart = 0; -static int ctrVertPartition = 0; -static C3D_Tex* activeTexture = NULL; +static const C3D_Tex* activeTexture = NULL; static shaderProgram_s uiProgram; static DVLB_s* uiShader = NULL; static int GSH_FVEC_projectionMtx; static int GSH_FVEC_textureMtx; -bool ctrInitGpu() { +bool ctrInitGpu(void) { // Load vertex shader binary uiShader = DVLB_ParseFile((u32*) uishader, uishader_size); if (uiShader == NULL) { @@ -85,7 +83,7 @@ bool ctrInitGpu() { return true; } -void ctrDeinitGpu() { +void ctrDeinitGpu(void) { if (ctrVertexBuffer) { linearFree(ctrVertexBuffer); ctrVertexBuffer = NULL; @@ -110,10 +108,23 @@ void ctrSetViewportSize(s16 w, s16 h, bool tilt) { C3D_FVUnifMtx4x4(GPU_GEOMETRY_SHADER, GSH_FVEC_projectionMtx, &projectionMtx); } -void ctrActivateTexture(C3D_Tex* texture) { +void ctrFlushBatch(void) { + int thisBatch = ctrNumVerts - ctrVertStart; + if (!thisBatch) { + return; + } + if (thisBatch < 0) { + svcBreak(USERBREAK_PANIC); + } + C3D_DrawArrays(GPU_GEOMETRY_PRIM, ctrVertStart, thisBatch); + ctrVertStart = ctrNumVerts; +} + +void ctrActivateTexture(const C3D_Tex* texture) { if (texture == activeTexture) { return; } + if (activeTexture) { ctrFlushBatch(); } @@ -174,16 +185,11 @@ void ctrAddRectEx(u32 color, s16 x, s16 y, s16 w, s16 h, s16 u, s16 v, s16 uw, s return; } - if (ctrNumVerts + ctrVertStart == MAX_NUM_QUADS) { - ctrFlushBatch(); - ++ctrVertPartition; - if (ctrVertPartition == BUFFER_PARTITIONS) { - svcBreak(USERBREAK_PANIC); - } - ctrVertStart = ctrVertPartition * MAX_NUM_QUADS; + if (ctrNumVerts == MAX_NUM_QUADS) { + abort(); } - struct ctrUIVertex* vtx = &ctrVertexBuffer[ctrVertStart + ctrNumVerts]; + struct ctrUIVertex* vtx = &ctrVertexBuffer[ctrNumVerts]; vtx->x = x; vtx->y = y; vtx->w = w; @@ -203,24 +209,17 @@ void ctrAddRect(u32 color, s16 x, s16 y, s16 u, s16 v, s16 w, s16 h) { ctrAddRectEx(color, x, y, w, h, u, v, w, h, 0); } -void ctrFlushBatch(void) { - if (ctrNumVerts == 0) { - return; - } +void ctrStartFrame(void) { + ctrNumVerts = 0; + ctrVertStart = 0; + activeTexture = NULL; C3D_BufInfo* bufInfo = C3D_GetBufInfo(); BufInfo_Init(bufInfo); - BufInfo_Add(bufInfo, &ctrVertexBuffer[ctrVertStart], sizeof(struct ctrUIVertex), 4, 0x3210); - - GSPGPU_FlushDataCache(&ctrVertexBuffer[ctrVertStart], sizeof(struct ctrUIVertex) * ctrNumVerts); - C3D_DrawArrays(GPU_GEOMETRY_PRIM, 0, ctrNumVerts); - - ctrVertStart += ctrNumVerts; - ctrNumVerts = 0; + BufInfo_Add(bufInfo, ctrVertexBuffer, sizeof(struct ctrUIVertex), 4, 0x3210); } -void ctrFinalize(void) { +void ctrEndFrame(void) { ctrFlushBatch(); - ctrVertStart = 0; - ctrVertPartition = 0; + GSPGPU_FlushDataCache(ctrVertexBuffer, sizeof(struct ctrUIVertex) * ctrNumVerts); } diff --git a/src/platform/3ds/ctr-gpu.h b/src/platform/3ds/ctr-gpu.h index e4d30965f..b271636f9 100644 --- a/src/platform/3ds/ctr-gpu.h +++ b/src/platform/3ds/ctr-gpu.h @@ -16,12 +16,13 @@ void ctrDeinitGpu(void); void ctrSetViewportSize(s16 w, s16 h, bool tilt); -void ctrActivateTexture(C3D_Tex* texture); +void ctrActivateTexture(const C3D_Tex* texture); void ctrTextureMultiply(void); void ctrTextureBias(u32 color); void ctrAddRectEx(u32 color, s16 x, s16 y, s16 w, s16 h, s16 u, s16 v, s16 uw, s16 vh, float rotate); void ctrAddRect(u32 color, s16 x, s16 y, s16 u, s16 v, s16 w, s16 h); void ctrFlushBatch(void); -void ctrFinalize(void); +void ctrStartFrame(void); +void ctrEndFrame(void); #endif diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index 7912ca8b0..3377b3be9 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -92,11 +92,12 @@ static C3D_Tex outputTexture; static ndspWaveBuf dspBuffer[DSP_BUFFERS]; static int bufferId = 0; static bool frameLimiter = true; -static unsigned frameCounter; +static u64 tickCounter; static C3D_RenderTarget* topScreen[2]; static C3D_RenderTarget* bottomScreen[2]; static int doubleBuffer = 0; +static bool frameStarted = false; static C3D_RenderTarget* upscaleBuffer; static C3D_Tex upscaleBufferTex; @@ -226,22 +227,38 @@ static void _csndPlaySound(u32 flags, u32 sampleRate, float vol, void* left, voi static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* right); static void _drawStart(void) { - C3D_FrameBegin(frameLimiter ? 0 : C3D_FRAME_NONBLOCK); +} + +static void _frameStart(void) { + if (frameStarted) { + return; + } + frameStarted = true; + u8 flags = 0; + if (!frameLimiter) { + if (tickCounter + 4481000 > svcGetSystemTick()) { + flags = C3D_FRAME_NONBLOCK; + } else { + tickCounter = svcGetSystemTick(); + } + } + C3D_FrameBegin(flags); // Mark both buffers used to make sure they get cleared C3D_FrameDrawOn(topScreen[doubleBuffer]); C3D_FrameDrawOn(bottomScreen[doubleBuffer]); + ctrStartFrame(); } static void _drawEnd(void) { - ctrFinalize(); + if (!frameStarted) { + return; + } + ctrEndFrame(); C3D_RenderTargetSetOutput(topScreen[doubleBuffer], GFX_TOP, GFX_LEFT, GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8)); C3D_RenderTargetSetOutput(bottomScreen[doubleBuffer], GFX_BOTTOM, GFX_LEFT, GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8)); C3D_FrameEnd(GX_CMDLIST_FLUSH); - if (frameLimiter) { - while (frameCounter == C3D_FrameCounter(0)) { - gspWaitForAnyEvent(); - } - } + frameStarted = false; + doubleBuffer ^= 1; C3D_FrameBufClear(&bottomScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); C3D_FrameBufClear(&topScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); @@ -263,6 +280,7 @@ static int _batteryState(void) { } static void _guiPrepare(void) { + _frameStart(); C3D_FrameDrawOn(bottomScreen[doubleBuffer]); ctrSetViewportSize(320, 240, true); } @@ -442,12 +460,8 @@ static void _gameUnloaded(struct mGUIRunner* runner) { } } -static void _storeCounter(struct mGUIRunner* runner) { - UNUSED(runner); - frameCounter = C3D_FrameCounter(0); -} - static void _drawTex(struct mCore* core, bool faded) { + _frameStart(); unsigned screen_w, screen_h; switch (screenMode) { case SM_PA_BOTTOM: @@ -657,7 +671,11 @@ static void _incrementScreenMode(struct mGUIRunner* runner) { static void _setFrameLimiter(struct mGUIRunner* runner, bool limit) { UNUSED(runner); + if (frameLimiter == limit) { + return; + } frameLimiter = limit; + tickCounter = svcGetSystemTick(); } static uint32_t _pollInput(const struct mInputMap* map) { @@ -995,7 +1013,7 @@ int main() { .teardown = 0, .gameLoaded = _gameLoaded, .gameUnloaded = _gameUnloaded, - .prepareForFrame = _storeCounter, + .prepareForFrame = 0, .drawFrame = _drawFrame, .drawScreenshot = _drawScreenshot, .paused = _gameUnloaded, From 48a6bd47ceff7be7152cce427b91fde2f257e0af Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 3 Sep 2017 22:15:48 -0700 Subject: [PATCH 101/158] GB, GBA: Fix sync to video with frameskip --- CHANGES | 1 + src/gb/video.c | 2 +- src/gba/video.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index c32a6ac37..94bb4a027 100644 --- a/CHANGES +++ b/CHANGES @@ -34,6 +34,7 @@ Bugfixes: - GB Memory: Fix HDMA count starting in mode 0 (fixes mgba.io/i/855) - GB Memory: Actually load latch time from savestate - GB Serialize: Fix game title check + - GB, GBA: Fix sync to video with frameskip Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/video.c b/src/gb/video.c index 5810be63e..f98a6c77b 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -338,10 +338,10 @@ void _updateFrameCount(struct mTiming* timing, void* context, uint32_t cyclesLat } GBFrameEnded(video->p); + mCoreSyncPostFrame(video->p->sync); --video->frameskipCounter; if (video->frameskipCounter < 0) { video->renderer->finishFrame(video->renderer); - mCoreSyncPostFrame(video->p->sync); video->frameskipCounter = video->frameskip; } ++video->frameCounter; diff --git a/src/gba/video.c b/src/gba/video.c index db0614342..87af353d1 100644 --- a/src/gba/video.c +++ b/src/gba/video.c @@ -157,9 +157,9 @@ void _startHdraw(struct mTiming* timing, void* context, uint32_t cyclesLate) { GBARaiseIRQ(video->p, IRQ_VBLANK); } GBAFrameEnded(video->p); + mCoreSyncPostFrame(video->p->sync); --video->frameskipCounter; if (video->frameskipCounter < 0) { - mCoreSyncPostFrame(video->p->sync); video->frameskipCounter = video->frameskip; } ++video->frameCounter; From 0a221d038a36e9207554998d71f96c4456916af4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 4 Sep 2017 11:35:18 -0700 Subject: [PATCH 102/158] Python: Improve dependencies --- src/platform/python/CMakeLists.txt | 5 +++-- src/platform/sdl/CMakeLists.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index 3bbeb6a83..a2c1a3568 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -20,9 +20,11 @@ if(NOT GIT_TAG) endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py) -add_custom_command(OUTPUT lib.c +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lib.c COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/lib.c DEPENDS ${PYTHON_HEADERS} + DEPENDS ${BINARY_NAME} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/lib.c PROPERTIES GENERATED ON) @@ -31,7 +33,6 @@ file(GLOB PYTHON_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.c) add_library(${BINARY_NAME}-pylib STATIC ${CMAKE_CURRENT_BINARY_DIR}/lib.c ${PYTHON_SRC}) set_target_properties(${BINARY_NAME}-pylib PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_BINARY_DIR};${INCLUDE_DIRECTORIES}") set_target_properties(${BINARY_NAME}-pylib PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") -set(PYTHON_LIBRARY ${BINARY_NAME}-pylib PARENT_SCOPE) add_custom_target(${BINARY_NAME}-py ALL COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py egg_info -e ${CMAKE_CURRENT_BINARY_DIR} ${PYLIB_VERSION} diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index f700062a5..8633a4fb2 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -88,7 +88,7 @@ endif() if(ENABLE_SCRIPTING) if(BUILD_PYTHON) - list(APPEND PLATFORM_LIBRARY "${PYTHON_LIBRARY}") + list(APPEND PLATFORM_LIBRARY ${BINARY_NAME}-pylib) endif() endif() From 3ae911b829a3700338918842224fa90b71e11655 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 5 Sep 2017 23:00:20 -0700 Subject: [PATCH 103/158] GB Audio: Fix NRx2 writes while active (fixes #866) --- CHANGES | 1 + src/gb/audio.c | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 94bb4a027..bca70f25e 100644 --- a/CHANGES +++ b/CHANGES @@ -35,6 +35,7 @@ Bugfixes: - GB Memory: Actually load latch time from savestate - GB Serialize: Fix game title check - GB, GBA: Fix sync to video with frameskip + - GB Audio: Fix NRx2 writes while active (fixes mgba.io/i/866) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/audio.c b/src/gb/audio.c index 106e64a54..4a465a10e 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -25,7 +25,7 @@ const int GB_AUDIO_VOLUME_MAX = 0x100; static bool _writeSweep(struct GBAudioSweep* sweep, uint8_t value); static void _writeDuty(struct GBAudioEnvelope* envelope, uint8_t value); -static bool _writeEnvelope(struct GBAudioEnvelope* envelope, uint8_t value); +static bool _writeEnvelope(struct GBAudioEnvelope* envelope, uint8_t value, enum GBAudioStyle style); static void _resetSweep(struct GBAudioSweep* sweep); static bool _resetEnvelope(struct GBAudioEnvelope* sweep); @@ -182,7 +182,7 @@ void GBAudioWriteNR11(struct GBAudio* audio, uint8_t value) { } void GBAudioWriteNR12(struct GBAudio* audio, uint8_t value) { - if (!_writeEnvelope(&audio->ch1.envelope, value)) { + if (!_writeEnvelope(&audio->ch1.envelope, value, audio->style)) { mTimingDeschedule(audio->timing, &audio->ch1Event); audio->playingCh1 = false; *audio->nr52 &= ~0x0001; @@ -240,7 +240,7 @@ void GBAudioWriteNR21(struct GBAudio* audio, uint8_t value) { } void GBAudioWriteNR22(struct GBAudio* audio, uint8_t value) { - if (!_writeEnvelope(&audio->ch2.envelope, value)) { + if (!_writeEnvelope(&audio->ch2.envelope, value, audio->style)) { mTimingDeschedule(audio->timing, &audio->ch2Event); audio->playingCh2 = false; *audio->nr52 &= ~0x0002; @@ -358,7 +358,7 @@ void GBAudioWriteNR41(struct GBAudio* audio, uint8_t value) { } void GBAudioWriteNR42(struct GBAudio* audio, uint8_t value) { - if (!_writeEnvelope(&audio->ch4.envelope, value)) { + if (!_writeEnvelope(&audio->ch4.envelope, value, audio->style)) { mTimingDeschedule(audio->timing, &audio->ch4Event); audio->playingCh4 = false; *audio->nr52 &= ~0x0008; @@ -700,17 +700,16 @@ void _writeDuty(struct GBAudioEnvelope* envelope, uint8_t value) { envelope->duty = GBAudioRegisterDutyGetDuty(value); } -bool _writeEnvelope(struct GBAudioEnvelope* envelope, uint8_t value) { +bool _writeEnvelope(struct GBAudioEnvelope* envelope, uint8_t value, enum GBAudioStyle style) { envelope->stepTime = GBAudioRegisterSweepGetStepTime(value); envelope->direction = GBAudioRegisterSweepGetDirection(value); envelope->initialVolume = GBAudioRegisterSweepGetInitialVolume(value); - if (!envelope->stepTime) { + if (style == GB_AUDIO_DMG && !envelope->stepTime) { // TODO: Improve "zombie" mode ++envelope->currentVolume; envelope->currentVolume &= 0xF; } _updateEnvelopeDead(envelope); - envelope->nextStep = envelope->stepTime; return (envelope->initialVolume || envelope->direction) && envelope->dead != 2; } From 10a5432df72a68bf178163954e2dafdc92f7a742 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 7 Sep 2017 21:38:59 -0700 Subject: [PATCH 104/158] Libretro: Clean up old logging code --- src/platform/libretro/libretro.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index 934fca788..cf3d55757 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #ifdef M_CORE_GB #include @@ -582,7 +583,12 @@ void GBARetroLog(struct mLogger* logger, int category, enum mLogLevel level, con break; } #ifdef NDEBUG - if (category == _mLOG_CAT_GBA_BIOS()) { + static int biosCat = -1; + if (biosCat < 0) { + biosCat = mLogCategoryById("gba.bios"); + } + + if (category == biosCat) { return; } #endif From 13d3e1dfecb6393c0f3f23e22b2e9e88afe4911a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 7 Sep 2017 21:52:51 -0700 Subject: [PATCH 105/158] Qt: Fix paths getting truncated at first . (fixes #867) --- src/platform/qt/CoreManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/qt/CoreManager.cpp b/src/platform/qt/CoreManager.cpp index e69f0ee27..8720391a4 100644 --- a/src/platform/qt/CoreManager.cpp +++ b/src/platform/qt/CoreManager.cpp @@ -99,10 +99,10 @@ CoreController* CoreManager::loadGame(VFile* vf, const QString& path, const QStr core->loadROM(core, vf); } - QFileInfo info(base + "/" + path); - QByteArray bytes(info.baseName().toUtf8()); - strncpy(core->dirs.baseName, bytes.constData(), sizeof(core->dirs.baseName)); + QByteArray bytes(path.toUtf8()); + separatePath(bytes.constData(), nullptr, core->dirs.baseName, nullptr); + QFileInfo info(base + "/" + path); bytes = info.dir().canonicalPath().toUtf8(); mDirectorySetAttachBase(&core->dirs, VDirOpen(bytes.constData())); mCoreAutoloadSave(core); From b750c76d02af94646309a700c86c04faf6707b7d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 7 Sep 2017 22:05:11 -0700 Subject: [PATCH 106/158] GB Core: Fix SGB border option breaking if changed while running --- src/gb/core.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/gb/core.c b/src/gb/core.c index 60e66f4fc..8fe75a084 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -186,11 +186,7 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf mCoreConfigCopyValue(&core->config, config, "gb.model"); mCoreConfigCopyValue(&core->config, config, "sgb.model"); mCoreConfigCopyValue(&core->config, config, "cgb.model"); - - int fakeBool; - if (mCoreConfigGetIntValue(config, "sgb.borders", &fakeBool)) { - gb->video.sgbBorders = fakeBool; - } + mCoreConfigCopyValue(&core->config, config, "sgb.borders"); #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 struct GBCore* gbcore = (struct GBCore*) core; @@ -349,6 +345,11 @@ static void _GBCoreReset(struct mCore* core) { } } + int fakeBool; + if (mCoreConfigGetIntValue(&core->config, "sgb.borders", &fakeBool)) { + gb->video.sgbBorders = fakeBool; + } + #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 if (!gb->biosVf && core->opts.useBios) { struct VFile* bios = NULL; From 076ec733fd4f8f220027bcea001f8d6367915a4a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 7 Sep 2017 22:05:39 -0700 Subject: [PATCH 107/158] Qt: Fix default-true checkboxes --- src/platform/qt/SettingsView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index cc1d1f643..0a587371a 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -533,7 +533,7 @@ void SettingsView::saveSetting(const char* key, const QVariant& field) { void SettingsView::loadSetting(const char* key, QAbstractButton* field, bool defaultVal) { QString option = loadSetting(key); - field->setChecked((!option.isNull() && option != "0") || defaultVal); + field->setChecked(option.isNull() ? defaultVal : option != "0"); } void SettingsView::loadSetting(const char* key, QComboBox* field) { From bd4dd8de5ca3cd2c62c778c26114f685be6ac729 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 9 Sep 2017 10:51:40 -0700 Subject: [PATCH 108/158] Util: Don't build crc32 if the function already exists --- CHANGES | 1 + CMakeLists.txt | 8 ++++++++ include/mgba-util/crc32.h | 7 ++++++- src/util/crc32.c | 12 ++++++++---- src/util/patch-ups.c | 8 ++++---- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index bca70f25e..31feb2cd9 100644 --- a/CHANGES +++ b/CHANGES @@ -45,6 +45,7 @@ Misc: - SDL: Fix 2.0.5 build on macOS under some circumstances - Test: Restructure test suite into multiple executables - Python: Integrate tests from cinema test suite + - Util: Don't build crc32 if the function already exists 0.6.0: (2017-07-16) Features: diff --git a/CMakeLists.txt b/CMakeLists.txt index 527dacdac..cc87c268d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -500,6 +500,14 @@ if(USE_ZLIB) include_directories(AFTER ${ZLIB_INCLUDE_DIRS}) list(APPEND DEPENDENCY_LIB ${ZLIB_LIBRARIES}) set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},zlib1g") + set(HAVE_CRC32 ON) +else() + # zlib pulls in crc32 + check_function_exists(crc32 HAVE_CRC32) +endif() + +if(HAVE_CRC32) + list(APPEND FUNCTION_DEFINES HAVE_CRC32) endif() if(WANT_PNG AND USE_ZLIB AND NOT USE_PNG) diff --git a/include/mgba-util/crc32.h b/include/mgba-util/crc32.h index 225998bb9..ba5e694fd 100644 --- a/include/mgba-util/crc32.h +++ b/include/mgba-util/crc32.h @@ -12,8 +12,13 @@ CXX_GUARD_START struct VFile; +#ifndef HAVE_CRC32 +uint32_t crc32(uint32_t crc, const void* buf, size_t size); +#else +#include +#endif + uint32_t doCrc32(const void* buf, size_t size); -uint32_t updateCrc32(uint32_t crc, const void* buf, size_t size); uint32_t fileCrc32(struct VFile* file, size_t endOffset); CXX_GUARD_END diff --git a/src/util/crc32.c b/src/util/crc32.c index 21a4354d4..24f611111 100644 --- a/src/util/crc32.c +++ b/src/util/crc32.c @@ -48,6 +48,7 @@ enum { BUFFER_SIZE = 1024 }; +#ifndef HAVE_CRC32 static uint32_t crc32Table[] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, @@ -93,12 +94,14 @@ static uint32_t crc32Table[] = { 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; +#endif uint32_t doCrc32(const void* buf, size_t size) { - return updateCrc32(0, buf, size); + return crc32(0, buf, size); } -uint32_t updateCrc32(uint32_t crc, const void* buf, size_t size) { +#ifndef HAVE_CRC32 +uint32_t crc32(uint32_t crc, const void* buf, size_t size) { const uint8_t* p = buf; crc = ~crc; @@ -108,9 +111,10 @@ uint32_t updateCrc32(uint32_t crc, const void* buf, size_t size) { return ~crc; } +#endif uint32_t fileCrc32(struct VFile* vf, size_t endOffset) { - char buffer[BUFFER_SIZE]; + uint8_t buffer[BUFFER_SIZE]; size_t blocksize; size_t alreadyRead = 0; if (vf->seek(vf, 0, SEEK_SET) < 0) { @@ -124,7 +128,7 @@ uint32_t fileCrc32(struct VFile* vf, size_t endOffset) { } blocksize = vf->read(vf, buffer, toRead); alreadyRead += blocksize; - crc = updateCrc32(crc, buffer, blocksize); + crc = crc32(crc, buffer, blocksize); if (blocksize < toRead) { return 0; } diff --git a/src/util/patch-ups.c b/src/util/patch-ups.c index 5f24311ef..ea1d531eb 100644 --- a/src/util/patch-ups.c +++ b/src/util/patch-ups.c @@ -154,7 +154,7 @@ bool _BPSApplyPatch(struct Patch* patch, const void* in, size_t inSize, void* ou case 0x0: // SourceRead memmove(&writeBuffer[writeLocation], &readBuffer[writeLocation], length); - outputChecksum = updateCrc32(outputChecksum, &writeBuffer[writeLocation], length); + outputChecksum = crc32(outputChecksum, &writeBuffer[writeLocation], length); writeLocation += length; break; case 0x1: @@ -162,7 +162,7 @@ bool _BPSApplyPatch(struct Patch* patch, const void* in, size_t inSize, void* ou if (patch->vf->read(patch->vf, &writeBuffer[writeLocation], length) != (ssize_t) length) { return false; } - outputChecksum = updateCrc32(outputChecksum, &writeBuffer[writeLocation], length); + outputChecksum = crc32(outputChecksum, &writeBuffer[writeLocation], length); writeLocation += length; break; case 0x2: @@ -177,7 +177,7 @@ bool _BPSApplyPatch(struct Patch* patch, const void* in, size_t inSize, void* ou return false; } memmove(&writeBuffer[writeLocation], &readBuffer[readSourceLocation], length); - outputChecksum = updateCrc32(outputChecksum, &writeBuffer[writeLocation], length); + outputChecksum = crc32(outputChecksum, &writeBuffer[writeLocation], length); writeLocation += length; readSourceLocation += length; break; @@ -198,7 +198,7 @@ bool _BPSApplyPatch(struct Patch* patch, const void* in, size_t inSize, void* ou ++writeLocation; ++readTargetLocation; } - outputChecksum = updateCrc32(outputChecksum, &writeBuffer[writeLocation - length], length); + outputChecksum = crc32(outputChecksum, &writeBuffer[writeLocation - length], length); break; } } From ca4d53f014d925207a278b8d70d843f3fd970192 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 9 Sep 2017 11:22:14 -0700 Subject: [PATCH 109/158] =?UTF-8?q?GBA:=20Detect=20hardware=20for=20Pok?= =?UTF-8?q?=C3=A9mon=20FireRed=20ROM=20hacks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES | 1 + include/mgba/internal/gba/overrides.h | 2 +- src/gba/core.c | 9 +-------- src/gba/overrides.c | 18 +++++++++++++----- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/CHANGES b/CHANGES index 31feb2cd9..337672eec 100644 --- a/CHANGES +++ b/CHANGES @@ -46,6 +46,7 @@ Misc: - Test: Restructure test suite into multiple executables - Python: Integrate tests from cinema test suite - Util: Don't build crc32 if the function already exists + - GBA: Detect hardware for Pokémon FireRed ROM hacks 0.6.0: (2017-07-16) Features: diff --git a/include/mgba/internal/gba/overrides.h b/include/mgba/internal/gba/overrides.h index 4240fea2e..c20e1f8e1 100644 --- a/include/mgba/internal/gba/overrides.h +++ b/include/mgba/internal/gba/overrides.h @@ -28,7 +28,7 @@ void GBAOverrideSave(struct Configuration*, const struct GBACartridgeOverride* o struct GBA; void GBAOverrideApply(struct GBA*, const struct GBACartridgeOverride*); -void GBAOverrideApplyDefaults(struct GBA*); +void GBAOverrideApplyDefaults(struct GBA*, const struct Configuration*); CXX_GUARD_END diff --git a/src/gba/core.c b/src/gba/core.c index 1940d6418..766d0b67a 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -395,14 +395,7 @@ static void _GBACoreReset(struct mCore* core) { GBAVideoAssociateRenderer(&gba->video, renderer); } - struct GBACartridgeOverride override; - const struct GBACartridge* cart = (const struct GBACartridge*) gba->memory.rom; - if (cart) { - memcpy(override.id, &cart->id, sizeof(override.id)); - if (GBAOverrideFind(gbacore->overrides, &override)) { - GBAOverrideApply(gba, &override); - } - } + GBAOverrideApplyDefaults(gba, gbacore->overrides); #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 if (!gba->biosVf && core->opts.useBios) { diff --git a/src/gba/overrides.c b/src/gba/overrides.c index 787690945..915d220e3 100644 --- a/src/gba/overrides.c +++ b/src/gba/overrides.c @@ -338,11 +338,19 @@ void GBAOverrideApply(struct GBA* gba, const struct GBACartridgeOverride* overri } } -void GBAOverrideApplyDefaults(struct GBA* gba) { - struct GBACartridgeOverride override; +void GBAOverrideApplyDefaults(struct GBA* gba, const struct Configuration* overrides) { + struct GBACartridgeOverride override = { .idleLoop = IDLE_LOOP_NONE }; const struct GBACartridge* cart = (const struct GBACartridge*) gba->memory.rom; - memcpy(override.id, &cart->id, sizeof(override.id)); - if (GBAOverrideFind(0, &override)) { - GBAOverrideApply(gba, &override); + if (cart) { + memcpy(override.id, &cart->id, sizeof(override.id)); + + if (!strncmp("pokemon red version", &((const char*) gba->memory.rom)[0x108], 20) && gba->romCrc32 != 0xDD88761C) { + // Enable FLASH1M and RTC on Pokémon FireRed ROM hacks + override.savetype = SAVEDATA_FLASH1M; + override.hardware = HW_RTC; + GBAOverrideApply(gba, &override); + } else if (GBAOverrideFind(overrides, &override)) { + GBAOverrideApply(gba, &override); + } } } From 2d558338bfa00802fb62e746a022185c812ac35b Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 10 Sep 2017 13:13:49 -0700 Subject: [PATCH 110/158] Qt: Copy framebuffers to avoid issues with frameskip (fixes #862) --- src/platform/qt/CoreController.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index a639cdf46..bcdca745e 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -736,6 +736,8 @@ void CoreController::finishFrame() { if (m_activeBuffer == m_completeBuffer) { m_activeBuffer = &m_buffers[1]; } + // Copy contents to avoid issues when doing frameskip + *m_activeBuffer = *m_completeBuffer; m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast(m_activeBuffer->data()), screenDimensions().width()); for (auto& action : m_frameActions) { From 486b7abc9460e985996d93e9cfc25c2e88d10aad Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 11 Sep 2017 00:41:02 -0700 Subject: [PATCH 111/158] GBA BIOS: Use core's VRAM variable instead of renderer's --- CHANGES | 1 + src/gba/bios.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 337672eec..1cb8cf29f 100644 --- a/CHANGES +++ b/CHANGES @@ -36,6 +36,7 @@ Bugfixes: - GB Serialize: Fix game title check - GB, GBA: Fix sync to video with frameskip - GB Audio: Fix NRx2 writes while active (fixes mgba.io/i/866) + - GBA BIOS: Use core's VRAM variable instead of renderer's Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gba/bios.c b/src/gba/bios.c index ae3b23ed2..65014898e 100644 --- a/src/gba/bios.c +++ b/src/gba/bios.c @@ -61,7 +61,7 @@ static void _RegisterRamReset(struct GBA* gba) { memset(gba->video.palette, 0, SIZE_PALETTE_RAM); } if (registers & 0x08) { - memset(gba->video.renderer->vram, 0, SIZE_VRAM); + memset(gba->video.vram, 0, SIZE_VRAM); } if (registers & 0x10) { memset(gba->video.oam.raw, 0, SIZE_OAM); From 7fc91b1ae6c3e2f80358d39c05d5fc0b3797140d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 16 Sep 2017 10:00:09 -0700 Subject: [PATCH 112/158] CMake: Fix CPack dependencies for libpng 1.6 --- CHANGES | 1 + CMakeLists.txt | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 1cb8cf29f..24b235351 100644 --- a/CHANGES +++ b/CHANGES @@ -48,6 +48,7 @@ Misc: - Python: Integrate tests from cinema test suite - Util: Don't build crc32 if the function already exists - GBA: Detect hardware for Pokémon FireRed ROM hacks + - CMake: Fix CPack dependencies for libpng 1.6 0.6.0: (2017-07-16) Features: diff --git a/CMakeLists.txt b/CMakeLists.txt index cc87c268d..22ad4989c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,7 @@ function(find_feature FEATURE_NAME FEATURE_REQUIRES) set(${UREQUIRE}_CFLAGS_OTHER ${${REQUIRE}_CFLAGS_OTHER} PARENT_SCOPE) set(${UREQUIRE}_FOUND ${${REQUIRE}_FOUND} PARENT_SCOPE) set(${UREQUIRE}_INCLUDE_DIRS ${${REQUIRE}_INCLUDE_DIRS} PARENT_SCOPE) + set(${UREQUIRE}_VERSION_STRING ${${REQUIRE}_VERSION_STRING} PARENT_SCOPE) if (APPLE) set(IS_FRAMEWORK OFF) set(LIBS) @@ -526,7 +527,15 @@ if(USE_PNG) list(APPEND FEATURES PNG) include_directories(AFTER ${PNG_INCLUDE_DIRS}) list(APPEND DEPENDENCY_LIB ${PNG_LIBRARIES} ${ZLIB_LIBRARIES}) - set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libpng12-0") + if(PNG_VERSION_STRING) + string(REGEX MATCH "^[0-9]+\\.[0-9]+" PNG_VERSION_PARTIAL ${PNG_VERSION_STRING}) + if(${PNG_VERSION_PARTIAL} STREQUAL "1.6") + set(PNG_DEB_VERSION "16-16") + else() + set(PNG_DEB_VERSION "12-0") + endif() + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libpng${PNG_DEB_VERSION}") + endif() endif() if(WANT_SQLITE3 AND NOT USE_SQLITE3) From d582cf7d36a2f1f99b45ba6bc919ea431e08342b Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 15:01:13 -0700 Subject: [PATCH 113/158] GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes #877) --- CHANGES | 1 + include/mgba/internal/gba/memory.h | 3 ++- src/gba/savedata.c | 30 ++++++++++++++++++++++++------ src/platform/libretro/libretro.c | 11 ++--------- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index 24b235351..483d559f3 100644 --- a/CHANGES +++ b/CHANGES @@ -37,6 +37,7 @@ Bugfixes: - GB, GBA: Fix sync to video with frameskip - GB Audio: Fix NRx2 writes while active (fixes mgba.io/i/866) - GBA BIOS: Use core's VRAM variable instead of renderer's + - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/include/mgba/internal/gba/memory.h b/include/mgba/internal/gba/memory.h index 1e5c89890..165d956d0 100644 --- a/include/mgba/internal/gba/memory.h +++ b/include/mgba/internal/gba/memory.h @@ -67,7 +67,8 @@ enum { SIZE_CART_SRAM = 0x00010000, SIZE_CART_FLASH512 = 0x00010000, SIZE_CART_FLASH1M = 0x00020000, - SIZE_CART_EEPROM = 0x00002000 + SIZE_CART_EEPROM = 0x00002000, + SIZE_CART_EEPROM512 = 0x00000200 }; enum { diff --git a/src/gba/savedata.c b/src/gba/savedata.c index 08eab40aa..3008b9428 100644 --- a/src/gba/savedata.c +++ b/src/gba/savedata.c @@ -147,7 +147,7 @@ size_t GBASavedataSize(struct GBASavedata* savedata) { case SAVEDATA_FLASH1M: return SIZE_CART_FLASH1M; case SAVEDATA_EEPROM: - return SIZE_CART_EEPROM; + return (savedata->vf && savedata->vf->size(savedata->vf) == SIZE_CART_EEPROM512) ? SIZE_CART_EEPROM512 : SIZE_CART_EEPROM; case SAVEDATA_FORCE_NONE: return 0; case SAVEDATA_AUTODETECT: @@ -257,20 +257,23 @@ void GBASavedataInitEEPROM(struct GBASavedata* savedata, bool realisticTiming) { mLOG(GBA_SAVE, WARN, "Can't re-initialize savedata"); return; } + int32_t eepromSize = SIZE_CART_EEPROM512; off_t end; if (!savedata->vf) { end = 0; savedata->data = anonymousMemoryMap(SIZE_CART_EEPROM); } else { end = savedata->vf->size(savedata->vf); - if (end < SIZE_CART_EEPROM) { - savedata->vf->truncate(savedata->vf, SIZE_CART_EEPROM); + if (end < SIZE_CART_EEPROM512) { + savedata->vf->truncate(savedata->vf, SIZE_CART_EEPROM512); + } else if (end > SIZE_CART_EEPROM512) { + eepromSize = SIZE_CART_EEPROM; } - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_EEPROM, savedata->mapMode); + savedata->data = savedata->vf->map(savedata->vf, eepromSize, savedata->mapMode); } savedata->realisticTiming = realisticTiming; - if (end < SIZE_CART_EEPROM) { - memset(&savedata->data[end], 0xFF, SIZE_CART_EEPROM - end); + if (end < SIZE_CART_EEPROM512) { + memset(&savedata->data[end], 0xFF, SIZE_CART_EEPROM512 - end); } } @@ -405,6 +408,19 @@ void GBASavedataWriteFlash(struct GBASavedata* savedata, uint16_t address, uint8 } } +static void _ensureEeprom(struct GBASavedata* savedata, uint32_t size) { + if (size < SIZE_CART_EEPROM512) { + return; + } + if (!savedata->vf || savedata->vf->size(savedata->vf) > SIZE_CART_EEPROM512) { + return; + } + savedata->vf->unmap(savedata->vf, savedata->data, SIZE_CART_EEPROM512); + savedata->vf->truncate(savedata->vf, SIZE_CART_EEPROM); + savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_EEPROM, savedata->mapMode); + memset(&savedata->data[SIZE_CART_EEPROM512], 0xFF, SIZE_CART_EEPROM - SIZE_CART_EEPROM512); +} + void GBASavedataWriteEEPROM(struct GBASavedata* savedata, uint16_t value, uint32_t writeSize) { switch (savedata->command) { // Read header @@ -430,6 +446,7 @@ void GBASavedataWriteEEPROM(struct GBASavedata* savedata, uint16_t value, uint32 } else if (writeSize == 1) { savedata->command = EEPROM_COMMAND_NULL; } else if ((savedata->writeAddress >> 3) < SIZE_CART_EEPROM) { + _ensureEeprom(savedata, savedata->writeAddress >> 3); uint8_t current = savedata->data[savedata->writeAddress >> 3]; current &= ~(1 << (0x7 - (savedata->writeAddress & 0x7))); current |= (value & 0x1) << (0x7 - (savedata->writeAddress & 0x7)); @@ -471,6 +488,7 @@ uint16_t GBASavedataReadEEPROM(struct GBASavedata* savedata) { if (savedata->readBitsRemaining < 64) { int step = 63 - savedata->readBitsRemaining; uint32_t address = (savedata->readAddress + step) >> 3; + _ensureEeprom(savedata, address); if (address >= SIZE_CART_EEPROM) { mLOG(GBA_SAVE, GAME_ERROR, "Reading beyond end of EEPROM: %08X", address); return 0xFF; diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index cf3d55757..3fca547bc 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -528,16 +528,9 @@ size_t retro_get_memory_size(unsigned id) { if (core->platform(core) == PLATFORM_GBA) { switch (((struct GBA*) core->board)->memory.savedata.type) { case SAVEDATA_AUTODETECT: - case SAVEDATA_FLASH1M: return SIZE_CART_FLASH1M; - case SAVEDATA_FLASH512: - return SIZE_CART_FLASH512; - case SAVEDATA_EEPROM: - return SIZE_CART_EEPROM; - case SAVEDATA_SRAM: - return SIZE_CART_SRAM; - case SAVEDATA_FORCE_NONE: - return 0; + default: + return GBASavedataSize(&((struct GBA*) core->board)->memory.savedata); } } #endif From 8d1b41f6952d561165fc7033239f4a99e00ec594 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 16:44:05 -0700 Subject: [PATCH 114/158] SDL: Fix potential race condition when pressing keys (fixes #872) --- CHANGES | 1 + src/platform/sdl/sdl-events.c | 32 ++++++++++++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 483d559f3..df0252200 100644 --- a/CHANGES +++ b/CHANGES @@ -38,6 +38,7 @@ Bugfixes: - GB Audio: Fix NRx2 writes while active (fixes mgba.io/i/866) - GBA BIOS: Use core's VRAM variable instead of renderer's - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) + - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c index 3eff5ec18..32f6aff52 100644 --- a/src/platform/sdl/sdl-events.c +++ b/src/platform/sdl/sdl-events.c @@ -411,11 +411,13 @@ static void _mSDLHandleKeypress(struct mCoreThread* context, struct mSDLPlayer* key = mInputMapKey(sdlContext->bindings, SDL_BINDING_KEY, event->keysym.sym); } if (key != -1) { + mCoreThreadInterrupt(context); if (event->type == SDL_KEYDOWN) { context->core->addKeys(context->core, 1 << key); } else { context->core->clearKeys(context->core, 1 << key); } + mCoreThreadContinue(context); return; } if (event->keysym.sym == SDLK_TAB) { @@ -516,21 +518,23 @@ static void _mSDLHandleKeypress(struct mCoreThread* context, struct mSDLPlayer* } } -static void _mSDLHandleJoyButton(struct mCore* core, struct mSDLPlayer* sdlContext, const struct SDL_JoyButtonEvent* event) { +static void _mSDLHandleJoyButton(struct mCoreThread* context, struct mSDLPlayer* sdlContext, const struct SDL_JoyButtonEvent* event) { int key = 0; key = mInputMapKey(sdlContext->bindings, SDL_BINDING_BUTTON, event->button); if (key == -1) { return; } + mCoreThreadInterrupt(context); if (event->type == SDL_JOYBUTTONDOWN) { - core->addKeys(core, 1 << key); + context->core->addKeys(context->core, 1 << key); } else { - core->clearKeys(core, 1 << key); + context->core->clearKeys(context->core, 1 << key); } + mCoreThreadContinue(context); } -static void _mSDLHandleJoyHat(struct mCore* core, struct mSDLPlayer* sdlContext, const struct SDL_JoyHatEvent* event) { +static void _mSDLHandleJoyHat(struct mCoreThread* context, struct mSDLPlayer* sdlContext, const struct SDL_JoyHatEvent* event) { int allKeys = mInputMapHat(sdlContext->bindings, SDL_BINDING_BUTTON, event->hat, -1); if (allKeys == 0) { return; @@ -538,11 +542,13 @@ static void _mSDLHandleJoyHat(struct mCore* core, struct mSDLPlayer* sdlContext, int keys = mInputMapHat(sdlContext->bindings, SDL_BINDING_BUTTON, event->hat, event->value); - core->clearKeys(core, allKeys ^ keys); - core->addKeys(core, keys); + mCoreThreadInterrupt(context); + context->core->clearKeys(context->core, allKeys ^ keys); + context->core->addKeys(context->core, keys); + mCoreThreadContinue(context); } -static void _mSDLHandleJoyAxis(struct mCore* core, struct mSDLPlayer* sdlContext, const struct SDL_JoyAxisEvent* event) { +static void _mSDLHandleJoyAxis(struct mCoreThread* context, struct mSDLPlayer* sdlContext, const struct SDL_JoyAxisEvent* event) { int clearKeys = ~mInputClearAxis(sdlContext->bindings, SDL_BINDING_BUTTON, event->axis, -1); int newKeys = 0; int key = mInputMapAxis(sdlContext->bindings, SDL_BINDING_BUTTON, event->axis, event->value); @@ -550,8 +556,10 @@ static void _mSDLHandleJoyAxis(struct mCore* core, struct mSDLPlayer* sdlContext newKeys |= 1 << key; } clearKeys &= ~newKeys; - core->clearKeys(core, clearKeys); - core->addKeys(core, newKeys); + mCoreThreadInterrupt(context); + context->core->clearKeys(context->core, clearKeys); + context->core->addKeys(context->core, newKeys); + mCoreThreadContinue(context); } @@ -581,13 +589,13 @@ void mSDLHandleEvent(struct mCoreThread* context, struct mSDLPlayer* sdlContext, break; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: - _mSDLHandleJoyButton(context->core, sdlContext, &event->jbutton); + _mSDLHandleJoyButton(context, sdlContext, &event->jbutton); break; case SDL_JOYHATMOTION: - _mSDLHandleJoyHat(context->core, sdlContext, &event->jhat); + _mSDLHandleJoyHat(context, sdlContext, &event->jhat); break; case SDL_JOYAXISMOTION: - _mSDLHandleJoyAxis(context->core, sdlContext, &event->jaxis); + _mSDLHandleJoyAxis(context, sdlContext, &event->jaxis); break; } } From 1bc6c13e6bbf341953530f49ec2bc9ce3428bca5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 16:46:10 -0700 Subject: [PATCH 115/158] GBA: Fix keypad IRQs not firing when extra buttons are pressed --- CHANGES | 1 + src/gba/core.c | 1 - src/gba/gba.c | 6 ++---- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index df0252200..7cbcf633f 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,7 @@ Bugfixes: - GBA BIOS: Use core's VRAM variable instead of renderer's - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) + - GBA: Fix keypad IRQs not firing when extra buttons are pressed Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gba/core.c b/src/gba/core.c index 766d0b67a..aa7cdaeea 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -491,7 +491,6 @@ static void _GBACoreAddKeys(struct mCore* core, uint32_t keys) { static void _GBACoreClearKeys(struct mCore* core, uint32_t keys) { struct GBACore* gbacore = (struct GBACore*) core; gbacore->keys &= ~keys; - GBATestKeypadIRQ(core->board); } static int32_t _GBACoreFrameCounter(const struct mCore* core) { diff --git a/src/gba/gba.c b/src/gba/gba.c index 836e0dede..9073c5233 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -755,19 +755,17 @@ void GBATestKeypadIRQ(struct GBA* gba) { return; } int isAnd = keycnt & 0x8000; - uint16_t keyInput; - if (!gba->keySource) { // TODO? return; } keycnt &= 0x3FF; - keyInput = *gba->keySource; + uint16_t keyInput = *gba->keySource & keycnt; if (isAnd && keycnt == keyInput) { GBARaiseIRQ(gba, IRQ_KEYPAD); - } else if (!isAnd && keycnt & keyInput) { + } else if (!isAnd && keyInput) { GBARaiseIRQ(gba, IRQ_KEYPAD); } } From f1d6470fdbdf9ee90d99a319e2193ed048789ccc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 20 Sep 2017 00:52:31 -0700 Subject: [PATCH 116/158] GBA Video: Remove broken sprite blending hack (fixes #532) --- CHANGES | 1 + src/gba/renderers/software-obj.c | 3 +++ src/platform/python/tests/cinema/.gitignore | 1 + .../gba/blend/gs-obj-modes/baseline_0000.png | Bin 0 -> 18178 bytes .../gba/blend/gs-obj-modes/baseline_0001.png | Bin 0 -> 18838 bytes .../gba/blend/gs-obj-modes/baseline_0002.png | Bin 0 -> 18620 bytes .../gba/blend/gs-obj-modes/baseline_0003.png | Bin 0 -> 18665 bytes .../gba/blend/gs-obj-modes/baseline_0004.png | Bin 0 -> 18672 bytes .../gba/blend/gs-obj-modes/baseline_0005.png | Bin 0 -> 18872 bytes .../cinema/gba/blend/gs-obj-modes/test.mvl | Bin 0 -> 148110 bytes .../gba/blend/kam-knockout/baseline_0000.png | Bin 0 -> 507 bytes .../gba/blend/kam-knockout/baseline_0001.png | Bin 0 -> 20045 bytes .../gba/blend/kam-knockout/baseline_0002.png | Bin 0 -> 20028 bytes .../gba/blend/kam-knockout/baseline_0003.png | Bin 0 -> 24407 bytes .../cinema/gba/blend/kam-knockout/test.mvl | Bin 0 -> 61452 bytes 15 files changed, 5 insertions(+) create mode 100644 src/platform/python/tests/cinema/.gitignore create mode 100644 src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0004.png create mode 100644 src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0005.png create mode 100644 src/platform/python/tests/cinema/gba/blend/gs-obj-modes/test.mvl create mode 100644 src/platform/python/tests/cinema/gba/blend/kam-knockout/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gba/blend/kam-knockout/baseline_0001.png create mode 100644 src/platform/python/tests/cinema/gba/blend/kam-knockout/baseline_0002.png create mode 100644 src/platform/python/tests/cinema/gba/blend/kam-knockout/baseline_0003.png create mode 100644 src/platform/python/tests/cinema/gba/blend/kam-knockout/test.mvl diff --git a/CHANGES b/CHANGES index 7cbcf633f..a56e068ef 100644 --- a/CHANGES +++ b/CHANGES @@ -40,6 +40,7 @@ Bugfixes: - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) - GBA: Fix keypad IRQs not firing when extra buttons are pressed + - GBA Video: Remove broken sprite blending hack (fixes mgba.io/i/532) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gba/renderers/software-obj.c b/src/gba/renderers/software-obj.c index 71a409f04..3fb7836a3 100644 --- a/src/gba/renderers/software-obj.c +++ b/src/gba/renderers/software-obj.c @@ -167,8 +167,11 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re target2 |= renderer->bg[3].target2 << (renderer->bg[3].priority); if ((1 << GBAObjAttributesCGetPriority(sprite->c)) <= target2) { variant = 0; + } else { + flags &= ~FLAG_TARGET_1; } } + color_t* palette = &renderer->normalPalette[0x100]; color_t* objwinPalette = palette; int objwinSlowPath = GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt) && GBAWindowControlGetBlendEnable(renderer->objwin.packed) != GBAWindowControlIsBlendEnable(renderer->currentWindow.packed); diff --git a/src/platform/python/tests/cinema/.gitignore b/src/platform/python/tests/cinema/.gitignore new file mode 100644 index 000000000..ba0080f32 --- /dev/null +++ b/src/platform/python/tests/cinema/.gitignore @@ -0,0 +1 @@ +*.sav diff --git a/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0000.png b/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..aea1b760811d824ab554953593eeffad34e952b9 GIT binary patch literal 18178 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0001.png b/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..b26facdffe55f1474896140ea0ee38ff093013a4 GIT binary patch literal 18838 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0002.png b/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd68a9b9e2bfa6147ac6c4b397712d9ece53cb0 GIT binary patch literal 18620 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 M07*qoM6N<$f;YQdhyVZp literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0004.png b/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0004.png new file mode 100644 index 0000000000000000000000000000000000000000..0f05e6295d3b22bf8665e158bf5c859a0f365305 GIT binary patch literal 18672 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 TV*1-`00000NkvXXu0mjfr42lF literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0005.png b/src/platform/python/tests/cinema/gba/blend/gs-obj-modes/baseline_0005.png new file mode 100644 index 0000000000000000000000000000000000000000..3007a98c9228fd2ccdc592f4f8fa409ea9292921 GIT binary patch literal 18872 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 q-Z_K6PBDfWv4 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/kam-knockout/baseline_0002.png b/src/platform/python/tests/cinema/gba/blend/kam-knockout/baseline_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..429d6a22eee9742d3a2716f6b29e2dd30e9132c3 GIT binary patch literal 20028 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 z%0D0j=JLKP8YC?K&?s$TGHT3)Dx>m|88;)oZDw;p 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 H|GNG^V(jM? literal 0 HcmV?d00001 From 4ee338e5210dbe61f511e23ccc1f83109e691c7c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 20 Sep 2017 18:06:28 -0700 Subject: [PATCH 117/158] GBA Video: Fix previous commit --- CHANGES | 2 +- src/gba/renderers/software-obj.c | 3 ++- src/gba/renderers/software-private.h | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index a56e068ef..964b2cb3d 100644 --- a/CHANGES +++ b/CHANGES @@ -40,7 +40,7 @@ Bugfixes: - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) - GBA: Fix keypad IRQs not firing when extra buttons are pressed - - GBA Video: Remove broken sprite blending hack (fixes mgba.io/i/532) + - GBA Video: Fix broken sprite blending hack (fixes mgba.io/i/532) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gba/renderers/software-obj.c b/src/gba/renderers/software-obj.c index 3fb7836a3..6c2bb4287 100644 --- a/src/gba/renderers/software-obj.c +++ b/src/gba/renderers/software-obj.c @@ -166,8 +166,9 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re target2 |= renderer->bg[2].target2 << (renderer->bg[2].priority); target2 |= renderer->bg[3].target2 << (renderer->bg[3].priority); if ((1 << GBAObjAttributesCGetPriority(sprite->c)) <= target2) { + flags |= FLAG_REBLEND; variant = 0; - } else { + } else if (!target2) { flags &= ~FLAG_TARGET_1; } } diff --git a/src/gba/renderers/software-private.h b/src/gba/renderers/software-private.h index 582af7329..1a530abe5 100644 --- a/src/gba/renderers/software-private.h +++ b/src/gba/renderers/software-private.h @@ -43,7 +43,7 @@ static inline void _compositeBlendObjwin(struct GBAVideoSoftwareRenderer* render if (current & FLAG_TARGET_1 && color & FLAG_TARGET_2) { color = _mix(renderer->blda, current, renderer->bldb, color); } else { - color = (current & 0x00FFFFFF) | ((current << 1) & FLAG_REBLEND); + color = (current & 0x00FFFFFF) | (current & FLAG_REBLEND); } } else { color = (color & ~FLAG_TARGET_2) | (current & FLAG_OBJWIN); @@ -59,7 +59,7 @@ static inline void _compositeBlendNoObjwin(struct GBAVideoSoftwareRenderer* rend if (current & FLAG_TARGET_1 && color & FLAG_TARGET_2) { color = _mix(renderer->blda, current, renderer->bldb, color); } else { - color = (current & 0x00FFFFFF) | ((current << 1) & FLAG_REBLEND); + color = (current & 0x00FFFFFF) | (current & FLAG_REBLEND); } } else { color = color & ~FLAG_TARGET_2; @@ -73,7 +73,7 @@ static inline void _compositeNoBlendObjwin(struct GBAVideoSoftwareRenderer* rend if (color < current) { color |= (current & FLAG_OBJWIN); } else { - color = (current & 0x00FFFFFF) | ((current << 1) & FLAG_REBLEND); + color = (current & 0x00FFFFFF) | (current & FLAG_REBLEND); } *pixel = color; } @@ -82,7 +82,7 @@ static inline void _compositeNoBlendNoObjwin(struct GBAVideoSoftwareRenderer* re uint32_t current) { UNUSED(renderer); if (color >= current) { - color = (current & 0x00FFFFFF) | ((current << 1) & FLAG_REBLEND); + color = (current & 0x00FFFFFF) | (current & FLAG_REBLEND); } *pixel = color; } From d5bf63caa832e6daed785b00f690d58f5f5fef5a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 20 Sep 2017 18:51:29 -0700 Subject: [PATCH 118/158] GBA I/O: Fix reading from a few invalid I/O registers (fixes #876) --- CHANGES | 1 + src/gba/io.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 964b2cb3d..bd635a244 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,7 @@ Bugfixes: - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) - GBA: Fix keypad IRQs not firing when extra buttons are pressed - GBA Video: Fix broken sprite blending hack (fixes mgba.io/i/532) + - GBA I/O: Fix reading from a few invalid I/O registers (fixes mgba.io/i/876) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gba/io.c b/src/gba/io.c index 60d1a7c83..5cc1fe57c 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -890,14 +890,17 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) { break; case REG_MAX: // Some bad interrupt libraries will read from this - break; - case 0x66: - case 0x6E: - case 0x76: - case 0x7A: - case 0x7E: - case 0x86: - case 0x8A: + case 0x066: + case 0x06E: + case 0x076: + case 0x07A: + case 0x07E: + case 0x086: + case 0x08A: + case 0x136: + case 0x142: + case 0x15A: + case 0x206: mLOG(GBA_IO, GAME_ERROR, "Read from unused I/O register: %03X", address); return 0; case REG_DEBUG_ENABLE: From 92f18fbf3e940e9f9fa02cbe911310d6dfeef704 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 20 Sep 2017 22:17:55 -0700 Subject: [PATCH 119/158] Qt: Fix regression with overrides applying out of order --- src/platform/qt/CoreController.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index bcdca745e..7c4b837f0 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -61,11 +61,6 @@ CoreController::CoreController(mCore* core, QObject* parent) break; } - if (controller->m_override) { - controller->m_override->identify(context->core); - controller->m_override->apply(context->core); - } - if (controller->m_multiplayer) { controller->m_multiplayer->attachGame(controller); } @@ -79,6 +74,11 @@ CoreController::CoreController(mCore* core, QObject* parent) action(); } + if (controller->m_override) { + controller->m_override->identify(context->core); + controller->m_override->apply(context->core); + } + if (mCoreLoadState(context->core, 0, controller->m_loadStateFlags)) { mCoreDeleteState(context->core, 0); } From 8a5183df0b927429ac42cc2a4a141c2f7d56202a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 20 Sep 2017 22:39:45 -0700 Subject: [PATCH 120/158] Qt: Allow overrides to be saved before a game is loaded --- CHANGES | 1 + src/platform/qt/OverrideView.cpp | 18 +++++++++++++----- src/platform/qt/OverrideView.h | 1 + 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index bd635a244..9684ad736 100644 --- a/CHANGES +++ b/CHANGES @@ -54,6 +54,7 @@ Misc: - Util: Don't build crc32 if the function already exists - GBA: Detect hardware for Pokémon FireRed ROM hacks - CMake: Fix CPack dependencies for libpng 1.6 + - Qt: Allow overrides to be saved before a game is loaded 0.6.0: (2017-07-16) Features: diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index fed38926d..940d46077 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -85,7 +85,6 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &OverrideView::saveOverride); connect(m_ui.buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close); - m_ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false); } void OverrideView::setController(std::shared_ptr controller) { @@ -96,10 +95,16 @@ void OverrideView::setController(std::shared_ptr controller) { } void OverrideView::saveOverride() { - if (!m_config || !m_controller) { + if (!m_controller) { + m_savePending = true; return; } - m_config->saveOverride(*m_controller->override()); + + Override* override = m_controller->override(); + if (!override) { + return; + } + m_config->saveOverride(*override); } void OverrideView::updateOverrides() { @@ -176,7 +181,6 @@ void OverrideView::gameStarted() { mCoreThread* thread = m_controller->thread(); m_ui.tabWidget->setEnabled(false); - m_ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(true); switch (thread->core->platform(thread->core)) { #ifdef M_CORE_GBA @@ -221,6 +225,11 @@ void OverrideView::gameStarted() { case PLATFORM_NONE: break; } + + if (m_savePending) { + m_savePending = false; + saveOverride(); + } } void OverrideView::gameStopped() { @@ -228,7 +237,6 @@ void OverrideView::gameStopped() { m_ui.tabWidget->setEnabled(true); m_ui.savetype->setCurrentIndex(0); m_ui.idleLoop->clear(); - m_ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(false); m_ui.mbc->setCurrentIndex(0); m_ui.gbModel->setCurrentIndex(0); diff --git a/src/platform/qt/OverrideView.h b/src/platform/qt/OverrideView.h index 7dc148155..c144350e5 100644 --- a/src/platform/qt/OverrideView.h +++ b/src/platform/qt/OverrideView.h @@ -47,6 +47,7 @@ private: std::shared_ptr m_controller; ConfigController* m_config; + bool m_savePending = false; #ifdef M_CORE_GB uint32_t m_gbColors[4]{}; From 9a9aba86e771785d71a96fc28b9d27f92cc6cc4b Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 21 Sep 2017 22:25:22 -0700 Subject: [PATCH 121/158] Qt: Fix loading games from archives (fixes #881) --- src/platform/qt/CoreManager.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/platform/qt/CoreManager.cpp b/src/platform/qt/CoreManager.cpp index 8720391a4..50991026b 100644 --- a/src/platform/qt/CoreManager.cpp +++ b/src/platform/qt/CoreManager.cpp @@ -102,7 +102,10 @@ CoreController* CoreManager::loadGame(VFile* vf, const QString& path, const QStr QByteArray bytes(path.toUtf8()); separatePath(bytes.constData(), nullptr, core->dirs.baseName, nullptr); - QFileInfo info(base + "/" + path); + QFileInfo info(base); + if (info.isDir()) { + info = QFileInfo(base + "/" + path); + } bytes = info.dir().canonicalPath().toUtf8(); mDirectorySetAttachBase(&core->dirs, VDirOpen(bytes.constData())); mCoreAutoloadSave(core); From 5dfa036fa529b3a49eb2c0d391b6d23590363c6a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 22 Sep 2017 21:19:07 -0700 Subject: [PATCH 122/158] GBA Savedata: Fix size of SRAM saves (fixes #883) --- CHANGES | 1 + include/mgba/internal/gba/memory.h | 2 +- src/gba/cheats.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 9684ad736..935ec0ca8 100644 --- a/CHANGES +++ b/CHANGES @@ -42,6 +42,7 @@ Bugfixes: - GBA: Fix keypad IRQs not firing when extra buttons are pressed - GBA Video: Fix broken sprite blending hack (fixes mgba.io/i/532) - GBA I/O: Fix reading from a few invalid I/O registers (fixes mgba.io/i/876) + - GBA Savedata: Fix size of SRAM saves (fixes mgba.io/i/883) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/include/mgba/internal/gba/memory.h b/include/mgba/internal/gba/memory.h index 165d956d0..4e9839798 100644 --- a/include/mgba/internal/gba/memory.h +++ b/include/mgba/internal/gba/memory.h @@ -64,7 +64,7 @@ enum { SIZE_CART0 = 0x02000000, SIZE_CART1 = 0x02000000, SIZE_CART2 = 0x02000000, - SIZE_CART_SRAM = 0x00010000, + SIZE_CART_SRAM = 0x00008000, SIZE_CART_FLASH512 = 0x00010000, SIZE_CART_FLASH1M = 0x00020000, SIZE_CART_EEPROM = 0x00002000, diff --git a/src/gba/cheats.c b/src/gba/cheats.c index 2e1a30b54..c8a8f2c82 100644 --- a/src/gba/cheats.c +++ b/src/gba/cheats.c @@ -367,7 +367,7 @@ int GBACheatAddressIsReal(uint32_t address) { return -0x8; case REGION_CART_SRAM: case REGION_CART_SRAM_MIRROR: - if ((address & OFFSET_MASK) > SIZE_CART_SRAM) { + if ((address & OFFSET_MASK) > SIZE_CART_FLASH512) { return -0x80; } return -0x8; From a8f29906140feba11bdd4cd88574aee275f6f096 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 24 Sep 2017 11:56:26 -0700 Subject: [PATCH 123/158] VFS: Make VFile.truncate work growing files on PSV (fixes #885) --- CHANGES | 1 + src/platform/psp2/sce-vfs.c | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 935ec0ca8..205ebea9b 100644 --- a/CHANGES +++ b/CHANGES @@ -56,6 +56,7 @@ Misc: - GBA: Detect hardware for Pokémon FireRed ROM hacks - CMake: Fix CPack dependencies for libpng 1.6 - Qt: Allow overrides to be saved before a game is loaded + - VFS: Make VFile.truncate work growing files on PSV (fixes mgba.io/i/885) 0.6.0: (2017-07-16) Features: diff --git a/src/platform/psp2/sce-vfs.c b/src/platform/psp2/sce-vfs.c index 4b6fdce52..284479660 100644 --- a/src/platform/psp2/sce-vfs.c +++ b/src/platform/psp2/sce-vfs.c @@ -120,7 +120,20 @@ static void _vfsceUnmap(struct VFile* vf, void* memory, size_t size) { static void _vfsceTruncate(struct VFile* vf, size_t size) { struct VFileSce* vfsce = (struct VFileSce*) vf; - // TODO + SceOff cur = sceIoLseek(vfsce->fd, 0, SEEK_CUR); + SceOff end = sceIoLseek(vfsce->fd, 0, SEEK_END); + if (end < size) { + uint8_t buffer[2048] = {}; + size_t write = size - end; + while (write >= sizeof(buffer)) { + sceIoWrite(vfsce->fd, buffer, sizeof(buffer)); + write -= sizeof(buffer); + } + if (write) { + sceIoWrite(vfsce->fd, buffer, write); + } + } // TODO: Else + sceIoLseek(vfsce->fd, cur, SEEK_SET); } ssize_t _vfsceSize(struct VFile* vf) { From df9616c15c58454332c0dfb7f2b37e0098f518b9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 4 Sep 2017 23:20:42 -0700 Subject: [PATCH 124/158] Core: Revamp tile cache, add untested map cache --- include/mgba/core/cache-set.h | 35 +++ include/mgba/core/interface.h | 5 +- include/mgba/core/map-cache.h | 71 +++++++ include/mgba/core/tile-cache.h | 37 ++-- .../renderers/{tile-cache.h => cache-set.h} | 6 +- include/mgba/internal/gb/video.h | 4 +- .../renderers/{tile-cache.h => cache-set.h} | 11 +- include/mgba/internal/gba/video.h | 2 +- src/core/cache-set.c | 62 ++++++ src/core/map-cache.c | 96 +++++++++ src/core/tile-cache.c | 199 ++++++++---------- src/gb/extra/proxy.c | 6 +- src/gb/renderers/cache-set.c | 28 +++ src/gb/renderers/software.c | 6 +- src/gb/renderers/tile-cache.c | 27 --- src/gb/video.c | 7 +- src/gba/extra/proxy.c | 6 +- src/gba/renderers/cache-set.c | 158 ++++++++++++++ src/gba/renderers/tile-cache.c | 26 --- src/gba/renderers/video-software.c | 11 +- src/gba/video.c | 12 +- src/platform/python/_builder.h | 6 +- src/platform/python/_builder.py | 6 +- src/platform/qt/AssetTile.cpp | 59 ++---- src/platform/qt/AssetTile.h | 8 +- src/platform/qt/AssetView.cpp | 6 +- src/platform/qt/AssetView.h | 6 +- src/platform/qt/CoreController.cpp | 32 ++- src/platform/qt/CoreController.h | 6 +- src/platform/qt/ObjView.cpp | 51 +++-- src/platform/qt/ObjView.h | 1 + src/platform/qt/Swatch.cpp | 8 + src/platform/qt/Swatch.h | 1 + src/platform/qt/TilePainter.cpp | 7 +- src/platform/qt/TilePainter.h | 4 +- src/platform/qt/TileView.cpp | 43 ++-- 36 files changed, 705 insertions(+), 354 deletions(-) create mode 100644 include/mgba/core/cache-set.h create mode 100644 include/mgba/core/map-cache.h rename include/mgba/internal/gb/renderers/{tile-cache.h => cache-set.h} (71%) rename include/mgba/internal/gba/renderers/{tile-cache.h => cache-set.h} (53%) create mode 100644 src/core/cache-set.c create mode 100644 src/core/map-cache.c create mode 100644 src/gb/renderers/cache-set.c delete mode 100644 src/gb/renderers/tile-cache.c create mode 100644 src/gba/renderers/cache-set.c delete mode 100644 src/gba/renderers/tile-cache.c diff --git a/include/mgba/core/cache-set.h b/include/mgba/core/cache-set.h new file mode 100644 index 000000000..8fed166a9 --- /dev/null +++ b/include/mgba/core/cache-set.h @@ -0,0 +1,35 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef M_CACHE_SET_H +#define M_CACHE_SET_H + +#include + +CXX_GUARD_START + +#include +#include +#include + +DECLARE_VECTOR(mMapCacheSet, struct mMapCache); +DECLARE_VECTOR(mTileCacheSet, struct mTileCache); + +struct mCacheSet { + struct mMapCacheSet maps; + struct mTileCacheSet tiles; +}; + +void mCacheSetInit(struct mCacheSet*, size_t nMaps, size_t nTiles); +void mCacheSetDeinit(struct mCacheSet*); + +void mCacheSetAssignVRAM(struct mCacheSet*, void* vram); + +void mCacheSetWriteVRAM(struct mCacheSet*, uint32_t address); +void mCacheSetWritePalette(struct mCacheSet*, uint32_t entry, color_t color); + +CXX_GUARD_END + +#endif diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h index 053b5b1d1..e5c9dde18 100644 --- a/include/mgba/core/interface.h +++ b/include/mgba/core/interface.h @@ -47,10 +47,7 @@ static inline color_t mColorFrom555(uint16_t value) { color_t color = value; #endif #else - color_t color = 0; - color |= (value << 3) & 0xF8; - color |= (value << 6) & 0xF800; - color |= (value << 9) & 0xF80000; + color_t color = M_RGB5_TO_BGR8(value); color |= (color >> 5) & 0x070707; #endif return color; diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h new file mode 100644 index 000000000..60a380f00 --- /dev/null +++ b/include/mgba/core/map-cache.h @@ -0,0 +1,71 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef M_MAP_CACHE_H +#define M_MAP_CACHE_H + +#include + +CXX_GUARD_START + +#include + +DECL_BITFIELD(mMapCacheConfiguration, uint32_t); +DECL_BIT(mMapCacheConfiguration, ShouldStore, 0); + +DECL_BITFIELD(mMapCacheSystemInfo, uint32_t); +DECL_BITS(mMapCacheSystemInfo, PaletteBPP, 0, 2); +DECL_BITS(mMapCacheSystemInfo, PaletteCount, 2, 4); +DECL_BITS(mMapCacheSystemInfo, TilesWide, 8, 4); +DECL_BITS(mMapCacheSystemInfo, TilesHigh, 12, 4); +DECL_BITS(mMapCacheSystemInfo, MaxTiles, 16, 13); +DECL_BITS(mMapCacheSystemInfo, MapAlign, 29, 2); + +DECL_BITFIELD(mMapCacheEntryFlags, uint16_t); +DECL_BITS(mMapCacheEntryFlags, PaletteId, 0, 4); +DECL_BIT(mMapCacheEntryFlags, VramClean, 4); +DECL_BIT(mMapCacheEntryFlags, HMirror, 5); +DECL_BIT(mMapCacheEntryFlags, VMirror, 6); + +struct mMapCacheEntry { + uint32_t vramVersion; + uint16_t tileId; + mMapCacheEntryFlags flags; +}; + +struct mTileCache; +struct mTileCacheEntry; +struct mMapCache { + color_t* cache; + struct mTileCache* tileCache; + struct mTileCacheEntry* tileEntries; + struct mMapCacheEntry* status; + + uint8_t* vram; + + uint32_t mapStart; + uint32_t mapSize; + + uint32_t tileStart; + + mMapCacheConfiguration config; + mMapCacheSystemInfo sysConfig; + + void (*mapParser)(struct mMapCache*, struct mMapCacheEntry* entry, void* vram); +}; + +void mMapCacheInit(struct mMapCache* cache); +void mMapCacheDeinit(struct mMapCache* cache); +void mMapCacheConfigure(struct mMapCache* cache, mMapCacheConfiguration config); +void mMapCacheConfigureSystem(struct mMapCache* cache, mMapCacheSystemInfo config); +void mMapCacheConfigureMap(struct mMapCache* cache, uint32_t mapStart); +void mMapCacheWriteVRAM(struct mMapCache* cache, uint32_t address); + +bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y); +void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y); + +CXX_GUARD_END + +#endif diff --git a/include/mgba/core/tile-cache.h b/include/mgba/core/tile-cache.h index 540705af9..f8600b3ad 100644 --- a/include/mgba/core/tile-cache.h +++ b/include/mgba/core/tile-cache.h @@ -10,14 +10,14 @@ CXX_GUARD_START +#include + DECL_BITFIELD(mTileCacheConfiguration, uint32_t); DECL_BIT(mTileCacheConfiguration, ShouldStore, 0); DECL_BITFIELD(mTileCacheSystemInfo, uint32_t); -DECL_BITS(mTileCacheSystemInfo, Palette0BPP, 0, 2); -DECL_BITS(mTileCacheSystemInfo, Palette0Count, 2, 4); -DECL_BITS(mTileCacheSystemInfo, Palette1BPP, 8, 2); -DECL_BITS(mTileCacheSystemInfo, Palette1Count, 10, 4); +DECL_BITS(mTileCacheSystemInfo, PaletteBPP, 0, 2); +DECL_BITS(mTileCacheSystemInfo, PaletteCount, 2, 4); DECL_BITS(mTileCacheSystemInfo, MaxTiles, 16, 13); struct mTileCacheEntry { @@ -25,24 +25,22 @@ struct mTileCacheEntry { uint32_t vramVersion; uint8_t vramClean; uint8_t paletteId; - uint8_t activePalette; - uint8_t padding; + uint16_t padding; }; struct mTileCache { - uint16_t* cache; + color_t* cache; struct mTileCacheEntry* status; - uint32_t* globalPaletteVersion[2]; + uint32_t* globalPaletteVersion; - int activePalette; - unsigned entries; - unsigned count; + uint32_t tileBase; + uint32_t paletteBase; unsigned entriesPerTile; unsigned bpp; uint16_t* vram; - uint16_t* palette; - uint16_t temporaryTile[64]; + color_t* palette; + color_t temporaryTile[64]; mTileCacheConfiguration config; mTileCacheSystemInfo sysConfig; @@ -51,15 +49,14 @@ struct mTileCache { void mTileCacheInit(struct mTileCache* cache); void mTileCacheDeinit(struct mTileCache* cache); void mTileCacheConfigure(struct mTileCache* cache, mTileCacheConfiguration config); -void mTileCacheConfigureSystem(struct mTileCache* cache, mTileCacheSystemInfo config); +void mTileCacheConfigureSystem(struct mTileCache* cache, mTileCacheSystemInfo config, uint32_t tileBase, uint32_t paletteBase); void mTileCacheWriteVRAM(struct mTileCache* cache, uint32_t address); -void mTileCacheWritePalette(struct mTileCache* cache, uint32_t address); -void mTileCacheSetPalette(struct mTileCache* cache, int palette); +void mTileCacheWritePalette(struct mTileCache* cache, uint32_t entry, color_t color); -const uint16_t* mTileCacheGetTile(struct mTileCache* cache, unsigned tileId, unsigned paletteId); -const uint16_t* mTileCacheGetTileIfDirty(struct mTileCache* cache, struct mTileCacheEntry* entry, unsigned tileId, unsigned paletteId); -const uint8_t* mTileCacheGetRawTile(struct mTileCache* cache, unsigned tileId); -const uint16_t* mTileCacheGetPalette(struct mTileCache* cache, unsigned paletteId); +const color_t* mTileCacheGetTile(struct mTileCache* cache, unsigned tileId, unsigned paletteId); +const color_t* mTileCacheGetTileIfDirty(struct mTileCache* cache, struct mTileCacheEntry* entry, unsigned tileId, unsigned paletteId); +const color_t* mTileCacheGetPalette(struct mTileCache* cache, unsigned paletteId); +const uint16_t* mTileCacheGetVRAM(struct mTileCache* cache, unsigned tileId); CXX_GUARD_END diff --git a/include/mgba/internal/gb/renderers/tile-cache.h b/include/mgba/internal/gb/renderers/cache-set.h similarity index 71% rename from include/mgba/internal/gb/renderers/tile-cache.h rename to include/mgba/internal/gb/renderers/cache-set.h index 1b739ca46..3ee63716c 100644 --- a/include/mgba/internal/gb/renderers/tile-cache.h +++ b/include/mgba/internal/gb/renderers/cache-set.h @@ -11,10 +11,10 @@ CXX_GUARD_START struct GBVideo; -struct mTileCache; +struct mCacheSet; -void GBVideoTileCacheInit(struct mTileCache* cache); -void GBVideoTileCacheAssociate(struct mTileCache* cache, struct GBVideo* video); +void GBVideoCacheInit(struct mCacheSet* cache); +void GBVideoCacheAssociate(struct mCacheSet* cache, struct GBVideo* video); CXX_GUARD_END diff --git a/include/mgba/internal/gb/video.h b/include/mgba/internal/gb/video.h index d44ff2298..f5e958caf 100644 --- a/include/mgba/internal/gb/video.h +++ b/include/mgba/internal/gb/video.h @@ -65,7 +65,7 @@ union GBOAM { uint8_t raw[160]; }; -struct mTileCache; +struct mCacheSet; struct GBVideoRenderer { void (*init)(struct GBVideoRenderer* renderer, enum GBModel model, bool borders); void (*deinit)(struct GBVideoRenderer* renderer); @@ -84,7 +84,7 @@ struct GBVideoRenderer { uint8_t* vram; union GBOAM* oam; - struct mTileCache* cache; + struct mCacheSet* cache; uint8_t* sgbCharRam; uint8_t* sgbMapRam; diff --git a/include/mgba/internal/gba/renderers/tile-cache.h b/include/mgba/internal/gba/renderers/cache-set.h similarity index 53% rename from include/mgba/internal/gba/renderers/tile-cache.h rename to include/mgba/internal/gba/renderers/cache-set.h index 3e2143f35..3ad4f6196 100644 --- a/include/mgba/internal/gba/renderers/tile-cache.h +++ b/include/mgba/internal/gba/renderers/cache-set.h @@ -3,18 +3,19 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef GBA_TILE_CACHE_H -#define GBA_TILE_CACHE_H +#ifndef GBA_CACHE_SET_H +#define GBA_CACHE_SET_H #include CXX_GUARD_START struct GBAVideo; -struct mTileCache; +struct mCacheSet; -void GBAVideoTileCacheInit(struct mTileCache* cache); -void GBAVideoTileCacheAssociate(struct mTileCache* cache, struct GBAVideo* video); +void GBAVideoCacheInit(struct mCacheSet* cache); +void GBAVideoCacheAssociate(struct mCacheSet* cache, struct GBAVideo* video); +void GBAVideoCacheWriteVideoRegister(struct mCacheSet* cache, uint32_t address, uint16_t value); CXX_GUARD_END diff --git a/include/mgba/internal/gba/video.h b/include/mgba/internal/gba/video.h index 3a1aa14e8..265cb89aa 100644 --- a/include/mgba/internal/gba/video.h +++ b/include/mgba/internal/gba/video.h @@ -164,7 +164,7 @@ struct GBAVideoRenderer { uint16_t* palette; uint16_t* vram; union GBAOAM* oam; - struct mTileCache* cache; + struct mCacheSet* cache; bool disableBG[4]; bool disableOBJ; diff --git a/src/core/cache-set.c b/src/core/cache-set.c new file mode 100644 index 000000000..7561981e3 --- /dev/null +++ b/src/core/cache-set.c @@ -0,0 +1,62 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + +DEFINE_VECTOR(mMapCacheSet, struct mMapCache); +DEFINE_VECTOR(mTileCacheSet, struct mTileCache); + +void mCacheSetInit(struct mCacheSet* cache, size_t nMaps, size_t nTiles) { + mMapCacheSetInit(&cache->maps, nMaps); + mMapCacheSetResize(&cache->maps, nMaps); + mTileCacheSetInit(&cache->tiles, nTiles); + mTileCacheSetResize(&cache->tiles, nTiles); + + size_t i; + for (i = 0; i < nMaps; ++i) { + mMapCacheInit(mMapCacheSetGetPointer(&cache->maps, i)); + } + for (i = 0; i < nTiles; ++i) { + mTileCacheInit(mTileCacheSetGetPointer(&cache->tiles, i)); + } +} + +void mCacheSetDeinit(struct mCacheSet* cache) { + size_t i; + for (i = 0; i < mMapCacheSetSize(&cache->maps); ++i) { + mMapCacheDeinit(mMapCacheSetGetPointer(&cache->maps, i)); + } + for (i = 0; i < mTileCacheSetSize(&cache->tiles); ++i) { + mTileCacheDeinit(mTileCacheSetGetPointer(&cache->tiles, i)); + } +} + +void mCacheSetAssignVRAM(struct mCacheSet* cache, void* vram) { + size_t i; + for (i = 0; i < mMapCacheSetSize(&cache->maps); ++i) { + mMapCacheSetGetPointer(&cache->maps, i)->vram = vram; + } + for (i = 0; i < mTileCacheSetSize(&cache->tiles); ++i) { + struct mTileCache* tileCache = mTileCacheSetGetPointer(&cache->tiles, i); + tileCache->vram = (void*) ((uintptr_t) vram + tileCache->tileBase); + } +} + +void mCacheSetWriteVRAM(struct mCacheSet* cache, uint32_t address) { + size_t i; + for (i = 0; i < mMapCacheSetSize(&cache->maps); ++i) { + mMapCacheWriteVRAM(mMapCacheSetGetPointer(&cache->maps, i), address); + } + for (i = 0; i < mTileCacheSetSize(&cache->tiles); ++i) { + mTileCacheWriteVRAM(mTileCacheSetGetPointer(&cache->tiles, i), address); + } +} + +void mCacheSetWritePalette(struct mCacheSet* cache, uint32_t entry, color_t color) { + size_t i; + for (i = 0; i < mTileCacheSetSize(&cache->tiles); ++i) { + mTileCacheWritePalette(mTileCacheSetGetPointer(&cache->tiles, i), entry, color); + } +} diff --git a/src/core/map-cache.c b/src/core/map-cache.c new file mode 100644 index 000000000..4646609dc --- /dev/null +++ b/src/core/map-cache.c @@ -0,0 +1,96 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + +#include +#include + +void mMapCacheInit(struct mMapCache* cache) { + // TODO: Reconfigurable cache for space savings + cache->cache = NULL; + cache->config = mMapCacheConfigurationFillShouldStore(0); + cache->status = NULL; +} + +static void _freeCache(struct mMapCache* cache) { + size_t tiles = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh(cache->sysConfig)); + mappedMemoryFree(cache->cache, 8 * 8 * sizeof(color_t) * tiles); + mappedMemoryFree(cache->status, tiles * sizeof(*cache->status)); + cache->cache = NULL; + cache->status = NULL; +} + +static void _redoCacheSize(struct mMapCache* cache) { + if (!mMapCacheConfigurationIsShouldStore(cache->config)) { + return; + } + + size_t tiles = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh(cache->sysConfig)); + cache->cache = anonymousMemoryMap(8 * 8 * sizeof(color_t) * tiles); + cache->status = anonymousMemoryMap(tiles * sizeof(*cache->status)); +} + +void mMapCacheConfigure(struct mMapCache* cache, mMapCacheConfiguration config) { + _freeCache(cache); + cache->config = config; + _redoCacheSize(cache); +} + +void mMapCacheConfigureSystem(struct mMapCache* cache, mMapCacheSystemInfo config) { + _freeCache(cache); + cache->sysConfig = config; + _redoCacheSize(cache); + + size_t mapSize = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh(cache->sysConfig)); + cache->mapSize = mapSize << mMapCacheSystemInfoGetMapAlign(cache->sysConfig); +} + +void mMapCacheConfigureMap(struct mMapCache* cache, uint32_t mapStart) { + size_t tiles = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * (1 << mMapCacheSystemInfoGetTilesHigh(cache->sysConfig)); + memset(cache->status, 0, tiles * sizeof(*cache->status)); + cache->mapStart = mapStart; +} + +void mMapCacheDeinit(struct mMapCache* cache) { + _freeCache(cache); +} + +void mMapCacheWriteVRAM(struct mMapCache* cache, uint32_t address) { + if (address >= cache->mapStart && address < cache->mapStart + cache->mapSize) { + address >>= mMapCacheSystemInfoGetMapAlign(cache->sysConfig); + ++cache->status[address].vramVersion; + cache->status[address].flags = mMapCacheEntryFlagsClearVramClean(cache->status[address].flags); + } +} + +bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y) { + size_t location = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * y + x; + const struct mMapCacheEntry* status = &cache->status[location]; + return memcmp(status, &entry[location], sizeof(*entry)) == 0; +} + +void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y) { + size_t location = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * y + x; + struct mMapCacheEntry* status = &cache->status[location]; + status->flags = mMapCacheEntryFlagsFillVramClean(status->flags); + int align = mMapCacheSystemInfoGetMapAlign(cache->sysConfig); + cache->mapParser(cache, status, &cache->vram[(location << align) + cache->mapStart]); + + int bytesPerPixel = 1 << mMapCacheSystemInfoGetPaletteBPP(cache->sysConfig); + size_t stride = bytesPerPixel * (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)); + color_t* mapOut = &cache->cache[(y * stride + x) * 8]; + const color_t* tile = mTileCacheGetTileIfDirty(cache->tileCache, cache->tileEntries, status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + memcpy(mapOut, tile, sizeof(color_t) * 8); + memcpy(&mapOut[stride], &tile[0x08], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 2], &tile[0x10], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 3], &tile[0x18], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 4], &tile[0x20], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 5], &tile[0x28], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 6], &tile[0x30], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 7], &tile[0x38], sizeof(color_t) * 8); + + entry[location] = *status; +} diff --git a/src/core/tile-cache.c b/src/core/tile-cache.c index 3c34a8d86..ffb1cf565 100644 --- a/src/core/tile-cache.c +++ b/src/core/tile-cache.c @@ -12,60 +12,42 @@ void mTileCacheInit(struct mTileCache* cache) { cache->cache = NULL; cache->config = mTileCacheConfigurationFillShouldStore(0); cache->status = NULL; - cache->activePalette = 0; - memset(cache->globalPaletteVersion, 0, sizeof(cache->globalPaletteVersion)); + cache->globalPaletteVersion = NULL; + cache->palette = NULL; } static void _freeCache(struct mTileCache* cache) { - unsigned count0; - count0 = 1 << mTileCacheSystemInfoGetPalette0Count(cache->sysConfig); - unsigned count1; - count1 = 1 << mTileCacheSystemInfoGetPalette1Count(cache->sysConfig); + unsigned size = 1 << mTileCacheSystemInfoGetPaletteCount(cache->sysConfig); unsigned tiles = mTileCacheSystemInfoGetMaxTiles(cache->sysConfig); - unsigned size = count0 > count1 ? count0 : count1; if (cache->cache) { - mappedMemoryFree(cache->cache, 8 * 8 * 2 * tiles * size); + mappedMemoryFree(cache->cache, 8 * 8 * sizeof(color_t) * tiles * size); cache->cache = NULL; } if (cache->status) { mappedMemoryFree(cache->status, tiles * size * sizeof(*cache->status)); cache->status = NULL; } - free(cache->globalPaletteVersion[0]); - free(cache->globalPaletteVersion[1]); - memset(cache->globalPaletteVersion, 0, sizeof(cache->globalPaletteVersion)); + free(cache->globalPaletteVersion); + cache->globalPaletteVersion = NULL; + free(cache->palette); + cache->palette = NULL; } static void _redoCacheSize(struct mTileCache* cache) { if (!mTileCacheConfigurationIsShouldStore(cache->config)) { return; } - unsigned count0 = mTileCacheSystemInfoGetPalette0Count(cache->sysConfig); - unsigned bpp0 = mTileCacheSystemInfoGetPalette0BPP(cache->sysConfig); - bpp0 = 1 << (1 << bpp0); - if (count0) { - count0 = 1 << count0; - } - unsigned count1 = mTileCacheSystemInfoGetPalette1Count(cache->sysConfig); - unsigned bpp1 = mTileCacheSystemInfoGetPalette1BPP(cache->sysConfig); - bpp1 = 1 << (1 << bpp1); - if (count1) { - count1 = 1 << count1; - } - unsigned size = count0 > count1 ? count0 : count1; - if (!size) { - return; - } + unsigned size = mTileCacheSystemInfoGetPaletteCount(cache->sysConfig); + unsigned bpp = mTileCacheSystemInfoGetPaletteBPP(cache->sysConfig); + cache->bpp = bpp; + bpp = 1 << (1 << bpp); + size = 1 << size; cache->entriesPerTile = size; unsigned tiles = mTileCacheSystemInfoGetMaxTiles(cache->sysConfig); - cache->cache = anonymousMemoryMap(8 * 8 * 2 * tiles * size); + cache->cache = anonymousMemoryMap(8 * 8 * sizeof(color_t) * tiles * size); cache->status = anonymousMemoryMap(tiles * size * sizeof(*cache->status)); - if (count0) { - cache->globalPaletteVersion[0] = malloc(count0 * bpp0 * sizeof(*cache->globalPaletteVersion[0])); - } - if (count1) { - cache->globalPaletteVersion[1] = malloc(count1 * bpp1 * sizeof(*cache->globalPaletteVersion[1])); - } + cache->globalPaletteVersion = malloc(size * sizeof(*cache->globalPaletteVersion)); + cache->palette = malloc(size * bpp * sizeof(*cache->palette)); } void mTileCacheConfigure(struct mTileCache* cache, mTileCacheConfiguration config) { @@ -74,9 +56,11 @@ void mTileCacheConfigure(struct mTileCache* cache, mTileCacheConfiguration confi _redoCacheSize(cache); } -void mTileCacheConfigureSystem(struct mTileCache* cache, mTileCacheSystemInfo config) { +void mTileCacheConfigureSystem(struct mTileCache* cache, mTileCacheSystemInfo config, uint32_t tileBase, uint32_t paletteBase) { _freeCache(cache); cache->sysConfig = config; + cache->tileBase = tileBase; + cache->paletteBase = paletteBase; _redoCacheSize(cache); } @@ -85,40 +69,41 @@ void mTileCacheDeinit(struct mTileCache* cache) { } void mTileCacheWriteVRAM(struct mTileCache* cache, uint32_t address) { + if (address < cache->tileBase) { + return; + } + address -= cache->tileBase; unsigned bpp = cache->bpp + 3; unsigned count = cache->entriesPerTile; + address >>= bpp; + if (address >= mTileCacheSystemInfoGetMaxTiles(cache->sysConfig)) { + return; + } size_t i; for (i = 0; i < count; ++i) { - cache->status[(address >> bpp) * count + i].vramClean = 0; - ++cache->status[(address >> bpp) * count + i].vramVersion; + cache->status[address * count + i].vramClean = 0; + ++cache->status[address * count + i].vramVersion; } } -void mTileCacheWritePalette(struct mTileCache* cache, uint32_t address) { - if (cache->globalPaletteVersion[0]) { - ++cache->globalPaletteVersion[0][address >> 1]; +void mTileCacheWritePalette(struct mTileCache* cache, uint32_t entry, color_t color) { + if (entry < cache->paletteBase) { + return; } - if (cache->globalPaletteVersion[1]) { - ++cache->globalPaletteVersion[1][address >> 1]; + entry -= cache->paletteBase; + unsigned maxEntry = (1 << (1 << cache->bpp)) * cache->entriesPerTile; + if (entry >= maxEntry) { + return; } + cache->palette[entry] = color; + entry >>= (1 << mTileCacheSystemInfoGetPaletteBPP(cache->sysConfig)); + ++cache->globalPaletteVersion[entry]; } -void mTileCacheSetPalette(struct mTileCache* cache, int palette) { - cache->activePalette = palette; - if (palette == 0) { - cache->bpp = mTileCacheSystemInfoGetPalette0BPP(cache->sysConfig); - cache->count = 1 << mTileCacheSystemInfoGetPalette0Count(cache->sysConfig); - } else { - cache->bpp = mTileCacheSystemInfoGetPalette1BPP(cache->sysConfig); - cache->count = 1 << mTileCacheSystemInfoGetPalette1Count(cache->sysConfig); - } - cache->entries = 1 << (1 << cache->bpp); -} - -static void _regenerateTile4(struct mTileCache* cache, uint16_t* tile, unsigned tileId, unsigned paletteId) { +static void _regenerateTile4(struct mTileCache* cache, color_t* tile, unsigned tileId, unsigned paletteId) { uint8_t* start = (uint8_t*) &cache->vram[tileId << 3]; paletteId <<= 2; - uint16_t* palette = &cache->palette[paletteId]; + color_t* palette = &cache->palette[paletteId]; int i; for (i = 0; i < 8; ++i) { uint8_t tileDataLower = start[0]; @@ -126,87 +111,87 @@ static void _regenerateTile4(struct mTileCache* cache, uint16_t* tile, unsigned start += 2; int pixel; pixel = ((tileDataUpper & 128) >> 6) | ((tileDataLower & 128) >> 7); - tile[0] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[0] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = ((tileDataUpper & 64) >> 5) | ((tileDataLower & 64) >> 6); - tile[1] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[1] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = ((tileDataUpper & 32) >> 4) | ((tileDataLower & 32) >> 5); - tile[2] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[2] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = ((tileDataUpper & 16) >> 3) | ((tileDataLower & 16) >> 4); - tile[3] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[3] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = ((tileDataUpper & 8) >> 2) | ((tileDataLower & 8) >> 3); - tile[4] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[4] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = ((tileDataUpper & 4) >> 1) | ((tileDataLower & 4) >> 2); - tile[5] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[5] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (tileDataUpper & 2) | ((tileDataLower & 2) >> 1); - tile[6] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[6] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = ((tileDataUpper & 1) << 1) | (tileDataLower & 1); - tile[7] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[7] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; tile += 8; } } -static void _regenerateTile16(struct mTileCache* cache, uint16_t* tile, unsigned tileId, unsigned paletteId) { +static void _regenerateTile16(struct mTileCache* cache, color_t* tile, unsigned tileId, unsigned paletteId) { uint32_t* start = (uint32_t*) &cache->vram[tileId << 4]; paletteId <<= 4; - uint16_t* palette = &cache->palette[paletteId]; + color_t* palette = &cache->palette[paletteId]; int i; for (i = 0; i < 8; ++i) { uint32_t line = *start; ++start; int pixel; pixel = line & 0xF; - tile[0] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[0] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 4) & 0xF; - tile[1] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[1] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 8) & 0xF; - tile[2] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[2] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 12) & 0xF; - tile[3] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[3] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 16) & 0xF; - tile[4] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[4] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 20) & 0xF; - tile[5] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[5] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 24) & 0xF; - tile[6] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[6] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 28) & 0xF; - tile[7] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[7] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; tile += 8; } } -static void _regenerateTile256(struct mTileCache* cache, uint16_t* tile, unsigned tileId, unsigned paletteId) { +static void _regenerateTile256(struct mTileCache* cache, color_t* tile, unsigned tileId, unsigned paletteId) { uint32_t* start = (uint32_t*) &cache->vram[tileId << 5]; paletteId <<= 8; - uint16_t* palette = &cache->palette[paletteId]; + color_t* palette = &cache->palette[paletteId]; int i; for (i = 0; i < 8; ++i) { uint32_t line = *start; ++start; int pixel; pixel = line & 0xFF; - tile[0] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[0] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 8) & 0xFF; - tile[1] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[1] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 16) & 0xFF; - tile[2] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[2] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 24) & 0xFF; - tile[3] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[3] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; line = *start; ++start; pixel = line & 0xFF; - tile[4] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[4] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 8) & 0xFF; - tile[5] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[5] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 16) & 0xFF; - tile[6] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[6] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; pixel = (line >> 24) & 0xFF; - tile[7] = pixel ? palette[pixel] | 0x8000 : palette[pixel] & 0x7FFF; + tile[7] = pixel ? palette[pixel] | 0xFF000000 : palette[pixel]; tile += 8; } } -static inline uint16_t* _tileLookup(struct mTileCache* cache, unsigned tileId, unsigned paletteId) { +static inline color_t* _tileLookup(struct mTileCache* cache, unsigned tileId, unsigned paletteId) { if (mTileCacheConfigurationIsShouldStore(cache->config)) { unsigned tiles = mTileCacheSystemInfoGetMaxTiles(cache->sysConfig); return &cache->cache[(tileId + paletteId * tiles) << 6]; @@ -215,19 +200,17 @@ static inline uint16_t* _tileLookup(struct mTileCache* cache, unsigned tileId, u } } -const uint16_t* mTileCacheGetTile(struct mTileCache* cache, unsigned tileId, unsigned paletteId) { - unsigned cPaletteId = cache->activePalette; +const color_t* mTileCacheGetTile(struct mTileCache* cache, unsigned tileId, unsigned paletteId) { unsigned count = cache->entriesPerTile; unsigned bpp = cache->bpp; struct mTileCacheEntry* status = &cache->status[tileId * count + paletteId]; struct mTileCacheEntry desiredStatus = { - .paletteVersion = cache->globalPaletteVersion[cPaletteId][paletteId], + .paletteVersion = cache->globalPaletteVersion[paletteId], .vramVersion = status->vramVersion, .vramClean = 1, - .paletteId = paletteId, - .activePalette = cPaletteId + .paletteId = paletteId }; - uint16_t* tile = _tileLookup(cache, tileId, paletteId); + color_t* tile = _tileLookup(cache, tileId, paletteId); if (!mTileCacheConfigurationIsShouldStore(cache->config) || memcmp(status, &desiredStatus, sizeof(*status))) { switch (bpp) { case 0: @@ -247,19 +230,17 @@ const uint16_t* mTileCacheGetTile(struct mTileCache* cache, unsigned tileId, uns return tile; } -const uint16_t* mTileCacheGetTileIfDirty(struct mTileCache* cache, struct mTileCacheEntry* entry, unsigned tileId, unsigned paletteId) { - unsigned cPaletteId = cache->activePalette; +const color_t* mTileCacheGetTileIfDirty(struct mTileCache* cache, struct mTileCacheEntry* entry, unsigned tileId, unsigned paletteId) { unsigned count = cache->entriesPerTile; unsigned bpp = cache->bpp; struct mTileCacheEntry* status = &cache->status[tileId * count + paletteId]; struct mTileCacheEntry desiredStatus = { - .paletteVersion = cache->globalPaletteVersion[cPaletteId][paletteId], + .paletteVersion = cache->globalPaletteVersion[paletteId], .vramVersion = status->vramVersion, .vramClean = 1, - .paletteId = paletteId, - .activePalette = cPaletteId + .paletteId = paletteId }; - uint16_t* tile = NULL; + color_t* tile = NULL; if (memcmp(status, &desiredStatus, sizeof(*status))) { tile = _tileLookup(cache, tileId, paletteId); switch (bpp) { @@ -284,26 +265,10 @@ const uint16_t* mTileCacheGetTileIfDirty(struct mTileCache* cache, struct mTileC return tile; } -const uint8_t* mTileCacheGetRawTile(struct mTileCache* cache, unsigned tileId) { - unsigned bpp = cache->bpp; - switch (bpp) { - case 0: - return NULL; - default: - return (uint8_t*) &cache->vram[tileId << (2 + bpp)]; - } +const color_t* mTileCacheGetPalette(struct mTileCache* cache, unsigned paletteId) { + return &cache->palette[paletteId << (1 << cache->bpp)]; } -const uint16_t* mTileCacheGetPalette(struct mTileCache* cache, unsigned paletteId) { - unsigned bpp = cache->bpp; - switch (bpp) { - default: - return NULL; - case 1: - return &cache->palette[paletteId << 2]; - case 2: - return &cache->palette[paletteId << 4]; - case 3: - return &cache->palette[paletteId << 8]; - } +const uint16_t* mTileCacheGetVRAM(struct mTileCache* cache, unsigned tileId) { + return &cache->vram[tileId << (cache->bpp + 2)]; } diff --git a/src/gb/extra/proxy.c b/src/gb/extra/proxy.c index 9dc1d8fb3..eb2c29e79 100644 --- a/src/gb/extra/proxy.c +++ b/src/gb/extra/proxy.c @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include -#include +#include #include #include @@ -203,7 +203,7 @@ void GBVideoProxyRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t ad proxyRenderer->backend->writeVRAM(proxyRenderer->backend, address); } if (renderer->cache) { - mTileCacheWriteVRAM(renderer->cache, address); + mCacheSetWriteVRAM(renderer->cache, address); } } @@ -214,7 +214,7 @@ void GBVideoProxyRendererWritePalette(struct GBVideoRenderer* renderer, int addr proxyRenderer->backend->writePalette(proxyRenderer->backend, address, value); } if (renderer->cache) { - mTileCacheWritePalette(renderer->cache, address); + mCacheSetWritePalette(renderer->cache, address, mColorFrom555(value)); } } diff --git a/src/gb/renderers/cache-set.c b/src/gb/renderers/cache-set.c new file mode 100644 index 000000000..a2f34992b --- /dev/null +++ b/src/gb/renderers/cache-set.c @@ -0,0 +1,28 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + +#include +#include + +void GBVideoCacheInit(struct mCacheSet* cache) { + mCacheSetInit(cache, 0, 1); + mTileCacheConfiguration config = 0; + config = mTileCacheSystemInfoSetPaletteBPP(config, 1); // 2^(2^1) = 4 entries + config = mTileCacheSystemInfoSetPaletteCount(config, 4); // 16 palettes + config = mTileCacheSystemInfoSetMaxTiles(config, 1024); + mTileCacheInit(mTileCacheSetGetPointer(&cache->tiles, 0)); + mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 0), config, 0, 0); +} + +void GBVideoCacheAssociate(struct mCacheSet* cache, struct GBVideo* video) { + mCacheSetAssignVRAM(cache, video->vram); + video->renderer->cache = cache; + size_t i; + for (i = 0; i < 64; ++i) { + mCacheSetWritePalette(cache, i, mColorFrom555(video->palette[i])); + } +} diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index a5f28b133..0e34b22f1 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include -#include +#include #include #include #include @@ -284,13 +284,13 @@ static void GBVideoSoftwareRendererWritePalette(struct GBVideoRenderer* renderer color_t color = mColorFrom555(value); softwareRenderer->palette[index] = color; if (renderer->cache) { - mTileCacheWritePalette(renderer->cache, index << 1); + mCacheSetWritePalette(renderer->cache, index, color); } } static void GBVideoSoftwareRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t address) { if (renderer->cache) { - mTileCacheWriteVRAM(renderer->cache, address); + mCacheSetWriteVRAM(renderer->cache, address); } } diff --git a/src/gb/renderers/tile-cache.c b/src/gb/renderers/tile-cache.c deleted file mode 100644 index 4780649b8..000000000 --- a/src/gb/renderers/tile-cache.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include - -#include -#include -#include - -void GBVideoTileCacheInit(struct mTileCache* cache) { - mTileCacheInit(cache); - mTileCacheConfiguration config = 0; - config = mTileCacheSystemInfoSetPalette0BPP(config, 1); // 2^(2^2) = 4 entries - config = mTileCacheSystemInfoSetPalette0Count(config, 4); // 16 palettes - config = mTileCacheSystemInfoSetPalette1BPP(config, 0); // Disable - config = mTileCacheSystemInfoSetPalette1Count(config, 0); // Disable - config = mTileCacheSystemInfoSetMaxTiles(config, 1024); - mTileCacheConfigureSystem(cache, config); -} - -void GBVideoTileCacheAssociate(struct mTileCache* cache, struct GBVideo* video) { - cache->vram = (uint16_t*) video->vram; - cache->palette = video->palette; - video->renderer->cache = cache; -} diff --git a/src/gb/video.c b/src/gb/video.c index f98a6c77b..d79ce6873 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include #include @@ -705,7 +705,7 @@ static void GBVideoDummyRendererWriteSGBPacket(struct GBVideoRenderer* renderer, static void GBVideoDummyRendererWriteVRAM(struct GBVideoRenderer* renderer, uint16_t address) { if (renderer->cache) { - mTileCacheWriteVRAM(renderer->cache, address); + mCacheSetWriteVRAM(renderer->cache, address); } } @@ -716,9 +716,8 @@ static void GBVideoDummyRendererWriteOAM(struct GBVideoRenderer* renderer, uint1 } static void GBVideoDummyRendererWritePalette(struct GBVideoRenderer* renderer, int index, uint16_t value) { - UNUSED(value); if (renderer->cache) { - mTileCacheWritePalette(renderer->cache, index << 1); + mCacheSetWritePalette(renderer->cache, index, mColorFrom555(value)); } } diff --git a/src/gba/extra/proxy.c b/src/gba/extra/proxy.c index e75da94c4..da38540a3 100644 --- a/src/gba/extra/proxy.c +++ b/src/gba/extra/proxy.c @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include -#include +#include #include #include @@ -206,7 +206,7 @@ void GBAVideoProxyRendererWriteVRAM(struct GBAVideoRenderer* renderer, uint32_t proxyRenderer->backend->writeVRAM(proxyRenderer->backend, address); } if (renderer->cache) { - mTileCacheWriteVRAM(renderer->cache, address); + mCacheSetWriteVRAM(renderer->cache, address); } } @@ -217,7 +217,7 @@ void GBAVideoProxyRendererWritePalette(struct GBAVideoRenderer* renderer, uint32 proxyRenderer->backend->writePalette(proxyRenderer->backend, address, value); } if (renderer->cache) { - mTileCacheWritePalette(renderer->cache, address); + mCacheSetWritePalette(renderer->cache, address >> 1, mColorFrom555(value)); } } diff --git a/src/gba/renderers/cache-set.c b/src/gba/renderers/cache-set.c new file mode 100644 index 000000000..dd236225b --- /dev/null +++ b/src/gba/renderers/cache-set.c @@ -0,0 +1,158 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + +#include +#include +#include +#include + +void GBAVideoCacheInit(struct mCacheSet* cache) { + mCacheSetInit(cache, 4, 4); + mTileCacheSystemInfo sysconfig = 0; + mTileCacheConfiguration config = mTileCacheConfigurationFillShouldStore(0); + sysconfig = mTileCacheSystemInfoSetPaletteBPP(sysconfig, 2); // 2^(2^2) = 16 entries + sysconfig = mTileCacheSystemInfoSetPaletteCount(sysconfig, 4); // 16 palettes + sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 2048); + mTileCacheInit(mTileCacheSetGetPointer(&cache->tiles, 0)); + mTileCacheConfigure(mTileCacheSetGetPointer(&cache->tiles, 0), config); + mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 0), sysconfig, 0, 0); + sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 1024); + mTileCacheInit(mTileCacheSetGetPointer(&cache->tiles, 2)); + mTileCacheConfigure(mTileCacheSetGetPointer(&cache->tiles, 2), config); + mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 2), sysconfig, 0x10000, 0x100); + + sysconfig = mTileCacheSystemInfoSetPaletteBPP(sysconfig, 3); // 2^(2^3) = 256 entries + sysconfig = mTileCacheSystemInfoSetPaletteCount(sysconfig, 0); // 1 palettes + sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 2048); + mTileCacheInit(mTileCacheSetGetPointer(&cache->tiles, 1)); + mTileCacheConfigure(mTileCacheSetGetPointer(&cache->tiles, 1), config); + mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 1), sysconfig, 0, 0); + sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 1024); + mTileCacheInit(mTileCacheSetGetPointer(&cache->tiles, 3)); + mTileCacheConfigure(mTileCacheSetGetPointer(&cache->tiles, 3), config); + mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 3), sysconfig, 0x10000, 0x100); + + mMapCacheInit(mMapCacheSetGetPointer(&cache->maps, 0)); + mMapCacheInit(mMapCacheSetGetPointer(&cache->maps, 1)); + mMapCacheInit(mMapCacheSetGetPointer(&cache->maps, 2)); + mMapCacheInit(mMapCacheSetGetPointer(&cache->maps, 3)); +} + +void GBAVideoCacheAssociate(struct mCacheSet* cache, struct GBAVideo* video) { + mCacheSetAssignVRAM(cache, video->vram); + video->renderer->cache = cache; + size_t i; + for (i = 0; i < SIZE_PALETTE_RAM / 2; ++i) { + mCacheSetWritePalette(cache, i, mColorFrom555(video->palette[i])); + } +} + +static void mapParser0(struct mMapCache* cache, struct mMapCacheEntry* entry, void* vram) { + UNUSED(cache); + uint16_t map = *(uint16_t*) vram; + entry->tileId = GBA_TEXT_MAP_TILE(map); + entry->flags = mMapCacheEntryFlagsSetHMirror(entry->flags, GBA_TEXT_MAP_HFLIP(map)); + entry->flags = mMapCacheEntryFlagsSetHMirror(entry->flags, GBA_TEXT_MAP_VFLIP(map)); + entry->flags = mMapCacheEntryFlagsSetPaletteId(entry->flags, GBA_TEXT_MAP_PALETTE(map)); +} + +static void mapParser2(struct mMapCache* cache, struct mMapCacheEntry* entry, void* vram) { + UNUSED(cache); + entry->tileId = *(uint8_t*) vram; + entry->flags = mMapCacheEntryFlagsClearHMirror(entry->flags); + entry->flags = mMapCacheEntryFlagsClearHMirror(entry->flags); + entry->flags = mMapCacheEntryFlagsClearPaletteId(entry->flags); +} + +static void GBAVideoCacheWriteDISPCNT(struct mCacheSet* cache, uint16_t value) { + switch (GBARegisterDISPCNTGetMode(value)) { + case 0: + default: + mMapCacheSetGetPointer(&cache->maps, 0)->mapParser = mapParser0; + mMapCacheSetGetPointer(&cache->maps, 1)->mapParser = mapParser0; + mMapCacheSetGetPointer(&cache->maps, 2)->mapParser = mapParser0; + mMapCacheSetGetPointer(&cache->maps, 3)->mapParser = mapParser0; + + mMapCacheSetGetPointer(&cache->maps, 0)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); + mMapCacheSetGetPointer(&cache->maps, 1)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); + mMapCacheSetGetPointer(&cache->maps, 2)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); + mMapCacheSetGetPointer(&cache->maps, 3)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); + break; + case 1: + case 2: + mMapCacheSetGetPointer(&cache->maps, 0)->mapParser = mapParser0; + mMapCacheSetGetPointer(&cache->maps, 1)->mapParser = mapParser0; + mMapCacheSetGetPointer(&cache->maps, 2)->mapParser = mapParser2; + mMapCacheSetGetPointer(&cache->maps, 3)->mapParser = mapParser2; + + mMapCacheSetGetPointer(&cache->maps, 0)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); + mMapCacheSetGetPointer(&cache->maps, 1)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); + mMapCacheSetGetPointer(&cache->maps, 2)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); + mMapCacheSetGetPointer(&cache->maps, 3)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); + break; + } +} + +static void GBAVideoCacheWriteBGCNT(struct mCacheSet* cache, size_t bg, uint16_t value) { + struct mMapCache* map = mMapCacheSetGetPointer(&cache->maps, bg); + + int tileStart = GBARegisterBGCNTGetCharBase(value) * 128; + bool p = GBARegisterBGCNTGet256Color(value); + mMapCacheConfigureMap(map, GBARegisterBGCNTGetScreenBase(value) << 11); + int size = GBARegisterBGCNTGetSize(value); + int tilesWide = 0; + int tilesHigh = 0; + mMapCacheSystemInfo sysconfig = 0; + if (map->mapParser == mapParser0) { + sysconfig = mMapCacheSystemInfoSetPaletteBPP(sysconfig, 2 + p); + sysconfig = mMapCacheSystemInfoSetPaletteCount(sysconfig, 4 * !p); + sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 512); + sysconfig = mMapCacheSystemInfoSetMapAlign(sysconfig, 1); + tilesWide = 5; + tilesHigh = 5; + if (size & 1) { + ++tilesWide; + } + if (size & 2) { + ++tilesHigh; + } + map->tileStart = tileStart * 2; + } else if (map->mapParser == mapParser2) { + sysconfig = mMapCacheSystemInfoSetPaletteBPP(sysconfig, 3); + sysconfig = mMapCacheSystemInfoSetPaletteCount(sysconfig, 0); + sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 256); + sysconfig = mMapCacheSystemInfoSetMapAlign(sysconfig, 0); + + tilesHigh = 4 + size; + tilesWide = 4 + size; + map->tileStart = tileStart; + } + sysconfig = mMapCacheSystemInfoSetTilesHigh(sysconfig, tilesHigh); + sysconfig = mMapCacheSystemInfoSetTilesWide(sysconfig, tilesWide); + mMapCacheConfigureSystem(map, sysconfig); +} + +void GBAVideoCacheWriteVideoRegister(struct mCacheSet* cache, uint32_t address, uint16_t value) { + switch (address) { + case REG_DISPCNT: + GBAVideoCacheWriteDISPCNT(cache, value); + break; + case REG_BG0CNT: + GBAVideoCacheWriteBGCNT(cache, 0, value); + break; + case REG_BG1CNT: + GBAVideoCacheWriteBGCNT(cache, 1, value); + break; + case REG_BG2CNT: + GBAVideoCacheWriteBGCNT(cache, 2, value); + break; + case REG_BG3CNT: + GBAVideoCacheWriteBGCNT(cache, 3, value); + break; + + } +} diff --git a/src/gba/renderers/tile-cache.c b/src/gba/renderers/tile-cache.c deleted file mode 100644 index 20e24849a..000000000 --- a/src/gba/renderers/tile-cache.c +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2013-2016 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include - -#include -#include - -void GBAVideoTileCacheInit(struct mTileCache* cache) { - mTileCacheInit(cache); - mTileCacheConfiguration config = 0; - config = mTileCacheSystemInfoSetPalette0BPP(config, 2); // 2^(2^2) = 16 entries - config = mTileCacheSystemInfoSetPalette0Count(config, 5); // 32 palettes - config = mTileCacheSystemInfoSetPalette1BPP(config, 3); // 2^(2^3) = 256 entries - config = mTileCacheSystemInfoSetPalette1Count(config, 1); // 2 palettes - config = mTileCacheSystemInfoSetMaxTiles(config, 3072); - mTileCacheConfigureSystem(cache, config); -} - -void GBAVideoTileCacheAssociate(struct mTileCache* cache, struct GBAVideo* video) { - cache->vram = video->vram; - cache->palette = video->palette; - video->renderer->cache = cache; -} diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index ab1552500..bd8afc88e 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -5,9 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "gba/renderers/software-private.h" -#include +#include #include #include +#include #include #include @@ -149,6 +150,10 @@ static void GBAVideoSoftwareRendererDeinit(struct GBAVideoRenderer* renderer) { static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; + if (renderer->cache) { + GBAVideoCacheWriteVideoRegister(renderer->cache, address, value); + } + switch (address) { case REG_DISPCNT: softwareRenderer->dispcnt = value; @@ -381,7 +386,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender static void GBAVideoSoftwareRendererWriteVRAM(struct GBAVideoRenderer* renderer, uint32_t address) { struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; if (renderer->cache) { - mTileCacheWriteVRAM(renderer->cache, address); + mCacheSetWriteVRAM(renderer->cache, address); } memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); } @@ -403,7 +408,7 @@ static void GBAVideoSoftwareRendererWritePalette(struct GBAVideoRenderer* render softwareRenderer->variantPalette[address >> 1] = _darken(color, softwareRenderer->bldy); } if (renderer->cache) { - mTileCacheWritePalette(renderer->cache, address); + mCacheSetWritePalette(renderer->cache, address >> 1, color); } memset(softwareRenderer->scanlineDirty, 0xFFFFFFFF, sizeof(softwareRenderer->scanlineDirty)); } diff --git a/src/gba/video.c b/src/gba/video.c index 87af353d1..96ee7f269 100644 --- a/src/gba/video.c +++ b/src/gba/video.c @@ -6,11 +6,12 @@ #include #include -#include +#include #include #include #include #include +#include #include #include @@ -214,7 +215,9 @@ static void GBAVideoDummyRendererDeinit(struct GBAVideoRenderer* renderer) { } static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { - UNUSED(renderer); + if (renderer->cache) { + GBAVideoCacheWriteVideoRegister(renderer->cache, address, value); + } switch (address) { case REG_BG0CNT: case REG_BG1CNT: @@ -252,14 +255,13 @@ static uint16_t GBAVideoDummyRendererWriteVideoRegister(struct GBAVideoRenderer* static void GBAVideoDummyRendererWriteVRAM(struct GBAVideoRenderer* renderer, uint32_t address) { if (renderer->cache) { - mTileCacheWriteVRAM(renderer->cache, address); + mCacheSetWriteVRAM(renderer->cache, address); } } static void GBAVideoDummyRendererWritePalette(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { - UNUSED(value); if (renderer->cache) { - mTileCacheWritePalette(renderer->cache, address); + mCacheSetWritePalette(renderer->cache, address >> 1, mColorFrom555(value)); } } diff --git a/src/platform/python/_builder.h b/src/platform/python/_builder.h index 2dc4f7b5a..9476a37dc 100644 --- a/src/platform/python/_builder.h +++ b/src/platform/python/_builder.h @@ -31,7 +31,7 @@ void free(void*); #include #include -#include +#include #include #include @@ -49,13 +49,13 @@ void free(void*); #include #include #include -#include +#include #endif #ifdef M_CORE_GB #include #include #include -#include +#include #endif #ifdef USE_DEBUGGERS #include diff --git a/src/platform/python/_builder.py b/src/platform/python/_builder.py index 669473e90..abb7ac305 100644 --- a/src/platform/python/_builder.py +++ b/src/platform/python/_builder.py @@ -24,17 +24,17 @@ ffi.set_source("mgba._pylib", """ #include #include #include -#include +#include #include #include #include #include #include #include -#include +#include #include #include -#include +#include #include #include diff --git a/src/platform/qt/AssetTile.cpp b/src/platform/qt/AssetTile.cpp index c82ffe424..452829f85 100644 --- a/src/platform/qt/AssetTile.cpp +++ b/src/platform/qt/AssetTile.cpp @@ -41,7 +41,7 @@ AssetTile::AssetTile(QWidget* parent) } void AssetTile::setController(std::shared_ptr controller) { - m_tileCache = controller->tileCache(); + m_cacheSet = controller->graphicCaches(); switch (controller->platform()) { #ifdef M_CORE_GBA case PLATFORM_GBA: @@ -70,39 +70,32 @@ void AssetTile::setPalette(int palette) { selectIndex(m_index); } -void AssetTile::setPaletteSet(int palette, int boundary, int max) { - m_index = m_index * (1 + m_paletteSet) / (1 + palette); - if (m_index >= max) { - m_index = max - 1; - } +void AssetTile::setBoundary(int boundary, int set0, int set1) { m_boundary = boundary; - m_paletteSet = palette; - selectIndex(m_index); + m_tileCaches[0] = mTileCacheSetGetPointer(&m_cacheSet->tiles, set0); + m_tileCaches[1] = mTileCacheSetGetPointer(&m_cacheSet->tiles, set1); } void AssetTile::selectIndex(int index) { m_index = index; - const uint16_t* data; + const color_t* data; + mTileCache* tileCache = m_tileCaches[index >= m_boundary]; - mTileCacheSetPalette(m_tileCache, m_paletteSet); - unsigned bpp = 8 << m_tileCache->bpp; - int dispIndex = index; + unsigned bpp = 8 << tileCache->bpp; int paletteId = m_paletteId; int base = m_addressBase; if (index >= m_boundary) { base = m_boundaryBase; - // XXX: Do this better -#ifdef M_CORE_GBA - if (m_boundaryBase == (BASE_VRAM | 0x10000)) { - paletteId += m_tileCache->count / 2; - } -#endif - dispIndex -= m_boundary; + index -= m_boundary; } - data = mTileCacheGetTile(m_tileCache, index, paletteId); - m_ui.tileId->setText(QString::number(dispIndex * (1 + m_paletteSet))); + int dispIndex = index; + if (m_addressWidth == 4 && index >= m_boundary / 2) { + dispIndex -= m_boundary / 2; + } + data = mTileCacheGetTile(tileCache, index, paletteId); + m_ui.tileId->setText(QString::number(dispIndex)); m_ui.address->setText(tr("%0%1%2") - .arg(m_addressWidth == 4 ? index >= m_boundary : 0) + .arg(m_addressWidth == 4 ? index >= m_boundary / 2 : 0) .arg(m_addressWidth == 4 ? ":" : "x") .arg(dispIndex * bpp | base, m_addressWidth, 16, QChar('0'))); for (int i = 0; i < 64; ++i) { @@ -112,24 +105,18 @@ void AssetTile::selectIndex(int index) { } void AssetTile::selectColor(int index) { - const uint16_t* data; - mTileCacheSetPalette(m_tileCache, m_paletteSet); - unsigned bpp = 8 << m_tileCache->bpp; + const color_t* data; + mTileCache* tileCache = m_tileCaches[m_index >= m_boundary]; + unsigned bpp = 8 << tileCache->bpp; int paletteId = m_paletteId; - // XXX: Do this better -#ifdef M_CORE_GBA - if (m_index >= m_boundary && m_boundaryBase == (BASE_VRAM | 0x10000)) { - paletteId += m_tileCache->count / 2; - } -#endif - data = mTileCacheGetTile(m_tileCache, m_index, m_paletteId); - uint16_t color = data[index]; + data = mTileCacheGetTile(tileCache, m_index, m_paletteId); + color_t color = data[index]; m_ui.color->setColor(0, color); m_ui.color->update(); - uint32_t r = M_R5(color); - uint32_t g = M_G5(color); - uint32_t b = M_B5(color); + uint32_t r = color & 0xF8; + uint32_t g = (color >> 8) & 0xF8; + uint32_t b = (color >> 16) & 0xF8; m_ui.r->setText(tr("0x%0 (%1)").arg(r, 2, 16, QChar('0')).arg(r, 2, 10, QChar('0'))); m_ui.g->setText(tr("0x%0 (%1)").arg(g, 2, 16, QChar('0')).arg(g, 2, 10, QChar('0'))); m_ui.b->setText(tr("0x%0 (%1)").arg(b, 2, 16, QChar('0')).arg(b, 2, 10, QChar('0'))); diff --git a/src/platform/qt/AssetTile.h b/src/platform/qt/AssetTile.h index 742a8e85f..dbe6acf57 100644 --- a/src/platform/qt/AssetTile.h +++ b/src/platform/qt/AssetTile.h @@ -9,7 +9,7 @@ #include -#include +#include namespace QGBA { @@ -24,16 +24,16 @@ public: public slots: void setPalette(int); - void setPaletteSet(int, int boundary, int max); + void setBoundary(int boundary, int set0, int set1); void selectIndex(int); void selectColor(int); private: Ui::AssetTile m_ui; - mTileCache* m_tileCache; + mCacheSet* m_cacheSet; + mTileCache* m_tileCaches[2]; int m_paletteId = 0; - int m_paletteSet = 0; int m_index = 0; int m_addressWidth; diff --git a/src/platform/qt/AssetView.cpp b/src/platform/qt/AssetView.cpp index 5ad124ad4..2f48cce32 100644 --- a/src/platform/qt/AssetView.cpp +++ b/src/platform/qt/AssetView.cpp @@ -13,7 +13,7 @@ using namespace QGBA; AssetView::AssetView(std::shared_ptr controller, QWidget* parent) : QWidget(parent) - , m_tileCache(controller->tileCache()) + , m_cacheSet(controller->graphicCaches()) , m_controller(controller) { m_updateTimer.setSingleShot(true); @@ -55,8 +55,8 @@ void AssetView::showEvent(QShowEvent*) { updateTiles(true); } -void AssetView::compositeTile(unsigned tileId, void* buffer, size_t stride, size_t x, size_t y, int depth) { - const uint8_t* tile = mTileCacheGetRawTile(m_tileCache, tileId); +void AssetView::compositeTile(const void* tBuffer, void* buffer, size_t stride, size_t x, size_t y, int depth) { + const uint8_t* tile = static_cast(tBuffer); uint8_t* pixels = static_cast(buffer); size_t base = stride * y + x; switch (depth) { diff --git a/src/platform/qt/AssetView.h b/src/platform/qt/AssetView.h index ed837cd5f..a95483c5e 100644 --- a/src/platform/qt/AssetView.h +++ b/src/platform/qt/AssetView.h @@ -8,7 +8,7 @@ #include #include -#include +#include #include @@ -22,7 +22,7 @@ Q_OBJECT public: AssetView(std::shared_ptr controller, QWidget* parent = nullptr); - void compositeTile(unsigned tileId, void* image, size_t stride, size_t x, size_t y, int depth = 8); + static void compositeTile(const void* tile, void* image, size_t stride, size_t x, size_t y, int depth = 8); protected slots: void updateTiles(); @@ -39,7 +39,7 @@ protected: void resizeEvent(QResizeEvent*) override; void showEvent(QShowEvent*) override; - mTileCache* const m_tileCache; + mCacheSet* const m_cacheSet; private: std::shared_ptr m_controller; diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 7c4b837f0..d7020a2d5 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -18,12 +18,12 @@ #include #ifdef M_CORE_GBA #include -#include +#include #include #endif #ifdef M_CORE_GB #include -#include +#include #endif #include #include @@ -186,9 +186,9 @@ CoreController::~CoreController() { stop(); disconnect(); - if (m_tileCache) { - mTileCacheDeinit(m_tileCache.get()); - m_tileCache.reset(); + if (m_cacheSet) { + mCacheSetDeinit(m_cacheSet.get()); + m_cacheSet.reset(); } mCoreThreadJoin(&m_threadContext); @@ -268,36 +268,34 @@ void CoreController::clearMultiplayerController() { m_multiplayer = nullptr; } -mTileCache* CoreController::tileCache() { - if (m_tileCache) { - return m_tileCache.get(); +mCacheSet* CoreController::graphicCaches() { + if (m_cacheSet) { + return m_cacheSet.get(); } Interrupter interrupter(this); switch (platform()) { #ifdef M_CORE_GBA case PLATFORM_GBA: { GBA* gba = static_cast(m_threadContext.core->board); - m_tileCache = std::make_unique(); - GBAVideoTileCacheInit(m_tileCache.get()); - GBAVideoTileCacheAssociate(m_tileCache.get(), &gba->video); - mTileCacheSetPalette(m_tileCache.get(), 0); + m_cacheSet = std::make_unique(); + GBAVideoCacheInit(m_cacheSet.get()); + GBAVideoCacheAssociate(m_cacheSet.get(), &gba->video); break; } #endif #ifdef M_CORE_GB case PLATFORM_GB: { GB* gb = static_cast(m_threadContext.core->board); - m_tileCache = std::make_unique(); - GBVideoTileCacheInit(m_tileCache.get()); - GBVideoTileCacheAssociate(m_tileCache.get(), &gb->video); - mTileCacheSetPalette(m_tileCache.get(), 0); + m_cacheSet = std::make_unique(); + GBVideoCacheInit(m_cacheSet.get()); + GBVideoCacheAssociate(m_cacheSet.get(), &gb->video); break; } #endif default: return nullptr; } - return m_tileCache.get(); + return m_cacheSet.get(); } void CoreController::setOverride(std::unique_ptr override) { diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 1bbde57a7..c426aa483 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include #ifdef M_CORE_GB #include @@ -78,7 +78,7 @@ public: void clearMultiplayerController(); MultiplayerController* multiplayerController() { return m_multiplayer; } - mTileCache* tileCache(); + mCacheSet* graphicCaches(); int stateSlot() const { return m_stateSlot; } void setOverride(std::unique_ptr override); @@ -173,7 +173,7 @@ private: QByteArray* m_activeBuffer; QByteArray* m_completeBuffer = nullptr; - std::unique_ptr m_tileCache; + std::unique_ptr m_cacheSet; std::unique_ptr m_override; QList> m_resetActions; diff --git a/src/platform/qt/ObjView.cpp b/src/platform/qt/ObjView.cpp index 7201b80bc..99220b543 100644 --- a/src/platform/qt/ObjView.cpp +++ b/src/platform/qt/ObjView.cpp @@ -64,7 +64,7 @@ void ObjView::selectObj(int obj) { void ObjView::translateIndex(int index) { unsigned x = index % m_objInfo.width; unsigned y = index / m_objInfo.width; - m_ui.tile->selectIndex(x + y * m_objInfo.stride + m_tileOffset); + m_ui.tile->selectIndex(x + y * m_objInfo.stride + m_tileOffset + m_boundary); } #ifdef M_CORE_GBA @@ -87,19 +87,19 @@ void ObjView::updateTilesGBA(bool force) { unsigned bits; if (GBAObjAttributesAIs256Color(obj->a)) { m_ui.palette->setText("256-color"); - paletteSet = 1; + paletteSet = 3; + m_ui.tile->setBoundary(1024, 1, 3); m_ui.tile->setPalette(0); - m_ui.tile->setPaletteSet(1, 1024, 1536); - palette = 1; - tile = tile / 2 + 1024; + m_boundary = 1024; + palette = 0; + tile /= 2; bits = 8; } else { m_ui.palette->setText(QString::number(palette)); - paletteSet = 0; + paletteSet = 2; + m_ui.tile->setBoundary(2048, 0, 2); m_ui.tile->setPalette(palette); - m_ui.tile->setPaletteSet(0, 2048, 3072); - palette += 16; - tile += 2048; + m_boundary = 2048; bits = 4; } ObjInfo newInfo{ @@ -120,16 +120,16 @@ void ObjView::updateTilesGBA(bool force) { }; m_objInfo = newInfo; m_tileOffset = tile; - mTileCacheSetPalette(m_tileCache, paletteSet); + mTileCache* tileCache = mTileCacheSetGetPointer(&m_cacheSet->tiles, paletteSet); int i = 0; for (int y = 0; y < height / 8; ++y) { for (int x = 0; x < width / 8; ++x, ++i, ++tile, ++tileBase) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache, &m_tileStatus[32 * tileBase], tile, palette); + const color_t* data = mTileCacheGetTileIfDirty(tileCache, &m_tileStatus[16 * tileBase], tile, palette); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache, tile, palette)); + m_ui.tiles->setTile(i, mTileCacheGetTile(tileCache, tile, palette)); } } tile += newInfo.stride - width / 8; @@ -178,6 +178,7 @@ void ObjView::updateTilesGB(bool force) { const GB* gb = static_cast(m_controller->thread()->core->board); const GBObj* obj = &gb->video.oam.obj[m_objId]; + mTileCache* tileCache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0); unsigned width = 8; unsigned height = 8; GBRegisterLCDC lcdc = gb->memory.io[REG_LCDC]; @@ -186,6 +187,7 @@ void ObjView::updateTilesGB(bool force) { } unsigned tile = obj->tile; m_ui.tiles->setTileCount(width * height / 64); + m_ui.tile->setBoundary(1024, 0, 0); m_ui.tiles->setMinimumSize(QSize(width, height) * m_ui.magnification->value()); m_ui.tiles->resize(QSize(width, height) * m_ui.magnification->value()); unsigned palette = 0; @@ -214,18 +216,17 @@ void ObjView::updateTilesGB(bool force) { } m_objInfo = newInfo; m_tileOffset = tile; + m_boundary = 1024; int i = 0; - mTileCacheSetPalette(m_tileCache, 0); m_ui.tile->setPalette(palette); - m_ui.tile->setPaletteSet(0, 512, 1024); for (int y = 0; y < height / 8; ++y, ++i) { unsigned t = tile + i; - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache, &m_tileStatus[16 * t], t, palette); + const color_t* data = mTileCacheGetTileIfDirty(tileCache, &m_tileStatus[8 * t], t, palette); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache, t, palette)); + m_ui.tiles->setTile(i, mTileCacheGetTile(tileCache, t, palette)); } } @@ -257,21 +258,17 @@ void ObjView::exportObj() { } CoreController::Interrupter interrupter(m_controller); - mTileCacheSetPalette(m_tileCache, m_objInfo.paletteSet); png_structp png = PNGWriteOpen(vf); png_infop info = PNGWriteHeader8(png, m_objInfo.width * 8, m_objInfo.height * 8); - const uint16_t* rawPalette = mTileCacheGetPalette(m_tileCache, m_objInfo.paletteId); + mTileCache* tileCache = mTileCacheSetGetPointer(&m_cacheSet->tiles, m_objInfo.paletteSet); + const color_t* rawPalette = mTileCacheGetPalette(tileCache, m_objInfo.paletteId); unsigned colors = 1 << m_objInfo.bits; uint32_t palette[256]; - for (unsigned c = 0; c < colors && c < 256; ++c) { - uint16_t color = rawPalette[c]; - palette[c] = M_R8(rawPalette[c]); - palette[c] |= M_G8(rawPalette[c]) << 8; - palette[c] |= M_B8(rawPalette[c]) << 16; - if (c) { - palette[c] |= 0xFF000000; - } + + palette[0] = rawPalette[0]; + for (unsigned c = 1; c < colors && c < 256; ++c) { + palette[c] = rawPalette[c] | 0xFF000000; } PNGWritePalette(png, info, palette, colors); @@ -279,7 +276,7 @@ void ObjView::exportObj() { unsigned t = m_objInfo.tile; for (int y = 0; y < m_objInfo.height; ++y) { for (int x = 0; x < m_objInfo.width; ++x, ++t) { - compositeTile(t, static_cast(buffer), m_objInfo.width * 8, x * 8, y * 8, m_objInfo.bits); + compositeTile(static_cast(mTileCacheGetVRAM(tileCache, t)), reinterpret_cast(buffer), m_objInfo.width * 8, x * 8, y * 8, m_objInfo.bits); } t += m_objInfo.stride - m_objInfo.width; } diff --git a/src/platform/qt/ObjView.h b/src/platform/qt/ObjView.h index f5b628fb1..41677ca92 100644 --- a/src/platform/qt/ObjView.h +++ b/src/platform/qt/ObjView.h @@ -56,6 +56,7 @@ private: } m_objInfo = {}; int m_tileOffset; + int m_boundary; }; } diff --git a/src/platform/qt/Swatch.cpp b/src/platform/qt/Swatch.cpp index 111245413..366b981bb 100644 --- a/src/platform/qt/Swatch.cpp +++ b/src/platform/qt/Swatch.cpp @@ -42,6 +42,14 @@ void Swatch::setColor(int index, uint16_t color) { updateFill(index); } +void Swatch::setColor(int index, uint32_t color) { + m_colors[index].setRgb( + (color >> 0) & 0xFF, + (color >> 8) & 0xFF, + (color >> 16) & 0xFF); + updateFill(index); +} + void Swatch::paintEvent(QPaintEvent* event) { QPainter painter(this); painter.drawPixmap(QPoint(), m_backing); diff --git a/src/platform/qt/Swatch.h b/src/platform/qt/Swatch.h index 971a620b5..c92010d99 100644 --- a/src/platform/qt/Swatch.h +++ b/src/platform/qt/Swatch.h @@ -22,6 +22,7 @@ public: public slots: void setColor(int index, uint16_t); + void setColor(int index, uint32_t); signals: void indexPressed(int index); diff --git a/src/platform/qt/TilePainter.cpp b/src/platform/qt/TilePainter.cpp index a2d99d4af..454530a7c 100644 --- a/src/platform/qt/TilePainter.cpp +++ b/src/platform/qt/TilePainter.cpp @@ -40,14 +40,15 @@ void TilePainter::mousePressEvent(QMouseEvent* event) { emit indexPressed(y * (width() / m_size) + x); } -void TilePainter::setTile(int index, const uint16_t* data) { +void TilePainter::setTile(int index, const color_t* data) { QPainter painter(&m_backing); int w = width() / m_size; int x = index % w; int y = index / w; QRect r(x * m_size, y * m_size, m_size, m_size); - QImage tile(reinterpret_cast(data), 8, 8, QImage::Format_RGB555); - painter.drawImage(r, tile.rgbSwapped()); + QImage tile(reinterpret_cast(data), 8, 8, QImage::Format_ARGB32); + tile = tile.convertToFormat(QImage::Format_RGB32).rgbSwapped(); + painter.drawImage(r, tile); update(r); } diff --git a/src/platform/qt/TilePainter.h b/src/platform/qt/TilePainter.h index 532db6565..7cd4c30bb 100644 --- a/src/platform/qt/TilePainter.h +++ b/src/platform/qt/TilePainter.h @@ -9,6 +9,8 @@ #include #include +#include + namespace QGBA { class TilePainter : public QWidget { @@ -18,7 +20,7 @@ public: TilePainter(QWidget* parent = nullptr); public slots: - void setTile(int index, const uint16_t*); + void setTile(int index, const color_t*); void setTileCount(int tiles); void setTileMagnification(int mag); diff --git a/src/platform/qt/TileView.cpp b/src/platform/qt/TileView.cpp index be8df4b15..2f7a3e4b4 100644 --- a/src/platform/qt/TileView.cpp +++ b/src/platform/qt/TileView.cpp @@ -27,38 +27,30 @@ TileView::TileView(std::shared_ptr controller, QWidget* parent) connect(m_ui.tiles, &TilePainter::indexPressed, m_ui.tile, &AssetTile::selectIndex); connect(m_ui.paletteId, &QAbstractSlider::valueChanged, this, &TileView::updatePalette); - int max = 1024; - int boundary = 1024; switch (m_controller->platform()) { #ifdef M_CORE_GBA case PLATFORM_GBA: - max = 3072; - boundary = 2048; + m_ui.tile->setBoundary(2048, 0, 2); break; #endif #ifdef M_CORE_GB case PLATFORM_GB: - max = 1024; - boundary = 512; m_ui.palette256->setEnabled(false); + m_ui.tile->setBoundary(1024, 0, 0); break; #endif default: return; } - m_ui.tile->setPaletteSet(0, boundary, max); connect(m_ui.palette256, &QAbstractButton::toggled, [this](bool selected) { if (selected) { m_ui.paletteId->setValue(0); } - int max = 1024; - int boundary = 1024; switch (m_controller->platform()) { #ifdef M_CORE_GBA case PLATFORM_GBA: - max = 3072 >> selected; - boundary = 2048 >> selected; + m_ui.tile->setBoundary(2048 >> selected, selected, selected + 2); break; #endif #ifdef M_CORE_GB @@ -68,7 +60,6 @@ TileView::TileView(std::shared_ptr controller, QWidget* parent) default: break; } - m_ui.tile->setPaletteSet(selected, boundary, max); updateTiles(true); }); connect(m_ui.magnification, static_cast(&QSpinBox::valueChanged), [this]() { @@ -80,40 +71,42 @@ TileView::TileView(std::shared_ptr controller, QWidget* parent) void TileView::updateTilesGBA(bool force) { if (m_ui.palette256->isChecked()) { m_ui.tiles->setTileCount(1536); - mTileCacheSetPalette(m_tileCache, 1); + mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 1); for (int i = 0; i < 1024; ++i) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache, &m_tileStatus[32 * i], i, 0); + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, 0); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache, i, 0)); + m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, 0)); } } + cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 3); for (int i = 1024; i < 1536; ++i) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache, &m_tileStatus[32 * i], i, 1); + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 1024, 0); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache, i, 1)); + m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 1024, 0)); } } } else { + mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0); m_ui.tiles->setTileCount(3072); - mTileCacheSetPalette(m_tileCache, 0); for (int i = 0; i < 2048; ++i) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache, &m_tileStatus[32 * i], i, m_paletteId); + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, m_paletteId); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache, i, m_paletteId)); + m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId)); } } + cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 2); for (int i = 2048; i < 3072; ++i) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache, &m_tileStatus[32 * i], i, m_paletteId + 16); + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 2048, m_paletteId); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache, i, m_paletteId + 16)); + m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 2048, m_paletteId)); } } } @@ -125,13 +118,13 @@ void TileView::updateTilesGB(bool force) { const GB* gb = static_cast(m_controller->thread()->core->board); int count = gb->model >= GB_MODEL_CGB ? 1024 : 512; m_ui.tiles->setTileCount(count); - mTileCacheSetPalette(m_tileCache, 0); + mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0); for (int i = 0; i < count; ++i) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache, &m_tileStatus[16 * i], i, m_paletteId); + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[8 * i], i, m_paletteId); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache, i, m_paletteId)); + m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId)); } } } From c6f0d6c5dbb9c77047439fdea8f7b2e28e207428 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 10:03:30 -0700 Subject: [PATCH 125/158] Core: Still quite buggy map cache --- include/mgba/core/map-cache.h | 6 +- src/core/map-cache.c | 108 ++++++++++++++++++++++++++-------- src/gba/renderers/cache-set.c | 19 +++--- 3 files changed, 102 insertions(+), 31 deletions(-) diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h index 60a380f00..5a2c61b45 100644 --- a/include/mgba/core/map-cache.h +++ b/include/mgba/core/map-cache.h @@ -11,6 +11,7 @@ CXX_GUARD_START #include +#include DECL_BITFIELD(mMapCacheConfiguration, uint32_t); DECL_BIT(mMapCacheConfiguration, ShouldStore, 0); @@ -28,11 +29,13 @@ DECL_BITS(mMapCacheEntryFlags, PaletteId, 0, 4); DECL_BIT(mMapCacheEntryFlags, VramClean, 4); DECL_BIT(mMapCacheEntryFlags, HMirror, 5); DECL_BIT(mMapCacheEntryFlags, VMirror, 6); +DECL_BITS(mMapCacheEntryFlags, Mirror, 5, 2); struct mMapCacheEntry { uint32_t vramVersion; uint16_t tileId; mMapCacheEntryFlags flags; + struct mTileCacheEntry tileStatus[16]; }; struct mTileCache; @@ -40,7 +43,6 @@ struct mTileCacheEntry; struct mMapCache { color_t* cache; struct mTileCache* tileCache; - struct mTileCacheEntry* tileEntries; struct mMapCacheEntry* status; uint8_t* vram; @@ -66,6 +68,8 @@ void mMapCacheWriteVRAM(struct mMapCache* cache, uint32_t address); bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y); void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y); +const color_t* mMapCacheGetRow(struct mMapCache* cache, unsigned y); + CXX_GUARD_END #endif diff --git a/src/core/map-cache.c b/src/core/map-cache.c index 4646609dc..ec59b3ce0 100644 --- a/src/core/map-cache.c +++ b/src/core/map-cache.c @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include -#include #include void mMapCacheInit(struct mMapCache* cache) { @@ -34,12 +33,18 @@ static void _redoCacheSize(struct mMapCache* cache) { } void mMapCacheConfigure(struct mMapCache* cache, mMapCacheConfiguration config) { + if (config == cache->config) { + return; + } _freeCache(cache); cache->config = config; _redoCacheSize(cache); } void mMapCacheConfigureSystem(struct mMapCache* cache, mMapCacheSystemInfo config) { + if (config == cache->sysConfig) { + return; + } _freeCache(cache); cache->sysConfig = config; _redoCacheSize(cache); @@ -60,37 +65,94 @@ void mMapCacheDeinit(struct mMapCache* cache) { void mMapCacheWriteVRAM(struct mMapCache* cache, uint32_t address) { if (address >= cache->mapStart && address < cache->mapStart + cache->mapSize) { - address >>= mMapCacheSystemInfoGetMapAlign(cache->sysConfig); - ++cache->status[address].vramVersion; - cache->status[address].flags = mMapCacheEntryFlagsClearVramClean(cache->status[address].flags); + address -= cache->mapStart; + struct mMapCacheEntry* status = &cache->status[address >> mMapCacheSystemInfoGetMapAlign(cache->sysConfig)]; + ++status->vramVersion; + status->flags = mMapCacheEntryFlagsClearVramClean(status->flags); + status->tileStatus[mMapCacheEntryFlagsGetPaletteId(status->flags)].vramClean = 0; } } -bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y) { - size_t location = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * y + x; - const struct mMapCacheEntry* status = &cache->status[location]; - return memcmp(status, &entry[location], sizeof(*entry)) == 0; +static inline void _cleanTile(struct mMapCache* cache, const color_t* tile, color_t* mapOut, const struct mMapCacheEntry* status) { + size_t stride = 8 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig); + int x, y; + switch (mMapCacheEntryFlagsGetMirror(status->flags)) { + case 0: + memcpy(mapOut, tile, sizeof(color_t) * 8); + memcpy(&mapOut[stride], &tile[0x08], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 2], &tile[0x10], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 3], &tile[0x18], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 4], &tile[0x20], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 5], &tile[0x28], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 6], &tile[0x30], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 7], &tile[0x38], sizeof(color_t) * 8); + break; + case 1: + for (y = 0; y < 8; ++y) { + for (x = 0; x < 8; ++x) { + mapOut[y * stride + (7 - x)] = tile[y * 8 + x]; + } + } + break; + case 2: + memcpy(&mapOut[stride * 7], tile, sizeof(color_t) * 8); + memcpy(&mapOut[stride * 6], &tile[0x08], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 5], &tile[0x10], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 4], &tile[0x18], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 3], &tile[0x20], sizeof(color_t) * 8); + memcpy(&mapOut[stride * 2], &tile[0x28], sizeof(color_t) * 8); + memcpy(&mapOut[stride], &tile[0x30], sizeof(color_t) * 8); + memcpy(mapOut, &tile[0x38], sizeof(color_t) * 8); + break; + case 3: + for (y = 0; y < 8; ++y) { + for (x = 0; x < 8; ++x) { + mapOut[(7 - y) * stride + (7 - x)] = tile[y * 8 + x]; + } + } + break; + } } void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y) { size_t location = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * y + x; struct mMapCacheEntry* status = &cache->status[location]; - status->flags = mMapCacheEntryFlagsFillVramClean(status->flags); - int align = mMapCacheSystemInfoGetMapAlign(cache->sysConfig); - cache->mapParser(cache, status, &cache->vram[(location << align) + cache->mapStart]); + int paletteId = mMapCacheEntryFlagsGetPaletteId(status->flags); + const color_t* tile = NULL; + if (!mMapCacheEntryFlagsIsVramClean(status->flags)) { + status->flags = mMapCacheEntryFlagsFillVramClean(status->flags); + cache->mapParser(cache, status, &cache->vram[cache->mapStart + (location << mMapCacheSystemInfoGetMapAlign(cache->sysConfig))]); + tile = mTileCacheGetTileIfDirty(cache->tileCache, &status->tileStatus[paletteId], status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + if (!tile) { + tile = mTileCacheGetTile(cache->tileCache, status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + } + } else { + tile = mTileCacheGetTileIfDirty(cache->tileCache, &status->tileStatus[paletteId], status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + if (!tile && memcmp(status, &entry[location], sizeof(*entry)) == 0) { + return; + } + tile = mTileCacheGetTile(cache->tileCache, status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + } - int bytesPerPixel = 1 << mMapCacheSystemInfoGetPaletteBPP(cache->sysConfig); - size_t stride = bytesPerPixel * (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)); + size_t stride = 8 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig); color_t* mapOut = &cache->cache[(y * stride + x) * 8]; - const color_t* tile = mTileCacheGetTileIfDirty(cache->tileCache, cache->tileEntries, status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); - memcpy(mapOut, tile, sizeof(color_t) * 8); - memcpy(&mapOut[stride], &tile[0x08], sizeof(color_t) * 8); - memcpy(&mapOut[stride * 2], &tile[0x10], sizeof(color_t) * 8); - memcpy(&mapOut[stride * 3], &tile[0x18], sizeof(color_t) * 8); - memcpy(&mapOut[stride * 4], &tile[0x20], sizeof(color_t) * 8); - memcpy(&mapOut[stride * 5], &tile[0x28], sizeof(color_t) * 8); - memcpy(&mapOut[stride * 6], &tile[0x30], sizeof(color_t) * 8); - memcpy(&mapOut[stride * 7], &tile[0x38], sizeof(color_t) * 8); - + _cleanTile(cache, tile, mapOut, status); entry[location] = *status; } + +bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y) { + size_t location = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * y + x; + struct mMapCacheEntry* status = &cache->status[location]; + int paletteId = mMapCacheEntryFlagsGetPaletteId(status->flags); + const color_t* tile = NULL; + if (mMapCacheEntryFlagsIsVramClean(status->flags) && memcmp(status, &entry[location], sizeof(*entry)) == 0) { + tile = mTileCacheGetTileIfDirty(cache->tileCache, &status->tileStatus[paletteId], status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + return !tile; + } + return false; +} + +const color_t* mMapCacheGetRow(struct mMapCache* cache, unsigned y) { + size_t stride = 8 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig); + return &cache->cache[y * stride]; +} diff --git a/src/gba/renderers/cache-set.c b/src/gba/renderers/cache-set.c index dd236225b..ae008594d 100644 --- a/src/gba/renderers/cache-set.c +++ b/src/gba/renderers/cache-set.c @@ -49,14 +49,19 @@ void GBAVideoCacheAssociate(struct mCacheSet* cache, struct GBAVideo* video) { for (i = 0; i < SIZE_PALETTE_RAM / 2; ++i) { mCacheSetWritePalette(cache, i, mColorFrom555(video->palette[i])); } + GBAVideoCacheWriteVideoRegister(cache, REG_DISPCNT, video->p->memory.io[REG_DISPCNT >> 1]); + GBAVideoCacheWriteVideoRegister(cache, REG_BG0CNT, video->p->memory.io[REG_BG0CNT >> 1]); + GBAVideoCacheWriteVideoRegister(cache, REG_BG1CNT, video->p->memory.io[REG_BG1CNT >> 1]); + GBAVideoCacheWriteVideoRegister(cache, REG_BG2CNT, video->p->memory.io[REG_BG2CNT >> 1]); + GBAVideoCacheWriteVideoRegister(cache, REG_BG3CNT, video->p->memory.io[REG_BG3CNT >> 1]); } static void mapParser0(struct mMapCache* cache, struct mMapCacheEntry* entry, void* vram) { UNUSED(cache); uint16_t map = *(uint16_t*) vram; entry->tileId = GBA_TEXT_MAP_TILE(map); - entry->flags = mMapCacheEntryFlagsSetHMirror(entry->flags, GBA_TEXT_MAP_HFLIP(map)); - entry->flags = mMapCacheEntryFlagsSetHMirror(entry->flags, GBA_TEXT_MAP_VFLIP(map)); + entry->flags = mMapCacheEntryFlagsSetHMirror(entry->flags, !!GBA_TEXT_MAP_HFLIP(map)); + entry->flags = mMapCacheEntryFlagsSetVMirror(entry->flags, !!GBA_TEXT_MAP_VFLIP(map)); entry->flags = mMapCacheEntryFlagsSetPaletteId(entry->flags, GBA_TEXT_MAP_PALETTE(map)); } @@ -64,7 +69,7 @@ static void mapParser2(struct mMapCache* cache, struct mMapCacheEntry* entry, vo UNUSED(cache); entry->tileId = *(uint8_t*) vram; entry->flags = mMapCacheEntryFlagsClearHMirror(entry->flags); - entry->flags = mMapCacheEntryFlagsClearHMirror(entry->flags); + entry->flags = mMapCacheEntryFlagsClearVMirror(entry->flags); entry->flags = mMapCacheEntryFlagsClearPaletteId(entry->flags); } @@ -89,8 +94,8 @@ static void GBAVideoCacheWriteDISPCNT(struct mCacheSet* cache, uint16_t value) { mMapCacheSetGetPointer(&cache->maps, 2)->mapParser = mapParser2; mMapCacheSetGetPointer(&cache->maps, 3)->mapParser = mapParser2; - mMapCacheSetGetPointer(&cache->maps, 0)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); - mMapCacheSetGetPointer(&cache->maps, 1)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); + mMapCacheSetGetPointer(&cache->maps, 0)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); + mMapCacheSetGetPointer(&cache->maps, 1)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); mMapCacheSetGetPointer(&cache->maps, 2)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); mMapCacheSetGetPointer(&cache->maps, 3)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 1); break; @@ -100,9 +105,8 @@ static void GBAVideoCacheWriteDISPCNT(struct mCacheSet* cache, uint16_t value) { static void GBAVideoCacheWriteBGCNT(struct mCacheSet* cache, size_t bg, uint16_t value) { struct mMapCache* map = mMapCacheSetGetPointer(&cache->maps, bg); - int tileStart = GBARegisterBGCNTGetCharBase(value) * 128; + int tileStart = GBARegisterBGCNTGetCharBase(value) * 256; bool p = GBARegisterBGCNTGet256Color(value); - mMapCacheConfigureMap(map, GBARegisterBGCNTGetScreenBase(value) << 11); int size = GBARegisterBGCNTGetSize(value); int tilesWide = 0; int tilesHigh = 0; @@ -134,6 +138,7 @@ static void GBAVideoCacheWriteBGCNT(struct mCacheSet* cache, size_t bg, uint16_t sysconfig = mMapCacheSystemInfoSetTilesHigh(sysconfig, tilesHigh); sysconfig = mMapCacheSystemInfoSetTilesWide(sysconfig, tilesWide); mMapCacheConfigureSystem(map, sysconfig); + mMapCacheConfigureMap(map, GBARegisterBGCNTGetScreenBase(value) << 11); } void GBAVideoCacheWriteVideoRegister(struct mCacheSet* cache, uint32_t address, uint16_t value) { From 2c59cb8211c4bf46665d12ed174cf7efe512e0d0 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 10:04:19 -0700 Subject: [PATCH 126/158] Qt: Initial map cache UI --- src/platform/qt/CMakeLists.txt | 2 + src/platform/qt/MapView.cpp | 65 +++++++++++++++++++++ src/platform/qt/MapView.h | 38 +++++++++++++ src/platform/qt/MapView.ui | 101 +++++++++++++++++++++++++++++++++ src/platform/qt/Window.cpp | 8 ++- 5 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 src/platform/qt/MapView.cpp create mode 100644 src/platform/qt/MapView.h create mode 100644 src/platform/qt/MapView.ui diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 239413635..8b4a823a2 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -85,6 +85,7 @@ set(SOURCE_FILES LoadSaveState.cpp LogController.cpp LogView.cpp + MapView.cpp MemoryModel.cpp MemorySearch.cpp MemoryView.cpp @@ -119,6 +120,7 @@ set(UI_FILES IOViewer.ui LoadSaveState.ui LogView.ui + MapView.ui MemorySearch.ui MemoryView.ui ObjView.ui diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp new file mode 100644 index 000000000..bd70ac164 --- /dev/null +++ b/src/platform/qt/MapView.cpp @@ -0,0 +1,65 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "MapView.h" + +#include "CoreController.h" +#include "GBAApp.h" + +#include +#include + +using namespace QGBA; + +MapView::MapView(std::shared_ptr controller, QWidget* parent) + : AssetView(controller, parent) + , m_controller(controller) +{ + m_ui.setupUi(this); + m_ui.tile->setController(controller); + + switch (m_controller->platform()) { +#ifdef M_CORE_GBA + case PLATFORM_GBA: + m_ui.tile->setBoundary(2048, 0, 2); + break; +#endif +#ifdef M_CORE_GB + case PLATFORM_GB: + m_ui.tile->setBoundary(1024, 0, 0); + break; +#endif + default: + return; + } + + connect(m_ui.magnification, static_cast(&QSpinBox::valueChanged), [this]() { + updateTiles(true); + }); +} + +#ifdef M_CORE_GBA +void MapView::updateTilesGBA(bool force) { + QImage bg(QSize(256, 256), QImage::Format_ARGB32); + uchar* bgBits = bg.bits(); + mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, 0); + for (int j = 0; j < 32; ++j) { + for (int i = 0; i < 32; ++i) { + mMapCacheCleanTile(mapCache, &m_mapStatus[i + j * 32], i, j); + } + for (int i = 0; i < 8; ++i) { + memcpy(static_cast(&bgBits[256 * 4 * (i + j * 8)]), mMapCacheGetRow(mapCache, i + j * 8), 256 * 4); + } + } + bg = bg.convertToFormat(QImage::Format_RGB32).rgbSwapped(); + m_ui.map->setPixmap(QPixmap::fromImage(bg)); +} +#endif + +#ifdef M_CORE_GB +void MapView::updateTilesGB(bool force) { +} +#endif + diff --git a/src/platform/qt/MapView.h b/src/platform/qt/MapView.h new file mode 100644 index 000000000..affc5d4bf --- /dev/null +++ b/src/platform/qt/MapView.h @@ -0,0 +1,38 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#pragma once + +#include "AssetView.h" + +#include "ui_MapView.h" + +#include + +namespace QGBA { + +class CoreController; + +class MapView : public AssetView { +Q_OBJECT + +public: + MapView(std::shared_ptr controller, QWidget* parent = nullptr); + +private: +#ifdef M_CORE_GBA + void updateTilesGBA(bool force) override; +#endif +#ifdef M_CORE_GB + void updateTilesGB(bool force) override; +#endif + + Ui::MapView m_ui; + + std::shared_ptr m_controller; + mMapCacheEntry m_mapStatus[1024 * 1024] = {}; // TODO: Correct size +}; + +} diff --git a/src/platform/qt/MapView.ui b/src/platform/qt/MapView.ui new file mode 100644 index 000000000..683c6a611 --- /dev/null +++ b/src/platform/qt/MapView.ui @@ -0,0 +1,101 @@ + + + MapView + + + + 0 + 0 + 498 + 335 + + + + Maps + + + + + + + + + true + + + + + 0 + 0 + 314 + 309 + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + + + + × + + + 1 + + + 4 + + + + + + + Magnification + + + + + + + + + + QGBA::AssetTile + QGroupBox +

    AssetTile.h
    + 1 + + + + + diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index dbc3d915e..1b6232a00 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -35,9 +35,10 @@ #include "IOViewer.h" #include "LoadSaveState.h" #include "LogView.h" -#include "MultiplayerController.h" +#include "MapView.h" #include "MemorySearch.h" #include "MemoryView.h" +#include "MultiplayerController.h" #include "OverrideView.h" #include "ObjView.h" #include "PaletteView.h" @@ -1491,6 +1492,11 @@ void Window::setupMenu(QMenuBar* menubar) { m_gameActions.append(tileView); addControlledAction(toolsMenu, tileView, "tileWindow"); + QAction* mapView = new QAction(tr("View &map..."), toolsMenu); + connect(mapView, &QAction::triggered, openControllerTView()); + m_gameActions.append(mapView); + addControlledAction(toolsMenu, mapView, "mapWindow"); + QAction* memoryView = new QAction(tr("View memory..."), toolsMenu); connect(memoryView, &QAction::triggered, openControllerTView()); m_gameActions.append(memoryView); From 13e1f988c981f6663f6b1d59bdbf4d61036ed5e4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 23:22:58 -0700 Subject: [PATCH 127/158] Core: Start work on wider maps --- src/core/map-cache.c | 19 +++++++++++-- src/gba/renderers/cache-set.c | 2 +- src/platform/qt/MapView.cpp | 52 +++++++++++++++++++++++++++++------ src/platform/qt/MapView.h | 4 +++ src/platform/qt/MapView.ui | 16 +++++++---- 5 files changed, 76 insertions(+), 17 deletions(-) diff --git a/src/core/map-cache.c b/src/core/map-cache.c index ec59b3ce0..3f1f7a007 100644 --- a/src/core/map-cache.c +++ b/src/core/map-cache.c @@ -114,8 +114,23 @@ static inline void _cleanTile(struct mMapCache* cache, const color_t* tile, colo } } +static inline size_t _tileId(struct mMapCache* cache, unsigned x, unsigned y) { + int tilesWide = mMapCacheSystemInfoGetTilesWide(cache->sysConfig); + int tilesHigh = mMapCacheSystemInfoGetTilesHigh(cache->sysConfig); + int stride = tilesHigh < 5 ? (1 << tilesHigh) : 32; + x &= (1 << tilesWide) - 1; + y &= (1 << tilesHigh) - 1; + unsigned xMajor = x & ~0x1F; + unsigned yMajor = y >> 5; + x &= 0x1F; + y &= 0x1F; + yMajor <<= tilesHigh; + y += xMajor + yMajor; + return stride * y + x; +} + void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y) { - size_t location = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * y + x; + size_t location = _tileId(cache, x, y); struct mMapCacheEntry* status = &cache->status[location]; int paletteId = mMapCacheEntryFlagsGetPaletteId(status->flags); const color_t* tile = NULL; @@ -141,7 +156,7 @@ void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, u } bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y) { - size_t location = (1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig)) * y + x; + size_t location = _tileId(cache, x, y); struct mMapCacheEntry* status = &cache->status[location]; int paletteId = mMapCacheEntryFlagsGetPaletteId(status->flags); const color_t* tile = NULL; diff --git a/src/gba/renderers/cache-set.c b/src/gba/renderers/cache-set.c index ae008594d..395cbbaac 100644 --- a/src/gba/renderers/cache-set.c +++ b/src/gba/renderers/cache-set.c @@ -114,7 +114,7 @@ static void GBAVideoCacheWriteBGCNT(struct mCacheSet* cache, size_t bg, uint16_t if (map->mapParser == mapParser0) { sysconfig = mMapCacheSystemInfoSetPaletteBPP(sysconfig, 2 + p); sysconfig = mMapCacheSystemInfoSetPaletteCount(sysconfig, 4 * !p); - sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 512); + sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 1024); sysconfig = mMapCacheSystemInfoSetMapAlign(sysconfig, 1); tilesWide = 5; tilesHigh = 5; diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index bd70ac164..0d4460a99 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -8,7 +8,9 @@ #include "CoreController.h" #include "GBAApp.h" +#include #include +#include #include using namespace QGBA; @@ -38,19 +40,51 @@ MapView::MapView(std::shared_ptr controller, QWidget* parent) connect(m_ui.magnification, static_cast(&QSpinBox::valueChanged), [this]() { updateTiles(true); }); + + CoreController::Interrupter interrupter(m_controller); + const mCoreChannelInfo* videoLayers; + size_t nVideo = m_controller->thread()->core->listVideoLayers(m_controller->thread()->core, &videoLayers); + QButtonGroup* group = new QButtonGroup(this); + for (size_t i = 0; i < nVideo; ++i) { + if (strncmp(videoLayers[i].internalName, "bg", 2) != 0) { + continue; + } + QRadioButton* button = new QRadioButton(tr(videoLayers[i].visibleName)); + if (!i) { + button->setChecked(true); + } + m_ui.bgLayout->addWidget(button); + connect(button, &QAbstractButton::pressed, button, [this, i]() { + selectMap(i); + }); + group->addButton(button); + } +} + +void MapView::selectMap(int map) { + if (map >= mMapCacheSetSize(&m_cacheSet->maps)) { + return; + } + m_map = map; } #ifdef M_CORE_GBA void MapView::updateTilesGBA(bool force) { - QImage bg(QSize(256, 256), QImage::Format_ARGB32); - uchar* bgBits = bg.bits(); - mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, 0); - for (int j = 0; j < 32; ++j) { - for (int i = 0; i < 32; ++i) { - mMapCacheCleanTile(mapCache, &m_mapStatus[i + j * 32], i, j); - } - for (int i = 0; i < 8; ++i) { - memcpy(static_cast(&bgBits[256 * 4 * (i + j * 8)]), mMapCacheGetRow(mapCache, i + j * 8), 256 * 4); + QImage bg; + { + CoreController::Interrupter interrupter(m_controller); + mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, m_map); + int tilesW = 1 << mMapCacheSystemInfoGetTilesWide(mapCache->sysConfig); + int tilesH = 1 << mMapCacheSystemInfoGetTilesHigh(mapCache->sysConfig); + bg = QImage(QSize(tilesW * 8, tilesH * 8), QImage::Format_ARGB32); + uchar* bgBits = bg.bits(); + for (int j = 0; j < tilesH; ++j) { + for (int i = 0; i < tilesW; ++i) { + mMapCacheCleanTile(mapCache, &m_mapStatus[i + j * tilesW], i, j); + } + for (int i = 0; i < 8; ++i) { + memcpy(static_cast(&bgBits[tilesW * 32 * (i + j * 8)]), mMapCacheGetRow(mapCache, i + j * 8), tilesW * 32); + } } } bg = bg.convertToFormat(QImage::Format_RGB32).rgbSwapped(); diff --git a/src/platform/qt/MapView.h b/src/platform/qt/MapView.h index affc5d4bf..3f185a44d 100644 --- a/src/platform/qt/MapView.h +++ b/src/platform/qt/MapView.h @@ -21,6 +21,9 @@ Q_OBJECT public: MapView(std::shared_ptr controller, QWidget* parent = nullptr); +private slots: + void selectMap(int); + private: #ifdef M_CORE_GBA void updateTilesGBA(bool force) override; @@ -33,6 +36,7 @@ private: std::shared_ptr m_controller; mMapCacheEntry m_mapStatus[1024 * 1024] = {}; // TODO: Correct size + int m_map = 0; }; } diff --git a/src/platform/qt/MapView.ui b/src/platform/qt/MapView.ui index 683c6a611..3e4a9c2d1 100644 --- a/src/platform/qt/MapView.ui +++ b/src/platform/qt/MapView.ui @@ -14,14 +14,14 @@ Maps - - - - + true + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + @@ -44,6 +44,9 @@ + + + Qt::Vertical @@ -56,7 +59,7 @@ - + @@ -86,6 +89,9 @@ + + + From 6e9507f0822f76bba63f29fba6a78d1f14f34b9f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 23 Sep 2017 10:13:22 -0700 Subject: [PATCH 128/158] Qt: Map Viewer touchups --- src/platform/qt/MapView.cpp | 10 +++++++++- src/platform/qt/MapView.ui | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index 0d4460a99..b303a2c82 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -65,7 +65,11 @@ void MapView::selectMap(int map) { if (map >= mMapCacheSetSize(&m_cacheSet->maps)) { return; } + if (map == m_map) { + return; + } m_map = map; + updateTiles(true); } #ifdef M_CORE_GBA @@ -88,7 +92,11 @@ void MapView::updateTilesGBA(bool force) { } } bg = bg.convertToFormat(QImage::Format_RGB32).rgbSwapped(); - m_ui.map->setPixmap(QPixmap::fromImage(bg)); + QPixmap map = QPixmap::fromImage(bg); + if (m_ui.magnification->value() > 1) { + map = map.scaled(map.size() * m_ui.magnification->value()); + } + m_ui.map->setPixmap(map); } #endif diff --git a/src/platform/qt/MapView.ui b/src/platform/qt/MapView.ui index 3e4a9c2d1..ce8c34852 100644 --- a/src/platform/qt/MapView.ui +++ b/src/platform/qt/MapView.ui @@ -32,6 +32,18 @@ + + 0 + + + 0 + + + 0 + + + 0 + @@ -39,6 +51,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + From 507d033a973907ed9040ea6b4a6df84176559c27 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 23 Sep 2017 11:00:26 -0700 Subject: [PATCH 129/158] GB Video: Support map cache --- .../mgba/internal/gb/renderers/cache-set.h | 2 + src/gb/core.c | 4 +- src/gb/renderers/cache-set.c | 107 +++++++++++++++++- src/gb/renderers/software.c | 4 + src/gb/video.c | 6 +- src/platform/qt/MapView.cpp | 3 +- 6 files changed, 119 insertions(+), 7 deletions(-) diff --git a/include/mgba/internal/gb/renderers/cache-set.h b/include/mgba/internal/gb/renderers/cache-set.h index 3ee63716c..f11bdf45f 100644 --- a/include/mgba/internal/gb/renderers/cache-set.h +++ b/include/mgba/internal/gb/renderers/cache-set.h @@ -16,6 +16,8 @@ struct mCacheSet; void GBVideoCacheInit(struct mCacheSet* cache); void GBVideoCacheAssociate(struct mCacheSet* cache, struct GBVideo* video); +void GBVideoCacheWriteVideoRegister(struct mCacheSet* cache, uint16_t address, uint8_t value); + CXX_GUARD_END #endif diff --git a/src/gb/core.c b/src/gb/core.c index 8fe75a084..21bc25995 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -26,8 +26,8 @@ static const struct mCoreChannelInfo _GBVideoLayers[] = { { 0, "bg", "Background", NULL }, - { 1, "obj", "Objects", NULL }, - { 2, "win", "Window", NULL }, + { 1, "bgwin", "Window", NULL }, + { 2, "obj", "Objects", NULL }, }; static const struct mCoreChannelInfo _GBAudioChannels[] = { diff --git a/src/gb/renderers/cache-set.c b/src/gb/renderers/cache-set.c index a2f34992b..07327ab7f 100644 --- a/src/gb/renderers/cache-set.c +++ b/src/gb/renderers/cache-set.c @@ -6,16 +6,23 @@ #include #include +#include +#include #include void GBVideoCacheInit(struct mCacheSet* cache) { - mCacheSetInit(cache, 0, 1); + mCacheSetInit(cache, 2, 1); mTileCacheConfiguration config = 0; config = mTileCacheSystemInfoSetPaletteBPP(config, 1); // 2^(2^1) = 4 entries config = mTileCacheSystemInfoSetPaletteCount(config, 4); // 16 palettes config = mTileCacheSystemInfoSetMaxTiles(config, 1024); mTileCacheInit(mTileCacheSetGetPointer(&cache->tiles, 0)); mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 0), config, 0, 0); + + mMapCacheInit(mMapCacheSetGetPointer(&cache->maps, 0)); + mMapCacheInit(mMapCacheSetGetPointer(&cache->maps, 1)); + mMapCacheSetGetPointer(&cache->maps, 0)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); + mMapCacheSetGetPointer(&cache->maps, 1)->tileCache = mTileCacheSetGetPointer(&cache->tiles, 0); } void GBVideoCacheAssociate(struct mCacheSet* cache, struct GBVideo* video) { @@ -25,4 +32,102 @@ void GBVideoCacheAssociate(struct mCacheSet* cache, struct GBVideo* video) { for (i = 0; i < 64; ++i) { mCacheSetWritePalette(cache, i, mColorFrom555(video->palette[i])); } + mMapCacheSystemInfo sysconfig = mMapCacheSystemInfoSetPaletteCount(0, 0); + if (video->p->model >= GB_MODEL_CGB) { + sysconfig = mMapCacheSystemInfoSetPaletteCount(0, 2); + } + mMapCacheConfigureSystem(mMapCacheSetGetPointer(&cache->maps, 0), sysconfig); + mMapCacheConfigureSystem(mMapCacheSetGetPointer(&cache->maps, 1), sysconfig); + + GBVideoCacheWriteVideoRegister(cache, REG_LCDC, video->p->memory.io[REG_LCDC]); +} + +static void mapParserDMG0(struct mMapCache* cache, struct mMapCacheEntry* entry, void* vram) { + UNUSED(cache); + int map = *(uint8_t*) vram; + entry->tileId = map; + entry->flags = mMapCacheEntryFlagsClearHMirror(entry->flags); + entry->flags = mMapCacheEntryFlagsClearVMirror(entry->flags); + entry->flags = mMapCacheEntryFlagsSetPaletteId(entry->flags, 0); +} + +static void mapParserDMG1(struct mMapCache* cache, struct mMapCacheEntry* entry, void* vram) { + UNUSED(cache); + int map = *(int8_t*) vram; + entry->tileId = map + 128; + entry->flags = mMapCacheEntryFlagsClearHMirror(entry->flags); + entry->flags = mMapCacheEntryFlagsClearVMirror(entry->flags); + entry->flags = mMapCacheEntryFlagsSetPaletteId(entry->flags, 0); +} + +static void mapParserCGB0(struct mMapCache* cache, struct mMapCacheEntry* entry, void* vram) { + UNUSED(cache); + int map = *(uint8_t*) vram; + uint8_t attr = ((uint8_t*) vram)[0x2000]; + entry->tileId = map + GBObjAttributesGetBank(attr) * 512; + entry->flags = mMapCacheEntryFlagsSetHMirror(entry->flags, GBObjAttributesGetXFlip(attr)); + entry->flags = mMapCacheEntryFlagsSetVMirror(entry->flags, GBObjAttributesGetYFlip(attr)); + entry->flags = mMapCacheEntryFlagsSetPaletteId(entry->flags, GBObjAttributesGetCGBPalette(attr)); +} + +static void mapParserCGB1(struct mMapCache* cache, struct mMapCacheEntry* entry, void* vram) { + UNUSED(cache); + int map = *(int8_t*) vram; + uint8_t attr = ((uint8_t*) vram)[0x2000]; + entry->tileId = map + 128 + GBObjAttributesGetBank(attr) * 512; + entry->flags = mMapCacheEntryFlagsSetHMirror(entry->flags, GBObjAttributesGetXFlip(attr)); + entry->flags = mMapCacheEntryFlagsSetVMirror(entry->flags, GBObjAttributesGetYFlip(attr)); + entry->flags = mMapCacheEntryFlagsSetPaletteId(entry->flags, GBObjAttributesGetCGBPalette(attr)); +} + +void GBVideoCacheWriteVideoRegister(struct mCacheSet* cache, uint16_t address, uint8_t value) { + if (address != REG_LCDC) { + return; + } + struct mMapCache* map = mMapCacheSetGetPointer(&cache->maps, 0); + struct mMapCache* window = mMapCacheSetGetPointer(&cache->maps, 1); + + mMapCacheSystemInfo sysconfig = mMapCacheSystemInfoIsPaletteCount(map->sysConfig); + int tileStart = 0; + int mapStart = GB_BASE_MAP; + int windowStart = GB_BASE_MAP; + if (GBRegisterLCDCIsTileMap(value)) { + mapStart += GB_SIZE_MAP; + } + if (GBRegisterLCDCIsWindowTileMap(value)) { + windowStart += GB_SIZE_MAP; + } + if (GBRegisterLCDCIsTileData(value)) { + if (!sysconfig) { + map->mapParser = mapParserDMG0; + window->mapParser = mapParserDMG0; + } else { + map->mapParser = mapParserCGB0; + window->mapParser = mapParserCGB0; + } + } else { + if (!sysconfig) { + map->mapParser = mapParserDMG1; + window->mapParser = mapParserDMG1; + } else { + map->mapParser = mapParserCGB1; + window->mapParser = mapParserCGB1; + } + tileStart = 0x80; + } + map->tileStart = tileStart; + window->tileStart = tileStart; + if (sysconfig) { + sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 896); + } else { + sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 384); + } + sysconfig = mMapCacheSystemInfoSetPaletteBPP(sysconfig, 1); + sysconfig = mMapCacheSystemInfoSetMapAlign(sysconfig, 0); + sysconfig = mMapCacheSystemInfoSetTilesHigh(sysconfig, 5); + sysconfig = mMapCacheSystemInfoSetTilesWide(sysconfig, 5); + mMapCacheConfigureSystem(map, sysconfig); + mMapCacheConfigureSystem(window, sysconfig); + mMapCacheConfigureMap(map, mapStart); + mMapCacheConfigureMap(window, windowStart); } diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 0e34b22f1..0c3526960 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -194,6 +195,9 @@ static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer) { static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; + if (renderer->cache) { + GBVideoCacheWriteVideoRegister(renderer->cache, address, value); + } switch (address) { case REG_LCDC: softwareRenderer->lcdc = value; diff --git a/src/gb/video.c b/src/gb/video.c index d79ce6873..fea78d19b 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -693,8 +694,9 @@ static void GBVideoDummyRendererDeinit(struct GBVideoRenderer* renderer) { } static uint8_t GBVideoDummyRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value) { - UNUSED(renderer); - UNUSED(address); + if (renderer->cache) { + GBVideoCacheWriteVideoRegister(renderer->cache, address, value); + } return value; } diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index b303a2c82..ec2342c11 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -72,7 +72,6 @@ void MapView::selectMap(int map) { updateTiles(true); } -#ifdef M_CORE_GBA void MapView::updateTilesGBA(bool force) { QImage bg; { @@ -98,10 +97,10 @@ void MapView::updateTilesGBA(bool force) { } m_ui.map->setPixmap(map); } -#endif #ifdef M_CORE_GB void MapView::updateTilesGB(bool force) { + updateTilesGBA(force); } #endif From 697c1cfa9d67413138349a28380f65be8c6b464d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 23 Sep 2017 12:33:36 -0700 Subject: [PATCH 130/158] Util: Add alpha versions of PNG functions --- include/mgba-util/png-io.h | 2 ++ src/util/png-io.c | 69 ++++++++++++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/include/mgba-util/png-io.h b/include/mgba-util/png-io.h index 983992856..7156d67cb 100644 --- a/include/mgba-util/png-io.h +++ b/include/mgba-util/png-io.h @@ -26,9 +26,11 @@ enum { png_structp PNGWriteOpen(struct VFile* source); png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height); +png_infop PNGWriteHeaderA(png_structp png, unsigned width, unsigned height); png_infop PNGWriteHeader8(png_structp png, unsigned width, unsigned height); bool PNGWritePalette(png_structp png, png_infop info, const uint32_t* palette, unsigned entries); bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels); +bool PNGWritePixelsA(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels); bool PNGWritePixels8(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels); bool PNGWriteCustomChunk(png_structp png, const char* name, size_t size, void* data); void PNGWriteClose(png_structp png, png_infop info); diff --git a/src/util/png-io.c b/src/util/png-io.c index 0cb721b83..24d301676 100644 --- a/src/util/png-io.c +++ b/src/util/png-io.c @@ -38,7 +38,7 @@ png_structp PNGWriteOpen(struct VFile* source) { return png; } -png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height) { +static png_infop _pngWriteHeader(png_structp png, unsigned width, unsigned height, int type) { png_infop info = png_create_info_struct(png); if (!info) { return 0; @@ -46,21 +46,21 @@ png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height) { if (setjmp(png_jmpbuf(png))) { return 0; } - png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + png_set_IHDR(png, info, width, height, 8, type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png, info); return info; } +png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height) { + return _pngWriteHeader(png, width, height, PNG_COLOR_TYPE_RGB); +} + +png_infop PNGWriteHeaderA(png_structp png, unsigned width, unsigned height) { + return _pngWriteHeader(png, width, height, PNG_COLOR_TYPE_RGB_ALPHA); +} + png_infop PNGWriteHeader8(png_structp png, unsigned width, unsigned height) { - png_infop info = png_create_info_struct(png); - if (!info) { - return 0; - } - if (setjmp(png_jmpbuf(png))) { - return 0; - } - png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - return info; + return _pngWriteHeader(png, width, height, PNG_COLOR_TYPE_PALETTE); } bool PNGWritePalette(png_structp png, png_infop info, const uint32_t* palette, unsigned entries) { @@ -128,6 +128,53 @@ bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned s return true; } +bool PNGWritePixelsA(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels) { + png_bytep row = malloc(sizeof(png_byte) * width * 4); + if (!row) { + return false; + } + const png_byte* pixelData = pixels; + if (setjmp(png_jmpbuf(png))) { + free(row); + return false; + } + unsigned i; + for (i = 0; i < height; ++i) { + unsigned x; + for (x = 0; x < width; ++x) { +#ifdef COLOR_16_BIT + uint16_t c = ((uint16_t*) pixelData)[stride * i + x]; +#ifdef COLOR_5_6_5 + row[x * 4] = (c >> 8) & 0xF8; + row[x * 4 + 1] = (c >> 3) & 0xFC; + row[x * 4 + 2] = (c << 3) & 0xF8; + row[x * 4 + 3] = 0xFF; +#else + row[x * 4] = (c >> 7) & 0xF8; + row[x * 4 + 1] = (c >> 2) & 0xF8; + row[x * 4 + 2] = (c << 3) & 0xF8; + row[x * 4 + 3] = (c >> 15) * 0xFF; +#endif +#else +#ifdef __BIG_ENDIAN__ + row[x * 4] = pixelData[stride * i * 4 + x * 4 + 3]; + row[x * 4 + 1] = pixelData[stride * i * 4 + x * 4 + 2]; + row[x * 4 + 2] = pixelData[stride * i * 4 + x * 4 + 1]; + row[x * 4 + 3] = pixelData[stride * i * 4 + x * 4]; +#else + row[x * 4] = pixelData[stride * i * 4 + x * 4]; + row[x * 4 + 1] = pixelData[stride * i * 4 + x * 4 + 1]; + row[x * 4 + 2] = pixelData[stride * i * 4 + x * 4 + 2]; + row[x * 4 + 3] = pixelData[stride * i * 4 + x * 4 + 3]; +#endif +#endif + } + png_write_row(png, row); + } + free(row); + return true; +} + bool PNGWritePixels8(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels) { UNUSED(width); const png_byte* pixelData = pixels; From 229d138dacd0df43d14a498ad190200bde17df9c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 23 Sep 2017 12:33:56 -0700 Subject: [PATCH 131/158] Qt: Add map export --- src/platform/qt/MapView.cpp | 37 ++++++++++++++++++++++++++++++++----- src/platform/qt/MapView.h | 6 ++++++ src/platform/qt/MapView.ui | 15 +++++++++++---- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index ec2342c11..129bea3d8 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -7,6 +7,9 @@ #include "CoreController.h" #include "GBAApp.h" +#include "LogController.h" + +#include #include #include @@ -59,6 +62,11 @@ MapView::MapView(std::shared_ptr controller, QWidget* parent) }); group->addButton(button); } +#ifdef USE_PNG + connect(m_ui.exportButton, &QAbstractButton::clicked, this, &MapView::exportMap); +#else + m_ui.exportButton->setVisible(false); +#endif } void MapView::selectMap(int map) { @@ -73,14 +81,13 @@ void MapView::selectMap(int map) { } void MapView::updateTilesGBA(bool force) { - QImage bg; { CoreController::Interrupter interrupter(m_controller); mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, m_map); int tilesW = 1 << mMapCacheSystemInfoGetTilesWide(mapCache->sysConfig); int tilesH = 1 << mMapCacheSystemInfoGetTilesHigh(mapCache->sysConfig); - bg = QImage(QSize(tilesW * 8, tilesH * 8), QImage::Format_ARGB32); - uchar* bgBits = bg.bits(); + m_rawMap = QImage(QSize(tilesW * 8, tilesH * 8), QImage::Format_ARGB32); + uchar* bgBits = m_rawMap.bits(); for (int j = 0; j < tilesH; ++j) { for (int i = 0; i < tilesW; ++i) { mMapCacheCleanTile(mapCache, &m_mapStatus[i + j * tilesW], i, j); @@ -90,8 +97,8 @@ void MapView::updateTilesGBA(bool force) { } } } - bg = bg.convertToFormat(QImage::Format_RGB32).rgbSwapped(); - QPixmap map = QPixmap::fromImage(bg); + m_rawMap = m_rawMap.rgbSwapped(); + QPixmap map = QPixmap::fromImage(m_rawMap.convertToFormat(QImage::Format_RGB32)); if (m_ui.magnification->value() > 1) { map = map.scaled(map.size() * m_ui.magnification->value()); } @@ -104,3 +111,23 @@ void MapView::updateTilesGB(bool force) { } #endif +#ifdef USE_PNG +void MapView::exportMap() { + QString filename = GBAApp::app()->getSaveFileName(this, tr("Export map"), + tr("Portable Network Graphics (*.png)")); + VFile* vf = VFileDevice::open(filename, O_WRONLY | O_CREAT | O_TRUNC); + if (!vf) { + LOG(QT, ERROR) << tr("Failed to open output PNG file: %1").arg(filename); + return; + } + + CoreController::Interrupter interrupter(m_controller); + png_structp png = PNGWriteOpen(vf); + png_infop info = PNGWriteHeaderA(png, m_rawMap.width(), m_rawMap.height()); + + mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, m_map); + QImage map = m_rawMap.rgbSwapped(); + PNGWritePixelsA(png, map.width(), map.height(), map.bytesPerLine() / 4, static_cast(map.constBits())); + PNGWriteClose(png, info); +} +#endif diff --git a/src/platform/qt/MapView.h b/src/platform/qt/MapView.h index 3f185a44d..7b9865ed3 100644 --- a/src/platform/qt/MapView.h +++ b/src/platform/qt/MapView.h @@ -21,6 +21,11 @@ Q_OBJECT public: MapView(std::shared_ptr controller, QWidget* parent = nullptr); +#ifdef USE_PNG +public slots: + void exportMap(); +#endif + private slots: void selectMap(int); @@ -37,6 +42,7 @@ private: std::shared_ptr m_controller; mMapCacheEntry m_mapStatus[1024 * 1024] = {}; // TODO: Correct size int m_map = 0; + QImage m_rawMap; }; } diff --git a/src/platform/qt/MapView.ui b/src/platform/qt/MapView.ui index ce8c34852..35c204917 100644 --- a/src/platform/qt/MapView.ui +++ b/src/platform/qt/MapView.ui @@ -14,7 +14,10 @@ Maps - + + + + true @@ -71,7 +74,7 @@ - + Qt::Vertical @@ -114,8 +117,12 @@ - - + + + + Export + + From f27be6e5f2cd94ffdee7dfa993a13680619ee763 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 23 Sep 2017 18:12:44 -0700 Subject: [PATCH 132/158] Core: Fix "macro" tile dynamic sizing --- include/mgba/core/map-cache.h | 4 ++-- src/core/map-cache.c | 12 ++++++------ src/gb/renderers/cache-set.c | 6 +----- src/gba/renderers/cache-set.c | 4 ++-- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h index 5a2c61b45..5d16287b4 100644 --- a/include/mgba/core/map-cache.h +++ b/include/mgba/core/map-cache.h @@ -21,8 +21,8 @@ DECL_BITS(mMapCacheSystemInfo, PaletteBPP, 0, 2); DECL_BITS(mMapCacheSystemInfo, PaletteCount, 2, 4); DECL_BITS(mMapCacheSystemInfo, TilesWide, 8, 4); DECL_BITS(mMapCacheSystemInfo, TilesHigh, 12, 4); -DECL_BITS(mMapCacheSystemInfo, MaxTiles, 16, 13); -DECL_BITS(mMapCacheSystemInfo, MapAlign, 29, 2); +DECL_BITS(mMapCacheSystemInfo, MacroTileSize, 16, 7); +DECL_BITS(mMapCacheSystemInfo, MapAlign, 23, 2); DECL_BITFIELD(mMapCacheEntryFlags, uint16_t); DECL_BITS(mMapCacheEntryFlags, PaletteId, 0, 4); diff --git a/src/core/map-cache.c b/src/core/map-cache.c index 3f1f7a007..f818c7e2f 100644 --- a/src/core/map-cache.c +++ b/src/core/map-cache.c @@ -117,14 +117,14 @@ static inline void _cleanTile(struct mMapCache* cache, const color_t* tile, colo static inline size_t _tileId(struct mMapCache* cache, unsigned x, unsigned y) { int tilesWide = mMapCacheSystemInfoGetTilesWide(cache->sysConfig); int tilesHigh = mMapCacheSystemInfoGetTilesHigh(cache->sysConfig); - int stride = tilesHigh < 5 ? (1 << tilesHigh) : 32; + int stride = 1 << mMapCacheSystemInfoGetMacroTileSize(cache->sysConfig); x &= (1 << tilesWide) - 1; y &= (1 << tilesHigh) - 1; - unsigned xMajor = x & ~0x1F; - unsigned yMajor = y >> 5; - x &= 0x1F; - y &= 0x1F; - yMajor <<= tilesHigh; + unsigned xMajor = x & ~(stride - 1); + unsigned yMajor = y >> mMapCacheSystemInfoGetMacroTileSize(cache->sysConfig); + x &= stride - 1; + y &= stride - 1; + yMajor <<= tilesWide; y += xMajor + yMajor; return stride * y + x; } diff --git a/src/gb/renderers/cache-set.c b/src/gb/renderers/cache-set.c index 07327ab7f..741d043cd 100644 --- a/src/gb/renderers/cache-set.c +++ b/src/gb/renderers/cache-set.c @@ -117,11 +117,7 @@ void GBVideoCacheWriteVideoRegister(struct mCacheSet* cache, uint16_t address, u } map->tileStart = tileStart; window->tileStart = tileStart; - if (sysconfig) { - sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 896); - } else { - sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 384); - } + sysconfig = mMapCacheSystemInfoSetMacroTileSize(sysconfig, 5); sysconfig = mMapCacheSystemInfoSetPaletteBPP(sysconfig, 1); sysconfig = mMapCacheSystemInfoSetMapAlign(sysconfig, 0); sysconfig = mMapCacheSystemInfoSetTilesHigh(sysconfig, 5); diff --git a/src/gba/renderers/cache-set.c b/src/gba/renderers/cache-set.c index 395cbbaac..ddbeb0dfc 100644 --- a/src/gba/renderers/cache-set.c +++ b/src/gba/renderers/cache-set.c @@ -114,7 +114,7 @@ static void GBAVideoCacheWriteBGCNT(struct mCacheSet* cache, size_t bg, uint16_t if (map->mapParser == mapParser0) { sysconfig = mMapCacheSystemInfoSetPaletteBPP(sysconfig, 2 + p); sysconfig = mMapCacheSystemInfoSetPaletteCount(sysconfig, 4 * !p); - sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 1024); + sysconfig = mMapCacheSystemInfoSetMacroTileSize(sysconfig, 5); sysconfig = mMapCacheSystemInfoSetMapAlign(sysconfig, 1); tilesWide = 5; tilesHigh = 5; @@ -128,7 +128,7 @@ static void GBAVideoCacheWriteBGCNT(struct mCacheSet* cache, size_t bg, uint16_t } else if (map->mapParser == mapParser2) { sysconfig = mMapCacheSystemInfoSetPaletteBPP(sysconfig, 3); sysconfig = mMapCacheSystemInfoSetPaletteCount(sysconfig, 0); - sysconfig = mMapCacheSystemInfoSetMaxTiles(sysconfig, 256); + sysconfig = mMapCacheSystemInfoSetMacroTileSize(sysconfig, 4 + size); sysconfig = mMapCacheSystemInfoSetMapAlign(sysconfig, 0); tilesHigh = 4 + size; From a7ee79ff45bbf81363bf24caaa47da67db6e3939 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 23 Sep 2017 23:25:57 -0700 Subject: [PATCH 133/158] Core: More map viewer fixes --- include/mgba/core/map-cache.h | 1 + src/core/map-cache.c | 24 ++++++++++++++---------- src/gba/renderers/cache-set.c | 5 +++++ src/platform/qt/MapView.cpp | 2 +- src/platform/qt/MapView.h | 2 +- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h index 5d16287b4..22771459d 100644 --- a/include/mgba/core/map-cache.h +++ b/include/mgba/core/map-cache.h @@ -56,6 +56,7 @@ struct mMapCache { mMapCacheSystemInfo sysConfig; void (*mapParser)(struct mMapCache*, struct mMapCacheEntry* entry, void* vram); + void* context; }; void mMapCacheInit(struct mMapCache* cache); diff --git a/src/core/map-cache.c b/src/core/map-cache.c index f818c7e2f..ed18979f6 100644 --- a/src/core/map-cache.c +++ b/src/core/map-cache.c @@ -132,21 +132,21 @@ static inline size_t _tileId(struct mMapCache* cache, unsigned x, unsigned y) { void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y) { size_t location = _tileId(cache, x, y); struct mMapCacheEntry* status = &cache->status[location]; - int paletteId = mMapCacheEntryFlagsGetPaletteId(status->flags); const color_t* tile = NULL; if (!mMapCacheEntryFlagsIsVramClean(status->flags)) { status->flags = mMapCacheEntryFlagsFillVramClean(status->flags); cache->mapParser(cache, status, &cache->vram[cache->mapStart + (location << mMapCacheSystemInfoGetMapAlign(cache->sysConfig))]); - tile = mTileCacheGetTileIfDirty(cache->tileCache, &status->tileStatus[paletteId], status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); - if (!tile) { - tile = mTileCacheGetTile(cache->tileCache, status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); - } - } else { - tile = mTileCacheGetTileIfDirty(cache->tileCache, &status->tileStatus[paletteId], status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); - if (!tile && memcmp(status, &entry[location], sizeof(*entry)) == 0) { + } + unsigned tileId = status->tileId + cache->tileStart; + if (tileId >= mTileCacheSystemInfoGetMaxTiles(cache->tileCache->sysConfig)) { + tileId = 0; + } + tile = mTileCacheGetTileIfDirty(cache->tileCache, status->tileStatus, tileId, mMapCacheEntryFlagsGetPaletteId(status->flags)); + if (!tile) { + if (mMapCacheEntryFlagsIsVramClean(status->flags) && memcmp(status, &entry[location], sizeof(*entry)) == 0) { return; } - tile = mTileCacheGetTile(cache->tileCache, status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + tile = mTileCacheGetTile(cache->tileCache, tileId, mMapCacheEntryFlagsGetPaletteId(status->flags)); } size_t stride = 8 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig); @@ -161,7 +161,11 @@ bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* en int paletteId = mMapCacheEntryFlagsGetPaletteId(status->flags); const color_t* tile = NULL; if (mMapCacheEntryFlagsIsVramClean(status->flags) && memcmp(status, &entry[location], sizeof(*entry)) == 0) { - tile = mTileCacheGetTileIfDirty(cache->tileCache, &status->tileStatus[paletteId], status->tileId + cache->tileStart, mMapCacheEntryFlagsGetPaletteId(status->flags)); + unsigned tileId = status->tileId + cache->tileStart; + if (tileId >= mTileCacheSystemInfoGetMaxTiles(cache->tileCache->sysConfig)) { + tileId = 0; + } + tile = mTileCacheGetTileIfDirty(cache->tileCache, &status->tileStatus[paletteId], tileId, mMapCacheEntryFlagsGetPaletteId(status->flags)); return !tile; } return false; diff --git a/src/gba/renderers/cache-set.c b/src/gba/renderers/cache-set.c index ddbeb0dfc..ce28d7e20 100644 --- a/src/gba/renderers/cache-set.c +++ b/src/gba/renderers/cache-set.c @@ -104,6 +104,7 @@ static void GBAVideoCacheWriteDISPCNT(struct mCacheSet* cache, uint16_t value) { static void GBAVideoCacheWriteBGCNT(struct mCacheSet* cache, size_t bg, uint16_t value) { struct mMapCache* map = mMapCacheSetGetPointer(&cache->maps, bg); + map->context = (void*) (uintptr_t) value; int tileStart = GBARegisterBGCNTGetCharBase(value) * 256; bool p = GBARegisterBGCNTGet256Color(value); @@ -145,6 +146,10 @@ void GBAVideoCacheWriteVideoRegister(struct mCacheSet* cache, uint32_t address, switch (address) { case REG_DISPCNT: GBAVideoCacheWriteDISPCNT(cache, value); + GBAVideoCacheWriteBGCNT(cache, 0, (uint16_t) mMapCacheSetGetPointer(&cache->maps, 0)->context); + GBAVideoCacheWriteBGCNT(cache, 1, (uint16_t) mMapCacheSetGetPointer(&cache->maps, 1)->context); + GBAVideoCacheWriteBGCNT(cache, 2, (uint16_t) mMapCacheSetGetPointer(&cache->maps, 2)->context); + GBAVideoCacheWriteBGCNT(cache, 3, (uint16_t) mMapCacheSetGetPointer(&cache->maps, 3)->context); break; case REG_BG0CNT: GBAVideoCacheWriteBGCNT(cache, 0, value); diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index 129bea3d8..4db7b1b8b 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -90,7 +90,7 @@ void MapView::updateTilesGBA(bool force) { uchar* bgBits = m_rawMap.bits(); for (int j = 0; j < tilesH; ++j) { for (int i = 0; i < tilesW; ++i) { - mMapCacheCleanTile(mapCache, &m_mapStatus[i + j * tilesW], i, j); + mMapCacheCleanTile(mapCache, m_mapStatus, i, j); } for (int i = 0; i < 8; ++i) { memcpy(static_cast(&bgBits[tilesW * 32 * (i + j * 8)]), mMapCacheGetRow(mapCache, i + j * 8), tilesW * 32); diff --git a/src/platform/qt/MapView.h b/src/platform/qt/MapView.h index 7b9865ed3..7466cb038 100644 --- a/src/platform/qt/MapView.h +++ b/src/platform/qt/MapView.h @@ -40,7 +40,7 @@ private: Ui::MapView m_ui; std::shared_ptr m_controller; - mMapCacheEntry m_mapStatus[1024 * 1024] = {}; // TODO: Correct size + mMapCacheEntry m_mapStatus[128 * 128] = {}; // TODO: Correct size int m_map = 0; QImage m_rawMap; }; From 405eafb969ef1ed55cb4792099cac7897c4f7713 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 24 Sep 2017 12:43:26 -0700 Subject: [PATCH 134/158] Qt: Make clicking tiles work --- include/mgba/core/map-cache.h | 2 ++ src/core/map-cache.c | 6 ++-- src/platform/qt/AssetTile.cpp | 37 +++++++++++++++++++++- src/platform/qt/AssetTile.h | 7 +++++ src/platform/qt/AssetTile.ui | 29 +++++++++++++++++ src/platform/qt/MapView.cpp | 59 +++++++++++++++++++++++++++++++++-- src/platform/qt/MapView.h | 7 +++++ src/platform/qt/MapView.ui | 8 ++--- 8 files changed, 145 insertions(+), 10 deletions(-) diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h index 22771459d..0ceeb5d98 100644 --- a/include/mgba/core/map-cache.h +++ b/include/mgba/core/map-cache.h @@ -66,6 +66,8 @@ void mMapCacheConfigureSystem(struct mMapCache* cache, mMapCacheSystemInfo confi void mMapCacheConfigureMap(struct mMapCache* cache, uint32_t mapStart); void mMapCacheWriteVRAM(struct mMapCache* cache, uint32_t address); +uint32_t mMapCacheTileId(struct mMapCache* cache, unsigned x, unsigned y); + bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y); void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y); diff --git a/src/core/map-cache.c b/src/core/map-cache.c index ed18979f6..980f26899 100644 --- a/src/core/map-cache.c +++ b/src/core/map-cache.c @@ -114,7 +114,7 @@ static inline void _cleanTile(struct mMapCache* cache, const color_t* tile, colo } } -static inline size_t _tileId(struct mMapCache* cache, unsigned x, unsigned y) { +uint32_t mMapCacheTileId(struct mMapCache* cache, unsigned x, unsigned y) { int tilesWide = mMapCacheSystemInfoGetTilesWide(cache->sysConfig); int tilesHigh = mMapCacheSystemInfoGetTilesHigh(cache->sysConfig); int stride = 1 << mMapCacheSystemInfoGetMacroTileSize(cache->sysConfig); @@ -130,7 +130,7 @@ static inline size_t _tileId(struct mMapCache* cache, unsigned x, unsigned y) { } void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y) { - size_t location = _tileId(cache, x, y); + size_t location = mMapCacheTileId(cache, x, y); struct mMapCacheEntry* status = &cache->status[location]; const color_t* tile = NULL; if (!mMapCacheEntryFlagsIsVramClean(status->flags)) { @@ -156,7 +156,7 @@ void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, u } bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y) { - size_t location = _tileId(cache, x, y); + size_t location = mMapCacheTileId(cache, x, y); struct mMapCacheEntry* status = &cache->status[location]; int paletteId = mMapCacheEntryFlagsGetPaletteId(status->flags); const color_t* tile = NULL; diff --git a/src/platform/qt/AssetTile.cpp b/src/platform/qt/AssetTile.cpp index 452829f85..9bdb57150 100644 --- a/src/platform/qt/AssetTile.cpp +++ b/src/platform/qt/AssetTile.cpp @@ -9,6 +9,7 @@ #include "GBAApp.h" #include +#include #include #ifdef M_CORE_GBA @@ -34,12 +35,25 @@ AssetTile::AssetTile(QWidget* parent) const QFont font = QFontDatabase::systemFont(QFontDatabase::FixedFont); m_ui.tileId->setFont(font); + m_ui.paletteId->setFont(font); m_ui.address->setFont(font); m_ui.r->setFont(font); m_ui.g->setFont(font); m_ui.b->setFont(font); } +void AssetTile::addCustomProperty(const QString& id, const QString& visibleName) { + QHBoxLayout* newLayout = new QHBoxLayout; + newLayout->addWidget(new QLabel(visibleName)); + QLabel* value = new QLabel; + value->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); + value->setAlignment(Qt::AlignRight); + newLayout->addWidget(value); + m_customProperties[id] = value; + int index = layout()->indexOf(m_ui.line); + static_cast(layout())->insertLayout(index, newLayout); +} + void AssetTile::setController(std::shared_ptr controller) { m_cacheSet = controller->graphicCaches(); switch (controller->platform()) { @@ -94,16 +108,30 @@ void AssetTile::selectIndex(int index) { } data = mTileCacheGetTile(tileCache, index, paletteId); m_ui.tileId->setText(QString::number(dispIndex)); + m_ui.paletteId->setText(QString::number(paletteId)); m_ui.address->setText(tr("%0%1%2") .arg(m_addressWidth == 4 ? index >= m_boundary / 2 : 0) .arg(m_addressWidth == 4 ? ":" : "x") .arg(dispIndex * bpp | base, m_addressWidth, 16, QChar('0'))); + int flip = 0; + if (m_flipH) { + flip |= 007; + } + if (m_flipV) { + flip |= 070; + } for (int i = 0; i < 64; ++i) { - m_ui.preview->setColor(i, data[i]); + m_ui.preview->setColor(i ^ flip, data[i]); } m_ui.preview->update(); } +void AssetTile::setFlip(bool h, bool v) { + m_flipH = h; + m_flipV = v; + selectIndex(m_index); +} + void AssetTile::selectColor(int index) { const color_t* data; mTileCache* tileCache = m_tileCaches[m_index >= m_boundary]; @@ -122,3 +150,10 @@ void AssetTile::selectColor(int index) { m_ui.b->setText(tr("0x%0 (%1)").arg(b, 2, 16, QChar('0')).arg(b, 2, 10, QChar('0'))); } +void AssetTile::setCustomProperty(const QString& id, const QVariant& value) { + QLabel* label = m_customProperties[id]; + if (!label) { + return; + } + label->setText(value.toString()); +} diff --git a/src/platform/qt/AssetTile.h b/src/platform/qt/AssetTile.h index dbe6acf57..35dd14e5b 100644 --- a/src/platform/qt/AssetTile.h +++ b/src/platform/qt/AssetTile.h @@ -21,12 +21,15 @@ Q_OBJECT public: AssetTile(QWidget* parent = nullptr); void setController(std::shared_ptr); + void addCustomProperty(const QString& id, const QString& visibleName); public slots: void setPalette(int); void setBoundary(int boundary, int set0, int set1); void selectIndex(int); + void setFlip(bool h, bool v); void selectColor(int); + void setCustomProperty(const QString& id, const QVariant& value); private: Ui::AssetTile m_ui; @@ -40,6 +43,10 @@ private: int m_addressBase; int m_boundary; int m_boundaryBase; + bool m_flipH = false; + bool m_flipV = false; + + QMap m_customProperties; }; } diff --git a/src/platform/qt/AssetTile.ui b/src/platform/qt/AssetTile.ui index b9075f24f..92a8623e1 100644 --- a/src/platform/qt/AssetTile.ui +++ b/src/platform/qt/AssetTile.ui @@ -2,6 +2,14 @@ AssetTile + + + 0 + 0 + 171 + 355 + + 0 @@ -46,6 +54,27 @@ + + + + + + Palette # + + + + + + + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index 4db7b1b8b..2481bd9a3 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -10,9 +10,16 @@ #include "LogController.h" #include +#ifdef M_CORE_GBA +#include +#endif +#ifdef M_CORE_GB +#include +#endif #include #include +#include #include #include @@ -28,17 +35,22 @@ MapView::MapView(std::shared_ptr controller, QWidget* parent) switch (m_controller->platform()) { #ifdef M_CORE_GBA case PLATFORM_GBA: - m_ui.tile->setBoundary(2048, 0, 2); + m_boundary = 2048; + m_addressBase = BASE_VRAM; + m_addressWidth = 8; break; #endif #ifdef M_CORE_GB case PLATFORM_GB: - m_ui.tile->setBoundary(1024, 0, 0); + m_boundary = 1024; + m_addressBase = GB_BASE_VRAM; + m_addressWidth = 4; break; #endif default: return; } + m_ui.tile->setBoundary(m_boundary, 0, 0); connect(m_ui.magnification, static_cast(&QSpinBox::valueChanged), [this]() { updateTiles(true); @@ -67,6 +79,10 @@ MapView::MapView(std::shared_ptr controller, QWidget* parent) #else m_ui.exportButton->setVisible(false); #endif + m_ui.map->installEventFilter(this); + m_ui.tile->addCustomProperty("mapAddr", tr("Map Addr.")); + m_ui.tile->addCustomProperty("flip", tr("Mirror")); + selectTile(0, 0); } void MapView::selectMap(int map) { @@ -80,6 +96,45 @@ void MapView::selectMap(int map) { updateTiles(true); } +void MapView::selectTile(int x, int y) { + CoreController::Interrupter interrupter(m_controller); + mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, m_map); + size_t tileCache = mTileCacheSetIndex(&m_cacheSet->tiles, mapCache->tileCache); + m_ui.tile->setBoundary(m_boundary, tileCache, tileCache); + uint32_t location = mMapCacheTileId(mapCache, x, y); + mMapCacheEntry* entry = &m_mapStatus[location]; + m_ui.tile->selectIndex(entry->tileId + mapCache->tileStart); + m_ui.tile->setPalette(mMapCacheEntryFlagsGetPaletteId(entry->flags)); + m_ui.tile->setFlip(mMapCacheEntryFlagsGetHMirror(entry->flags), mMapCacheEntryFlagsGetVMirror(entry->flags)); + location <<= (mMapCacheSystemInfoGetMapAlign(mapCache->sysConfig)); + location += m_addressBase + mapCache->mapStart; + + QString flip(tr("None")); + if (mMapCacheEntryFlagsGetHMirror(entry->flags) && mMapCacheEntryFlagsGetVMirror(entry->flags)) { + flip = tr("Both"); + } else if (mMapCacheEntryFlagsGetHMirror(entry->flags)) { + flip = tr("Horizontal"); + } else if (mMapCacheEntryFlagsGetVMirror(entry->flags)) { + flip = tr("Vertical"); + } + m_ui.tile->setCustomProperty("flip", flip); + m_ui.tile->setCustomProperty("mapAddr", QString("%0%1") + .arg(m_addressWidth == 8 ? "0x" : "") + .arg(location, m_addressWidth, 16, QChar('0'))); +} + +bool MapView::eventFilter(QObject* obj, QEvent* event) { + if (event->type() != QEvent::MouseButtonPress) { + return false; + } + int x = static_cast(event)->x(); + int y = static_cast(event)->y(); + x /= 8 * m_ui.magnification->value(); + y /= 8 * m_ui.magnification->value(); + selectTile(x, y); + return true; +} + void MapView::updateTilesGBA(bool force) { { CoreController::Interrupter interrupter(m_controller); diff --git a/src/platform/qt/MapView.h b/src/platform/qt/MapView.h index 7466cb038..c8aa0867a 100644 --- a/src/platform/qt/MapView.h +++ b/src/platform/qt/MapView.h @@ -28,6 +28,10 @@ public slots: private slots: void selectMap(int); + void selectTile(int x, int y); + +protected: + bool eventFilter(QObject*, QEvent*) override; private: #ifdef M_CORE_GBA @@ -43,6 +47,9 @@ private: mMapCacheEntry m_mapStatus[128 * 128] = {}; // TODO: Correct size int m_map = 0; QImage m_rawMap; + int m_boundary; + int m_addressBase; + int m_addressWidth; }; } diff --git a/src/platform/qt/MapView.ui b/src/platform/qt/MapView.ui index 35c204917..15a1f5f74 100644 --- a/src/platform/qt/MapView.ui +++ b/src/platform/qt/MapView.ui @@ -6,8 +6,8 @@ 0 0 - 498 - 335 + 641 + 489 @@ -30,8 +30,8 @@ 0 0 - 314 - 309 + 457 + 463 From dbeff59c066c9e75f6359f1e4f9b4764eb99b7ff Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 24 Sep 2017 17:34:07 -0700 Subject: [PATCH 135/158] Core: Add some debug checks --- src/core/tile-cache.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/core/tile-cache.c b/src/core/tile-cache.c index ffb1cf565..2a7c8cf3a 100644 --- a/src/core/tile-cache.c +++ b/src/core/tile-cache.c @@ -194,6 +194,14 @@ static void _regenerateTile256(struct mTileCache* cache, color_t* tile, unsigned static inline color_t* _tileLookup(struct mTileCache* cache, unsigned tileId, unsigned paletteId) { if (mTileCacheConfigurationIsShouldStore(cache->config)) { unsigned tiles = mTileCacheSystemInfoGetMaxTiles(cache->sysConfig); +#ifndef NDEBUG + if (tileId >= tiles) { + abort(); + } + if (paletteId >= 1 << mTileCacheSystemInfoGetPaletteCount(cache->sysConfig)) { + abort(); + } +#endif return &cache->cache[(tileId + paletteId * tiles) << 6]; } else { return cache->temporaryTile; From ba2a31c3f2ff5ef6fcc44570dfda7b4911704b25 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 24 Sep 2017 21:33:03 -0700 Subject: [PATCH 136/158] Python: Fix tiles --- src/platform/python/_builder.py | 2 +- src/platform/python/mgba/core.py | 10 ++++++++- src/platform/python/mgba/gb.py | 13 ++++++------ src/platform/python/mgba/gba.py | 13 ++++++------ src/platform/python/mgba/image.py | 10 +++++---- src/platform/python/mgba/png.py | 21 ++++++++++++++++--- src/platform/python/mgba/tile.py | 34 +++++++++++-------------------- 7 files changed, 60 insertions(+), 43 deletions(-) diff --git a/src/platform/python/_builder.py b/src/platform/python/_builder.py index abb7ac305..0576be542 100644 --- a/src/platform/python/_builder.py +++ b/src/platform/python/_builder.py @@ -75,7 +75,7 @@ ffi.embedding_init_code(""" venv = os.getenv('VIRTUAL_ENV') if venv: activate = os.path.join(venv, 'bin', 'activate_this.py') - execfile(activate, dict(__file__=activate)) + exec(compile(open(activate, "rb").read(), activate, 'exec'), dict(__file__=activate)) from mgba._pylib import ffi, lib symbols = {} globalSyms = { diff --git a/src/platform/python/mgba/core.py b/src/platform/python/mgba/core.py index cefc97eb7..029c6a0ff 100644 --- a/src/platform/python/mgba/core.py +++ b/src/platform/python/mgba/core.py @@ -105,9 +105,17 @@ class Core(object): self._core.addCoreCallbacks(self._core, self._callbacks.context) self.config = Config(ffi.addressof(native.config)) + @cached_property + def graphicsCache(self): + return tile.CacheSet(self) + @cached_property def tiles(self): - return tile.TileView(self) + t = [] + ts = ffi.addressof(self.graphicsCache.cache.tiles) + for i in range(lib.mTileCacheSetSize(ts)): + t.append(tile.TileView(lib.mTileCacheSetGetPointer(ts, i))) + return t @classmethod def _init(cls, native): diff --git a/src/platform/python/mgba/gb.py b/src/platform/python/mgba/gb.py index fdf7f78bd..bd629922d 100644 --- a/src/platform/python/mgba/gb.py +++ b/src/platform/python/mgba/gb.py @@ -27,13 +27,13 @@ class GB(Core): self.cpu = LR35902Core(self._core.cpu) @needsReset - def _initTileCache(self, cache): - lib.GBVideoTileCacheInit(cache) - lib.GBVideoTileCacheAssociate(cache, ffi.addressof(self._native.video)) + def _initCache(self, cache): + lib.GBVideoCacheInit(cache) + lib.GBVideoCacheAssociate(cache, ffi.addressof(self._native.video)) - def _deinitTileCache(self, cache): + def _deinitCache(self, cache): self._native.video.renderer.cache = ffi.NULL - lib.mTileCacheDeinit(cache) + lib.mCacheSetDeinit(cache) def reset(self): super(GB, self).reset() @@ -135,6 +135,7 @@ class GBSprite(Sprite): self.paletteId = self._attr & 7 else: self.paletteId = (self._attr >> 4) & 1 + self.paletteId += 8 class GBObjs: @@ -149,5 +150,5 @@ class GBObjs: if index >= len(self): raise IndexError() sprite = GBSprite(self._obj[index], self._core) - sprite.constitute(self._core.tiles, 0, 0) + sprite.constitute(self._core.tiles[0], 0) return sprite diff --git a/src/platform/python/mgba/gba.py b/src/platform/python/mgba/gba.py index 5ba050748..2cec1ec42 100644 --- a/src/platform/python/mgba/gba.py +++ b/src/platform/python/mgba/gba.py @@ -35,13 +35,13 @@ class GBA(Core): self.cpu = ARMCore(self._core.cpu) @needsReset - def _initTileCache(self, cache): - lib.GBAVideoTileCacheInit(cache) - lib.GBAVideoTileCacheAssociate(cache, ffi.addressof(self._native.video)) + def _initCache(self, cache): + lib.GBAVideoCacheInit(cache) + lib.GBAVideoCacheAssociate(cache, ffi.addressof(self._native.video)) - def _deinitTileCache(self, cache): + def _deinitCache(self, cache): self._native.video.renderer.cache = ffi.NULL - lib.mTileCacheDeinit(cache) + lib.mCacheSetDeinit(cache) def reset(self): super(GBA, self).reset() @@ -127,6 +127,7 @@ class GBAObjs: if index >= len(self): raise IndexError() sprite = GBASprite(self._obj[index]) + tiles = self._core.tiles[3 if sprite._256Color else 2] map1D = bool(self._core._native.memory.io[0] & 0x40) - sprite.constitute(self._core.tiles, 0 if map1D else 0x20, int(sprite._256Color)) + sprite.constitute(tiles, 0 if map1D else 0x20) return sprite diff --git a/src/platform/python/mgba/image.py b/src/platform/python/mgba/image.py index 948edeeb4..ac6407012 100644 --- a/src/platform/python/mgba/image.py +++ b/src/platform/python/mgba/image.py @@ -12,10 +12,11 @@ except ImportError: pass class Image: - def __init__(self, width, height, stride=0): + def __init__(self, width, height, stride=0, alpha=False): self.width = width self.height = height self.stride = stride + self.alpha = alpha self.constitute() def constitute(self): @@ -24,7 +25,7 @@ class Image: self.buffer = ffi.new("color_t[{}]".format(self.stride * self.height)) def savePNG(self, f): - p = png.PNG(f) + p = png.PNG(f, mode=png.MODE_RGBA if self.alpha else png.MODE_RGB) success = p.writeHeader(self) success = success and p.writePixels(self) p.writeClose() @@ -32,8 +33,9 @@ class Image: if 'PImage' in globals(): def toPIL(self): - return PImage.frombytes("RGBX", (self.width, self.height), ffi.buffer(self.buffer), "raw", - "RGBX", self.stride * 4) + type = "RGBA" if self.alpha else "RGBX" + return PImage.frombytes(type, (self.width, self.height), ffi.buffer(self.buffer), "raw", + type, self.stride * 4) def u16ToU32(c): r = c & 0x1F diff --git a/src/platform/python/mgba/png.py b/src/platform/python/mgba/png.py index bc1ff836c..e4156f13b 100644 --- a/src/platform/python/mgba/png.py +++ b/src/platform/python/mgba/png.py @@ -6,17 +6,32 @@ from ._pylib import ffi, lib from . import vfs +MODE_RGB = 0 +MODE_RGBA = 1 +MODE_INDEX = 2 + class PNG: - def __init__(self, f): + def __init__(self, f, mode=MODE_RGB): self.vf = vfs.open(f) + self.mode = mode def writeHeader(self, image): self._png = lib.PNGWriteOpen(self.vf.handle) - self._info = lib.PNGWriteHeader(self._png, image.width, image.height) + if self.mode == MODE_RGB: + self._info = lib.PNGWriteHeader(self._png, image.width, image.height) + if self.mode == MODE_RGBA: + self._info = lib.PNGWriteHeaderA(self._png, image.width, image.height) + if self.mode == MODE_INDEX: + self._info = lib.PNGWriteHeader8(self._png, image.width, image.height) return self._info != ffi.NULL def writePixels(self, image): - return lib.PNGWritePixels(self._png, image.width, image.height, image.stride, image.buffer) + if self.mode == MODE_RGB: + return lib.PNGWritePixels(self._png, image.width, image.height, image.stride, image.buffer) + if self.mode == MODE_RGBA: + return lib.PNGWritePixelsA(self._png, image.width, image.height, image.stride, image.buffer) + if self.mode == MODE_INDEX: + return lib.PNGWritePixels8(self._png, image.width, image.height, image.stride, image.buffer) def writeClose(self): lib.PNGWriteClose(self._png, self._info) diff --git a/src/platform/python/mgba/tile.py b/src/platform/python/mgba/tile.py index 4d89f8869..e48973cde 100644 --- a/src/platform/python/mgba/tile.py +++ b/src/platform/python/mgba/tile.py @@ -17,41 +17,31 @@ class Tile: def composite(self, i, x, y): for iy in range(8): - for ix in range(8): - i.buffer[ix + x + (iy + y) * i.stride] = image.u16ToColor(self.buffer[ix + iy * 8]) + ffi.memmove(ffi.addressof(i.buffer, x + (iy + y) * i.stride), ffi.addressof(self.buffer, iy * 8), 8 * ffi.sizeof("color_t")) -class TileView: +class CacheSet: def __init__(self, core): self.core = core - self.cache = ffi.gc(ffi.new("struct mTileCache*"), core._deinitTileCache) - core._initTileCache(self.cache) - lib.mTileCacheSetPalette(self.cache, 0) - self.paletteSet = 0 + self.cache = ffi.gc(ffi.new("struct mCacheSet*"), core._deinitCache) + core._initCache(self.cache) + +class TileView: + def __init__(self, cache): + self.cache = cache def getTile(self, tile, palette): return Tile(lib.mTileCacheGetTile(self.cache, tile, palette)) - def setPalette(self, paletteSet): - if paletteSet > 1 or paletteSet < 0: - raise IndexError("Palette Set ID out of bounds") - lib.mTileCacheSetPalette(self.cache, paletteSet) - self.paletteSet = paletteSet class Sprite(object): - TILE_BASE = 0, 0 - PALETTE_BASE = 0, 0 - - def constitute(self, tileView, tilePitch, paletteSet): - oldPaletteSet = tileView.paletteSet - tileView.setPalette(paletteSet) - i = image.Image(self.width, self.height) - tileId = self.tile + self.TILE_BASE[paletteSet] + def constitute(self, tileView, tilePitch): + i = image.Image(self.width, self.height, alpha=True) + tileId = self.tile for y in range(self.height // 8): for x in range(self.width // 8): - tile = tileView.getTile(tileId, self.paletteId + self.PALETTE_BASE[paletteSet]) + tile = tileView.getTile(tileId, self.paletteId) tile.composite(i, x * 8, y * 8) tileId += 1 if tilePitch: tileId += tilePitch - self.width // 8 self.image = i - tileView.setPalette(oldPaletteSet) From bec2757dbf0ddb3d28d09353d2cc4a7aea716103 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 24 Sep 2017 22:30:53 -0700 Subject: [PATCH 137/158] Python: Add map view --- include/mgba/core/map-cache.h | 1 + src/core/map-cache.c | 28 ++++++++++++++++++++++++++++ src/platform/python/_builder.h | 15 +++++++++++---- src/platform/python/_builder.py | 5 ++++- src/platform/python/mgba/core.py | 8 ++++++++ src/platform/python/mgba/tile.py | 21 +++++++++++++++++++++ 6 files changed, 73 insertions(+), 5 deletions(-) diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h index 0ceeb5d98..6dc9e72f6 100644 --- a/include/mgba/core/map-cache.h +++ b/include/mgba/core/map-cache.h @@ -71,6 +71,7 @@ uint32_t mMapCacheTileId(struct mMapCache* cache, unsigned x, unsigned y); bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* entry, unsigned x, unsigned y); void mMapCacheCleanTile(struct mMapCache* cache, struct mMapCacheEntry* entry, unsigned x, unsigned y); +void mMapCacheCleanRow(struct mMapCache* cache, unsigned y); const color_t* mMapCacheGetRow(struct mMapCache* cache, unsigned y); CXX_GUARD_END diff --git a/src/core/map-cache.c b/src/core/map-cache.c index 980f26899..495978672 100644 --- a/src/core/map-cache.c +++ b/src/core/map-cache.c @@ -171,6 +171,34 @@ bool mMapCacheCheckTile(struct mMapCache* cache, const struct mMapCacheEntry* en return false; } +void mMapCacheCleanRow(struct mMapCache* cache, unsigned y) { + // TODO: Cache + int tilesWide = 1 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig); + int macroTile = (1 << mMapCacheSystemInfoGetMacroTileSize(cache->sysConfig)) - 1; + size_t stride = 8 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig); + int location = 0; + int x; + for (x = 0; x < tilesWide; ++x) { + if (!(x & macroTile)) { + location = mMapCacheTileId(cache, x, y); + } else { + ++location; + } + struct mMapCacheEntry* status = &cache->status[location]; + if (!mMapCacheEntryFlagsIsVramClean(status->flags)) { + status->flags = mMapCacheEntryFlagsFillVramClean(status->flags); + cache->mapParser(cache, status, &cache->vram[cache->mapStart + (location << mMapCacheSystemInfoGetMapAlign(cache->sysConfig))]); + } + unsigned tileId = status->tileId + cache->tileStart; + if (tileId >= mTileCacheSystemInfoGetMaxTiles(cache->tileCache->sysConfig)) { + tileId = 0; + } + const color_t* tile = mTileCacheGetTile(cache->tileCache, tileId, mMapCacheEntryFlagsGetPaletteId(status->flags)); + color_t* mapOut = &cache->cache[(y * stride + x) * 8]; + _cleanTile(cache, tile, mapOut, status); + } +} + const color_t* mMapCacheGetRow(struct mMapCache* cache, unsigned y) { size_t stride = 8 << mMapCacheSystemInfoGetTilesWide(cache->sysConfig); return &cache->cache[y * stride]; diff --git a/src/platform/python/_builder.h b/src/platform/python/_builder.h index 9476a37dc..cb823125b 100644 --- a/src/platform/python/_builder.h +++ b/src/platform/python/_builder.h @@ -8,8 +8,14 @@ #define ATTRIBUTE_FORMAT(X, Y, Z) #define DECL_BITFIELD(newtype, oldtype) typedef oldtype newtype -#define DECL_BIT(type, name, bit) -#define DECL_BITS(type, name, bit, nbits) +#define DECL_BIT(type, field, bit) DECL_BITS(type, field, bit, 1) +#define DECL_BITS(TYPE, FIELD, START, SIZE) \ + TYPE TYPE ## Is ## FIELD (TYPE); \ + TYPE TYPE ## Get ## FIELD (TYPE); \ + TYPE TYPE ## Clear ## FIELD (TYPE); \ + TYPE TYPE ## Fill ## FIELD (TYPE); \ + TYPE TYPE ## Set ## FIELD (TYPE, TYPE); \ + TYPE TYPE ## TestFill ## FIELD (TYPE, bool); #define CXX_GUARD_START #define CXX_GUARD_END @@ -29,9 +35,10 @@ void free(void*); #include "flags.h" -#include -#include #include +#include +#include +#include #include #include diff --git a/src/platform/python/_builder.py b/src/platform/python/_builder.py index 0576be542..0d57d4173 100644 --- a/src/platform/python/_builder.py +++ b/src/platform/python/_builder.py @@ -17,14 +17,17 @@ if __name__ == "__main__": cppflags.extend(["-I" + incdir, "-I" + srcdir, "-I" + bindir]) ffi.set_source("mgba._pylib", """ +#define static +#define inline #include "flags.h" #define OPAQUE_THREADING +#include #include #include +#include #include #include #include -#include #include #include #include diff --git a/src/platform/python/mgba/core.py b/src/platform/python/mgba/core.py index 029c6a0ff..8b7abbf84 100644 --- a/src/platform/python/mgba/core.py +++ b/src/platform/python/mgba/core.py @@ -117,6 +117,14 @@ class Core(object): t.append(tile.TileView(lib.mTileCacheSetGetPointer(ts, i))) return t + @cached_property + def maps(self): + m = [] + ms = ffi.addressof(self.graphicsCache.cache.maps) + for i in range(lib.mMapCacheSetSize(ms)): + m.append(tile.MapView(lib.mMapCacheSetGetPointer(ms, i))) + return m + @classmethod def _init(cls, native): core = ffi.gc(native, native.deinit) diff --git a/src/platform/python/mgba/tile.py b/src/platform/python/mgba/tile.py index e48973cde..3dbc060ad 100644 --- a/src/platform/python/mgba/tile.py +++ b/src/platform/python/mgba/tile.py @@ -32,6 +32,27 @@ class TileView: def getTile(self, tile, palette): return Tile(lib.mTileCacheGetTile(self.cache, tile, palette)) +class MapView: + def __init__(self, cache): + self.cache = cache + + @property + def width(self): + return 1 << lib.mMapCacheSystemInfoGetTilesWide(self.cache.sysConfig) + + @property + def height(self): + return 1 << lib.mMapCacheSystemInfoGetTilesHigh(self.cache.sysConfig) + + @property + def image(self): + i = image.Image(self.width * 8, self.height * 8, alpha=True) + for y in range(self.height * 8): + if not y & 7: + lib.mMapCacheCleanRow(self.cache, y >> 3) + row = lib.mMapCacheGetRow(self.cache, y) + ffi.memmove(ffi.addressof(i.buffer, i.stride * y), row, self.width * 8 * ffi.sizeof("color_t")) + return i class Sprite(object): def constitute(self, tileView, tilePitch): From 883e7729f4071d868728e6574d21f84fcd646c49 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 25 Sep 2017 00:07:51 -0700 Subject: [PATCH 138/158] Python: Better protect stuff that gets gc'd --- src/platform/python/mgba/core.py | 5 +++++ src/platform/python/mgba/gb.py | 3 ++- src/platform/python/mgba/gba.py | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/platform/python/mgba/core.py b/src/platform/python/mgba/core.py index 8b7abbf84..837f4188f 100644 --- a/src/platform/python/mgba/core.py +++ b/src/platform/python/mgba/core.py @@ -105,8 +105,13 @@ class Core(object): self._core.addCoreCallbacks(self._core, self._callbacks.context) self.config = Config(ffi.addressof(native.config)) + def __del__(self): + self._wasReset = False + @cached_property def graphicsCache(self): + if not self._wasReset: + raise RuntimeError("Core must be reset first") return tile.CacheSet(self) @cached_property diff --git a/src/platform/python/mgba/gb.py b/src/platform/python/mgba/gb.py index bd629922d..f70f9173f 100644 --- a/src/platform/python/mgba/gb.py +++ b/src/platform/python/mgba/gb.py @@ -32,8 +32,9 @@ class GB(Core): lib.GBVideoCacheAssociate(cache, ffi.addressof(self._native.video)) def _deinitCache(self, cache): - self._native.video.renderer.cache = ffi.NULL lib.mCacheSetDeinit(cache) + if self._wasReset: + self._native.video.renderer.cache = ffi.NULL def reset(self): super(GB, self).reset() diff --git a/src/platform/python/mgba/gba.py b/src/platform/python/mgba/gba.py index 2cec1ec42..bbe544683 100644 --- a/src/platform/python/mgba/gba.py +++ b/src/platform/python/mgba/gba.py @@ -40,8 +40,9 @@ class GBA(Core): lib.GBAVideoCacheAssociate(cache, ffi.addressof(self._native.video)) def _deinitCache(self, cache): - self._native.video.renderer.cache = ffi.NULL lib.mCacheSetDeinit(cache) + if self._wasReset: + self._native.video.renderer.cache = ffi.NULL def reset(self): super(GBA, self).reset() From 17e5b6a4553bd459ee5295585adb295cb72d65d8 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 25 Sep 2017 00:12:20 -0700 Subject: [PATCH 139/158] Qt: Fix fast forward crashing when no game loaded --- src/platform/qt/Window.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 1b6232a00..5c40ef52d 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -1167,9 +1167,13 @@ void Window::setupMenu(QMenuBar* menubar) { emulationMenu->addSeparator(); m_shortcutController->addFunctions(emulationMenu, [this]() { - m_controller->setFastForward(true); + if (m_controller) { + m_controller->setFastForward(true); + } }, [this]() { - m_controller->setFastForward(false); + if (m_controller) { + m_controller->setFastForward(false); + } }, QKeySequence(Qt::Key_Tab), tr("Fast forward (held)"), "holdFastForward"); QAction* turbo = new QAction(tr("&Fast forward"), emulationMenu); From 05729c5492c8202503032fb3d0f91e09695bc070 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 25 Sep 2017 00:13:11 -0700 Subject: [PATCH 140/158] All: Update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 205ebea9b..1fcd5f59a 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Features: - Super Game Boy support - Customizable autofire speed - Ability to set default Game Boy model + - Map viewer Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - Python: Fix importing .gb or .gba before .core From 148e7cd0b55ffd3edd961072f658359961063db8 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 25 Sep 2017 00:18:54 -0700 Subject: [PATCH 141/158] All: Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aaa8fd3fa..c456d3f50 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Features - Save type detection, even for flash memory size[[2]](#flashdetect). - Support for cartridges with motion sensors and rumble (only usable with game controllers). - Real-time clock support, even without configuration. +- Game Boy Camera and Game Boy Printer support. - A built-in BIOS implementation, and ability to load external BIOS files. - Turbo/fast-forward support by holding Tab. - Rewind by holding Backquote. @@ -45,7 +46,6 @@ Features - A comprehensive debug suite. - e-Reader support. - Wireless adapter support. -- Game Boy Printer support. Supported Platforms ------------------- From a949fdfcedb5792685e485ee0ac68d6cc1a81d76 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 26 Sep 2017 15:40:49 -0700 Subject: [PATCH 142/158] GB: Revamp IRQ handling based on new information --- CHANGES | 1 + include/mgba/internal/gb/serialize.h | 4 +- include/mgba/internal/lr35902/lr35902.h | 4 +- src/gb/gb.c | 55 ++-- src/gb/serialize.c | 2 - src/lr35902/lr35902.c | 14 +- .../interrupts/ie_push/baseline_0000.png | Bin 0 -> 518 bytes .../acceptance/interrupts/ie_push/test.gb | Bin 0 -> 32768 bytes .../acceptance/interrupts/ie_push/test.sym | 282 ++++++++++++++++++ 9 files changed, 324 insertions(+), 38 deletions(-) create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/baseline_0000.png create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/test.gb create mode 100644 src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/test.sym diff --git a/CHANGES b/CHANGES index 1fcd5f59a..9fb97aeff 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,7 @@ Bugfixes: - GBA Video: Fix broken sprite blending hack (fixes mgba.io/i/532) - GBA I/O: Fix reading from a few invalid I/O registers (fixes mgba.io/i/876) - GBA Savedata: Fix size of SRAM saves (fixes mgba.io/i/883) + - GB: Revamp IRQ handling based on new information Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/include/mgba/internal/gb/serialize.h b/include/mgba/internal/gb/serialize.h index 71d2c78b7..2acf592d4 100644 --- a/include/mgba/internal/gb/serialize.h +++ b/include/mgba/internal/gb/serialize.h @@ -42,7 +42,7 @@ mLOG_DECLARE_CATEGORY(GB_STATE); * | 0x00036 - 0x00037: Index address * | 0x00038: Bus value * | 0x00039: Execution state - * | 0x0003A - 0x0003B: IRQ vector + * | 0x0003A - 0x0003B: Reserved * | 0x0003C - 0x0003F: EI pending cycles * | 0x00040 - 0x00043: Reserved (DI pending cycles) * | 0x00044 - 0x00047: Flags @@ -287,7 +287,7 @@ struct GBSerializedState { uint8_t bus; uint8_t executionState; - uint16_t irqVector; + uint16_t reserved; uint32_t eiPending; int32_t reservedDiPending; diff --git a/include/mgba/internal/lr35902/lr35902.h b/include/mgba/internal/lr35902/lr35902.h index 3e586f0ed..c5bfd1381 100644 --- a/include/mgba/internal/lr35902/lr35902.h +++ b/include/mgba/internal/lr35902/lr35902.h @@ -66,6 +66,7 @@ struct LR35902InterruptHandler { void (*reset)(struct LR35902Core* cpu); void (*processEvents)(struct LR35902Core* cpu); void (*setInterrupts)(struct LR35902Core* cpu, bool enable); + uint16_t (*irqVector)(struct LR35902Core* cpu); void (*halt)(struct LR35902Core* cpu); void (*stop)(struct LR35902Core* cpu); @@ -118,7 +119,6 @@ struct LR35902Core { LR35902Instruction instruction; bool irqPending; - uint16_t irqVector; struct LR35902Memory memory; struct LR35902InterruptHandler irqh; @@ -136,7 +136,7 @@ void LR35902HotplugAttach(struct LR35902Core* cpu, size_t slot); void LR35902HotplugDetach(struct LR35902Core* cpu, size_t slot); void LR35902Reset(struct LR35902Core* cpu); -void LR35902RaiseIRQ(struct LR35902Core* cpu, uint8_t vector); +void LR35902RaiseIRQ(struct LR35902Core* cpu); void LR35902Tick(struct LR35902Core* cpu); void LR35902Run(struct LR35902Core* cpu); diff --git a/src/gb/gb.c b/src/gb/gb.c index d4a5c3268..c75992461 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -39,6 +39,7 @@ static void GBDeinit(struct mCPUComponent* component); static void GBInterruptHandlerInit(struct LR35902InterruptHandler* irqh); static void GBProcessEvents(struct LR35902Core* cpu); static void GBSetInterrupts(struct LR35902Core* cpu, bool enable); +static uint16_t GBIRQVector(struct LR35902Core* cpu); static void GBIllegal(struct LR35902Core* cpu); static void GBStop(struct LR35902Core* cpu); @@ -371,6 +372,7 @@ void GBInterruptHandlerInit(struct LR35902InterruptHandler* irqh) { irqh->reset = GBReset; irqh->processEvents = GBProcessEvents; irqh->setInterrupts = GBSetInterrupts; + irqh->irqVector = GBIRQVector; irqh->hitIllegal = GBIllegal; irqh->stop = GBStop; irqh->halt = GBHalt; @@ -596,31 +598,7 @@ void GBUpdateIRQs(struct GB* gb) { if (!gb->memory.ime || gb->cpu->irqPending) { return; } - - if (irqs & (1 << GB_IRQ_VBLANK)) { - LR35902RaiseIRQ(gb->cpu, GB_VECTOR_VBLANK); - gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_VBLANK); - return; - } - if (irqs & (1 << GB_IRQ_LCDSTAT)) { - LR35902RaiseIRQ(gb->cpu, GB_VECTOR_LCDSTAT); - gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_LCDSTAT); - return; - } - if (irqs & (1 << GB_IRQ_TIMER)) { - LR35902RaiseIRQ(gb->cpu, GB_VECTOR_TIMER); - gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_TIMER); - return; - } - if (irqs & (1 << GB_IRQ_SIO)) { - LR35902RaiseIRQ(gb->cpu, GB_VECTOR_SIO); - gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_SIO); - return; - } - if (irqs & (1 << GB_IRQ_KEYPAD)) { - LR35902RaiseIRQ(gb->cpu, GB_VECTOR_KEYPAD); - gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_KEYPAD); - } + LR35902RaiseIRQ(gb->cpu); } void GBProcessEvents(struct LR35902Core* cpu) { @@ -663,6 +641,33 @@ void GBSetInterrupts(struct LR35902Core* cpu, bool enable) { } } +uint16_t GBIRQVector(struct LR35902Core* cpu) { + struct GB* gb = (struct GB*) cpu->master; + int irqs = gb->memory.ie & gb->memory.io[REG_IF]; + + if (irqs & (1 << GB_IRQ_VBLANK)) { + gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_VBLANK); + return GB_VECTOR_VBLANK; + } + if (irqs & (1 << GB_IRQ_LCDSTAT)) { + gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_LCDSTAT); + return GB_VECTOR_LCDSTAT; + } + if (irqs & (1 << GB_IRQ_TIMER)) { + gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_TIMER); + return GB_VECTOR_TIMER; + } + if (irqs & (1 << GB_IRQ_SIO)) { + gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_SIO); + return GB_VECTOR_SIO; + } + if (irqs & (1 << GB_IRQ_KEYPAD)) { + gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_KEYPAD); + return GB_VECTOR_KEYPAD; + } + return 0; +} + static void _enableInterrupts(struct mTiming* timing, void* user, uint32_t cyclesLate) { UNUSED(timing); UNUSED(cyclesLate); diff --git a/src/gb/serialize.c b/src/gb/serialize.c index ac5c58ba1..c37b3872b 100644 --- a/src/gb/serialize.c +++ b/src/gb/serialize.c @@ -47,7 +47,6 @@ void GBSerialize(struct GB* gb, struct GBSerializedState* state) { STORE_16LE(gb->cpu->index, 0, &state->cpu.index); state->cpu.bus = gb->cpu->bus; state->cpu.executionState = gb->cpu->executionState; - STORE_16LE(gb->cpu->irqVector, 0, &state->cpu.irqVector); GBSerializedCpuFlags flags = 0; flags = GBSerializedCpuFlagsSetCondition(flags, gb->cpu->condition); @@ -154,7 +153,6 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { LOAD_16LE(gb->cpu->index, 0, &state->cpu.index); gb->cpu->bus = state->cpu.bus; gb->cpu->executionState = state->cpu.executionState; - LOAD_16LE(gb->cpu->irqVector, 0, &state->cpu.irqVector); GBSerializedCpuFlags flags; LOAD_32LE(flags, 0, &state->cpu.flags); diff --git a/src/lr35902/lr35902.c b/src/lr35902/lr35902.c index e4100a84a..6dd9db9ef 100644 --- a/src/lr35902/lr35902.c +++ b/src/lr35902/lr35902.c @@ -70,9 +70,8 @@ void LR35902Reset(struct LR35902Core* cpu) { cpu->irqh.reset(cpu); } -void LR35902RaiseIRQ(struct LR35902Core* cpu, uint8_t vector) { +void LR35902RaiseIRQ(struct LR35902Core* cpu) { cpu->irqPending = true; - cpu->irqVector = vector; } static void _LR35902InstructionIRQStall(struct LR35902Core* cpu) { @@ -85,18 +84,19 @@ static void _LR35902InstructionIRQFinish(struct LR35902Core* cpu) { } static void _LR35902InstructionIRQDelay(struct LR35902Core* cpu) { - cpu->index = cpu->sp + 1; - cpu->bus = cpu->pc >> 8; + --cpu->sp; + cpu->index = cpu->sp; + cpu->bus = cpu->pc; cpu->executionState = LR35902_CORE_MEMORY_STORE; cpu->instruction = _LR35902InstructionIRQFinish; - cpu->pc = cpu->irqVector; + cpu->pc = cpu->irqh.irqVector(cpu); cpu->memory.setActiveRegion(cpu, cpu->pc); } static void _LR35902InstructionIRQ(struct LR35902Core* cpu) { - cpu->sp -= 2; /* TODO: Atomic incrementing? */ + --cpu->sp; cpu->index = cpu->sp; - cpu->bus = cpu->pc; + cpu->bus = cpu->pc >> 8; cpu->executionState = LR35902_CORE_MEMORY_STORE; cpu->instruction = _LR35902InstructionIRQDelay; } diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..30590ffab18e5deb12be845930a52ab18642fc14 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Vn(PZ!6KiaBquU+ii&U|?{x z{qsNmo1B;Hnym>_oA=IKKFMK%PG{+y=amayKVL83P|Yc$UNGlCA=7aXVT-=? z!k=yOkD14xIsL}yU*6ou>NjH3zniQ39G*S5wqpCv-MoGwmU%1ReYcCb`1o>KP3^w? ztOf5>mpy*jtQ#kFe`4bIZO>aK*KeA(W&QeB-gmZts{j0uW&QSw+MxBj7WH4RJhN-X q{>0ypYS_V6!tEYqAjbqaH2yLz>&fNk@rld;#jmHUpUXO@geCx}Th!

    Y3!xjdkP#9(~2wfnExReM*EgiI@tQmrhvSr;cbgZkl*}LZ+ z-6y*kDrgI1JqPQ@IrrS}Ip_24Gw2WL&l{i3R*rgwz{;qKuW21$!&Uzu=zq20(+XZuvVtI_doM2+x_0X?EClczx(2?TW2%b-5=b$|K5u~z4hu5 z>&e;K?9_Ls9zHv1&QD#KXXE3Hn{tFb{Kjh^mV=2EhO>WhU4MSc{&sb_(q_3T8~x~J zb&yOBm`~20IX8W7d%-SuT~qhEVQNphr_a2Yy>yySeFkPfzg>@u^-2CfNV?NUJ{{y+ z^(nq96x%`3X%cB}*Jh`uuE`I1U~;|MCa0O1nL54g+?VPTToi)tbnmCnU93;>Euq*B zignDr&s*2ronDx`6+|zcpUs}-2WdNsGxe#>3$?bInmjyT=Knx6I}soPM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I zhyW2F0`(HeZ!-86`zAL}{{J5jxTc#;s~TgP2JsNL&Fc`!llYu7dME*`oV)fpJn-c z2M>Y=1`S#kJfkn4k;vsxKcA0Ab2(L&>yZffPyzGv`K|Rq4<2$I-&>Zd)@DHE z+Pu<7LXC}vaq5&|AaCdyI>m0m!!^hOFC4aQn1?ak4HMe-_3Kx!PE44l&u4H82C)ms zUs$khc)+vVzr@Y9!(q7&t8zV;i$)g~qTF&hSg-lW8|p7DUB52(!{qrqJjdgZk5?A> zTNd~}ADjl4OXk~lA~7;DHG@LjV%VbWRNG4<4U_Bn6oJ^;WA0HS%eV;E- zHN3t!A1Xlp=5Ilamt@;Dg~kjq|JAEGr(D`FO{`T_De|Vd#1|taHQNjP>@W zQnuaO>vG{V;V|$C24Nk}b`__%zrmMxq^8Zy!Q{bUDAe8E)dl&Wi-vq5Ha$H)4%Fd2 z*r7u`J#f*{!w%*3f!M^vj6>)6=zeI0Kt~JOjFp_bmKpg({Hm^XYmwH(f{ml9fC$ zaQ$1jX`1X0cJ=h6Qt%2_y=LGq{POPJfVbKB=p=u4InZqU6C$_G9p0}s8-IVK=x0j` zGnZFB9`v(yRf$ zvx4$m0={I`lq<_|M<8n}6Y&#_z=p{D*0lPx3|{Q;sH~)dqexO2DE8iEc24{^MD-ChUYa*r&Fy&{s6(kv#+$AM{ zjq$4FUEw*BzZI?{30xjvJ`@<`1wIz88fQwwaWM=OXy64}WPyh;UM+Aycus+^aGe6B z?{LYKh^fbz@@?D-k}8*MmXcYFS0!`8b0nV=t|JLO{{-`)=L|3K3*o9ZQ*Pn{6xhKF z?3M-I#CWy9ec?F;J`k=`p!5WnWJ55#+Rv0G@vZ?RU0kwNN(L}qmFyOtBl)Os9ZBdp zjrq{?1zzB^aMc7;p1=htu#*?iWr3$LUM=t=;W-6v2-hi4dWuW_O2pI@Q*Pr{kZk0V zZBp_bj8`T9C_G20nRBjX7t^=%nSZBC`1kgE67AmtGOB0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I QhyW2F0z`la{I3!CFDiJ~1poj5 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/test.sym new file mode 100644 index 000000000..84a14d360 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/acceptance/interrupts/ie_push/test.sym @@ -0,0 +1,282 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/acceptance/interrupts/ie_push.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0200 round1 +00:0214 finish_round1 +00:021d round2 +00:0224 round3 +00:0235 target +00:0238 finish_round3 +00:023f round4 +00:0253 finish_round4 +00:0270 _wait_ly_4 +00:0276 _wait_ly_5 +00:028c _print_results_halt_1 +00:028f _test_ok_cb_0 +00:0297 _print_sl_data55 +00:029f _print_sl_out55 +00:1000 fail_round1_nointr +00:1017 _wait_ly_6 +00:101d _wait_ly_7 +00:1033 _print_results_halt_2 +00:1036 _test_failure_cb_0 +00:103e _print_sl_data56 +00:104f _print_sl_out56 +00:1052 fail_round1_nocancel +00:1069 _wait_ly_8 +00:106f _wait_ly_9 +00:1085 _print_results_halt_3 +00:1088 _test_failure_cb_1 +00:1090 _print_sl_data57 +00:10a2 _print_sl_out57 +00:10a5 fail_round1_if +00:10bc _wait_ly_10 +00:10c2 _wait_ly_11 +00:10d8 _print_results_halt_4 +00:10db _test_failure_cb_2 +00:10e3 _print_sl_data58 +00:10f3 _print_sl_out58 +00:10f6 fail_round2_intr +00:110d _wait_ly_12 +00:1113 _wait_ly_13 +00:1129 _print_results_halt_5 +00:112c _test_failure_cb_3 +00:1134 _print_sl_data59 +00:1146 _print_sl_out59 +00:1149 fail_round3_nointr +00:1160 _wait_ly_14 +00:1166 _wait_ly_15 +00:117c _print_results_halt_6 +00:117f _test_failure_cb_4 +00:1187 _print_sl_data60 +00:1198 _print_sl_out60 +00:119b fail_round3_cancel +00:11b2 _wait_ly_16 +00:11b8 _wait_ly_17 +00:11ce _print_results_halt_7 +00:11d1 _test_failure_cb_5 +00:11d9 _print_sl_data61 +00:11ed _print_sl_out61 +00:11f0 fail_round3_if +00:1207 _wait_ly_18 +00:120d _wait_ly_19 +00:1223 _print_results_halt_8 +00:1226 _test_failure_cb_6 +00:122e _print_sl_data62 +00:123e _print_sl_out62 +00:1241 fail_round4_nointr +00:1258 _wait_ly_20 +00:125e _wait_ly_21 +00:1274 _print_results_halt_9 +00:1277 _test_failure_cb_7 +00:127f _print_sl_data63 +00:1290 _print_sl_out63 +00:1293 fail_round4_cancel +00:12aa _wait_ly_22 +00:12b0 _wait_ly_23 +00:12c6 _print_results_halt_10 +00:12c9 _test_failure_cb_8 +00:12d1 _print_sl_data64 +00:12e5 _print_sl_out64 +00:12e8 fail_round4_if +00:12ff _wait_ly_24 +00:1305 _wait_ly_25 +00:131b _print_results_halt_11 +00:131e _test_failure_cb_9 +00:1326 _print_sl_data65 +00:1333 _print_sl_out65 +00:1336 fail_round4_vblank +00:134d _wait_ly_26 +00:1353 _wait_ly_27 +00:1369 _print_results_halt_12 +00:136c _test_failure_cb_10 +00:1374 _print_sl_data66 +00:1383 _print_sl_out66 From 431ee76c1a362188012ec1ddbf6213422f82dfb4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 26 Sep 2017 16:24:58 -0700 Subject: [PATCH 143/158] GB Video: Fix read mode when enabling LCD --- CHANGES | 1 + src/gb/video.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 9fb97aeff..c974dfdfa 100644 --- a/CHANGES +++ b/CHANGES @@ -45,6 +45,7 @@ Bugfixes: - GBA I/O: Fix reading from a few invalid I/O registers (fixes mgba.io/i/876) - GBA Savedata: Fix size of SRAM saves (fixes mgba.io/i/883) - GB: Revamp IRQ handling based on new information + - GB Video: Fix read mode when enabling LCD Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gb/video.c b/src/gb/video.c index fea78d19b..0c40d959d 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -418,9 +418,8 @@ void GBVideoWriteLCDC(struct GBVideo* video, GBRegisterLCDC value) { video->ly = 0; video->p->memory.io[REG_LY] = 0; - // TODO: Does this read as 0 for 4 T-cycles? GBRegisterSTAT oldStat = video->stat; - video->stat = GBRegisterSTATSetMode(video->stat, 2); + video->stat = GBRegisterSTATSetMode(video->stat, 0); video->stat = GBRegisterSTATSetLYC(video->stat, video->ly == video->p->memory.io[REG_LYC]); if (!_statIRQAsserted(video, oldStat) && _statIRQAsserted(video, video->stat)) { video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT); From b11171c6f1144ff00d5094454662f3ad4e4f5b4f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 26 Sep 2017 18:21:51 -0700 Subject: [PATCH 144/158] GB Video: Expand custom palettes to separate BG/OBJ palettes --- include/mgba/internal/gb/overrides.h | 2 +- include/mgba/internal/gb/video.h | 2 +- src/gb/core.c | 24 +++++++ src/gb/overrides.c | 102 ++++++++++++++++++++------- src/gb/video.c | 42 ++++++----- 5 files changed, 129 insertions(+), 43 deletions(-) diff --git a/include/mgba/internal/gb/overrides.h b/include/mgba/internal/gb/overrides.h index 44d012183..f138ee9c8 100644 --- a/include/mgba/internal/gb/overrides.h +++ b/include/mgba/internal/gb/overrides.h @@ -17,7 +17,7 @@ struct GBCartridgeOverride { enum GBModel model; enum GBMemoryBankControllerType mbc; - uint32_t gbColors[4]; + uint32_t gbColors[12]; }; struct Configuration; diff --git a/include/mgba/internal/gb/video.h b/include/mgba/internal/gb/video.h index f5e958caf..b808d39bc 100644 --- a/include/mgba/internal/gb/video.h +++ b/include/mgba/internal/gb/video.h @@ -145,7 +145,7 @@ struct GBVideo { bool ocpIncrement; uint8_t sgbCommandHeader; - uint16_t dmgPalette[4]; + uint16_t dmgPalette[12]; uint16_t palette[64]; bool sgbBorders; diff --git a/src/gb/core.c b/src/gb/core.c index 21bc25995..c7e801be9 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -179,6 +179,30 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf if (mCoreConfigGetIntValue(config, "gb.pal[3]", &color)) { GBVideoSetPalette(&gb->video, 3, color); } + if (mCoreConfigGetIntValue(config, "gb.pal[4]", &color)) { + GBVideoSetPalette(&gb->video, 4, color); + } + if (mCoreConfigGetIntValue(config, "gb.pal[5]", &color)) { + GBVideoSetPalette(&gb->video, 5, color); + } + if (mCoreConfigGetIntValue(config, "gb.pal[6]", &color)) { + GBVideoSetPalette(&gb->video, 6, color); + } + if (mCoreConfigGetIntValue(config, "gb.pal[7]", &color)) { + GBVideoSetPalette(&gb->video, 7, color); + } + if (mCoreConfigGetIntValue(config, "gb.pal[8]", &color)) { + GBVideoSetPalette(&gb->video, 8, color); + } + if (mCoreConfigGetIntValue(config, "gb.pal[9]", &color)) { + GBVideoSetPalette(&gb->video, 9, color); + } + if (mCoreConfigGetIntValue(config, "gb.pal[10]", &color)) { + GBVideoSetPalette(&gb->video, 10, color); + } + if (mCoreConfigGetIntValue(config, "gb.pal[11]", &color)) { + GBVideoSetPalette(&gb->video, 11, color); + } mCoreConfigCopyValue(&core->config, config, "gb.bios"); mCoreConfigCopyValue(&core->config, config, "sgb.bios"); diff --git a/src/gb/overrides.c b/src/gb/overrides.c index 738dcd443..4f598544c 100644 --- a/src/gb/overrides.c +++ b/src/gb/overrides.c @@ -19,6 +19,7 @@ static const struct GBCartridgeOverride _overrides[] = { bool GBOverrideFind(const struct Configuration* config, struct GBCartridgeOverride* override) { override->model = GB_MODEL_AUTODETECT; override->mbc = GB_MBC_AUTODETECT; + memset(override->gbColors, 0, sizeof(override->gbColors)); bool found = false; int i; @@ -35,11 +36,19 @@ bool GBOverrideFind(const struct Configuration* config, struct GBCartridgeOverri snprintf(sectionName, sizeof(sectionName), "gb.override.%08X", override->headerCrc32); const char* model = ConfigurationGetValue(config, sectionName, "model"); const char* mbc = ConfigurationGetValue(config, sectionName, "mbc"); - const char* pal[4] = { + const char* pal[12] = { ConfigurationGetValue(config, sectionName, "pal[0]"), ConfigurationGetValue(config, sectionName, "pal[1]"), ConfigurationGetValue(config, sectionName, "pal[2]"), - ConfigurationGetValue(config, sectionName, "pal[3]") + ConfigurationGetValue(config, sectionName, "pal[3]"), + ConfigurationGetValue(config, sectionName, "pal[4]"), + ConfigurationGetValue(config, sectionName, "pal[5]"), + ConfigurationGetValue(config, sectionName, "pal[6]"), + ConfigurationGetValue(config, sectionName, "pal[7]"), + ConfigurationGetValue(config, sectionName, "pal[8]"), + ConfigurationGetValue(config, sectionName, "pal[9]"), + ConfigurationGetValue(config, sectionName, "pal[10]"), + ConfigurationGetValue(config, sectionName, "pal[11]") }; if (model) { @@ -56,18 +65,25 @@ bool GBOverrideFind(const struct Configuration* config, struct GBCartridgeOverri } } - if (pal[0] && pal[1] && pal[2] && pal[3]) { - int i; - for (i = 0; i < 4; ++i) { - char* end; - unsigned long value = strtoul(pal[i], &end, 10); - if (end == &pal[i][1] && *end == 'x') { - value = strtoul(pal[i], &end, 16); - } - if (*end) { - continue; - } - override->gbColors[i] = value; + for (i = 0; i < 12; ++i) { + if (!pal[i]) { + continue; + } + char* end; + unsigned long value = strtoul(pal[i], &end, 10); + if (end == &pal[i][1] && *end == 'x') { + value = strtoul(pal[i], &end, 16); + } + if (*end) { + continue; + } + value |= 0xFF000000; + override->gbColors[i] = value; + if (i < 8) { + override->gbColors[i + 4] = value; + } + if (i < 4) { + override->gbColors[i + 8] = value; } } } @@ -80,12 +96,43 @@ void GBOverrideSave(struct Configuration* config, const struct GBCartridgeOverri const char* model = GBModelToName(override->model); ConfigurationSetValue(config, sectionName, "model", model); - if (override->gbColors[0] | override->gbColors[1] | override->gbColors[2] | override->gbColors[3]) { - ConfigurationSetIntValue(config, sectionName, "pal[0]", override->gbColors[0]); - ConfigurationSetIntValue(config, sectionName, "pal[1]", override->gbColors[1]); - ConfigurationSetIntValue(config, sectionName, "pal[2]", override->gbColors[2]); - ConfigurationSetIntValue(config, sectionName, "pal[3]", override->gbColors[3]); + if (override->gbColors[0] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[0]", override->gbColors[0] & ~0xFF000000); } + if (override->gbColors[1] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[1]", override->gbColors[1] & ~0xFF000000); + } + if (override->gbColors[2] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[2]", override->gbColors[2] & ~0xFF000000); + } + if (override->gbColors[3] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[3]", override->gbColors[3] & ~0xFF000000); + } + if (override->gbColors[4] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[4]", override->gbColors[4] & ~0xFF000000); + } + if (override->gbColors[5] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[5]", override->gbColors[5] & ~0xFF000000); + } + if (override->gbColors[6] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[6]", override->gbColors[6] & ~0xFF000000); + } + if (override->gbColors[7] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[7]", override->gbColors[7] & ~0xFF000000); + } + if (override->gbColors[8] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[8]", override->gbColors[8] & ~0xFF000000); + } + if (override->gbColors[9] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[9]", override->gbColors[9] & ~0xFF000000); + } + if (override->gbColors[10] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[10]", override->gbColors[10] & ~0xFF000000); + } + if (override->gbColors[11] & 0xFF000000) { + ConfigurationSetIntValue(config, sectionName, "pal[11]", override->gbColors[11] & ~0xFF000000); + } + if (override->mbc != GB_MBC_AUTODETECT) { ConfigurationSetIntValue(config, sectionName, "mbc", override->mbc); } else { @@ -103,11 +150,18 @@ void GBOverrideApply(struct GB* gb, const struct GBCartridgeOverride* override) GBMBCInit(gb); } - if (override->gbColors[0] | override->gbColors[1] | override->gbColors[2] | override->gbColors[3]) { - GBVideoSetPalette(&gb->video, 0, override->gbColors[0]); - GBVideoSetPalette(&gb->video, 1, override->gbColors[1]); - GBVideoSetPalette(&gb->video, 2, override->gbColors[2]); - GBVideoSetPalette(&gb->video, 3, override->gbColors[3]); + int i; + for (i = 0; i < 12; ++i) { + if (!(override->gbColors[i] & 0xFF000000)) { + continue; + } + GBVideoSetPalette(&gb->video, i, override->gbColors[i]); + if (i < 8) { + GBVideoSetPalette(&gb->video, i + 4, override->gbColors[i]); + } + if (i < 4) { + GBVideoSetPalette(&gb->video, i + 8, override->gbColors[i]); + } } } diff --git a/src/gb/video.c b/src/gb/video.c index 0c40d959d..a8d756b63 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -72,6 +72,14 @@ void GBVideoInit(struct GBVideo* video) { video->dmgPalette[1] = 0x56B5; video->dmgPalette[2] = 0x294A; video->dmgPalette[3] = 0x0000; + video->dmgPalette[4] = 0x7FFF; + video->dmgPalette[5] = 0x56B5; + video->dmgPalette[6] = 0x294A; + video->dmgPalette[7] = 0x0000; + video->dmgPalette[8] = 0x7FFF; + video->dmgPalette[9] = 0x56B5; + video->dmgPalette[10] = 0x294A; + video->dmgPalette[11] = 0x0000; video->sgbBorders = true; @@ -115,14 +123,14 @@ void GBVideoReset(struct GBVideo* video) { video->palette[1] = video->dmgPalette[1]; video->palette[2] = video->dmgPalette[2]; video->palette[3] = video->dmgPalette[3]; - video->palette[8 * 4 + 0] = video->dmgPalette[0]; - video->palette[8 * 4 + 1] = video->dmgPalette[1]; - video->palette[8 * 4 + 2] = video->dmgPalette[2]; - video->palette[8 * 4 + 3] = video->dmgPalette[3]; - video->palette[9 * 4 + 0] = video->dmgPalette[0]; - video->palette[9 * 4 + 1] = video->dmgPalette[1]; - video->palette[9 * 4 + 2] = video->dmgPalette[2]; - video->palette[9 * 4 + 3] = video->dmgPalette[3]; + video->palette[8 * 4 + 0] = video->dmgPalette[4]; + video->palette[8 * 4 + 1] = video->dmgPalette[5]; + video->palette[8 * 4 + 2] = video->dmgPalette[6]; + video->palette[8 * 4 + 3] = video->dmgPalette[7]; + video->palette[9 * 4 + 0] = video->dmgPalette[8]; + video->palette[9 * 4 + 1] = video->dmgPalette[9]; + video->palette[9 * 4 + 2] = video->dmgPalette[10]; + video->palette[9 * 4 + 3] = video->dmgPalette[11]; video->renderer->deinit(video->renderer); video->renderer->init(video->renderer, video->p->model, video->sgbBorders); @@ -478,20 +486,20 @@ void GBVideoWritePalette(struct GBVideo* video, uint16_t address, uint8_t value) video->renderer->writePalette(video->renderer, 3, video->palette[3]); break; case REG_OBP0: - video->palette[8 * 4 + 0] = video->dmgPalette[value & 3]; - video->palette[8 * 4 + 1] = video->dmgPalette[(value >> 2) & 3]; - video->palette[8 * 4 + 2] = video->dmgPalette[(value >> 4) & 3]; - video->palette[8 * 4 + 3] = video->dmgPalette[(value >> 6) & 3]; + video->palette[8 * 4 + 0] = video->dmgPalette[(value & 3) + 4]; + video->palette[8 * 4 + 1] = video->dmgPalette[((value >> 2) & 3) + 4]; + video->palette[8 * 4 + 2] = video->dmgPalette[((value >> 4) & 3) + 4]; + video->palette[8 * 4 + 3] = video->dmgPalette[((value >> 6) & 3) + 4]; video->renderer->writePalette(video->renderer, 8 * 4 + 0, video->palette[8 * 4 + 0]); video->renderer->writePalette(video->renderer, 8 * 4 + 1, video->palette[8 * 4 + 1]); video->renderer->writePalette(video->renderer, 8 * 4 + 2, video->palette[8 * 4 + 2]); video->renderer->writePalette(video->renderer, 8 * 4 + 3, video->palette[8 * 4 + 3]); break; case REG_OBP1: - video->palette[9 * 4 + 0] = video->dmgPalette[value & 3]; - video->palette[9 * 4 + 1] = video->dmgPalette[(value >> 2) & 3]; - video->palette[9 * 4 + 2] = video->dmgPalette[(value >> 4) & 3]; - video->palette[9 * 4 + 3] = video->dmgPalette[(value >> 6) & 3]; + video->palette[9 * 4 + 0] = video->dmgPalette[(value & 3) + 8]; + video->palette[9 * 4 + 1] = video->dmgPalette[((value >> 2) & 3) + 8]; + video->palette[9 * 4 + 2] = video->dmgPalette[((value >> 4) & 3) + 8]; + video->palette[9 * 4 + 3] = video->dmgPalette[((value >> 6) & 3) + 8]; video->renderer->writePalette(video->renderer, 9 * 4 + 0, video->palette[9 * 4 + 0]); video->renderer->writePalette(video->renderer, 9 * 4 + 1, video->palette[9 * 4 + 1]); video->renderer->writePalette(video->renderer, 9 * 4 + 2, video->palette[9 * 4 + 2]); @@ -547,7 +555,7 @@ void GBVideoSwitchBank(struct GBVideo* video, uint8_t value) { } void GBVideoSetPalette(struct GBVideo* video, unsigned index, uint32_t color) { - if (index >= 4) { + if (index >= 12) { return; } video->dmgPalette[index] = M_RGB8_TO_RGB5(color); From d3d7b9606c28b285898547feb8a6ff232f60a611 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 26 Sep 2017 18:22:09 -0700 Subject: [PATCH 145/158] GB: Support CGB lockout --- include/mgba/internal/gb/video.h | 1 + src/gb/io.c | 4 ++++ src/gb/video.c | 17 +++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/include/mgba/internal/gb/video.h b/include/mgba/internal/gb/video.h index b808d39bc..a19fa928e 100644 --- a/include/mgba/internal/gb/video.h +++ b/include/mgba/internal/gb/video.h @@ -167,6 +167,7 @@ void GBVideoWriteLYC(struct GBVideo* video, uint8_t value); void GBVideoWritePalette(struct GBVideo* video, uint16_t address, uint8_t value); void GBVideoSwitchBank(struct GBVideo* video, uint8_t value); +void GBVideoDisableCGB(struct GBVideo* video); void GBVideoSetPalette(struct GBVideo* video, unsigned index, uint32_t color); void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data); diff --git a/src/gb/io.c b/src/gb/io.c index 74adc850f..2db5d8c6e 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -424,6 +424,10 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { free(gb->memory.romBase); gb->memory.romBase = gb->memory.rom; } + if (gb->model >= GB_MODEL_CGB && gb->memory.io[0x6C]) { + gb->model = GB_MODEL_DMG; + GBVideoDisableCGB(&gb->video); + } break; case REG_IE: gb->memory.ie = value; diff --git a/src/gb/video.c b/src/gb/video.c index a8d756b63..4478b079e 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -561,6 +561,23 @@ void GBVideoSetPalette(struct GBVideo* video, unsigned index, uint32_t color) { video->dmgPalette[index] = M_RGB8_TO_RGB5(color); } +void GBVideoDisableCGB(struct GBVideo* video) { + video->dmgPalette[0] = video->palette[0]; + video->dmgPalette[1] = video->palette[1]; + video->dmgPalette[2] = video->palette[2]; + video->dmgPalette[3] = video->palette[3]; + video->dmgPalette[4] = video->palette[8 * 4 + 0]; + video->dmgPalette[5] = video->palette[8 * 4 + 1]; + video->dmgPalette[6] = video->palette[8 * 4 + 2]; + video->dmgPalette[7] = video->palette[8 * 4 + 3]; + video->dmgPalette[8] = video->palette[9 * 4 + 0]; + video->dmgPalette[9] = video->palette[9 * 4 + 1]; + video->dmgPalette[10] = video->palette[9 * 4 + 2]; + video->dmgPalette[11] = video->palette[9 * 4 + 3]; + video->renderer->deinit(video->renderer); + video->renderer->init(video->renderer, video->p->model, video->sgbBorders); +} + void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { int i; if (!(video->sgbCommandHeader & 7)) { From 3914da27adbd216e7020461bb214c63ff579a5b0 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 26 Sep 2017 18:22:51 -0700 Subject: [PATCH 146/158] Qt: Better support for GB palettes --- src/platform/qt/ColorPicker.cpp | 4 + src/platform/qt/ColorPicker.h | 3 +- src/platform/qt/OverrideView.cpp | 23 ++-- src/platform/qt/OverrideView.h | 4 +- src/platform/qt/OverrideView.ui | 176 +++++++++++++++++++++++++++- src/platform/qt/SettingsView.cpp | 62 ++++++---- src/platform/qt/SettingsView.h | 4 +- src/platform/qt/SettingsView.ui | 190 +++++++++++++++++++++++++++++-- 8 files changed, 422 insertions(+), 44 deletions(-) diff --git a/src/platform/qt/ColorPicker.cpp b/src/platform/qt/ColorPicker.cpp index 7351286e4..18782a5dc 100644 --- a/src/platform/qt/ColorPicker.cpp +++ b/src/platform/qt/ColorPicker.cpp @@ -15,6 +15,7 @@ ColorPicker::ColorPicker() { ColorPicker::ColorPicker(QWidget* parent, const QColor& defaultColor) : m_parent(parent) + , m_defaultColor(defaultColor) { QPalette palette = parent->palette(); palette.setColor(parent->backgroundRole(), defaultColor); @@ -27,6 +28,7 @@ ColorPicker& ColorPicker::operator=(const ColorPicker& other) { m_parent->removeEventFilter(this); } m_parent = other.m_parent; + m_defaultColor = other.m_defaultColor; m_parent->installEventFilter(this); return *this; @@ -45,8 +47,10 @@ bool ColorPicker::eventFilter(QObject* obj, QEvent* event) { QColorDialog* colorPicker = new QColorDialog; colorPicker->setAttribute(Qt::WA_DeleteOnClose); + colorPicker->setCurrentColor(m_defaultColor); colorPicker->open(); connect(colorPicker, &QColorDialog::colorSelected, [this, swatch](const QColor& color) { + m_defaultColor = color; QPalette palette = swatch->palette(); palette.setColor(swatch->backgroundRole(), color); swatch->setPalette(palette); diff --git a/src/platform/qt/ColorPicker.h b/src/platform/qt/ColorPicker.h index 5bc4bee20..1e94933c8 100644 --- a/src/platform/qt/ColorPicker.h +++ b/src/platform/qt/ColorPicker.h @@ -5,9 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once +#include #include -class QColor; class QWidget; namespace QGBA { @@ -29,6 +29,7 @@ protected: private: QWidget* m_parent = nullptr; + QColor m_defaultColor; }; } diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index 940d46077..c9e68c68c 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -70,9 +70,17 @@ OverrideView::OverrideView(ConfigController* config, QWidget* parent) m_colorPickers[1] = ColorPicker(m_ui.color1, QColor(0xA8, 0xA8, 0xA8)); m_colorPickers[2] = ColorPicker(m_ui.color2, QColor(0x50, 0x50, 0x50)); m_colorPickers[3] = ColorPicker(m_ui.color3, QColor(0x00, 0x00, 0x00)); - for (int colorId = 0; colorId < 4; ++colorId) { + m_colorPickers[4] = ColorPicker(m_ui.color4, QColor(0xF8, 0xF8, 0xF8)); + m_colorPickers[5] = ColorPicker(m_ui.color5, QColor(0xA8, 0xA8, 0xA8)); + m_colorPickers[6] = ColorPicker(m_ui.color6, QColor(0x50, 0x50, 0x50)); + m_colorPickers[7] = ColorPicker(m_ui.color7, QColor(0x00, 0x00, 0x00)); + m_colorPickers[8] = ColorPicker(m_ui.color8, QColor(0xF8, 0xF8, 0xF8)); + m_colorPickers[9] = ColorPicker(m_ui.color9, QColor(0xA8, 0xA8, 0xA8)); + m_colorPickers[10] = ColorPicker(m_ui.color10, QColor(0x50, 0x50, 0x50)); + m_colorPickers[11] = ColorPicker(m_ui.color11, QColor(0x00, 0x00, 0x00)); + for (int colorId = 0; colorId < 12; ++colorId) { connect(&m_colorPickers[colorId], &ColorPicker::colorChanged, this, [this, colorId](const QColor& color) { - m_gbColors[colorId] = color.rgb(); + m_gbColors[colorId] = color.rgb() | 0xFF000000; }); } @@ -161,12 +169,13 @@ void OverrideView::updateOverrides() { std::unique_ptr gb(new GBOverride); gb->override.mbc = s_mbcList[m_ui.mbc->currentIndex()]; gb->override.model = s_gbModelList[m_ui.gbModel->currentIndex()]; - gb->override.gbColors[0] = m_gbColors[0]; - gb->override.gbColors[1] = m_gbColors[1]; - gb->override.gbColors[2] = m_gbColors[2]; - gb->override.gbColors[3] = m_gbColors[3]; + bool hasColor = false; + for (int i = 0; i < 12; ++i) { + gb->override.gbColors[i] = m_gbColors[i]; + hasColor = hasColor || (m_gbColors[i] & 0xFF000000); + } bool hasOverride = gb->override.mbc != GB_MBC_AUTODETECT || gb->override.model != GB_MODEL_AUTODETECT; - hasOverride = hasOverride || (m_gbColors[0] | m_gbColors[1] | m_gbColors[2] | m_gbColors[3]); + hasOverride = hasOverride || hasColor; if (hasOverride) { m_controller->setOverride(std::move(gb)); } else { diff --git a/src/platform/qt/OverrideView.h b/src/platform/qt/OverrideView.h index c144350e5..5a877b174 100644 --- a/src/platform/qt/OverrideView.h +++ b/src/platform/qt/OverrideView.h @@ -50,8 +50,8 @@ private: bool m_savePending = false; #ifdef M_CORE_GB - uint32_t m_gbColors[4]{}; - ColorPicker m_colorPickers[4]; + uint32_t m_gbColors[12]{}; + ColorPicker m_colorPickers[12]; static QList s_gbModelList; static QList s_mbcList; diff --git a/src/platform/qt/OverrideView.ui b/src/platform/qt/OverrideView.ui index 9ab598a8e..108622ffc 100644 --- a/src/platform/qt/OverrideView.ui +++ b/src/platform/qt/OverrideView.ui @@ -344,7 +344,7 @@ - Colors + Background Colors @@ -428,6 +428,180 @@ + + + + Sprite Colors 1 + + + + + + + Sprite Colors 2 + + + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index 0a587371a..d17134563 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -183,24 +183,38 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC defaultColors.append(QColor(0xA8, 0xA8, 0xA8)); defaultColors.append(QColor(0x50, 0x50, 0x50)); defaultColors.append(QColor(0x00, 0x00, 0x00)); - bool ok; - if (m_controller->getOption("gb.pal[0]").toUInt(&ok) || ok) { - defaultColors[0] = QColor::fromRgb(m_controller->getOption("gb.pal[0]").toUInt()); - } - if (m_controller->getOption("gb.pal[1]").toUInt(&ok) || ok) { - defaultColors[1] = QColor::fromRgb(m_controller->getOption("gb.pal[1]").toUInt()); - } - if (m_controller->getOption("gb.pal[2]").toUInt(&ok) || ok) { - defaultColors[2] = QColor::fromRgb(m_controller->getOption("gb.pal[2]").toUInt()); - } - if (m_controller->getOption("gb.pal[3]").toUInt(&ok) || ok) { - defaultColors[3] = QColor::fromRgb(m_controller->getOption("gb.pal[3]").toUInt()); - } - m_colorPickers[0] = ColorPicker(m_ui.color0, defaultColors[0]); - m_colorPickers[1] = ColorPicker(m_ui.color1, defaultColors[1]); - m_colorPickers[2] = ColorPicker(m_ui.color2, defaultColors[2]); - m_colorPickers[3] = ColorPicker(m_ui.color3, defaultColors[3]); - for (int colorId = 0; colorId < 4; ++colorId) { + defaultColors.append(QColor(0xF8, 0xF8, 0xF8)); + defaultColors.append(QColor(0xA8, 0xA8, 0xA8)); + defaultColors.append(QColor(0x50, 0x50, 0x50)); + defaultColors.append(QColor(0x00, 0x00, 0x00)); + defaultColors.append(QColor(0xF8, 0xF8, 0xF8)); + defaultColors.append(QColor(0xA8, 0xA8, 0xA8)); + defaultColors.append(QColor(0x50, 0x50, 0x50)); + defaultColors.append(QColor(0x00, 0x00, 0x00)); + QList colors{ + m_ui.color0, + m_ui.color1, + m_ui.color2, + m_ui.color3, + m_ui.color4, + m_ui.color5, + m_ui.color6, + m_ui.color7, + m_ui.color8, + m_ui.color9, + m_ui.color10, + m_ui.color11 + }; + for (int colorId = 0; colorId < 12; ++colorId) { + bool ok; + uint color = m_controller->getOption(QString("gb.pal[%0]").arg(colorId)).toUInt(&ok); + if (ok) { + defaultColors[colorId] = QColor::fromRgb(color); + m_gbColors[colorId] = color | 0xFF000000; + } else { + m_gbColors[colorId] = defaultColors[colorId].rgb() & ~0xFF000000; + } + m_colorPickers[colorId] = ColorPicker(colors[colorId], defaultColors[colorId]); connect(&m_colorPickers[colorId], &ColorPicker::colorChanged, this, [this, colorId](const QColor& color) { m_gbColors[colorId] = color.rgb(); }); @@ -391,11 +405,13 @@ void SettingsView::updateConfig() { GBModel modelCGB = s_gbModelList[m_ui.cgbModel->currentIndex()]; m_controller->setOption("cgb.model", GBModelToName(modelCGB)); - if (m_gbColors[0] | m_gbColors[1] | m_gbColors[2] | m_gbColors[3]) { - m_controller->setOption("gb.pal[0]", m_gbColors[0]); - m_controller->setOption("gb.pal[1]", m_gbColors[1]); - m_controller->setOption("gb.pal[2]", m_gbColors[2]); - m_controller->setOption("gb.pal[3]", m_gbColors[3]); + for (int colorId = 0; colorId < 12; ++colorId) { + if (!(m_gbColors[colorId] & 0xFF000000)) { + continue; + } + QString color = QString("gb.pal[%0]").arg(colorId); + m_controller->setOption(color.toUtf8().constData(), m_gbColors[colorId] & ~0xFF000000); + } #endif diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index 0ae5d0b07..653dd6139 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -55,8 +55,8 @@ private: ShaderSelector* m_shader = nullptr; #ifdef M_CORE_GB - uint32_t m_gbColors[4]{}; - ColorPicker m_colorPickers[4]; + uint32_t m_gbColors[12]{}; + ColorPicker m_colorPickers[12]; static QList s_gbModelList; #endif diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index 8b470cc84..be801f5f3 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -1170,10 +1170,17 @@ + + + + Qt::Horizontal + + + - Default colors: + Default BG colors: @@ -1258,27 +1265,107 @@ + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Super Game Boy borders - + Qt::Horizontal - + Camera driver: - + @@ -1288,10 +1375,97 @@ - - - - Qt::Horizontal + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 30 + 30 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + Default sprite colors 1: + + + + + + + Default sprite colors 2: From 348b33c8a4abeaec277327d6adad89570f53fe4f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 27 Sep 2017 23:17:48 -0700 Subject: [PATCH 147/158] GBA Cheats: Improve detection of raw cheats --- CHANGES | 1 + src/gba/cheats.c | 64 ++++++++++++++++++++++++++++---------- src/gba/cheats/gameshark.c | 3 +- src/gba/cheats/parv3.c | 5 +-- 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/CHANGES b/CHANGES index c974dfdfa..ffe7c416e 100644 --- a/CHANGES +++ b/CHANGES @@ -60,6 +60,7 @@ Misc: - CMake: Fix CPack dependencies for libpng 1.6 - Qt: Allow overrides to be saved before a game is loaded - VFS: Make VFile.truncate work growing files on PSV (fixes mgba.io/i/885) + - GBA Cheats: Improve detection of raw cheats 0.6.0: (2017-07-16) Features: diff --git a/src/gba/cheats.c b/src/gba/cheats.c index c8a8f2c82..6e799aae4 100644 --- a/src/gba/cheats.c +++ b/src/gba/cheats.c @@ -139,7 +139,8 @@ static bool GBACheatAddAutodetect(struct GBACheatSet* set, uint32_t op1, uint32_ char line[18] = "XXXXXXXX XXXXXXXX"; snprintf(line, sizeof(line), "%08X %08X", op1, op2); - int gsaP, parP; + int gsaP, rgsaP, parP, rparP; + int maxProbability = INT_MIN; switch (set->gsaVersion) { case 0: // Try to detect GameShark version @@ -147,27 +148,42 @@ static bool GBACheatAddAutodetect(struct GBACheatSet* set, uint32_t op1, uint32_ gsaP = GBACheatGameSharkProbability(o1, o2); o1 = op1; o2 = op2; + if (gsaP > maxProbability) { + maxProbability = gsaP; + GBACheatSetGameSharkVersion(set, 1); + } + GBACheatDecryptGameShark(&o1, &o2, GBACheatProActionReplaySeeds); parP = GBACheatProActionReplayProbability(o1, o2); - o1 = op1; - o2 = op2; - if (gsaP > parP) { - GBACheatSetGameSharkVersion(set, 1); - GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); - return GBACheatAddGameSharkRaw(set, o1, o2); - } else { - // If probabilities are equal, assume PARv3 + if (parP > maxProbability) { + maxProbability = parP; GBACheatSetGameSharkVersion(set, 3); - GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); - return GBACheatAddProActionReplayRaw(set, o1, o2); + } + + rgsaP = GBACheatGameSharkProbability(op1, op1); + if (rgsaP > maxProbability) { + maxProbability = rgsaP; + GBACheatSetGameSharkVersion(set, 2); + } + + rparP = GBACheatProActionReplayProbability(op1, op1); + if (rparP > maxProbability) { + maxProbability = rparP; + GBACheatSetGameSharkVersion(set, 4); + } + + if (set->gsaVersion < 3) { + return GBACheatAddGameShark(set, op1, op2); + } else { + return GBACheatAddProActionReplay(set, op1, op2); } break; case 1: - GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); - return GBACheatAddGameSharkRaw(set, o1, o2); + case 2: + return GBACheatAddGameShark(set, o1, o2); case 3: - GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); - return GBACheatAddProActionReplayRaw(set, o1, o2); + case 4: + return GBACheatAddProActionReplay(set, o1, o2); } return false; } @@ -291,10 +307,18 @@ static void GBACheatParseDirectives(struct mCheatSet* set, const struct StringLi GBACheatSetGameSharkVersion(cheats, 1); continue; } + if (strcmp(directive, "GSAv1 raw") == 0) { + GBACheatSetGameSharkVersion(cheats, 2); + continue; + } if (strcmp(directive, "PARv3") == 0) { GBACheatSetGameSharkVersion(cheats, 3); continue; } + if (strcmp(directive, "PARv3 raw") == 0) { + GBACheatSetGameSharkVersion(cheats, 4); + continue; + } } } @@ -311,15 +335,21 @@ static void GBACheatDumpDirectives(struct mCheatSet* set, struct StringList* dir char** directive; switch (cheats->gsaVersion) { case 1: - case 2: directive = StringListAppend(directives); *directive = strdup("GSAv1"); break; + case 2: + directive = StringListAppend(directives); + *directive = strdup("GSAv1 raw"); + break; case 3: - case 4: directive = StringListAppend(directives); *directive = strdup("PARv3"); break; + case 4: + directive = StringListAppend(directives); + *directive = strdup("PARv3 raw"); + break; } } diff --git a/src/gba/cheats/gameshark.c b/src/gba/cheats/gameshark.c index 1fc476aff..0c4270ee6 100644 --- a/src/gba/cheats/gameshark.c +++ b/src/gba/cheats/gameshark.c @@ -203,8 +203,9 @@ bool GBACheatAddGameShark(struct GBACheatSet* set, uint32_t op1, uint32_t op2) { GBACheatSetGameSharkVersion(set, 1); // Fall through case 1: - case 2: GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); + // Fall through + case 2: return GBACheatAddGameSharkRaw(set, o1, o2); } return false; diff --git a/src/gba/cheats/parv3.c b/src/gba/cheats/parv3.c index ccd6c34b0..63d2d2685 100644 --- a/src/gba/cheats/parv3.c +++ b/src/gba/cheats/parv3.c @@ -303,8 +303,9 @@ bool GBACheatAddProActionReplay(struct GBACheatSet* set, uint32_t op1, uint32_t GBACheatSetGameSharkVersion(set, 3); // Fall through case 3: - case 4: GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); + // Fall through + case 4: return GBACheatAddProActionReplayRaw(set, o1, o2); } return false; @@ -370,7 +371,7 @@ int GBACheatProActionReplayProbability(uint32_t op1, uint32_t op2) { int width = ((op1 & PAR3_WIDTH) >> (PAR3_WIDTH_BASE - 3)); if (op1 & PAR3_COND) { probability += 0x20; - if (width == 32) { + if (width >= 24) { return 0; } if (op2 & ~((1 << width) - 1)) { From b501ca5354833c034993b959177fe4f134d28011 Mon Sep 17 00:00:00 2001 From: rootfather Date: Thu, 28 Sep 2017 07:13:28 +0200 Subject: [PATCH 148/158] Qt: Update German GUI translation The German translation now contains all the new strings introduced since the last update. Except the IOViewer stuff. Again. --- src/platform/qt/ts/mgba-de.ts | 476 +++++++++++++++++++++------------- 1 file changed, 289 insertions(+), 187 deletions(-) diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index 96a6897a6..dfeb6dacb 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -72,49 +72,55 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. AssetTile - + AssetTile AssetTile - + Tile # Tile # - + + 0 0 - + + Palette # + Palette # + + + Address Adresse - + 0x06000000 0x06000000 - + Red Rot - + Green Grün - + Blue Blau - - - + + + 0x00 (00) 0x00 (00) @@ -454,6 +460,29 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.Max. Zeilen + + MapView + + + Maps + Maps + + + + × + × + + + + Magnification + Vergrößerung + + + + Export + Exportieren + + MemorySearch @@ -950,8 +979,18 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. - Colors - Farben + Background Colors + Hintergrund-Farbpalette + + + + Sprite Colors 1 + Sprite-Farbpalette 1 + + + + Sprite Colors 2 + Sprite-Farbpalette 2 @@ -1060,14 +1099,14 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::AssetTile - + %0%1%2 %0%1%2 - - - + + + 0x%0 (%1) 0x%0 (%1) @@ -1118,22 +1157,22 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 Fehler beim Öffnen der Speicherdatei: %1 - + Failed to open game file: %1 Fehler beim Öffnen der Spieldatei: %1 - + Failed to open snapshot file for reading: %1 Konnte Snapshot-Datei %1 nicht zum Lesen öffnen - + Failed to open snapshot file for writing: %1 Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen @@ -2673,6 +2712,54 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.GAME ERROR + + QGBA::MapView + + + Map Addr. + Map-Addr. + + + + Mirror + Spiegel + + + + None + Keiner + + + + Both + Beidseitig + + + + Horizontal + Horizontal + + + + Vertical + Vertikal + + + + Export map + Map exportieren + + + + Portable Network Graphics (*.png) + Portable Network Graphics (*.png) + + + + Failed to open output PNG file: %1 + Fehler beim Öffnen der Ausgabe-PNG-Datei: %1 + + QGBA::MemoryModel @@ -2764,7 +2851,7 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.QGBA::ObjView - + 0x%0 0x%0 @@ -2794,23 +2881,23 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.Ungültig - + N/A N/A - + Export sprite Sprite exportieren - + Portable Network Graphics (*.png) Portable Network Graphics (*.png) - + Failed to open output PNG file: %1 Fehler beim Öffnen der Ausgabe-PNG-Datei: %1 @@ -2925,28 +3012,28 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.Keiner (Standbild) - + Keyboard Tastatur - + Controllers Gamepads - + Shortcuts Tastenkürzel - - + + Shaders Shader - + Select BIOS BIOS auswählen @@ -3023,92 +3110,92 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance-ROMs (%1) - + Game Boy ROMs (%1) Game Boy-ROMs (%1) - + All ROMs (%1) Alle ROMs (%1) - + %1 Video Logs (*.mvl) %1 Video-Logs (*.mvl) - + Archives (%1) Archive (%1) - - - + + + Select ROM ROM auswählen - + Game Boy Advance save files (%1) Game Boy Advance-Speicherdateien (%1) - - - + + + Select save Speicherdatei wählen - + Select patch Patch wählen - + Patches (*.ips *.ups *.bps) Patches (*.ips *.ups *.bps) - + Select image Bild auswählen - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Bild-Datei (*.png *.gif *.jpg *.jpeg);;Alle Dateien (*) - - + + GameShark saves (*.sps *.xps) GameShark-Speicherdaten (*.sps *.xps) - + Select video log Video-Log auswählen - + Video logs (*.mvl) Video-Logs (*.mvl) - + Crash Absturz - + The game has crashed with the following error: %1 @@ -3117,633 +3204,638 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd. - + Couldn't Load Konnte nicht geladen werden - + Could not load game. Are you sure it's in the correct format? Konnte das Spiel nicht laden. Sind Sie sicher, dass es im korrekten Format vorliegt? - + Unimplemented BIOS call Nicht implementierter BIOS-Aufruf - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Dieses Spiel verwendet einen BIOS-Aufruf, der nicht implementiert ist. Bitte verwenden Sie für die beste Spielerfahrung das offizielle BIOS. - + Really make portable? Portablen Modus wirklich aktivieren? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Diese Einstellung wird den Emulator so konfigurieren, dass er seine Konfiguration aus dem gleichen Verzeichnis wie die Programmdatei lädt. Möchten Sie fortfahren? - + Restart needed Neustart benötigt - + Some changes will not take effect until the emulator is restarted. Einige Änderungen werden erst übernommen, wenn der Emulator neu gestartet wurde. - + - Player %1 of %2 - Spieler %1 von %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 Bilder/Sekunde) - %4 - + &File &Datei - + Load &ROM... &ROM laden... - + Load ROM in archive... ROM aus Archiv laden... - + Load temporary save... Temporäre Speicherdatei laden... - + Load &patch... &Patch laden... - + Boot BIOS BIOS booten - + Replace ROM... ROM ersetzen... - + ROM &info... ROM-&Informationen... - + Recent Zuletzt verwendet - + Make portable Portablen Modus aktivieren - + &Load state Savestate &laden - + F10 F10 - + &Save state Savestate &speichern - + Shift+F10 Umschalt+F10 - + Quick load Schnell laden - + Quick save Schnell speichern - + Load recent Lade zuletzt gespeicherten Savestate - + Save recent Speichere aktuellen Stand - + Undo load state Laden des Savestate rückgängig machen - + F11 F11 - + Undo save state Speichern des Savestate rückgängig machen - + Shift+F11 Umschalt+F11 - - + + State &%1 Savestate &%1 - + F%1 F%1 - + Shift+F%1 Umschalt+F%1 - + Load camera image... Lade Kamerabild... - + Import GameShark Save Importiere GameShark-Speicherstand - + Export GameShark Save Exportiere GameShark-Speicherstand - + New multiplayer window Neues Multiplayer-Fenster - + About Über - + E&xit &Beenden - + &Emulation &Emulation - + &Reset Zu&rücksetzen - + Ctrl+R Strg+R - + Sh&utdown Schli&eßen - + Yank game pak Spielmodul herausziehen - + &Pause &Pause - + Ctrl+P Strg+P - + &Next frame &Nächstes Bild - + Ctrl+N Strg+N - + Fast forward (held) Schneller Vorlauf (gehalten) - + &Fast forward Schneller &Vorlauf - + Shift+Tab Umschalt+Tab - + Fast forward speed Vorlauf-Geschwindigkeit - + Unbounded Unbegrenzt - + %0x %0x - + Rewind (held) Zurückspulen (gehalten) - + Re&wind Zur&ückspulen - + ~ ~ - + Step backwards Schrittweiser Rücklauf - + Ctrl+B Strg+B - + Sync to &video Mit &Video synchronisieren - + Sync to &audio Mit &Audio synchronisieren - + Solar sensor Solar-Sensor - + Increase solar level Sonnen-Level erhöhen - + Decrease solar level Sonnen-Level verringern - + Brightest solar level Hellster Sonnen-Level - + Darkest solar level Dunkelster Sonnen-Level - + Brightness %1 Helligkeit %1 - + Audio/&Video Audio/&Video - + Frame size Bildgröße - + %1x %1x - + Toggle fullscreen Vollbildmodus umschalten - + Lock aspect ratio Seitenverhältnis korrigieren - + Force integer scaling Pixelgenaue Skalierung (Integer scaling) - + Frame&skip Frame&skip - + Mute Stummschalten - + FPS target Bildwiederholrate - + 15 15 - + 30 30 - + 45 45 - + Native (59.7) Nativ (59.7) - + 60 60 - + 90 90 - + 120 120 - + 240 240 - + Take &screenshot &Screenshot erstellen - + F12 F12 - + Record output... Ausgabe aufzeichen... - + Record GIF... GIF aufzeichen... - + Record video log... Video-Log aufzeichnen... - + Stop video log Video-Log beenden - + Game Boy Printer... Game Boy Printer... - + Video layers Video-Ebenen - + Audio channels Audio-Kanäle - + &Tools &Werkzeuge - + View &logs... &Logs ansehen... - + Game &overrides... Spiel-&Überschreibungen... - + Game &Pak sensors... Game &Pak-Sensoren... - + &Cheats... &Cheats... - + Open debugger console... Debugger-Konsole äffnen... - + Start &GDB server... &GDB-Server starten... - + Settings... Einstellungen... - + Select folder Ordner auswählen - + Add folder to library... Ordner zur Bibliothek hinzufügen... - + Bilinear filtering Bilineare Filterung - + View &palette... &Palette betrachten... - + View &sprites... &Sprites betrachten... - + View &tiles... &Tiles betrachten... - + + View &map... + &Map betrachten... + + + View memory... Speicher betrachten... - + Search memory... Speicher durchsuchen... - + View &I/O registers... &I/O-Register betrachten... - + Exit fullscreen Vollbildmodus beenden - + Autofire Autofeuer - + Autofire A Autofeuer A - + Autofire B Autofeuer B - + Autofire L Autofeuer L - + Autofire R Autofeuer R - + Autofire Start Autofeuer Start - + Autofire Select Autofeuer Select - + Autofire Up Autofeuer nach oben - + Autofire Right Autofeuer rechts - + Autofire Down Autofeuer nach unten - + Autofire Left Autofeuer links @@ -4151,17 +4243,27 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.Game Boy Color-Modell - - Default colors: - Standard-Farben: + + Default BG colors: + Standard-Hintergrundfarben: - + + Default sprite colors 1: + Standard-Sprite-Farben 1: + + + + Default sprite colors 2: + Standard-Sprite-Farben 2: + + + Super Game Boy borders - SUper Game Boy-Rahmen + Super Game Boy-Rahmen - + Camera driver: Kamera-Treiber: From 9ebc7541d0b6832c61054fd3dfb344fc752a250e Mon Sep 17 00:00:00 2001 From: esoptron <29593369+esoptron@users.noreply.github.com> Date: Fri, 29 Sep 2017 14:46:02 -0400 Subject: [PATCH 149/158] Update Use BIOS and skip BIOS core option descriptions (#887) --- src/platform/libretro/libretro.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index 3fca547bc..d411dc4df 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -102,8 +102,8 @@ void retro_set_environment(retro_environment_t env) { struct retro_variable vars[] = { { "mgba_solar_sensor_level", "Solar sensor level; 0|1|2|3|4|5|6|7|8|9|10" }, { "mgba_allow_opposing_directions", "Allow opposing directional input; OFF|ON" }, - { "mgba_use_bios", "Use BIOS file if found; ON|OFF" }, - { "mgba_skip_bios", "Skip BIOS intro; OFF|ON" }, + { "mgba_use_bios", "Use BIOS file if found (requires restart); ON|OFF" }, + { "mgba_skip_bios", "Skip BIOS intro (requires restart); OFF|ON" }, { "mgba_idle_optimization", "Idle loop removal; Remove Known|Detect and Remove|Don't Remove" }, { 0, 0 } }; From 3d39e2a04186f859d4350b29f7ffa5650845b548 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 29 Sep 2017 21:51:57 -0700 Subject: [PATCH 150/158] GBA Cheats: Slightly improve PARv3 detection --- src/gba/cheats/parv3.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/gba/cheats/parv3.c b/src/gba/cheats/parv3.c index 63d2d2685..71bd31c15 100644 --- a/src/gba/cheats/parv3.c +++ b/src/gba/cheats/parv3.c @@ -284,6 +284,10 @@ bool GBACheatAddProActionReplayRaw(struct GBACheatSet* cheats, uint32_t op1, uin cheat->address = BASE_IO | (op1 & OFFSET_MASK); break; } + if (op1 & 0x01000000 && (op1 & 0xFE000000) != 0xC6000000) { + return false; + } + cheat->width = width; cheat->operand = op2 & (0xFFFFFFFFU >> ((4 - width) * 8)); @@ -385,10 +389,13 @@ int GBACheatProActionReplayProbability(uint32_t op1, uint32_t op2) { if (op2 & ~((1 << width) - 1)) { probability -= 0x10; } + // Fall through case PAR3_BASE_ASSIGN: case PAR3_BASE_INDIRECT: probability += GBACheatAddressIsReal(address); - // Fall through + if (op1 & 0x01000000) { + return 0; + } break; case PAR3_BASE_OTHER: break; From 845ecfe81e4458645688af34e347e99bb0b53ed0 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 29 Sep 2017 22:25:51 -0700 Subject: [PATCH 151/158] GBA Cheats: Use an enum for GSA versions --- src/gba/cheats.c | 16 ++++++++-------- src/gba/cheats/gameshark.c | 23 ++++++++++++----------- src/gba/cheats/gameshark.h | 10 +++++++++- src/gba/cheats/parv3.c | 10 ++++------ 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/gba/cheats.c b/src/gba/cheats.c index 6e799aae4..b17244c76 100644 --- a/src/gba/cheats.c +++ b/src/gba/cheats.c @@ -150,26 +150,26 @@ static bool GBACheatAddAutodetect(struct GBACheatSet* set, uint32_t op1, uint32_ o2 = op2; if (gsaP > maxProbability) { maxProbability = gsaP; - GBACheatSetGameSharkVersion(set, 1); + GBACheatSetGameSharkVersion(set, GBA_GS_GSAV1); } GBACheatDecryptGameShark(&o1, &o2, GBACheatProActionReplaySeeds); parP = GBACheatProActionReplayProbability(o1, o2); if (parP > maxProbability) { maxProbability = parP; - GBACheatSetGameSharkVersion(set, 3); + GBACheatSetGameSharkVersion(set, GBA_GS_PARV3); } rgsaP = GBACheatGameSharkProbability(op1, op1); if (rgsaP > maxProbability) { maxProbability = rgsaP; - GBACheatSetGameSharkVersion(set, 2); + GBACheatSetGameSharkVersion(set, GBA_GS_GSAV1_RAW); } rparP = GBACheatProActionReplayProbability(op1, op1); if (rparP > maxProbability) { maxProbability = rparP; - GBACheatSetGameSharkVersion(set, 4); + GBACheatSetGameSharkVersion(set, GBA_GS_PARV3_RAW); } if (set->gsaVersion < 3) { @@ -304,19 +304,19 @@ static void GBACheatParseDirectives(struct mCheatSet* set, const struct StringLi for (d = 0; d < StringListSize(directives); ++d) { const char* directive = *StringListGetConstPointer(directives, d); if (strcmp(directive, "GSAv1") == 0) { - GBACheatSetGameSharkVersion(cheats, 1); + GBACheatSetGameSharkVersion(cheats, GBA_GS_GSAV1); continue; } if (strcmp(directive, "GSAv1 raw") == 0) { - GBACheatSetGameSharkVersion(cheats, 2); + GBACheatSetGameSharkVersion(cheats, GBA_GS_GSAV1_RAW); continue; } if (strcmp(directive, "PARv3") == 0) { - GBACheatSetGameSharkVersion(cheats, 3); + GBACheatSetGameSharkVersion(cheats, GBA_GS_PARV3); continue; } if (strcmp(directive, "PARv3 raw") == 0) { - GBACheatSetGameSharkVersion(cheats, 4); + GBACheatSetGameSharkVersion(cheats, GBA_GS_PARV3_RAW); continue; } } diff --git a/src/gba/cheats/gameshark.c b/src/gba/cheats/gameshark.c index 0c4270ee6..e95b23b54 100644 --- a/src/gba/cheats/gameshark.c +++ b/src/gba/cheats/gameshark.c @@ -5,6 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include +#include "gba/cheats/gameshark.h" #include "gba/cheats/parv3.h" #include #include @@ -73,17 +74,19 @@ void GBACheatReseedGameShark(uint32_t* seeds, uint16_t params, const uint8_t* t1 } } -void GBACheatSetGameSharkVersion(struct GBACheatSet* cheats, int version) { +void GBACheatSetGameSharkVersion(struct GBACheatSet* cheats, enum GBACheatGameSharkVersion version) { cheats->gsaVersion = version; switch (version) { - case 1: - case 2: + case GBA_GS_GSAV1: + case GBA_GS_GSAV1_RAW: memcpy(cheats->gsaSeeds, GBACheatGameSharkSeeds, 4 * sizeof(uint32_t)); break; - case 3: - case 4: + case GBA_GS_PARV3: + case GBA_GS_PARV3_RAW: memcpy(cheats->gsaSeeds, GBACheatProActionReplaySeeds, 4 * sizeof(uint32_t)); break; + default: + break; } } @@ -197,15 +200,13 @@ bool GBACheatAddGameShark(struct GBACheatSet* set, uint32_t op1, uint32_t op2) { snprintf(line, sizeof(line), "%08X %08X", op1, op2); switch (set->gsaVersion) { - case 0: - case 3: - case 4: - GBACheatSetGameSharkVersion(set, 1); + default: + GBACheatSetGameSharkVersion(set, GBA_GS_GSAV1); // Fall through - case 1: + case GBA_GS_GSAV1: GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); // Fall through - case 2: + case GBA_GS_GSAV1_RAW: return GBACheatAddGameSharkRaw(set, o1, o2); } return false; diff --git a/src/gba/cheats/gameshark.h b/src/gba/cheats/gameshark.h index af4d10469..a4130714b 100644 --- a/src/gba/cheats/gameshark.h +++ b/src/gba/cheats/gameshark.h @@ -12,10 +12,18 @@ CXX_GUARD_START extern const uint32_t GBACheatGameSharkSeeds[4]; +enum GBACheatGameSharkVersion { + GBA_GS_NOT_SET = 0, + GBA_GS_GSAV1 = 1, + GBA_GS_GSAV1_RAW = 2, + GBA_GS_PARV3 = 3, + GBA_GS_PARV3_RAW = 4 +}; + struct GBACheatSet; void GBACheatDecryptGameShark(uint32_t* op1, uint32_t* op2, const uint32_t* seeds); void GBACheatReseedGameShark(uint32_t* seeds, uint16_t params, const uint8_t* t1, const uint8_t* t2); -void GBACheatSetGameSharkVersion(struct GBACheatSet* cheats, int version); +void GBACheatSetGameSharkVersion(struct GBACheatSet* cheats, enum GBACheatGameSharkVersion version); bool GBACheatAddGameSharkRaw(struct GBACheatSet* cheats, uint32_t op1, uint32_t op2); int GBACheatGameSharkProbability(uint32_t op1, uint32_t op2); diff --git a/src/gba/cheats/parv3.c b/src/gba/cheats/parv3.c index 71bd31c15..d2c9df589 100644 --- a/src/gba/cheats/parv3.c +++ b/src/gba/cheats/parv3.c @@ -301,15 +301,13 @@ bool GBACheatAddProActionReplay(struct GBACheatSet* set, uint32_t op1, uint32_t snprintf(line, sizeof(line), "%08X %08X", op1, op2); switch (set->gsaVersion) { - case 0: - case 1: - case 2: - GBACheatSetGameSharkVersion(set, 3); + default: + GBACheatSetGameSharkVersion(set, GBA_GS_PARV3); // Fall through - case 3: + case GBA_GS_PARV3: GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); // Fall through - case 4: + case GBA_GS_PARV3_RAW: return GBACheatAddProActionReplayRaw(set, o1, o2); } return false; From bf0081e9b4c2c3b3faef6bfbfd93ac46066684e5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 30 Sep 2017 10:25:35 -0700 Subject: [PATCH 152/158] GBA Cheats: Fix PARv3 multiline blocks (fixes #889) --- CHANGES | 1 + src/core/cheats.c | 45 +- src/gba/cheats/parv3.c | 4 +- src/gba/test/cheats.c | 943 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 973 insertions(+), 20 deletions(-) create mode 100644 src/gba/test/cheats.c diff --git a/CHANGES b/CHANGES index ffe7c416e..192b685e7 100644 --- a/CHANGES +++ b/CHANGES @@ -46,6 +46,7 @@ Bugfixes: - GBA Savedata: Fix size of SRAM saves (fixes mgba.io/i/883) - GB: Revamp IRQ handling based on new information - GB Video: Fix read mode when enabling LCD + - GBA Cheats: Fix PARv3 multiline blocks (fixes mgba.io/i/889) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/core/cheats.c b/src/core/cheats.c index 5085a3d67..21a7b8a7b 100644 --- a/src/core/cheats.c +++ b/src/core/cheats.c @@ -256,35 +256,23 @@ void mCheatRefresh(struct mCheatDevice* device, struct mCheatSet* cheats) { if (!cheats->enabled) { return; } - bool condition = true; - int conditionRemaining = 0; - int negativeConditionRemaining = 0; cheats->refresh(cheats, device); + size_t elseLoc = 0; + size_t endLoc = 0; size_t nCodes = mCheatListSize(&cheats->list); size_t i; for (i = 0; i < nCodes; ++i) { - if (conditionRemaining > 0) { - --conditionRemaining; - if (!condition) { - continue; - } - } else if (negativeConditionRemaining > 0) { - conditionRemaining = negativeConditionRemaining - 1; - negativeConditionRemaining = 0; - condition = !condition; - if (!condition) { - continue; - } - } else { - condition = true; - } struct mCheat* cheat = mCheatListGetPointer(&cheats->list, i); int32_t value = 0; int32_t operand = cheat->operand; uint32_t operationsRemaining = cheat->repeat; uint32_t address = cheat->address; bool performAssignment = false; + bool condition = true; + int conditionRemaining = 0; + int negativeConditionRemaining = 0; + for (; operationsRemaining; --operationsRemaining) { switch (cheat->type) { case CHEAT_ASSIGN: @@ -312,46 +300,55 @@ void mCheatRefresh(struct mCheatDevice* device, struct mCheatSet* cheats) { condition = _readMem(device->p, address, cheat->width) == operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_NE: condition = _readMem(device->p, address, cheat->width) != operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_LT: condition = _readMem(device->p, address, cheat->width) < operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_GT: condition = _readMem(device->p, address, cheat->width) > operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_ULT: condition = (uint32_t) _readMem(device->p, address, cheat->width) < (uint32_t) operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_UGT: condition = (uint32_t) _readMem(device->p, address, cheat->width) > (uint32_t) operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_AND: condition = _readMem(device->p, address, cheat->width) & operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_LAND: condition = _readMem(device->p, address, cheat->width) && operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; case CHEAT_IF_NAND: condition = !(_readMem(device->p, address, cheat->width) & operand); conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; break; } @@ -362,6 +359,18 @@ void mCheatRefresh(struct mCheatDevice* device, struct mCheatSet* cheats) { address += cheat->addressOffset; operand += cheat->operandOffset; } + + + if (elseLoc && i == elseLoc) { + i = endLoc; + endLoc = 0; + } + if (conditionRemaining > 0 && !condition) { + i += conditionRemaining; + } else if (negativeConditionRemaining > 0) { + elseLoc = i + conditionRemaining; + endLoc = elseLoc + negativeConditionRemaining; + } } } diff --git a/src/gba/cheats/parv3.c b/src/gba/cheats/parv3.c index d2c9df589..087294d0f 100644 --- a/src/gba/cheats/parv3.c +++ b/src/gba/cheats/parv3.c @@ -53,7 +53,7 @@ static uint32_t _parAddr(uint32_t x) { } static void _parEndBlock(struct GBACheatSet* cheats) { - size_t size = mCheatListSize(&cheats->d.list) - cheats->currentBlock; + size_t size = mCheatListSize(&cheats->d.list) - cheats->currentBlock - 1; struct mCheat* currentBlock = mCheatListGetPointer(&cheats->d.list, cheats->currentBlock); if (currentBlock->repeat) { currentBlock->negativeRepeat = size - currentBlock->repeat; @@ -64,7 +64,7 @@ static void _parEndBlock(struct GBACheatSet* cheats) { } static void _parElseBlock(struct GBACheatSet* cheats) { - size_t size = mCheatListSize(&cheats->d.list) - cheats->currentBlock; + size_t size = mCheatListSize(&cheats->d.list) - cheats->currentBlock - 1; struct mCheat* currentBlock = mCheatListGetPointer(&cheats->d.list, cheats->currentBlock); currentBlock->repeat = size; } diff --git a/src/gba/test/cheats.c b/src/gba/test/cheats.c new file mode 100644 index 000000000..f3fb80b00 --- /dev/null +++ b/src/gba/test/cheats.c @@ -0,0 +1,943 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "util/test/suite.h" + +#include +#include +#include +#include + +#include "gba/cheats/parv3.h" +#include "gba/cheats/gameshark.h" + +M_TEST_SUITE_SETUP(GBACheats) { + struct mCore* core = GBACoreCreate(); + core->init(core); + core->cheatDevice(core); + *state = core; + return 0; +} + +M_TEST_SUITE_TEARDOWN(GBACheats) { + if (!*state) { + return 0; + } + struct mCore* core = *state; + core->deinit(core); + return 0; +} + +M_TEST_DEFINE(createSet) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + set->deinit(set); +} + +M_TEST_DEFINE(addRawPARv3) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "80000000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_false(set->addLine(set, "43000000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + set->deinit(set); +} + +M_TEST_DEFINE(doPARv3Assign) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300000 00000078", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "02300002 00005678", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "04300004 12345678", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead16(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead32(core, 0x03000004, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x78); + assert_int_equal(core->rawRead16(core, 0x03000002, -1), 0x5678); + assert_int_equal(core->rawRead32(core, 0x03000004, -1), 0x12345678); + + set->deinit(set); +} + +M_TEST_DEFINE(doPARv3If1) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + + set->deinit(set); +} + +M_TEST_DEFINE(doPARv3If1x1) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + + set->deinit(set); +} + +M_TEST_DEFINE(doPARv3If2) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "48300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + + set->deinit(set); +} + +M_TEST_DEFINE(doPARv3If2x2) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "48300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "48300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + set->deinit(set); +} + +M_TEST_DEFINE(doPARv3If2Contain1) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "48300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + set->deinit(set); +} + +M_TEST_DEFINE(doPARv3IfX) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); +} + +M_TEST_DEFINE(doPARv3IfXxX) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); +} + +M_TEST_DEFINE(doPARv3IfXElse) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); +} + +M_TEST_DEFINE(doPARv3IfXElsexX) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); +} + +M_TEST_DEFINE(doPARv3IfXElsexXElse) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300006 00000061", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300006 00000062", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62); +} + +M_TEST_DEFINE(doPARv3IfXContain1) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); +} + +M_TEST_DEFINE(doPARv3IfXContain1Else) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); +} + +M_TEST_DEFINE(doPARv3IfXElseContain1) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); +} + +M_TEST_DEFINE(doPARv3IfXContain1ElseContain1) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300006 00000061", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300007 00000071", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300008 00000081", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300006 00000062", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "08300002 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300007 00000072", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300008 00000082", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x72); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81); + + core->reset(core); + core->rawWrite8(core, 0x03000002, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x72); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000002, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82); + + core->reset(core); + core->rawWrite8(core, 0x03000001, -1, 0x1); + core->rawWrite8(core, 0x03000002, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + core->rawWrite8(core, 0x03000001, -1, 0x1); + core->rawWrite8(core, 0x03000002, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31); + assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41); + assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51); + assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62); + assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71); + assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82); +} + +M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(GBACheats, + cmocka_unit_test(createSet), + cmocka_unit_test(addRawPARv3), + cmocka_unit_test(doPARv3Assign), + cmocka_unit_test(doPARv3If1), + cmocka_unit_test(doPARv3If1x1), + cmocka_unit_test(doPARv3If2), + cmocka_unit_test(doPARv3If2x2), + cmocka_unit_test(doPARv3If2Contain1), + cmocka_unit_test(doPARv3IfX), + cmocka_unit_test(doPARv3IfXxX), + cmocka_unit_test(doPARv3IfXElse), + cmocka_unit_test(doPARv3IfXElsexX), + cmocka_unit_test(doPARv3IfXElsexXElse), + cmocka_unit_test(doPARv3IfXContain1), + cmocka_unit_test(doPARv3IfXContain1Else), + cmocka_unit_test(doPARv3IfXElseContain1), + cmocka_unit_test(doPARv3IfXContain1ElseContain1)) From 232880bb0074eac3308ece3b006cb01902bbe035 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 30 Sep 2017 11:16:31 -0700 Subject: [PATCH 153/158] Qt: Hide mouse immediately when loading --- CHANGES | 1 + src/platform/qt/Window.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 192b685e7..97a94e2a5 100644 --- a/CHANGES +++ b/CHANGES @@ -62,6 +62,7 @@ Misc: - Qt: Allow overrides to be saved before a game is loaded - VFS: Make VFile.truncate work growing files on PSV (fixes mgba.io/i/885) - GBA Cheats: Improve detection of raw cheats + - Qt: Hide mouse immediately when loading 0.6.0: (2017-07-16) Features: diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 5c40ef52d..37f5e5887 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -678,6 +678,9 @@ void Window::gameStarted() { m_hitUnimplementedBiosCall = false; m_fpsTimer.start(); m_focusCheck.start(); + if (m_display->underMouse()) { + m_screenWidget->setCursor(Qt::BlankCursor); + } CoreController::Interrupter interrupter(m_controller, true); mCore* core = m_controller->thread()->core; From cea5864f817fe92ab2d1df85e5dd318aef788196 Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Sat, 30 Sep 2017 19:02:10 +0100 Subject: [PATCH 154/158] SDL: Fix software renderer build --- src/platform/sdl/sw-sdl.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/sdl/sw-sdl.c b/src/platform/sdl/sw-sdl.c index 498c18783..2451eb2c6 100644 --- a/src/platform/sdl/sw-sdl.c +++ b/src/platform/sdl/sw-sdl.c @@ -93,12 +93,12 @@ void mSDLSWRunloop(struct mSDLRenderer* renderer, void* user) { SDL_Surface* surface = SDL_GetVideoSurface(); #endif - while (context->state < THREAD_EXITING) { + while (mCoreThreadIsActive(context)) { while (SDL_PollEvent(&event)) { mSDLHandleEvent(context, &renderer->player, &event); } - if (mCoreSyncWaitFrameStart(&context->sync)) { + if (mCoreSyncWaitFrameStart(&context->impl->sync)) { #if SDL_VERSION_ATLEAST(2, 0, 0) SDL_UnlockTexture(renderer->sdlTex); SDL_RenderCopy(renderer->sdlRenderer, renderer->sdlTex, 0, 0); @@ -134,7 +134,7 @@ void mSDLSWRunloop(struct mSDLRenderer* renderer, void* user) { SDL_LockSurface(surface); #endif } - mCoreSyncWaitFrameEnd(&context->sync); + mCoreSyncWaitFrameEnd(&context->impl->sync); } } From 97e8827eb2f6097ab55531589039895b24429390 Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Sat, 30 Sep 2017 19:03:52 +0100 Subject: [PATCH 155/158] Qt: Fix building without OpenGL --- src/platform/qt/Window.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 0bd06eda7..b656794ed 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -191,7 +191,9 @@ private: QMenu* m_videoLayers; QMenu* m_audioChannels; ShortcutController* m_shortcutController; +#if defined(BUILD_GL) || defined(BUILD_GLES) std::unique_ptr m_shaderView; +#endif bool m_fullscreenOnStart = false; QTimer m_focusCheck; bool m_autoresume = false; From c3fc74cc1d94d095e7eeec158b7e3a034a4bf459 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 1 Oct 2017 11:31:23 -0700 Subject: [PATCH 156/158] Update CHANGES for 0.6.1 --- CHANGES | 76 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/CHANGES b/CHANGES index 97a94e2a5..e6f5695e7 100644 --- a/CHANGES +++ b/CHANGES @@ -10,59 +10,63 @@ Features: - Map viewer Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - - Python: Fix importing .gb or .gba before .core - - GBA: Reset active region as needed when loading a ROM - - Qt: Fix command line debugger closing second game - GB Serialize: Fix audio state loading - GB Video: Fix dot clock timing being slightly wrong - - GB MBC: Pocket Cam memory should be accessible without enabling - - GB Memory: Initialize peripheral pointers - - GB MBC: Fix SRAM sizes 4 and 5 - - GB Video: Fix 16-bit screenshots (fixes mgba.io/i/826) - - GB Core: Fix palette loading when loading a foreign config - - Qt: Fix LOG argument order - - GB Memory: Prevent accessing empty SRAM (fixes mgba.io/i/831) - - GB, GBA: Fix crashes when attempting to identify null VFiles - - GB MBC: Fix RTC initialization (fixes mgba.io/i/825) - - GB MBC: Fix RTC loading when file size is off - - GB Serialize: Fix deserializing video STAT - Qt: Fix GL display when loading a game from CLI (fixes mgba.io/i/843) - - GB, GBA Savedata: Fix savestate-related save overwriting (fixes mgba.io/i/834) - - Qt: Fix timezone issues with time overrides - - Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841) - ARM: Fix MSR when T bit is set - - GB Video: Fix potential hang when ending mode 0 - - GB Memory: Fix HDMA count starting in mode 0 (fixes mgba.io/i/855) - - GB Memory: Actually load latch time from savestate - GB Serialize: Fix game title check - - GB, GBA: Fix sync to video with frameskip - - GB Audio: Fix NRx2 writes while active (fixes mgba.io/i/866) - - GBA BIOS: Use core's VRAM variable instead of renderer's - - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) - - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) - - GBA: Fix keypad IRQs not firing when extra buttons are pressed - - GBA Video: Fix broken sprite blending hack (fixes mgba.io/i/532) - - GBA I/O: Fix reading from a few invalid I/O registers (fixes mgba.io/i/876) - - GBA Savedata: Fix size of SRAM saves (fixes mgba.io/i/883) - GB: Revamp IRQ handling based on new information - - GB Video: Fix read mode when enabling LCD - - GBA Cheats: Fix PARv3 multiline blocks (fixes mgba.io/i/889) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) - All: Make FIXED_ROM_BUFFER an option instead of 3DS-only - - Qt: Don't rebuild library view if style hasn't changed - Qt: Redo GameController into multiple classes - - SDL: Fix 2.0.5 build on macOS under some circumstances - Test: Restructure test suite into multiple executables - Python: Integrate tests from cinema test suite - Util: Don't build crc32 if the function already exists - - GBA: Detect hardware for Pokémon FireRed ROM hacks + +0.6.1: (2017-10-01) +Bugfixes: + - GB, GBA: Fix crashes when attempting to identify null VFiles + - GB, GBA: Fix sync to video with frameskip + - GB, GBA Savedata: Fix savestate-related save overwriting (fixes mgba.io/i/834) + - GB Audio: Fix NRx2 writes while active (fixes mgba.io/i/866) + - GB Core: Fix palette loading when loading a foreign config + - GB MBC: Pocket Cam memory should be accessible without enabling + - GB MBC: Fix SRAM sizes 4 and 5 + - GB MBC: Fix RTC initialization (fixes mgba.io/i/825) + - GB MBC: Fix RTC loading when file size is off + - GB Memory: Initialize peripheral pointers + - GB Memory: Prevent accessing empty SRAM (fixes mgba.io/i/831) + - GB Memory: Fix HDMA count starting in mode 0 (fixes mgba.io/i/855) + - GB Memory: Actually load latch time from savestate + - GB Serialize: Fix deserializing video STAT + - GB Video: Fix 16-bit screenshots (fixes mgba.io/i/826) + - GB Video: Fix potential hang when ending mode 0 + - GB Video: Fix read mode when enabling LCD + - GBA: Reset active region as needed when loading a ROM + - GBA: Fix keypad IRQs not firing when extra buttons are pressed + - GBA BIOS: Use core's VRAM variable instead of renderer's + - GBA Cheats: Fix PARv3 multiline blocks (fixes mgba.io/i/889) + - GBA I/O: Fix reading from a few invalid I/O registers (fixes mgba.io/i/876) + - GBA Savedata: Fix 512 byte EEPROM saving as 8kB (fixes mgba.io/i/877) + - GBA Savedata: Fix size of SRAM saves (fixes mgba.io/i/883) + - GBA Video: Fix broken sprite blending hack (fixes mgba.io/i/532) + - Python: Fix importing .gb or .gba before .core + - Qt: Fix command line debugger closing second game + - Qt: Fix LOG argument order + - Qt: Fix timezone issues with time overrides + - Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841) + - SDL: Fix potential race condition when pressing keys (fixes mgba.io/i/872) +Misc: - CMake: Fix CPack dependencies for libpng 1.6 - - Qt: Allow overrides to be saved before a game is loaded - - VFS: Make VFile.truncate work growing files on PSV (fixes mgba.io/i/885) + - GBA: Detect hardware for Pokémon FireRed ROM hacks - GBA Cheats: Improve detection of raw cheats + - Qt: Don't rebuild library view if style hasn't changed + - Qt: Allow overrides to be saved before a game is loaded - Qt: Hide mouse immediately when loading + - SDL: Fix 2.0.5 build on macOS under some circumstances + - VFS: Make VFile.truncate work growing files on PSV (fixes mgba.io/i/885) 0.6.0: (2017-07-16) Features: From abb852b9496375004b8ac17b57bcfdf384ae7c05 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 1 Oct 2017 11:36:07 -0700 Subject: [PATCH 157/158] Res: Update patrons for October --- res/patrons.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/patrons.txt b/res/patrons.txt index 3ec04c2b9..a92093f30 100644 --- a/res/patrons.txt +++ b/res/patrons.txt @@ -2,8 +2,8 @@ Jaime J. Denizard Fog Reilly Grant Philip Horton -Jordan Jorgensen mars +pr1ntf Rohit Nirmal Rhys Powell rootfather From f7c935f217370c86078e3c5a7603f65cb87c092c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 1 Oct 2017 14:56:49 -0700 Subject: [PATCH 158/158] Wii: Fix SGB borders (fixes #874) --- src/platform/wii/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/wii/main.c b/src/platform/wii/main.c index 632c20cc0..f42447a7a 100644 --- a/src/platform/wii/main.c +++ b/src/platform/wii/main.c @@ -33,7 +33,7 @@ #define CLASSIC_INPUT 0x57494943 #define TEX_W 256 -#define TEX_H 160 +#define TEX_H 224 static void _mapKey(struct mInputMap* map, uint32_t binding, int nativeKey, enum GBAKey key) { mInputBindKey(map, binding, __builtin_ctz(nativeKey), key);

    -ze^F6n8a>+Z#o?Q6xO^)bhf)JCsT&Rk=A; zaYuWtqm`=C8+Xggm!0M3tSZ00XjKorY57~4I-0w+_3eGvZVfWycSThz{*0mJk`p;A zJIcCQX{oz7x3sqS)KXV5zjSSJMbWJKw~Fo-MLTXyPu!Zw4W+C^&I++AuhpHYcEPn` z!H+U8@>-L3jwOe3NylQFiwnGyC`Hg@0jq5JUl)w7E;C?LKJoyDNKsxA~2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CJ0aj}a&|82mGIgDjB# z@9}_V+GtwM7}GTHhq*Pz!IRJ92mG40etkG>nyszTD2&*%=g5)!?(6Q}w5g>9;-(4z zv%hX#U*EcQn2&Yg9!%489Wrzs{qXJM27ZWd-fWt&m}zd_3mIbwYl7@?5OEfg{g(3)l#P+QYX6Ld6c+diLRSXM#of2nO7dq93ToJ!^M zSiew+$MbnrmGNj4G<3lHLSbcps0SYz$NN}JRqJcO%Jub1jf7fS3}eq8!$96JXP7C@ z78J%H2UH~DIIteZa5SvYagH53a%5`CvP{$977F1kAb)Poao_`2Ievkg<3u7d4pAA; z=i~9Yxj46c9^!S4yrKWX!m(p=JgmG>fU9joK0aCCAB%xDP1p@SpUiihRBCMOz=2fC zaUc$z&~U|x#LUdDUFmd!8^mpUdU||(=g#3_tZ$mZn&I=s^sdZ><4jO z_xpoE96vt~b49~`xEA?54<7~{;)eSR=9NzG+BGvH=LZqog)lym2nM^l>h-=qzthuG zQ=q}{oyPU6++s1?mihR`z*`{quVLtVB%*V}(Tr`|mdQBIwrxHit|k%zKA{lAVQ<%P ziuW6|d?PjOzyVl!C=?F&_ixz(`A`=P`GRkDc5)J^!#&v6tpfw_&{5$G=uKQ~=R{*sm4G4TBT+%!$j4@M0PWHRs#PrYuS z=ia%{6AZK&S9kNfL%}xV7x0|1ngbi#jGwocdf9@)tP|&d9qDDu%5f&{_-QhQ3ysIg zl+Tn-EZU1hi=&G>W1Wlf*l&v?=k?Tz17j9af9JrMPF7T&Pr*Snt>ej&^h7Q>KEd#e zm`Vgrim7VFli}^k36ay5n3zb8=hE5RyrgjY(8=&xI8x>lk>VHU*$gMrnWV!{wCUuh z*<8a%6-MhneyQ4uz78ms~ANzK{M|$qPbxB|jI^D+yedFdrIB z@CLsMsoG3w+9?(T4VriZzie z{k4*Lp}dmM3+a`FIlqSaFy|TG;B6sQhbbp901cXXgAUo?BlOoAToTG_@V$^;gYpBs zBpZdrt4XG`in}H#>Ek8aWyv7=YbE=I@=ERy(klsb9>;u`^FiL=ULn;KQy#zoG+4zO z=(54n=&v<+Nhq(uaUs11GxXO=ej}7u@`{jNNj~RN zufEX9;>zV!mCGZg)@2s<1)GekrIB)f<@!vy-)Q6S!jBtTSk}L~6kBtAxizAGuU zU@4#^G61l}vJ!k2@B&?@>Y5g-CYfCvx)B0vO) x01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5%_lr`~k4IZM^^h literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.sav b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.sav new file mode 100644 index 000000000..e69de29bb diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.sym new file mode 100644 index 000000000..a0639ed09 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_hwio-C/test.sym @@ -0,0 +1,212 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/misc/boot_hwio-C.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01db _wait_ly_4 +00:01e1 _wait_ly_5 +00:01f7 _print_results_halt_1 +00:01fa _test_ok_cb_0 +00:0202 _print_sl_data55 +00:020a _print_sl_out55 +00:020d mismatch +00:0230 _wait_ly_6 +00:0236 _wait_ly_7 +00:024c _print_results_halt_2 +00:024f mismatch_cb +00:0257 _print_sl_data56 +00:0265 _print_sl_out56 +00:027f _print_sl_data57 +00:0289 _print_sl_out57 +00:029a _print_sl_data58 +00:02a4 _print_sl_out58 +00:02ad hwio_data +00:c014 mismatch_addr +00:c016 mismatch_data +00:c017 mismatch_mem diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..e29254b103d9ae4cf2647a1288d3df172344d37b GIT binary patch literal 1317 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Uz&PZ!6KiaBrR-kmnvfTv~d zygmQ5my2gc%5P|?Uy>^EYK&NJmc?q$LqR9Q`pg*D#Pj1$D-!WH2Jfgev&{%`u$J*V!TSn=geDo_S3?|e2#P6 zGObT}TPoNB-|m~6HI1J)JIs&o;{Er@k><{~=2ZRG-t#ZH_Ex0lWz&t@oHtszm>;y9 z{@0`6(V66B?D==UEB?#&U!N+ysJ2bzzt}dLKUX#{-~Va-w6j~2&%U*I;HKsjAm?-L zjLPYFf8+3IH@TQq0iPc|In%sYOwqdX$*-&C1slHze@;j*+BhRVFZx-Mby(ijWi~gC zyqBEu{L{qUM|K{XI(f|%o1*JW!**R?`}x7l4Swp8&iAj)-xJX;vFgq$6$3w?((X?Q zRX~3?&t_lGU%USS`*AZ@wgr_1A$2ofu}2#^7cRZ|f%|9bD)~K@yeI0MPj&IlSwHI) zyZv_d@}lW~gmmXAUikdris!YeIX@<^nLW2ZN#yClCqB;(HcsxoqG*+s`7F^aBghe^Z5Ptz97cs1>-b>vamg9jwLgtzto(%^sh zNWyKw{W)HzOn1ajT|0Blv+k&p?V;9!%R}E3x3?ENe&L_k{t23#;Bf>`Wp#O>eg9gX z?6|v2KVxln=Dq!QV-BT-UMrNXm-?TVq^16SQT3bibNw%@Ij(3xB}M)Rsu@A_}w7OhtJ?NQ=svwf}d6He82*cqk#u&}k*%^ca@VYDpo)cl~*`^oC} zW-Tk;?fmK%&uanU!byciyz?X$y*4^~%S!jgFZ;7w8J5fC`d3!Xvv^-2a;h0Q2Ov9n z=fAz4`}Xfn3Y=qiC~@7k>c2H2Pro00dgkw3@w!R z@LkO{vbs*iqVQSaUt_CT5#D7N4)lM1^j)oX)pACwZo^4Cyys{?m{+C50*r|THu}4s zJel73x^&)Dc6P1_)8miL)963lJh${5$IqvEvyLy)ytPRD*n!SjQzbswIlHOF`Uc~I(bf3}Lf z1=j^nvAVjStoG+l%E?TP|F!@A+yAy7Gv}QBRru%(vx$x%>k9$hMKc5|%1=h_VUktf z75IHZvVL!6;WDRvdRAS#k5s0VPD-tnn$(!G{Z{Ow7{)JqJwG)sW|*7u@cH!k5070c z^Mg*FZ|-kD&gxa7*x51Vlkex}FLbhC%R%-63$ae7g*U(SGVA*C!u~6l zFMsjI>C^k>_IG`E;qsSnymk82UG|etJ+*)DvwQE@H)|c*d+-pOo@U&XyVxC9m$Yv0 z&id-lwQjFow+_{A_UfzFlRx};r{;Zg@#CL)Xt`JOp6PA(6pdA`58L5thsQnTb2h8C zi_s^xQVogGCGHD~(N}!bB}P|lt=cI@SGi9YqhIVob-ftX&pwc?#Ilupvz676Uh8iC+FH6=d$diReK&89GUE@WQ>}#ZMmYE2L+O0ZwI;?a zKA6g|9;fvGJ|47tB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>@uzeb?A#^8UkuaQO4|2-b?OxK#$Fvc_u{Bdq;mjJV~_RpY}wM*265B0xNX?b*SBE<=3`wLgK3(sLx!%SAASb7fgj>qx0K-=1zYHONlf=(tKClD|U z%PNZVFSX-f56F+lv)Muc>lcfuRH2}%GM-F=h7OotEZ*23>cL0GactYF+S~(HZthoV zB-GYs7<={@2J(hA!%A_rpfCnGpb`n!h5aywvtfs>yR>xd*vyP&nWn)l7Q{&CSX6K?F}B z%ulDI(eCbMz2kFuc>af0dhUJC4l98w0mMo?pYz^+ZDFhO-&lu_K>%-5omu z0o+X@0eoUHh{M@#;1u^8w7ij;cHjW)JQj<``}?o{;yQz_7cgK%2l4yuCbwrv9g&=+F3d&7XWqt^9g5?0Xc554;O zHg3c?oWbVr7w{eBHa$H*-;Bcx&XtjsU3PdSW&gf1d{)2l)iaCPzw_#uF!PjGvhenq zj`7TJZelVsKEWzh9{wfZyQX<3HN_jPb$F-ZVO~_( zhyGrRbsL+Nr-f=A9pMEGU3pPR4bB=jRvzIcj|-nV#FV#jDwJfrWVJ~Wu%4Xz8RI!tNVB{l;MT6lwyY;Y_38x6Jy3jgkeS{F1K->6e5xzlr&<<~iQrJt0+>DJL-i4O)4FF4^Ey^fww@ z7Rqn%osfQm^5eWD8-dNM8K!iIQ45p|@RFUfWEB04lKn#YCGQu~F9~ZN$9!1xLEhj| zA=NBX9>)MQSjQXavcU`JZ!~yKD8Io8A^isB=Xl8vgip;gUKy19*whT2Q^ z`V;kzgnDk>x&CM=qNMWxu+6g4d=+qkZdE3wYpCIhM0k^k@`Us|e(DkF+IeH@>(cM~ zsqacx=El^Iq(AGYUX-r<+EjXn)xY-VBsC%eM1Tko0U|&IhyW2F0z`la5CI}U1c(3; zAOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; I_=gGn2{`ih^8f$< literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/test.sym new file mode 100644 index 000000000..0e44909cc --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-A/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/misc/boot_regs-A.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01d2 invalid_sp +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_failure_cb_0 +00:020d _print_sl_data55 +00:021e _print_sl_out55 +00:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb2235a58d8d4b6ecf2f2e287968b5d29286351 GIT binary patch literal 1320 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 JBJd9r_!FG?_VNG# literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/test.sym new file mode 100644 index 000000000..9421cd102 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/boot_regs-cgb/test.sym @@ -0,0 +1,199 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/misc/boot_regs-cgb.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:01d2 invalid_sp +00:01e6 _wait_ly_4 +00:01ec _wait_ly_5 +00:0202 _print_results_halt_1 +00:0205 _test_failure_cb_0 +00:020d _print_sl_data55 +00:021e _print_sl_out55 +00:c014 sp_save diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/baseline_0000.png b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..a129e5e8812a9bde9361542c3fea58bbe67476bf GIT binary patch literal 1355 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Tp&r;B4q#hkZuFHT#nz~fpN z_W%F%YWb?y8(NMqoRsKK-+$&xmXD>XkY{T3{`;*DJ{50eRuSXk;bUcMXKHqCJh#*{N4`C}-urIfw`FViH_kcw$YDaQLEP8wZS^IKlkRq0Qh0q~<`m~$FD~x* zT72bS@qio)&Ssm{tJuiMW@5a@$ z`b&83QEw0H{^8%rcH4e!P}|3wa<>ZH9(#ob|1+Ajh|_C zKd(tmU!(hL;BQSkkM~l& zF25z+Pviv6JO9Q=z9u{2bAtQ3N9p2EY<`$bQ~PK_pJB?EER^*SP^S)uKIyZdgHt)C~;j<_AW@MfU z`xT$%Qv3YdybVDuHLsde|3Cj=?~;F?{rQ&I<+quayuGCIai8sq&ZRT0Q|%rr$~c#F zn{2#%ciooPef=|D04ZVXD^tEnjXekhXgbG-!GA8czFs^Ao%7 zF$;NJ67b!#0G#a!dkqp0m7bP0l+XkKzAK(D literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/manifest.yml b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/manifest.yml new file mode 100755 index 000000000..970c243ab --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/manifest.yml @@ -0,0 +1 @@ +config: {gb.model: CGB} diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/test.gb b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..e7b06ccdcc6703091cf7c8fd48207530c34d27de GIT binary patch literal 32768 zcmeI4e`p)$8OPr{$m=>DcV?_K&Y#d-wSlF1>cI{maK5JAU+u zqjw*hu^vBq@^Lmb#keW=vb+ECVYJJ$mt*!{W43Z?soG&H)wM5w&6XcgD)DUP$Jxr- zNYpxCSyZCwweso>clBAT#;?D#YNuba!p(v9rfzLVTkoBFW6bzk`Lj|9=Z&UpCO^r# zol;#p5VO@&e9&*L8ub1CRt;{L*^S^zk5|`@g7$`NJ@Le5o3d|r-7dTS5yWk)n%UTS zt3dhRO?Jk>Y5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOg3UKyjVHf0D0ri{$_R z@woME0b1P{(=^B>xNWRSBnk!mKwQ&y>_{X`v$Zvqf)PiKoICgM!`-?>N{4>Jy1G}CIw?YB(4Ig8fZYOTP!&w~?CI}^zL3M!8wSiBeO*tbU= zo>(Mge13@EosNZ!FCcQ+YKr_QWc=^`Qj{$y%vxH$IUHrH$^|Cw_`7O~SJuC*rhK`y zRCTKRt0UC|c4swhe^nh`*0USlakG&9F7LSMWS;U|7G87HIzBj@o0uFNpI{X$4?jt` z)->;8;(ldG)Pyn<6NBTExzV5bMTy+$i;1ngP95FP2n$jY4u)9baGMU7{;R(>oRsKzY<>4=m-}u zbmeK`YOvS1vGNF)JTGGE5K~^np&-e)WQ&yiJI3phSA^$FzAao|61c2jJv5l$4Q>io zb(j)3AQl4+0=z+3HrS5wdV^iU^BW|E>o+Jr#3l10rtW9TgE$l+I+8N+y8vQK!vC1K9vSPyeP$s7D!xN4Ruk75EEY~c-b+2ARR z*Bks^cz%Nm!u1=JpX8FSikO;b%4Hl1lFeMQLrT7d@w(*u!t*6R6|OJI=Uj^F3!N;j z+}KjNFO0F85XL%9s0$5I+l_>}+PE;g*u!abdMJslLAD^}bjsqGa*_ zu-URQd=_wkwkwk|G*k~oBD_gN`Gt%-e(4z*+P|^%4>Iohr7z3S;KtH_$avN-eN%?= z>q|?w`EMwaCjvx(2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la r5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+Spw~N3xZ%VH; literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/test.sym b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/test.sym new file mode 100644 index 000000000..7ebdacba7 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/misc/gpu/vblank_stat_intr-C/test.sym @@ -0,0 +1,216 @@ +; this file was created with wlalink by ville helin . +; wla symbolic information for "/Users/vicki/Scratch/mooneye-gb/tests/build/misc/gpu/vblank_stat_intr-C.gb". + +[labels] +01:4bff print_load_font +01:4c0c print_string +01:4c16 print_a +01:4c20 print_newline +01:4c2b print_digit +01:4c38 print_regs +01:4c41 _print_sl_data0 +01:4c47 _print_sl_out0 +01:4c54 _print_sl_data1 +01:4c5a _print_sl_out1 +01:4c6c _print_sl_data2 +01:4c72 _print_sl_out2 +01:4c7f _print_sl_data3 +01:4c85 _print_sl_out3 +01:4c97 _print_sl_data4 +01:4c9d _print_sl_out4 +01:4caa _print_sl_data5 +01:4cb0 _print_sl_out5 +01:4cc2 _print_sl_data6 +01:4cc8 _print_sl_out6 +01:4cd5 _print_sl_data7 +01:4cdb _print_sl_out7 +01:4000 font +00:c000 regs_save +00:c000 regs_save.f +00:c001 regs_save.a +00:c002 regs_save.c +00:c003 regs_save.b +00:c004 regs_save.e +00:c005 regs_save.d +00:c006 regs_save.l +00:c007 regs_save.h +00:c008 regs_flags +00:c009 regs_assert +00:c009 regs_assert.f +00:c00a regs_assert.a +00:c00b regs_assert.c +00:c00c regs_assert.b +00:c00d regs_assert.e +00:c00e regs_assert.d +00:c00f regs_assert.l +00:c010 regs_assert.h +00:c011 memdump_len +00:c012 memdump_addr +01:47f0 memcpy +01:47f9 memset +01:4802 memcmp +01:4810 clear_vram +01:481a clear_oam +01:4824 disable_lcd_safe +01:482a _wait_ly_0 +01:4830 _wait_ly_1 +01:4839 reset_screen +01:484d process_results +01:4861 _wait_ly_2 +01:4867 _wait_ly_3 +01:487d _print_results_halt_0 +01:4880 _process_results_cb +01:488b _print_sl_data8 +01:4895 _print_sl_out8 +01:48af _print_sl_data9 +01:48ba _print_sl_out9 +01:48d2 _print_sl_data10 +01:48de _print_sl_out10 +01:48df dump_mem +01:48fe _dump_mem_line +01:4928 _check_asserts +01:4936 _print_sl_data11 +01:4939 _print_sl_out11 +01:4945 _print_sl_data12 +01:4947 _print_sl_out12 +01:494f _print_sl_data13 +01:4952 _print_sl_out13 +01:495c __check_assert_fail0 +01:4967 _print_sl_data14 +01:496a _print_sl_out14 +01:496d __check_assert_ok0 +01:4975 _print_sl_data15 +01:497a _print_sl_out15 +01:497c __check_assert_skip0 +01:4984 _print_sl_data16 +01:498c _print_sl_out16 +01:498c __check_assert_out0 +01:4998 _print_sl_data17 +01:499a _print_sl_out17 +01:49a2 _print_sl_data18 +01:49a5 _print_sl_out18 +01:49af __check_assert_fail1 +01:49ba _print_sl_data19 +01:49bd _print_sl_out19 +01:49c0 __check_assert_ok1 +01:49c8 _print_sl_data20 +01:49cd _print_sl_out20 +01:49cf __check_assert_skip1 +01:49d7 _print_sl_data21 +01:49df _print_sl_out21 +01:49df __check_assert_out1 +01:49ea _print_sl_data22 +01:49ed _print_sl_out22 +01:49f9 _print_sl_data23 +01:49fb _print_sl_out23 +01:4a03 _print_sl_data24 +01:4a06 _print_sl_out24 +01:4a10 __check_assert_fail2 +01:4a1b _print_sl_data25 +01:4a1e _print_sl_out25 +01:4a21 __check_assert_ok2 +01:4a29 _print_sl_data26 +01:4a2e _print_sl_out26 +01:4a30 __check_assert_skip2 +01:4a38 _print_sl_data27 +01:4a40 _print_sl_out27 +01:4a40 __check_assert_out2 +01:4a4c _print_sl_data28 +01:4a4e _print_sl_out28 +01:4a56 _print_sl_data29 +01:4a59 _print_sl_out29 +01:4a63 __check_assert_fail3 +01:4a6e _print_sl_data30 +01:4a71 _print_sl_out30 +01:4a74 __check_assert_ok3 +01:4a7c _print_sl_data31 +01:4a81 _print_sl_out31 +01:4a83 __check_assert_skip3 +01:4a8b _print_sl_data32 +01:4a93 _print_sl_out32 +01:4a93 __check_assert_out3 +01:4a9e _print_sl_data33 +01:4aa1 _print_sl_out33 +01:4aad _print_sl_data34 +01:4aaf _print_sl_out34 +01:4ab7 _print_sl_data35 +01:4aba _print_sl_out35 +01:4ac4 __check_assert_fail4 +01:4acf _print_sl_data36 +01:4ad2 _print_sl_out36 +01:4ad5 __check_assert_ok4 +01:4add _print_sl_data37 +01:4ae2 _print_sl_out37 +01:4ae4 __check_assert_skip4 +01:4aec _print_sl_data38 +01:4af4 _print_sl_out38 +01:4af4 __check_assert_out4 +01:4b00 _print_sl_data39 +01:4b02 _print_sl_out39 +01:4b0a _print_sl_data40 +01:4b0d _print_sl_out40 +01:4b17 __check_assert_fail5 +01:4b22 _print_sl_data41 +01:4b25 _print_sl_out41 +01:4b28 __check_assert_ok5 +01:4b30 _print_sl_data42 +01:4b35 _print_sl_out42 +01:4b37 __check_assert_skip5 +01:4b3f _print_sl_data43 +01:4b47 _print_sl_out43 +01:4b47 __check_assert_out5 +01:4b52 _print_sl_data44 +01:4b55 _print_sl_out44 +01:4b61 _print_sl_data45 +01:4b63 _print_sl_out45 +01:4b6b _print_sl_data46 +01:4b6e _print_sl_out46 +01:4b78 __check_assert_fail6 +01:4b83 _print_sl_data47 +01:4b86 _print_sl_out47 +01:4b89 __check_assert_ok6 +01:4b91 _print_sl_data48 +01:4b96 _print_sl_out48 +01:4b98 __check_assert_skip6 +01:4ba0 _print_sl_data49 +01:4ba8 _print_sl_out49 +01:4ba8 __check_assert_out6 +01:4bb4 _print_sl_data50 +01:4bb6 _print_sl_out50 +01:4bbe _print_sl_data51 +01:4bc1 _print_sl_out51 +01:4bcb __check_assert_fail7 +01:4bd6 _print_sl_data52 +01:4bd9 _print_sl_out52 +01:4bdc __check_assert_ok7 +01:4be4 _print_sl_data53 +01:4be9 _print_sl_out53 +01:4beb __check_assert_skip7 +01:4bf3 _print_sl_data54 +01:4bfb _print_sl_out54 +01:4bfb __check_assert_out7 +00:0169 fail_halt +00:017d _wait_ly_4 +00:0183 _wait_ly_5 +00:0199 _print_results_halt_1 +00:019c _test_failure_cb_0 +00:01a4 _print_sl_data55 +00:01a9 _print_sl_out55 +00:01ac test_round1 +00:01b8 _wait_ly_6 +00:0203 finish_round1 +00:0221 test_round2 +00:022d _wait_ly_7 +00:0279 finish_round2 +00:029b test_round3 +00:02a7 _wait_ly_8 +00:02f1 finish_round3 +00:030f test_round4 +00:031b _wait_ly_9 +00:0366 finish_round4 +00:0368 test_finish +00:c014 intr_vec_vblank +00:c017 intr_vec_stat +00:c01a round1 +00:c01b round2 +00:c01c round3 diff --git a/src/platform/python/tests/cinema/gb/mooneye-gb/update.py b/src/platform/python/tests/cinema/gb/mooneye-gb/update.py new file mode 100644 index 000000000..e192abac7 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/mooneye-gb/update.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +import os +import os.path +import shutil +import yaml +from cinema.util import dictMerge + +suffixes = { + 'C': 'CGB', + 'S': 'SGB', + 'A': 'AGB', + 'mgb': 'MGB', + 'sgb': 'SGB', + 'sgb2': 'SGB2', + 'cgb': 'CGB', + 'agb': 'AGB', + 'ags': 'AGB', +} + +def ingestDirectory(path, dest): + for root, _, files in os.walk(path, topdown=False): + root = root[len(os.path.commonprefix([root, path])):] + if root.startswith('utils'): + continue + for file in files: + fname, ext = os.path.splitext(file) + if ext not in ('.gb', '.sym'): + continue + + try: + os.makedirs(os.path.join(dest, root, fname)) + except OSError: + pass + + if ext in ('.gb', '.sym'): + shutil.copy(os.path.join(path, root, file), os.path.join(dest, root, fname, 'test' + ext)) + + for suffix, model in suffixes.items(): + if fname.endswith('-' + suffix): + manifest = {} + try: + with open(os.path.join(dest, root, fname, 'manifest.yml'), 'r') as f: + manifest = yaml.safe_load(f) or {} + except FileNotFoundError: + pass + dictMerge(manifest, { + 'config': { + 'gb.model': model + } + }) + with open(os.path.join(dest, root, fname, 'manifest.yml'), 'w') as f: + yaml.dump(manifest, f) + +if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser(description='Update mooneye-gb test suite') + parser.add_argument('source', type=str, help='directory containing built tests') + parser.add_argument('dest', type=str, nargs='?', default=os.path.dirname(__file__), help='directory to contain ingested tests') + args = parser.parse_args() + + ingestDirectory(args.source, args.dest) diff --git a/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0000.png b/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..9c91f7846b007bea5fded306bdc8e1ba22619afa GIT binary patch literal 1810 zcmV+t2krQYP)0058(0ssI20N3}|000KrNkl z&AQ?s42G#suaGXiK9}t+G7IKlgn|S^32ENNnTi;&A0+(MS)6l*8OyR5V;EL!Mppli zzo(}9wub!hBQUY>R=J2}SsJ9x+2@vyt$#!QNXmx+_tZI;ij=dS(>1MMIe&z&Lrpcl z+UJ&DsJ{ci{HNCi`)OG#>@ohjtq&PGr|Rv5$`D#+2>hB+qWNp?m7;_^(Ao-fklaVC zw=aAg*7yRAqq`GIY;Yb0!ksLQ!Tr&Buy95SOahh0 zgr12N(+g~^9bE<1Og|6y!~1R9;L89uT^=J>veGeqTYj%rq;x~NNTy$^gla*}u<25n zUSRX-W}#--bdjvanAhud9EStvXVa-L%tHm$JUAy0HeDue@})|``yi6lH)r?x0EJ)A z^2?L{g1q~hOph#d>(jTewaT5ZMj4riFOQi(Xa%P7lh}FA-44(%*4n6dUe<%ni23U^ z&6g2wPz-j?S!=De@S-gp#p$;o|7v_#_I-~=(Xjh^dUWDw#u8p))3N2=%|$M1JcMQI{PhAxu0@ZUzX~2RrwkMLIF3<8pStKFHMszG8~(Xic(?g06%y8> zl>*c62VYR`)Ub2Wg!y~hnF4ju!Wp?;s9b>?w_TX44@v&sc4lGZc42BzV=y^lzgVt0 z-fb;lKjOd0^kJxDvVZ-ItP*AX&|543Tsn#yIH57CVmMSn+ zxm5P48VXimjt_v3S~w(masp-i0yqjhYOT0yxucd&bw5}*DzI=kx@cB0c=mER3M?`P zk1Cg)i#{D(Trig#Rc>$C39Qh<(M8{l+r{9!ajzJR{o#(;%k2$2ffZUfx@eK}(NX1c z6j+PS1)iD)VNO3nb;L&nenYa>L3{S< z_jAQLv)UMn7}GbIi2bep6SmUOBH6@Hj;DHXn|=TqEcZB=_E9|XceZA zP6E~ArY!=iFa@|hFy82*RhS&?W+e>*t1uHWY>-9xbHca!)f_Ctrb&bkb*aDw$Zmw* zXrAbPuy80h8w8v|ln152xB3mpS(x5MOFhp_#qJ>MXyK^9!qFHkoVDxEF=`ARj_%hAM`N&XRAAwJ468Y3`Yh@2v7mPh z)`5v6f~@g0>Gv_0Zz%o7Zfd{Aen4ZeaNYt(&mS~HWk>Ck*w3zHMLpgB$I*prolo>MGW>$Bv3P4?>eN9Tn>3z;rn*7kFpt0 zli_osS~{Z6%CNRM>Pu2&SO zStwA(5)|q6d(r&@vyA=P-u446F&M6s869Ntrg1;`f_YvJwU4r|Cpv_4(f`?SI&aQx zF{Nh>+Uz%^%d?;D!Ej{}{)Gipu0EFM&4v1%hJbqe*mRNhOVgxuC)j+R(K+2VIJE;m zXcAGQ^l}TRw~tL1X&>#Pqr3n6pg*l;RNb20CnZPAesHwYKz{d8`%X$3^eDPPPVBrH zySSFKk4+b8|JQTTX;(Y7QD@QqXG*jcF`pJ zlvH-qezW~|K`@T$%tQtsn(9DFHX4J4qXG-(9}Q@yr0=&-<^TWy07*qoM6N<$f`>ng AhyVZp literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0001.png b/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..9c91f7846b007bea5fded306bdc8e1ba22619afa GIT binary patch literal 1810 zcmV+t2krQYP)0058(0ssI20N3}|000KrNkl z&AQ?s42G#suaGXiK9}t+G7IKlgn|S^32ENNnTi;&A0+(MS)6l*8OyR5V;EL!Mppli zzo(}9wub!hBQUY>R=J2}SsJ9x+2@vyt$#!QNXmx+_tZI;ij=dS(>1MMIe&z&Lrpcl z+UJ&DsJ{ci{HNCi`)OG#>@ohjtq&PGr|Rv5$`D#+2>hB+qWNp?m7;_^(Ao-fklaVC zw=aAg*7yRAqq`GIY;Yb0!ksLQ!Tr&Buy95SOahh0 zgr12N(+g~^9bE<1Og|6y!~1R9;L89uT^=J>veGeqTYj%rq;x~NNTy$^gla*}u<25n zUSRX-W}#--bdjvanAhud9EStvXVa-L%tHm$JUAy0HeDue@})|``yi6lH)r?x0EJ)A z^2?L{g1q~hOph#d>(jTewaT5ZMj4riFOQi(Xa%P7lh}FA-44(%*4n6dUe<%ni23U^ z&6g2wPz-j?S!=De@S-gp#p$;o|7v_#_I-~=(Xjh^dUWDw#u8p))3N2=%|$M1JcMQI{PhAxu0@ZUzX~2RrwkMLIF3<8pStKFHMszG8~(Xic(?g06%y8> zl>*c62VYR`)Ub2Wg!y~hnF4ju!Wp?;s9b>?w_TX44@v&sc4lGZc42BzV=y^lzgVt0 z-fb;lKjOd0^kJxDvVZ-ItP*AX&|543Tsn#yIH57CVmMSn+ zxm5P48VXimjt_v3S~w(masp-i0yqjhYOT0yxucd&bw5}*DzI=kx@cB0c=mER3M?`P zk1Cg)i#{D(Trig#Rc>$C39Qh<(M8{l+r{9!ajzJR{o#(;%k2$2ffZUfx@eK}(NX1c z6j+PS1)iD)VNO3nb;L&nenYa>L3{S< z_jAQLv)UMn7}GbIi2bep6SmUOBH6@Hj;DHXn|=TqEcZB=_E9|XceZA zP6E~ArY!=iFa@|hFy82*RhS&?W+e>*t1uHWY>-9xbHca!)f_Ctrb&bkb*aDw$Zmw* zXrAbPuy80h8w8v|ln152xB3mpS(x5MOFhp_#qJ>MXyK^9!qFHkoVDxEF=`ARj_%hAM`N&XRAAwJ468Y3`Yh@2v7mPh z)`5v6f~@g0>Gv_0Zz%o7Zfd{Aen4ZeaNYt(&mS~HWk>Ck*w3zHMLpgB$I*prolo>MGW>$Bv3P4?>eN9Tn>3z;rn*7kFpt0 zli_osS~{Z6%CNRM>Pu2&SO zStwA(5)|q6d(r&@vyA=P-u446F&M6s869Ntrg1;`f_YvJwU4r|Cpv_4(f`?SI&aQx zF{Nh>+Uz%^%d?;D!Ej{}{)Gipu0EFM&4v1%hJbqe*mRNhOVgxuC)j+R(K+2VIJE;m zXcAGQ^l}TRw~tL1X&>#Pqr3n6pg*l;RNb20CnZPAesHwYKz{d8`%X$3^eDPPPVBrH zySSFKk4+b8|JQTTX;(Y7QD@QqXG*jcF`pJ zlvH-qezW~|K`@T$%tQtsn(9DFHX4J4qXG-(9}Q@yr0=&-<^TWy07*qoM6N<$f`>ng AhyVZp literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0002.png b/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..aa201764a42d822eda18a8323f922aff8ada62e7 GIT binary patch literal 1812 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0008.png b/src/platform/python/tests/cinema/gb/window/dk94-split/baseline_0008.png new file mode 100644 index 0000000000000000000000000000000000000000..b654f7bf7cd7ea02b83750d3cc9a6e6a418b9e9e GIT binary patch literal 1818 zcmV+#2j%#QP)0058(0ssI20N3}|000KzNkl z%etc=41lqpPl(GtUzhrd%z`;I_7-Q66EX$&l8n9wBvf6)a zo2uewb@|~>V4^1~nm;AELbWOR*mRX>3PSm)`d8%l>i<%pO^q?0k}}d$dbMALcbm!Y z{dQTFl4_jF$EK(1Mkqg3e*;L>r>_1lIAZKIs&P{_z9IzP=S5K{TtnYe94vGJsNYfO zQcf!tt^W!?T)a1L)Lt~U_TH?7I#G2*4N}v7=5!prS@>0%#hfTd<@y_v1|{ zxRMD#u1fCJcF{qZ8L8O(g5`CdMVOiOJWDgM)3Mv)B~J8IaMa`y<`+sh-&!m5;dzu)T5!)dMUM-P|B5bk7&4{ndd z!OZEYU=pZwOlX;gVtNH@t$SBtXr_;Y?eu=zHu%wjP3K3?m8@`1Uzgu%%hPm4I!mTs zs)X8tI>V-OWqJjxUo#7JhD~S5s+9VCKF4twaDFxng<&2lsN&$1da&s{F_SM<61D?N zR@Jld;VG11Hs1v6(v6V1{W_9}No1+(;p*m9|g9#O$lQ=ypXPpFRg zh=RY6taZ?yy}Evmdiq0mqn)0lQj8)xN8L@qqL_R-)gwI9pEu^Jm~Gog&QYTkO#2X( zC?=CmLZyio#bnY+pnBZ2M!}+(45K|TUTLC5F)4X8aPYx0UNdm; z!Q%Tfh>2#7D403ogP9{fm^osinIj5jj`(2atW96XC_cD5vR}&_@xjay1vBSok_BB? zctTy$XGw>T1$}+6OiVc8)ar*x*XLZeqqLj5iTo1z4)MXv`6}3Z{-7EvIU=7#esU$t z8|n5xj?P?5JUu44rAn(acz8Xd=6o@*yA*bXa^V$J)MqI9si2 zDez@o`Rcj~xqjW(VS9$8QDs^$FcgZ#nP}J+h3(?`@6>?4ncEzEBfOE8$=Tco+v1(w z@XUMuSK&2bmE1MCeAkuTM{@b)BP|&RpWb##2c8^Po8^zZSokXk{OWofX#!~FdqsF( zQN_W9@{?f_G_CL=bfP6aw6D{BGL=VmZiw>)5^8*K>o`&%tsqMSz}YVAACccmqO&D4-j zBMN4YZ=y-|DXHX${A&5%f}kIj$b<(!I+ckMZ^Q>PM-t<8 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/dk94-split/test.mvl b/src/platform/python/tests/cinema/gb/window/dk94-split/test.mvl new file mode 100644 index 0000000000000000000000000000000000000000..fc900d59cce8b914bb11300e79bd5503d02ef5b4 GIT binary patch literal 16050 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 F{~udxOLqVO literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/dk94-split/test.sav b/src/platform/python/tests/cinema/gb/window/dk94-split/test.sav new file mode 100644 index 000000000..e69de29bb diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0000.png b/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..44380a405deb6e49a4324aae20a36f4b7fe61c9c GIT binary patch literal 1951 zcma)-`#Tei0>`PvqPcXnQKwo_vyJdFBQl$7ye<<(h&0wR*Ol=Ot09F|SjLh|R2Z$y zEixQ?&E(!(5)qPH@`_y6+j*Yz<2lbcKYTCG=O6goc5<`^DL@otWMn|LHdvQm`}kLw zz-_-;MzSiAk&(Y*i?zVt$eHJuP$tm35}p}fm!)WBoFwe*k*3w(N=KFQ zJJmTOP@9NSgOu+QY=j?5c=E+iTY8*C4C}(=o$mk8hXK4fFdx9%M!#;A(fRKKaoE5W zH;`YO0mwV13v0Qa=fA=@7bTUe9A=wdLjKpj)wHN79?KwiomTKRSQc9WCf%EVlo;>l z&h}28LWrj0fP8wN2%4UAv_PXeLg_l~vZ6MK`rr^8U?jN2O5tPlvNrb(i8Vi}J7KHN zELn#Z;hj+~p$?&NMtAi2bG>DUn=;~^?ga~FMMrBQn_&r$eNYdP)Q=pMRu zlvp39Ta{fc$0<5_E2Q2#LyKP$@%#$QZQlNI5;qb0kV&xwPN3}Wh>&&eM%KEZ(KsMC z!H-qSyrSfVzN8^kp_ke{D?O(Q4@d;bB^;@K!Lv zlK-P8?)Nzz-uL{a_dJI@tK-I~g}%HKC70Keutn?udG^~u8vx{dX2qh~gk(z^`9`Q_ zn@5DTr@9V^gX6~begjY61KG;Of-lq+pz3X`cm=5GrK(pGK5`4nSwL3$pthhZvKE z`?j9e+6Iwfq<1-10Cgr8df&euMq$l;^O6}}OaL0*OdfyordaG9D*LFzaTxN$S@30Q z>jyZ{Jg!H46BmQYtJWl?Y+|+9WbX_*YX)t^>&-d-;J4!B)tewg=FnVMGTmia>5F1R zb^ww+Fd18wH^!ZP_cXwaY}C&|X&A6es1}}t>~>OrGOZtJ@$xW#c5iSB1b;)k+(2oz ziVR_lbPmt23KL&rP`&KRL@hx18gNnJz;&;aUozKZ)SfWk`_S1rS=WW@3 zHAQX-Rk1M?x={>sTT6HklSOe`T|%OVVVhaCe95MK>>OCo6HGZ6N8Jw7-5*oqwN`m{ z5Sam3>`F65w~idMn>^baQR8((HF12IqIhKQ+&0U*ChXVF7DU!-xje&Tl$YT`)ds|X z7P{v$JP+b(x@3O(L4Iy9aNt^t8Ql_isugpxgV^iL3e~8Qn)yLy58f{N6C5~!61htc z^!Hgx12wGCS;|ASs@OdfN7*cKQ8_WPls%GfwQo&(G}4gRJ+h21ym$K-wfg`?Ss3-dE`rcVjb+i|g#35ZH@#>*OAoNATkQ zWZYk<)Lw%ZLqbzm>%bto5`EwnRbYqMIDC!aEMKFI`>3j?*J2XSHc=Ac`T6}He*ab= zG>z2^N>OQAp$5znUxJB*wrILs5pUzqeVVMB>7vVYcu+gxd1dDWD(t1PNz7htK$RUjk%eNU^9rS za;=0&O8DgAM*Z!}*REP9x~YS_Z&d6ee^$2c>HtNYVPfi~x2&LF`Nx($i!ro9sxI<$AN-iTG&d{y!LgrK;A6`-TVoB=Mv)1?bNIe=mETKS89 zk=!@Y{XVAZd`}JUF>;qpT=B!5nso-p3v|Ef_+L-)uZ8FC94z+(3k*_trb7i(Gwq3o zQ?wIil||p zjGl~O?B5C}1K)^S8Ug)FytX(;EEnTT{~Oqcv#0<7 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0001.png b/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..13171fec784086ad326e2263e64a0de356c1bacc GIT binary patch literal 1945 zcma)-dpy$%1I85{bBST%WGk0AhurEAxs0;h=Q2fN%#q7V%w_H&ipZtcCHIyboU+Yj zjTl=y5wZwnbBWo{tuvZiax2IC|NDO4_mAg!KA-2W=kxsY&2(|HIVyf!Tu4ahsGThW zb&yXE^bmCTz=hb~*g`_07(2v;%dr*9m8KDZz2qh4vsNKZHLDDYNW{Ln9<%D=8A|kf zJtm;*jowOf~4w^Fe`x`ux53O8PHZ}%Bp&%(K5mC|9G+`$5 z4wq|*!~Ms4#WVt%PUg3hZ!$h4FBc2Zp&2u~5i@Kw+t8`)f(S!lTvw*1@Hn8DIt}t? z9|0w)k=H9uI%>i){MHRsw$R2>uTgj}2qS;g1RCp#b*36n!AyazLup6~xAj%wpiV&Z zq15Taw+sXdu$`p!B9*NsTc_vz_M#&VLt}Wf!?ai_G2@kM?BXup%wep*O!~H9YK)Wu zini9y`UL3XmTrtV3@v%V3UW7LoOlt`>MqUd* zcflNcGYrH;dM}i!T^&cF(ws&R2m*odrhsE;f~3@UZU(p@T2*CO!8C+HZgorWQdUA_ z%`9HrQbKRVEqll!<&YOnWSK5h^t56-mwQPL%x&&0U!(KXeW2Y*ni%Q z*rt1FMGJLmKbY&E0LsV3?J^6@Gr7 z6>aH3R!z`6@_kl09V6<<_vm^0c;l^}V*zbzTm~`(UraAL-@B~+dCQ)-5J2t!{Zs-n zs-UBn)|mf-=ZiGb6d;F$%SP^FjMngocp|&&OFp_(g8P*OW)9$7J2pH%j-A$g^sD>I#tTGX8I}8 zHT`<)7)!O#)YdDV@?6e6k6JC{778061U2HRz3jYoDY>@ZJbAz>#7B-f9vc3I5qIbu zps^KY(l=;=r+LeEv>)!fLT5l}^pL*9SA@T)TB~JtUfDx!i2@!4K5JF`WSg zo2?e0bg@^iF&pdHcYS})F*k{>f?*#S1Zg}iMAZ}?qi);w8|R{u1?D+leNO$dL8OF3 zzdCQXvZAcwZbEI~o>K9*PjlT7{b$Ga>O5s`2EHhf+F);2fayuGwOYkf*T$PHA9)V9 z|B&aTcxgP4xLYG@=_4OxGFlD+R ziElFK>v=8hKHS2hyL}9kKH<6Zn0x0LZz{YgG9iNn&tt&zMJQ*xY|EM zS?PU`bnywQ=JE)pzR9khBU5KtTsmD%-zz`0J4=5saK+h8olh5>>uF3-2u*zkVP3uw ziS3EXn^z!9bM%x(cDirZQ_-Kd-qMD*4lbVuj9^yFfh~Cxvk7KrBA7hn$}XU$pe>je z9csDp2Oi^ed5%3JCEZ}kQybnpx2mI!e9M0|{Z_9iU;lVZ85tkwb>po&T297Qe&GzSLAC_Q)b}><> zdq-KV`R(p+)aPdWzD(?WmoOF#g;PYxVOct)a5t^qzkXR)mcYpoK=6(4$7yR%KHkco zZLtJ5^!SZy=gG*k<;97QB4N#wD&GoG!`0o;uF81jCoJU@fI4|~yg573y8)r4`m^qK zp-=DSjtKh2%)ygA|ElZv7aOrZXWe*8BS2?nIO}2@JP1YdT|d>T8Xu}&wb~)C{XtSH zI#K!nB?~qdipUY65|eKYn2-vvFt8f-+}5XKss2u2Hu5Z9f9Xr*Bt}IcCpEqf0*tgg z^^0LZK2?=N{!bA77e4*ZdLYl-MD|2hW8@kdx&-&+RQn4`z~5KF_dF6$a`SSBeY>kM g48=SSUEg?LxOh%`xA{yG;@`-%yX1r*U&N&T1DYATaR2}S literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0002.png b/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..cce64a9531e55cc4fa72641553f1128e751784e3 GIT binary patch literal 1945 zcma)-dpHw{AI3+MJ4u!!w@y*+5;N?`H8CmD#M~xna$Ito>$FY6Y&)D06O}l1(l+F} z5evd==Po)u~?zdDIq~00@&MqgxUD9&`iA9qvnUx)S!GJua4#ocKWP{99nF(ngXyb za>3M1LTa`k;jA16Sn~TvW*m|olbjmDn?So5#<)Th(AhavhDMozV*09%150BcyHX$2 z{|TcBNo`r`K>gSFuDn{O%oDiY%=-g}N_*y$YQ+x_m(pL^ZbluRRF-E&G+!(kTxN_# z#i@k3sIACw^f(p1{WAmoHk?M#3r0#Hw+*KvuxYXRc~Z&<>q*=}ahJ<6W$%8iA|E_g z7SGE9%cTnK&uX*B;!3nO5+M6tFC|-5_t9TRQ$u2|h3$23R^87oYK6JYL9P*A(A#Zo zWof%hKvqxVF#OU}p!r=((h;?#$CTk~>g*t}owAZ^gDUG8FIstMS*tdN;!t*||H?hp z-kXl)t!pXN=76%0m!XZ9zrus2Lqqi^WzEXXJ{ngDB8oer-eMP$wCnB_w`j~d)NQ16 z>|Vpj0FI&#G3VUqsq(lk%NY{|B8@TJzd>l-i_6|(1{Z;&&6gTohCTs$zhR1{Xeis{ zdE=%)i+* zSc&*@Ld>luy*9R|wn4Wbi#Hz0y zj#237PBEvZPYPHCLb|Bzk%r^w)$w#W0C|BL`U*6)U@xJ4$Xv04F0$Jcw}M~Zd!9no zjlazo3HP$@E{X+Y)od9B--vkM`(U9_+9@UF#u&?SwtyP2r4A*0$b&x4wHS4vj68dJ zL(1g3Iv@T8e&h1N>WatKGq5@vsf5n`dTh}f_{J~3E5%QBFndM|!eiSYB0(pB+b-{@ zOI~mBd24oMl*37$PJIfTGn{`9#)oDJ5uV8FaPq zNEUCd;={lNMp3l)p!JU(ZxZI&;c%YJsGQ;M`_xfDEnhWO6v57%)gF)k13G}Y|bDrv`|2!X&l&LWw4GWs+ zmR4@R($wx$?tpy&ADPk0;BBT$6bF^VCKM*l5h21Tbzgjk-Uo*aRbb>o!#UB~l1gd&#po#U~2C_-~D!*3-vERL)j-_jRM1v3BBKvuj zYGr)lIj2{hX7}fypRLz4QM0+0__-m{=jNj_1Px?0SIGFoYa&|!<}_p;jKlqTfbD-R zDVmc^UU>LKDGjYP{;gl9z9nR7YltE4||E-1WOvl|=0+bTs+kse2Erh1HRr2eR``o}&|X@8HNq1GZNuH9ve~57f8eq6 zLH0qk7U067M7@Zp9uW?ez%&L453{Wsv@ZYdt)s+R^@(fvjd0re`yU79##?KUo7qN8 zS6ichg`xjLr+-o3(aTIe3Oz8x9YkMm*p5V!NoY>)2lB1s&^a+6Cz&EK(v?{ytmUsL a;>D-p^G&z^qK=UML9VB}j~m@39QQXN9Jc2G literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0003.png b/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0003.png new file mode 100644 index 0000000000000000000000000000000000000000..cce64a9531e55cc4fa72641553f1128e751784e3 GIT binary patch literal 1945 zcma)-dpHw{AI3+MJ4u!!w@y*+5;N?`H8CmD#M~xna$Ito>$FY6Y&)D06O}l1(l+F} z5evd==Po)u~?zdDIq~00@&MqgxUD9&`iA9qvnUx)S!GJua4#ocKWP{99nF(ngXyb za>3M1LTa`k;jA16Sn~TvW*m|olbjmDn?So5#<)Th(AhavhDMozV*09%150BcyHX$2 z{|TcBNo`r`K>gSFuDn{O%oDiY%=-g}N_*y$YQ+x_m(pL^ZbluRRF-E&G+!(kTxN_# z#i@k3sIACw^f(p1{WAmoHk?M#3r0#Hw+*KvuxYXRc~Z&<>q*=}ahJ<6W$%8iA|E_g z7SGE9%cTnK&uX*B;!3nO5+M6tFC|-5_t9TRQ$u2|h3$23R^87oYK6JYL9P*A(A#Zo zWof%hKvqxVF#OU}p!r=((h;?#$CTk~>g*t}owAZ^gDUG8FIstMS*tdN;!t*||H?hp z-kXl)t!pXN=76%0m!XZ9zrus2Lqqi^WzEXXJ{ngDB8oer-eMP$wCnB_w`j~d)NQ16 z>|Vpj0FI&#G3VUqsq(lk%NY{|B8@TJzd>l-i_6|(1{Z;&&6gTohCTs$zhR1{Xeis{ zdE=%)i+* zSc&*@Ld>luy*9R|wn4Wbi#Hz0y zj#237PBEvZPYPHCLb|Bzk%r^w)$w#W0C|BL`U*6)U@xJ4$Xv04F0$Jcw}M~Zd!9no zjlazo3HP$@E{X+Y)od9B--vkM`(U9_+9@UF#u&?SwtyP2r4A*0$b&x4wHS4vj68dJ zL(1g3Iv@T8e&h1N>WatKGq5@vsf5n`dTh}f_{J~3E5%QBFndM|!eiSYB0(pB+b-{@ zOI~mBd24oMl*37$PJIfTGn{`9#)oDJ5uV8FaPq zNEUCd;={lNMp3l)p!JU(ZxZI&;c%YJsGQ;M`_xfDEnhWO6v57%)gF)k13G}Y|bDrv`|2!X&l&LWw4GWs+ zmR4@R($wx$?tpy&ADPk0;BBT$6bF^VCKM*l5h21Tbzgjk-Uo*aRbb>o!#UB~l1gd&#po#U~2C_-~D!*3-vERL)j-_jRM1v3BBKvuj zYGr)lIj2{hX7}fypRLz4QM0+0__-m{=jNj_1Px?0SIGFoYa&|!<}_p;jKlqTfbD-R zDVmc^UU>LKDGjYP{;gl9z9nR7YltE4||E-1WOvl|=0+bTs+kse2Erh1HRr2eR``o}&|X@8HNq1GZNuH9ve~57f8eq6 zLH0qk7U067M7@Zp9uW?ez%&L453{Wsv@ZYdt)s+R^@(fvjd0re`yU79##?KUo7qN8 zS6ichg`xjLr+-o3(aTIe3Oz8x9YkMm*p5V!NoY>)2lB1s&^a+6Cz&EK(v?{ytmUsL a;>D-p^G&z^qK=UML9VB}j~m@39QQXN9Jc2G literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0004.png b/src/platform/python/tests/cinema/gb/window/gsc-battle/baseline_0004.png new file mode 100644 index 0000000000000000000000000000000000000000..cce64a9531e55cc4fa72641553f1128e751784e3 GIT binary patch literal 1945 zcma)-dpHw{AI3+MJ4u!!w@y*+5;N?`H8CmD#M~xna$Ito>$FY6Y&)D06O}l1(l+F} z5evd==Po)u~?zdDIq~00@&MqgxUD9&`iA9qvnUx)S!GJua4#ocKWP{99nF(ngXyb za>3M1LTa`k;jA16Sn~TvW*m|olbjmDn?So5#<)Th(AhavhDMozV*09%150BcyHX$2 z{|TcBNo`r`K>gSFuDn{O%oDiY%=-g}N_*y$YQ+x_m(pL^ZbluRRF-E&G+!(kTxN_# z#i@k3sIACw^f(p1{WAmoHk?M#3r0#Hw+*KvuxYXRc~Z&<>q*=}ahJ<6W$%8iA|E_g z7SGE9%cTnK&uX*B;!3nO5+M6tFC|-5_t9TRQ$u2|h3$23R^87oYK6JYL9P*A(A#Zo zWof%hKvqxVF#OU}p!r=((h;?#$CTk~>g*t}owAZ^gDUG8FIstMS*tdN;!t*||H?hp z-kXl)t!pXN=76%0m!XZ9zrus2Lqqi^WzEXXJ{ngDB8oer-eMP$wCnB_w`j~d)NQ16 z>|Vpj0FI&#G3VUqsq(lk%NY{|B8@TJzd>l-i_6|(1{Z;&&6gTohCTs$zhR1{Xeis{ zdE=%)i+* zSc&*@Ld>luy*9R|wn4Wbi#Hz0y zj#237PBEvZPYPHCLb|Bzk%r^w)$w#W0C|BL`U*6)U@xJ4$Xv04F0$Jcw}M~Zd!9no zjlazo3HP$@E{X+Y)od9B--vkM`(U9_+9@UF#u&?SwtyP2r4A*0$b&x4wHS4vj68dJ zL(1g3Iv@T8e&h1N>WatKGq5@vsf5n`dTh}f_{J~3E5%QBFndM|!eiSYB0(pB+b-{@ zOI~mBd24oMl*37$PJIfTGn{`9#)oDJ5uV8FaPq zNEUCd;={lNMp3l)p!JU(ZxZI&;c%YJsGQ;M`_xfDEnhWO6v57%)gF)k13G}Y|bDrv`|2!X&l&LWw4GWs+ zmR4@R($wx$?tpy&ADPk0;BBT$6bF^VCKM*l5h21Tbzgjk-Uo*aRbb>o!#UB~l1gd&#po#U~2C_-~D!*3-vERL)j-_jRM1v3BBKvuj zYGr)lIj2{hX7}fypRLz4QM0+0__-m{=jNj_1Px?0SIGFoYa&|!<}_p;jKlqTfbD-R zDVmc^UU>LKDGjYP{;gl9z9nR7YltE4||E-1WOvl|=0+bTs+kse2Erh1HRr2eR``o}&|X@8HNq1GZNuH9ve~57f8eq6 zLH0qk7U067M7@Zp9uW?ez%&L453{Wsv@ZYdt)s+R^@(fvjd0re`yU79##?KUo7qN8 zS6ichg`xjLr+-o3(aTIe3Oz8x9YkMm*p5V!NoY>)2lB1s&^a+6Cz&EK(v?{ytmUsL a;>D-p^G&z^qK=UML9VB}j~m@39QQXN9Jc2G literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/manifest.yml b/src/platform/python/tests/cinema/gb/window/gsc-battle/manifest.yml new file mode 100644 index 000000000..a697ada66 --- /dev/null +++ b/src/platform/python/tests/cinema/gb/window/gsc-battle/manifest.yml @@ -0,0 +1 @@ +fail: true diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/test.mvl b/src/platform/python/tests/cinema/gb/window/gsc-battle/test.mvl new file mode 100644 index 0000000000000000000000000000000000000000..ca2a2efded898f3671eea203e7fc6007d3991b8d GIT binary patch literal 12853 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 Q?Y%YA5BQHGf?MYQ0E$%mJ^%m! literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/gsc-battle/test.sav b/src/platform/python/tests/cinema/gb/window/gsc-battle/test.sav new file mode 100644 index 000000000..e69de29bb diff --git a/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0000.png b/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc5ca11fc57828c0f1f6f945219e5d299493f6a GIT binary patch literal 4367 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 P`{+Z7A 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 DN#~aa literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0004.png b/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0004.png new file mode 100644 index 0000000000000000000000000000000000000000..41dbf8912c95abd75b9a05d485029a0e641e2aa9 GIT binary patch literal 4501 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 DN#~aa literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0005.png b/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0005.png new file mode 100644 index 0000000000000000000000000000000000000000..41dbf8912c95abd75b9a05d485029a0e641e2aa9 GIT binary patch literal 4501 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 DN#~aa literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0006.png b/src/platform/python/tests/cinema/gb/window/zoos-intro/baseline_0006.png new file mode 100644 index 0000000000000000000000000000000000000000..41dbf8912c95abd75b9a05d485029a0e641e2aa9 GIT binary patch literal 4501 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 DN#~aa literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/zoos-intro/test.mvl b/src/platform/python/tests/cinema/gb/window/zoos-intro/test.mvl new file mode 100644 index 0000000000000000000000000000000000000000..a9fd102ea9b8b331e3279ba776865c48e5da3e1d GIT binary patch literal 12321 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 XBYGE&^%Q@f)KOd2`(K}w?u7pXaC#x; literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gb/window/zoos-intro/test.sav b/src/platform/python/tests/cinema/gb/window/zoos-intro/test.sav new file mode 100644 index 000000000..e69de29bb diff --git a/src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0000.png b/src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..53ffb604ec59ed1cb65be5cf316813cd9c17c9e6 GIT binary patch literal 15422 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0001.png b/src/platform/python/tests/cinema/gba/bg/lady-sia/baseline_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..f7cc5129983d07ca531c9680ecf504f05b91bc8f GIT binary patch literal 15430 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 FV1fYvJr4i? literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/bg/lady-sia/test.mvl b/src/platform/python/tests/cinema/gba/bg/lady-sia/test.mvl new file mode 100644 index 0000000000000000000000000000000000000000..214133dd2da8437527bd6556b87c4526115eb44b GIT binary patch literal 64811 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0000.png b/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7d73b3f29aaba1495504ef21bafa92891ca876 GIT binary patch literal 11517 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 XZ(C+;e%4!`Fd!$b^rc41e?u4Hh1Lo5c{ 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 rtL?1|LT)Y1ZXsUtn*V>`>0e%40Z~qOj@<_w82A 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 W57J+q*}g9<1EeJs#LGpE0{;hUn6zI2 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0004.png b/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0004.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a061914889149446f79cdf67c77c961dba78da GIT binary patch literal 11456 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0005.png b/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0005.png new file mode 100644 index 0000000000000000000000000000000000000000..51164359098d053f27230fbb2752754597cf6937 GIT binary patch literal 11403 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0006.png b/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0006.png new file mode 100644 index 0000000000000000000000000000000000000000..b93c95d6fdbe11ad92d154f0df999dbb00cee5a9 GIT binary patch literal 11416 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ξ}#rs&J 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0008.png b/src/platform/python/tests/cinema/gba/blend/mzm-layering/baseline_0008.png new file mode 100644 index 0000000000000000000000000000000000000000..403730bb67be58c1b5937e028e551e1fc179bc9e GIT binary patch literal 11359 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%0DQ^ckwZ8)2g*VidZQPrU(S8h+s+Al^_kO+B!Mb4 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⋙ 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/blend/sma-knockout/test.mvl b/src/platform/python/tests/cinema/gba/blend/sma-knockout/test.mvl new file mode 100644 index 0000000000000000000000000000000000000000..6186b2761b4286b859d29e371a88f69a631ccaf6 GIT binary patch literal 29818 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 literal 0 HcmV?d00001 diff --git a/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0000.png b/src/platform/python/tests/cinema/gba/window/gs-clock-wipe/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..73240485954aa5ee23b6220f1f37b8984a1ad0f4 GIT binary patch literal 17681 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