From 6010bffe5de21a0cd9b23587432cf168b79c599d Mon Sep 17 00:00:00 2001 From: byuu Date: Thu, 27 Jul 2006 23:56:42 +0000 Subject: [PATCH] Update to bsnes v016r38 release. Ok, this WIP rewrites the input code and modifies the PAL clock speed. Fairly major changes. Ideally, this will wipe out four bugs without causing any new ones since wip37. Bug fixes : Earthworm Jim 2 (E) - adjusted PAL CPU clock speed. Please test for *new* sound problems in PAL games La Wares (J) + Galivan 2 (J) - no longer return 0 when auto joypad is off for polling $4218-$421f Super Conflict (J) - added anomie's new OAM RTO findings to fix title screen The input code was almost completely rewritten to simulate real hardware more. As such, it's very possible there are new input bugs. Ok, so then byuu.cinnamonpirate.com/files/bsnes_v016_wip38.zip Please only download if you intend to test games and report feedback. This version is slower than normal, lacks ZIP+JMA loading, and has the debugger enabled (that is only useful to me, it lacks a functional user interface) which slows down emulation even more. eg you're better off with v0.016 official if you just want to run games. As always, please don't post this link anywhere else, or I will be forced to remove the file to conserve bandwidth. If anyone posts bugs that hasn't tested against wip37, can I please have someone with wip37 verify/deny the bug presence in wip37 as well as in 016 official? wip37 isn't on my website because I don't have a lot of web space to spare. Thank you to everyone in advance for helping. --- bsnes.exe | Bin 1142784 -> 925696 bytes cart.db | Bin 0 -> 1212 bytes src/apu/apuregs.h | 5 +- src/apu/sapu/core/core.cpp | 6 - src/apu/sapu/core/opfn.cpp | 44 +- src/apu/sapu/memory/memory.cpp | 16 +- src/base.h | 35 +- src/cart/cart.cpp | 262 ++- src/cart/cart.h | 42 +- src/cart/database.cpp | 37 + src/cart/db/cart.db | Bin 0 -> 1212 bytes src/cart/db/cartdb.txt | 41 + src/cart/db/cc.bat | 3 + src/cart/db/clean.bat | 1 + src/cart/db/create.bat | 2 + src/cart/db/db.h | 47 + src/cart/db/dbcreate.cpp | 117 ++ src/cart/db/dbcreate.exe | Bin 0 -> 77824 bytes src/cheat/cheat.cpp | 14 +- src/cheat/cheat.h | 4 +- src/chip/dsp1/_dsp1emu.cpp | 1617 ----------------- src/chip/dsp1/_dsp1emu.h | 126 -- src/chip/dsp1/dsp1.cpp | 2 +- src/chip/dsp1/dsp1emu.cpp | 8 +- src/cpu/bcpu/bcpu.cpp | 38 +- src/cpu/bcpu/bcpu.h | 2 - src/cpu/bcpu/bcpu_exec.cpp | 12 +- src/cpu/bcpu/bcpu_int.cpp | 69 +- src/cpu/bcpu/core/core.cpp | 62 - src/cpu/bcpu/core/core.h | 12 - src/cpu/bcpu/core/op_misc.b | 66 +- src/cpu/bcpu/core/op_misc.cpp | 118 +- src/cpu/bcpu/core/op_pc.b | 94 +- src/cpu/bcpu/core/op_pc.cpp | 108 +- src/cpu/bcpu/core/op_read.b | 140 +- src/cpu/bcpu/core/op_read.cpp | 1042 +++++------ src/cpu/bcpu/core/op_rmw.b | 44 +- src/cpu/bcpu/core/op_rmw.cpp | 308 ++-- src/cpu/bcpu/core/op_write.b | 132 +- src/cpu/bcpu/core/op_write.cpp | 194 +- src/cpu/bcpu/dma/dma.cpp | 4 +- src/cpu/bcpu/memory/memory.h | 20 + src/cpu/bcpu/timing/timing.cpp | 168 +- src/cpu/bcpu/timing/timing.h | 4 +- src/cpu/cpuregs.h | 18 +- src/cpu/scpu/core/core.cpp | 19 +- src/cpu/scpu/core/core.h | 2 +- src/cpu/scpu/core/op_misc.b | 78 +- src/cpu/scpu/core/op_misc.cpp | 136 +- src/cpu/scpu/core/op_pc.b | 15 +- src/cpu/scpu/core/op_pc.cpp | 15 +- src/cpu/scpu/core/op_read.b | 244 +-- src/cpu/scpu/core/op_read.cpp | 504 ++--- src/cpu/scpu/core/op_rmw.b | 68 +- src/cpu/scpu/core/op_rmw.cpp | 180 +- src/cpu/scpu/core/op_write.b | 70 +- src/cpu/scpu/core/op_write.cpp | 96 +- src/cpu/scpu/core/opfn.cpp | 92 +- src/cpu/scpu/dma/dma.cpp | 22 +- src/cpu/scpu/dma/dma.h | 1 + src/cpu/scpu/memory/memory.cpp | 5 +- src/cpu/scpu/mmio/mmio.cpp | 162 +- src/cpu/scpu/mmio/mmio.h | 5 + src/cpu/scpu/scpu.cpp | 10 +- src/cpu/scpu/scpu.h | 11 +- src/cpu/scpu/timing/irq.cpp | 6 + src/cpu/scpu/timing/joypad.cpp | 71 + src/cpu/scpu/timing/timing.cpp | 53 +- src/cpu/scpu/timing/timing.h | 9 +- src/lib/libbase.h | 20 +- src/lib/libbpf.cpp | 625 ------- src/lib/libbpf.h | 104 -- src/lib/libco_x86.h | 16 +- src/lib/libconfig.h | 20 +- src/lib/libfile.cpp | 49 + src/lib/libfile.h | 334 ++++ src/lib/libkeymap.h | 129 ++ src/lib/libstring.cpp | 17 + src/lib/libstring.h | 18 +- src/lib/libstring_math.cpp | 282 ++- src/lib/libvector.h | 40 +- src/memory/bmemory/bmemory.cpp | 109 +- src/memory/bmemory/bmemory.h | 2 + src/memory/bmemory/bmemory_mapper_generic.cpp | 44 +- src/memory/bmemory/bmemory_rw.cpp | 4 +- src/memory/bmemory/mapper/mapper.cpp | 56 + src/memory/bmemory/mapper/mapper.h | 21 + src/memory/bmemory/mapper/mapper_pcb.cpp | 95 + src/ppu/bppu/bppu.cpp | 30 +- src/ppu/bppu/bppu.h | 4 +- src/ppu/bppu/bppu_mmio.cpp | 169 +- src/ppu/bppu/bppu_render.cpp | 16 +- src/ppu/bppu/bppu_render.h | 1 + src/ppu/bppu/bppu_render_bg.cpp | 72 +- src/ppu/bppu/bppu_render_cache.cpp | 91 +- src/ppu/bppu/bppu_render_mode7.cpp | 16 +- src/ppu/bppu/bppu_render_oam.cpp | 17 +- src/snes/audio/audio.cpp | 1 + src/snes/snes.cpp | 66 +- src/ui/Makefile | 198 ++ src/{win => ui}/audio/audio.h | 8 +- src/{win => ui}/audio/dsound.cpp | 8 +- src/{win => ui}/audio/dsound.h | 4 +- src/{win => ui}/bsnes.cpp | 0 src/{win => ui}/bsnes.h | 0 src/{win => ui}/bsnes.lnk | Bin src/{win => ui}/bsnes.rc | 0 src/{win => ui}/cc.bat | 2 +- src/ui/clean.bat | 1 + src/{win => ui}/config.cpp | 24 - src/{win => ui}/input/dinput.cpp | 0 src/{win => ui}/input/dinput.h | 0 src/{win => ui}/input/dinput_keymap.cpp | 0 src/{win => ui}/input/input.cpp | 0 src/{win => ui}/input/input.h | 4 +- src/ui/main.cpp | 66 + src/{win => ui}/video/d3d.cpp | 0 src/{win => ui}/video/d3d.h | 0 src/{win => ui}/video/ddraw.cpp | 0 src/{win => ui}/video/ddraw.h | 0 src/{win => ui}/video/video.cpp | 0 src/{win => ui}/video/video.h | 5 +- src/ui/win/config.cpp | 25 + src/{ => ui}/win/debugger/debugger.cpp | 0 src/{ => ui}/win/debugger/debugger.h | 0 src/{ => ui}/win/debugger/ui_debugger.cpp | 0 src/{ => ui}/win/debugger/ui_debugger.h | 0 src/{ => ui}/win/debugger/ui_memory.cpp | 0 src/{ => ui}/win/debugger/ui_memory.h | 0 src/{ => ui}/win/event.cpp | 0 src/{ => ui}/win/event.h | 0 src/{ => ui}/win/main.cpp | 54 +- src/{ => ui}/win/settings/settings.cpp | 0 src/{ => ui}/win/settings/settings.h | 0 src/{ => ui}/win/settings/ui_cheateditor.cpp | 0 src/{ => ui}/win/settings/ui_cheateditor.h | 0 src/{ => ui}/win/settings/ui_coloradjust.cpp | 0 src/{ => ui}/win/settings/ui_coloradjust.h | 0 src/{ => ui}/win/settings/ui_inputconfig.cpp | 0 src/{ => ui}/win/settings/ui_inputconfig.h | 0 .../win/settings/ui_rastersettings.cpp | 0 src/{ => ui}/win/settings/ui_rastersettings.h | 0 src/{ => ui}/win/settings/ui_settings.cpp | 0 src/{ => ui}/win/settings/ui_settings.h | 0 .../win/settings/ui_videosettings.cpp | 0 src/{ => ui}/win/settings/ui_videosettings.h | 0 src/{ => ui}/win/ui.cpp | 7 - src/{ => ui}/win/ui.h | 7 - src/{ => ui}/win/ui_about.cpp | 0 src/{ => ui}/win/ui_main.cpp | 0 src/win/Makefile | 157 -- src/win/clean.bat | 1 - 152 files changed, 4239 insertions(+), 5758 deletions(-) create mode 100644 cart.db create mode 100644 src/cart/database.cpp create mode 100644 src/cart/db/cart.db create mode 100644 src/cart/db/cartdb.txt create mode 100644 src/cart/db/cc.bat create mode 100644 src/cart/db/clean.bat create mode 100644 src/cart/db/create.bat create mode 100644 src/cart/db/db.h create mode 100644 src/cart/db/dbcreate.cpp create mode 100644 src/cart/db/dbcreate.exe delete mode 100644 src/chip/dsp1/_dsp1emu.cpp delete mode 100644 src/chip/dsp1/_dsp1emu.h create mode 100644 src/cpu/scpu/timing/joypad.cpp delete mode 100644 src/lib/libbpf.cpp delete mode 100644 src/lib/libbpf.h create mode 100644 src/lib/libfile.cpp create mode 100644 src/lib/libfile.h create mode 100644 src/lib/libkeymap.h create mode 100644 src/memory/bmemory/mapper/mapper.cpp create mode 100644 src/memory/bmemory/mapper/mapper.h create mode 100644 src/memory/bmemory/mapper/mapper_pcb.cpp create mode 100644 src/ui/Makefile rename src/{win => ui}/audio/audio.h (63%) rename src/{win => ui}/audio/dsound.cpp (91%) rename src/{win => ui}/audio/dsound.h (84%) rename src/{win => ui}/bsnes.cpp (100%) rename src/{win => ui}/bsnes.h (100%) rename src/{win => ui}/bsnes.lnk (100%) rename src/{win => ui}/bsnes.rc (100%) rename src/{win => ui}/cc.bat (50%) create mode 100644 src/ui/clean.bat rename src/{win => ui}/config.cpp (87%) rename src/{win => ui}/input/dinput.cpp (100%) rename src/{win => ui}/input/dinput.h (100%) rename src/{win => ui}/input/dinput_keymap.cpp (100%) rename src/{win => ui}/input/input.cpp (100%) rename src/{win => ui}/input/input.h (94%) create mode 100644 src/ui/main.cpp rename src/{win => ui}/video/d3d.cpp (100%) rename src/{win => ui}/video/d3d.h (100%) rename src/{win => ui}/video/ddraw.cpp (100%) rename src/{win => ui}/video/ddraw.h (100%) rename src/{win => ui}/video/video.cpp (100%) rename src/{win => ui}/video/video.h (92%) create mode 100644 src/ui/win/config.cpp rename src/{ => ui}/win/debugger/debugger.cpp (100%) rename src/{ => ui}/win/debugger/debugger.h (100%) rename src/{ => ui}/win/debugger/ui_debugger.cpp (100%) rename src/{ => ui}/win/debugger/ui_debugger.h (100%) rename src/{ => ui}/win/debugger/ui_memory.cpp (100%) rename src/{ => ui}/win/debugger/ui_memory.h (100%) rename src/{ => ui}/win/event.cpp (100%) rename src/{ => ui}/win/event.h (100%) rename src/{ => ui}/win/main.cpp (69%) rename src/{ => ui}/win/settings/settings.cpp (100%) rename src/{ => ui}/win/settings/settings.h (100%) rename src/{ => ui}/win/settings/ui_cheateditor.cpp (100%) rename src/{ => ui}/win/settings/ui_cheateditor.h (100%) rename src/{ => ui}/win/settings/ui_coloradjust.cpp (100%) rename src/{ => ui}/win/settings/ui_coloradjust.h (100%) rename src/{ => ui}/win/settings/ui_inputconfig.cpp (100%) rename src/{ => ui}/win/settings/ui_inputconfig.h (100%) rename src/{ => ui}/win/settings/ui_rastersettings.cpp (100%) rename src/{ => ui}/win/settings/ui_rastersettings.h (100%) rename src/{ => ui}/win/settings/ui_settings.cpp (100%) rename src/{ => ui}/win/settings/ui_settings.h (100%) rename src/{ => ui}/win/settings/ui_videosettings.cpp (100%) rename src/{ => ui}/win/settings/ui_videosettings.h (100%) rename src/{ => ui}/win/ui.cpp (88%) rename src/{ => ui}/win/ui.h (90%) rename src/{ => ui}/win/ui_about.cpp (100%) rename src/{ => ui}/win/ui_main.cpp (100%) delete mode 100644 src/win/Makefile delete mode 100644 src/win/clean.bat diff --git a/bsnes.exe b/bsnes.exe index 8298aff1b7108e3ffcbe7f3843f4224879989b09..cf6174a66d30947975c44e00b38c0d1a7e9b0b6a 100644 GIT binary patch delta 326805 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%0D8RF9gldUi@$J3$(_mD@FFv}IjSobnJ$-x+4 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 delta 605029 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%0AsF&|*M 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 XBc3km^})q(30w+;_ZIaIIsCvsaSk6` diff --git a/cart.db b/cart.db new file mode 100644 index 0000000000000000000000000000000000000000..86d773f1a674e4920af4e834012bc7148e689389 GIT binary patch literal 1212 zcmWIca}9QJTEoD6{cV*?YLS9ZVqSVtW^pl)so|AakeH{b5Um)?Ko=0~5$3FG=xFS# zYixksLInl}AUgBzrzsA%YJ?f;8ERtJOjS{0-70x{uO!f|NtFu0C5bsXnfZAN>Xv5o z4O^#RP_UZ%>KYj02m@enH!v{d2DMBJ%Fj*AOU}$oR|rmYPlUS@60USe3b1f>(ls=~ z?pOhE8fZ$6P7exjR|qLC%`Pn}RWO1%6}u*yh(f~E98b6^0PSUDa4Xs$7o1<3m!ja8 zUzVB!cQZXR7~HLfII c; }; - APURegFlags() { data = 0; } - inline operator unsigned() { return data; } + inline operator unsigned() const { return data; } inline unsigned operator = (const uint8 i) { data = i; return data; } inline unsigned operator |= (const uint8 i) { data |= i; return data; } inline unsigned operator ^= (const uint8 i) { data ^= i; return data; } inline unsigned operator &= (const uint8 i) { data &= i; return data; } + + APURegFlags() : data(0) {} }; class APURegs { diff --git a/src/apu/sapu/core/core.cpp b/src/apu/sapu/core/core.cpp index 8ab44f1b..084ba535 100644 --- a/src/apu/sapu/core/core.cpp +++ b/src/apu/sapu/core/core.cpp @@ -1,15 +1,9 @@ #include "opfn.cpp" -//#include "op_mov.cpp" -//#include "op_pc.cpp" -//#include "op_read.cpp" -//#include "op_rmw.cpp" -//#include "op_misc.cpp" void sAPU::main() { for(;;) { status.in_opcode = true; -// (this->*optbl[op_readpc()])(); switch(op_readpc()) { #include "op_mov.cpp" #include "op_pc.cpp" diff --git a/src/apu/sapu/core/opfn.cpp b/src/apu/sapu/core/opfn.cpp index abe7c0a7..80837c8c 100644 --- a/src/apu/sapu/core/opfn.cpp +++ b/src/apu/sapu/core/opfn.cpp @@ -1,8 +1,8 @@ uint8 sAPU::op_adc(uint8 x, uint8 y) { int16 r = x + y + regs.p.c; - regs.p.n = !!(r & 0x80); - regs.p.v = !!(~(x ^ y) & (y ^ (uint8)r) & 0x80); - regs.p.h = !!((x ^ y ^ (uint8)r) & 0x10); + regs.p.n = bool(r & 0x80); + regs.p.v = bool(~(x ^ y) & (y ^ (uint8)r) & 0x80); + regs.p.h = bool((x ^ y ^ (uint8)r) & 0x10); regs.p.z = ((uint8)r == 0); regs.p.c = (r > 0xff); return r; @@ -19,14 +19,14 @@ int16 r; uint8 sAPU::op_and(uint8 x, uint8 y) { x &= y; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint8 sAPU::op_cmp(uint8 x, uint8 y) { int16 r = x - y; - regs.p.n = !!(r & 0x80); + regs.p.n = bool(r & 0x80); regs.p.z = ((uint8)r == 0); regs.p.c = (r >= 0); return x; @@ -34,7 +34,7 @@ int16 r = x - y; uint16 sAPU::op_cmpw(uint16 x, uint16 y) { int32 r = x - y; - regs.p.n = !!(r & 0x8000); + regs.p.n = bool(r & 0x8000); regs.p.z = ((uint16)r == 0); regs.p.c = (r >= 0); return x; @@ -42,22 +42,22 @@ int32 r = x - y; uint8 sAPU::op_eor(uint8 x, uint8 y) { x ^= y; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint8 sAPU::op_or(uint8 x, uint8 y) { x |= y; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint8 sAPU::op_sbc(uint8 x, uint8 y) { int16 r = x - y - !regs.p.c; - regs.p.n = !!(r & 0x80); - regs.p.v = !!((x ^ y) & (x ^ (uint8)r) & 0x80); + regs.p.n = bool(r & 0x80); + regs.p.v = bool((x ^ y) & (x ^ (uint8)r) & 0x80); regs.p.h = !((x ^ y ^ (uint8)r) & 0x10); regs.p.z = ((uint8)r == 0); regs.p.c = (r >= 0); @@ -75,64 +75,64 @@ int16 r; uint8 sAPU::op_inc(uint8 x) { x++; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint16 sAPU::op_incw(uint16 x) { x++; - regs.p.n = !!(x & 0x8000); + regs.p.n = bool(x & 0x8000); regs.p.z = (x == 0); return x; } uint8 sAPU::op_dec(uint8 x) { x--; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint16 sAPU::op_decw(uint16 x) { x--; - regs.p.n = !!(x & 0x8000); + regs.p.n = bool(x & 0x8000); regs.p.z = (x == 0); return x; } uint8 sAPU::op_asl(uint8 x) { - regs.p.c = !!(x & 0x80); + regs.p.c = bool(x & 0x80); x <<= 1; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint8 sAPU::op_lsr(uint8 x) { - regs.p.c = !!(x & 0x01); + regs.p.c = bool(x & 0x01); x >>= 1; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint8 sAPU::op_rol(uint8 x) { uint8 c = regs.p.c; - regs.p.c = !!(x & 0x80); + regs.p.c = bool(x & 0x80); x <<= 1; x |= c; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } uint8 sAPU::op_ror(uint8 x) { uint8 c = (regs.p.c)?0x80:0x00; - regs.p.c = !!(x & 0x01); + regs.p.c = bool(x & 0x01); x >>= 1; x |= c; - regs.p.n = !!(x & 0x80); + regs.p.n = bool(x & 0x80); regs.p.z = (x == 0); return x; } diff --git a/src/apu/sapu/memory/memory.cpp b/src/apu/sapu/memory/memory.cpp index e1e6a019..cafa7113 100644 --- a/src/apu/sapu/memory/memory.cpp +++ b/src/apu/sapu/memory/memory.cpp @@ -2,6 +2,11 @@ uint8 sAPU::spcram_read(uint16 addr) { uint8 r; if((addr & 0xfff0) == 0x00f0) { //addr >= 0x00f0 && addr <= 0x00ff + + #ifdef FAVOR_SPEED + co_return(); + #endif + switch(addr) { case 0xf0: //TEST -- operation unknown, supposedly returns 0x00 r = 0x00; @@ -20,9 +25,6 @@ uint8 r; case 0xf5: //CPUIO1 case 0xf6: //CPUIO2 case 0xf7: //CPUIO3 - #ifdef FAVOR_SPEED - co_return(); - #endif r = r_cpu->port_read(addr & 3); break; case 0xf8: //??? @@ -66,6 +68,11 @@ uint8 r; void sAPU::spcram_write(uint16 addr, uint8 data) { if((addr & 0xfff0) == 0x00f0) { //addr >= 0x00f0 && addr >= 0x00ff + + #ifdef FAVOR_SPEED + co_return(); + #endif + switch(addr) { case 0xf0: //TEST -- operation unknown break; @@ -115,9 +122,6 @@ void sAPU::spcram_write(uint16 addr, uint8 data) { case 0xf5: //CPUIO1 case 0xf6: //CPUIO2 case 0xf7: //CPUIO3 - #ifdef FAVOR_SPEED - co_return(); - #endif port_write(addr & 3, data); break; case 0xf8: //??? diff --git a/src/base.h b/src/base.h index 50d2e473..44ec33cf 100644 --- a/src/base.h +++ b/src/base.h @@ -1,4 +1,4 @@ -#define BSNES_VERSION "0.016.27a" +#define BSNES_VERSION "0.016.38" #define BSNES_TITLE "bsnes v" BSNES_VERSION #define MEMCORE bMemBus @@ -14,44 +14,33 @@ #define CHEAT_SYSTEM //enable GZ, ZIP format support -#define GZIP_SUPPORT +//#define GZIP_SUPPORT //enable JMA support -#define JMA_SUPPORT +//#define JMA_SUPPORT //debugging extensions (~10% speed hit) -//#define DEBUGGER +#define DEBUGGER //snes core polymorphism //(allow mem/cpu/apu/ppu overriding, ~10% speed hit) //#define POLYMORPHISM -//this should be declared in the port-specific makefile -//#define ARCH_LSB -//#define ARCH_MSB - -#ifndef ARCH_LSB - #ifndef ARCH_MSB - #define ARCH_LSB - #endif -#endif - -#if defined(_WIN32) - #define _WIN32_ - #undef _UNIX_ -#elif defined(__GNUC__) - #define _UNIX_ - #undef _WIN32_ +#if defined(PROCESSOR_X86) + #define ARCH_LSB +#elif defined(PROCESSOR_X86) + #define ARCH_LSB +#elif defined(PROCESSOR_G5) + #define ARCH_MSB #else - #error "unknown architecture" + #error "unsupported processor" #endif -#include "lib/libco_x86.h" #include "lib/libbase.h" +#include "lib/libco_x86.h" #include "lib/libvector.h" #include "lib/libstring.h" #include "lib/libconfig.h" -#include "lib/libbpf.h" inline uint16 read16(uint8 *addr, uint pos) { #ifdef ARCH_LSB diff --git a/src/cart/cart.cpp b/src/cart/cart.cpp index f8f5d7ad..70c2177f 100644 --- a/src/cart/cart.cpp +++ b/src/cart/cart.cpp @@ -1,87 +1,112 @@ #include "../base.h" +#include "database.cpp" + +void Cartridge::read_dbi() { + info.srtc = false; + info.sdd1 = false; + info.c4 = false; + info.dsp1 = false; + info.dsp2 = false; + info.obc1 = false; + + info.dsp1_mapper = 0; + + info.header_index = 0x7fc0; + info.mapper = PCB; + strcpy(info.name, dbi.name); + strcpy(info.pcb, dbi.pcb); + info.region = NTSC; + info.cart_mmio = false; + + info.rom_size = dbi.rom; + info.ram_size = dbi.ram; +} void Cartridge::read_header() { - cart.srtc = false; - cart.sdd1 = false; - cart.c4 = false; - cart.dsp1 = false; - cart.dsp2 = false; - cart.obc1 = false; + info.srtc = false; + info.sdd1 = false; + info.c4 = false; + info.dsp1 = false; + info.dsp2 = false; + info.obc1 = false; - cart.dsp1_mapper = 0; + info.dsp1_mapper = 0; - if(cart.header_index == 0x7fc0 && cart.rom_size >= 0x401000) { - cart.mapper = EXLOROM; - } else if(cart.header_index == 0x7fc0 && rom[cart.header_index + MAPPER] == 0x32) { - cart.mapper = EXLOROM; - } else if(cart.header_index == 0x7fc0) { - cart.mapper = LOROM; - } else if(cart.header_index == 0xffc0) { - cart.mapper = HIROM; - } else { //cart.header_index == 0x40ffc0 - cart.mapper = EXHIROM; + if(info.header_index == 0x7fc0 && info.rom_size >= 0x401000) { + info.mapper = EXLOROM; + strcpy(info.pcb, "UNL-EXLOROM"); + } else if(info.header_index == 0x7fc0 && rom[info.header_index + MAPPER] == 0x32) { + info.mapper = EXLOROM; + strcpy(info.pcb, "UNL-EXLOROM"); + } else if(info.header_index == 0x7fc0) { + info.mapper = LOROM; + strcpy(info.pcb, "UNL-LOROM"); + } else if(info.header_index == 0xffc0) { + info.mapper = HIROM; + strcpy(info.pcb, "UNL-HIROM"); + } else { //info.header_index == 0x40ffc0 + info.mapper = EXHIROM; + strcpy(info.pcb, "UNL-EXHIROM"); } -uint8 mapper = rom[cart.header_index + MAPPER]; -uint8 rom_type = rom[cart.header_index + ROM_TYPE]; +uint8 mapper = rom[info.header_index + MAPPER]; +uint8 rom_type = rom[info.header_index + ROM_TYPE]; if(mapper == 0x35 && rom_type == 0x55) { - cart.srtc = true; + info.srtc = true; } if(mapper == 0x32 && (rom_type == 0x43 || rom_type == 0x45)) { - cart.sdd1 = true; + info.sdd1 = true; } if(mapper == 0x20 && rom_type == 0xf3) { - cart.c4 = true; + info.c4 = true; } if((mapper == 0x20 || mapper == 0x21) && rom_type == 0x03) { - cart.dsp1 = true; + info.dsp1 = true; } if(mapper == 0x30 && rom_type == 0x05) { - cart.dsp1 = true; + info.dsp1 = true; } if(mapper == 0x31 && (rom_type == 0x03 || rom_type == 0x05)) { - cart.dsp1 = true; + info.dsp1 = true; } - if(cart.dsp1 == true) { - if((mapper & 0x2f) == 0x20 && rom_size <= 0x100000) { - cart.dsp1_mapper = DSP1_LOROM_1MB; + if(info.dsp1 == true) { + if((mapper & 0x2f) == 0x20 && info.rom_size <= 0x100000) { + info.dsp1_mapper = DSP1_LOROM_1MB; } else if((mapper & 0x2f) == 0x20) { - cart.dsp1_mapper = DSP1_LOROM_2MB; + info.dsp1_mapper = DSP1_LOROM_2MB; } else if((mapper & 0x2f) == 0x21) { - cart.dsp1_mapper = DSP1_HIROM; + info.dsp1_mapper = DSP1_HIROM; } } if(mapper == 0x20 && rom_type == 0x05) { - cart.dsp2 = true; + info.dsp2 = true; } if(mapper == 0x30 && rom_type == 0x25) { - cart.obc1 = true; + info.obc1 = true; } - cart.cart_mmio = cart.c4 | cart.dsp1 | cart.dsp2 | cart.obc1; + info.cart_mmio = info.c4 | info.dsp1 | info.dsp2 | info.obc1; - if(rom[cart.header_index + SRAM_SIZE] & 7) { - cart.sram_size = 1024 << (rom[cart.header_index + SRAM_SIZE] & 7); + if(rom[info.header_index + SRAM_SIZE] & 7) { + info.ram_size = 1024 << (rom[info.header_index + SRAM_SIZE] & 7); } else { - cart.sram_size = 0; + info.ram_size = 0; } - cart.region = ((rom[cart.header_index + REGION] & 0x7f) < 2) ? NTSC : PAL; - - memcpy(&cart.name, &rom[cart.header_index + CART_NAME], 21); - cart.name[21] = 0; + memcpy(&info.name, &rom[info.header_index + CART_NAME], 21); + info.name[21] = 0; for(int i = 0; i < 22; i++) { - if(cart.name[i] & 0x80) { - cart.name[i] = '?'; + if(info.name[i] & 0x80) { + info.name[i] = '?'; } } } @@ -91,9 +116,9 @@ int32 score_lo = 0, score_hi = 0, score_ex = 0; - if(rom_size < 0x010000) { + if(info.rom_size < 0x010000) { //cart too small to be anything but lorom - cart.header_index = 0x007fc0; + info.header_index = 0x007fc0; return; } @@ -115,6 +140,9 @@ int32 score_lo = 0, if(rom[0x7fc0 + LICENSE] < 3)score_lo++; if(rom[0xffc0 + LICENSE] < 3)score_hi++; + if(rom[0x7fc0 + RESH] & 0x80)score_lo += 2; + if(rom[0xffc0 + RESH] & 0x80)score_hi += 2; + uint16 cksum, icksum; cksum = rom[0x7fc0 + CKSUM] | (rom[0x7fc0 + CKSUM + 1] << 8); icksum = rom[0x7fc0 + ICKSUM] | (rom[0x7fc0 + ICKSUM + 1] << 8); @@ -128,7 +156,7 @@ uint16 cksum, icksum; score_hi += 8; } - if(rom_size < 0x401000) { + if(info.rom_size < 0x401000) { score_ex = 0; } else { if(rom[0x7fc0 + MAPPER] == 0x32)score_lo++; @@ -136,100 +164,78 @@ uint16 cksum, icksum; } if(score_lo >= score_hi && score_lo >= score_ex) { - cart.header_index = 0x007fc0; + info.header_index = 0x007fc0; } else if(score_hi >= score_ex) { - cart.header_index = 0x00ffc0; + info.header_index = 0x00ffc0; } else { - cart.header_index = 0x40ffc0; + info.header_index = 0x40ffc0; } } void Cartridge::load_sram() { - if(cart.sram_size == 0) { + if(info.ram_size == 0) { sram = 0; return; } FileReader ff(sram_fn); if(!ff.ready()) { - sram = (uint8*)malloc(cart.sram_size); - memset(sram, 0, cart.sram_size); + sram = (uint8*)malloc(info.ram_size); + memset(sram, 0, info.ram_size); return; } - sram = ff.read(cart.sram_size); + sram = ff.read(info.ram_size); } void Cartridge::save_sram() { - if(cart.sram_size == 0)return; + if(info.ram_size == 0)return; FileWriter ff(sram_fn); if(!ff.ready())return; - ff.write(sram, cart.sram_size); + ff.write(sram, info.ram_size); } -void Cartridge::load_rom(Reader *rf) { - base_rom = rf->read(); - rom_size = rf->size(); - - if((rom_size & 0x7fff) == 0x0200) { - rom = base_rom + 512; - rom_size -= 512; - } else { - rom = base_rom; +uint Cartridge::mirror_rom(uint size) { +uint i; +//find largest power of two <= size + for(i = 31; i >= 0; i--) { + if(size & (1 << i))break; } - cart.rom_size = rom_size; +uint P0_size = 1 << i; + size -= P0_size; + if(size == 0)return P0_size; - cart.crc32 = 0xffffffff; - for(int32 i = 0; i < cart.rom_size; i++) { - cart.crc32 = crc32_adjust(cart.crc32, rom[i]); +//find smallest power of two >= size + for(i = 0; i <= 31; i++) { + if((1 << i) >= size)break; } - cart.crc32 = ~cart.crc32; + +uint P1_size = 1 << i; + return P0_size + P1_size; } -void Cartridge::patch_rom(Reader *rf) { -uint8 *patch_data = rf->read(); -uint32 patch_size = rf->size(); -BPF bpf; - if(patch_size < 34)return; - -uint32 target; - target = patch_data[BPF::INDEX_FORMAT + 0] << 0; - target |= patch_data[BPF::INDEX_FORMAT + 1] << 8; - target |= patch_data[BPF::INDEX_FORMAT + 2] << 16; - target |= patch_data[BPF::INDEX_FORMAT + 3] << 24; - if(target != BPF::FORMAT_SNES) { - alert("Warning: BPF patch file is not in SNES format!\n\n" - "The patch will still be applied, but it will not be " - "possible to determine whether the patch was created " - "against an image with a header or without a header.\n\n" - "bsnes is now forced to assume the patch was created " - "against a headerless source image. If this is not the " - "case, then patching will fail!\n\n" - "If you are the author of this patch, please recreate " - "the patch in SNES format.\n\n" - "If you are not the patch author, please contact the " - "author and ask them to create an SNES format BPF patch."); +void Cartridge::load_rom(Reader &rf) { + info.rom_size = rf.size(); +bool header = false; + if((info.rom_size & 0x7fff) == 0x0200) { + info.rom_size -= 512; + header = true; } - if(bpf.apply_patch(patch_size, patch_data, rom_size, rom) == true) { - SafeFree(base_rom); - uint8 *temp = bpf.get_output_handle(rom_size); - base_rom = (uint8*)malloc(rom_size); - memcpy(base_rom, temp, rom_size); - rom = base_rom; - cart.rom_size = rom_size; - } else { - alert("Failed to apply patch.\n\nThis could be because the patch itself " - "does not match its internal checksum, because the ROM loaded does not " - "match the patch information for either the original or modified file, " - "or because the patched file does not match the checksum of either the " - "original or modified file that is stored inside the patch.\n\n" - "The original ROM image will be used instead."); + info.rom_size = mirror_rom(info.rom_size); + + base_rom = rf.read(info.rom_size + ((header) ? 512 : 0)); + rom = base_rom; + if(header)rom += 512; + + info.crc32 = 0xffffffff; + for(int32 i = 0; i < info.rom_size; i++) { + info.crc32 = crc32_adjust(info.crc32, rom[i]); } - SafeFree(patch_data); + info.crc32 = ~info.crc32; } bool Cartridge::load(const char *fn) { @@ -247,7 +253,7 @@ bool Cartridge::load(const char *fn) { alert("Error loading image file (%s)!", rom_fn); return false; } - load_rom(static_cast(&ff)); + load_rom(ff); break; } #ifdef GZIP_SUPPORT @@ -257,12 +263,12 @@ bool Cartridge::load(const char *fn) { alert("Error loading image file (%s)!", rom_fn); return false; } - load_rom(static_cast(&gf)); + load_rom(gf); break; } case Reader::RF_ZIP: { ZipReader zf(rom_fn); - load_rom(static_cast(&zf)); + load_rom(zf); break; } #endif @@ -270,7 +276,7 @@ bool Cartridge::load(const char *fn) { case Reader::RF_JMA: { try { JMAReader jf(rom_fn); - load_rom(static_cast(&jf)); + load_rom(jf); } catch(JMA::jma_errors jma_error) { alert("Error loading image file (%s)!", rom_fn); return false; @@ -289,25 +295,6 @@ bool Cartridge::load(const char *fn) { } } -//check for bpf patch -#ifdef GZIP_SUPPORT - strcpy(patch_fn, sram_fn); - strcat(patch_fn, ".bpz"); - if(fexists(patch_fn)) { - ZipReader zf(patch_fn); - patch_rom(static_cast(&zf)); - } else { -#endif - strcpy(patch_fn, sram_fn); - strcat(patch_fn, ".bpf"); - if(fexists(patch_fn)) { - FileReader ff(patch_fn); - patch_rom(static_cast(&ff)); - } -#ifdef GZIP_SUPPORT - } -#endif - //add SRAM extension strcat(sram_fn, "."); strcat(sram_fn, config::fs.save_ext.sget()); @@ -343,13 +330,19 @@ bool Cartridge::load(const char *fn) { strcat(cheat_fn, ".cht"); if(fexists(cheat_fn) == true) { FileReader ff(cheat_fn); - cheat.load(static_cast(&ff)); + cheat.load(ff); + } + + if(read_database() == true) { + read_dbi(); + } else { + find_header(); + read_header(); } - find_header(); - read_header(); load_sram(); cart_loaded = true; + r_mem->load_cart(); return true; } @@ -370,7 +363,7 @@ bool Cartridge::unload() { if(cheat.count() > 0 || fexists(cheat_fn)) { FileWriter ff(cheat_fn); - cheat.save(static_cast(&ff)); + cheat.save(ff); cheat.clear(); } @@ -379,12 +372,13 @@ bool Cartridge::unload() { } Cartridge::Cartridge() { + load_database(); + cart_loaded = false; base_rom = 0; rom = 0; sram = 0; - rom_size = 0; } Cartridge::~Cartridge() { diff --git a/src/cart/cart.h b/src/cart/cart.h index 3daaa463..abb03cbb 100644 --- a/src/cart/cart.h +++ b/src/cart/cart.h @@ -1,10 +1,24 @@ class Cartridge { public: + +/***** + * cart database + *****/ + +#include "db/db.h" +db_item dbi; + uint8 *database; + uint database_size; + uint database_blocksize; + void load_database(); + bool read_database(); + +// + bool cart_loaded; char rom_fn[4096], sram_fn[4096], cheat_fn[4096], patch_fn[4096]; uint8 *base_rom, *rom, *sram; -uint32 rom_size; enum { //header fields @@ -18,12 +32,15 @@ enum { VERSION = 0x1b, ICKSUM = 0x1c, CKSUM = 0x1e, + RESL = 0x3c, + RESH = 0x3d, //regions NTSC = 0, PAL = 1, //memory mappers + PCB = 0x00, LOROM = 0x20, HIROM = 0x21, EXLOROM = 0x22, @@ -37,14 +54,13 @@ enum { struct { uint32 crc32; - uint32 header_index; + char name[128]; + char pcb[32]; - char name[32]; - uint32 rom_size; - uint32 sram_size; - bool region; - - uint32 mapper; + uint region; + uint mapper; + uint rom_size; + uint ram_size; //set to true for games that need cart MMIO mapping (c4, dsp-n, ...), //for games that map outside the standard MMIO range of $2000-$5fff @@ -57,12 +73,16 @@ struct { bool obc1; uint dsp1_mapper; -} cart; - void load_rom(Reader *rf); - void patch_rom(Reader *rf); +//HiROM / LoROM specific code + uint header_index; +} info; + + uint mirror_rom(uint size); + void load_rom(Reader &rf); void load_sram(); void save_sram(); + void read_dbi(); void find_header(); void read_header(); bool loaded() { return cart_loaded; } diff --git a/src/cart/database.cpp b/src/cart/database.cpp new file mode 100644 index 00000000..186894a8 --- /dev/null +++ b/src/cart/database.cpp @@ -0,0 +1,37 @@ +void Cartridge::load_database() { + database = 0; + database_size = 0; + +FILE *fp; + fp = fopen("cart.db", "rb"); + if(!fp)return; + +uint size = fsize(fp); + if(size < 8) { + fclose(fp); + return; + } + + database = (uint8*)malloc(size); + fread(database, 1, size, fp); + fclose(fp); + + database_blocksize = (database[6] << 0) | (database[7] << 8); + database_size = (size - 8) / database_blocksize; +} + +bool Cartridge::read_database() { +uint i, crc32; + for(i = 0; i < database_size; i++) { + uint8 *p = database + 8 + (i * database_blocksize); + crc32 = *(p++) << 0; + crc32 |= *(p++) << 8; + crc32 |= *(p++) << 16; + crc32 |= *(p++) << 24; + if(crc32 == cartridge.info.crc32)break; + } + if(i >= database_size)return false; + + db_read(dbi, database + 8 + (i * database_blocksize)); + return true; +} diff --git a/src/cart/db/cart.db b/src/cart/db/cart.db new file mode 100644 index 0000000000000000000000000000000000000000..86d773f1a674e4920af4e834012bc7148e689389 GIT binary patch literal 1212 zcmWIca}9QJTEoD6{cV*?YLS9ZVqSVtW^pl)so|AakeH{b5Um)?Ko=0~5$3FG=xFS# zYixksLInl}AUgBzrzsA%YJ?f;8ERtJOjS{0-70x{uO!f|NtFu0C5bsXnfZAN>Xv5o z4O^#RP_UZ%>KYj02m@enH!v{d2DMBJ%Fj*AOU}$oR|rmYPlUS@60USe3b1f>(ls=~ z?pOhE8fZ$6P7exjR|qLC%`Pn}RWO1%6}u*yh(f~E98b6^0PSUDa4Xs$7o1<3m!ja8 zUzVB!cQZXR7~HLfII> 0, fp); + fputc(dbi.crc32 >> 8, fp); + fputc(dbi.crc32 >> 16, fp); + fputc(dbi.crc32 >> 24, fp); + + fwrite(dbi.name, 1, 128, fp); + fwrite(dbi.pcb, 1, 32, fp); + + fputc(dbi.rom >> 0, fp); + fputc(dbi.rom >> 8, fp); + fputc(dbi.rom >> 16, fp); + fputc(dbi.rom >> 24, fp); + + fputc(dbi.ram >> 0, fp); + fputc(dbi.ram >> 8, fp); + fputc(dbi.ram >> 16, fp); + fputc(dbi.ram >> 24, fp); +} + +void db_read(db_item &dbi, uint8 *data) { + dbi.crc32 = (*data++) << 0; + dbi.crc32 |= (*data++) << 8; + dbi.crc32 |= (*data++) << 16; + dbi.crc32 |= (*data++) << 24; + + memcpy(dbi.name, data, 128); dbi.name[127] = 0; data += 128; + memcpy(dbi.pcb, data, 32); dbi.pcb [ 31] = 0; data += 32; + + dbi.rom = (*data++) << 0; + dbi.rom |= (*data++) << 8; + dbi.rom |= (*data++) << 16; + dbi.rom |= (*data++) << 24; + + dbi.ram = (*data++) << 0; + dbi.ram |= (*data++) << 8; + dbi.ram |= (*data++) << 16; + dbi.ram |= (*data++) << 24; +} diff --git a/src/cart/db/dbcreate.cpp b/src/cart/db/dbcreate.cpp new file mode 100644 index 00000000..288d778b --- /dev/null +++ b/src/cart/db/dbcreate.cpp @@ -0,0 +1,117 @@ +#include "../../lib/libbase.h" +#include "../../lib/libvector.h" +#include "../../lib/libstring.h" + +#include "../../lib/libstring.cpp" + +#include "db.h" + +FILE *fp; + +uint decode_size(substring &str) { +//hex encoding + if(strbegin(str, "0x")) { + strltrim(str, "0x"); + return strhex(str); + } + +//mbit encoding + if(strend(str, "mbit")) { + strrtrim(str, "mbit"); + return strdec(str) * 1024 * 1024 / 8; + } + +//kbit encoding + if(strend(str, "kbit")) { + strrtrim(str, "kbit"); + return strdec(str) * 1024 / 8; + } + +//decimal encoding + return strdec(str); +} + +void build_block(substring &block) { +string line, hashpart, part; + split(line, "\n", block); + + if(strbegin(line[0], "[") == false) { + printf("error: invalid block detected: '%s'\n", strptr(line[0])); + return; + } + + strltrim(line[0], "["); + strrtrim(line[0], "]"); + replace(line[0], "0x", ""); + split(hashpart, ",", line[0]); + +db_item dbi; + dbi.crc32 = 0; + *dbi.name = 0; + *dbi.pcb = 0; + dbi.rom = 0; + dbi.ram = 0; + + for(int i = 1; i < count(line); i++) { + uint pos; + if(strpos(line[i], ";", pos) == true) { + strset(line[i], pos, 0); + } + + if(strmatch(line[i], ""))continue; + + split(part, "=", line[i]); + strunquote(part[1]); + + if(strmatch(part[0], "name")) { + strncpy(dbi.name, strptr(part[1]), 128); + dbi.name[128] = 0; + } + + if(strmatch(part[0], "pcb")) { + strncpy(dbi.pcb, strptr(part[1]), 32); + dbi.pcb[31] = 0; + } + + if(strmatch(part[0], "rom")) { + dbi.rom = decode_size(part[1]); + } + + if(strmatch(part[0], "ram")) { + dbi.ram = decode_size(part[1]); + } + } + + for(int i = 0; i < count(hashpart); i++) { + dbi.crc32 = strhex(hashpart[i]); + db_write(fp, dbi); + } +} + +void build_database() { +string data, block; + if(strfread(data, "cartdb.txt") == false)return; + + fp = fopen("cart.db", "wb"); + fprintf(fp, "SNESDB"); + +uint blocksize = 4 + 128 + 32 + 4 + 4; + fputc(blocksize >> 0, fp); + fputc(blocksize >> 8, fp); + + replace (data, "\r", ""); + qreplace(data, " ", ""); + qreplace(data, "\t", ""); + split(block, "\n\n", data); + + for(int i = 0; i < count(block); i++) { + build_block(block[i]); + } + + fclose(fp); +} + +int main() { + build_database(); + return 0; +} diff --git a/src/cart/db/dbcreate.exe b/src/cart/db/dbcreate.exe new file mode 100644 index 0000000000000000000000000000000000000000..f1c783859eee1589e367d5c5757b2534a77e2e39 GIT binary patch literal 77824 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

NQ&Hg~xxFZ-E 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

  • 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 G7WhAr6Qdyj literal 0 HcmV?d00001 diff --git a/src/cheat/cheat.cpp b/src/cheat/cheat.cpp index 9d5fde47..24bee6af 100644 --- a/src/cheat/cheat.cpp +++ b/src/cheat/cheat.cpp @@ -266,12 +266,12 @@ void Cheat::disable(uint32 n) { * cheat file manipulation routines *****/ -bool Cheat::load(Reader *rf) { - if(!rf->ready())return false; +bool Cheat::load(Reader &rf) { + if(!rf.ready())return false; -uint8 *raw_data = rf->read(); +uint8 *raw_data = rf.read(); string data; - raw_data[rf->size()] = 0; + raw_data[rf.size()] = 0; strcpy(data, (char*)raw_data); SafeFree(raw_data); replace(data, "\r\n", "\n"); @@ -297,8 +297,8 @@ string line; return true; } -bool Cheat::save(Writer *wf) { - if(!wf->ready())return false; +bool Cheat::save(Writer &wf) { + if(!wf.ready())return false; string data; char t[4096]; @@ -308,7 +308,7 @@ char t[4096]; strcat(data, t); } - wf->write((uint8*)strptr(data), strlen(data)); + wf.write((uint8*)strptr(data), strlen(data)); return true; } diff --git a/src/cheat/cheat.h b/src/cheat/cheat.h index e8567f1c..eb5b0181 100644 --- a/src/cheat/cheat.h +++ b/src/cheat/cheat.h @@ -38,8 +38,8 @@ public: bool enabled(uint32 n); void enable (uint32 n); void disable(uint32 n); - bool load(Reader *rf); - bool save(Writer *wf); + bool load(Reader &rf); + bool save(Writer &wf); void clear(); Cheat(); diff --git a/src/chip/dsp1/_dsp1emu.cpp b/src/chip/dsp1/_dsp1emu.cpp deleted file mode 100644 index 637a65ed..00000000 --- a/src/chip/dsp1/_dsp1emu.cpp +++ /dev/null @@ -1,1617 +0,0 @@ -// DSP-1's emulation code -// -// Based on research by Overload, The Dumper, Neviksti and Andreas Naive -// Date: June 2006 - -////////////////////////////////////////////////////////////////// - -Dsp1::Dsp1() -{ - reset(); -} - -////////////////////////////////////////////////////////////////// - -uint8 Dsp1::getSr() const -{ - return mSr; -} - -////////////////////////////////////////////////////////////////// - -uint8 Dsp1::getDr() -{ - uint8 oDr; - - fsmStep(true, oDr); - return oDr; -} - -////////////////////////////////////////////////////////////////// - -void Dsp1::setDr(uint8 iDr) -{ - fsmStep(false, iDr); -} - -////////////////////////////////////////////////////////////////// - -void Dsp1::reset() -{ - mSr = DRC|RQM; - mDr = 0x0080; // Only a supposition. Is this correct? - mFreeze = false; - mFsmMajorState = WAIT_COMMAND; - memset(&shared, 0, sizeof(SharedData)); // another supposition -} - -////////////////////////////////////////////////////////////////// - -// Though the DSP-1 is unaware of the type of operation (read or write) -// we need to know what is being done by the program, as the class -// is responsible for maintaining the binding between the -// "external" and "internal" representations of the DR (data register). - -void Dsp1::fsmStep(bool read, uint8 &data) -{ - if (0 == (mSr&RQM)) return; - // Now RQM would be cleared; however, as this code is not to be used in - // a multithread environment, we will simply fake RQM operation. - // (The only exception would be Op1A's freeze.) - - // binding - if (read) - { - if (mSr&DRS) - data = static_cast(mDr>>8); - else - data = static_cast(mDr); - } - else - { - if (mSr&DRS) - { - mDr &= 0x00ff; - mDr |= data<<8; - } - else - { - mDr &= 0xff00; - mDr |= data; - } - } - - - switch (mFsmMajorState) - { - case WAIT_COMMAND: - mCommand = static_cast(mDr); - if (!(mCommand & 0xc0)) // valid command? - { - switch(mCommand) - { - // freeze cases - case 0x1a: - case 0x2a: - case 0x3a: - mFreeze = true; - break; - // normal cases - default: - mDataCounter=0; - mFsmMajorState = READ_DATA; - mSr &= ~DRC; - break; - } - } - break; - case READ_DATA: - mSr ^= DRS; - if (!(mSr&DRS)) - { - mReadBuffer[mDataCounter++] = static_cast(mDr); - if (mDataCounter >= mCommandTable[mCommand].reads) - { - (this->*mCommandTable[mCommand].callback)(mReadBuffer, mWriteBuffer); - if (0 != mCommandTable[mCommand].writes) // any output? - { - mDataCounter = 0; - mDr = static_cast(mWriteBuffer[mDataCounter]); - mFsmMajorState = WRITE_DATA; - } - else - { - mDr = 0x0080; // valid command completion - mFsmMajorState = WAIT_COMMAND; - mSr |= DRC; - } - } - } - break; - case WRITE_DATA: - mSr ^= DRS; - if (!(mSr&DRS)) - { - ++mDataCounter; - if (mDataCounter >= mCommandTable[mCommand].writes) - { - if ((mCommand == 0x0a)&&(mDr != 0x8000)) - { - // works in continuous mode - mReadBuffer[0]++; // next raster line - (this->*mCommandTable[mCommand].callback)(mReadBuffer, mWriteBuffer); - mDataCounter = 0; - mDr = static_cast(mWriteBuffer[mDataCounter]); - } - else - { - mDr = 0x0080; // valid command completion - mFsmMajorState = WAIT_COMMAND; - mSr |= DRC; - } - } - else - { - mDr = static_cast(mWriteBuffer[mDataCounter]); - } - } - break; - } - - - - // Now RQM would be set (except when executing Op1A -command equals 0x1a, 0x2a or 0x3a-). - if (mFreeze) - mSr &= ~RQM; -} - -////////////////////////////////////////////////////////////////// - -// The info on this table follows Overload's docs. - -const Dsp1::Command Dsp1::mCommandTable[0x40] = { - {&Dsp1::multiply, 2, 1}, //0x00 - {&Dsp1::attitudeA, 4, 0}, //0x01 - {&Dsp1::parameter, 7, 4}, //0x02 - {&Dsp1::subjectiveA, 3, 3}, //0x03 - {&Dsp1::triangle, 2, 2}, //0x04 - {&Dsp1::attitudeA, 4, 0}, //0x01 - {&Dsp1::project, 3, 3}, //0x06 - {&Dsp1::memoryTest, 1, 1}, //0x0f - {&Dsp1::radius, 3, 2}, //0x08 - {&Dsp1::objectiveA, 3, 3}, //0x0d - {&Dsp1::raster, 1, 4}, // 0x0a. This will normally work in continuous mode - {&Dsp1::scalarA, 3, 1}, //0x0b - {&Dsp1::rotate, 3, 2}, //0x0c - {&Dsp1::objectiveA, 3, 3}, //0x0d - {&Dsp1::target, 2, 2}, //0x0e - {&Dsp1::memoryTest, 1, 1}, //0x0f - - {&Dsp1::inverse, 2, 2}, //0x10 - {&Dsp1::attitudeB, 4, 0}, //0x11 - {&Dsp1::parameter, 7, 4}, //0x02 - {&Dsp1::subjectiveB, 3, 3}, //0x13 - {&Dsp1::gyrate, 6, 3}, //0x14 - {&Dsp1::attitudeB, 4, 0}, //0x11 - {&Dsp1::project, 3, 3}, //0x06 - {&Dsp1::memoryDump, 1, 1024}, //0x1f - {&Dsp1::range, 4, 1}, //0x18 - {&Dsp1::objectiveB, 3, 3}, //0x1d - {0, 0, 0}, // 0x1a; the chip freezes - {&Dsp1::scalarB, 3, 1}, //0x1b - {&Dsp1::polar, 6, 3}, //0x1c - {&Dsp1::objectiveB, 3, 3}, //0x1d - {&Dsp1::target, 2, 2}, //0x0e - {&Dsp1::memoryDump, 1, 1024}, //0x1f - - {&Dsp1::multiply2, 2, 1}, //0x20 - {&Dsp1::attitudeC, 4, 0}, //0x21 - {&Dsp1::parameter, 7, 4}, //0x02 - {&Dsp1::subjectiveC, 3, 3}, //0x23 - {&Dsp1::triangle, 2, 2}, //0x04 - {&Dsp1::attitudeC, 4, 0}, //0x21 - {&Dsp1::project, 3, 3}, //0x06 - {&Dsp1::memorySize, 1, 1}, //0x2f - {&Dsp1::distance, 3, 1}, //0x28 - {&Dsp1::objectiveC, 3, 3}, //0x2d - {0, 0, 0}, // 0x1a; the chip freezes - {&Dsp1::scalarC, 3, 1}, //0x2b - {&Dsp1::rotate, 3, 2}, //0x0c - {&Dsp1::objectiveC, 3, 3}, //0x2d - {&Dsp1::target, 2, 2}, //0x0e - {&Dsp1::memorySize, 1, 1}, //0x2f - - {&Dsp1::inverse, 2, 2}, //0x10 - {&Dsp1::attitudeA, 4, 0}, //0x01 - {&Dsp1::parameter, 7, 4}, //0x02 - {&Dsp1::subjectiveA, 3, 3}, //0x03 - {&Dsp1::gyrate, 6, 3}, //0x14 - {&Dsp1::attitudeA, 4, 0}, //0x01 - {&Dsp1::project, 3, 3}, //0x06 - {&Dsp1::memoryDump, 1, 1024}, //0x1f - {&Dsp1::range2, 4, 1}, //0x38 - {&Dsp1::objectiveA, 3, 3}, //0x0d - {0, 0, 0}, // 0x1a; the chip freezes - {&Dsp1::scalarA, 3, 1}, //0x0b - {&Dsp1::polar, 6, 3}, //0x1c - {&Dsp1::objectiveA, 3, 3}, //0x0d - {&Dsp1::target, 2, 2}, //0x0e - {&Dsp1::memoryDump, 1, 1024}, //0x1f -}; - -////////////////////////////////////////////////////////////////// - -void Dsp1::memoryTest(int16 *input, int16 *output) -{ - int16& Size = input[0]; - int16& Result = output[0]; - - Result = 0x0000; -} - -////////////////////////////////////////////////////////////////// - -void Dsp1::memoryDump(int16 *input, int16 *output) -{ - memcpy(output, DataRom, 1024); -} - -////////////////////////////////////////////////////////////////// - -void Dsp1::memorySize(int16 *input, int16 *output) -{ - int16& Size = output[0]; - - Size = 0x0100; -} - -////////////////////////////////////////////////////////////////// - -// 16-bit multiplication - -void Dsp1::multiply(int16 *input, int16 *output) -{ - int16& Multiplicand = input[0]; - int16& Multiplier = input[1]; - int16& Product = output[0]; - - Product = Multiplicand * Multiplier >> 15; -} - -////////////////////////////////////////////////////////////////// - -// 16-bit multiplication. 'Alternative' method. Can anyone check this carefully? - -void Dsp1::multiply2(int16 *input, int16 *output) -{ - int16& Multiplicand = input[0]; - int16& Multiplier = input[1]; - int16& Product = output[0]; - - Product = (Multiplicand * Multiplier >> 15)+1; -} - -////////////////////////////////////////////////////////////////// - -// This command determines the inverse of a floating point decimal number. - -void Dsp1::inverse(int16 *input, int16 *output) -{ - int16& Coefficient = input[0]; - int16& Exponent = input[1]; - int16& iCoefficient = output[0]; - int16& iExponent = output[1]; - - inverse(Coefficient, Exponent, iCoefficient, iExponent); -} - -////////////////////////////////////////////////////////////////// - -// Vector component calculation. Determines the X and Y components for a -// two-dimensional vector whose size and direction is known. -// Y = Radius * sin(Angle) -// X = Radius * cos(Angle) - -void Dsp1::triangle(int16 *input, int16 *output) -{ - int16& Angle = input[0]; - int16& Radius = input[1]; - int16& Y = output[0]; - int16& X = output[1]; - - Y = sin(Angle) * Radius >> 15; - X = cos(Angle) * Radius >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Determines the squared norm of a vector (X,Y,Z) -// The output is Radius = X^2+Y^2+Z^2 (double integer) - -void Dsp1::radius(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& RadiusLow = output[0]; - int16& RadiusHigh = output[1]; - - int32 Radius; - - Radius = (X * X + Y * Y + Z * Z) << 1; - RadiusLow = static_cast(Radius); - RadiusHigh = static_cast(Radius>>16); -} - -////////////////////////////////////////////////////////////////// - -// Vector size comparison. This command compares the size of the vector (X,Y,Z) and the distance (R) -// from a particular point, and so may be used to determine if a point is within the sphere or radius R. -// The output is D = X^2+Y^2+Z^2-R^2 - -void Dsp1::range(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& Radius = input[3]; - int16& Range = output[0]; - - Range = (X * X + Y * Y + Z * Z - Radius * Radius) >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Vector size comparison. 'Alternative' method. - -void Dsp1::range2(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& Radius = input[3]; - int16& Range = output[0]; - - Range = ((X * X + Y * Y + Z * Z - Radius * Radius) >> 15) + 1; -} - -////////////////////////////////////////////////////////////////// - -// This command calculates the norm of a (X,Y,Z) vector, or the distance from -// the point (X,Y,Z) to (0,0,0), as you prefer to see it. -// Distance = sqrt(X^2+Y^2+Z^2) -// The square root of a number 'a' is calculated by doing this: you -// write 'a' as b*2^2n, with 'b' between 1/4 and 1; then, you calculate -// c=sqrt(b) by using lineal interpolation between points of a -// look-up table and, finally, you output the result as c*2^n. - -void Dsp1::distance(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& Distance = output[0]; - - int32 Radius = X * X + Y * Y + Z * Z; - - if (Radius == 0) Distance = 0; - else - { - int16 C, E; - normalizeDouble(Radius, C, E); - if (E & 1) C = C * 0x4000 >> 15; - - int16 Pos = C * 0x0040 >> 15; - - int16 Node1 = DataRom[0x00d5 + Pos]; - int16 Node2 = DataRom[0x00d6 + Pos]; - - Distance = ((Node2 - Node1) * (C & 0x1ff) >> 9) + Node1; - -#if DSP1_VERSION < 0x0102 - if (Pos & 1) Distance -= (Node2 - Node1); -#endif - Distance >>= (E >> 1); - } -} - -////////////////////////////////////////////////////////////////// - -// Determines the (X2, Y2) coordinates obtained by rotating (X1, Y1) -// clockwise for an angle 'Angle'. The official documentation says -// 'counterclockwise', but it's obviously wrong (surprise! :P) -// -// In matrix notation: -// |X2| |cos(Angle) sin(Angle)| |X1| -// | | = | | | | -// |Y2| |-sin(Angle cos(Angle)| |Y1| - -void Dsp1::rotate(int16 *input, int16 *output) -{ - int16& Angle = input[0]; - int16& X1 = input[1]; - int16& Y1 = input[2]; - int16& X2 = output[0]; - int16& Y2 = output[1]; - - X2 = (Y1 * sin(Angle) >> 15) + (X1 * cos(Angle) >> 15); - Y2 = (Y1 * cos(Angle) >> 15) - (X1 * sin(Angle) >> 15); -} - -////////////////////////////////////////////////////////////////// - -// Calculate the coordinates (X2, Y2, Z2) obtained when rotating (X1, Y1, Z1) -// three-dimensionally. Rotation is done in the order of Az around the Z axis, -// Ay around the Y axis and Ax around the X axis. As occur with the "attitude" commands -// (see comments in the "gyrate" command), this doesn't match what explained in -// the official documentation, but it's coherent with what it is done in the "attitude" -// command (but not with the "gyrate" command). -// -// In matrix notation: -// |X2| |1 0 0 | |cosRy 0 -sinRy| | cosRz sinRz 0| |X1| -// |Y2| = |0 cosRx sinRx| | 0 1 0 | |-sinRz cosRz 0| |Y1| -// |Z2| |0 -sinRx cosRx| |sinRy 0 cosRy| | 0 0 1| |Z1| - -void Dsp1::polar(int16 *input, int16 *output) -{ - int16& Az = input[0]; - int16& Ay = input[1]; - int16& Ax = input[2]; - int16& X1 = input[3]; - int16& Y1 = input[4]; - int16& Z1 = input[5]; - int16& X2 = output[0]; - int16& Y2 = output[1]; - int16& Z2 = output[2]; - - int16 X, Y, Z; - - // Rotate Around Z - X = (Y1 * sin(Az) >> 15) + (X1 * cos(Az) >> 15); - Y = (Y1 * cos(Az) >> 15) - (X1 * sin(Az) >> 15); - X1 = X; Y1 = Y; - - // Rotate Around Y - Z = (X1 * sin(Ay) >> 15) + (Z1 * cos(Ay) >> 15); - X = (X1 * cos(Ay) >> 15) - (Z1 * sin(Ay) >> 15); - X2 = X; Z1 = Z; - - // Rotate Around X - Y = (Z1 * sin(Ax) >> 15) + (Y1 * cos(Ax) >> 15); - Z = (Z1 * cos(Ax) >> 15) - (Y1 * sin(Ax) >> 15); - Y2 = Y; Z2 = Z; -} - -////////////////////////////////////////////////////////////////// - -// Set up the elements of an "attitude matrix" (there are other ones): -// S | cosRz sinRz 0| |cosRy 0 -sinRy| |1 0 0 | -// MatrixA = - |-sinRz cosRz 0| | 0 1 0 | |0 cosRx sinRx| -// 2 | 0 0 1| |sinRy 0 cosRy| |0 -sinRx cosRx| -// This matrix is thought to be used within the following framework: -// let's suppose we define positive rotations around a system of orthogonal axes in this manner: -// a rotation of +90 degrees around axis3 converts axis2 into axis1 -// a rotation of +90 degrees around axis2 converts axis1 into axis3 -// a rotation of +90 degrees around axis1 converts axis3 into axis2 -// and let's suppose that we have defined a new orthonormal axes system (FLU) -// by doing the following operations about the standard one (XYZ): -// first rotating the XYZ system around Z by an angle Rz (obtaining X'Y'Z'), -// then rotating the resulting system around Y by an angle Ry (obtaining X''Y''Z'') -// and, finally, rotating the resulting system around X by an angle Rx (obtaining FLU) -// This FLU (forward/left/up) system represents an "attitude" and, then, the matrix here defined -// is the change of coordinates matrix that transform coordinates in the FLU -// system (the "object coordinates") into the standard XYZ system (the "global coordinates"), -// multiplied by a scale factor S/2, that is: -// |x| S |f| -// |y| * - = MatrixA * |l| -// |z| 2 |u| -// In a similar way, if we use the transpose of the matrix, we can transform global coordinates -// into object coordinates: -// |f| S |x| -// |l| * - = MatrixA_transposed * |y| -// |u| 2 |z| -// -// input[0]: S -// input[1]: Rz -// input[2]: Ry -// input[3]: Rx - -void Dsp1::attitudeA(int16 *input, int16 *output) -{ - int16& S = input[0]; - int16& Rz = input[1]; - int16& Ry = input[2]; - int16& Rx = input[3]; - - int16 SinRz = sin(Rz); - int16 CosRz = cos(Rz); - int16 SinRy = sin(Ry); - int16 CosRy = cos(Ry); - int16 SinRx = sin(Rx); - int16 CosRx = cos(Rx); - - S >>= 1; - - shared.MatrixA[0][0] = (S * CosRz >> 15) * CosRy >> 15; - shared.MatrixA[0][1] = ((S * SinRz >> 15) * CosRx >> 15) + (((S * CosRz >> 15) * SinRx >> 15) * SinRy >> 15); - shared.MatrixA[0][2] = ((S * SinRz >> 15) * SinRx >> 15) - (((S * CosRz >> 15) * CosRx >> 15) * SinRy >> 15); - - shared.MatrixA[1][0] = -((S * SinRz >> 15) * CosRy >> 15); - shared.MatrixA[1][1] = ((S * CosRz >> 15) * CosRx >> 15) - (((S * SinRz >> 15) * SinRx >> 15) * SinRy >> 15); - shared.MatrixA[1][2] = ((S * CosRz >> 15) * SinRx >> 15) + (((S * SinRz >> 15) * CosRx >> 15) * SinRy >> 15); - - shared.MatrixA[2][0] = S * SinRy >> 15; - shared.MatrixA[2][1] = -((S * SinRx >> 15) * CosRy >> 15); - shared.MatrixA[2][2] = (S * CosRx >> 15) * CosRy >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Same than 'attitudeA', but with a difference attitude matrix (matrixB) - -void Dsp1::attitudeB(int16 *input, int16 *output) -{ - int16& S = input[0]; - int16& Rz = input[1]; - int16& Ry = input[2]; - int16& Rx = input[3]; - - int16 SinRz = sin(Rz); - int16 CosRz = cos(Rz); - int16 SinRy = sin(Ry); - int16 CosRy = cos(Ry); - int16 SinRx = sin(Rx); - int16 CosRx = cos(Rx); - - S >>= 1; - - shared.MatrixB[0][0] = (S * CosRz >> 15) * CosRy >> 15; - shared.MatrixB[0][1] = ((S * SinRz >> 15) * CosRx >> 15) + (((S * CosRz >> 15) * SinRx >> 15) * SinRy >> 15); - shared.MatrixB[0][2] = ((S * SinRz >> 15) * SinRx >> 15) - (((S * CosRz >> 15) * CosRx >> 15) * SinRy >> 15); - - shared.MatrixB[1][0] = -((S * SinRz >> 15) * CosRy >> 15); - shared.MatrixB[1][1] = ((S * CosRz >> 15) * CosRx >> 15) - (((S * SinRz >> 15) * SinRx >> 15) * SinRy >> 15); - shared.MatrixB[1][2] = ((S * CosRz >> 15) * SinRx >> 15) + (((S * SinRz >> 15) * CosRx >> 15) * SinRy >> 15); - - shared.MatrixB[2][0] = S * SinRy >> 15; - shared.MatrixB[2][1] = -((S * SinRx >> 15) * CosRy >> 15); - shared.MatrixB[2][2] = (S * CosRx >> 15) * CosRy >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Same than 'attitudeA', but with a difference attitude matrix (matrixC) - -void Dsp1::attitudeC(int16 *input, int16 *output) -{ - int16& S = input[0]; - int16& Rz = input[1]; - int16& Ry = input[2]; - int16& Rx = input[3]; - - int16 SinRz = sin(Rz); - int16 CosRz = cos(Rz); - int16 SinRy = sin(Ry); - int16 CosRy = cos(Ry); - int16 SinRx = sin(Rx); - int16 CosRx = cos(Rx); - - S >>= 1; - - shared.MatrixC[0][0] = (S * CosRz >> 15) * CosRy >> 15; - shared.MatrixC[0][1] = ((S * SinRz >> 15) * CosRx >> 15) + (((S * CosRz >> 15) * SinRx >> 15) * SinRy >> 15); - shared.MatrixC[0][2] = ((S * SinRz >> 15) * SinRx >> 15) - (((S * CosRz >> 15) * CosRx >> 15) * SinRy >> 15); - - shared.MatrixC[1][0] = -((S * SinRz >> 15) * CosRy >> 15); - shared.MatrixC[1][1] = ((S * CosRz >> 15) * CosRx >> 15) - (((S * SinRz >> 15) * SinRx >> 15) * SinRy >> 15); - shared.MatrixC[1][2] = ((S * CosRz >> 15) * SinRx >> 15) + (((S * SinRz >> 15) * CosRx >> 15) * SinRy >> 15); - - shared.MatrixC[2][0] = S * SinRy >> 15; - shared.MatrixC[2][1] = -((S * SinRx >> 15) * CosRy >> 15); - shared.MatrixC[2][2] = (S * CosRx >> 15) * CosRy >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Convert global coordinates (X,Y,Z) to object coordinates (F,L,U) -// See the comment in "attitudeA" for a explanation about the calculation. -// -// input[0]: X ; input[1]: Y ; input[2]: Z -// output[0]: F ; output[1]: L ; output[2]: U - -void Dsp1::objectiveA(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& F = output[0]; - int16& L = output[1]; - int16& U = output[2]; - - F = (shared.MatrixA[0][0] * X >> 15) + (shared.MatrixA[1][0] * Y >> 15) + (shared.MatrixA[2][0] * Z >> 15); - L = (shared.MatrixA[0][1] * X >> 15) + (shared.MatrixA[1][1] * Y >> 15) + (shared.MatrixA[2][1] * Z >> 15); - U = (shared.MatrixA[0][2] * X >> 15) + (shared.MatrixA[1][2] * Y >> 15) + (shared.MatrixA[2][2] * Z >> 15); -} - -////////////////////////////////////////////////////////////////// - -// Same than 'objectiveA', but for the 'B' attitude - -void Dsp1::objectiveB(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& F = output[0]; - int16& L = output[1]; - int16& U = output[2]; - - F = (shared.MatrixB[0][0] * X >> 15) + (shared.MatrixB[1][0] * Y >> 15) + (shared.MatrixB[2][0] * Z >> 15); - L = (shared.MatrixB[0][1] * X >> 15) + (shared.MatrixB[1][1] * Y >> 15) + (shared.MatrixB[2][1] * Z >> 15); - U = (shared.MatrixB[0][2] * X >> 15) + (shared.MatrixB[1][2] * Y >> 15) + (shared.MatrixB[2][2] * Z >> 15); -} - -////////////////////////////////////////////////////////////////// - -// Same than 'objectiveA', but for the 'C' attitude - -void Dsp1::objectiveC(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& F = output[0]; - int16& L = output[1]; - int16& U = output[2]; - - F = (shared.MatrixC[0][0] * X >> 15) + (shared.MatrixC[1][0] * Y >> 15) + (shared.MatrixC[2][0] * Z >> 15); - L = (shared.MatrixC[0][1] * X >> 15) + (shared.MatrixC[1][1] * Y >> 15) + (shared.MatrixC[2][1] * Z >> 15); - U = (shared.MatrixC[0][2] * X >> 15) + (shared.MatrixC[1][2] * Y >> 15) + (shared.MatrixC[2][2] * Z >> 15); -} - -////////////////////////////////////////////////////////////////// - -// Convert object coordinates (F,L,U) to object coordinates (X,Y,Z) -// See the comment in "attitudeA" for a explanation about the calculation. -// -// input[0]: F ; input[1]: L ; input[2]: U -// output[0]: X ; output[1]: Y ; output[2]: Z - -void Dsp1::subjectiveA(int16 *input, int16 *output) -{ - int16& F = input[0]; - int16& L = input[1]; - int16& U = input[2]; - int16& X = output[0]; - int16& Y = output[1]; - int16& Z = output[2]; - - X = (shared.MatrixA[0][0] * F >> 15) + (shared.MatrixA[0][1] * L >> 15) + (shared.MatrixA[0][2] * U >> 15); - Y = (shared.MatrixA[1][0] * F >> 15) + (shared.MatrixA[1][1] * L >> 15) + (shared.MatrixA[1][2] * U >> 15); - Z = (shared.MatrixA[2][0] * F >> 15) + (shared.MatrixA[2][1] * L >> 15) + (shared.MatrixA[2][2] * U >> 15); -} - -////////////////////////////////////////////////////////////////// - -// Same than 'subjectiveA', but for the 'B' attitude - -void Dsp1::subjectiveB(int16 *input, int16 *output) -{ - int16& F = input[0]; - int16& L = input[1]; - int16& U = input[2]; - int16& X = output[0]; - int16& Y = output[1]; - int16& Z = output[2]; - - X = (shared.MatrixB[0][0] * F >> 15) + (shared.MatrixB[0][1] * L >> 15) + (shared.MatrixB[0][2] * U >> 15); - Y = (shared.MatrixB[1][0] * F >> 15) + (shared.MatrixB[1][1] * L >> 15) + (shared.MatrixB[1][2] * U >> 15); - Z = (shared.MatrixB[2][0] * F >> 15) + (shared.MatrixB[2][1] * L >> 15) + (shared.MatrixB[2][2] * U >> 15); -} - -////////////////////////////////////////////////////////////////// - -// Same than 'subjectiveA', but for the 'C' attitude - -void Dsp1::subjectiveC(int16 *input, int16 *output) -{ - int16& F = input[0]; - int16& L = input[1]; - int16& U = input[2]; - int16& X = output[0]; - int16& Y = output[1]; - int16& Z = output[2]; - - X = (shared.MatrixC[0][0] * F >> 15) + (shared.MatrixC[0][1] * L >> 15) + (shared.MatrixC[0][2] * U >> 15); - Y = (shared.MatrixC[1][0] * F >> 15) + (shared.MatrixC[1][1] * L >> 15) + (shared.MatrixC[1][2] * U >> 15); - Z = (shared.MatrixC[2][0] * F >> 15) + (shared.MatrixC[2][1] * L >> 15) + (shared.MatrixC[2][2] * U >> 15); -} - -////////////////////////////////////////////////////////////////// - -// This command calculates the inner product (S) of a vector (X,Y,Z) and -// the first column of MatrixA. It should be noted that that first column -// represent the global coordinates of an unity vector in the forward -// direction in the object coordinate system (coordinates (1,0,0) in the FLU -// axes system). -// -// input[0]: X ; input[1]: Y ; input[2]: Z -// output[0]: S - -void Dsp1::scalarA(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& S = output[0]; - - S = (X * shared.MatrixA[0][0] + Y * shared.MatrixA[1][0] + Z * shared.MatrixA[2][0]) >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Same than 'scalarA', but for the 'B' attitude - -void Dsp1::scalarB(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& S = output[0]; - - S = (X * shared.MatrixB[0][0] + Y * shared.MatrixB[1][0] + Z * shared.MatrixB[2][0]) >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Same than 'scalarA', but for the 'C' attitude - -void Dsp1::scalarC(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& S = output[0]; - - S = (X * shared.MatrixC[0][0] + Y * shared.MatrixC[1][0] + Z * shared.MatrixC[2][0]) >> 15; -} - -////////////////////////////////////////////////////////////////// - -// This command determines the final attitude angles after the body with attitude angles (Ax, Ay, Az) with -// respect to the global coordinates is rotated by the minor angular displacements (DeltaF, DeltaL, DeltaU). -// It means that the XYZ axes are rotated by (Ax, Ay, Az) to obtain the FLU axes and, then, these -// are rotated by (DeltaF, DeltaL, DeltaU). The command calculates and return the new FLU angles respect to the -// XYZ system (Rx, Ry, Rz) -// The formulae are: -// Rx = Ax + (DeltaU*sin(Ay)+DeltaF*cos(Ay)) -// Ry = Ay + DeltaL - tan(Ax)*(DeltaU*cos(Ay)+DeltaF*sin(Ay)) -// Rz = Az + sec(Ax)*(DeltaU*cos(Ay)-DeltaF*sin(Ay)) -// -// Now the discussion: according to the official documentation, as described in various commands, you pass from -// XYZ to FLU by doing the rotations in the order Y, X, Z. In this command, the formulae are coherent with the -// fact that Y is the first axis to do a rotation around it. However, in the "attitude" command, while the official -// document describe it that way, we have discovered, when reverse engineering the command, that the calculated -// matrix do the rotation around Y in the second place. This incoherent behaviour of various commands is, in my -// opinion, a pretty severe implementation error. However, if you only use small "minor displacements", the error term -// introduced by that incoherence should be almost negligible. - -void Dsp1::gyrate(int16 *input, int16 *output) -{ - int16& Az = input[0]; - int16& Ax = input[1]; - int16& Ay = input[2]; - int16& U = input[3]; - int16& F = input[4]; - int16& L = input[5]; - int16& Rz = output[0]; - int16& Rx = output[1]; - int16& Ry = output[2]; - - int16 CSec, ESec, CSin, C, E; - int16 SinAy = sin(Ay); - int16 CosAy = cos(Ay); - - inverse(cos(Ax), 0, CSec, ESec); - - // Rotation Around Z - normalizeDouble(U * CosAy - F * SinAy, C, E); - - E = ESec - E; - - normalize(C * CSec >> 15, C, E); - - Rz = Az + denormalizeAndClip(C, E); - - // Rotation Around X - Rx = Ax + (U * SinAy >> 15) + (F * CosAy >> 15); - - // Rotation Around Y - normalizeDouble(U * CosAy + F * SinAy, C, E); - - E = ESec - E; - - normalize(sin(Ax), CSin, E); - - normalize(-(C * (CSec * CSin >> 15) >> 15), C, E); - - Ry = Ay + denormalizeAndClip(C, E) + L; -} - -////////////////////////////////////////////////////////////////// - -const int16 Dsp1::MaxAZS_Exp[16] = { - 0x38b4, 0x38b7, 0x38ba, 0x38be, 0x38c0, 0x38c4, 0x38c7, 0x38ca, - 0x38ce, 0x38d0, 0x38d4, 0x38d7, 0x38da, 0x38dd, 0x38e0, 0x38e4 -}; - -////////////////////////////////////////////////////////////////// - - -// Set-up the projection framework. Besides returning some values, it store in RAM some values that -// will be used by the other three projection commands (raster, target an project) -// Input: -// (Fx, Fy, Fz)-> coordinates of base point (global coordinates) -// Lfe-> distance between the base point and the viewpoint (center of projection) -// Les-> distance between the base point and the screen -// Aas-> azimuth angle (0º is east; 90ª is north) -// Azs-> zenith angle (0º is zenith) -// Output: -// Vof-> raster line of imaginary center (whatever it means ;) ) -// Vva-> raster line representing the horizon line -// (Cx, Cy)-> coordinates of the projection of the center of the screen over the ground (ground coordinates) - -void Dsp1::parameter(int16 *input, int16 *output) -{ - int16& Fx = input[0]; - int16& Fy = input[1]; - int16& Fz = input[2]; - int16& Lfe = input[3]; - int16& Les = input[4]; - int16& Aas = input[5]; - int16& Azs = input[6]; - int16& Vof = output[0]; - int16& Vva = output[1]; - int16& Cx = output[2]; - int16& Cy = output[3]; - - int16 CSec, C, E; - int16 LfeNx, LfeNy, LfeNz; - int16 LesNx, LesNy, LesNz; - - // Copy Zenith angle for clipping - int16 AZS = Azs; - - // Store Les and his coefficient and exponent when normalized - shared.Les = Les; - shared.E_Les=0; - normalize(Les, shared.C_Les, shared.E_Les); - - // Store Sine and Cosine of Azimuth and Zenith angle - shared.SinAas = sin(Aas); - shared.CosAas = cos(Aas); - shared.SinAzs = sin(Azs); - shared.CosAzs = cos(Azs); - - // normal vector to the screen (norm 1, points toward the center of projection) - shared.Nx = shared.SinAzs * -shared.SinAas >> 15; - shared.Ny = shared.SinAzs * shared.CosAas >> 15; - shared.Nz = shared.CosAzs * 0x7fff >> 15; - - // horizontal vector of the screen (Hz=0, norm 1, points toward the right of the screen) - shared.Hx = shared.CosAas*0x7fff>>15; - shared.Hy = shared.SinAas*0x7fff>>15; - - // vertical vector of the screen (norm 1, points toward the top of the screen) - shared.Vx = shared.CosAzs*-shared.SinAas>>15; - shared.Vy = shared.CosAzs*shared.CosAas>>15; - shared.Vz = -shared.SinAzs*0x7fff>>15; - - LfeNx = Lfe*shared.Nx>>15; - LfeNy = Lfe*shared.Ny>>15; - LfeNz = Lfe*shared.Nz>>15; - - // Center of Projection - shared.CentreX = Fx+LfeNx; - shared.CentreY = Fy+LfeNy; - shared.CentreZ = Fz+LfeNz; - - LesNx = Les*shared.Nx>>15; - LesNy = Les*shared.Ny>>15; - LesNz = Les*shared.Nz>>15; - - // center of the screen (global coordinates) - shared.Gx=shared.CentreX-LesNx; - shared.Gy=shared.CentreY-LesNy; - shared.Gz=shared.CentreZ-LesNz; - - - E = 0; - normalize(shared.CentreZ, C, E); - - shared.CentreZ_C = C; - shared.CentreZ_E = E; - - // Determine clip boundary and clip Zenith angle if necessary - // (Why to clip? Maybe to avoid the screen can only show sky with no ground? Only a guess...) - int16 MaxAZS = MaxAZS_Exp[-E]; - - if (AZS < 0) { - MaxAZS = -MaxAZS; - if (AZS < MaxAZS + 1) AZS = MaxAZS + 1; - } else { - if (AZS > MaxAZS) AZS = MaxAZS; - } - - // Store Sine and Cosine of clipped Zenith angle - shared.SinAZS = sin(AZS); - shared.CosAZS = cos(AZS); - - // calculate the separation of (cx, cy) from the projection of - // the 'centre of projection' over the ground... (CentreZ*tg(AZS)) - inverse(shared.CosAZS, 0, shared.SecAZS_C1, shared.SecAZS_E1); - normalize(C * shared.SecAZS_C1 >> 15, C, E); - E += shared.SecAZS_E1; - C = denormalizeAndClip(C, E) * shared.SinAZS >> 15; - - // ... and then take into account the position of the centre of - // projection and the azimuth angle - shared.CentreX += C * shared.SinAas >> 15; - shared.CentreY -= C * shared.CosAas >> 15; - - Cx = shared.CentreX; - Cy = shared.CentreY; - - // Raster number of imaginary center and horizontal line - Vof = 0; - - if ((Azs != AZS) || (Azs == MaxAZS)) - { - // correct vof and vva when Azs is outside the 'non-clipping interval' - // we have only some few Taylor coefficients, so we cannot guess which ones - // are the approximated functions and, what is worse, we don't know why - // the own clipping stuff (and, particularly, this correction) is done - if (Azs == -32768) Azs = -32767; - - C = Azs - MaxAZS; - if (C >= 0) C--; - int16 Aux = ~(C << 2); - - // Vof += x+(1/3)*x^3, where x ranges from 0 to PI/4 when Azs-MaxAZS goes from 0 to 0x2000 - C = Aux * DataRom[0x0328] >> 15; - C = (C * Aux >> 15) + DataRom[0x0327]; - Vof -= (C * Aux >> 15) * Les >> 15; - - // CosAZS *= 1+(1/2)*x^2+(5/24)*x^24, where x ranges from 0 to PI/4 when Azs-MaxAZS goes from 0 to 0x2000 - C = Aux * Aux >> 15; - Aux = (C * DataRom[0x0324] >> 15) + DataRom[0x0325]; - shared.CosAZS += (C * Aux >> 15) * shared.CosAZS >> 15; - } - - // vertical offset of the screen with regard to the horizontal plane - // containing the centre of projection - shared.VOffset = Les * shared.CosAZS >> 15; - - // The horizon line (the line in the screen that is crossed by the horizon plane - // -the horizontal plane containing the 'centre of projection'-), - // will be at distance Les*cotg(AZS) from the centre of the screen. This is difficult - // to explain but easily seen in a graph. To better see it, consider it in this way: - // Les*tg(AZS-90), draw some lines and apply basic trigonometry. ;) - inverse(shared.SinAZS, 0, CSec, E); - normalize(shared.VOffset, C, E); - normalize(C * CSec >> 15, C, E); - - if (C == -32768) { C >>= 1; E++; } - - Vva = denormalizeAndClip(-C, E); - - // Store Secant of clipped Zenith angle - inverse(shared.CosAZS, 0, shared.SecAZS_C2, shared.SecAZS_E2); -} - -////////////////////////////////////////////////////////////////// - -// Calculates the matrix which transform an object situated on a raster line (Vs) into -// his projection over the ground. The modified SecAZS is used here, so -// i don't understand the fine details, but, basically, it's done -// this way: The vertical offset between the point of projection and the -// raster line is calculated (Vs*SinAzs>>15)+VOffset, then the height of -// the center of projection is measured in that units (*CentreZ_C). If, now -// you consider the "reference case" (center of projection at an unit of height), -// the projection of a thin strip containing the raster line will have the same -// width (as the raster line would be on the ground in this case, but will suffer a -// change of scale in height (as the ground and the vertical axis would form an angle of 180º-Azs). -// This scale factor, when the angle 'center of screen-center of projection-raster line' is small, -// can be aproximated by the one of the center of the screen, 1/cos(Azs).(**) (Here is when it's used -// SecAZS). By last, you have to consider the effect of the azimuth angle Aas, and you are done. -// -// Using matrix notation: -// |A B| Centre_ZS | cos(Aas) -sin(Aas)| |1 0| -// ProjectionMatrix = | | = ----------- * | | * | | -// |C D| Vs*sin(Azs) |sin(Aas) cos(Aas)| |0 sec(Azs)| -// -// (**) -// If Les=1, the vertical offset between the center -// of projection and the center of the screen is Cos(Azs); then, if the vertical -// offset is 1, the ratio of the projection over the ground respect to the -// line on the screen is 1/cos(Azs). - -void Dsp1::raster(int16 *input, int16 *output) -{ - int16& Vs = input[0]; - int16& An = output[0]; - int16& Bn = output[1]; - int16& Cn = output[2]; - int16& Dn = output[3]; - - int16 C, E, C1, E1; - - inverse((Vs * shared.SinAzs >> 15) + shared.VOffset, 7, C, E); - - E += shared.CentreZ_E; - C1 = C * shared.CentreZ_C >> 15; - - E1 = E + shared.SecAZS_E2; - - normalize(C1, C, E); - C = denormalizeAndClip(C, E); - - An = C * shared.CosAas >> 15; - Cn = C * shared.SinAas >> 15; - - normalize(C1 * shared.SecAZS_C2 >> 15, C, E1); - C = denormalizeAndClip(C, E1); - - Bn = C * -shared.SinAas >> 15; - Dn = C * shared.CosAas >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Calculate the projection over the ground of a selected point of screen -// It simply apply the projection matrix described in the "Raster" command -// to the vector (H,V) transposed, and add the result to the position of -// the centre of projection. -// The only special point to take into account is the directions on the screen: -// H is positive rightward, but V is positive downward; this is why -// the signs take that configuration - -void Dsp1::target(int16 *input, int16 *output) -{ - int16& H = input[0]; - int16& V = input[1]; - int16& X = output[0]; - int16& Y = output[1]; - - int16 C, E, C1, E1; - - inverse((V * shared.SinAzs >> 15) + shared.VOffset, 8, C, E); - - E += shared.CentreZ_E; - C1 = C * shared.CentreZ_C >> 15; - - E1 = E + shared.SecAZS_E1; - - H <<= 8; - normalize(C1, C, E); - C = denormalizeAndClip(C, E) * H >> 15; - - X = shared.CentreX + (C * shared.CosAas >> 15); - Y = shared.CentreY - (C * shared.SinAas >> 15); - - V <<= 8; - normalize(C1 * shared.SecAZS_C1 >> 15, C, E1); - C = denormalizeAndClip(C, E1) * V >> 15; - - X += C * -shared.SinAas >> 15; - Y += C * shared.CosAas >> 15; -} - -////////////////////////////////////////////////////////////////// - -// Calculation of the projection over the screen (H,V) of an object (X,Y,Z) and his -// 'enlargement ratio' (M). The positive directions on the screen are as described -// in the targe command. M is scaled down by 2^-7, that is, M==0x0100 means ratio 1:1 - - void Dsp1::project(int16 *input, int16 *output) -{ - int16& X = input[0]; - int16& Y = input[1]; - int16& Z = input[2]; - int16& H = output[0]; - int16& V = output[1]; - int16& M = output[2]; - - int32 aux, aux4; - int16 E, E2, E3, E4, E5, refE, E6, E7; - int16 C2, C4, C6, C8, C9, C10, C11, C12, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26; - int16 Px, Py, Pz; - - E4=E3=E2=E=E5=0; - - normalizeDouble(int32(X)-shared.Gx, Px, E4); - normalizeDouble(int32(Y)-shared.Gy, Py, E); - normalizeDouble(int32(Z)-shared.Gz, Pz, E3); - Px>>=1; E4--; // to avoid overflows when calculating the scalar products - Py>>=1; E--; - Pz>>=1; E3--; - - refE = (E>15); - C8=- (Py*shared.Ny>>15); - C9=- (Pz*shared.Nz>>15); - C12=C11+C8+C9; // this cannot overflow! - - aux4=C12; // de-normalization with 32-bits arithmetic - refE = 16-refE; // refE can be up to 3 - if (refE>=0) - aux4 <<=(refE); - else - aux4 >>=-(refE); - if (aux4==-1) aux4 = 0; // why? - aux4>>=1; - - aux = static_cast(shared.Les) + aux4; // Les - the scalar product of P with the normal vector of the screen - normalizeDouble(aux, C10, E2); - E2 = 15-E2; - - inverse(C10, 0, C4, E4); - C2=C4*shared.C_Les>>15; // scale factor - - - // H - E7=0; - C16= (Px*shared.Hx>>15); - C20= (Py*shared.Hy>>15); - C17=C16+C20; // scalar product of P with the normalized horizontal vector of the screen... - - C18=C17*C2>>15; // ... multiplied by the scale factor - normalize(C18, C19, E7); - H=denormalizeAndClip(C19, shared.E_Les-E2+refE+E7); - - // V - E6=0; - C21 = Px*shared.Vx>>15; - C22 = Py*shared.Vy>>15; - C23 = Pz*shared.Vz>>15; - C24=C21+C22+C23; // scalar product of P with the normalized vertical vector of the screen... - - C26=C24*C2>>15; // ... multiplied by the scale factor - normalize(C26, C25, E6); - V=denormalizeAndClip(C25, shared.E_Les-E2+refE+E6); - - // M - normalize(C2, C6, E4); - M=denormalizeAndClip(C6, E4+shared.E_Les-E2-7); // M is the scale factor divided by 2^7 -} - -////////////////////////////////////////////////////////////////// - -// Calculate the sine of the input parameter -// this is done by linear interpolation between -// the points of a look-up table - -int16 Dsp1::sin(int16 Angle) -{ - if (Angle < 0) { - if (Angle == -32768) return 0; - return -sin(-Angle); - } - int32 S = SinTable[Angle >> 8] + (MulTable[Angle & 0xff] * SinTable[0x40 + (Angle >> 8)] >> 15); - if (S > 32767) S = 32767; - return (int16) S; -} - -////////////////////////////////////////////////////////////////// - -// Calculate the cosine of the input parameter. -// It's used the same method than in sin(int16) - -int16 Dsp1::cos(int16 Angle) -{ - if (Angle < 0) { - if (Angle == -32768) return -32768; - Angle = -Angle; - } - int32 S = SinTable[0x40 + (Angle >> 8)] - (MulTable[Angle & 0xff] * SinTable[Angle >> 8] >> 15); - if (S < -32768) S = -32767; - return (int16) S; -} - -////////////////////////////////////////////////////////////////// - -// Determines the inverse of a floating point decimal number -// iCoefficient*2^iExponent = 1/(Coefficient*2^Exponent), with the output -// normalized (iCoefficient represents a number whose absolute value is between 1/2 and 1) -// To invert 'Coefficient' a first initial guess is taken from a look-up table -// and, then, two iterations of the Newton method (applied to the function -// f(x)=1/(2*x)-Coefficient) are done. This results in a close approximation (iCoefficient) to a number 'y' -// that verify Coefficient*y=1/2. This is why you have to correct the exponent by one -// unit at the end. - -void Dsp1::inverse(int16 Coefficient, int16 Exponent, int16 &iCoefficient, int16 &iExponent) -{ - // Step One: Division by Zero - if (Coefficient == 0x0000) - { - iCoefficient = 0x7fff; - iExponent = 0x002f; - } - else - { - int16 Sign = 1; - - // Step Two: Remove Sign - if (Coefficient < 0) - { - if (Coefficient < -32767) Coefficient = -32767; - Coefficient = -Coefficient; - Sign = -1; - } - - // Step Three: Normalize - while (Coefficient < 0x4000) - { - Coefficient <<= 1; - Exponent--; - } - - // Step Four: Special Case - if (Coefficient == 0x4000) - if (Sign == 1) iCoefficient = 0x7fff; - else { - iCoefficient = -0x4000; - Exponent--; - } - else { - // Step Five: Initial Guess - int16 i = DataRom[((Coefficient - 0x4000) >> 7) + 0x0065]; - - // Step Six: Iterate Newton's Method - i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; - i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; - - iCoefficient = i * Sign; - } - - iExponent = 1 - Exponent; - } -} - -////////////////////////////////////////////////////////////////// - -int16 Dsp1::denormalizeAndClip(int16 C, int16 E) -{ - if (E > 0) { - if (C > 0) return 32767; else if (C < 0) return -32767; - } else { - if (E < 0) return C * DataRom[0x0031 + E] >> 15; - } - return C; -} - -////////////////////////////////////////////////////////////////// - -// Normalize the input number (m), understood as ranging from -1 to 1, -// to the form: Coefficient*2^Exponent, -// where the absolute value of Coefficient is >= 1/2 -// (Coefficient>=0x4000 or Coefficient <= (int16)0xc001) - -void Dsp1::normalize(int16 m, int16 &Coefficient, int16 &Exponent) -{ - int16 i = 0x4000; - int16 e = 0; - - if (m < 0) - while ((m & i) && i) - { - i >>= 1; - e++; - } - else - while (!(m & i) && i) - { - i >>= 1; - e++; - } - - if (e > 0) - Coefficient = m * DataRom[0x21 + e] << 1; - else - Coefficient = m; - - Exponent -= e; -} - -////////////////////////////////////////////////////////////////// - -// Same than 'normalize' but with an int32 input - -void Dsp1::normalizeDouble(int32 Product, int16 &Coefficient, int16 &Exponent) -{ - int16 n = Product & 0x7fff; - int16 m = Product >> 15; - int16 i = 0x4000; - int16 e = 0; - - if (m < 0) - while ((m & i) && i) - { - i >>= 1; - e++; - } - else - while (!(m & i) && i) - { - i >>= 1; - e++; - } - - if (e > 0) - { - Coefficient = m * DataRom[0x0021 + e] << 1; - - if (e < 15) - Coefficient += n * DataRom[0x0040 - e] >> 15; - else - { - i = 0x4000; - - if (m < 0) - while ((n & i) && i) - { - i >>= 1; - e++; - } - else - while (!(n & i) && i) - { - i >>= 1; - e++; - } - - if (e > 15) - Coefficient = n * DataRom[0x0012 + e] << 1; - else - Coefficient += n; - } - } - else - Coefficient = m; - - Exponent = e; -} - -////////////////////////////////////////////////////////////////// - -// Shift to the right - -int16 Dsp1::shiftR(int16 C, int16 E) -{ - return (C * DataRom[0x0031 + E] >> 15); -} - -////////////////////////////////////////////////////////////////// - -// this is, indeed, only part of the Data ROM -const int16 Dsp1::SinTable[256] = { - 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, - 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, - 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, - 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, - 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, - 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, - 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, - 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, - 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, - 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, - 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, - 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, - 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, - 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, - 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, - 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, - -0x0000, -0x0324, -0x0647, -0x096a, -0x0c8b, -0x0fab, -0x12c8, -0x15e2, - -0x18f8, -0x1c0b, -0x1f19, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, - -0x30fb, -0x33de, -0x36ba, -0x398c, -0x3c56, -0x3f17, -0x41ce, -0x447a, - -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, - -0x5a82, -0x5cb4, -0x5ed7, -0x60ec, -0x62f2, -0x64e8, -0x66cf, -0x68a6, - -0x6a6d, -0x6c24, -0x6dca, -0x6f5f, -0x70e2, -0x7255, -0x73b5, -0x7504, - -0x7641, -0x776c, -0x7884, -0x798a, -0x7a7d, -0x7b5d, -0x7c29, -0x7ce3, - -0x7d8a, -0x7e1d, -0x7e9d, -0x7f09, -0x7f62, -0x7fa7, -0x7fd8, -0x7ff6, - -0x7fff, -0x7ff6, -0x7fd8, -0x7fa7, -0x7f62, -0x7f09, -0x7e9d, -0x7e1d, - -0x7d8a, -0x7ce3, -0x7c29, -0x7b5d, -0x7a7d, -0x798a, -0x7884, -0x776c, - -0x7641, -0x7504, -0x73b5, -0x7255, -0x70e2, -0x6f5f, -0x6dca, -0x6c24, - -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f2, -0x60ec, -0x5ed7, -0x5cb4, - -0x5a82, -0x5842, -0x55f5, -0x539b, -0x5133, -0x4ebf, -0x4c3f, -0x49b4, - -0x471c, -0x447a, -0x41ce, -0x3f17, -0x3c56, -0x398c, -0x36ba, -0x33de, - -0x30fb, -0x2e11, -0x2b1f, -0x2826, -0x2528, -0x2223, -0x1f19, -0x1c0b, - -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324}; - - ////////////////////////////////////////////////////////////////// - -// Optimised for Performance - const int16 Dsp1::MulTable[256] = { - 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015, - 0x0019, 0x001c, 0x001f, 0x0022, 0x0025, 0x0028, 0x002b, 0x002f, - 0x0032, 0x0035, 0x0038, 0x003b, 0x003e, 0x0041, 0x0045, 0x0048, - 0x004b, 0x004e, 0x0051, 0x0054, 0x0057, 0x005b, 0x005e, 0x0061, - 0x0064, 0x0067, 0x006a, 0x006d, 0x0071, 0x0074, 0x0077, 0x007a, - 0x007d, 0x0080, 0x0083, 0x0087, 0x008a, 0x008d, 0x0090, 0x0093, - 0x0096, 0x0099, 0x009d, 0x00a0, 0x00a3, 0x00a6, 0x00a9, 0x00ac, - 0x00af, 0x00b3, 0x00b6, 0x00b9, 0x00bc, 0x00bf, 0x00c2, 0x00c5, - 0x00c9, 0x00cc, 0x00cf, 0x00d2, 0x00d5, 0x00d8, 0x00db, 0x00df, - 0x00e2, 0x00e5, 0x00e8, 0x00eb, 0x00ee, 0x00f1, 0x00f5, 0x00f8, - 0x00fb, 0x00fe, 0x0101, 0x0104, 0x0107, 0x010b, 0x010e, 0x0111, - 0x0114, 0x0117, 0x011a, 0x011d, 0x0121, 0x0124, 0x0127, 0x012a, - 0x012d, 0x0130, 0x0133, 0x0137, 0x013a, 0x013d, 0x0140, 0x0143, - 0x0146, 0x0149, 0x014d, 0x0150, 0x0153, 0x0156, 0x0159, 0x015c, - 0x015f, 0x0163, 0x0166, 0x0169, 0x016c, 0x016f, 0x0172, 0x0175, - 0x0178, 0x017c, 0x017f, 0x0182, 0x0185, 0x0188, 0x018b, 0x018e, - 0x0192, 0x0195, 0x0198, 0x019b, 0x019e, 0x01a1, 0x01a4, 0x01a8, - 0x01ab, 0x01ae, 0x01b1, 0x01b4, 0x01b7, 0x01ba, 0x01be, 0x01c1, - 0x01c4, 0x01c7, 0x01ca, 0x01cd, 0x01d0, 0x01d4, 0x01d7, 0x01da, - 0x01dd, 0x01e0, 0x01e3, 0x01e6, 0x01ea, 0x01ed, 0x01f0, 0x01f3, - 0x01f6, 0x01f9, 0x01fc, 0x0200, 0x0203, 0x0206, 0x0209, 0x020c, - 0x020f, 0x0212, 0x0216, 0x0219, 0x021c, 0x021f, 0x0222, 0x0225, - 0x0228, 0x022c, 0x022f, 0x0232, 0x0235, 0x0238, 0x023b, 0x023e, - 0x0242, 0x0245, 0x0248, 0x024b, 0x024e, 0x0251, 0x0254, 0x0258, - 0x025b, 0x025e, 0x0261, 0x0264, 0x0267, 0x026a, 0x026e, 0x0271, - 0x0274, 0x0277, 0x027a, 0x027d, 0x0280, 0x0284, 0x0287, 0x028a, - 0x028d, 0x0290, 0x0293, 0x0296, 0x029a, 0x029d, 0x02a0, 0x02a3, - 0x02a6, 0x02a9, 0x02ac, 0x02b0, 0x02b3, 0x02b6, 0x02b9, 0x02bc, - 0x02bf, 0x02c2, 0x02c6, 0x02c9, 0x02cc, 0x02cf, 0x02d2, 0x02d5, - 0x02d8, 0x02db, 0x02df, 0x02e2, 0x02e5, 0x02e8, 0x02eb, 0x02ee, - 0x02f1, 0x02f5, 0x02f8, 0x02fb, 0x02fe, 0x0301, 0x0304, 0x0307, - 0x030b, 0x030e, 0x0311, 0x0314, 0x0317, 0x031a, 0x031d, 0x0321}; - -////////////////////////////////////////////////////////////////// - -// Data ROM, as logged from a DSP-1B with the 0x1f command; -// it contains the tables and constants used by the commands. -// The tables used are: two shift tables (0x022-0x031 and 0x031-0x040 -this last one -// with an error in 0x03c which has survived to all the DSP-1 revisions-); a inverse -// table (used as initial guess) at 0x065-0x0e4; a square root table (used also -// as initial guess) at 0x0e5-0x115; two sin and cos tables (used as nodes to construct -// a interpolation curve) at, respectively, 0x116-0x197 and 0x196-0x215. -// As a curiosity, in the positions 0x21c-0x31c it's contained a -// 257-points arccos table that, apparently, have been not used anywhere -// (maybe for the MaxAZS_Exp table?). - const uint16 Dsp1::DataRom[1024] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, - 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, - 0x4000, 0x7fff, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, - 0x0100, 0x0080, 0x0040, 0x0020, 0x0001, 0x0008, 0x0004, 0x0002, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x8000, 0xffe5, 0x0100, 0x7fff, 0x7f02, 0x7e08, - 0x7d12, 0x7c1f, 0x7b30, 0x7a45, 0x795d, 0x7878, 0x7797, 0x76ba, - 0x75df, 0x7507, 0x7433, 0x7361, 0x7293, 0x71c7, 0x70fe, 0x7038, - 0x6f75, 0x6eb4, 0x6df6, 0x6d3a, 0x6c81, 0x6bca, 0x6b16, 0x6a64, - 0x69b4, 0x6907, 0x685b, 0x67b2, 0x670b, 0x6666, 0x65c4, 0x6523, - 0x6484, 0x63e7, 0x634c, 0x62b3, 0x621c, 0x6186, 0x60f2, 0x6060, - 0x5fd0, 0x5f41, 0x5eb5, 0x5e29, 0x5d9f, 0x5d17, 0x5c91, 0x5c0c, - 0x5b88, 0x5b06, 0x5a85, 0x5a06, 0x5988, 0x590b, 0x5890, 0x5816, - 0x579d, 0x5726, 0x56b0, 0x563b, 0x55c8, 0x5555, 0x54e4, 0x5474, - 0x5405, 0x5398, 0x532b, 0x52bf, 0x5255, 0x51ec, 0x5183, 0x511c, - 0x50b6, 0x5050, 0x4fec, 0x4f89, 0x4f26, 0x4ec5, 0x4e64, 0x4e05, - 0x4da6, 0x4d48, 0x4cec, 0x4c90, 0x4c34, 0x4bda, 0x4b81, 0x4b28, - 0x4ad0, 0x4a79, 0x4a23, 0x49cd, 0x4979, 0x4925, 0x48d1, 0x487f, - 0x482d, 0x47dc, 0x478c, 0x473c, 0x46ed, 0x469f, 0x4651, 0x4604, - 0x45b8, 0x456c, 0x4521, 0x44d7, 0x448d, 0x4444, 0x43fc, 0x43b4, - 0x436d, 0x4326, 0x42e0, 0x429a, 0x4255, 0x4211, 0x41cd, 0x4189, - 0x4146, 0x4104, 0x40c2, 0x4081, 0x4040, 0x3fff, 0x41f7, 0x43e1, - 0x45bd, 0x478d, 0x4951, 0x4b0b, 0x4cbb, 0x4e61, 0x4fff, 0x5194, - 0x5322, 0x54a9, 0x5628, 0x57a2, 0x5914, 0x5a81, 0x5be9, 0x5d4a, - 0x5ea7, 0x5fff, 0x6152, 0x62a0, 0x63ea, 0x6530, 0x6672, 0x67b0, - 0x68ea, 0x6a20, 0x6b53, 0x6c83, 0x6daf, 0x6ed9, 0x6fff, 0x7122, - 0x7242, 0x735f, 0x747a, 0x7592, 0x76a7, 0x77ba, 0x78cb, 0x79d9, - 0x7ae5, 0x7bee, 0x7cf5, 0x7dfa, 0x7efe, 0x7fff, 0x0000, 0x0324, - 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, - 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, - 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, - 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, - 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, - 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, - 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, - 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, - 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, - 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, - 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, - 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, - 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, - 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, - 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, - 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x7fff, 0x7ff6, - 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, - 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, - 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, - 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, - 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, - 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, - 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, - 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, - 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, - 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, - 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, - 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, - 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, - 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, - 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, - 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x6488, 0x0080, - 0x03ff, 0x0116, 0x0002, 0x0080, 0x4000, 0x3fd7, 0x3faf, 0x3f86, - 0x3f5d, 0x3f34, 0x3f0c, 0x3ee3, 0x3eba, 0x3e91, 0x3e68, 0x3e40, - 0x3e17, 0x3dee, 0x3dc5, 0x3d9c, 0x3d74, 0x3d4b, 0x3d22, 0x3cf9, - 0x3cd0, 0x3ca7, 0x3c7f, 0x3c56, 0x3c2d, 0x3c04, 0x3bdb, 0x3bb2, - 0x3b89, 0x3b60, 0x3b37, 0x3b0e, 0x3ae5, 0x3abc, 0x3a93, 0x3a69, - 0x3a40, 0x3a17, 0x39ee, 0x39c5, 0x399c, 0x3972, 0x3949, 0x3920, - 0x38f6, 0x38cd, 0x38a4, 0x387a, 0x3851, 0x3827, 0x37fe, 0x37d4, - 0x37aa, 0x3781, 0x3757, 0x372d, 0x3704, 0x36da, 0x36b0, 0x3686, - 0x365c, 0x3632, 0x3609, 0x35df, 0x35b4, 0x358a, 0x3560, 0x3536, - 0x350c, 0x34e1, 0x34b7, 0x348d, 0x3462, 0x3438, 0x340d, 0x33e3, - 0x33b8, 0x338d, 0x3363, 0x3338, 0x330d, 0x32e2, 0x32b7, 0x328c, - 0x3261, 0x3236, 0x320b, 0x31df, 0x31b4, 0x3188, 0x315d, 0x3131, - 0x3106, 0x30da, 0x30ae, 0x3083, 0x3057, 0x302b, 0x2fff, 0x2fd2, - 0x2fa6, 0x2f7a, 0x2f4d, 0x2f21, 0x2ef4, 0x2ec8, 0x2e9b, 0x2e6e, - 0x2e41, 0x2e14, 0x2de7, 0x2dba, 0x2d8d, 0x2d60, 0x2d32, 0x2d05, - 0x2cd7, 0x2ca9, 0x2c7b, 0x2c4d, 0x2c1f, 0x2bf1, 0x2bc3, 0x2b94, - 0x2b66, 0x2b37, 0x2b09, 0x2ada, 0x2aab, 0x2a7c, 0x2a4c, 0x2a1d, - 0x29ed, 0x29be, 0x298e, 0x295e, 0x292e, 0x28fe, 0x28ce, 0x289d, - 0x286d, 0x283c, 0x280b, 0x27da, 0x27a9, 0x2777, 0x2746, 0x2714, - 0x26e2, 0x26b0, 0x267e, 0x264c, 0x2619, 0x25e7, 0x25b4, 0x2581, - 0x254d, 0x251a, 0x24e6, 0x24b2, 0x247e, 0x244a, 0x2415, 0x23e1, - 0x23ac, 0x2376, 0x2341, 0x230b, 0x22d6, 0x229f, 0x2269, 0x2232, - 0x21fc, 0x21c4, 0x218d, 0x2155, 0x211d, 0x20e5, 0x20ad, 0x2074, - 0x203b, 0x2001, 0x1fc7, 0x1f8d, 0x1f53, 0x1f18, 0x1edd, 0x1ea1, - 0x1e66, 0x1e29, 0x1ded, 0x1db0, 0x1d72, 0x1d35, 0x1cf6, 0x1cb8, - 0x1c79, 0x1c39, 0x1bf9, 0x1bb8, 0x1b77, 0x1b36, 0x1af4, 0x1ab1, - 0x1a6e, 0x1a2a, 0x19e6, 0x19a1, 0x195c, 0x1915, 0x18ce, 0x1887, - 0x183f, 0x17f5, 0x17ac, 0x1761, 0x1715, 0x16c9, 0x167c, 0x162e, - 0x15df, 0x158e, 0x153d, 0x14eb, 0x1497, 0x1442, 0x13ec, 0x1395, - 0x133c, 0x12e2, 0x1286, 0x1228, 0x11c9, 0x1167, 0x1104, 0x109e, - 0x1036, 0x0fcc, 0x0f5f, 0x0eef, 0x0e7b, 0x0e04, 0x0d89, 0x0d0a, - 0x0c86, 0x0bfd, 0x0b6d, 0x0ad6, 0x0a36, 0x098d, 0x08d7, 0x0811, - 0x0736, 0x063e, 0x0519, 0x039a, 0x0000, 0x7fff, 0x0100, 0x0080, - 0x021d, 0x00c8, 0x00ce, 0x0048, 0x0a26, 0x277a, 0x00ce, 0x6488, - 0x14ac, 0x0001, 0x00f9, 0x00fc, 0x00ff, 0x00fc, 0x00f9, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; - -////////////////////////////////////////////////////////////////// - diff --git a/src/chip/dsp1/_dsp1emu.h b/src/chip/dsp1/_dsp1emu.h deleted file mode 100644 index 537ba9a8..00000000 --- a/src/chip/dsp1/_dsp1emu.h +++ /dev/null @@ -1,126 +0,0 @@ -// DSP-1's emulation code -// -// Based on research by Overload, The Dumper, Neviksti and Andreas Naive -// Date: June 2006 - -#ifndef __DSP1EMUL_H -#define __DSP1EMUL_H - -#define DSP1_VERSION 0x0102 - -class Dsp1 -{ - public: - // The DSP-1 status register has 16 bits, but only - // the upper 8 bits can be accessed from an external device, so all these - // positions are referred to the upper byte (bits D8 to D15) - enum SrFlags {DRC=0x04, DRS=0x10, RQM=0x80}; - - // According to Overload's docs, these are the meanings of the flags: - // DRC: The Data Register Control (DRC) bit specifies the data transfer length to and from the host CPU. - // 0: Data transfer to and from the DSP-1 is 16 bits. - // 1: Data transfer to and from the DSP-1 is 8 bits. - // DRS: The Data Register Status (DRS) bit indicates the data transfer status in the case of transfering 16-bit data. - // 0: Data transfer has terminated. - // 1: Data transfer in progress. - // RQM: The Request for Master (RQM) indicates that the DSP1 is requesting host CPU for data read/write. - // 0: Internal Data Register Transfer. - // 1: External Data Register Transfer. - - Dsp1(); - uint8 getSr() const; // return the status register's high byte - uint8 getDr(); - void setDr(uint8 iDr); - void reset(); - - private: - enum FsmMajorState {WAIT_COMMAND, READ_DATA, WRITE_DATA}; - enum MaxDataAccesses {MAX_READS=7, MAX_WRITES=1024}; - - struct Command { - void (Dsp1::*callback)(int16 *, int16 *); - unsigned int reads; - unsigned int writes; - }; - - static const Command mCommandTable[]; - static const int16 MaxAZS_Exp[16]; - static const int16 SinTable[]; - static const int16 MulTable[]; - static const uint16 DataRom[]; - - struct SharedData { // some RAM variables shared between commands - int16 MatrixA[3][3]; // attitude matrix A - int16 MatrixB[3][3]; - int16 MatrixC[3][3]; - int16 CentreX, CentreY, CentreZ; // center of projection - int16 CentreZ_C, CentreZ_E; - int16 VOffset; // vertical offset of the screen with regard to the centre of projection - int16 Les, C_Les, E_Les; - int16 SinAas, CosAas; - int16 SinAzs, CosAzs; - int16 SinAZS, CosAZS; - int16 SecAZS_C1, SecAZS_E1; - int16 SecAZS_C2, SecAZS_E2; - int16 Nx, Ny, Nz; // normal vector to the screen (norm 1, points toward the center of projection) - int16 Gx, Gy, Gz; // center of the screen (global coordinates) - int16 Hx, Hy; // horizontal vector of the screen (Hz=0, norm 1, points toward the right of the screen) - int16 Vx, Vy, Vz; // vertical vector of the screen (norm 1, points toward the top of the screen) - - } shared; - - uint8 mSr; // status register - uint16 mDr; // "internal" representation of the data register - FsmMajorState mFsmMajorState; // current major state of the FSM - uint8 mCommand; // current command processed by the FSM - uint8 mDataCounter; // #uint16 read/writes counter used by the FSM - int16 mReadBuffer[MAX_READS]; - int16 mWriteBuffer[MAX_WRITES]; - bool mFreeze; // need explanation? ;) - - void fsmStep(bool read, uint8 &data); // FSM logic - - // commands - void memoryTest(int16 *input, int16 *output); - void memoryDump(int16 *input, int16 *output); - void memorySize(int16 *input, int16 *output); - void multiply(int16* input, int16* output); - void multiply2(int16* input, int16* output); - void inverse(int16 *input, int16 *output); - void triangle(int16 *input, int16 *output); - void radius(int16 *input, int16 *output); - void range(int16 *input, int16 *output); - void range2(int16 *input, int16 *output); - void distance(int16 *input, int16 *output); - void rotate(int16 *input, int16 *output); - void polar(int16 *input, int16 *output); - void attitudeA(int16 *input, int16 *output); - void attitudeB(int16 *input, int16 *output); - void attitudeC(int16 *input, int16 *output); - void objectiveA(int16 *input, int16 *output); - void objectiveB(int16 *input, int16 *output); - void objectiveC(int16 *input, int16 *output); - void subjectiveA(int16 *input, int16 *output); - void subjectiveB(int16 *input, int16 *output); - void subjectiveC(int16 *input, int16 *output); - void scalarA(int16 *input, int16 *output); - void scalarB(int16 *input, int16 *output); - void scalarC(int16 *input, int16 *output); - void gyrate(int16 *input, int16 *output); - void parameter(int16 *input, int16 *output); - void raster(int16 *input, int16 *output); - void target(int16 *input, int16 *output); - void project(int16 *input, int16 *output); - - // auxiliar functions - int16 sin(int16 Angle); - int16 cos(int16 Angle); - void inverse(int16 Coefficient, int16 Exponent, int16 &iCoefficient, int16 &iExponent); - int16 denormalizeAndClip(int16 C, int16 E); - void normalize(int16 m, int16 &Coefficient, int16 &Exponent); - void normalizeDouble(int32 Product, int16 &Coefficient, int16 &Exponent); - int16 shiftR(int16 C, int16 E); -}; - -#endif - diff --git a/src/chip/dsp1/dsp1.cpp b/src/chip/dsp1/dsp1.cpp index 31539697..314f0445 100644 --- a/src/chip/dsp1/dsp1.cpp +++ b/src/chip/dsp1/dsp1.cpp @@ -24,7 +24,7 @@ void DSP1::reset() { * of expected ranges *****/ bool DSP1::addr_decode(uint16 addr) { - switch(cartridge.cart.dsp1_mapper) { + switch(cartridge.info.dsp1_mapper) { case Cartridge::DSP1_LOROM_1MB: //$[20-3f]:[8000-bfff] = DR, $[20-3f]:[c000-ffff] = SR diff --git a/src/chip/dsp1/dsp1emu.cpp b/src/chip/dsp1/dsp1emu.cpp index 720c7977..61bd4428 100644 --- a/src/chip/dsp1/dsp1emu.cpp +++ b/src/chip/dsp1/dsp1emu.cpp @@ -1,4 +1,4 @@ -// DSP-1's emulation code +// DSP-1's emulation code // // Based on research by Overload, The Dumper, Neviksti and Andreas Naive // Date: June 2006 @@ -859,8 +859,8 @@ const int16 Dsp1::MaxAZS_Exp[16] = { // (Fx, Fy, Fz)-> coordinates of base point (global coordinates) // Lfe-> distance between the base point and the viewpoint (center of projection) // Les-> distance between the base point and the screen -// Aas-> azimuth angle (0º is east; 90ª is north) -// Azs-> zenith angle (0º is zenith) +// Aas-> azimuth angle (0 degrees is east; 90 degrees is north) +// Azs-> zenith angle (0 degrees is zenith) // Output: // Vof-> raster line of imaginary center (whatever it means ;) ) // Vva-> raster line representing the horizon line @@ -1025,7 +1025,7 @@ void Dsp1::parameter(int16 *input, int16 *output) // you consider the "reference case" (center of projection at an unit of height), // the projection of a thin strip containing the raster line will have the same // width (as the raster line would be on the ground in this case, but will suffer a -// change of scale in height (as the ground and the vertical axis would form an angle of 180º-Azs). +// change of scale in height (as the ground and the vertical axis would form an angle of 180-Azs degrees). // This scale factor, when the angle 'center of screen-center of projection-raster line' is small, // can be aproximated by the one of the center of the screen, 1/cos(Azs).(**) (Here is when it's used // SecAZS). By last, you have to consider the effect of the azimuth angle Aas, and you are done. diff --git a/src/cpu/bcpu/bcpu.cpp b/src/cpu/bcpu/bcpu.cpp index d7f8ae3d..6edfd6b3 100644 --- a/src/cpu/bcpu/bcpu.cpp +++ b/src/cpu/bcpu/bcpu.cpp @@ -22,53 +22,23 @@ void bCPU::run() { return; } - if(status.cycle_pos == 0) { - //interrupts only trigger on opcode edges - if(!run_state.irq && !run_state.stp) { + if(status.cycle_pos == 0) { //interrupts only trigger on opcode edges + if(run_state.irq && !run_state.stp) { + run_state.irq = false; if(time.nmi_pending == true) { time.nmi_pending = false; aa.w = (regs.e == false) ? 0xffea : 0xfffa; - run_state.irq = true; } else if(time.irq_pending == true) { time.irq_pending = false; aa.w = (regs.e == false) ? 0xffee : 0xfffe; - run_state.irq = true; } + irq_run(); } } exec_cycle(); } -void bCPU::scanline() { - time.hdma_triggered = (vcounter() <= (!overscan() ? 224 : 239)) ? false : true; - - if(vcounter() == (!overscan() ? 227 : 242) && status.auto_joypad_poll == true) { - snes->poll_input(SNES::DEV_JOYPAD1); - snes->poll_input(SNES::DEV_JOYPAD2); - //When the SNES auto-polls the joypads, it writes 1, then 0 to - //$4016, then reads from each 16 times to get the joypad state - //information. As a result, the joypad read positions are set - //to 16 after such a poll. Position 16 is the controller - //connected status bit. - status.joypad1_read_pos = 16; - status.joypad2_read_pos = 16; - } -} - -void bCPU::frame() { - time.nmi_read = 1; - time.nmi_line = 1; - time.nmi_transition = 0; - - if(cpu_version == 2) { - time.hdmainit_trigger_pos = 12 + dma_counter(); - } else { - time.hdmainit_trigger_pos = 12 + 8 - dma_counter(); - } - time.hdmainit_triggered = false; -} - void bCPU::power() { region = snes->region(); diff --git a/src/cpu/bcpu/bcpu.h b/src/cpu/bcpu/bcpu.h index fd0dbef4..41e802c0 100644 --- a/src/cpu/bcpu/bcpu.h +++ b/src/cpu/bcpu/bcpu.h @@ -83,8 +83,6 @@ struct { inline uint8 pio_status(); inline void run(); inline uint32 clocks_executed(); - inline void scanline(); - inline void frame(); inline void power(); inline void reset(); diff --git a/src/cpu/bcpu/bcpu_exec.cpp b/src/cpu/bcpu/bcpu_exec.cpp index 427f9e4f..9e22e43e 100644 --- a/src/cpu/bcpu/bcpu_exec.cpp +++ b/src/cpu/bcpu/bcpu_exec.cpp @@ -1,8 +1,8 @@ void bCPU::last_cycle() { -//DMV27: keep previous nmi value, -//to allow wai and irq to work properly time.nmi_pending |= nmi_test(); time.irq_pending |= irq_test(); + + run_state.irq = (time.nmi_pending || time.irq_pending); } void bCPU::pre_exec_cycle() { @@ -139,12 +139,6 @@ static int z; } void bCPU::exec_cycle() { -//irq active? run one bus cycle of the irq event and return - if(run_state.irq) { - irq_run(); - return; - } - if(status.cycle_pos) { (this->*optbl[status.opcode])(); #ifdef DEBUGGER @@ -159,7 +153,7 @@ void bCPU::exec_cycle() { #ifdef DEBUGGER snes->notify(SNES::CPU_EXEC_OPCODE_BEGIN); #endif - status.opcode = op_read(); + status.opcode = op_readpc(); status.cycle_pos = 1; } diff --git a/src/cpu/bcpu/bcpu_int.cpp b/src/cpu/bcpu/bcpu_int.cpp index 3c4e8b69..8dc97742 100644 --- a/src/cpu/bcpu/bcpu_int.cpp +++ b/src/cpu/bcpu/bcpu_int.cpp @@ -1,57 +1,20 @@ -/* -[IRQ cycles] - [0] pbr,pc ; opcode - [1] pbr,pc ; io - [2] 0,s ; pbr - [3] 0,s-1 ; pch - [4] 0,s-2 ; pcl - [5] 0,s-3 ; p - [6] 0,va ; aavl - [7] 0,va+1 ; aavh -*/ void bCPU::irq_run() { -//WDC documentation is incorrect, first cycle -//is a memory read fetch from PBR:PC - switch(status.cycle_pos++) { - case 0: - //read from PBR:PC, but do not increment PC counter - mem_read(regs.pc.d); - break; - case 1: - cpu_io(); - if(regs.e)status.cycle_pos++; - break; - case 2: - stack_write(regs.pc.b); - break; - case 3: - stack_write(regs.pc.h); - break; - case 4: - stack_write(regs.pc.l); - break; - case 5: - //emulation-mode irqs clear brk bit 0x10 - stack_write(regs.e ? (regs.p & ~0x10) : regs.p); - break; - case 6: - //todo: test if NMI can override IRQ here... - rd.l = op_read(OPMODE_ADDR, aa.w); - regs.pc.b = 0x00; - regs.p.i = 1; - regs.p.d = 0; - break; - case 7: - rd.h = op_read(OPMODE_ADDR, aa.w + 1); - regs.pc.w = rd.w; - #ifdef DEBUGGER - //let debugger know the new IRQ opcode address - snes->notify(SNES::CPU_EXEC_OPCODE_END); - #endif - status.cycle_pos = 0; - run_state.irq = false; - break; - } + mem_read(regs.pc.d); + cpu_io(); + if(!regs.e)op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.e ? (regs.p & ~0x10) : regs.p); + rd.l = op_readaddr(aa.w + 0); + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; + rd.h = op_readaddr(aa.w + 1); + regs.pc.w = rd.w; +#ifdef DEBUGGER +//let debugger know the new IRQ opcode address + snes->notify(SNES::CPU_EXEC_OPCODE_END); +#endif } bool bCPU::nmi_test() { diff --git a/src/cpu/bcpu/core/core.cpp b/src/cpu/bcpu/core/core.cpp index cdbbb5cb..0b58b188 100644 --- a/src/cpu/bcpu/core/core.cpp +++ b/src/cpu/bcpu/core/core.cpp @@ -23,68 +23,6 @@ void bCPU::cpu_c6(uint16 addr) { } } -uint32 bCPU::op_addr(uint8 mode, uint32 addr) { - switch(mode) { - case OPMODE_ADDR: - addr &= 0xffff; - break; - case OPMODE_LONG: - addr &= 0xffffff; - break; - case OPMODE_DBR: - addr = ((regs.db << 16) + addr) & 0xffffff; - break; - case OPMODE_PBR: - addr &= 0xffff; - addr = (regs.pc.b << 16) + addr; - break; - case OPMODE_DP: - addr &= 0xffff; - addr = (regs.d + addr) & 0xffff; - break; - case OPMODE_SP: - addr &= 0xffff; - addr = (regs.s + addr) & 0xffff; - break; - } - return addr; -} - -uint8 bCPU::op_read() { -uint8 r; - r = mem_read(regs.pc.d); - regs.pc.w++; - return r; -} - -uint8 bCPU::op_read(uint8 mode, uint32 addr) { - addr = op_addr(mode, addr); - return mem_read(addr); -} - -void bCPU::op_write(uint8 mode, uint32 addr, uint8 value) { - addr = op_addr(mode, addr); - mem_write(addr, value); -} - -uint8 bCPU::stack_read() { - if(regs.e) { - regs.s.l++; - } else { - regs.s.w++; - } - return mem_read(regs.s); -} - -void bCPU::stack_write(uint8 value) { - mem_write(regs.s, value); - if(regs.e) { - regs.s.l--; - } else { - regs.s.w--; - } -} - void bCPU::init_op_tables() { #include "optable.cpp" } diff --git a/src/cpu/bcpu/core/core.h b/src/cpu/bcpu/core/core.h index 08ffffc9..f4ad7598 100644 --- a/src/cpu/bcpu/core/core.h +++ b/src/cpu/bcpu/core/core.h @@ -57,18 +57,6 @@ uint8 dp, sp; inline void cpu_c4(uint16 x, uint16 y); inline void cpu_c6(uint16 addr); -enum { - OPMODE_ADDR, OPMODE_LONG, - OPMODE_DBR, OPMODE_PBR, - OPMODE_DP, OPMODE_SP -}; - inline uint32 op_addr(uint8 mode, uint32 addr); - inline uint8 op_read(); - inline uint8 op_read(uint8 mode, uint32 addr); - inline void op_write(uint8 mode, uint32 addr, uint8 value); - inline uint8 stack_read(); - inline void stack_write(uint8 value); - inline void init_op_tables(); #include "op.h" diff --git a/src/cpu/bcpu/core/op_misc.b b/src/cpu/bcpu/core/op_misc.b index b939dfeb..a1ac8625 100644 --- a/src/cpu/bcpu/core/op_misc.b +++ b/src/cpu/bcpu/core/op_misc.b @@ -5,7 +5,7 @@ nop(0xea) { wdm(0x42) { 1:last_cycle(); - op_read(); + op_readpc(); } xba(0xeb) { @@ -21,11 +21,11 @@ xba(0xeb) { mvn(0x54, ++), mvp(0x44, --) { -1:dp = op_read(); -2:sp = op_read(); +1:dp = op_readpc(); +2:sp = op_readpc(); 3:regs.db = dp; - rd.l = op_read(OPMODE_LONG, (sp << 16) | regs.x.w); -4:op_write(OPMODE_LONG, (dp << 16) | regs.y.w, rd.l); + rd.l = op_readlong((sp << 16) | regs.x.w); +4:op_writelong((dp << 16) | regs.y.w, rd.l); 5:cpu_io(); if(regs.p.x) { regs.x.l$1; regs.y.l$1; } else { regs.x.w$1; regs.y.w$1; } @@ -36,18 +36,18 @@ mvp(0x44, --) { brk(0x00, 0xfffe, 0xffff, 0xffe6, 0xffe7), cop(0x02, 0xfff4, 0xfff5, 0xffe4, 0xffe5) { -1:op_read(); +1:op_readpc(); if(regs.e)skip; -2:stack_write(regs.pc.b); -3:stack_write(regs.pc.h); -4:stack_write(regs.pc.l); -5:stack_write(regs.p); -6:rd.l = op_read(OPMODE_LONG, (regs.e) ? $1 : $3); +2:op_writestack(regs.pc.b); +3:op_writestack(regs.pc.h); +4:op_writestack(regs.pc.l); +5:op_writestack(regs.p); +6:rd.l = op_readlong((regs.e) ? $1 : $3); regs.pc.b = 0x00; regs.p.i = 1; regs.p.d = 0; 7:last_cycle(); - rd.h = op_read(OPMODE_LONG, (regs.e) ? $2 : $4); + rd.h = op_readlong((regs.e) ? $2 : $4); regs.pc.w = rd.w; } @@ -104,7 +104,7 @@ sei(0x78, regs.p.i = 1) { rep(0xc2, &=~), sep(0xe2, |=) { -1:rd.l = op_read(); +1:rd.l = op_readpc(); 2:last_cycle(); cpu_io(); regs.p $1 rd.l; @@ -200,9 +200,9 @@ phy(0x5a, regs.p.x, y), phd(0x0b, 0, d) { 1:cpu_io(); if($1)skip; -2:stack_write(regs.$2.h); +2:op_writestack(regs.$2.h); 3:last_cycle(); - stack_write(regs.$2.l); + op_writestack(regs.$2.l); } phb(0x8b, regs.db), @@ -210,7 +210,7 @@ phk(0x4b, regs.pc.b), php(0x08, regs.p) { 1:cpu_io(); 2:last_cycle(); - stack_write($1); + op_writestack($1); } pla(0x68, regs.p.m, a), @@ -220,14 +220,14 @@ pld(0x2b, 0, d) { 1:cpu_io(); 2:cpu_io(); 3:if($1)last_cycle(); - regs.$2.l = stack_read(); + regs.$2.l = op_readstack(); if($1) { regs.p.n = !!(regs.$2.l & 0x80); regs.p.z = (regs.$2.l == 0); end; } 4:last_cycle(); - regs.$2.h = stack_read(); + regs.$2.h = op_readstack(); regs.p.n = !!(regs.$2.w & 0x8000); regs.p.z = (regs.$2.w == 0); } @@ -236,7 +236,7 @@ plb(0xab) { 1:cpu_io(); 2:cpu_io(); 3:last_cycle(); - regs.db = stack_read(); + regs.db = op_readstack(); regs.p.n = !!(regs.db & 0x80); regs.p.z = (regs.db == 0); } @@ -245,7 +245,7 @@ plp(0x28) { 1:cpu_io(); 2:cpu_io(); 3:last_cycle(); - regs.p = stack_read(); + regs.p = op_readstack(); if(regs.e)regs.p |= 0x30; if(regs.p.x) { regs.x.h = 0x00; @@ -254,29 +254,29 @@ plp(0x28) { } pea(0xf4) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:stack_write(aa.h); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:op_writestack(aa.h); 4:last_cycle(); - stack_write(aa.l); + op_writestack(aa.l); } pei(0xd4) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); -5:stack_write(aa.h); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); +5:op_writestack(aa.h); 6:last_cycle(); - stack_write(aa.l); + op_writestack(aa.l); } per(0x62) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_io(); rd.w = regs.pc.d + (int16)aa.w; -4:stack_write(rd.h); +4:op_writestack(rd.h); 5:last_cycle(); - stack_write(rd.l); + op_writestack(rd.l); } diff --git a/src/cpu/bcpu/core/op_misc.cpp b/src/cpu/bcpu/core/op_misc.cpp index 75c3b57b..85acb876 100644 --- a/src/cpu/bcpu/core/op_misc.cpp +++ b/src/cpu/bcpu/core/op_misc.cpp @@ -12,7 +12,7 @@ void bCPU::op_wdm() { switch(status.cycle_pos++) { case 1: { last_cycle(); - op_read(); + op_readpc(); status.cycle_pos = 0; } break; } @@ -39,17 +39,17 @@ void bCPU::op_xba() { void bCPU::op_mvn() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { - sp = op_read(); + sp = op_readpc(); } break; case 3: { regs.db = dp; - rd.l = op_read(OPMODE_LONG, (sp << 16) | regs.x.w); + rd.l = op_readlong((sp << 16) | regs.x.w); } break; case 4: { - op_write(OPMODE_LONG, (dp << 16) | regs.y.w, rd.l); + op_writelong((dp << 16) | regs.y.w, rd.l); } break; case 5: { cpu_io(); @@ -68,17 +68,17 @@ void bCPU::op_mvn() { void bCPU::op_mvp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { - sp = op_read(); + sp = op_readpc(); } break; case 3: { regs.db = dp; - rd.l = op_read(OPMODE_LONG, (sp << 16) | regs.x.w); + rd.l = op_readlong((sp << 16) | regs.x.w); } break; case 4: { - op_write(OPMODE_LONG, (dp << 16) | regs.y.w, rd.l); + op_writelong((dp << 16) | regs.y.w, rd.l); } break; case 5: { cpu_io(); @@ -97,30 +97,30 @@ void bCPU::op_mvp() { void bCPU::op_brk() { switch(status.cycle_pos++) { case 1: { - op_read(); + op_readpc(); if(regs.e)status.cycle_pos++; } break; case 2: { - stack_write(regs.pc.b); + op_writestack(regs.pc.b); } break; case 3: { - stack_write(regs.pc.h); + op_writestack(regs.pc.h); } break; case 4: { - stack_write(regs.pc.l); + op_writestack(regs.pc.l); } break; case 5: { - stack_write(regs.p); + op_writestack(regs.p); } break; case 6: { - rd.l = op_read(OPMODE_LONG, (regs.e) ? 0xfffe : 0xffe6); + rd.l = op_readlong((regs.e) ? 0xfffe : 0xffe6); regs.pc.b = 0x00; regs.p.i = 1; regs.p.d = 0; } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, (regs.e) ? 0xffff : 0xffe7); + rd.h = op_readlong((regs.e) ? 0xffff : 0xffe7); regs.pc.w = rd.w; status.cycle_pos = 0; } break; @@ -130,30 +130,30 @@ void bCPU::op_brk() { void bCPU::op_cop() { switch(status.cycle_pos++) { case 1: { - op_read(); + op_readpc(); if(regs.e)status.cycle_pos++; } break; case 2: { - stack_write(regs.pc.b); + op_writestack(regs.pc.b); } break; case 3: { - stack_write(regs.pc.h); + op_writestack(regs.pc.h); } break; case 4: { - stack_write(regs.pc.l); + op_writestack(regs.pc.l); } break; case 5: { - stack_write(regs.p); + op_writestack(regs.p); } break; case 6: { - rd.l = op_read(OPMODE_LONG, (regs.e) ? 0xfff4 : 0xffe4); + rd.l = op_readlong((regs.e) ? 0xfff4 : 0xffe4); regs.pc.b = 0x00; regs.p.i = 1; regs.p.d = 0; } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, (regs.e) ? 0xfff5 : 0xffe5); + rd.h = op_readlong((regs.e) ? 0xfff5 : 0xffe5); regs.pc.w = rd.w; status.cycle_pos = 0; } break; @@ -302,7 +302,7 @@ void bCPU::op_sei() { void bCPU::op_rep() { switch(status.cycle_pos++) { case 1: { - rd.l = op_read(); + rd.l = op_readpc(); } break; case 2: { last_cycle(); @@ -321,7 +321,7 @@ void bCPU::op_rep() { void bCPU::op_sep() { switch(status.cycle_pos++) { case 1: { - rd.l = op_read(); + rd.l = op_readpc(); } break; case 2: { last_cycle(); @@ -548,11 +548,11 @@ void bCPU::op_pha() { if(regs.p.m)status.cycle_pos++; } break; case 2: { - stack_write(regs.a.h); + op_writestack(regs.a.h); } break; case 3: { last_cycle(); - stack_write(regs.a.l); + op_writestack(regs.a.l); status.cycle_pos = 0; } break; } @@ -565,11 +565,11 @@ void bCPU::op_phx() { if(regs.p.x)status.cycle_pos++; } break; case 2: { - stack_write(regs.x.h); + op_writestack(regs.x.h); } break; case 3: { last_cycle(); - stack_write(regs.x.l); + op_writestack(regs.x.l); status.cycle_pos = 0; } break; } @@ -582,11 +582,11 @@ void bCPU::op_phy() { if(regs.p.x)status.cycle_pos++; } break; case 2: { - stack_write(regs.y.h); + op_writestack(regs.y.h); } break; case 3: { last_cycle(); - stack_write(regs.y.l); + op_writestack(regs.y.l); status.cycle_pos = 0; } break; } @@ -599,11 +599,11 @@ void bCPU::op_phd() { if(0)status.cycle_pos++; } break; case 2: { - stack_write(regs. d.h); + op_writestack(regs. d.h); } break; case 3: { last_cycle(); - stack_write(regs. d.l); + op_writestack(regs. d.l); status.cycle_pos = 0; } break; } @@ -616,7 +616,7 @@ void bCPU::op_phb() { } break; case 2: { last_cycle(); - stack_write(regs.db); + op_writestack(regs.db); status.cycle_pos = 0; } break; } @@ -629,7 +629,7 @@ void bCPU::op_phk() { } break; case 2: { last_cycle(); - stack_write(regs.pc.b); + op_writestack(regs.pc.b); status.cycle_pos = 0; } break; } @@ -642,7 +642,7 @@ void bCPU::op_php() { } break; case 2: { last_cycle(); - stack_write(regs.p); + op_writestack(regs.p); status.cycle_pos = 0; } break; } @@ -658,7 +658,7 @@ void bCPU::op_pla() { } break; case 3: { if(regs.p.m)last_cycle(); - regs.a.l = stack_read(); + regs.a.l = op_readstack(); if(regs.p.m) { regs.p.n = !!(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); @@ -667,7 +667,7 @@ void bCPU::op_pla() { } break; case 4: { last_cycle(); - regs.a.h = stack_read(); + regs.a.h = op_readstack(); regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); status.cycle_pos = 0; @@ -685,7 +685,7 @@ void bCPU::op_plx() { } break; case 3: { if(regs.p.x)last_cycle(); - regs.x.l = stack_read(); + regs.x.l = op_readstack(); if(regs.p.x) { regs.p.n = !!(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); @@ -694,7 +694,7 @@ void bCPU::op_plx() { } break; case 4: { last_cycle(); - regs.x.h = stack_read(); + regs.x.h = op_readstack(); regs.p.n = !!(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); status.cycle_pos = 0; @@ -712,7 +712,7 @@ void bCPU::op_ply() { } break; case 3: { if(regs.p.x)last_cycle(); - regs.y.l = stack_read(); + regs.y.l = op_readstack(); if(regs.p.x) { regs.p.n = !!(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); @@ -721,7 +721,7 @@ void bCPU::op_ply() { } break; case 4: { last_cycle(); - regs.y.h = stack_read(); + regs.y.h = op_readstack(); regs.p.n = !!(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); status.cycle_pos = 0; @@ -739,7 +739,7 @@ void bCPU::op_pld() { } break; case 3: { if(0)last_cycle(); - regs. d.l = stack_read(); + regs. d.l = op_readstack(); if(0) { regs.p.n = !!(regs. d.l & 0x80); regs.p.z = (regs. d.l == 0); @@ -748,7 +748,7 @@ void bCPU::op_pld() { } break; case 4: { last_cycle(); - regs. d.h = stack_read(); + regs. d.h = op_readstack(); regs.p.n = !!(regs. d.w & 0x8000); regs.p.z = (regs. d.w == 0); status.cycle_pos = 0; @@ -766,7 +766,7 @@ void bCPU::op_plb() { } break; case 3: { last_cycle(); - regs.db = stack_read(); + regs.db = op_readstack(); regs.p.n = !!(regs.db & 0x80); regs.p.z = (regs.db == 0); status.cycle_pos = 0; @@ -784,7 +784,7 @@ void bCPU::op_plp() { } break; case 3: { last_cycle(); - regs.p = stack_read(); + regs.p = op_readstack(); if(regs.e)regs.p |= 0x30; if(regs.p.x) { regs.x.h = 0x00; @@ -798,17 +798,17 @@ void bCPU::op_plp() { void bCPU::op_pea() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - stack_write(aa.h); + op_writestack(aa.h); } break; case 4: { last_cycle(); - stack_write(aa.l); + op_writestack(aa.l); status.cycle_pos = 0; } break; } @@ -817,23 +817,23 @@ void bCPU::op_pea() { void bCPU::op_pei() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - stack_write(aa.h); + op_writestack(aa.h); } break; case 6: { last_cycle(); - stack_write(aa.l); + op_writestack(aa.l); status.cycle_pos = 0; } break; } @@ -842,21 +842,21 @@ void bCPU::op_pei() { void bCPU::op_per() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); rd.w = regs.pc.d + (int16)aa.w; } break; case 4: { - stack_write(rd.h); + op_writestack(rd.h); } break; case 5: { last_cycle(); - stack_write(rd.l); + op_writestack(rd.l); status.cycle_pos = 0; } break; } diff --git a/src/cpu/bcpu/core/op_pc.b b/src/cpu/bcpu/core/op_pc.b index cad17d60..33b69c5e 100644 --- a/src/cpu/bcpu/core/op_pc.b +++ b/src/cpu/bcpu/core/op_pc.b @@ -7,7 +7,7 @@ bmi(0x30, regs.p.n), bvc(0x50, !regs.p.v), bvs(0x70, regs.p.v) { 1:if(!$1)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if($1) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -20,7 +20,7 @@ bvs(0x70, regs.p.v) { } bra(0x80) { -1:rd.l = op_read(); +1:rd.l = op_readpc(); aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; 2:cpu_c6(aa.w); @@ -29,119 +29,119 @@ bra(0x80) { } brl(0x82) { -1:rd.l = op_read(); -2:rd.h = op_read(); +1:rd.l = op_readpc(); +2:rd.h = op_readpc(); 3:last_cycle(); cpu_io(); regs.pc.w = regs.pc.d + (int16)rd.w; } jmp_addr(0x4c) { -1:rd.l = op_read(); +1:rd.l = op_readpc(); 2:last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); regs.pc.w = rd.w; } jmp_long(0x5c) { -1:rd.l = op_read(); -2:rd.h = op_read(); +1:rd.l = op_readpc(); +2:rd.h = op_readpc(); 3:last_cycle(); - rd.b = op_read(); + rd.b = op_readpc(); regs.pc.d = rd.d & 0xffffff; } jmp_iaddr(0x6c) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:rd.l = op_read(OPMODE_ADDR, aa.w); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:rd.l = op_readaddr(aa.w); 4:last_cycle(); - rd.h = op_read(OPMODE_ADDR, aa.w + 1); + rd.h = op_readaddr(aa.w + 1); regs.pc.w = rd.w; } jmp_iaddrx(0x7c) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_io(); -4:rd.l = op_read(OPMODE_PBR, aa.w + regs.x.w); +4:rd.l = op_readpbr(aa.w + regs.x.w); 5:last_cycle(); - rd.h = op_read(OPMODE_PBR, aa.w + regs.x.w + 1); + rd.h = op_readpbr(aa.w + regs.x.w + 1); regs.pc.w = rd.w; } jmp_iladdr(0xdc) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:rd.l = op_read(OPMODE_ADDR, aa.w); -4:rd.h = op_read(OPMODE_ADDR, aa.w + 1); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:rd.l = op_readaddr(aa.w); +4:rd.h = op_readaddr(aa.w + 1); 5:last_cycle(); - rd.b = op_read(OPMODE_ADDR, aa.w + 2); + rd.b = op_readaddr(aa.w + 2); regs.pc.d = rd.d & 0xffffff; } jsr_addr(0x20) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_io(); 4:regs.pc.w--; - stack_write(regs.pc.h); + op_writestack(regs.pc.h); 5:last_cycle(); - stack_write(regs.pc.l); + op_writestack(regs.pc.l); regs.pc.w = aa.w; } jsr_long(0x22) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:stack_write(regs.pc.b); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:op_writestack(regs.pc.b); 4:cpu_io(); -5:aa.b = op_read(); +5:aa.b = op_readpc(); 6:regs.pc.w--; - stack_write(regs.pc.h); + op_writestack(regs.pc.h); 7:last_cycle(); - stack_write(regs.pc.l); + op_writestack(regs.pc.l); regs.pc.d = aa.d & 0xffffff; } jsr_iaddrx(0xfc) { -1:aa.l = op_read(); -2:stack_write(regs.pc.h); -3:stack_write(regs.pc.l); -4:aa.h = op_read(); +1:aa.l = op_readpc(); +2:op_writestack(regs.pc.h); +3:op_writestack(regs.pc.l); +4:aa.h = op_readpc(); 5:cpu_io(); -6:rd.l = op_read(OPMODE_PBR, aa.w + regs.x.w); +6:rd.l = op_readpbr(aa.w + regs.x.w); 7:last_cycle(); - rd.h = op_read(OPMODE_PBR, aa.w + regs.x.w + 1); + rd.h = op_readpbr(aa.w + regs.x.w + 1); regs.pc.w = rd.w; } rti(0x40) { 1:cpu_io(); 2:cpu_io(); -3:regs.p = stack_read(); +3:regs.p = op_readstack(); if(regs.e)regs.p |= 0x30; if(regs.p.x) { regs.x.h = 0x00; regs.y.h = 0x00; } -4:rd.l = stack_read(); +4:rd.l = op_readstack(); 5:if(regs.e)last_cycle(); - rd.h = stack_read(); + rd.h = op_readstack(); if(regs.e) { regs.pc.w = rd.w; end; } 6:last_cycle(); - rd.b = stack_read(); + rd.b = op_readstack(); regs.pc.d = rd.d & 0xffffff; } rts(0x60) { 1:cpu_io(); 2:cpu_io(); -3:rd.l = stack_read(); -4:rd.h = stack_read(); +3:rd.l = op_readstack(); +4:rd.h = op_readstack(); 5:last_cycle(); cpu_io(); regs.pc.w = rd.w; @@ -151,10 +151,10 @@ rts(0x60) { rtl(0x6b) { 1:cpu_io(); 2:cpu_io(); -3:rd.l = stack_read(); -4:rd.h = stack_read(); +3:rd.l = op_readstack(); +4:rd.h = op_readstack(); 5:last_cycle(); - rd.b = stack_read(); + rd.b = op_readstack(); regs.pc.d = rd.d & 0xffffff; regs.pc.w++; } diff --git a/src/cpu/bcpu/core/op_pc.cpp b/src/cpu/bcpu/core/op_pc.cpp index 13f7bd9f..5f4046f2 100644 --- a/src/cpu/bcpu/core/op_pc.cpp +++ b/src/cpu/bcpu/core/op_pc.cpp @@ -2,7 +2,7 @@ void bCPU::op_bcc() { switch(status.cycle_pos++) { case 1: { if(!!regs.p.c)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(!regs.p.c) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -25,7 +25,7 @@ void bCPU::op_bcs() { switch(status.cycle_pos++) { case 1: { if(!regs.p.c)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.c) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -48,7 +48,7 @@ void bCPU::op_bne() { switch(status.cycle_pos++) { case 1: { if(!!regs.p.z)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(!regs.p.z) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -71,7 +71,7 @@ void bCPU::op_beq() { switch(status.cycle_pos++) { case 1: { if(!regs.p.z)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.z) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -94,7 +94,7 @@ void bCPU::op_bpl() { switch(status.cycle_pos++) { case 1: { if(!!regs.p.n)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(!regs.p.n) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -117,7 +117,7 @@ void bCPU::op_bmi() { switch(status.cycle_pos++) { case 1: { if(!regs.p.n)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.n) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -140,7 +140,7 @@ void bCPU::op_bvc() { switch(status.cycle_pos++) { case 1: { if(!!regs.p.v)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(!regs.p.v) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -163,7 +163,7 @@ void bCPU::op_bvs() { switch(status.cycle_pos++) { case 1: { if(!regs.p.v)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.v) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; @@ -185,7 +185,7 @@ void bCPU::op_bvs() { void bCPU::op_bra() { switch(status.cycle_pos++) { case 1: { - rd.l = op_read(); + rd.l = op_readpc(); aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } break; @@ -203,10 +203,10 @@ void bCPU::op_bra() { void bCPU::op_brl() { switch(status.cycle_pos++) { case 1: { - rd.l = op_read(); + rd.l = op_readpc(); } break; case 2: { - rd.h = op_read(); + rd.h = op_readpc(); } break; case 3: { last_cycle(); @@ -220,11 +220,11 @@ void bCPU::op_brl() { void bCPU::op_jmp_addr() { switch(status.cycle_pos++) { case 1: { - rd.l = op_read(); + rd.l = op_readpc(); } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); regs.pc.w = rd.w; status.cycle_pos = 0; } break; @@ -234,14 +234,14 @@ void bCPU::op_jmp_addr() { void bCPU::op_jmp_long() { switch(status.cycle_pos++) { case 1: { - rd.l = op_read(); + rd.l = op_readpc(); } break; case 2: { - rd.h = op_read(); + rd.h = op_readpc(); } break; case 3: { last_cycle(); - rd.b = op_read(); + rd.b = op_readpc(); regs.pc.d = rd.d & 0xffffff; status.cycle_pos = 0; } break; @@ -251,17 +251,17 @@ void bCPU::op_jmp_long() { void bCPU::op_jmp_iaddr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_ADDR, aa.w); + rd.l = op_readaddr(aa.w); } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_ADDR, aa.w + 1); + rd.h = op_readaddr(aa.w + 1); regs.pc.w = rd.w; status.cycle_pos = 0; } break; @@ -271,20 +271,20 @@ void bCPU::op_jmp_iaddr() { void bCPU::op_jmp_iaddrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_PBR, aa.w + regs.x.w); + rd.l = op_readpbr(aa.w + regs.x.w); } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_PBR, aa.w + regs.x.w + 1); + rd.h = op_readpbr(aa.w + regs.x.w + 1); regs.pc.w = rd.w; status.cycle_pos = 0; } break; @@ -294,20 +294,20 @@ void bCPU::op_jmp_iaddrx() { void bCPU::op_jmp_iladdr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_ADDR, aa.w); + rd.l = op_readaddr(aa.w); } break; case 4: { - rd.h = op_read(OPMODE_ADDR, aa.w + 1); + rd.h = op_readaddr(aa.w + 1); } break; case 5: { last_cycle(); - rd.b = op_read(OPMODE_ADDR, aa.w + 2); + rd.b = op_readaddr(aa.w + 2); regs.pc.d = rd.d & 0xffffff; status.cycle_pos = 0; } break; @@ -317,21 +317,21 @@ void bCPU::op_jmp_iladdr() { void bCPU::op_jsr_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { regs.pc.w--; - stack_write(regs.pc.h); + op_writestack(regs.pc.h); } break; case 5: { last_cycle(); - stack_write(regs.pc.l); + op_writestack(regs.pc.l); regs.pc.w = aa.w; status.cycle_pos = 0; } break; @@ -341,27 +341,27 @@ void bCPU::op_jsr_addr() { void bCPU::op_jsr_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - stack_write(regs.pc.b); + op_writestack(regs.pc.b); } break; case 4: { cpu_io(); } break; case 5: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 6: { regs.pc.w--; - stack_write(regs.pc.h); + op_writestack(regs.pc.h); } break; case 7: { last_cycle(); - stack_write(regs.pc.l); + op_writestack(regs.pc.l); regs.pc.d = aa.d & 0xffffff; status.cycle_pos = 0; } break; @@ -371,26 +371,26 @@ void bCPU::op_jsr_long() { void bCPU::op_jsr_iaddrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - stack_write(regs.pc.h); + op_writestack(regs.pc.h); } break; case 3: { - stack_write(regs.pc.l); + op_writestack(regs.pc.l); } break; case 4: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 5: { cpu_io(); } break; case 6: { - rd.l = op_read(OPMODE_PBR, aa.w + regs.x.w); + rd.l = op_readpbr(aa.w + regs.x.w); } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_PBR, aa.w + regs.x.w + 1); + rd.h = op_readpbr(aa.w + regs.x.w + 1); regs.pc.w = rd.w; status.cycle_pos = 0; } break; @@ -406,7 +406,7 @@ void bCPU::op_rti() { cpu_io(); } break; case 3: { - regs.p = stack_read(); + regs.p = op_readstack(); if(regs.e)regs.p |= 0x30; if(regs.p.x) { regs.x.h = 0x00; @@ -414,11 +414,11 @@ void bCPU::op_rti() { } } break; case 4: { - rd.l = stack_read(); + rd.l = op_readstack(); } break; case 5: { if(regs.e)last_cycle(); - rd.h = stack_read(); + rd.h = op_readstack(); if(regs.e) { regs.pc.w = rd.w; status.cycle_pos = 0; @@ -426,7 +426,7 @@ void bCPU::op_rti() { } break; case 6: { last_cycle(); - rd.b = stack_read(); + rd.b = op_readstack(); regs.pc.d = rd.d & 0xffffff; status.cycle_pos = 0; } break; @@ -442,10 +442,10 @@ void bCPU::op_rts() { cpu_io(); } break; case 3: { - rd.l = stack_read(); + rd.l = op_readstack(); } break; case 4: { - rd.h = stack_read(); + rd.h = op_readstack(); } break; case 5: { last_cycle(); @@ -466,14 +466,14 @@ void bCPU::op_rtl() { cpu_io(); } break; case 3: { - rd.l = stack_read(); + rd.l = op_readstack(); } break; case 4: { - rd.h = stack_read(); + rd.h = op_readstack(); } break; case 5: { last_cycle(); - rd.b = stack_read(); + rd.b = op_readstack(); regs.pc.d = rd.d & 0xffffff; regs.pc.w++; status.cycle_pos = 0; diff --git a/src/cpu/bcpu/core/op_read.b b/src/cpu/bcpu/core/op_read.b index 6cb88746..ca2de7aa 100644 --- a/src/cpu/bcpu/core/op_read.b +++ b/src/cpu/bcpu/core/op_read.b @@ -10,10 +10,10 @@ ldy_const(0xa0, ldy, regs.p.x), ora_const(0x09, ora, regs.p.m), sbc_const(0xe9, sbc, regs.p.m) { 1:if($2)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if($2) { op_$1_b(); end; } 2:last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_$1_w(); } @@ -29,13 +29,13 @@ ldx_addr(0xae, ldx, regs.p.x), ldy_addr(0xac, ldy, regs.p.x), ora_addr(0x0d, ora, regs.p.m), sbc_addr(0xed, sbc, regs.p.m) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:if($2)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if($2) { op_$1_b(); end; } 4:last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_$1_w(); } @@ -48,14 +48,14 @@ lda_addrx(0xbd, lda, regs.p.m), ldy_addrx(0xbc, ldy, regs.p.x), ora_addrx(0x1d, ora, regs.p.m), sbc_addrx(0xfd, sbc, regs.p.m) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_c4(aa.w, aa.w + regs.x.w); 4:if($2)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if($2) { op_$1_b(); end; } 5:last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_$1_w(); } @@ -67,14 +67,14 @@ lda_addry(0xb9, lda, regs.p.m), ldx_addry(0xbe, ldx, regs.p.x), ora_addry(0x19, ora, regs.p.m), sbc_addry(0xf9, sbc, regs.p.m) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_c4(aa.w, aa.w + regs.y.w); 4:if($2)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if($2) { op_$1_b(); end; } 5:last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_$1_w(); } @@ -85,14 +85,14 @@ eor_long(0x4f, eor, regs.p.m), lda_long(0xaf, lda, regs.p.m), ora_long(0x0f, ora, regs.p.m), sbc_long(0xef, sbc, regs.p.m) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:aa.b = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:aa.b = op_readpc(); 4:if($2)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if($2) { op_$1_b(); end; } 5:last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_$1_w(); } @@ -103,14 +103,14 @@ eor_longx(0x5f, eor, regs.p.m), lda_longx(0xbf, lda, regs.p.m), ora_longx(0x1f, ora, regs.p.m), sbc_longx(0xff, sbc, regs.p.m) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:aa.b = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:aa.b = op_readpc(); 4:if($2)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if($2) { op_$1_b(); end; } 5:last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_$1_w(); } @@ -126,13 +126,13 @@ ldx_dp(0xa6, ldx, regs.p.x), ldy_dp(0xa4, ldy, regs.p.x), ora_dp(0x05, ora, regs.p.m), sbc_dp(0xe5, sbc, regs.p.m) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:if($2)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if($2) { op_$1_b(); end; } 4:last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_$1_w(); } @@ -145,26 +145,26 @@ lda_dpx(0xb5, lda, regs.p.m), ldy_dpx(0xb4, ldy, regs.p.x), ora_dpx(0x15, ora, regs.p.m), sbc_dpx(0xf5, sbc, regs.p.m) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:cpu_io(); 4:if($2)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if($2) { op_$1_b(); end; } 5:last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_$1_w(); } ldx_dpy(0xb6, ldx, regs.p.x) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:cpu_io(); 4:if($2)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.y.w); + rd.l = op_readdp(dp + regs.y.w); if($2) { op_$1_b(); end; } 5:last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.y.w + 1); + rd.h = op_readdp(dp + regs.y.w + 1); op_$1_w(); } @@ -175,15 +175,15 @@ eor_idp(0x52, eor, regs.p.m), lda_idp(0xb2, lda, regs.p.m), ora_idp(0x12, ora, regs.p.m), sbc_idp(0xf2, sbc, regs.p.m) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); 5:if($2)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if($2) { op_$1_b(); end; } 6:last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_$1_w(); } @@ -194,16 +194,16 @@ eor_idpx(0x41, eor, regs.p.m), lda_idpx(0xa1, lda, regs.p.m), ora_idpx(0x01, ora, regs.p.m), sbc_idpx(0xe1, sbc, regs.p.m) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:cpu_io(); -4:aa.l = op_read(OPMODE_DP, dp + regs.x.w); -5:aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); +4:aa.l = op_readdp(dp + regs.x.w); +5:aa.h = op_readdp(dp + regs.x.w + 1); 6:if($2)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if($2) { op_$1_b(); end; } 7:last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_$1_w(); } @@ -214,16 +214,16 @@ eor_idpy(0x51, eor, regs.p.m), lda_idpy(0xb1, lda, regs.p.m), ora_idpy(0x11, ora, regs.p.m), sbc_idpy(0xf1, sbc, regs.p.m) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); 5:cpu_c4(aa.w, aa.w + regs.y.w); 6:if($2)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if($2) { op_$1_b(); end; } 7:last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_$1_w(); } @@ -234,16 +234,16 @@ eor_ildp(0x47, eor, regs.p.m), lda_ildp(0xa7, lda, regs.p.m), ora_ildp(0x07, ora, regs.p.m), sbc_ildp(0xe7, sbc, regs.p.m) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); -5:aa.b = op_read(OPMODE_DP, dp + 2); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); +5:aa.b = op_readdp(dp + 2); 6:if($2)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if($2) { op_$1_b(); end; } 7:last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_$1_w(); } @@ -254,16 +254,16 @@ eor_ildpy(0x57, eor, regs.p.m), lda_ildpy(0xb7, lda, regs.p.m), ora_ildpy(0x17, ora, regs.p.m), sbc_ildpy(0xf7, sbc, regs.p.m) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); -5:aa.b = op_read(OPMODE_DP, dp + 2); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); +5:aa.b = op_readdp(dp + 2); 6:if($2)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if($2) { op_$1_b(); end; } 7:last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_$1_w(); } @@ -274,13 +274,13 @@ eor_sr(0x43, eor, regs.p.m), lda_sr(0xa3, lda, regs.p.m), ora_sr(0x03, ora, regs.p.m), sbc_sr(0xe3, sbc, regs.p.m) { -1:sp = op_read(); +1:sp = op_readpc(); 2:cpu_io(); 3:if($2)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if($2) { op_$1_b(); end; } 4:last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_$1_w(); } @@ -291,27 +291,27 @@ eor_isry(0x53, eor), lda_isry(0xb3, lda), ora_isry(0x13, ora), sbc_isry(0xf3, sbc) { -1:sp = op_read(); +1:sp = op_readpc(); 2:cpu_io(); -3:aa.l = op_read(OPMODE_SP, sp); -4:aa.h = op_read(OPMODE_SP, sp + 1); +3:aa.l = op_readsp(sp); +4:aa.h = op_readsp(sp + 1); 5:cpu_io(); 6:if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_$1_b(); end; } 7:last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_$1_w(); } bit_const(0x89) { 1:if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { regs.p.z = ((rd.l & regs.a.l) == 0); end; } 2:last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); regs.p.z = ((rd.w & regs.a.w) == 0); } diff --git a/src/cpu/bcpu/core/op_read.cpp b/src/cpu/bcpu/core/op_read.cpp index 84fb61d5..74777cdf 100644 --- a/src/cpu/bcpu/core/op_read.cpp +++ b/src/cpu/bcpu/core/op_read.cpp @@ -2,12 +2,12 @@ void bCPU::op_adc_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_adc_w(); status.cycle_pos = 0; } break; @@ -18,12 +18,12 @@ void bCPU::op_and_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_and_w(); status.cycle_pos = 0; } break; @@ -34,12 +34,12 @@ void bCPU::op_cmp_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_cmp_w(); status.cycle_pos = 0; } break; @@ -50,12 +50,12 @@ void bCPU::op_cpx_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.x)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.x) { op_cpx_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_cpx_w(); status.cycle_pos = 0; } break; @@ -66,12 +66,12 @@ void bCPU::op_cpy_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.x)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.x) { op_cpy_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_cpy_w(); status.cycle_pos = 0; } break; @@ -82,12 +82,12 @@ void bCPU::op_eor_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_eor_w(); status.cycle_pos = 0; } break; @@ -98,12 +98,12 @@ void bCPU::op_lda_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_lda_w(); status.cycle_pos = 0; } break; @@ -114,12 +114,12 @@ void bCPU::op_ldx_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.x)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.x) { op_ldx_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_ldx_w(); status.cycle_pos = 0; } break; @@ -130,12 +130,12 @@ void bCPU::op_ldy_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.x)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.x) { op_ldy_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_ldy_w(); status.cycle_pos = 0; } break; @@ -146,12 +146,12 @@ void bCPU::op_ora_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_ora_w(); status.cycle_pos = 0; } break; @@ -162,12 +162,12 @@ void bCPU::op_sbc_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); op_sbc_w(); status.cycle_pos = 0; } break; @@ -177,19 +177,19 @@ void bCPU::op_sbc_const() { void bCPU::op_adc_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -199,19 +199,19 @@ void bCPU::op_adc_addr() { void bCPU::op_and_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -221,19 +221,19 @@ void bCPU::op_and_addr() { void bCPU::op_bit_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_bit_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_bit_w(); status.cycle_pos = 0; } break; @@ -243,19 +243,19 @@ void bCPU::op_bit_addr() { void bCPU::op_cmp_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -265,19 +265,19 @@ void bCPU::op_cmp_addr() { void bCPU::op_cpx_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.x) { op_cpx_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_cpx_w(); status.cycle_pos = 0; } break; @@ -287,19 +287,19 @@ void bCPU::op_cpx_addr() { void bCPU::op_cpy_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.x) { op_cpy_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_cpy_w(); status.cycle_pos = 0; } break; @@ -309,19 +309,19 @@ void bCPU::op_cpy_addr() { void bCPU::op_eor_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -331,19 +331,19 @@ void bCPU::op_eor_addr() { void bCPU::op_lda_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -353,19 +353,19 @@ void bCPU::op_lda_addr() { void bCPU::op_ldx_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.x) { op_ldx_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_ldx_w(); status.cycle_pos = 0; } break; @@ -375,19 +375,19 @@ void bCPU::op_ldx_addr() { void bCPU::op_ldy_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.x) { op_ldy_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_ldy_w(); status.cycle_pos = 0; } break; @@ -397,19 +397,19 @@ void bCPU::op_ldy_addr() { void bCPU::op_ora_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -419,19 +419,19 @@ void bCPU::op_ora_addr() { void bCPU::op_sbc_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -441,22 +441,22 @@ void bCPU::op_sbc_addr() { void bCPU::op_adc_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -466,22 +466,22 @@ void bCPU::op_adc_addrx() { void bCPU::op_and_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -491,22 +491,22 @@ void bCPU::op_and_addrx() { void bCPU::op_bit_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_bit_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_bit_w(); status.cycle_pos = 0; } break; @@ -516,22 +516,22 @@ void bCPU::op_bit_addrx() { void bCPU::op_cmp_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -541,22 +541,22 @@ void bCPU::op_cmp_addrx() { void bCPU::op_eor_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -566,22 +566,22 @@ void bCPU::op_eor_addrx() { void bCPU::op_lda_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -591,22 +591,22 @@ void bCPU::op_lda_addrx() { void bCPU::op_ldy_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.x) { op_ldy_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_ldy_w(); status.cycle_pos = 0; } break; @@ -616,22 +616,22 @@ void bCPU::op_ldy_addrx() { void bCPU::op_ora_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -641,22 +641,22 @@ void bCPU::op_ora_addrx() { void bCPU::op_sbc_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -666,22 +666,22 @@ void bCPU::op_sbc_addrx() { void bCPU::op_adc_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -691,22 +691,22 @@ void bCPU::op_adc_addry() { void bCPU::op_and_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -716,22 +716,22 @@ void bCPU::op_and_addry() { void bCPU::op_cmp_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -741,22 +741,22 @@ void bCPU::op_cmp_addry() { void bCPU::op_eor_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -766,22 +766,22 @@ void bCPU::op_eor_addry() { void bCPU::op_lda_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -791,22 +791,22 @@ void bCPU::op_lda_addry() { void bCPU::op_ldx_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.x) { op_ldx_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ldx_w(); status.cycle_pos = 0; } break; @@ -816,22 +816,22 @@ void bCPU::op_ldx_addry() { void bCPU::op_ora_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -841,22 +841,22 @@ void bCPU::op_ora_addry() { void bCPU::op_sbc_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -866,22 +866,22 @@ void bCPU::op_sbc_addry() { void bCPU::op_adc_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -891,22 +891,22 @@ void bCPU::op_adc_long() { void bCPU::op_and_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -916,22 +916,22 @@ void bCPU::op_and_long() { void bCPU::op_cmp_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -941,22 +941,22 @@ void bCPU::op_cmp_long() { void bCPU::op_eor_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -966,22 +966,22 @@ void bCPU::op_eor_long() { void bCPU::op_lda_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -991,22 +991,22 @@ void bCPU::op_lda_long() { void bCPU::op_ora_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -1016,22 +1016,22 @@ void bCPU::op_ora_long() { void bCPU::op_sbc_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -1041,22 +1041,22 @@ void bCPU::op_sbc_long() { void bCPU::op_adc_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -1066,22 +1066,22 @@ void bCPU::op_adc_longx() { void bCPU::op_and_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -1091,22 +1091,22 @@ void bCPU::op_and_longx() { void bCPU::op_cmp_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -1116,22 +1116,22 @@ void bCPU::op_cmp_longx() { void bCPU::op_eor_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -1141,22 +1141,22 @@ void bCPU::op_eor_longx() { void bCPU::op_lda_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -1166,22 +1166,22 @@ void bCPU::op_lda_longx() { void bCPU::op_ora_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -1191,22 +1191,22 @@ void bCPU::op_ora_longx() { void bCPU::op_sbc_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.x.w); + rd.l = op_readlong(aa.d + regs.x.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.x.w + 1); + rd.h = op_readlong(aa.d + regs.x.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -1216,19 +1216,19 @@ void bCPU::op_sbc_longx() { void bCPU::op_adc_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -1238,19 +1238,19 @@ void bCPU::op_adc_dp() { void bCPU::op_and_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -1260,19 +1260,19 @@ void bCPU::op_and_dp() { void bCPU::op_bit_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_bit_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_bit_w(); status.cycle_pos = 0; } break; @@ -1282,19 +1282,19 @@ void bCPU::op_bit_dp() { void bCPU::op_cmp_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -1304,19 +1304,19 @@ void bCPU::op_cmp_dp() { void bCPU::op_cpx_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.x) { op_cpx_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_cpx_w(); status.cycle_pos = 0; } break; @@ -1326,19 +1326,19 @@ void bCPU::op_cpx_dp() { void bCPU::op_cpy_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.x) { op_cpy_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_cpy_w(); status.cycle_pos = 0; } break; @@ -1348,19 +1348,19 @@ void bCPU::op_cpy_dp() { void bCPU::op_eor_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -1370,19 +1370,19 @@ void bCPU::op_eor_dp() { void bCPU::op_lda_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -1392,19 +1392,19 @@ void bCPU::op_lda_dp() { void bCPU::op_ldx_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.x) { op_ldx_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_ldx_w(); status.cycle_pos = 0; } break; @@ -1414,19 +1414,19 @@ void bCPU::op_ldx_dp() { void bCPU::op_ldy_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.x) { op_ldy_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_ldy_w(); status.cycle_pos = 0; } break; @@ -1436,19 +1436,19 @@ void bCPU::op_ldy_dp() { void bCPU::op_ora_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -1458,19 +1458,19 @@ void bCPU::op_ora_dp() { void bCPU::op_sbc_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -1480,7 +1480,7 @@ void bCPU::op_sbc_dp() { void bCPU::op_adc_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1490,12 +1490,12 @@ void bCPU::op_adc_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -1505,7 +1505,7 @@ void bCPU::op_adc_dpx() { void bCPU::op_and_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1515,12 +1515,12 @@ void bCPU::op_and_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -1530,7 +1530,7 @@ void bCPU::op_and_dpx() { void bCPU::op_bit_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1540,12 +1540,12 @@ void bCPU::op_bit_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_bit_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_bit_w(); status.cycle_pos = 0; } break; @@ -1555,7 +1555,7 @@ void bCPU::op_bit_dpx() { void bCPU::op_cmp_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1565,12 +1565,12 @@ void bCPU::op_cmp_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -1580,7 +1580,7 @@ void bCPU::op_cmp_dpx() { void bCPU::op_eor_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1590,12 +1590,12 @@ void bCPU::op_eor_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -1605,7 +1605,7 @@ void bCPU::op_eor_dpx() { void bCPU::op_lda_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1615,12 +1615,12 @@ void bCPU::op_lda_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -1630,7 +1630,7 @@ void bCPU::op_lda_dpx() { void bCPU::op_ldy_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1640,12 +1640,12 @@ void bCPU::op_ldy_dpx() { } break; case 4: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.x) { op_ldy_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_ldy_w(); status.cycle_pos = 0; } break; @@ -1655,7 +1655,7 @@ void bCPU::op_ldy_dpx() { void bCPU::op_ora_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1665,12 +1665,12 @@ void bCPU::op_ora_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -1680,7 +1680,7 @@ void bCPU::op_ora_dpx() { void bCPU::op_sbc_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1690,12 +1690,12 @@ void bCPU::op_sbc_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -1705,7 +1705,7 @@ void bCPU::op_sbc_dpx() { void bCPU::op_ldx_dpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1715,12 +1715,12 @@ void bCPU::op_ldx_dpy() { } break; case 4: { if(regs.p.x)last_cycle(); - rd.l = op_read(OPMODE_DP, dp + regs.y.w); + rd.l = op_readdp(dp + regs.y.w); if(regs.p.x) { op_ldx_b(); status.cycle_pos = 0; } } break; case 5: { last_cycle(); - rd.h = op_read(OPMODE_DP, dp + regs.y.w + 1); + rd.h = op_readdp(dp + regs.y.w + 1); op_ldx_w(); status.cycle_pos = 0; } break; @@ -1730,25 +1730,25 @@ void bCPU::op_ldx_dpy() { void bCPU::op_adc_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 6: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -1758,25 +1758,25 @@ void bCPU::op_adc_idp() { void bCPU::op_and_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 6: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -1786,25 +1786,25 @@ void bCPU::op_and_idp() { void bCPU::op_cmp_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 6: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -1814,25 +1814,25 @@ void bCPU::op_cmp_idp() { void bCPU::op_eor_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 6: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -1842,25 +1842,25 @@ void bCPU::op_eor_idp() { void bCPU::op_lda_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 6: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -1870,25 +1870,25 @@ void bCPU::op_lda_idp() { void bCPU::op_ora_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 6: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -1898,25 +1898,25 @@ void bCPU::op_ora_idp() { void bCPU::op_sbc_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 6: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -1926,7 +1926,7 @@ void bCPU::op_sbc_idp() { void bCPU::op_adc_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1935,19 +1935,19 @@ void bCPU::op_adc_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -1957,7 +1957,7 @@ void bCPU::op_adc_idpx() { void bCPU::op_and_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1966,19 +1966,19 @@ void bCPU::op_and_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -1988,7 +1988,7 @@ void bCPU::op_and_idpx() { void bCPU::op_cmp_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1997,19 +1997,19 @@ void bCPU::op_cmp_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -2019,7 +2019,7 @@ void bCPU::op_cmp_idpx() { void bCPU::op_eor_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -2028,19 +2028,19 @@ void bCPU::op_eor_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -2050,7 +2050,7 @@ void bCPU::op_eor_idpx() { void bCPU::op_lda_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -2059,19 +2059,19 @@ void bCPU::op_lda_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -2081,7 +2081,7 @@ void bCPU::op_lda_idpx() { void bCPU::op_ora_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -2090,19 +2090,19 @@ void bCPU::op_ora_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -2112,7 +2112,7 @@ void bCPU::op_ora_idpx() { void bCPU::op_sbc_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -2121,19 +2121,19 @@ void bCPU::op_sbc_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -2143,28 +2143,28 @@ void bCPU::op_sbc_idpx() { void bCPU::op_adc_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -2174,28 +2174,28 @@ void bCPU::op_adc_idpy() { void bCPU::op_and_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -2205,28 +2205,28 @@ void bCPU::op_and_idpy() { void bCPU::op_cmp_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -2236,28 +2236,28 @@ void bCPU::op_cmp_idpy() { void bCPU::op_eor_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -2267,28 +2267,28 @@ void bCPU::op_eor_idpy() { void bCPU::op_lda_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -2298,28 +2298,28 @@ void bCPU::op_lda_idpy() { void bCPU::op_ora_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -2329,28 +2329,28 @@ void bCPU::op_ora_idpy() { void bCPU::op_sbc_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -2360,28 +2360,28 @@ void bCPU::op_sbc_idpy() { void bCPU::op_adc_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -2391,28 +2391,28 @@ void bCPU::op_adc_ildp() { void bCPU::op_and_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -2422,28 +2422,28 @@ void bCPU::op_and_ildp() { void bCPU::op_cmp_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -2453,28 +2453,28 @@ void bCPU::op_cmp_ildp() { void bCPU::op_eor_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -2484,28 +2484,28 @@ void bCPU::op_eor_ildp() { void bCPU::op_lda_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -2515,28 +2515,28 @@ void bCPU::op_lda_ildp() { void bCPU::op_ora_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -2546,28 +2546,28 @@ void bCPU::op_ora_ildp() { void bCPU::op_sbc_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d); + rd.l = op_readlong(aa.d); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + 1); + rd.h = op_readlong(aa.d + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -2577,28 +2577,28 @@ void bCPU::op_sbc_ildp() { void bCPU::op_adc_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -2608,28 +2608,28 @@ void bCPU::op_adc_ildpy() { void bCPU::op_and_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -2639,28 +2639,28 @@ void bCPU::op_and_ildpy() { void bCPU::op_cmp_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -2670,28 +2670,28 @@ void bCPU::op_cmp_ildpy() { void bCPU::op_eor_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -2701,28 +2701,28 @@ void bCPU::op_eor_ildpy() { void bCPU::op_lda_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -2732,28 +2732,28 @@ void bCPU::op_lda_ildpy() { void bCPU::op_ora_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -2763,28 +2763,28 @@ void bCPU::op_ora_ildpy() { void bCPU::op_sbc_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_LONG, aa.d + regs.y.w); + rd.l = op_readlong(aa.d + regs.y.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_LONG, aa.d + regs.y.w + 1); + rd.h = op_readlong(aa.d + regs.y.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -2794,19 +2794,19 @@ void bCPU::op_sbc_ildpy() { void bCPU::op_adc_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -2816,19 +2816,19 @@ void bCPU::op_adc_sr() { void bCPU::op_and_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -2838,19 +2838,19 @@ void bCPU::op_and_sr() { void bCPU::op_cmp_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -2860,19 +2860,19 @@ void bCPU::op_cmp_sr() { void bCPU::op_eor_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -2882,19 +2882,19 @@ void bCPU::op_eor_sr() { void bCPU::op_lda_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -2904,19 +2904,19 @@ void bCPU::op_lda_sr() { void bCPU::op_ora_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -2926,19 +2926,19 @@ void bCPU::op_ora_sr() { void bCPU::op_sbc_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_SP, sp); + rd.l = op_readsp(sp); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 4: { last_cycle(); - rd.h = op_read(OPMODE_SP, sp + 1); + rd.h = op_readsp(sp + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -2948,28 +2948,28 @@ void bCPU::op_sbc_sr() { void bCPU::op_adc_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_adc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); status.cycle_pos = 0; } break; @@ -2979,28 +2979,28 @@ void bCPU::op_adc_isry() { void bCPU::op_and_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_and_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); status.cycle_pos = 0; } break; @@ -3010,28 +3010,28 @@ void bCPU::op_and_isry() { void bCPU::op_cmp_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_cmp_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); status.cycle_pos = 0; } break; @@ -3041,28 +3041,28 @@ void bCPU::op_cmp_isry() { void bCPU::op_eor_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_eor_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); status.cycle_pos = 0; } break; @@ -3072,28 +3072,28 @@ void bCPU::op_eor_isry() { void bCPU::op_lda_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_lda_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); status.cycle_pos = 0; } break; @@ -3103,28 +3103,28 @@ void bCPU::op_lda_isry() { void bCPU::op_ora_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_ora_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); status.cycle_pos = 0; } break; @@ -3134,28 +3134,28 @@ void bCPU::op_ora_isry() { void bCPU::op_sbc_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - rd.l = op_read(OPMODE_DBR, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w); if(regs.p.m) { op_sbc_b(); status.cycle_pos = 0; } } break; case 7: { last_cycle(); - rd.h = op_read(OPMODE_DBR, aa.w + regs.y.w + 1); + rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); status.cycle_pos = 0; } break; @@ -3166,7 +3166,7 @@ void bCPU::op_bit_const() { switch(status.cycle_pos++) { case 1: { if(regs.p.m)last_cycle(); - rd.l = op_read(); + rd.l = op_readpc(); if(regs.p.m) { regs.p.z = ((rd.l & regs.a.l) == 0); status.cycle_pos = 0; @@ -3174,7 +3174,7 @@ void bCPU::op_bit_const() { } break; case 2: { last_cycle(); - rd.h = op_read(); + rd.h = op_readpc(); regs.p.z = ((rd.w & regs.a.w) == 0); status.cycle_pos = 0; } break; diff --git a/src/cpu/bcpu/core/op_rmw.b b/src/cpu/bcpu/core/op_rmw.b index 47385f06..40e60cad 100644 --- a/src/cpu/bcpu/core/op_rmw.b +++ b/src/cpu/bcpu/core/op_rmw.b @@ -110,17 +110,17 @@ rol_addr(0x2e, rol), ror_addr(0x6e, ror), trb_addr(0x1c, trb), tsb_addr(0x0c, tsb) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:rd.l = op_read(OPMODE_DBR, aa.w); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:rd.l = op_readdbr(aa.w); if(regs.p.m)skip; -4:rd.h = op_read(OPMODE_DBR, aa.w + 1); +4:rd.h = op_readdbr(aa.w + 1); 5:cpu_io(); if(regs.p.m) { op_$1_b(); skip; } else op_$1_w(); -6:op_write(OPMODE_DBR, aa.w + 1, rd.h); +6:op_writedbr(aa.w + 1, rd.h); 7:last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); } inc_addrx(0xfe, inc), @@ -129,18 +129,18 @@ asl_addrx(0x1e, asl), lsr_addrx(0x5e, lsr), rol_addrx(0x3e, rol), ror_addrx(0x7e, ror) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_io(); -4:rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); +4:rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m)skip; -5:rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); +5:rd.h = op_readdbr(aa.w + regs.x.w + 1); 6:cpu_io(); if(regs.p.m) { op_$1_b(); skip; } else op_$1_w(); -7:op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); +7:op_writedbr(aa.w + regs.x.w + 1, rd.h); 8:last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); + op_writedbr(aa.w + regs.x.w, rd.l); } inc_dp(0xe6, inc), @@ -151,17 +151,17 @@ rol_dp(0x26, rol), ror_dp(0x66, ror), trb_dp(0x14, trb), tsb_dp(0x04, tsb) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:rd.l = op_read(OPMODE_DP, dp); +3:rd.l = op_readdp(dp); if(regs.p.m)skip; -4:rd.h = op_read(OPMODE_DP, dp + 1); +4:rd.h = op_readdp(dp + 1); 5:cpu_io(); if(regs.p.m) { op_$1_b(); skip; } else op_$1_w(); -6:op_write(OPMODE_DP, dp + 1, rd.h); +6:op_writedp(dp + 1, rd.h); 7:last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); } inc_dpx(0xf6, inc), @@ -170,16 +170,16 @@ asl_dpx(0x16, asl), lsr_dpx(0x56, lsr), rol_dpx(0x36, rol), ror_dpx(0x76, ror) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:cpu_io(); -4:rd.l = op_read(OPMODE_DP, dp + regs.x.w); +4:rd.l = op_readdp(dp + regs.x.w); if(regs.p.m)skip; -5:rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); +5:rd.h = op_readdp(dp + regs.x.w + 1); 6:cpu_io(); if(regs.p.m) { op_$1_b(); skip; } else op_$1_w(); -7:op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); +7:op_writedp(dp + regs.x.w + 1, rd.h); 8:last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, rd.l); + op_writedp(dp + regs.x.w, rd.l); } diff --git a/src/cpu/bcpu/core/op_rmw.cpp b/src/cpu/bcpu/core/op_rmw.cpp index 2d5137ba..bc50347e 100644 --- a/src/cpu/bcpu/core/op_rmw.cpp +++ b/src/cpu/bcpu/core/op_rmw.cpp @@ -207,17 +207,17 @@ void bCPU::op_ror() { void bCPU::op_inc_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -225,11 +225,11 @@ void bCPU::op_inc_addr() { else op_inc_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -238,17 +238,17 @@ void bCPU::op_inc_addr() { void bCPU::op_dec_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -256,11 +256,11 @@ void bCPU::op_dec_addr() { else op_dec_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -269,17 +269,17 @@ void bCPU::op_dec_addr() { void bCPU::op_asl_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -287,11 +287,11 @@ void bCPU::op_asl_addr() { else op_asl_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -300,17 +300,17 @@ void bCPU::op_asl_addr() { void bCPU::op_lsr_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -318,11 +318,11 @@ void bCPU::op_lsr_addr() { else op_lsr_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -331,17 +331,17 @@ void bCPU::op_lsr_addr() { void bCPU::op_rol_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -349,11 +349,11 @@ void bCPU::op_rol_addr() { else op_rol_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -362,17 +362,17 @@ void bCPU::op_rol_addr() { void bCPU::op_ror_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -380,11 +380,11 @@ void bCPU::op_ror_addr() { else op_ror_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -393,17 +393,17 @@ void bCPU::op_ror_addr() { void bCPU::op_trb_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -411,11 +411,11 @@ void bCPU::op_trb_addr() { else op_trb_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -424,17 +424,17 @@ void bCPU::op_trb_addr() { void bCPU::op_tsb_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - rd.l = op_read(OPMODE_DBR, aa.w); + rd.l = op_readdbr(aa.w); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DBR, aa.w + 1); + rd.h = op_readdbr(aa.w + 1); } break; case 5: { cpu_io(); @@ -442,11 +442,11 @@ void bCPU::op_tsb_addr() { else op_tsb_w(); } break; case 6: { - op_write(OPMODE_DBR, aa.w + 1, rd.h); + op_writedbr(aa.w + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w, rd.l); + op_writedbr(aa.w, rd.l); status.cycle_pos = 0; } break; } @@ -455,20 +455,20 @@ void bCPU::op_tsb_addr() { void bCPU::op_inc_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -476,11 +476,11 @@ void bCPU::op_inc_addrx() { else op_inc_w(); } break; case 7: { - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); + op_writedbr(aa.w + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); + op_writedbr(aa.w + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -489,20 +489,20 @@ void bCPU::op_inc_addrx() { void bCPU::op_dec_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -510,11 +510,11 @@ void bCPU::op_dec_addrx() { else op_dec_w(); } break; case 7: { - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); + op_writedbr(aa.w + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); + op_writedbr(aa.w + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -523,20 +523,20 @@ void bCPU::op_dec_addrx() { void bCPU::op_asl_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -544,11 +544,11 @@ void bCPU::op_asl_addrx() { else op_asl_w(); } break; case 7: { - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); + op_writedbr(aa.w + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); + op_writedbr(aa.w + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -557,20 +557,20 @@ void bCPU::op_asl_addrx() { void bCPU::op_lsr_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -578,11 +578,11 @@ void bCPU::op_lsr_addrx() { else op_lsr_w(); } break; case 7: { - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); + op_writedbr(aa.w + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); + op_writedbr(aa.w + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -591,20 +591,20 @@ void bCPU::op_lsr_addrx() { void bCPU::op_rol_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -612,11 +612,11 @@ void bCPU::op_rol_addrx() { else op_rol_w(); } break; case 7: { - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); + op_writedbr(aa.w + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); + op_writedbr(aa.w + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -625,20 +625,20 @@ void bCPU::op_rol_addrx() { void bCPU::op_ror_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); + rd.h = op_readdbr(aa.w + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -646,11 +646,11 @@ void bCPU::op_ror_addrx() { else op_ror_w(); } break; case 7: { - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); + op_writedbr(aa.w + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); + op_writedbr(aa.w + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -659,17 +659,17 @@ void bCPU::op_ror_addrx() { void bCPU::op_inc_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -677,11 +677,11 @@ void bCPU::op_inc_dp() { else op_inc_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -690,17 +690,17 @@ void bCPU::op_inc_dp() { void bCPU::op_dec_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -708,11 +708,11 @@ void bCPU::op_dec_dp() { else op_dec_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -721,17 +721,17 @@ void bCPU::op_dec_dp() { void bCPU::op_asl_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -739,11 +739,11 @@ void bCPU::op_asl_dp() { else op_asl_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -752,17 +752,17 @@ void bCPU::op_asl_dp() { void bCPU::op_lsr_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -770,11 +770,11 @@ void bCPU::op_lsr_dp() { else op_lsr_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -783,17 +783,17 @@ void bCPU::op_lsr_dp() { void bCPU::op_rol_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -801,11 +801,11 @@ void bCPU::op_rol_dp() { else op_rol_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -814,17 +814,17 @@ void bCPU::op_rol_dp() { void bCPU::op_ror_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -832,11 +832,11 @@ void bCPU::op_ror_dp() { else op_ror_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -845,17 +845,17 @@ void bCPU::op_ror_dp() { void bCPU::op_trb_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -863,11 +863,11 @@ void bCPU::op_trb_dp() { else op_trb_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -876,17 +876,17 @@ void bCPU::op_trb_dp() { void bCPU::op_tsb_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - rd.l = op_read(OPMODE_DP, dp); + rd.l = op_readdp(dp); if(regs.p.m)status.cycle_pos++; } break; case 4: { - rd.h = op_read(OPMODE_DP, dp + 1); + rd.h = op_readdp(dp + 1); } break; case 5: { cpu_io(); @@ -894,11 +894,11 @@ void bCPU::op_tsb_dp() { else op_tsb_w(); } break; case 6: { - op_write(OPMODE_DP, dp + 1, rd.h); + op_writedp(dp + 1, rd.h); } break; case 7: { last_cycle(); - op_write(OPMODE_DP, dp, rd.l); + op_writedp(dp, rd.l); status.cycle_pos = 0; } break; } @@ -907,7 +907,7 @@ void bCPU::op_tsb_dp() { void bCPU::op_inc_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -916,11 +916,11 @@ void bCPU::op_inc_dpx() { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -928,11 +928,11 @@ void bCPU::op_inc_dpx() { else op_inc_w(); } break; case 7: { - op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); + op_writedp(dp + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, rd.l); + op_writedp(dp + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -941,7 +941,7 @@ void bCPU::op_inc_dpx() { void bCPU::op_dec_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -950,11 +950,11 @@ void bCPU::op_dec_dpx() { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -962,11 +962,11 @@ void bCPU::op_dec_dpx() { else op_dec_w(); } break; case 7: { - op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); + op_writedp(dp + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, rd.l); + op_writedp(dp + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -975,7 +975,7 @@ void bCPU::op_dec_dpx() { void bCPU::op_asl_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -984,11 +984,11 @@ void bCPU::op_asl_dpx() { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -996,11 +996,11 @@ void bCPU::op_asl_dpx() { else op_asl_w(); } break; case 7: { - op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); + op_writedp(dp + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, rd.l); + op_writedp(dp + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -1009,7 +1009,7 @@ void bCPU::op_asl_dpx() { void bCPU::op_lsr_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1018,11 +1018,11 @@ void bCPU::op_lsr_dpx() { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -1030,11 +1030,11 @@ void bCPU::op_lsr_dpx() { else op_lsr_w(); } break; case 7: { - op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); + op_writedp(dp + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, rd.l); + op_writedp(dp + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -1043,7 +1043,7 @@ void bCPU::op_lsr_dpx() { void bCPU::op_rol_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1052,11 +1052,11 @@ void bCPU::op_rol_dpx() { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -1064,11 +1064,11 @@ void bCPU::op_rol_dpx() { else op_rol_w(); } break; case 7: { - op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); + op_writedp(dp + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, rd.l); + op_writedp(dp + regs.x.w, rd.l); status.cycle_pos = 0; } break; } @@ -1077,7 +1077,7 @@ void bCPU::op_rol_dpx() { void bCPU::op_ror_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -1086,11 +1086,11 @@ void bCPU::op_ror_dpx() { cpu_io(); } break; case 4: { - rd.l = op_read(OPMODE_DP, dp + regs.x.w); + rd.l = op_readdp(dp + regs.x.w); if(regs.p.m)status.cycle_pos++; } break; case 5: { - rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + rd.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { cpu_io(); @@ -1098,11 +1098,11 @@ void bCPU::op_ror_dpx() { else op_ror_w(); } break; case 7: { - op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); + op_writedp(dp + regs.x.w + 1, rd.h); } break; case 8: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, rd.l); + op_writedp(dp + regs.x.w, rd.l); status.cycle_pos = 0; } break; } diff --git a/src/cpu/bcpu/core/op_write.b b/src/cpu/bcpu/core/op_write.b index 527e1505..facadafc 100644 --- a/src/cpu/bcpu/core/op_write.b +++ b/src/cpu/bcpu/core/op_write.b @@ -2,180 +2,180 @@ sta_addr(0x8d, regs.p.m, regs.a.w), stx_addr(0x8e, regs.p.x, regs.x.w), sty_addr(0x8c, regs.p.x, regs.y.w), stz_addr(0x9c, regs.p.m, 0x0000) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:if($1)last_cycle(); - op_write(OPMODE_DBR, aa.w, $2); + op_writedbr(aa.w, $2); if($1)end; 4:last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, $2 >> 8); + op_writedbr(aa.w + 1, $2 >> 8); } sta_addrx(0x9d, regs.p.m, regs.a.w), stz_addrx(0x9e, regs.p.m, 0x0000) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_c4(aa.w, aa.w + regs.x.w); 4:if($1)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, $2); + op_writedbr(aa.w + regs.x.w, $2); if($1)end; 5:last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, $2 >> 8); + op_writedbr(aa.w + regs.x.w + 1, $2 >> 8); } sta_addry(0x99) { -1:aa.l = op_read(); -2:aa.h = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); 3:cpu_c4(aa.w, aa.w + regs.y.w); 4:if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); + op_writedbr(aa.w + regs.y.w, regs.a.l); if(regs.p.m)end; 5:last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); + op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } sta_long(0x8f) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:aa.b = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:aa.b = op_readpc(); 4:if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d, regs.a.l); + op_writelong(aa.d, regs.a.l); if(regs.p.m)end; 5:last_cycle(); - op_write(OPMODE_LONG, aa.d + 1, regs.a.h); + op_writelong(aa.d + 1, regs.a.h); } sta_longx(0x9f) { -1:aa.l = op_read(); -2:aa.h = op_read(); -3:aa.b = op_read(); +1:aa.l = op_readpc(); +2:aa.h = op_readpc(); +3:aa.b = op_readpc(); 4:if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.x.w, regs.a.l); + op_writelong(aa.d + regs.x.w, regs.a.l); if(regs.p.m)end; 5:last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.x.w + 1, regs.a.h); + op_writelong(aa.d + regs.x.w + 1, regs.a.h); } sta_dp(0x85, regs.p.m, regs.a.w), stx_dp(0x86, regs.p.x, regs.x.w), sty_dp(0x84, regs.p.x, regs.y.w), stz_dp(0x64, regs.p.m, 0x0000) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:if($1)last_cycle(); - op_write(OPMODE_DP, dp, $2); + op_writedp(dp, $2); if($1)end; 4:last_cycle(); - op_write(OPMODE_DP, dp + 1, $2 >> 8); + op_writedp(dp + 1, $2 >> 8); } sta_dpx(0x95, regs.p.m, regs.a.w), sty_dpx(0x94, regs.p.x, regs.y.w), stz_dpx(0x74, regs.p.m, 0x0000) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:cpu_io(); 4:if($1)last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, $2); + op_writedp(dp + regs.x.w, $2); if($1)end; 5:last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w + 1, $2 >> 8); + op_writedp(dp + regs.x.w + 1, $2 >> 8); } stx_dpy(0x96) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:cpu_io(); 4:if(regs.p.x)last_cycle(); - op_write(OPMODE_DP, dp + regs.y.w, regs.x.l); + op_writedp(dp + regs.y.w, regs.x.l); if(regs.p.x)end; 5:last_cycle(); - op_write(OPMODE_DP, dp + regs.y.w + 1, regs.x.h); + op_writedp(dp + regs.y.w + 1, regs.x.h); } sta_idp(0x92) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); 5:if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w, regs.a.l); + op_writedbr(aa.w, regs.a.l); if(regs.p.m)end; 6:last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, regs.a.h); + op_writedbr(aa.w + 1, regs.a.h); } sta_ildp(0x87) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); -5:aa.b = op_read(OPMODE_DP, dp + 2); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); +5:aa.b = op_readdp(dp + 2); 6:if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d, regs.a.l); + op_writelong(aa.d, regs.a.l); if(regs.p.m)end; 7:last_cycle(); - op_write(OPMODE_LONG, aa.d + 1, regs.a.h); + op_writelong(aa.d + 1, regs.a.h); } sta_idpx(0x81) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); 3:cpu_io(); -4:aa.l = op_read(OPMODE_DP, dp + regs.x.w); -5:aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); +4:aa.l = op_readdp(dp + regs.x.w); +5:aa.h = op_readdp(dp + regs.x.w + 1); 6:if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w, regs.a.l); + op_writedbr(aa.w, regs.a.l); if(regs.p.m)end; 7:last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, regs.a.h); + op_writedbr(aa.w + 1, regs.a.h); } sta_idpy(0x91) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); 5:cpu_c4(aa.w, aa.w + regs.y.w); 6:if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); + op_writedbr(aa.w + regs.y.w, regs.a.l); if(regs.p.m)end; 7:last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); + op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } sta_ildpy(0x97) { -1:dp = op_read(); +1:dp = op_readpc(); 2:cpu_c2(); -3:aa.l = op_read(OPMODE_DP, dp); -4:aa.h = op_read(OPMODE_DP, dp + 1); -5:aa.b = op_read(OPMODE_DP, dp + 2); +3:aa.l = op_readdp(dp); +4:aa.h = op_readdp(dp + 1); +5:aa.b = op_readdp(dp + 2); 6:if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.y.w, regs.a.l); + op_writelong(aa.d + regs.y.w, regs.a.l); if(regs.p.m)end; 7:last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.y.w + 1, regs.a.h); + op_writelong(aa.d + regs.y.w + 1, regs.a.h); } sta_sr(0x83) { -1:sp = op_read(); +1:sp = op_readpc(); 2:cpu_io(); 3:if(regs.p.m)last_cycle(); - op_write(OPMODE_SP, sp, regs.a.l); + op_writesp(sp, regs.a.l); if(regs.p.m)end; 4:last_cycle(); - op_write(OPMODE_SP, sp + 1, regs.a.h); + op_writesp(sp + 1, regs.a.h); } sta_isry(0x93) { -1:sp = op_read(); +1:sp = op_readpc(); 2:cpu_io(); -3:aa.l = op_read(OPMODE_SP, sp); -4:aa.h = op_read(OPMODE_SP, sp + 1); +3:aa.l = op_readsp(sp); +4:aa.h = op_readsp(sp + 1); 5:cpu_io(); 6:if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); + op_writedbr(aa.w + regs.y.w, regs.a.l); if(regs.p.m)end; 7:last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); + op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } diff --git a/src/cpu/bcpu/core/op_write.cpp b/src/cpu/bcpu/core/op_write.cpp index 88ef7c49..01be2850 100644 --- a/src/cpu/bcpu/core/op_write.cpp +++ b/src/cpu/bcpu/core/op_write.cpp @@ -1,19 +1,19 @@ void bCPU::op_sta_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w, regs.a.w); + op_writedbr(aa.w, regs.a.w); if(regs.p.m)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, regs.a.w >> 8); + op_writedbr(aa.w + 1, regs.a.w >> 8); status.cycle_pos = 0; } break; } @@ -22,19 +22,19 @@ void bCPU::op_sta_addr() { void bCPU::op_stx_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.x)last_cycle(); - op_write(OPMODE_DBR, aa.w, regs.x.w); + op_writedbr(aa.w, regs.x.w); if(regs.p.x)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, regs.x.w >> 8); + op_writedbr(aa.w + 1, regs.x.w >> 8); status.cycle_pos = 0; } break; } @@ -43,19 +43,19 @@ void bCPU::op_stx_addr() { void bCPU::op_sty_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.x)last_cycle(); - op_write(OPMODE_DBR, aa.w, regs.y.w); + op_writedbr(aa.w, regs.y.w); if(regs.p.x)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, regs.y.w >> 8); + op_writedbr(aa.w + 1, regs.y.w >> 8); status.cycle_pos = 0; } break; } @@ -64,19 +64,19 @@ void bCPU::op_sty_addr() { void bCPU::op_stz_addr() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w, 0x0000); + op_writedbr(aa.w, 0x0000); if(regs.p.m)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, 0x0000 >> 8); + op_writedbr(aa.w + 1, 0x0000 >> 8); status.cycle_pos = 0; } break; } @@ -85,22 +85,22 @@ void bCPU::op_stz_addr() { void bCPU::op_sta_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, regs.a.w); + op_writedbr(aa.w + regs.x.w, regs.a.w); if(regs.p.m)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, regs.a.w >> 8); + op_writedbr(aa.w + regs.x.w + 1, regs.a.w >> 8); status.cycle_pos = 0; } break; } @@ -109,22 +109,22 @@ void bCPU::op_sta_addrx() { void bCPU::op_stz_addrx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.x.w); } break; case 4: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w, 0x0000); + op_writedbr(aa.w + regs.x.w, 0x0000); if(regs.p.m)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.x.w + 1, 0x0000 >> 8); + op_writedbr(aa.w + regs.x.w + 1, 0x0000 >> 8); status.cycle_pos = 0; } break; } @@ -133,22 +133,22 @@ void bCPU::op_stz_addrx() { void bCPU::op_sta_addry() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 4: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); + op_writedbr(aa.w + regs.y.w, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); + op_writedbr(aa.w + regs.y.w + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -157,22 +157,22 @@ void bCPU::op_sta_addry() { void bCPU::op_sta_long() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d, regs.a.l); + op_writelong(aa.d, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_LONG, aa.d + 1, regs.a.h); + op_writelong(aa.d + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -181,22 +181,22 @@ void bCPU::op_sta_long() { void bCPU::op_sta_longx() { switch(status.cycle_pos++) { case 1: { - aa.l = op_read(); + aa.l = op_readpc(); } break; case 2: { - aa.h = op_read(); + aa.h = op_readpc(); } break; case 3: { - aa.b = op_read(); + aa.b = op_readpc(); } break; case 4: { if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.x.w, regs.a.l); + op_writelong(aa.d + regs.x.w, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.x.w + 1, regs.a.h); + op_writelong(aa.d + regs.x.w + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -205,19 +205,19 @@ void bCPU::op_sta_longx() { void bCPU::op_sta_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DP, dp, regs.a.w); + op_writedp(dp, regs.a.w); if(regs.p.m)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DP, dp + 1, regs.a.w >> 8); + op_writedp(dp + 1, regs.a.w >> 8); status.cycle_pos = 0; } break; } @@ -226,19 +226,19 @@ void bCPU::op_sta_dp() { void bCPU::op_stx_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.x)last_cycle(); - op_write(OPMODE_DP, dp, regs.x.w); + op_writedp(dp, regs.x.w); if(regs.p.x)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DP, dp + 1, regs.x.w >> 8); + op_writedp(dp + 1, regs.x.w >> 8); status.cycle_pos = 0; } break; } @@ -247,19 +247,19 @@ void bCPU::op_stx_dp() { void bCPU::op_sty_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.x)last_cycle(); - op_write(OPMODE_DP, dp, regs.y.w); + op_writedp(dp, regs.y.w); if(regs.p.x)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DP, dp + 1, regs.y.w >> 8); + op_writedp(dp + 1, regs.y.w >> 8); status.cycle_pos = 0; } break; } @@ -268,19 +268,19 @@ void bCPU::op_sty_dp() { void bCPU::op_stz_dp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DP, dp, 0x0000); + op_writedp(dp, 0x0000); if(regs.p.m)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_DP, dp + 1, 0x0000 >> 8); + op_writedp(dp + 1, 0x0000 >> 8); status.cycle_pos = 0; } break; } @@ -289,7 +289,7 @@ void bCPU::op_stz_dp() { void bCPU::op_sta_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -299,12 +299,12 @@ void bCPU::op_sta_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, regs.a.w); + op_writedp(dp + regs.x.w, regs.a.w); if(regs.p.m)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w + 1, regs.a.w >> 8); + op_writedp(dp + regs.x.w + 1, regs.a.w >> 8); status.cycle_pos = 0; } break; } @@ -313,7 +313,7 @@ void bCPU::op_sta_dpx() { void bCPU::op_sty_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -323,12 +323,12 @@ void bCPU::op_sty_dpx() { } break; case 4: { if(regs.p.x)last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, regs.y.w); + op_writedp(dp + regs.x.w, regs.y.w); if(regs.p.x)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w + 1, regs.y.w >> 8); + op_writedp(dp + regs.x.w + 1, regs.y.w >> 8); status.cycle_pos = 0; } break; } @@ -337,7 +337,7 @@ void bCPU::op_sty_dpx() { void bCPU::op_stz_dpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -347,12 +347,12 @@ void bCPU::op_stz_dpx() { } break; case 4: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w, 0x0000); + op_writedp(dp + regs.x.w, 0x0000); if(regs.p.m)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_DP, dp + regs.x.w + 1, 0x0000 >> 8); + op_writedp(dp + regs.x.w + 1, 0x0000 >> 8); status.cycle_pos = 0; } break; } @@ -361,7 +361,7 @@ void bCPU::op_stz_dpx() { void bCPU::op_stx_dpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -371,12 +371,12 @@ void bCPU::op_stx_dpy() { } break; case 4: { if(regs.p.x)last_cycle(); - op_write(OPMODE_DP, dp + regs.y.w, regs.x.l); + op_writedp(dp + regs.y.w, regs.x.l); if(regs.p.x)status.cycle_pos = 0; } break; case 5: { last_cycle(); - op_write(OPMODE_DP, dp + regs.y.w + 1, regs.x.h); + op_writedp(dp + regs.y.w + 1, regs.x.h); status.cycle_pos = 0; } break; } @@ -385,25 +385,25 @@ void bCPU::op_stx_dpy() { void bCPU::op_sta_idp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w, regs.a.l); + op_writedbr(aa.w, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 6: { last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, regs.a.h); + op_writedbr(aa.w + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -412,28 +412,28 @@ void bCPU::op_sta_idp() { void bCPU::op_sta_ildp() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d, regs.a.l); + op_writelong(aa.d, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 7: { last_cycle(); - op_write(OPMODE_LONG, aa.d + 1, regs.a.h); + op_writelong(aa.d + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -442,7 +442,7 @@ void bCPU::op_sta_ildp() { void bCPU::op_sta_idpx() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); @@ -451,19 +451,19 @@ void bCPU::op_sta_idpx() { cpu_io(); } break; case 4: { - aa.l = op_read(OPMODE_DP, dp + regs.x.w); + aa.l = op_readdp(dp + regs.x.w); } break; case 5: { - aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); + aa.h = op_readdp(dp + regs.x.w + 1); } break; case 6: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w, regs.a.l); + op_writedbr(aa.w, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w + 1, regs.a.h); + op_writedbr(aa.w + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -472,28 +472,28 @@ void bCPU::op_sta_idpx() { void bCPU::op_sta_idpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { cpu_c4(aa.w, aa.w + regs.y.w); } break; case 6: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); + op_writedbr(aa.w + regs.y.w, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); + op_writedbr(aa.w + regs.y.w + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -502,28 +502,28 @@ void bCPU::op_sta_idpy() { void bCPU::op_sta_ildpy() { switch(status.cycle_pos++) { case 1: { - dp = op_read(); + dp = op_readpc(); } break; case 2: { cpu_c2(); } break; case 3: { - aa.l = op_read(OPMODE_DP, dp); + aa.l = op_readdp(dp); } break; case 4: { - aa.h = op_read(OPMODE_DP, dp + 1); + aa.h = op_readdp(dp + 1); } break; case 5: { - aa.b = op_read(OPMODE_DP, dp + 2); + aa.b = op_readdp(dp + 2); } break; case 6: { if(regs.p.m)last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.y.w, regs.a.l); + op_writelong(aa.d + regs.y.w, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 7: { last_cycle(); - op_write(OPMODE_LONG, aa.d + regs.y.w + 1, regs.a.h); + op_writelong(aa.d + regs.y.w + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -532,19 +532,19 @@ void bCPU::op_sta_ildpy() { void bCPU::op_sta_sr() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { if(regs.p.m)last_cycle(); - op_write(OPMODE_SP, sp, regs.a.l); + op_writesp(sp, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 4: { last_cycle(); - op_write(OPMODE_SP, sp + 1, regs.a.h); + op_writesp(sp + 1, regs.a.h); status.cycle_pos = 0; } break; } @@ -553,28 +553,28 @@ void bCPU::op_sta_sr() { void bCPU::op_sta_isry() { switch(status.cycle_pos++) { case 1: { - sp = op_read(); + sp = op_readpc(); } break; case 2: { cpu_io(); } break; case 3: { - aa.l = op_read(OPMODE_SP, sp); + aa.l = op_readsp(sp); } break; case 4: { - aa.h = op_read(OPMODE_SP, sp + 1); + aa.h = op_readsp(sp + 1); } break; case 5: { cpu_io(); } break; case 6: { if(regs.p.m)last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w, regs.a.l); + op_writedbr(aa.w + regs.y.w, regs.a.l); if(regs.p.m)status.cycle_pos = 0; } break; case 7: { last_cycle(); - op_write(OPMODE_DBR, aa.w + regs.y.w + 1, regs.a.h); + op_writedbr(aa.w + regs.y.w + 1, regs.a.h); status.cycle_pos = 0; } break; } diff --git a/src/cpu/bcpu/dma/dma.cpp b/src/cpu/bcpu/dma/dma.cpp index 259fd45d..38facf8a 100644 --- a/src/cpu/bcpu/dma/dma.cpp +++ b/src/cpu/bcpu/dma/dma.cpp @@ -68,7 +68,7 @@ uint32 r; } void bCPU::dma_cputommio(uint8 i, uint8 bbus) { - if(cartridge.cart.sdd1 == true && sdd1->dma_active() == true) { + if(cartridge.info.sdd1 == true && sdd1->dma_active() == true) { r_mem->write(0x2100 | bbus, sdd1->dma_read()); } else { dma_transfer_byte(0, bbus, dma_addr(i)); @@ -98,7 +98,7 @@ void bCPU::dma_run() { if(channel[i].dma_enabled == false)continue; //first byte transferred? - if(cartridge.cart.sdd1 == true && channel[i].read_index == 0) { + if(cartridge.info.sdd1 == true && channel[i].read_index == 0) { sdd1->dma_begin(i, (channel[i].srcbank << 16) | (channel[i].srcaddr), channel[i].xfersize); } diff --git a/src/cpu/bcpu/memory/memory.h b/src/cpu/bcpu/memory/memory.h index e4456ca6..61377196 100644 --- a/src/cpu/bcpu/memory/memory.h +++ b/src/cpu/bcpu/memory/memory.h @@ -5,3 +5,23 @@ uint8 apu_port[4]; inline void cpu_io(); inline uint8 mem_read(uint32 addr); inline void mem_write(uint32 addr, uint8 value); + +/***** + * helper memory addressing functions used by CPU core + *****/ + uint8 op_readpc () { return mem_read((regs.pc.b << 16) + regs.pc.w++); } + uint8 op_readstack() { (regs.e) ? regs.s.l++ : regs.s.w++; return mem_read(regs.s.w); } + uint8 op_readaddr (uint32 addr) { return mem_read(uclip<16>(addr)); } + uint8 op_readlong (uint32 addr) { return mem_read(uclip<24>(addr)); } + uint8 op_readdbr (uint32 addr) { return mem_read(uclip<24>((regs.db << 16) + addr)); } + uint8 op_readpbr (uint32 addr) { return mem_read((regs.pc.b << 16) + uclip<16>(addr)); } + uint8 op_readdp (uint32 addr) { return mem_read(uclip<16>(regs.d + uclip<16>(addr))); } + uint8 op_readsp (uint32 addr) { return mem_read(uclip<16>(regs.s + uclip<16>(addr))); } + + void op_writestack(uint8 data) { mem_write(regs.s.w, data); (regs.e) ? regs.s.l-- : regs.s.w--; } + void op_writeaddr (uint32 addr, uint8 data) { mem_write(uclip<16>(addr), data); } + void op_writelong (uint32 addr, uint8 data) { mem_write(uclip<24>(addr), data); } + void op_writedbr (uint32 addr, uint8 data) { mem_write(uclip<24>((regs.db << 16) + addr), data); } + void op_writepbr (uint32 addr, uint8 data) { mem_write((regs.pc.b << 16) + uclip<16>(addr), data); } + void op_writedp (uint32 addr, uint8 data) { mem_write(uclip<16>(regs.d + uclip<16>(addr)), data); } + void op_writesp (uint32 addr, uint8 data) { mem_write(uclip<16>(regs.s + uclip<16>(addr)), data); } diff --git a/src/cpu/bcpu/timing/timing.cpp b/src/cpu/bcpu/timing/timing.cpp index 1f857f59..59912965 100644 --- a/src/cpu/bcpu/timing/timing.cpp +++ b/src/cpu/bcpu/timing/timing.cpp @@ -26,7 +26,6 @@ */ uint16 bCPU::vcounter() { return time.v; } -uint16 bCPU::hcounter() { return get_hcounter(); } uint16 bCPU::hcycles() { return time.hc; } bool bCPU::interlace() { return time.interlace; } @@ -39,6 +38,13 @@ void bCPU::set_overscan (bool r) { time.overscan = r; update_interrupts(); } uint8 bCPU::dma_counter() { return (time.dma_counter + time.hc) & 6; } +uint16 bCPU::hcounter() { + if(time.v == 240 && time.interlace == false && time.interlace_field == 1) { + return time.hc >> 2; + } + return (time.hc - ((time.hc > 1292) << 1) - ((time.hc > 1310) << 1)) >> 2; +} + bool bCPU::nmi_trigger_pos_match(uint32 offset) { uint16 v = overscan() ? 240 : 225; uint16 hc = 2 + offset; @@ -179,62 +185,6 @@ int16 hc, hc_end; } } -//all scanlines are 1364 cycles long, except scanline 240 -//on non-interlace odd-frames, which is 1360 cycles long. -//[NTSC] -//interlace mode has 525 scanlines: 263 on the even frame, -//and 262 on the odd. -//non-interlace mode has 524 scanlines: 262 scanlines on -//both even and odd frames. -//[PAL] -//interlace mode has 625 scanlines: 313 on the even frame, -//and 312 on the odd. -//non-interlace mode has 624 scanlines: 312 scanlines on -//both even and odd frames. -// -//cycles per frame: -// 263 * 1364 = 358732 -// 262 * 1364 = 357368 -// 262 * 1364 - 4 = 357364 -void bCPU::inc_vcounter() { - time.v++; - if(time.v >= time.frame_lines) { - time.v = 0; - time.interlace_field ^= 1; - - if(interlace() == true && interlace_field() == 0) { - time.frame_lines = (time.region_scanlines >> 1) + 1; - } else { - time.frame_lines = (time.region_scanlines >> 1); - } - } - - time.dma_counter += time.line_cycles; - if(time.v == 240 && time.interlace == false && time.interlace_field == 1) { - time.line_cycles = 1360; - } else { - time.line_cycles = 1364; - } - time.dram_refreshed = false; - - update_interrupts(); -} - -//all dots are 4 cycles long, except dots 323 and 327. dots 323 and 327 -//are 6 cycles long. this holds true for all scanlines except scanline -//240 on non-interlace odd frames. the reason for this is because this -//scanline is only 1360 cycles long, instead of 1364 like all other -//scanlines. -//this makes the effective range of hscan_pos 0-339 at all times. -//dot 323 range = { 1292, 1294, 1296 } -//dot 327 range = { 1310, 1312, 1314 } -uint16 bCPU::get_hcounter() { - if(time.v == 240 && time.interlace == false && time.interlace_field == 1) { - return time.hc >> 2; - } - return (time.hc - ((time.hc > 1292) << 1) - ((time.hc > 1310) << 1)) >> 2; -} - uint32 bCPU::clocks_executed() { uint32 r = status.cycles_executed; status.cycles_executed = 0; @@ -242,6 +192,13 @@ uint32 r = status.cycles_executed; } void bCPU::cycle_edge() { + if(time.line_rendered == false) { + if(time.hc >= 128) { + time.line_rendered = true; + r_ppu->render_scanline(); + } + } + if(time.hdmainit_triggered == false) { if(time.hc >= time.hdmainit_trigger_pos || time.v) { time.hdmainit_triggered = true; @@ -265,20 +222,7 @@ void bCPU::add_cycles(int cycles) { if(time.hc + cycles >= time.line_cycles) { cycles = (time.hc + cycles) - time.line_cycles; time.hc = 0; - - inc_vcounter(); - - if(time.v == 0) { - frame(); - r_ppu->frame(); - snes->frame(); - } - scanline(); - r_ppu->scanline(); - snes->scanline(); - time.line_rendered = false; - poll_interrupts(cycles); } @@ -291,38 +235,64 @@ void bCPU::add_cycles(int cycles) { return; } } -/* - if(time.dram_refreshed == false) { - if(time.hc + cycles >= time.dram_refresh_pos) { - time.dram_refreshed = true; - status.cycles_executed += 40; - cycles = (time.hc + cycles) - time.dram_refresh_pos; - time.hc = time.dram_refresh_pos + 40; +} - if(cpu_version == 2) { - if(time.v != 240 || time.interlace != false || time.interlace_field != 1) { - if(time.dram_refresh_pos == 534) { - time.dram_refresh_pos = 538; - } else { - time.dram_refresh_pos = 534; - } - } - } - } - } -*/ - if(time.line_rendered == false) { - //rendering should start at H=18 (+256=274), but since the - //current PPU emulation renders the entire scanline at once, - //PPU register changes mid-scanline do not show up. - //therefore, wait a few dots before rendering the scanline - if(time.hc >= (48 * 4)) { - time.line_rendered = true; - r_ppu->render_scanline(); - } +void bCPU::scanline() { + if(++time.v >= time.frame_lines) { + frame(); } -//time.hc += cycles; + time.dma_counter += time.line_cycles; + if(time.v == 240 && time.interlace == false && time.interlace_field == 1) { + time.line_cycles = 1360; + } else { + time.line_cycles = 1364; + } + time.dram_refreshed = false; + + time.line_rendered = + time.hdma_triggered = (time.v <= (!overscan() ? 224 : 239)) ? false : true; + + r_ppu->scanline(); + snes->scanline(); + + update_interrupts(); + + if(vcounter() == (!overscan() ? 227 : 242) && status.auto_joypad_poll == true) { + snes->poll_input(SNES::DEV_JOYPAD1); + snes->poll_input(SNES::DEV_JOYPAD2); + //When the SNES auto-polls the joypads, it writes 1, then 0 to + //$4016, then reads from each 16 times to get the joypad state + //information. As a result, the joypad read positions are set + //to 16 after such a poll. Position 16 is the controller + //connected status bit. + status.joypad1_read_pos = 16; + status.joypad2_read_pos = 16; + } +} + +void bCPU::frame() { + time.nmi_read = 1; + time.nmi_line = 1; + time.nmi_transition = 0; + + time.v = 0; + time.interlace_field ^= 1; + if(interlace() == true && interlace_field() == 0) { + time.frame_lines = (time.region_scanlines >> 1) + 1; + } else { + time.frame_lines = (time.region_scanlines >> 1); + } + + if(cpu_version == 2) { + time.hdmainit_trigger_pos = 12 + dma_counter(); + } else { + time.hdmainit_trigger_pos = 12 + 8 - dma_counter(); + } + time.hdmainit_triggered = false; + + r_ppu->frame(); + snes->frame(); } void bCPU::time_reset() { diff --git a/src/cpu/bcpu/timing/timing.h b/src/cpu/bcpu/timing/timing.h index fb4a2bab..b742d7d5 100644 --- a/src/cpu/bcpu/timing/timing.h +++ b/src/cpu/bcpu/timing/timing.h @@ -67,8 +67,8 @@ struct { inline uint8 dma_counter(); - inline void inc_vcounter(); - inline uint16 get_hcounter(); inline void cycle_edge(); inline void add_cycles(int cycles); + inline void scanline(); + inline void frame(); inline void time_reset(); diff --git a/src/cpu/cpuregs.h b/src/cpu/cpuregs.h index 62852687..a7a3003e 100644 --- a/src/cpu/cpuregs.h +++ b/src/cpu/cpuregs.h @@ -23,12 +23,13 @@ union { bit<0x01> c; }; - CPURegFlags() { data = 0; } - inline operator unsigned() { return data; } + inline operator unsigned() const { return data; } inline unsigned operator = (const uint8 i) { data = i; return data; } inline unsigned operator |= (const uint8 i) { data |= i; return data; } inline unsigned operator ^= (const uint8 i) { data ^= i; return data; } inline unsigned operator &= (const uint8 i) { data &= i; return data; } + + CPURegFlags() : data(0) {} }; class CPUReg16 { @@ -38,8 +39,7 @@ union { struct { uint8 order_lsb2(l, h); }; }; - CPUReg16() { w = 0; } - inline operator unsigned() { return w; } + inline operator unsigned() const { return w; } template inline unsigned operator = (const T i) { w = i; return w; } template inline unsigned operator |= (const T i) { w |= i; return w; } template inline unsigned operator ^= (const T i) { w ^= i; return w; } @@ -51,6 +51,8 @@ union { template inline unsigned operator *= (const T i) { w *= i; return w; } template inline unsigned operator /= (const T i) { w /= i; return w; } template inline unsigned operator %= (const T i) { w %= i; return w; } + + CPUReg16() : w(0) {} }; class CPUReg24 { @@ -61,8 +63,7 @@ union { struct { uint8 order_lsb4(l, h, b, bh); }; }; - CPUReg24() { d = 0; } - inline operator unsigned() { return d; } + inline operator unsigned() const { return d; } template inline unsigned operator = (const T i) { d = uclip<24>(i); return d; } template inline unsigned operator |= (const T i) { d = uclip<24>(d | i); return d; } template inline unsigned operator ^= (const T i) { d = uclip<24>(d ^ i); return d; } @@ -74,6 +75,8 @@ union { template inline unsigned operator *= (const T i) { d = uclip<24>(d * i); return d; } template inline unsigned operator /= (const T i) { d = uclip<24>(d / i); return d; } template inline unsigned operator %= (const T i) { d = uclip<24>(d % i); return d; } + + CPUReg24() : d(0) {} }; class CPURegs { @@ -84,5 +87,6 @@ CPURegFlags p; uint8 db; uint8 mdr; bool e; - CPURegs() { db = 0; mdr = 0x00; e = false; } +bool acc_8b, idx_8b; + CPURegs() : db(0), mdr(0x00), e(false), acc_8b(true), idx_8b(true) {} }; diff --git a/src/cpu/scpu/core/core.cpp b/src/cpu/scpu/core/core.cpp index 7e5c059f..72bf435b 100644 --- a/src/cpu/scpu/core/core.cpp +++ b/src/cpu/scpu/core/core.cpp @@ -1,12 +1,11 @@ #include "opfn.cpp" -//#include "op_read.cpp" -//#include "op_write.cpp" -//#include "op_rmw.cpp" -//#include "op_pc.cpp" -//#include "op_misc.cpp" void sCPU::main() { for(;;) { + #ifdef DEBUGGER + snes->notify(SNES::CPU_EXEC_OPCODE_BEGIN); + #endif + status.in_opcode = true; if(event.irq) { @@ -21,7 +20,6 @@ void sCPU::main() { op_irq(); } -// (this->*optbl[op_readpc()])(); switch(op_readpc()) { #include "op_read.cpp" #include "op_write.cpp" @@ -31,7 +29,14 @@ void sCPU::main() { } status.in_opcode = false; - opcode_edge(); + + #ifdef DEBUGGER + snes->notify(SNES::CPU_EXEC_OPCODE_END); + #endif + + #ifdef FAVOR_SPEED + co_return(); + #endif } } diff --git a/src/cpu/scpu/core/core.h b/src/cpu/scpu/core/core.h index cf2ff9e0..a2ab86fb 100644 --- a/src/cpu/scpu/core/core.h +++ b/src/cpu/scpu/core/core.h @@ -6,7 +6,7 @@ uint8 dp, sp; inline void main(); inline void op_irq(); - bool in_opcode() { return status.in_opcode; } + inline bool in_opcode() { return status.in_opcode; } //op_read void op_adc_b(); diff --git a/src/cpu/scpu/core/op_misc.b b/src/cpu/scpu/core/op_misc.b index 19d12f31..76c9fbf8 100644 --- a/src/cpu/scpu/core/op_misc.b +++ b/src/cpu/scpu/core/op_misc.b @@ -15,7 +15,7 @@ xba(0xeb) { regs.a.l ^= regs.a.h; regs.a.h ^= regs.a.l; regs.a.l ^= regs.a.h; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } @@ -27,8 +27,11 @@ mvp(0x44, --) { rd.l = op_readlong((sp << 16) | regs.x.w); 4:op_writelong((dp << 16) | regs.y.w, rd.l); 5:op_io(); - if(regs.p.x) { regs.x.l$1; regs.y.l$1; } - else { regs.x.w$1; regs.y.w$1; } + if(regs.idx_8b) { + regs.x.l $1; regs.y.l $1; + } else { + regs.x.w $1; regs.y.w $1; + } 6:last_cycle(); op_io(); if(regs.a.w--)regs.pc.w -= 3; @@ -77,11 +80,12 @@ xce(0xfb) { bool c = regs.p.c; regs.p.c = regs.e; regs.e = c; - if(regs.e) { - regs.p |= 0x30; + if(regs.e)regs.s.h = 0x01; + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; - regs.s.h = 0x01; } } @@ -103,28 +107,29 @@ sep(0xe2, |=) { 2:last_cycle(); op_io(); regs.p $1 rd.l; - if(regs.e)regs.p |= 0x30; - if(regs.p.x) { + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; } } -tax(0xaa, regs.p.x, x, a), -tay(0xa8, regs.p.x, y, a), -txa(0x8a, regs.p.m, a, x), -txy(0x9b, regs.p.x, y, x), -tya(0x98, regs.p.m, a, y), -tyx(0xbb, regs.p.x, x, y) { +tax(0xaa, regs.idx_8b, x, a), +tay(0xa8, regs.idx_8b, y, a), +txa(0x8a, regs.acc_8b, a, x), +txy(0x9b, regs.idx_8b, y, x), +tya(0x98, regs.acc_8b, a, y), +tyx(0xbb, regs.idx_8b, x, y) { 1:last_cycle(); op_io(); if($1) { regs.$2.l = regs.$3.l; - regs.p.n = !!(regs.$2.l & 0x80); + regs.p.n = bool(regs.$2.l & 0x80); regs.p.z = (regs.$2.l == 0); } else { regs.$2.w = regs.$3.w; - regs.p.n = !!(regs.$2.w & 0x8000); + regs.p.n = bool(regs.$2.w & 0x8000); regs.p.z = (regs.$2.w == 0); } } @@ -133,7 +138,7 @@ tcd(0x5b) { 1:last_cycle(); op_io(); regs.d.w = regs.a.w; - regs.p.n = !!(regs.d.w & 0x8000); + regs.p.n = bool(regs.d.w & 0x8000); regs.p.z = (regs.d.w == 0); } @@ -148,7 +153,7 @@ tdc(0x7b) { 1:last_cycle(); op_io(); regs.a.w = regs.d.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } @@ -157,10 +162,10 @@ tsc(0x3b) { op_io(); regs.a.w = regs.s.w; if(regs.e) { - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } @@ -168,13 +173,13 @@ tsc(0x3b) { tsx(0xba) { 1:last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.x.l = regs.s.l; - regs.p.n = !!(regs.x.l & 0x80); + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); } else { regs.x.w = regs.s.w; - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } } @@ -189,10 +194,10 @@ txs(0x9a) { } } -pha(0x48, regs.p.m, a), -phx(0xda, regs.p.x, x), -phy(0x5a, regs.p.x, y), -phd(0x0b, 0, d) { +pha(0x48, regs.acc_8b, a), +phx(0xda, regs.idx_8b, x), +phy(0x5a, regs.idx_8b, y), +phd(0x0b, 0, d) { 1:op_io(); 2:if(!$1)op_writestack(regs.$2.h); 3:last_cycle(); @@ -207,22 +212,22 @@ php(0x08, regs.p) { op_writestack($1); } -pla(0x68, regs.p.m, a), -plx(0xfa, regs.p.x, x), -ply(0x7a, regs.p.x, y), -pld(0x2b, 0, d) { +pla(0x68, regs.acc_8b, a), +plx(0xfa, regs.idx_8b, x), +ply(0x7a, regs.idx_8b, y), +pld(0x2b, 0, d) { 1:op_io(); 2:op_io(); 3:if($1)last_cycle(); regs.$2.l = op_readstack(); if($1) { - regs.p.n = !!(regs.$2.l & 0x80); + regs.p.n = bool(regs.$2.l & 0x80); regs.p.z = (regs.$2.l == 0); end; } 4:last_cycle(); regs.$2.h = op_readstack(); - regs.p.n = !!(regs.$2.w & 0x8000); + regs.p.n = bool(regs.$2.w & 0x8000); regs.p.z = (regs.$2.w == 0); } @@ -231,7 +236,7 @@ plb(0xab) { 2:op_io(); 3:last_cycle(); regs.db = op_readstack(); - regs.p.n = !!(regs.db & 0x80); + regs.p.n = bool(regs.db & 0x80); regs.p.z = (regs.db == 0); } @@ -240,8 +245,9 @@ plp(0x28) { 2:op_io(); 3:last_cycle(); regs.p = op_readstack(); - if(regs.e)regs.p |= 0x30; - if(regs.p.x) { + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; } diff --git a/src/cpu/scpu/core/op_misc.cpp b/src/cpu/scpu/core/op_misc.cpp index 632e2b21..0bdd4ccc 100644 --- a/src/cpu/scpu/core/op_misc.cpp +++ b/src/cpu/scpu/core/op_misc.cpp @@ -18,7 +18,7 @@ case 0xeb: { regs.a.l ^= regs.a.h; regs.a.h ^= regs.a.l; regs.a.l ^= regs.a.h; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } break; @@ -30,8 +30,11 @@ case 0x54: { rd.l = op_readlong((sp << 16) | regs.x.w); op_writelong((dp << 16) | regs.y.w, rd.l); op_io(); - if(regs.p.x) { regs.x.l++; regs.y.l++; } - else { regs.x.w++; regs.y.w++; } + if(regs.idx_8b) { + regs.x.l ++; regs.y.l ++; + } else { + regs.x.w ++; regs.y.w ++; + } last_cycle(); op_io(); if(regs.a.w--)regs.pc.w -= 3; @@ -45,8 +48,11 @@ case 0x44: { rd.l = op_readlong((sp << 16) | regs.x.w); op_writelong((dp << 16) | regs.y.w, rd.l); op_io(); - if(regs.p.x) { regs.x.l--; regs.y.l--; } - else { regs.x.w--; regs.y.w--; } + if(regs.idx_8b) { + regs.x.l --; regs.y.l --; + } else { + regs.x.w --; regs.y.w --; + } last_cycle(); op_io(); if(regs.a.w--)regs.pc.w -= 3; @@ -114,11 +120,12 @@ case 0xfb: { bool c = regs.p.c; regs.p.c = regs.e; regs.e = c; - if(regs.e) { - regs.p |= 0x30; + if(regs.e)regs.s.h = 0x01; + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; - regs.s.h = 0x01; } } break; @@ -177,8 +184,9 @@ case 0xc2: { last_cycle(); op_io(); regs.p &=~ rd.l; - if(regs.e)regs.p |= 0x30; - if(regs.p.x) { + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; } @@ -190,8 +198,9 @@ case 0xe2: { last_cycle(); op_io(); regs.p |= rd.l; - if(regs.e)regs.p |= 0x30; - if(regs.p.x) { + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; } @@ -201,13 +210,13 @@ case 0xe2: { case 0xaa: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.x.l = regs.a.l; - regs.p.n = !!(regs.x.l & 0x80); + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); } else { regs.x.w = regs.a.w; - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } } break; @@ -216,13 +225,13 @@ case 0xaa: { case 0xa8: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.y.l = regs.a.l; - regs.p.n = !!(regs.y.l & 0x80); + regs.p.n = bool(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); } else { regs.y.w = regs.a.w; - regs.p.n = !!(regs.y.w & 0x8000); + regs.p.n = bool(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } } break; @@ -231,13 +240,13 @@ case 0xa8: { case 0x8a: { last_cycle(); op_io(); - if(regs.p.m) { + if(regs.acc_8b) { regs.a.l = regs.x.l; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { regs.a.w = regs.x.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -246,13 +255,13 @@ case 0x8a: { case 0x9b: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.y.l = regs.x.l; - regs.p.n = !!(regs.y.l & 0x80); + regs.p.n = bool(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); } else { regs.y.w = regs.x.w; - regs.p.n = !!(regs.y.w & 0x8000); + regs.p.n = bool(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } } break; @@ -261,13 +270,13 @@ case 0x9b: { case 0x98: { last_cycle(); op_io(); - if(regs.p.m) { + if(regs.acc_8b) { regs.a.l = regs.y.l; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { regs.a.w = regs.y.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -276,13 +285,13 @@ case 0x98: { case 0xbb: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.x.l = regs.y.l; - regs.p.n = !!(regs.x.l & 0x80); + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); } else { regs.x.w = regs.y.w; - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } } break; @@ -292,7 +301,7 @@ case 0x5b: { last_cycle(); op_io(); regs.d.w = regs.a.w; - regs.p.n = !!(regs.d.w & 0x8000); + regs.p.n = bool(regs.d.w & 0x8000); regs.p.z = (regs.d.w == 0); } break; @@ -309,7 +318,7 @@ case 0x7b: { last_cycle(); op_io(); regs.a.w = regs.d.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } break; @@ -319,10 +328,10 @@ case 0x3b: { op_io(); regs.a.w = regs.s.w; if(regs.e) { - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -331,13 +340,13 @@ case 0x3b: { case 0xba: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.x.l = regs.s.l; - regs.p.n = !!(regs.x.l & 0x80); + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); } else { regs.x.w = regs.s.w; - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } } break; @@ -356,7 +365,7 @@ case 0x9a: { //pha case 0x48: { op_io(); - if(!regs.p.m)op_writestack(regs.a.h); + if(!regs.acc_8b)op_writestack(regs.a.h); last_cycle(); op_writestack(regs.a.l); } break; @@ -364,7 +373,7 @@ case 0x48: { //phx case 0xda: { op_io(); - if(!regs.p.x)op_writestack(regs.x.h); + if(!regs.idx_8b)op_writestack(regs.x.h); last_cycle(); op_writestack(regs.x.l); } break; @@ -372,7 +381,7 @@ case 0xda: { //phy case 0x5a: { op_io(); - if(!regs.p.x)op_writestack(regs.y.h); + if(!regs.idx_8b)op_writestack(regs.y.h); last_cycle(); op_writestack(regs.y.l); } break; @@ -380,9 +389,9 @@ case 0x5a: { //phd case 0x0b: { op_io(); - if(!0)op_writestack(regs. d.h); + if(!0)op_writestack(regs. d.h); last_cycle(); - op_writestack(regs. d.l); + op_writestack(regs. d.l); } break; //phb @@ -410,16 +419,16 @@ case 0x08: { case 0x68: { op_io(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); regs.a.l = op_readstack(); - if(regs.p.m) { - regs.p.n = !!(regs.a.l & 0x80); + if(regs.acc_8b) { + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); break; } last_cycle(); regs.a.h = op_readstack(); - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } break; @@ -427,16 +436,16 @@ case 0x68: { case 0xfa: { op_io(); op_io(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); regs.x.l = op_readstack(); - if(regs.p.x) { - regs.p.n = !!(regs.x.l & 0x80); + if(regs.idx_8b) { + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); break; } last_cycle(); regs.x.h = op_readstack(); - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } break; @@ -444,16 +453,16 @@ case 0xfa: { case 0x7a: { op_io(); op_io(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); regs.y.l = op_readstack(); - if(regs.p.x) { - regs.p.n = !!(regs.y.l & 0x80); + if(regs.idx_8b) { + regs.p.n = bool(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); break; } last_cycle(); regs.y.h = op_readstack(); - regs.p.n = !!(regs.y.w & 0x8000); + regs.p.n = bool(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } break; @@ -462,16 +471,16 @@ case 0x2b: { op_io(); op_io(); if(0)last_cycle(); - regs. d.l = op_readstack(); + regs. d.l = op_readstack(); if(0) { - regs.p.n = !!(regs. d.l & 0x80); - regs.p.z = (regs. d.l == 0); + regs.p.n = bool(regs. d.l & 0x80); + regs.p.z = (regs. d.l == 0); break; } last_cycle(); - regs. d.h = op_readstack(); - regs.p.n = !!(regs. d.w & 0x8000); - regs.p.z = (regs. d.w == 0); + regs. d.h = op_readstack(); + regs.p.n = bool(regs. d.w & 0x8000); + regs.p.z = (regs. d.w == 0); } break; //plb @@ -480,7 +489,7 @@ case 0xab: { op_io(); last_cycle(); regs.db = op_readstack(); - regs.p.n = !!(regs.db & 0x80); + regs.p.n = bool(regs.db & 0x80); regs.p.z = (regs.db == 0); } break; @@ -490,8 +499,9 @@ case 0x28: { op_io(); last_cycle(); regs.p = op_readstack(); - if(regs.e)regs.p |= 0x30; - if(regs.p.x) { + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; } diff --git a/src/cpu/scpu/core/op_pc.b b/src/cpu/scpu/core/op_pc.b index 7b126675..1a3b9e06 100644 --- a/src/cpu/scpu/core/op_pc.b +++ b/src/cpu/scpu/core/op_pc.b @@ -48,7 +48,7 @@ jmp_long(0x5c) { 2:rd.h = op_readpc(); 3:last_cycle(); rd.b = op_readpc(); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); } jmp_iaddr(0x6c) { @@ -77,7 +77,7 @@ jmp_iladdr(0xdc) { 4:rd.h = op_readaddr(aa.w + 1); 5:last_cycle(); rd.b = op_readaddr(aa.w + 2); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); } jsr_addr(0x20) { @@ -101,7 +101,7 @@ jsr_long(0x22) { op_writestack(regs.pc.h); 7:last_cycle(); op_writestack(regs.pc.l); - regs.pc.d = aa.d & 0xffffff; + regs.pc.d = uclip<24>(aa.d); } jsr_iaddrx(0xfc) { @@ -120,8 +120,9 @@ rti(0x40) { 1:op_io(); 2:op_io(); 3:regs.p = op_readstack(); - if(regs.e)regs.p |= 0x30; - if(regs.p.x) { + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; } @@ -134,7 +135,7 @@ rti(0x40) { } 6:last_cycle(); rd.b = op_readstack(); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); } rts(0x60) { @@ -155,6 +156,6 @@ rtl(0x6b) { 4:rd.h = op_readstack(); 5:last_cycle(); rd.b = op_readstack(); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); regs.pc.w++; } diff --git a/src/cpu/scpu/core/op_pc.cpp b/src/cpu/scpu/core/op_pc.cpp index 14a4c74e..4fd741a4 100644 --- a/src/cpu/scpu/core/op_pc.cpp +++ b/src/cpu/scpu/core/op_pc.cpp @@ -151,7 +151,7 @@ case 0x5c: { rd.h = op_readpc(); last_cycle(); rd.b = op_readpc(); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); } break; //jmp_iaddr @@ -183,7 +183,7 @@ case 0xdc: { rd.h = op_readaddr(aa.w + 1); last_cycle(); rd.b = op_readaddr(aa.w + 2); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); } break; //jsr_addr @@ -209,7 +209,7 @@ case 0x22: { op_writestack(regs.pc.h); last_cycle(); op_writestack(regs.pc.l); - regs.pc.d = aa.d & 0xffffff; + regs.pc.d = uclip<24>(aa.d); } break; //jsr_iaddrx @@ -230,8 +230,9 @@ case 0x40: { op_io(); op_io(); regs.p = op_readstack(); - if(regs.e)regs.p |= 0x30; - if(regs.p.x) { + regs.acc_8b = (regs.e || regs.p.m); + regs.idx_8b = (regs.e || regs.p.x); + if(regs.idx_8b) { regs.x.h = 0x00; regs.y.h = 0x00; } @@ -244,7 +245,7 @@ case 0x40: { } last_cycle(); rd.b = op_readstack(); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); } break; //rts @@ -267,7 +268,7 @@ case 0x6b: { rd.h = op_readstack(); last_cycle(); rd.b = op_readstack(); - regs.pc.d = rd.d & 0xffffff; + regs.pc.d = uclip<24>(rd.d); regs.pc.w++; } break; diff --git a/src/cpu/scpu/core/op_read.b b/src/cpu/scpu/core/op_read.b index 1b3d986f..393f55b7 100644 --- a/src/cpu/scpu/core/op_read.b +++ b/src/cpu/scpu/core/op_read.b @@ -1,14 +1,14 @@ -adc_const(0x69, adc, regs.p.m), -and_const(0x29, and, regs.p.m), -cmp_const(0xc9, cmp, regs.p.m), -cpx_const(0xe0, cpx, regs.p.x), -cpy_const(0xc0, cpy, regs.p.x), -eor_const(0x49, eor, regs.p.m), -lda_const(0xa9, lda, regs.p.m), -ldx_const(0xa2, ldx, regs.p.x), -ldy_const(0xa0, ldy, regs.p.x), -ora_const(0x09, ora, regs.p.m), -sbc_const(0xe9, sbc, regs.p.m) { +adc_const(0x69, adc, regs.acc_8b), +and_const(0x29, and, regs.acc_8b), +cmp_const(0xc9, cmp, regs.acc_8b), +cpx_const(0xe0, cpx, regs.idx_8b), +cpy_const(0xc0, cpy, regs.idx_8b), +eor_const(0x49, eor, regs.acc_8b), +lda_const(0xa9, lda, regs.acc_8b), +ldx_const(0xa2, ldx, regs.idx_8b), +ldy_const(0xa0, ldy, regs.idx_8b), +ora_const(0x09, ora, regs.acc_8b), +sbc_const(0xe9, sbc, regs.acc_8b) { 1:if($2)last_cycle(); rd.l = op_readpc(); if($2) { op_$1_b(); end; } @@ -17,18 +17,18 @@ sbc_const(0xe9, sbc, regs.p.m) { op_$1_w(); } -adc_addr(0x6d, adc, regs.p.m), -and_addr(0x2d, and, regs.p.m), -bit_addr(0x2c, bit, regs.p.m), -cmp_addr(0xcd, cmp, regs.p.m), -cpx_addr(0xec, cpx, regs.p.x), -cpy_addr(0xcc, cpy, regs.p.x), -eor_addr(0x4d, eor, regs.p.m), -lda_addr(0xad, lda, regs.p.m), -ldx_addr(0xae, ldx, regs.p.x), -ldy_addr(0xac, ldy, regs.p.x), -ora_addr(0x0d, ora, regs.p.m), -sbc_addr(0xed, sbc, regs.p.m) { +adc_addr(0x6d, adc, regs.acc_8b), +and_addr(0x2d, and, regs.acc_8b), +bit_addr(0x2c, bit, regs.acc_8b), +cmp_addr(0xcd, cmp, regs.acc_8b), +cpx_addr(0xec, cpx, regs.idx_8b), +cpy_addr(0xcc, cpy, regs.idx_8b), +eor_addr(0x4d, eor, regs.acc_8b), +lda_addr(0xad, lda, regs.acc_8b), +ldx_addr(0xae, ldx, regs.idx_8b), +ldy_addr(0xac, ldy, regs.idx_8b), +ora_addr(0x0d, ora, regs.acc_8b), +sbc_addr(0xed, sbc, regs.acc_8b) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:if($2)last_cycle(); @@ -39,15 +39,15 @@ sbc_addr(0xed, sbc, regs.p.m) { op_$1_w(); } -adc_addrx(0x7d, adc, regs.p.m), -and_addrx(0x3d, and, regs.p.m), -bit_addrx(0x3c, bit, regs.p.m), -cmp_addrx(0xdd, cmp, regs.p.m), -eor_addrx(0x5d, eor, regs.p.m), -lda_addrx(0xbd, lda, regs.p.m), -ldy_addrx(0xbc, ldy, regs.p.x), -ora_addrx(0x1d, ora, regs.p.m), -sbc_addrx(0xfd, sbc, regs.p.m) { +adc_addrx(0x7d, adc, regs.acc_8b), +and_addrx(0x3d, and, regs.acc_8b), +bit_addrx(0x3c, bit, regs.acc_8b), +cmp_addrx(0xdd, cmp, regs.acc_8b), +eor_addrx(0x5d, eor, regs.acc_8b), +lda_addrx(0xbd, lda, regs.acc_8b), +ldy_addrx(0xbc, ldy, regs.idx_8b), +ora_addrx(0x1d, ora, regs.acc_8b), +sbc_addrx(0xfd, sbc, regs.acc_8b) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:op_io_cond4(aa.w, aa.w + regs.x.w); @@ -59,14 +59,14 @@ sbc_addrx(0xfd, sbc, regs.p.m) { op_$1_w(); } -adc_addry(0x79, adc, regs.p.m), -and_addry(0x39, and, regs.p.m), -cmp_addry(0xd9, cmp, regs.p.m), -eor_addry(0x59, eor, regs.p.m), -lda_addry(0xb9, lda, regs.p.m), -ldx_addry(0xbe, ldx, regs.p.x), -ora_addry(0x19, ora, regs.p.m), -sbc_addry(0xf9, sbc, regs.p.m) { +adc_addry(0x79, adc, regs.acc_8b), +and_addry(0x39, and, regs.acc_8b), +cmp_addry(0xd9, cmp, regs.acc_8b), +eor_addry(0x59, eor, regs.acc_8b), +lda_addry(0xb9, lda, regs.acc_8b), +ldx_addry(0xbe, ldx, regs.idx_8b), +ora_addry(0x19, ora, regs.acc_8b), +sbc_addry(0xf9, sbc, regs.acc_8b) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:op_io_cond4(aa.w, aa.w + regs.y.w); @@ -78,13 +78,13 @@ sbc_addry(0xf9, sbc, regs.p.m) { op_$1_w(); } -adc_long(0x6f, adc, regs.p.m), -and_long(0x2f, and, regs.p.m), -cmp_long(0xcf, cmp, regs.p.m), -eor_long(0x4f, eor, regs.p.m), -lda_long(0xaf, lda, regs.p.m), -ora_long(0x0f, ora, regs.p.m), -sbc_long(0xef, sbc, regs.p.m) { +adc_long(0x6f, adc, regs.acc_8b), +and_long(0x2f, and, regs.acc_8b), +cmp_long(0xcf, cmp, regs.acc_8b), +eor_long(0x4f, eor, regs.acc_8b), +lda_long(0xaf, lda, regs.acc_8b), +ora_long(0x0f, ora, regs.acc_8b), +sbc_long(0xef, sbc, regs.acc_8b) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:aa.b = op_readpc(); @@ -96,13 +96,13 @@ sbc_long(0xef, sbc, regs.p.m) { op_$1_w(); } -adc_longx(0x7f, adc, regs.p.m), -and_longx(0x3f, and, regs.p.m), -cmp_longx(0xdf, cmp, regs.p.m), -eor_longx(0x5f, eor, regs.p.m), -lda_longx(0xbf, lda, regs.p.m), -ora_longx(0x1f, ora, regs.p.m), -sbc_longx(0xff, sbc, regs.p.m) { +adc_longx(0x7f, adc, regs.acc_8b), +and_longx(0x3f, and, regs.acc_8b), +cmp_longx(0xdf, cmp, regs.acc_8b), +eor_longx(0x5f, eor, regs.acc_8b), +lda_longx(0xbf, lda, regs.acc_8b), +ora_longx(0x1f, ora, regs.acc_8b), +sbc_longx(0xff, sbc, regs.acc_8b) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:aa.b = op_readpc(); @@ -114,18 +114,18 @@ sbc_longx(0xff, sbc, regs.p.m) { op_$1_w(); } -adc_dp(0x65, adc, regs.p.m), -and_dp(0x25, and, regs.p.m), -bit_dp(0x24, bit, regs.p.m), -cmp_dp(0xc5, cmp, regs.p.m), -cpx_dp(0xe4, cpx, regs.p.x), -cpy_dp(0xc4, cpy, regs.p.x), -eor_dp(0x45, eor, regs.p.m), -lda_dp(0xa5, lda, regs.p.m), -ldx_dp(0xa6, ldx, regs.p.x), -ldy_dp(0xa4, ldy, regs.p.x), -ora_dp(0x05, ora, regs.p.m), -sbc_dp(0xe5, sbc, regs.p.m) { +adc_dp(0x65, adc, regs.acc_8b), +and_dp(0x25, and, regs.acc_8b), +bit_dp(0x24, bit, regs.acc_8b), +cmp_dp(0xc5, cmp, regs.acc_8b), +cpx_dp(0xe4, cpx, regs.idx_8b), +cpy_dp(0xc4, cpy, regs.idx_8b), +eor_dp(0x45, eor, regs.acc_8b), +lda_dp(0xa5, lda, regs.acc_8b), +ldx_dp(0xa6, ldx, regs.idx_8b), +ldy_dp(0xa4, ldy, regs.idx_8b), +ora_dp(0x05, ora, regs.acc_8b), +sbc_dp(0xe5, sbc, regs.acc_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:if($2)last_cycle(); @@ -136,15 +136,15 @@ sbc_dp(0xe5, sbc, regs.p.m) { op_$1_w(); } -adc_dpx(0x75, adc, regs.p.m), -and_dpx(0x35, and, regs.p.m), -bit_dpx(0x34, bit, regs.p.m), -cmp_dpx(0xd5, cmp, regs.p.m), -eor_dpx(0x55, eor, regs.p.m), -lda_dpx(0xb5, lda, regs.p.m), -ldy_dpx(0xb4, ldy, regs.p.x), -ora_dpx(0x15, ora, regs.p.m), -sbc_dpx(0xf5, sbc, regs.p.m) { +adc_dpx(0x75, adc, regs.acc_8b), +and_dpx(0x35, and, regs.acc_8b), +bit_dpx(0x34, bit, regs.acc_8b), +cmp_dpx(0xd5, cmp, regs.acc_8b), +eor_dpx(0x55, eor, regs.acc_8b), +lda_dpx(0xb5, lda, regs.acc_8b), +ldy_dpx(0xb4, ldy, regs.idx_8b), +ora_dpx(0x15, ora, regs.acc_8b), +sbc_dpx(0xf5, sbc, regs.acc_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:op_io(); @@ -156,7 +156,7 @@ sbc_dpx(0xf5, sbc, regs.p.m) { op_$1_w(); } -ldx_dpy(0xb6, ldx, regs.p.x) { +ldx_dpy(0xb6, ldx, regs.idx_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:op_io(); @@ -168,13 +168,13 @@ ldx_dpy(0xb6, ldx, regs.p.x) { op_$1_w(); } -adc_idp(0x72, adc, regs.p.m), -and_idp(0x32, and, regs.p.m), -cmp_idp(0xd2, cmp, regs.p.m), -eor_idp(0x52, eor, regs.p.m), -lda_idp(0xb2, lda, regs.p.m), -ora_idp(0x12, ora, regs.p.m), -sbc_idp(0xf2, sbc, regs.p.m) { +adc_idp(0x72, adc, regs.acc_8b), +and_idp(0x32, and, regs.acc_8b), +cmp_idp(0xd2, cmp, regs.acc_8b), +eor_idp(0x52, eor, regs.acc_8b), +lda_idp(0xb2, lda, regs.acc_8b), +ora_idp(0x12, ora, regs.acc_8b), +sbc_idp(0xf2, sbc, regs.acc_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:aa.l = op_readdp(dp); @@ -187,13 +187,13 @@ sbc_idp(0xf2, sbc, regs.p.m) { op_$1_w(); } -adc_idpx(0x61, adc, regs.p.m), -and_idpx(0x21, and, regs.p.m), -cmp_idpx(0xc1, cmp, regs.p.m), -eor_idpx(0x41, eor, regs.p.m), -lda_idpx(0xa1, lda, regs.p.m), -ora_idpx(0x01, ora, regs.p.m), -sbc_idpx(0xe1, sbc, regs.p.m) { +adc_idpx(0x61, adc, regs.acc_8b), +and_idpx(0x21, and, regs.acc_8b), +cmp_idpx(0xc1, cmp, regs.acc_8b), +eor_idpx(0x41, eor, regs.acc_8b), +lda_idpx(0xa1, lda, regs.acc_8b), +ora_idpx(0x01, ora, regs.acc_8b), +sbc_idpx(0xe1, sbc, regs.acc_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:op_io(); @@ -207,13 +207,13 @@ sbc_idpx(0xe1, sbc, regs.p.m) { op_$1_w(); } -adc_idpy(0x71, adc, regs.p.m), -and_idpy(0x31, and, regs.p.m), -cmp_idpy(0xd1, cmp, regs.p.m), -eor_idpy(0x51, eor, regs.p.m), -lda_idpy(0xb1, lda, regs.p.m), -ora_idpy(0x11, ora, regs.p.m), -sbc_idpy(0xf1, sbc, regs.p.m) { +adc_idpy(0x71, adc, regs.acc_8b), +and_idpy(0x31, and, regs.acc_8b), +cmp_idpy(0xd1, cmp, regs.acc_8b), +eor_idpy(0x51, eor, regs.acc_8b), +lda_idpy(0xb1, lda, regs.acc_8b), +ora_idpy(0x11, ora, regs.acc_8b), +sbc_idpy(0xf1, sbc, regs.acc_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:aa.l = op_readdp(dp); @@ -227,13 +227,13 @@ sbc_idpy(0xf1, sbc, regs.p.m) { op_$1_w(); } -adc_ildp(0x67, adc, regs.p.m), -and_ildp(0x27, and, regs.p.m), -cmp_ildp(0xc7, cmp, regs.p.m), -eor_ildp(0x47, eor, regs.p.m), -lda_ildp(0xa7, lda, regs.p.m), -ora_ildp(0x07, ora, regs.p.m), -sbc_ildp(0xe7, sbc, regs.p.m) { +adc_ildp(0x67, adc, regs.acc_8b), +and_ildp(0x27, and, regs.acc_8b), +cmp_ildp(0xc7, cmp, regs.acc_8b), +eor_ildp(0x47, eor, regs.acc_8b), +lda_ildp(0xa7, lda, regs.acc_8b), +ora_ildp(0x07, ora, regs.acc_8b), +sbc_ildp(0xe7, sbc, regs.acc_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:aa.l = op_readdp(dp); @@ -247,13 +247,13 @@ sbc_ildp(0xe7, sbc, regs.p.m) { op_$1_w(); } -adc_ildpy(0x77, adc, regs.p.m), -and_ildpy(0x37, and, regs.p.m), -cmp_ildpy(0xd7, cmp, regs.p.m), -eor_ildpy(0x57, eor, regs.p.m), -lda_ildpy(0xb7, lda, regs.p.m), -ora_ildpy(0x17, ora, regs.p.m), -sbc_ildpy(0xf7, sbc, regs.p.m) { +adc_ildpy(0x77, adc, regs.acc_8b), +and_ildpy(0x37, and, regs.acc_8b), +cmp_ildpy(0xd7, cmp, regs.acc_8b), +eor_ildpy(0x57, eor, regs.acc_8b), +lda_ildpy(0xb7, lda, regs.acc_8b), +ora_ildpy(0x17, ora, regs.acc_8b), +sbc_ildpy(0xf7, sbc, regs.acc_8b) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:aa.l = op_readdp(dp); @@ -267,13 +267,13 @@ sbc_ildpy(0xf7, sbc, regs.p.m) { op_$1_w(); } -adc_sr(0x63, adc, regs.p.m), -and_sr(0x23, and, regs.p.m), -cmp_sr(0xc3, cmp, regs.p.m), -eor_sr(0x43, eor, regs.p.m), -lda_sr(0xa3, lda, regs.p.m), -ora_sr(0x03, ora, regs.p.m), -sbc_sr(0xe3, sbc, regs.p.m) { +adc_sr(0x63, adc, regs.acc_8b), +and_sr(0x23, and, regs.acc_8b), +cmp_sr(0xc3, cmp, regs.acc_8b), +eor_sr(0x43, eor, regs.acc_8b), +lda_sr(0xa3, lda, regs.acc_8b), +ora_sr(0x03, ora, regs.acc_8b), +sbc_sr(0xe3, sbc, regs.acc_8b) { 1:sp = op_readpc(); 2:op_io(); 3:if($2)last_cycle(); @@ -296,18 +296,18 @@ sbc_isry(0xf3, sbc) { 3:aa.l = op_readsp(sp); 4:aa.h = op_readsp(sp + 1); 5:op_io(); -6:if(regs.p.m)last_cycle(); +6:if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_$1_b(); end; } + if(regs.acc_8b) { op_$1_b(); end; } 7:last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_$1_w(); } bit_const(0x89) { -1:if(regs.p.m)last_cycle(); +1:if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { + if(regs.acc_8b) { regs.p.z = ((rd.l & regs.a.l) == 0); end; } diff --git a/src/cpu/scpu/core/op_read.cpp b/src/cpu/scpu/core/op_read.cpp index fee2eda8..680feb3e 100644 --- a/src/cpu/scpu/core/op_read.cpp +++ b/src/cpu/scpu/core/op_read.cpp @@ -1,8 +1,8 @@ //adc_const case 0x69: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readpc(); op_adc_w(); @@ -10,9 +10,9 @@ case 0x69: { //and_const case 0x29: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readpc(); op_and_w(); @@ -20,9 +20,9 @@ case 0x29: { //cmp_const case 0xc9: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readpc(); op_cmp_w(); @@ -30,9 +30,9 @@ case 0xc9: { //cpx_const case 0xe0: { - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_cpx_b(); break; } + if(regs.idx_8b) { op_cpx_b(); break; } last_cycle(); rd.h = op_readpc(); op_cpx_w(); @@ -40,9 +40,9 @@ case 0xe0: { //cpy_const case 0xc0: { - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_cpy_b(); break; } + if(regs.idx_8b) { op_cpy_b(); break; } last_cycle(); rd.h = op_readpc(); op_cpy_w(); @@ -50,9 +50,9 @@ case 0xc0: { //eor_const case 0x49: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readpc(); op_eor_w(); @@ -60,9 +60,9 @@ case 0x49: { //lda_const case 0xa9: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readpc(); op_lda_w(); @@ -70,9 +70,9 @@ case 0xa9: { //ldx_const case 0xa2: { - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.idx_8b) { op_ldx_b(); break; } last_cycle(); rd.h = op_readpc(); op_ldx_w(); @@ -80,9 +80,9 @@ case 0xa2: { //ldy_const case 0xa0: { - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.idx_8b) { op_ldy_b(); break; } last_cycle(); rd.h = op_readpc(); op_ldy_w(); @@ -90,9 +90,9 @@ case 0xa0: { //ora_const case 0x09: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readpc(); op_ora_w(); @@ -100,9 +100,9 @@ case 0x09: { //sbc_const case 0xe9: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readpc(); op_sbc_w(); @@ -112,9 +112,9 @@ case 0xe9: { case 0x6d: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_adc_w(); @@ -124,9 +124,9 @@ case 0x6d: { case 0x2d: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_and_w(); @@ -136,9 +136,9 @@ case 0x2d: { case 0x2c: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_bit_b(); break; } + if(regs.acc_8b) { op_bit_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_bit_w(); @@ -148,9 +148,9 @@ case 0x2c: { case 0xcd: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cmp_w(); @@ -160,9 +160,9 @@ case 0xcd: { case 0xec: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_cpx_b(); break; } + if(regs.idx_8b) { op_cpx_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cpx_w(); @@ -172,9 +172,9 @@ case 0xec: { case 0xcc: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_cpy_b(); break; } + if(regs.idx_8b) { op_cpy_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cpy_w(); @@ -184,9 +184,9 @@ case 0xcc: { case 0x4d: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_eor_w(); @@ -196,9 +196,9 @@ case 0x4d: { case 0xad: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_lda_w(); @@ -208,9 +208,9 @@ case 0xad: { case 0xae: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.idx_8b) { op_ldx_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ldx_w(); @@ -220,9 +220,9 @@ case 0xae: { case 0xac: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.idx_8b) { op_ldy_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ldy_w(); @@ -232,9 +232,9 @@ case 0xac: { case 0x0d: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ora_w(); @@ -244,9 +244,9 @@ case 0x0d: { case 0xed: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_sbc_w(); @@ -257,9 +257,9 @@ case 0x7d: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_adc_w(); @@ -270,9 +270,9 @@ case 0x3d: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_and_w(); @@ -283,9 +283,9 @@ case 0x3c: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_bit_b(); break; } + if(regs.acc_8b) { op_bit_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_bit_w(); @@ -296,9 +296,9 @@ case 0xdd: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_cmp_w(); @@ -309,9 +309,9 @@ case 0x5d: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_eor_w(); @@ -322,9 +322,9 @@ case 0xbd: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_lda_w(); @@ -335,9 +335,9 @@ case 0xbc: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.idx_8b) { op_ldy_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_ldy_w(); @@ -348,9 +348,9 @@ case 0x1d: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_ora_w(); @@ -361,9 +361,9 @@ case 0xfd: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_sbc_w(); @@ -374,9 +374,9 @@ case 0x79: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); @@ -387,9 +387,9 @@ case 0x39: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); @@ -400,9 +400,9 @@ case 0xd9: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); @@ -413,9 +413,9 @@ case 0x59: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); @@ -426,9 +426,9 @@ case 0xb9: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); @@ -439,9 +439,9 @@ case 0xbe: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.idx_8b) { op_ldx_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ldx_w(); @@ -452,9 +452,9 @@ case 0x19: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); @@ -465,9 +465,9 @@ case 0xf9: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); @@ -478,9 +478,9 @@ case 0x6f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_adc_w(); @@ -491,9 +491,9 @@ case 0x2f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_and_w(); @@ -504,9 +504,9 @@ case 0xcf: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_cmp_w(); @@ -517,9 +517,9 @@ case 0x4f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_eor_w(); @@ -530,9 +530,9 @@ case 0xaf: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_lda_w(); @@ -543,9 +543,9 @@ case 0x0f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_ora_w(); @@ -556,9 +556,9 @@ case 0xef: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_sbc_w(); @@ -569,9 +569,9 @@ case 0x7f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_adc_w(); @@ -582,9 +582,9 @@ case 0x3f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_and_w(); @@ -595,9 +595,9 @@ case 0xdf: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_cmp_w(); @@ -608,9 +608,9 @@ case 0x5f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_eor_w(); @@ -621,9 +621,9 @@ case 0xbf: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_lda_w(); @@ -634,9 +634,9 @@ case 0x1f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_ora_w(); @@ -647,9 +647,9 @@ case 0xff: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_sbc_w(); @@ -659,9 +659,9 @@ case 0xff: { case 0x65: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_adc_w(); @@ -671,9 +671,9 @@ case 0x65: { case 0x25: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_and_w(); @@ -683,9 +683,9 @@ case 0x25: { case 0x24: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_bit_b(); break; } + if(regs.acc_8b) { op_bit_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_bit_w(); @@ -695,9 +695,9 @@ case 0x24: { case 0xc5: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_cmp_w(); @@ -707,9 +707,9 @@ case 0xc5: { case 0xe4: { dp = op_readpc(); op_io_cond2(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_cpx_b(); break; } + if(regs.idx_8b) { op_cpx_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_cpx_w(); @@ -719,9 +719,9 @@ case 0xe4: { case 0xc4: { dp = op_readpc(); op_io_cond2(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_cpy_b(); break; } + if(regs.idx_8b) { op_cpy_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_cpy_w(); @@ -731,9 +731,9 @@ case 0xc4: { case 0x45: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_eor_w(); @@ -743,9 +743,9 @@ case 0x45: { case 0xa5: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_lda_w(); @@ -755,9 +755,9 @@ case 0xa5: { case 0xa6: { dp = op_readpc(); op_io_cond2(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.idx_8b) { op_ldx_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_ldx_w(); @@ -767,9 +767,9 @@ case 0xa6: { case 0xa4: { dp = op_readpc(); op_io_cond2(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.idx_8b) { op_ldy_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_ldy_w(); @@ -779,9 +779,9 @@ case 0xa4: { case 0x05: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_ora_w(); @@ -791,9 +791,9 @@ case 0x05: { case 0xe5: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdp(dp + 1); op_sbc_w(); @@ -804,9 +804,9 @@ case 0x75: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_adc_w(); @@ -817,9 +817,9 @@ case 0x35: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_and_w(); @@ -830,9 +830,9 @@ case 0x34: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_bit_b(); break; } + if(regs.acc_8b) { op_bit_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_bit_w(); @@ -843,9 +843,9 @@ case 0xd5: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_cmp_w(); @@ -856,9 +856,9 @@ case 0x55: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_eor_w(); @@ -869,9 +869,9 @@ case 0xb5: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_lda_w(); @@ -882,9 +882,9 @@ case 0xb4: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.idx_8b) { op_ldy_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_ldy_w(); @@ -895,9 +895,9 @@ case 0x15: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_ora_w(); @@ -908,9 +908,9 @@ case 0xf5: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_sbc_w(); @@ -921,9 +921,9 @@ case 0xb6: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); rd.l = op_readdp(dp + regs.y.w); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.idx_8b) { op_ldx_b(); break; } last_cycle(); rd.h = op_readdp(dp + regs.y.w + 1); op_ldx_w(); @@ -935,9 +935,9 @@ case 0x72: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_adc_w(); @@ -949,9 +949,9 @@ case 0x32: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_and_w(); @@ -963,9 +963,9 @@ case 0xd2: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cmp_w(); @@ -977,9 +977,9 @@ case 0x52: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_eor_w(); @@ -991,9 +991,9 @@ case 0xb2: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_lda_w(); @@ -1005,9 +1005,9 @@ case 0x12: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ora_w(); @@ -1019,9 +1019,9 @@ case 0xf2: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_sbc_w(); @@ -1034,9 +1034,9 @@ case 0x61: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_adc_w(); @@ -1049,9 +1049,9 @@ case 0x21: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_and_w(); @@ -1064,9 +1064,9 @@ case 0xc1: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cmp_w(); @@ -1079,9 +1079,9 @@ case 0x41: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_eor_w(); @@ -1094,9 +1094,9 @@ case 0xa1: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_lda_w(); @@ -1109,9 +1109,9 @@ case 0x01: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ora_w(); @@ -1124,9 +1124,9 @@ case 0xe1: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_sbc_w(); @@ -1139,9 +1139,9 @@ case 0x71: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); @@ -1154,9 +1154,9 @@ case 0x31: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); @@ -1169,9 +1169,9 @@ case 0xd1: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); @@ -1184,9 +1184,9 @@ case 0x51: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); @@ -1199,9 +1199,9 @@ case 0xb1: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); @@ -1214,9 +1214,9 @@ case 0x11: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); @@ -1229,9 +1229,9 @@ case 0xf1: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); @@ -1244,9 +1244,9 @@ case 0x67: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_adc_w(); @@ -1259,9 +1259,9 @@ case 0x27: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_and_w(); @@ -1274,9 +1274,9 @@ case 0xc7: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_cmp_w(); @@ -1289,9 +1289,9 @@ case 0x47: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_eor_w(); @@ -1304,9 +1304,9 @@ case 0xa7: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_lda_w(); @@ -1319,9 +1319,9 @@ case 0x07: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_ora_w(); @@ -1334,9 +1334,9 @@ case 0xe7: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_sbc_w(); @@ -1349,9 +1349,9 @@ case 0x77: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_adc_w(); @@ -1364,9 +1364,9 @@ case 0x37: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_and_w(); @@ -1379,9 +1379,9 @@ case 0xd7: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_cmp_w(); @@ -1394,9 +1394,9 @@ case 0x57: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_eor_w(); @@ -1409,9 +1409,9 @@ case 0xb7: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_lda_w(); @@ -1424,9 +1424,9 @@ case 0x17: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_ora_w(); @@ -1439,9 +1439,9 @@ case 0xf7: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_sbc_w(); @@ -1451,9 +1451,9 @@ case 0xf7: { case 0x63: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readsp(sp + 1); op_adc_w(); @@ -1463,9 +1463,9 @@ case 0x63: { case 0x23: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readsp(sp + 1); op_and_w(); @@ -1475,9 +1475,9 @@ case 0x23: { case 0xc3: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readsp(sp + 1); op_cmp_w(); @@ -1487,9 +1487,9 @@ case 0xc3: { case 0x43: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readsp(sp + 1); op_eor_w(); @@ -1499,9 +1499,9 @@ case 0x43: { case 0xa3: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readsp(sp + 1); op_lda_w(); @@ -1511,9 +1511,9 @@ case 0xa3: { case 0x03: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readsp(sp + 1); op_ora_w(); @@ -1523,9 +1523,9 @@ case 0x03: { case 0xe3: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readsp(sp + 1); op_sbc_w(); @@ -1538,9 +1538,9 @@ case 0x73: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.acc_8b) { op_adc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); @@ -1553,9 +1553,9 @@ case 0x33: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.acc_8b) { op_and_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); @@ -1568,9 +1568,9 @@ case 0xd3: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.acc_8b) { op_cmp_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); @@ -1583,9 +1583,9 @@ case 0x53: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.acc_8b) { op_eor_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); @@ -1598,9 +1598,9 @@ case 0xb3: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.acc_8b) { op_lda_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); @@ -1613,9 +1613,9 @@ case 0x13: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.acc_8b) { op_ora_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); @@ -1628,9 +1628,9 @@ case 0xf3: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.acc_8b) { op_sbc_b(); break; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); @@ -1638,9 +1638,9 @@ case 0xf3: { //bit_const case 0x89: { - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { + if(regs.acc_8b) { regs.p.z = ((rd.l & regs.a.l) == 0); break; } diff --git a/src/cpu/scpu/core/op_rmw.b b/src/cpu/scpu/core/op_rmw.b index d3b8b2f1..464e4d94 100644 --- a/src/cpu/scpu/core/op_rmw.b +++ b/src/cpu/scpu/core/op_rmw.b @@ -1,31 +1,31 @@ -inc(0x1a, regs.p.m, a), -inx(0xe8, regs.p.x, x), -iny(0xc8, regs.p.x, y) { +inc(0x1a, regs.acc_8b, a), +inx(0xe8, regs.idx_8b, x), +iny(0xc8, regs.idx_8b, y) { 1:last_cycle(); op_io(); if($1) { regs.$2.l++; - regs.p.n = !!(regs.$2.l & 0x80); + regs.p.n = bool(regs.$2.l & 0x80); regs.p.z = (regs.$2.l == 0); } else { regs.$2.w++; - regs.p.n = !!(regs.$2.w & 0x8000); + regs.p.n = bool(regs.$2.w & 0x8000); regs.p.z = (regs.$2.w == 0); } } -dec(0x3a, regs.p.m, a), -dex(0xca, regs.p.x, x), -dey(0x88, regs.p.x, y) { +dec(0x3a, regs.acc_8b, a), +dex(0xca, regs.idx_8b, x), +dey(0x88, regs.idx_8b, y) { 1:last_cycle(); op_io(); if($1) { regs.$2.l--; - regs.p.n = !!(regs.$2.l & 0x80); + regs.p.n = bool(regs.$2.l & 0x80); regs.p.z = (regs.$2.l == 0); } else { regs.$2.w--; - regs.p.n = !!(regs.$2.w & 0x8000); + regs.p.n = bool(regs.$2.w & 0x8000); regs.p.z = (regs.$2.w == 0); } } @@ -33,15 +33,15 @@ dey(0x88, regs.p.x, y) { asl(0x0a) { 1:last_cycle(); op_io(); - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); + if(regs.acc_8b) { + regs.p.c = bool(regs.a.l & 0x80); regs.a.l <<= 1; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { - regs.p.c = !!(regs.a.w & 0x8000); + regs.p.c = bool(regs.a.w & 0x8000); regs.a.w <<= 1; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } @@ -49,15 +49,15 @@ asl(0x0a) { lsr(0x4a) { 1:last_cycle(); op_io(); - if(regs.p.m) { + if(regs.acc_8b) { regs.p.c = regs.a.l & 1; regs.a.l >>= 1; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { regs.p.c = regs.a.w & 1; regs.a.w >>= 1; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } @@ -66,17 +66,17 @@ rol(0x2a) { 1:last_cycle(); op_io(); uint16 c = regs.p.c; - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); + if(regs.acc_8b) { + regs.p.c = bool(regs.a.l & 0x80); regs.a.l <<= 1; regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { - regs.p.c = !!(regs.a.w & 0x8000); + regs.p.c = bool(regs.a.w & 0x8000); regs.a.w <<= 1; regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } @@ -85,19 +85,19 @@ ror(0x6a) { 1:last_cycle(); op_io(); uint16 c; - if(regs.p.m) { + if(regs.acc_8b) { c = (regs.p.c)?0x80:0; regs.p.c = regs.a.l & 1; regs.a.l >>= 1; regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { c = (regs.p.c)?0x8000:0; regs.p.c = regs.a.w & 1; regs.a.w >>= 1; regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } @@ -113,9 +113,9 @@ tsb_addr(0x0c, tsb) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:rd.l = op_readdbr(aa.w); -4:if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); +4:if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); 5:op_io(); - if(regs.p.m) { op_$1_b(); } + if(regs.acc_8b) { op_$1_b(); } else { op_$1_w(); 6:op_writedbr(aa.w + 1, rd.h); } 7:last_cycle(); @@ -132,9 +132,9 @@ ror_addrx(0x7e, ror) { 2:aa.h = op_readpc(); 3:op_io(); 4:rd.l = op_readdbr(aa.w + regs.x.w); -5:if(!regs.p.m)rd.h = op_readdbr(aa.w + regs.x.w + 1); +5:if(!regs.acc_8b)rd.h = op_readdbr(aa.w + regs.x.w + 1); 6:op_io(); - if(regs.p.m) { op_$1_b(); } + if(regs.acc_8b) { op_$1_b(); } else { op_$1_w(); 7:op_writedbr(aa.w + regs.x.w + 1, rd.h); } 8:last_cycle(); @@ -152,9 +152,9 @@ tsb_dp(0x04, tsb) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:rd.l = op_readdp(dp); -4:if(!regs.p.m)rd.h = op_readdp(dp + 1); +4:if(!regs.acc_8b)rd.h = op_readdp(dp + 1); 5:op_io(); - if(regs.p.m) { op_$1_b(); } + if(regs.acc_8b) { op_$1_b(); } else { op_$1_w(); 6:op_writedp(dp + 1, rd.h); } 7:last_cycle(); @@ -171,9 +171,9 @@ ror_dpx(0x76, ror) { 2:op_io_cond2(); 3:op_io(); 4:rd.l = op_readdp(dp + regs.x.w); -5:if(!regs.p.m)rd.h = op_readdp(dp + regs.x.w + 1); +5:if(!regs.acc_8b)rd.h = op_readdp(dp + regs.x.w + 1); 6:op_io(); - if(regs.p.m) { op_$1_b(); } + if(regs.acc_8b) { op_$1_b(); } else { op_$1_w(); 7:op_writedp(dp + regs.x.w + 1, rd.h); } 8:last_cycle(); diff --git a/src/cpu/scpu/core/op_rmw.cpp b/src/cpu/scpu/core/op_rmw.cpp index 7924a1ab..a2280ce0 100644 --- a/src/cpu/scpu/core/op_rmw.cpp +++ b/src/cpu/scpu/core/op_rmw.cpp @@ -2,13 +2,13 @@ case 0x1a: { last_cycle(); op_io(); - if(regs.p.m) { + if(regs.acc_8b) { regs.a.l++; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { regs.a.w++; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -17,13 +17,13 @@ case 0x1a: { case 0xe8: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.x.l++; - regs.p.n = !!(regs.x.l & 0x80); + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); } else { regs.x.w++; - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } } break; @@ -32,13 +32,13 @@ case 0xe8: { case 0xc8: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.y.l++; - regs.p.n = !!(regs.y.l & 0x80); + regs.p.n = bool(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); } else { regs.y.w++; - regs.p.n = !!(regs.y.w & 0x8000); + regs.p.n = bool(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } } break; @@ -47,13 +47,13 @@ case 0xc8: { case 0x3a: { last_cycle(); op_io(); - if(regs.p.m) { + if(regs.acc_8b) { regs.a.l--; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { regs.a.w--; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -62,13 +62,13 @@ case 0x3a: { case 0xca: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.x.l--; - regs.p.n = !!(regs.x.l & 0x80); + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); } else { regs.x.w--; - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } } break; @@ -77,13 +77,13 @@ case 0xca: { case 0x88: { last_cycle(); op_io(); - if(regs.p.x) { + if(regs.idx_8b) { regs.y.l--; - regs.p.n = !!(regs.y.l & 0x80); + regs.p.n = bool(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); } else { regs.y.w--; - regs.p.n = !!(regs.y.w & 0x8000); + regs.p.n = bool(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } } break; @@ -92,15 +92,15 @@ case 0x88: { case 0x0a: { last_cycle(); op_io(); - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); + if(regs.acc_8b) { + regs.p.c = bool(regs.a.l & 0x80); regs.a.l <<= 1; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { - regs.p.c = !!(regs.a.w & 0x8000); + regs.p.c = bool(regs.a.w & 0x8000); regs.a.w <<= 1; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -109,15 +109,15 @@ case 0x0a: { case 0x4a: { last_cycle(); op_io(); - if(regs.p.m) { + if(regs.acc_8b) { regs.p.c = regs.a.l & 1; regs.a.l >>= 1; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { regs.p.c = regs.a.w & 1; regs.a.w >>= 1; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -127,17 +127,17 @@ case 0x2a: { last_cycle(); op_io(); uint16 c = regs.p.c; - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); + if(regs.acc_8b) { + regs.p.c = bool(regs.a.l & 0x80); regs.a.l <<= 1; regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { - regs.p.c = !!(regs.a.w & 0x8000); + regs.p.c = bool(regs.a.w & 0x8000); regs.a.w <<= 1; regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -147,19 +147,19 @@ case 0x6a: { last_cycle(); op_io(); uint16 c; - if(regs.p.m) { + if(regs.acc_8b) { c = (regs.p.c)?0x80:0; regs.p.c = regs.a.l & 1; regs.a.l >>= 1; regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } else { c = (regs.p.c)?0x8000:0; regs.p.c = regs.a.w & 1; regs.a.w >>= 1; regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } } break; @@ -169,9 +169,9 @@ case 0xee: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_inc_b(); } + if(regs.acc_8b) { op_inc_b(); } else { op_inc_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -183,9 +183,9 @@ case 0xce: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_dec_b(); } + if(regs.acc_8b) { op_dec_b(); } else { op_dec_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -197,9 +197,9 @@ case 0x0e: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_asl_b(); } + if(regs.acc_8b) { op_asl_b(); } else { op_asl_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -211,9 +211,9 @@ case 0x4e: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_lsr_b(); } + if(regs.acc_8b) { op_lsr_b(); } else { op_lsr_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -225,9 +225,9 @@ case 0x2e: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_rol_b(); } + if(regs.acc_8b) { op_rol_b(); } else { op_rol_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -239,9 +239,9 @@ case 0x6e: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_ror_b(); } + if(regs.acc_8b) { op_ror_b(); } else { op_ror_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -253,9 +253,9 @@ case 0x1c: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_trb_b(); } + if(regs.acc_8b) { op_trb_b(); } else { op_trb_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -267,9 +267,9 @@ case 0x0c: { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + 1); op_io(); - if(regs.p.m) { op_tsb_b(); } + if(regs.acc_8b) { op_tsb_b(); } else { op_tsb_w(); op_writedbr(aa.w + 1, rd.h); } last_cycle(); @@ -282,9 +282,9 @@ case 0xfe: { aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + regs.x.w + 1); op_io(); - if(regs.p.m) { op_inc_b(); } + if(regs.acc_8b) { op_inc_b(); } else { op_inc_w(); op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); @@ -297,9 +297,9 @@ case 0xde: { aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + regs.x.w + 1); op_io(); - if(regs.p.m) { op_dec_b(); } + if(regs.acc_8b) { op_dec_b(); } else { op_dec_w(); op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); @@ -312,9 +312,9 @@ case 0x1e: { aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + regs.x.w + 1); op_io(); - if(regs.p.m) { op_asl_b(); } + if(regs.acc_8b) { op_asl_b(); } else { op_asl_w(); op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); @@ -327,9 +327,9 @@ case 0x5e: { aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + regs.x.w + 1); op_io(); - if(regs.p.m) { op_lsr_b(); } + if(regs.acc_8b) { op_lsr_b(); } else { op_lsr_w(); op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); @@ -342,9 +342,9 @@ case 0x3e: { aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + regs.x.w + 1); op_io(); - if(regs.p.m) { op_rol_b(); } + if(regs.acc_8b) { op_rol_b(); } else { op_rol_w(); op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); @@ -357,9 +357,9 @@ case 0x7e: { aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m)rd.h = op_readdbr(aa.w + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdbr(aa.w + regs.x.w + 1); op_io(); - if(regs.p.m) { op_ror_b(); } + if(regs.acc_8b) { op_ror_b(); } else { op_ror_w(); op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); @@ -371,9 +371,9 @@ case 0xe6: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_inc_b(); } + if(regs.acc_8b) { op_inc_b(); } else { op_inc_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -385,9 +385,9 @@ case 0xc6: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_dec_b(); } + if(regs.acc_8b) { op_dec_b(); } else { op_dec_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -399,9 +399,9 @@ case 0x06: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_asl_b(); } + if(regs.acc_8b) { op_asl_b(); } else { op_asl_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -413,9 +413,9 @@ case 0x46: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_lsr_b(); } + if(regs.acc_8b) { op_lsr_b(); } else { op_lsr_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -427,9 +427,9 @@ case 0x26: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_rol_b(); } + if(regs.acc_8b) { op_rol_b(); } else { op_rol_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -441,9 +441,9 @@ case 0x66: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_ror_b(); } + if(regs.acc_8b) { op_ror_b(); } else { op_ror_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -455,9 +455,9 @@ case 0x14: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_trb_b(); } + if(regs.acc_8b) { op_trb_b(); } else { op_trb_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -469,9 +469,9 @@ case 0x04: { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); - if(!regs.p.m)rd.h = op_readdp(dp + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + 1); op_io(); - if(regs.p.m) { op_tsb_b(); } + if(regs.acc_8b) { op_tsb_b(); } else { op_tsb_w(); op_writedp(dp + 1, rd.h); } last_cycle(); @@ -484,9 +484,9 @@ case 0xf6: { op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m)rd.h = op_readdp(dp + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + regs.x.w + 1); op_io(); - if(regs.p.m) { op_inc_b(); } + if(regs.acc_8b) { op_inc_b(); } else { op_inc_w(); op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); @@ -499,9 +499,9 @@ case 0xd6: { op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m)rd.h = op_readdp(dp + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + regs.x.w + 1); op_io(); - if(regs.p.m) { op_dec_b(); } + if(regs.acc_8b) { op_dec_b(); } else { op_dec_w(); op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); @@ -514,9 +514,9 @@ case 0x16: { op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m)rd.h = op_readdp(dp + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + regs.x.w + 1); op_io(); - if(regs.p.m) { op_asl_b(); } + if(regs.acc_8b) { op_asl_b(); } else { op_asl_w(); op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); @@ -529,9 +529,9 @@ case 0x56: { op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m)rd.h = op_readdp(dp + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + regs.x.w + 1); op_io(); - if(regs.p.m) { op_lsr_b(); } + if(regs.acc_8b) { op_lsr_b(); } else { op_lsr_w(); op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); @@ -544,9 +544,9 @@ case 0x36: { op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m)rd.h = op_readdp(dp + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + regs.x.w + 1); op_io(); - if(regs.p.m) { op_rol_b(); } + if(regs.acc_8b) { op_rol_b(); } else { op_rol_w(); op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); @@ -559,9 +559,9 @@ case 0x76: { op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m)rd.h = op_readdp(dp + regs.x.w + 1); + if(!regs.acc_8b)rd.h = op_readdp(dp + regs.x.w + 1); op_io(); - if(regs.p.m) { op_ror_b(); } + if(regs.acc_8b) { op_ror_b(); } else { op_ror_w(); op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); diff --git a/src/cpu/scpu/core/op_write.b b/src/cpu/scpu/core/op_write.b index a962d5d7..d2520948 100644 --- a/src/cpu/scpu/core/op_write.b +++ b/src/cpu/scpu/core/op_write.b @@ -1,7 +1,7 @@ -sta_addr(0x8d, regs.p.m, regs.a.w), -stx_addr(0x8e, regs.p.x, regs.x.w), -sty_addr(0x8c, regs.p.x, regs.y.w), -stz_addr(0x9c, regs.p.m, 0x0000) { +sta_addr(0x8d, regs.acc_8b, regs.a.w), +stx_addr(0x8e, regs.idx_8b, regs.x.w), +sty_addr(0x8c, regs.idx_8b, regs.y.w), +stz_addr(0x9c, regs.acc_8b, 0x0000) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:if($1)last_cycle(); @@ -11,8 +11,8 @@ stz_addr(0x9c, regs.p.m, 0x0000) { op_writedbr(aa.w + 1, $2 >> 8); } -sta_addrx(0x9d, regs.p.m, regs.a.w), -stz_addrx(0x9e, regs.p.m, 0x0000) { +sta_addrx(0x9d, regs.acc_8b, regs.a.w), +stz_addrx(0x9e, regs.acc_8b, 0x0000) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:op_io_cond4(aa.w, aa.w + regs.x.w); @@ -27,9 +27,9 @@ sta_addry(0x99) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:op_io_cond4(aa.w, aa.w + regs.y.w); -4:if(regs.p.m)last_cycle(); +4:if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 5:last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } @@ -38,9 +38,9 @@ sta_long(0x8f) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:aa.b = op_readpc(); -4:if(regs.p.m)last_cycle(); +4:if(regs.acc_8b)last_cycle(); op_writelong(aa.d, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 5:last_cycle(); op_writelong(aa.d + 1, regs.a.h); } @@ -49,17 +49,17 @@ sta_longx(0x9f) { 1:aa.l = op_readpc(); 2:aa.h = op_readpc(); 3:aa.b = op_readpc(); -4:if(regs.p.m)last_cycle(); +4:if(regs.acc_8b)last_cycle(); op_writelong(aa.d + regs.x.w, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 5:last_cycle(); op_writelong(aa.d + regs.x.w + 1, regs.a.h); } -sta_dp(0x85, regs.p.m, regs.a.w), -stx_dp(0x86, regs.p.x, regs.x.w), -sty_dp(0x84, regs.p.x, regs.y.w), -stz_dp(0x64, regs.p.m, 0x0000) { +sta_dp(0x85, regs.acc_8b, regs.a.w), +stx_dp(0x86, regs.idx_8b, regs.x.w), +sty_dp(0x84, regs.idx_8b, regs.y.w), +stz_dp(0x64, regs.acc_8b, 0x0000) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:if($1)last_cycle(); @@ -69,9 +69,9 @@ stz_dp(0x64, regs.p.m, 0x0000) { op_writedp(dp + 1, $2 >> 8); } -sta_dpx(0x95, regs.p.m, regs.a.w), -sty_dpx(0x94, regs.p.x, regs.y.w), -stz_dpx(0x74, regs.p.m, 0x0000) { +sta_dpx(0x95, regs.acc_8b, regs.a.w), +sty_dpx(0x94, regs.idx_8b, regs.y.w), +stz_dpx(0x74, regs.acc_8b, 0x0000) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:op_io(); @@ -86,9 +86,9 @@ stx_dpy(0x96) { 1:dp = op_readpc(); 2:op_io_cond2(); 3:op_io(); -4:if(regs.p.x)last_cycle(); +4:if(regs.idx_8b)last_cycle(); op_writedp(dp + regs.y.w, regs.x.l); - if(regs.p.x)end; + if(regs.idx_8b)end; 5:last_cycle(); op_writedp(dp + regs.y.w + 1, regs.x.h); } @@ -98,9 +98,9 @@ sta_idp(0x92) { 2:op_io_cond2(); 3:aa.l = op_readdp(dp); 4:aa.h = op_readdp(dp + 1); -5:if(regs.p.m)last_cycle(); +5:if(regs.acc_8b)last_cycle(); op_writedbr(aa.w, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 6:last_cycle(); op_writedbr(aa.w + 1, regs.a.h); } @@ -111,9 +111,9 @@ sta_ildp(0x87) { 3:aa.l = op_readdp(dp); 4:aa.h = op_readdp(dp + 1); 5:aa.b = op_readdp(dp + 2); -6:if(regs.p.m)last_cycle(); +6:if(regs.acc_8b)last_cycle(); op_writelong(aa.d, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 7:last_cycle(); op_writelong(aa.d + 1, regs.a.h); } @@ -124,9 +124,9 @@ sta_idpx(0x81) { 3:op_io(); 4:aa.l = op_readdp(dp + regs.x.w); 5:aa.h = op_readdp(dp + regs.x.w + 1); -6:if(regs.p.m)last_cycle(); +6:if(regs.acc_8b)last_cycle(); op_writedbr(aa.w, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 7:last_cycle(); op_writedbr(aa.w + 1, regs.a.h); } @@ -137,9 +137,9 @@ sta_idpy(0x91) { 3:aa.l = op_readdp(dp); 4:aa.h = op_readdp(dp + 1); 5:op_io_cond4(aa.w, aa.w + regs.y.w); -6:if(regs.p.m)last_cycle(); +6:if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 7:last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } @@ -150,9 +150,9 @@ sta_ildpy(0x97) { 3:aa.l = op_readdp(dp); 4:aa.h = op_readdp(dp + 1); 5:aa.b = op_readdp(dp + 2); -6:if(regs.p.m)last_cycle(); +6:if(regs.acc_8b)last_cycle(); op_writelong(aa.d + regs.y.w, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 7:last_cycle(); op_writelong(aa.d + regs.y.w + 1, regs.a.h); } @@ -160,9 +160,9 @@ sta_ildpy(0x97) { sta_sr(0x83) { 1:sp = op_readpc(); 2:op_io(); -3:if(regs.p.m)last_cycle(); +3:if(regs.acc_8b)last_cycle(); op_writesp(sp, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 4:last_cycle(); op_writesp(sp + 1, regs.a.h); } @@ -173,9 +173,9 @@ sta_isry(0x93) { 3:aa.l = op_readsp(sp); 4:aa.h = op_readsp(sp + 1); 5:op_io(); -6:if(regs.p.m)last_cycle(); +6:if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)end; + if(regs.acc_8b)end; 7:last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } diff --git a/src/cpu/scpu/core/op_write.cpp b/src/cpu/scpu/core/op_write.cpp index 64cb6336..81230e37 100644 --- a/src/cpu/scpu/core/op_write.cpp +++ b/src/cpu/scpu/core/op_write.cpp @@ -2,9 +2,9 @@ case 0x8d: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w, regs.a.w); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + 1, regs.a.w >> 8); } break; @@ -13,9 +13,9 @@ case 0x8d: { case 0x8e: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); op_writedbr(aa.w, regs.x.w); - if(regs.p.x)break; + if(regs.idx_8b)break; last_cycle(); op_writedbr(aa.w + 1, regs.x.w >> 8); } break; @@ -24,9 +24,9 @@ case 0x8e: { case 0x8c: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); op_writedbr(aa.w, regs.y.w); - if(regs.p.x)break; + if(regs.idx_8b)break; last_cycle(); op_writedbr(aa.w + 1, regs.y.w >> 8); } break; @@ -35,9 +35,9 @@ case 0x8c: { case 0x9c: { aa.l = op_readpc(); aa.h = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w, 0x0000); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + 1, 0x0000 >> 8); } break; @@ -47,9 +47,9 @@ case 0x9d: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.x.w, regs.a.w); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + regs.x.w + 1, regs.a.w >> 8); } break; @@ -59,9 +59,9 @@ case 0x9e: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.x.w, 0x0000); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + regs.x.w + 1, 0x0000 >> 8); } break; @@ -71,9 +71,9 @@ case 0x99: { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } break; @@ -83,9 +83,9 @@ case 0x8f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writelong(aa.d, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writelong(aa.d + 1, regs.a.h); } break; @@ -95,9 +95,9 @@ case 0x9f: { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writelong(aa.d + regs.x.w, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writelong(aa.d + regs.x.w + 1, regs.a.h); } break; @@ -106,9 +106,9 @@ case 0x9f: { case 0x85: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedp(dp, regs.a.w); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedp(dp + 1, regs.a.w >> 8); } break; @@ -117,9 +117,9 @@ case 0x85: { case 0x86: { dp = op_readpc(); op_io_cond2(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); op_writedp(dp, regs.x.w); - if(regs.p.x)break; + if(regs.idx_8b)break; last_cycle(); op_writedp(dp + 1, regs.x.w >> 8); } break; @@ -128,9 +128,9 @@ case 0x86: { case 0x84: { dp = op_readpc(); op_io_cond2(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); op_writedp(dp, regs.y.w); - if(regs.p.x)break; + if(regs.idx_8b)break; last_cycle(); op_writedp(dp + 1, regs.y.w >> 8); } break; @@ -139,9 +139,9 @@ case 0x84: { case 0x64: { dp = op_readpc(); op_io_cond2(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedp(dp, 0x0000); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedp(dp + 1, 0x0000 >> 8); } break; @@ -151,9 +151,9 @@ case 0x95: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedp(dp + regs.x.w, regs.a.w); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedp(dp + regs.x.w + 1, regs.a.w >> 8); } break; @@ -163,9 +163,9 @@ case 0x94: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); op_writedp(dp + regs.x.w, regs.y.w); - if(regs.p.x)break; + if(regs.idx_8b)break; last_cycle(); op_writedp(dp + regs.x.w + 1, regs.y.w >> 8); } break; @@ -175,9 +175,9 @@ case 0x74: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedp(dp + regs.x.w, 0x0000); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedp(dp + regs.x.w + 1, 0x0000 >> 8); } break; @@ -187,9 +187,9 @@ case 0x96: { dp = op_readpc(); op_io_cond2(); op_io(); - if(regs.p.x)last_cycle(); + if(regs.idx_8b)last_cycle(); op_writedp(dp + regs.y.w, regs.x.l); - if(regs.p.x)break; + if(regs.idx_8b)break; last_cycle(); op_writedp(dp + regs.y.w + 1, regs.x.h); } break; @@ -200,9 +200,9 @@ case 0x92: { op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + 1, regs.a.h); } break; @@ -214,9 +214,9 @@ case 0x87: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writelong(aa.d, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writelong(aa.d + 1, regs.a.h); } break; @@ -228,9 +228,9 @@ case 0x81: { op_io(); aa.l = op_readdp(dp + regs.x.w); aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + 1, regs.a.h); } break; @@ -242,9 +242,9 @@ case 0x91: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } break; @@ -256,9 +256,9 @@ case 0x97: { aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writelong(aa.d + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writelong(aa.d + regs.y.w + 1, regs.a.h); } break; @@ -267,9 +267,9 @@ case 0x97: { case 0x83: { sp = op_readpc(); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writesp(sp, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writesp(sp + 1, regs.a.h); } break; @@ -281,9 +281,9 @@ case 0x93: { aa.l = op_readsp(sp); aa.h = op_readsp(sp + 1); op_io(); - if(regs.p.m)last_cycle(); + if(regs.acc_8b)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.acc_8b)break; last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); } break; diff --git a/src/cpu/scpu/core/opfn.cpp b/src/cpu/scpu/core/opfn.cpp index d14252e2..ca981f41 100644 --- a/src/cpu/scpu/core/opfn.cpp +++ b/src/cpu/scpu/core/opfn.cpp @@ -23,8 +23,8 @@ int32 r = regs.a.l + rd.l + regs.p.c; r = regs.a.l + rd.l + regs.p.c; regs.p.c = (r > 0xff); } - regs.p.n = !!(r & 0x80); - regs.p.v = !!(~(regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80); + regs.p.n = bool(r & 0x80); + regs.p.v = bool(~(regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80); regs.p.z = ((uint8)r == 0); regs.a.l = r; } @@ -67,135 +67,135 @@ int32 r; r = regs.a.w + rd.w + regs.p.c; regs.p.c = (r > 0xffff); } - regs.p.n = !!(r & 0x8000); - regs.p.v = !!(~(regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000); + regs.p.n = bool(r & 0x8000); + regs.p.v = bool(~(regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000); regs.p.z = ((uint16)r == 0); regs.a.w = r; } inline void sCPU::op_and_b() { regs.a.l &= rd.l; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } inline void sCPU::op_and_w() { regs.a.w &= rd.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } inline void sCPU::op_bit_b() { - regs.p.n = !!(rd.l & 0x80); - regs.p.v = !!(rd.l & 0x40); + regs.p.n = bool(rd.l & 0x80); + regs.p.v = bool(rd.l & 0x40); regs.p.z = ((rd.l & regs.a.l) == 0); } inline void sCPU::op_bit_w() { - regs.p.n = !!(rd.w & 0x8000); - regs.p.v = !!(rd.w & 0x4000); + regs.p.n = bool(rd.w & 0x8000); + regs.p.v = bool(rd.w & 0x4000); regs.p.z = ((rd.w & regs.a.w) == 0); } inline void sCPU::op_cmp_b() { int32 r = regs.a.l - rd.l; - regs.p.n = !!(r & 0x80); + regs.p.n = bool(r & 0x80); regs.p.z = ((uint8)r == 0); regs.p.c = (r >= 0); } inline void sCPU::op_cmp_w() { int32 r = regs.a.w - rd.w; - regs.p.n = !!(r & 0x8000); + regs.p.n = bool(r & 0x8000); regs.p.z = ((uint16)r == 0); regs.p.c = (r >= 0); } inline void sCPU::op_cpx_b() { int32 r = regs.x.l - rd.l; - regs.p.n = !!(r & 0x80); + regs.p.n = bool(r & 0x80); regs.p.z = ((uint8)r == 0); regs.p.c = (r >= 0); } inline void sCPU::op_cpx_w() { int32 r = regs.x.w - rd.w; - regs.p.n = !!(r & 0x8000); + regs.p.n = bool(r & 0x8000); regs.p.z = ((uint16)r == 0); regs.p.c = (r >= 0); } inline void sCPU::op_cpy_b() { int32 r = regs.y.l - rd.l; - regs.p.n = !!(r & 0x80); + regs.p.n = bool(r & 0x80); regs.p.z = ((uint8)r == 0); regs.p.c = (r >= 0); } inline void sCPU::op_cpy_w() { int32 r = regs.y.w - rd.w; - regs.p.n = !!(r & 0x8000); + regs.p.n = bool(r & 0x8000); regs.p.z = ((uint16)r == 0); regs.p.c = (r >= 0); } inline void sCPU::op_eor_b() { regs.a.l ^= rd.l; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } inline void sCPU::op_eor_w() { regs.a.w ^= rd.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } inline void sCPU::op_lda_b() { regs.a.l = rd.l; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } inline void sCPU::op_lda_w() { regs.a.w = rd.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } inline void sCPU::op_ldx_b() { regs.x.l = rd.l; - regs.p.n = !!(regs.x.l & 0x80); + regs.p.n = bool(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); } inline void sCPU::op_ldx_w() { regs.x.w = rd.w; - regs.p.n = !!(regs.x.w & 0x8000); + regs.p.n = bool(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } inline void sCPU::op_ldy_b() { regs.y.l = rd.l; - regs.p.n = !!(regs.y.l & 0x80); + regs.p.n = bool(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); } inline void sCPU::op_ldy_w() { regs.y.w = rd.w; - regs.p.n = !!(regs.y.w & 0x8000); + regs.p.n = bool(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } inline void sCPU::op_ora_b() { regs.a.l |= rd.l; - regs.p.n = !!(regs.a.l & 0x80); + regs.p.n = bool(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } inline void sCPU::op_ora_w() { regs.a.w |= rd.w; - regs.p.n = !!(regs.a.w & 0x8000); + regs.p.n = bool(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } @@ -221,8 +221,8 @@ int32 r; r = regs.a.l - rd.l - !regs.p.c; regs.p.c = (r >= 0); } - regs.p.n = !!(r & 0x80); - regs.p.v = !!((regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80); + regs.p.n = bool(r & 0x80); + regs.p.v = bool((regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80); regs.p.z = ((uint8)r == 0); regs.a.l = r; } @@ -261,8 +261,8 @@ int32 r; r = regs.a.w - rd.w - !regs.p.c; regs.p.c = (r >= 0); } - regs.p.n = !!(r & 0x8000); - regs.p.v = !!((regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000); + regs.p.n = bool(r & 0x8000); + regs.p.v = bool((regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000); regs.p.z = ((uint16)r == 0); regs.a.w = r; } @@ -270,71 +270,71 @@ int32 r; //op_rmw inline void sCPU::op_inc_b() { rd.l++; - regs.p.n = !!(rd.l & 0x80); + regs.p.n = bool(rd.l & 0x80); regs.p.z = (rd.l == 0); } inline void sCPU::op_inc_w() { rd.w++; - regs.p.n = !!(rd.w & 0x8000); + regs.p.n = bool(rd.w & 0x8000); regs.p.z = (rd.w == 0); } inline void sCPU::op_dec_b() { rd.l--; - regs.p.n = !!(rd.l & 0x80); + regs.p.n = bool(rd.l & 0x80); regs.p.z = (rd.l == 0); } inline void sCPU::op_dec_w() { rd.w--; - regs.p.n = !!(rd.w & 0x8000); + regs.p.n = bool(rd.w & 0x8000); regs.p.z = (rd.w == 0); } inline void sCPU::op_asl_b() { - regs.p.c = !!(rd.l & 0x80); + regs.p.c = bool(rd.l & 0x80); rd.l <<= 1; - regs.p.n = !!(rd.l & 0x80); + regs.p.n = bool(rd.l & 0x80); regs.p.z = (rd.l == 0); } inline void sCPU::op_asl_w() { - regs.p.c = !!(rd.w & 0x8000); + regs.p.c = bool(rd.w & 0x8000); rd.w <<= 1; - regs.p.n = !!(rd.w & 0x8000); + regs.p.n = bool(rd.w & 0x8000); regs.p.z = (rd.w == 0); } inline void sCPU::op_lsr_b() { regs.p.c = rd.l & 1; rd.l >>= 1; - regs.p.n = !!(rd.l & 0x80); + regs.p.n = bool(rd.l & 0x80); regs.p.z = (rd.l == 0); } inline void sCPU::op_lsr_w() { regs.p.c = rd.w & 1; rd.w >>= 1; - regs.p.n = !!(rd.w & 0x8000); + regs.p.n = bool(rd.w & 0x8000); regs.p.z = (rd.w == 0); } inline void sCPU::op_rol_b() { uint16 c = regs.p.c; - regs.p.c = !!(rd.l & 0x80); + regs.p.c = bool(rd.l & 0x80); rd.l <<= 1; rd.l |= c; - regs.p.n = !!(rd.l & 0x80); + regs.p.n = bool(rd.l & 0x80); regs.p.z = (rd.l == 0); } inline void sCPU::op_rol_w() { uint16 c = regs.p.c; - regs.p.c = !!(rd.w & 0x8000); + regs.p.c = bool(rd.w & 0x8000); rd.w <<= 1; rd.w |= c; - regs.p.n = !!(rd.w & 0x8000); + regs.p.n = bool(rd.w & 0x8000); regs.p.z = (rd.w == 0); } @@ -343,7 +343,7 @@ uint16 c = (regs.p.c)?0x80:0; regs.p.c = rd.l & 1; rd.l >>= 1; rd.l |= c; - regs.p.n = !!(rd.l & 0x80); + regs.p.n = bool(rd.l & 0x80); regs.p.z = (rd.l == 0); } @@ -352,7 +352,7 @@ uint16 c = (regs.p.c)?0x8000:0; regs.p.c = rd.w & 1; rd.w >>= 1; rd.w |= c; - regs.p.n = !!(rd.w & 0x8000); + regs.p.n = bool(rd.w & 0x8000); regs.p.z = (rd.w == 0); } diff --git a/src/cpu/scpu/dma/dma.cpp b/src/cpu/scpu/dma/dma.cpp index fdb3838d..3a57770f 100644 --- a/src/cpu/scpu/dma/dma.cpp +++ b/src/cpu/scpu/dma/dma.cpp @@ -77,7 +77,7 @@ uint32 sCPU::hdma_iaddr(uint8 i) { *****/ void sCPU::dma_transfertobusb(uint8 i, uint8 bbus) { - if(cartridge.cart.sdd1 == true && sdd1->dma_active() == true) { + if(cartridge.info.sdd1 == true && sdd1->dma_active() == true) { r_mem->write(0x2100 | bbus, sdd1->dma_read()); } else { dma_transfer(0, bbus, dma_addr(i)); @@ -105,8 +105,9 @@ void sCPU::dma_run() { for(int i = 0; i < 8; i++) { if(channel[i].dma_enabled == false)continue; + add_clocks(8); - if(cartridge.cart.sdd1 == true) { + if(cartridge.info.sdd1 == true) { sdd1->dma_begin(i, (channel[i].srcbank << 16) | (channel[i].srcaddr), channel[i].xfersize); } @@ -114,10 +115,12 @@ void sCPU::dma_run() { uint index = 0; do { dma_write(i, dma_bbus(i, index++)); - } while(channel[i].xfersize); + } while(channel[i].dma_enabled && channel[i].xfersize); channel[i].dma_enabled = false; } + + set_irq_delay(24); } /***** @@ -176,6 +179,8 @@ void sCPU::hdma_run() { static uint8 hdma_xferlen[8] = { 1, 2, 2, 4, 4, 4, 2, 4 }; for(int i = 0; i < 8; i++) { if(hdma_active(i) == false)continue; + channel[i].dma_enabled = false; //HDMA run during DMA will stop DMA mid-transfer + add_clocks(8); if(channel[i].hdma_do_transfer) { int xferlen = hdma_xferlen[channel[i].xfermode]; @@ -197,6 +202,8 @@ static uint8 hdma_xferlen[8] = { 1, 2, 2, 4, 4, 4, 2, 4 }; hdma_update(i); } } + + set_irq_delay(24); } void sCPU::hdma_init() { @@ -211,17 +218,20 @@ void sCPU::hdma_init() { for(int i = 0; i < 8; i++) { if(!channel[i].hdma_enabled)continue; + channel[i].dma_enabled = false; //HDMA init during DMA will stop DMA mid-transfer channel[i].hdma_addr = channel[i].srcaddr; hdma_update(i); } + + set_irq_delay(24); } /***** * power / reset functions *****/ -void sCPU::dma_reset() { +void sCPU::dma_power() { for(int i = 0; i < 8; i++) { channel[i].dma_enabled = false; channel[i].hdma_enabled = false; @@ -245,7 +255,11 @@ void sCPU::dma_reset() { channel[i].hdma_addr = 0xffff; channel[i].hdma_line_counter = 0xff; channel[i].unknown = 0xff; + } +} +void sCPU::dma_reset() { + for(int i = 0; i < 8; i++) { channel[i].hdma_completed = false; channel[i].hdma_do_transfer = false; } diff --git a/src/cpu/scpu/dma/dma.h b/src/cpu/scpu/dma/dma.h index fa8fc6f4..fa6f0f83 100644 --- a/src/cpu/scpu/dma/dma.h +++ b/src/cpu/scpu/dma/dma.h @@ -64,4 +64,5 @@ struct { void hdma_run(); void hdma_init(); + void dma_power(); void dma_reset(); diff --git a/src/cpu/scpu/memory/memory.cpp b/src/cpu/scpu/memory/memory.cpp index c48de22e..93cd4e8c 100644 --- a/src/cpu/scpu/memory/memory.cpp +++ b/src/cpu/scpu/memory/memory.cpp @@ -31,8 +31,7 @@ void sCPU::op_write(uint32 addr, uint8 data) { #ifdef FAVOR_ACCURACY co_return(); #endif -//below needs to be verified on hardware -//regs.mdr = data; - r_mem->write(addr, data); + regs.mdr = data; + r_mem->write(addr, regs.mdr); cycle_edge(); } diff --git a/src/cpu/scpu/mmio/mmio.cpp b/src/cpu/scpu/mmio/mmio.cpp index 7d15c294..285fd996 100644 --- a/src/cpu/scpu/mmio/mmio.cpp +++ b/src/cpu/scpu/mmio/mmio.cpp @@ -41,45 +41,18 @@ void sCPU::mmio_w2183(uint8 data) { * Joypad registers *****/ +//TODO: test whether strobe latch of zero returns +//realtime or buffered status of joypadN.b + //JOYSER0 //7-2 = MDR //1-0 = Joypad serial data -/***** - * The joypad contains a small bit shifter that has 16 bits. - * Reading from 4016 reads one bit from this buffer, then moves - * the buffer left one, and adds a '1' to the rightmost bit. - * Writing a one to $4016 will fill the buffer with the current - * joypad button states, and lock the bit shifter at position - * zero. All reads will be the first buffer state, or 'B'. - * A zero must be written back to $4016 to unlock the buffer, - * so that reads will increment the bit shifting position. - *****/ uint8 sCPU::mmio_r4016() { uint8 r = regs.mdr & 0xfc; - if(status.joypad_strobe_latch == 1) { - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_B)); - } else { - switch(status.joypad1_read_pos) { - case 0: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_B)); break; - case 1: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_Y)); break; - case 2: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_SELECT)); break; - case 3: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_START)); break; - case 4: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_UP)); break; - case 5: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_DOWN)); break; - case 6: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_LEFT)); break; - case 7: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_RIGHT)); break; - case 8: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_A)); break; - case 9: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_X)); break; - case 10: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_L)); break; - case 11: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_R)); break; - case 12: break; - case 13: break; - case 14: break; - case 15: break; //bits 12-15 always return 0 - //all subsequent reads return joypad connection status - case 16: r |= 1; break; //joypad connected bit - } - if(++status.joypad1_read_pos > 16)status.joypad1_read_pos = 16; + r |= status.joypad1_bits & 1; + if(status.joypad_strobe_latch == 0) { + status.joypad1_bits >>= 1; + status.joypad1_bits |= ~0xffff; } return r; @@ -91,87 +64,25 @@ uint8 r = regs.mdr & 0xfc; //1-0 = Joypad serial data uint8 sCPU::mmio_r4017() { uint8 r = (regs.mdr & 0xe0) | 0x1c; - if(status.joypad_strobe_latch == 1) { - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_B)); - } else { - switch(status.joypad2_read_pos) { - case 0: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_B)); break; - case 1: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_Y)); break; - case 2: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_SELECT)); break; - case 3: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_START)); break; - case 4: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_UP)); break; - case 5: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_DOWN)); break; - case 6: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_LEFT)); break; - case 7: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_RIGHT)); break; - case 8: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_A)); break; - case 9: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_X)); break; - case 10: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_L)); break; - case 11: r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_R)); break; - case 12: break; - case 13: break; - case 14: break; - case 15: break; //bits 12-15 always return 0 - //all subsequent reads return joypad connection status - case 16: r |= 1; break; //joypad connected bit - } - if(++status.joypad2_read_pos > 16)status.joypad2_read_pos = 16; + r |= status.joypad2_bits & 1; + if(status.joypad_strobe_latch == 0) { + status.joypad2_bits >>= 1; + status.joypad2_bits |= ~0xffff; } return r; } -//JOY1L //TODO: handle reads during joypad polling (v=225-227) -uint8 sCPU::mmio_r4218() { -uint8 r = 0x00; - if(status.auto_joypad_poll == false)return 0x00; //can't read joypad if auto polling not enabled - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_A)) << 7; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_X)) << 6; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_L)) << 5; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_R)) << 4; - return r; -} -//JOY1H -uint8 sCPU::mmio_r4219() { -uint8 r = 0x00; - if(status.auto_joypad_poll == false)return 0x00; //can't read joypad if auto polling not enabled - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_B)) << 7; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_Y)) << 6; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_SELECT)) << 5; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_START)) << 4; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_UP)) << 3; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_DOWN)) << 2; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_LEFT)) << 1; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_RIGHT)); - return r; -} - -//JOY2L -uint8 sCPU::mmio_r421a() { -uint8 r = 0x00; - if(status.auto_joypad_poll == false)return 0x00; //can't read joypad if auto polling not enabled - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_A)) << 7; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_X)) << 6; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_L)) << 5; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_R)) << 4; - return r; -} - -//JOY2H -uint8 sCPU::mmio_r421b() { -uint8 r = 0x00; - if(status.auto_joypad_poll == false)return 0x00; //can't read joypad if auto polling not enabled - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_B)) << 7; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_Y)) << 6; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_SELECT)) << 5; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_START)) << 4; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_UP)) << 3; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_DOWN)) << 2; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_LEFT)) << 1; - r |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_RIGHT)); - return r; -} +uint8 sCPU::mmio_r4218() { return status.joy1l; } //JOY1L +uint8 sCPU::mmio_r4219() { return status.joy1h; } //JOY1H +uint8 sCPU::mmio_r421a() { return status.joy2l; } //JOY2L +uint8 sCPU::mmio_r421b() { return status.joy2h; } //JOY2H +uint8 sCPU::mmio_r421c() { return status.joy3l; } //JOY3L +uint8 sCPU::mmio_r421d() { return status.joy3h; } //JOY3H +uint8 sCPU::mmio_r421e() { return status.joy4l; } //JOY4L +uint8 sCPU::mmio_r421f() { return status.joy4h; } //JOY4H //JOYSER0 //bit 0 is shared between JOYSER0 and JOYSER1, therefore @@ -181,10 +92,7 @@ void sCPU::mmio_w4016(uint8 data) { status.joypad_strobe_latch = bool(data & 1); if(status.joypad_strobe_latch == 1) { - snes->poll_input(SNES::DEV_JOYPAD1); - snes->poll_input(SNES::DEV_JOYPAD2); - status.joypad1_read_pos = 0; - status.joypad2_read_pos = 0; + run_manual_joypad_poll(); } } @@ -234,7 +142,7 @@ uint8 r = (regs.mdr & 0x3e); uint16 vs = !overscan() ? 225 : 240; //auto joypad polling - if(status.hclock >= vs && status.hclock <= (vs + 2))r |= 0x01; + if(status.vcounter >= vs && status.vcounter <= (vs + 2))r |= 0x01; //hblank if(status.hclock <= 2 || status.hclock >= 1096)r |= 0x40; @@ -252,6 +160,8 @@ void sCPU::mmio_w4200(uint8 data) { status.hirq_enabled = bool(data & 0x10); status.auto_joypad_poll = bool(data & 0x01); +//if(!status.nmi_enabled)status.nmi_read=1; + if(status.nmi_read == 0) { if(status.nmi_line == 1 && !status.nmi_enabled == 0) { status.nmi_transition = 1; @@ -266,6 +176,7 @@ void sCPU::mmio_w4200(uint8 data) { } update_interrupts(); + set_irq_delay(2); } //HTIMEL @@ -519,14 +430,17 @@ void sCPU::mmio_w43xb(uint8 i, uint8 data) { * reset / read / write *****/ +void sCPU::mmio_power() { +} + void sCPU::mmio_reset() { //$2181-$2183 status.wram_addr = 0x000000; //$4016-$4017 status.joypad_strobe_latch = 0; - status.joypad1_read_pos = 0; - status.joypad2_read_pos = 0; + status.joypad1_bits = ~0; + status.joypad2_bits = ~0; //$4200 status.nmi_enabled = false; @@ -552,6 +466,16 @@ void sCPU::mmio_reset() { //$4214-$4217 status.r4214 = 0x0000; status.r4216 = 0x0000; + +//$4218-$421f + status.joy1l = 0x00; + status.joy1h = 0x00; + status.joy2l = 0x00; + status.joy2h = 0x00; + status.joy3l = 0x00; + status.joy3h = 0x00; + status.joy4l = 0x00; + status.joy4h = 0x00; } uint8 sCPU::mmio_read(uint16 addr) { @@ -602,10 +526,10 @@ uint8 sCPU::mmio_read(uint16 addr) { case 0x4219: return mmio_r4219(); case 0x421a: return mmio_r421a(); case 0x421b: return mmio_r421b(); - case 0x421c: return 0x00; - case 0x421d: return 0x00; - case 0x421e: return 0x00; - case 0x421f: return 0x00; + case 0x421c: return mmio_r421c(); + case 0x421d: return mmio_r421d(); + case 0x421e: return mmio_r421e(); + case 0x421f: return mmio_r421f(); } return regs.mdr; diff --git a/src/cpu/scpu/mmio/mmio.h b/src/cpu/scpu/mmio/mmio.h index 5de8a113..554f6646 100644 --- a/src/cpu/scpu/mmio/mmio.h +++ b/src/cpu/scpu/mmio/mmio.h @@ -1,3 +1,4 @@ + void mmio_power(); void mmio_reset(); uint8 mmio_read (uint16 addr); void mmio_write(uint16 addr, uint8 data); @@ -19,6 +20,10 @@ uint8 mmio_r4219(); uint8 mmio_r421a(); uint8 mmio_r421b(); + uint8 mmio_r421c(); + uint8 mmio_r421d(); + uint8 mmio_r421e(); + uint8 mmio_r421f(); uint8 mmio_r43x0(uint8 i); uint8 mmio_r43x1(uint8 i); uint8 mmio_r43x2(uint8 i); diff --git a/src/cpu/scpu/scpu.cpp b/src/cpu/scpu/scpu.cpp index 0f4cedcf..f62ab7e8 100644 --- a/src/cpu/scpu/scpu.cpp +++ b/src/cpu/scpu/scpu.cpp @@ -19,6 +19,11 @@ void sCPU::power() { regs.a = regs.x = regs.y = 0x0000; regs.s = 0x01ff; + + mmio_power(); + dma_power(); + timing_power(); + reset(); } @@ -30,7 +35,10 @@ void sCPU::reset() { regs.pc.l = r_mem->read(0xfffc); regs.pc.h = r_mem->read(0xfffd); -//some registers are not fully reset by SNES + regs.acc_8b = true; + regs.idx_8b = true; + +//note: some registers are not fully reset by SNES regs.x.h = 0x00; regs.y.h = 0x00; regs.s.h = 0x01; diff --git a/src/cpu/scpu/scpu.h b/src/cpu/scpu/scpu.h index cf00c438..507c51d9 100644 --- a/src/cpu/scpu/scpu.h +++ b/src/cpu/scpu/scpu.h @@ -35,6 +35,8 @@ struct { bool hdmainit_triggered; bool hdma_triggered; + uint16 irq_delay; + int16 nmi_read_pos, nmi_line_pos; bool nmi_read, nmi_line, nmi_transition; bool nmi_pending; @@ -50,7 +52,8 @@ struct { //$4016-$4017 bool joypad_strobe_latch; - uint8 joypad1_read_pos, joypad2_read_pos; + uint32 joypad1_bits; + uint32 joypad2_bits; //$4200 bool nmi_enabled; @@ -73,6 +76,12 @@ struct { //$4214-$4217 uint16 r4214; uint16 r4216; + +//$4218-$421f + uint8 joy1l, joy1h; + uint8 joy2l, joy2h; + uint8 joy3l, joy3h; + uint8 joy4l, joy4h; } status; void run(); diff --git a/src/cpu/scpu/timing/irq.cpp b/src/cpu/scpu/timing/irq.cpp index 187bf015..75a2e8c5 100644 --- a/src/cpu/scpu/timing/irq.cpp +++ b/src/cpu/scpu/timing/irq.cpp @@ -1,3 +1,9 @@ +void sCPU::set_irq_delay(uint clocks) { + if(status.irq_delay < clocks) { + status.irq_delay = clocks; + } +} + void sCPU::update_interrupts() { if(status.vcounter == (!overscan() ? 225 : 240)) { status.nmi_read_pos = 2; diff --git a/src/cpu/scpu/timing/joypad.cpp b/src/cpu/scpu/timing/joypad.cpp new file mode 100644 index 00000000..2b8b24b7 --- /dev/null +++ b/src/cpu/scpu/timing/joypad.cpp @@ -0,0 +1,71 @@ +void sCPU::run_manual_joypad_poll() { + snes->poll_input(SNES::DEV_JOYPAD1); + snes->poll_input(SNES::DEV_JOYPAD2); + + status.joypad1_bits = uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_B)) << 0; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_Y)) << 1; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_SELECT)) << 2; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_START)) << 3; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_UP)) << 4; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_DOWN)) << 5; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_LEFT)) << 6; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_RIGHT)) << 7; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_A)) << 8; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_X)) << 9; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_L)) << 10; + status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_R)) << 11; + status.joypad1_bits |= ~0xffff; + + status.joypad2_bits = uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_B)) << 0; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_Y)) << 1; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_SELECT)) << 2; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_START)) << 3; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_UP)) << 4; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_DOWN)) << 5; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_LEFT)) << 6; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_RIGHT)) << 7; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_A)) << 8; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_X)) << 9; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_L)) << 10; + status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_R)) << 11; + status.joypad2_bits |= ~0xffff; +} + +/***** + * The joypad contains a small bit shifter that has 16 bits. + * Reading from 4016 reads one bit from this buffer, then moves + * the buffer left one, and adds a '1' to the rightmost bit. + * Writing a one to $4016 will fill the buffer with the current + * joypad button states, and lock the bit shifter at position + * zero. All reads will be the first buffer state, or 'B'. + * A zero must be written back to $4016 to unlock the buffer, + * so that reads will increment the bit shifting position. + *****/ + +void sCPU::run_auto_joypad_poll() { + run_manual_joypad_poll(); + +uint16 joy1 = 0x0000, joy2 = 0x0000; + for(int i = 0; i < 16; i++) { + joy1 |= (!!(status.joypad1_bits & (0x8000 >> i))) << i; + joy2 |= (!!(status.joypad2_bits & (0x8000 >> i))) << i; + } + + status.joy1l = joy1; + status.joy1h = joy1 >> 8; + + status.joy2l = joy2; + status.joy2h = joy2 >> 8; + + status.joy3l = 0x00; + status.joy3h = 0x00; + + status.joy4l = 0x00; + status.joy4h = 0x00; + + status.joypad1_bits >>= 16; + status.joypad2_bits >>= 16; + + status.joypad1_bits |= ~0xffff; + status.joypad2_bits |= ~0xffff; +} diff --git a/src/cpu/scpu/timing/timing.cpp b/src/cpu/scpu/timing/timing.cpp index f2b43980..8ab71d00 100644 --- a/src/cpu/scpu/timing/timing.cpp +++ b/src/cpu/scpu/timing/timing.cpp @@ -3,6 +3,7 @@ status.interlace == false && status.interlace_field == 1) #include "irq.cpp" +#include "joypad.cpp" uint16 sCPU::vcounter() { return status.vcounter; } uint16 sCPU::hcycles() { return status.hclock; } @@ -33,6 +34,14 @@ uint16 sCPU::hcounter() { } void sCPU::add_clocks(uint clocks) { + if(status.irq_delay) { + if(status.irq_delay >= clocks) { + status.irq_delay -= clocks; + } else { + status.irq_delay = 0; + } + } + status.clocks_executed += clocks; poll_interrupts(clocks); @@ -73,16 +82,8 @@ void sCPU::scanline() { update_interrupts(); - if(status.vcounter == (!overscan() ? 227 : 242) && status.auto_joypad_poll == true) { - snes->poll_input(SNES::DEV_JOYPAD1); - snes->poll_input(SNES::DEV_JOYPAD2); - //When the SNES auto-polls the joypads, it writes 1, then 0 to - //$4016, then reads from each 16 times to get the joypad state - //information. As a result, the joypad read positions are set - //to 16 after such a poll. Position 16 is the controller - //connected status bit. - status.joypad1_read_pos = 16; - status.joypad2_read_pos = 16; + if(status.auto_joypad_poll == true && status.vcounter == (!overscan() ? 227 : 242)) { + run_auto_joypad_poll(); } } @@ -104,18 +105,11 @@ void sCPU::frame() { } /***** - * opcode_edge() + * precycle_edge() + * + * Used for DMA/HDMA bus synchronization *****/ -void sCPU::opcode_edge() { -#ifdef FAVOR_SPEED - co_return(); -#endif - if(status.line_rendered == false) { - if(status.hclock >= 128) { - status.line_rendered = true; - r_ppu->render_scanline(); - } - } +void sCPU::precycle_edge() { } /***** @@ -124,6 +118,13 @@ void sCPU::opcode_edge() { * Used to test for HDMA, which can trigger on the edge of every opcode cycle. *****/ void sCPU::cycle_edge() { + if(status.line_rendered == false) { + if(status.hclock >= 128) { + status.line_rendered = true; + r_ppu->render_scanline(); + } + } + if(status.hdmainit_triggered == false) { if(status.hclock >= 12 || status.vcounter) { status.hdmainit_triggered = true; @@ -144,8 +145,13 @@ void sCPU::cycle_edge() { * * Used to test for NMI/IRQ, which can trigger on the edge of every opcode. * Test one cycle early to simulate two-stage pipeline of x816 CPU. + * + * status.irq_delay is used to simulate hardware delay before interrupts can + * trigger during certain events (immediately after DMA, writes to $4200, etc) *****/ void sCPU::last_cycle() { + if(status.irq_delay)return; + status.nmi_pending |= nmi_test(); status.irq_pending |= irq_test(); @@ -164,6 +170,9 @@ uint32 r = status.clocks_executed; return r; } +void sCPU::timing_power() { +} + void sCPU::timing_reset() { status.clock_count = 0; status.clocks_executed = 0; @@ -185,6 +194,8 @@ void sCPU::timing_reset() { status.hdmainit_triggered = false; status.hdma_triggered = false; + status.irq_delay = 0; + status.nmi_read = 1; status.nmi_line = 1; status.nmi_transition = 0; diff --git a/src/cpu/scpu/timing/timing.h b/src/cpu/scpu/timing/timing.h index 4cd2d322..c2f66069 100644 --- a/src/cpu/scpu/timing/timing.h +++ b/src/cpu/scpu/timing/timing.h @@ -14,13 +14,16 @@ void scanline(); void frame(); - void opcode_edge(); + void precycle_edge(); void cycle_edge(); void last_cycle(); uint32 clocks_executed(); + + void timing_power(); void timing_reset(); //irq.cpp + void set_irq_delay(uint clocks); void update_interrupts(); void poll_interrupts(int clocks); bool nmi_read_pos_match(uint offset); @@ -28,3 +31,7 @@ bool irq_pos_valid(); bool nmi_test(); bool irq_test(); + +//joypad.cpp + void run_manual_joypad_poll(); + void run_auto_joypad_poll(); diff --git a/src/lib/libbase.h b/src/lib/libbase.h index a8de1d46..5882ef79 100644 --- a/src/lib/libbase.h +++ b/src/lib/libbase.h @@ -1,27 +1,31 @@ /* - libbase : version 0.08 ~byuu (07/08/06) + libbase : version 0.08a ~byuu (07/14/06) */ #ifndef __LIBBASE #define __LIBBASE -#ifdef _MSC_VER +#if defined(_MSC_VER) //disable libc deprecation warnings in MSVC 2k5+ -#pragma warning(disable:4996) + #pragma warning(disable:4996) #endif /***** * inline expansion *****/ -#ifdef _MSC_VER +#if defined(_MSC_VER) #define noinline __declspec(noinline) #define inline inline #define forceinline __forceinline -#else + #define fastcall __fastcall +#elif defined(__GNUC__) #define noinline #define inline inline #define forceinline inline + #define fastcall __attribute__((fastcall)) +#else + #error "unsupported compiler" #endif #include @@ -32,11 +36,11 @@ #include #ifndef FALSE -#define FALSE 0 + #define FALSE 0 #endif #ifndef TRUE -#define TRUE !FALSE + #define TRUE !FALSE #endif #define SafeFree(__n) if(__n) { free(__n); __n = 0; } @@ -289,7 +293,7 @@ const uint32 crc32_table[256] = { 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -inline uint32 crc32_adjust(uint32 crc32, uint32 input) { +inline uint32 crc32_adjust(uint32 crc32, uint8 input) { return ((crc32 >> 8) & 0x00ffffff) ^ crc32_table[(crc32 ^ input) & 0xff]; } diff --git a/src/lib/libbpf.cpp b/src/lib/libbpf.cpp deleted file mode 100644 index f6182eee..00000000 --- a/src/lib/libbpf.cpp +++ /dev/null @@ -1,625 +0,0 @@ -#include "libbase.h" -#include "libvector.h" -#include "libbpf.h" - -void BPF::Handle::seek(uint32 new_pos) { - if(pos == new_pos)return; - pos = new_pos; - if(mode == MODE_FILE) { - fseek(handle, new_pos, SEEK_SET); - } -} - -void BPF::Handle::write(uint8 x) { - if(mode == MODE_MEMORY) { - data[pos] = x; - } else { - fputc(x, handle); - } - - if(++pos > size)size = pos; - crc32 = crc32_adjust(crc32, x); -} - -uint8 BPF::Handle::read() { -uint8 r; - if(pos >= size) { - return 0x00; - } else if(mode == MODE_MEMORY) { - r = data[pos]; - } else { - r = fgetc(handle); - } - - pos++; - crc32 = crc32_adjust(crc32, r); - return r; -} - -uint32 BPF::Handle::calc_crc32() { - crc32 = 0xffffffff; - seek(0); - for(uint32 i = 0; i < size; i++) { - read(); - } - seek(0); - crc32 = ~crc32; - return crc32; -} - -bool BPF::Handle::open(uint8 _access, uint32 _size, uint8 *_data) { - close(); - - mode = MODE_MEMORY; - access = _access; - pos = 0; - size = _size; - crc32 = 0xffffffff; - - if(access == ACCESS_READ) { - data.resize(_size); - data.copy(_data, _size); - } else { - data.resize(_size); - data.clear(); - } - - return true; -} - -bool BPF::Handle::open(uint8 _access, const char *fn) { - close(); - - mode = MODE_FILE; - access = _access; - pos = 0; - crc32 = 0xffffffff; - - if(access == ACCESS_READ) { - handle = fopen(fn, "rb"); - if(!handle)return false; - size = fsize(handle); - } else if(access == ACCESS_WRITE) { - handle = fopen(fn, "wb"); - if(!handle)return false; - size = 0; - } - - return true; -} - -bool BPF::Handle::load(const char *fn) { - close(); - -FILE *fp = fopen(fn, "rb"); - if(!fp)return false; - size = fsize(fp); -uint8 *buffer = (uint8*)malloc(size); - memset(buffer, 0, size); - fread(buffer, 1, size, fp); - fclose(fp); - return open(ACCESS_READ, size, buffer); -} - -bool BPF::Handle::save(const char *fn) { - if(mode != MODE_MEMORY)return false; - -FILE *fp = fopen(fn, "wb"); - if(!fp)return false; - fwrite(data.handle(), 1, size, fp); - fclose(fp); - return true; -} - -void BPF::Handle::close() { - if(mode == MODE_MEMORY) { - data.release(); - } else if(mode == MODE_FILE) { - if(handle) { - fclose(handle); - handle = 0; - } - } -} - -uint8 *BPF::load(const char *fn, uint32 &size) { -FILE *fp = fopen(fn, "rb"); - if(!fp)return 0; - size = fsize(fp); -uint8 *buffer = (uint8*)malloc(size); - fread(buffer, 1, size, fp); - fclose(fp); - fp = 0; - return buffer; -} - -void BPF::save(const char *fn, uint8 *data, uint32 size) { -FILE *fp = fopen(fn, "wb"); - if(!fp)return; - fwrite(data, 1, size, fp); - fclose(fp); - fp = 0; -} - -void BPF::write_ptr(uint32 ptr) { - if(ptr <= 0xef) { - patch.write(ptr); - return; - } - - ptr -= 0xf0; - if(ptr <= 0xffff) { - patch.write(0xf0); - patch.write(ptr); - patch.write(ptr >> 8); - return; - } - - ptr -= 0x10000; - if(ptr <= 0xffffff) { - patch.write(0xf1); - patch.write(ptr); - patch.write(ptr >> 8); - patch.write(ptr >> 16); - return; - } - - ptr -= 0x1000000; - patch.write(0xf2); - patch.write(ptr); - patch.write(ptr >> 8); - patch.write(ptr >> 16); - patch.write(ptr >> 24); -} - -uint32 BPF::read_ptr() { -uint32 len = patch.read(); - if(len <= 0xef) { - return len; - } - - len &= 0x0f; -uint32 ptr = 0; - for(int i = 0; i < (len + 2); i++) { - ptr |= patch.read() << (i << 3); - } - - ptr += 0xf0; - if(len >= 1)ptr += 0x10000; - if(len >= 2)ptr += 0x1000000; - - return ptr; -} - -void BPF::create_patch_binary() { - original.seek(0); - modified.seek(0); - -uint32 last_ptr = 0, rle_count, last_out, rep_count; - for(uint32 i = 0; i < info.size_max;) { - uint8 r = original.read() ^ modified.read(); - i++; - if(r == 0x00)continue; - - //ptr - write_ptr((i - 1) - last_ptr); - - //data - patch.write(r); - last_out = r; - rep_count = 0; - do { - r = original.read() ^ modified.read(); - i++; - patch.write(r); - if(last_out == r) { - if(++rep_count == 2) { - rle_count = 0; - do { - r = original.read() ^ modified.read(); - i++; - if(r != last_out || r == 0x00)break; - rle_count++; - } while(i < info.size_max); - write_ptr(rle_count); - if(i < info.size_max)patch.write(r); - rep_count = 0; - } - } else { - rep_count = 0; - } - - last_out = r; - if(r == 0x00)break; - } while(i < info.size_max); - - last_ptr = i; - } -} - -bool BPF::create_patch(uint32 format, const char *fn) { - patch.open(ACCESS_WRITE, fn); - -//header - patch.write('b'); - patch.write('p'); - patch.write('f'); - patch.write(0x00); - -//version (high-byte = major, low-byte = minor) - patch.write(0x00); - patch.write(0x01); - -//bytes per pointer - info.size_max = (original.size >= modified.size) ? original.size : modified.size; - info.size_min = (original.size >= modified.size) ? modified.size : original.size; - - if(info.size_max <= 0xff) { - info.ptr_size = 1; - } else if(info.size_max <= 0xffff) { - info.ptr_size = 2; - } else if(info.size_max <= 0xffffff) { - info.ptr_size = 3; - } else { - info.ptr_size = 4; - } - patch.write(info.ptr_size); - patch.write(info.ptr_size >> 8); - -//format - patch.write(format); - patch.write(format >> 8); - patch.write(format >> 16); - patch.write(format >> 24); - -//flags -uint32 flags = 0; - patch.write(flags); - patch.write(flags >> 8); - patch.write(flags >> 16); - patch.write(flags >> 24); - -//original size - for(int i = 0; i < info.ptr_size; i++) { - patch.write(original.size >> (i << 3)); - } - -//modified size - for(int i = 0; i < info.ptr_size; i++) { - patch.write(modified.size >> (i << 3)); - } - -//patch data offset (currently unused) -uint32 pos = patch.pos + 4; - for(int i = 0; i < 4; i++) { - patch.write(pos >> (i << 3)); - } - - create_patch_binary(); - -//write crc32 of original file - for(int i = 0; i < 4; i++) { - patch.write(~original.crc32 >> (i << 3)); - } - -//write crc32 of modified file - for(int i = 0; i < 4; i++) { - patch.write(~modified.crc32 >> (i << 3)); - } - -uint32 patch_crc32 = patch.crc32; -//write crc32 of patch file - for(int i = 0; i < 4; i++) { - patch.write(~patch_crc32 >> (i << 3)); - } - - patch.close(); - return true; -} - -void BPF::apply_patch_binary() { -//copy old data info output buffer - output.seek(0); - input.seek(0); - for(uint32 z = 0; z < output.size; z++) { - output.write(input.read()); - } - - output.seek(0); - input.seek(0); - patch.seek(info.patch_start); -//the below routine may modify output.size if the input -//size is larger, so save the correct output size... -uint32 start_size = output.size; - -//subtract 12 to ignore crc32 for original, modified, and patch files -uint32 rle_count, last_in, rep_count; - for(; patch.pos < (patch.size - 12);) { - //ptr - uint32 ptr = read_ptr(); - - //data - output.seek(output.pos + ptr); - input.seek(input.pos + ptr); - - last_in = 0; - rep_count = 0; - do { - uint8 r = patch.read(); - output.write(r ^ input.read()); - if(r == last_in) { - if(++rep_count == 2) { - rle_count = read_ptr(); - while(rle_count--) { - output.write(r ^ input.read()); - } - rep_count = 0; - } - } else { - rep_count = 0; - } - - last_in = r; - if(r == 0x00)break; - } while(patch.pos < (patch.size - 12)); - } - -//...and restore it when finished patching - output.size = start_size; -} - -bool BPF::apply_patch() { -//verify patch is large enough to be a valid patchfile - if(patch.size < 34)return false; - - patch.seek(INDEX_SIG); -//verify signature - if(patch.read() != 'b')return false; - if(patch.read() != 'p')return false; - if(patch.read() != 'f')return false; - if(patch.read() != 0x00)return false; - -//read pointer size - patch.seek(INDEX_PTRSIZE); - info.ptr_size = patch.read(); - info.ptr_size |= patch.read() << 8; - -//read flags -uint32 flags; - patch.seek(INDEX_FLAGS); - flags = patch.read(); - flags |= patch.read() << 8; - flags |= patch.read() << 16; - flags |= patch.read() << 24; - -uint32 sx = 0, sy = 0; - patch.seek(INDEX_VARIABLE); - for(int i = 0; i < info.ptr_size; i++) { - sx |= patch.read() << (i << 3); - } - for(int i = 0; i < info.ptr_size; i++) { - sy |= patch.read() << (i << 3); - } - -uint32 cx = 0, cy = 0, cp = 0; - patch.seek(patch.size - 12); - for(int i = 0; i < 4; i++) { - cx |= patch.read() << (i << 3); - } - for(int i = 0; i < 4; i++) { - cy |= patch.read() << (i << 3); - } - for(int i = 0; i < 4; i++) { - cp |= patch.read() << (i << 3); - } - - input.calc_crc32(); -//skip the stored patch crc32 when calculating - patch.size -= 4; - patch.calc_crc32(); - patch.size += 4; - -//validate patch crc32 - if(patch.crc32 != cp) { - return false; - } - -//validate input crc32 + size -bool input_num = 0; - if(input.crc32 == cx && input.size == sx) { - output.open(ACCESS_WRITE, sy); - input_num = 0; - } else if(input.crc32 == cy && input.size == sy) { - output.open(ACCESS_WRITE, sx); - input_num = 1; - } else { - return false; - } - - patch.seek(INDEX_FORMAT); - info.format = 0; - for(int i = 0; i < 4; i++) { - info.format |= patch.read() << (i << 3); - } - - info.patch_start = 0; - patch.seek(INDEX_VARIABLE + info.ptr_size * 2); - for(int i = 0; i < 4; i++) { - info.patch_start |= patch.read() << (i << 3); - } - - apply_patch_binary(); - - output.calc_crc32(); - return (output.crc32 == ((input_num == 0) ? cy : cx)); -} - -//main library interface functions - -bool BPF::create_patch(uint32 format, const char *fn_patch, const char *fn_x, const char *fn_y) { -uint32 size_x = fsize(fn_x); -uint32 size_y = fsize(fn_y); -bool lim_x = (size_x >= settings.memory_limit); -bool lim_y = (size_y >= settings.memory_limit); - switch(format) { - case FORMAT_BINARY: { - if(lim_x == false) { - original.load(fn_x); - } else { - original.open(ACCESS_READ, fn_x); - } - if(lim_y == false) { - modified.load(fn_y); - } else { - modified.open(ACCESS_READ, fn_y); - } - } break; - case FORMAT_SNES: { - if(lim_x == true || lim_y == true) { - //files must be loaded into memory to manipulate, but - //one or more files exceed the memory limit setting - return false; - } - uint32 size; - uint8 *data; - //remove header, if it exists - data = load(fn_x, size); - if((size & 0x1fff) == 0x0200) { - original.open(ACCESS_READ, size - 512, data + 512); - } else { - original.open(ACCESS_READ, size, data); - } - SafeFree(data); - - //remove header, if it exists - data = load(fn_y, size); - if((size & 0x1fff) == 0x0200) { - modified.open(ACCESS_READ, size - 512, data + 512); - } else { - modified.open(ACCESS_READ, size, data); - } - SafeFree(data); - } break; - } -bool result = create_patch(format, fn_patch); - original.close(); - modified.close(); - return result; -} - -bool BPF::apply_patch(const char *fn_patch, const char *fn_input) { -uint32 size_p = fsize(fn_patch); -uint32 size_i = fsize(fn_input); -bool lim_p = (size_p >= settings.memory_limit); -bool lim_i = (size_i >= settings.memory_limit); - if(lim_p == false) { - patch.load(fn_patch); - } else { - patch.open(ACCESS_READ, fn_patch); - } - - patch.seek(INDEX_FORMAT); -uint32 format; - format = patch.read(); - format |= patch.read() << 8; - format |= patch.read() << 16; - format |= patch.read() << 24; - patch.seek(0); - - switch(format) { - case FORMAT_BINARY: { - if(lim_i == false) { - input.load(fn_input); - } else { - input.open(ACCESS_READ, fn_input); - } - } break; - case FORMAT_SNES: { - if(lim_i == true) { - //file too large to load into memory? - patch.close(); - return false; - } - uint32 size; - uint8 *data = load(fn_input, size); - //remove header, if it exists - if((size & 0x1fff) == 0x0200) { - input.open(ACCESS_READ, size - 512, data + 512); - } else { - input.open(ACCESS_READ, size, data); - } - SafeFree(data); - } break; - } -bool result = apply_patch(); - patch.close(); - input.close(); - return result; -} - -bool BPF::apply_patch(uint32 s_patch, uint8 *p_patch, uint32 s_input, uint8 *p_input) { - patch.open(ACCESS_READ, s_patch, p_patch); - - patch.seek(INDEX_FORMAT); -uint32 format; - format = patch.read(); - format |= patch.read() << 8; - format |= patch.read() << 16; - format |= patch.read() << 24; - patch.seek(0); - - switch(format) { - case FORMAT_BINARY: { - input.open(ACCESS_READ, s_input, p_input); - } break; - case FORMAT_SNES: { - //remove header, if it exists - if((s_input & 0x1fff) == 0x0200) { - input.open(ACCESS_READ, s_input - 512, p_input + 512); - } else { - input.open(ACCESS_READ, s_input, p_input); - } - } break; - } -bool result = apply_patch(); - patch.close(); - input.close(); - return result; -} - -uint8 *BPF::get_output_handle(uint32 &size) { - size = output.size; - return (uint8*)output.data.handle(); -} - -void BPF::save_output(const char *fn) { - output.save(fn); -} - -void BPF::clear_settings() { - settings.memory_limit = (16 * 1024 * 1024) + 4096; - - settings.insert_data.enabled = false; - settings.insert_data.mode = 0; - settings.insert_data.handle = 0; - settings.insert_data.data = 0; - settings.insert_data.size = 0; - strcpy(settings.insert_data.fn, ""); -} - -BPF::BPF() { - clear_settings(); - original.set_parent(this); - modified.set_parent(this); - output.set_parent(this); - input.set_parent(this); - patch.set_parent(this); -} - -BPF::~BPF() { - original.close(); - modified.close(); - output.close(); - input.close(); - patch.close(); -} diff --git a/src/lib/libbpf.h b/src/lib/libbpf.h deleted file mode 100644 index 67dab312..00000000 --- a/src/lib/libbpf.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - libbpf : version 0.01 ~byuu (12/18/05) -*/ - -#ifndef __LIBBPF -#define __LIBBPF - -#include "libbase.h" -#include "libvector.h" - -class BPF; - -class BPF { -public: - -enum { -//patch formats - FORMAT_BINARY = 0x0000, - FORMAT_SNES = 0x0001, -}; - -enum { - INDEX_SIG = 0x00, //4 bytes - INDEX_VERSION = 0x04, //2 bytes - INDEX_PTRSIZE = 0x06, //2 bytes - INDEX_FORMAT = 0x08, //4 bytes - INDEX_FLAGS = 0x0c, //4 bytes - INDEX_VARIABLE = 0x10, //variable data follows -}; - -enum { MODE_MEMORY, MODE_FILE }; -enum { ACCESS_READ, ACCESS_WRITE }; - -struct Handle { - BPF *parent; - uint8 mode, access; - vector data; - FILE *handle; - uint32 size, pos, crc32; - - void seek(uint32 new_pos); - void write(uint8 x); - uint8 read(); - - uint32 calc_crc32(); - - bool open(uint8 _mode, uint32 size, uint8 *_data = 0); - bool open(uint8 _mode, const char *fn); - bool load(const char *fn); - bool save(const char *fn); - void close(); - - void set_parent(BPF *_bpf) { parent = _bpf; } - - Handle() { - mode = 0; access = 0; - crc32 = 0; handle = 0; - size = 0; pos = 0; - } -} original, modified, output, input, patch; - -struct { - uint32 memory_limit; - struct { - bool enabled; - uint8 mode; - char fn[4096]; - FILE *handle; - uint8 *data; - uint32 size; - } insert_data; -} settings; - -struct { - uint16 ptr_size; - uint32 size_min, size_max; - uint32 patch_start; - uint32 format; -} info; - - uint8 *load(const char *fn, uint32 &size); - void save(const char *fn, uint8 *data, uint32 size); - - void write_ptr(uint32 ptr); - uint32 read_ptr(); - void create_patch_binary(); - bool create_patch(uint32 format, const char *fn); - bool create_patch(uint32 format, const char *fn_patch, const char *fn_x, const char *fn_y); - - void apply_patch_binary(); - bool apply_patch(); - bool apply_patch(const char *fn_patch, const char *fn_input); - bool apply_patch(uint32 s_patch, uint8 *p_patch, uint32 s_input, uint8 *p_input); - - uint8 *get_output_handle(uint32 &size); - void save_output(const char *fn); - - void clear_settings(); - - BPF(); - ~BPF(); -}; - -#endif diff --git a/src/lib/libco_x86.h b/src/lib/libco_x86.h index dba5d185..a08a5347 100644 --- a/src/lib/libco_x86.h +++ b/src/lib/libco_x86.h @@ -5,11 +5,11 @@ typedef void (*thread_t); typedef void (*thread_p)(); -extern "C" void __fastcall co_init(); -extern "C" void __fastcall co_term(); -extern "C" thread_t __fastcall co_active(); -extern "C" thread_t __fastcall co_create(thread_p coentry, unsigned int heapsize); -extern "C" void __fastcall co_delete(thread_t cothread); -extern "C" void __fastcall co_jump(thread_t cothread); -extern "C" void __fastcall co_call(thread_t cothread); -extern "C" void __fastcall co_return(); +extern "C" void fastcall co_init(); +extern "C" void fastcall co_term(); +extern "C" thread_t fastcall co_active(); +extern "C" thread_t fastcall co_create(thread_p coentry, unsigned int heapsize); +extern "C" void fastcall co_delete(thread_t cothread); +extern "C" void fastcall co_jump(thread_t cothread); +extern "C" void fastcall co_call(thread_t cothread); +extern "C" void fastcall co_return(); diff --git a/src/lib/libconfig.h b/src/lib/libconfig.h index c7c2fa5f..7366952e 100644 --- a/src/lib/libconfig.h +++ b/src/lib/libconfig.h @@ -1,5 +1,5 @@ /* - libconfig : version 0.08 ~byuu (07/02/06) + libconfig : version 0.08a ~byuu (07/16/06) */ #ifndef __LIBCONFIG @@ -19,7 +19,7 @@ class Config; // class T : public Setting { public: SettingOperators(T); } t; // t = 0; // -> t.set(0); #define SettingOperators(__name) \ - template inline __name &operator=(const T x) { set(T(x)); return *this; } \ + template inline __name &operator=(const T &x) { set(x); return *this; } \ void toggle() { data ^= 1; set(data); } \ __name(Config *_parent, char *_name, char *_desc, uint _data, uint _type) : \ Setting(_parent, _name, _desc, _data, _type) {} \ @@ -60,14 +60,14 @@ substring char_data, char_def; Setting(Config *_parent, char *_name, char *_desc, uint _data, uint _type); Setting(Config *_parent, char *_name, char *_desc, char *_data); - template inline operator T() { return T(get()); } - template inline Setting &operator=(const T x) { set(T(x)); return *this; } - template inline bool operator==(const T x) { return T(get()) == x; } - template inline bool operator!=(const T x) { return T(get()) != x; } - template inline bool operator>=(const T x) { return T(get()) >= x; } - template inline bool operator> (const T x) { return T(get()) > x; } - template inline bool operator<=(const T x) { return T(get()) <= x; } - template inline bool operator< (const T x) { return T(get()) < x; } + template inline operator T() { return (T)get(); } + template inline Setting &operator=(const T &x) { set(x); return *this; } + template inline bool operator==(const T &x) { return (T)get() == x; } + template inline bool operator!=(const T &x) { return (T)get() != x; } + template inline bool operator>=(const T &x) { return (T)get() >= x; } + template inline bool operator> (const T &x) { return (T)get() > x; } + template inline bool operator<=(const T &x) { return (T)get() <= x; } + template inline bool operator< (const T &x) { return (T)get() < x; } }; class Config { diff --git a/src/lib/libfile.cpp b/src/lib/libfile.cpp new file mode 100644 index 00000000..68abf195 --- /dev/null +++ b/src/lib/libfile.cpp @@ -0,0 +1,49 @@ +#include "libbase.h" +#include "libvector.h" +#include "libfile.h" + +/***** + * c wrappers + *****/ + +void fread(file *s, uint8 *data, uint length) { s->read(data, length); } +uint8 fread(file *s) { return s->read(); } +uint8 fgetc(file *s) { return s->read(); } + +void fwrite(file *s, uint8 *data, uint length) { s->write(data, length); } +void fwrite(file *s, uint8 data) { s->write(data); } +void fputc(file *s, uint8 data) { s->write(data); } + +void fseek(file *s, uint offset, uint mode) { s->seek(offset, mode); } +uint foffset(file *s) { return s->offset(); } +uint ftell(file *s) { return s->offset(); } +uint fsize(file *s) { return s->size(); } +bool feof(file *s) { return s->eof(); } + +bool fopen(file *s, const char *filename, uint mode) { return s->open(filename, mode); } +bool fopen(file *s) { return s->open(); } +bool fflush(file *s) { return s->flush(); } +bool fclose(file *s) { return s->close(); } + +/***** + * c++ wrappers + *****/ + +void fread(file &s, uint8 *data, uint length) { s.read(data, length); } +uint8 fread(file &s) { return s.read(); } +uint8 fgetc(file &s) { return s.read(); } + +void fwrite(file &s, uint8 *data, uint length) { s.write(data, length); } +void fwrite(file &s, uint8 data) { s.write(data); } +void fputc(file &s, uint8 data) { s.write(data); } + +void fseek(file &s, uint offset, uint mode) { s.seek(offset, mode); } +uint foffset(file &s) { return s.offset(); } +uint ftell(file &s) { return s.offset(); } +uint fsize(file &s) { return s.size(); } +bool feof(file &s) { return s.eof(); } + +bool fopen(file &s, const char *filename, uint mode) { return s.open(filename, mode); } +bool fopen(file &s) { return s.open(); } +bool fflush(file &s) { return s.flush(); } +bool fclose(file &s) { return s.close(); } diff --git a/src/lib/libfile.h b/src/lib/libfile.h new file mode 100644 index 00000000..96386066 --- /dev/null +++ b/src/lib/libfile.h @@ -0,0 +1,334 @@ +/* + libfile : version 0.02 ~byuu (06/17/06) +*/ + +#ifndef __LIBFILE +#define __LIBFILE + +/***** + * file base class + *****/ + +class file { +public: +enum { mode_read, mode_write, mode_readwrite, mode_writeread }; +enum { seek_start, seek_end, seek_back, seek_forward }; + virtual void read(uint8 *data, uint length) = 0; + virtual uint8 read() = 0; + + virtual void write(uint8 *data, uint length) = 0; + virtual void write(uint8 data) = 0; + + virtual void seek(uint offset, uint mode = seek_start) = 0; + virtual uint offset() = 0; + virtual uint size() = 0; + virtual bool eof() = 0; + + virtual bool open(const char *filename, uint mode) = 0; + virtual bool open() = 0; + virtual bool flush() = 0; + virtual bool close() = 0; +}; + +/***** + * c wrappers + *****/ + +void fread(file *s, uint8 *data, uint length); +uint8 fread(file *s); +uint8 fgetc(file *s); + +void fwrite(file *s, uint8 *data, uint length); +void fwrite(file *s, uint8 data); +void fputc(file *s, uint8 data); + +void fseek(file *s, uint offset, uint mode = file::seek_start); +uint foffset(file *s); +uint ftell(file *s); +uint fsize(file *s); +bool feof(file *s); + +bool fopen(file *s, const char *filename, uint mode); +bool fopen(file *s); +bool fflush(file *s); +bool fclose(file *s); + +/***** + * c++ wrappers + *****/ + +void fread(file &s, uint8 *data, uint length); +uint8 fread(file &s); +uint8 fgetc(file &s); + +void fwrite(file &s, uint8 *data, uint length); +void fwrite(file &s, uint8 data); +void fputc(file &s, uint8 data); + +void fseek(file &s, uint offset, uint mode = file::seek_start); +uint foffset(file &s); +uint ftell(file &s); +uint fsize(file &s); +bool feof(file &s); + +bool fopen(file &s, const char *filename, uint mode); +bool fopen(file &s); +bool fflush(file &s); +bool fclose(file &s); + +/***** + * ramfile + *****/ + +class ramfile : public file { +private: +FILE *fp; +vector filedata; +char filename[1024]; +uint filepos; +uint filesize; +uint filemode; +bool fileopen; + +public: + void read(uint8 *data, uint length) { + if(!fileopen || filemode == mode_write) { return; } + + filedata.read(filepos, data, length); + filepos += length; + if(filepos > filesize)filepos = filesize; + } + + uint8 read() { + if(!fileopen || filemode == mode_write) { return 0; } + + uint8 r = filedata[filepos++]; + if(filepos > filesize)filepos = filesize; + return r; + } + + void write(uint8 *data, uint length) { + if(!fileopen || filemode == mode_read) { return; } + + filedata.write(filepos, data, length); + filepos += length; + if(filepos > filesize)filesize = filepos; + } + + void write(uint8 data) { + if(!fileopen || filemode == mode_read) { return; } + + filedata[filepos++] = data; + if(filepos > filesize)filesize = filepos; + } + + void seek(uint offset, uint mode = seek_start) { + if(!fileopen) { return; } + + switch(mode) { + case seek_start: filepos = offset; break; + case seek_end: filepos = filesize - offset; break; + case seek_back: filepos -= offset; break; + case seek_forward: filepos += offset; break; + } + + if(filemode == mode_read) { + if(filepos > filesize)filepos = filesize; + } else { + if(filepos > filesize)filesize = filepos; + } + } + + uint offset() { + if(!fileopen) { return 0; } + + return filepos; + } + + uint size() { + if(!fileopen) { return 0; } + + return filesize; + } + + bool eof() { + if(!fileopen) { return true; } + + return (filepos >= filesize); + } + + bool open(const char *fn, uint mode) { + if(fileopen) { return false; } + + strcpy(filename, fn); + filemode = mode; + switch(filemode) { + case mode_read: + case mode_readwrite: + fp = fopen(filename, "rb"); + if(!fp) { return false; } + filesize = fsize(fp); + fread(filedata.handle(filesize), 1, filesize, fp); + fclose(fp); + break; + default: + filesize = 0; + break; + } + filepos = 0; + fileopen = true; + return true; + } + + bool open() { + return fileopen; + } + + bool flush() { + if(!fileopen) { return false; } + + switch(filemode) { + case mode_readwrite: + case mode_write: + case mode_writeread: + fp = fopen(filename, "wb"); + if(!fp) { return false; } + fwrite(filedata.handle(filesize), 1, filesize, fp); + fclose(fp); + break; + } + return true; + } + + bool close() { + if(!fileopen) { return false; } + + bool result = flush(); + fileopen = false; + filedata.release(); + return result; + } + + ramfile() { + fileopen = false; + } + + ~ramfile() { + if(fileopen) { close(); } + } +}; + +/***** + * diskfile + *****/ + +class diskfile : public file { +private: +FILE *fp; +uint filemode; + +public: + void read(uint8 *data, uint length) { + if(!fp || filemode == mode_write) { return; } + + fread(data, 1, length, fp); + } + + uint8 read() { + if(!fp || filemode == mode_write) { return 0; } + + return fgetc(fp); + } + + void write(uint8 *data, uint length) { + if(!fp || filemode == mode_read) { return; } + + fwrite(data, 1, length, fp); + } + + void write(uint8 data) { + if(!fp || filemode == mode_read) { return; } + + fputc(data, fp); + } + + void seek(uint offset, uint mode = seek_start) { + if(!fp) { return; } + + switch(mode) { + default: + case seek_start: fseek(fp, offset, SEEK_SET); break; + case seek_end: fseek(fp, offset, SEEK_END); break; + case seek_back: fseek(fp, -offset, SEEK_CUR); break; + case seek_forward: fseek(fp, offset, SEEK_CUR); break; + } + } + + uint offset() { + if(!fp) { return 0; } + + return ftell(fp); + } + + uint size() { + if(!fp) { return 0; } + + uint pos = ftell(fp); + fseek(fp, 0, SEEK_END); + uint filesize = ftell(fp); + fseek(fp, pos, SEEK_SET); + return filesize; + } + + bool eof() { + if(!fp) { return true; } + + return feof(fp); + } + + bool open(const char *filename, uint mode) { + if(fp) { return false; } + + filemode = mode; + char m[8]; + switch(filemode) { + default: + case mode_read: strcpy(m, "rb"); break; + case mode_write: strcpy(m, "wb"); break; + case mode_readwrite: strcpy(m, "rb+"); break; + case mode_writeread: strcpy(m, "wb+"); break; + } + fp = fopen(filename, m); + if(!fp) { return false; } + return true; + } + + bool open() { + return (fp != 0); + } + + bool flush() { + if(!fp) { return false; } + + fflush(fp); + return true; + } + + bool close() { + if(!fp) { return false; } + + fclose(fp); + fp = 0; + return true; + } + + diskfile() { + fp = 0; + } + + ~diskfile() { + if(fp) { fclose(fp); } + } +}; + +#endif diff --git a/src/lib/libkeymap.h b/src/lib/libkeymap.h new file mode 100644 index 00000000..63171f48 --- /dev/null +++ b/src/lib/libkeymap.h @@ -0,0 +1,129 @@ +/* + libkeymap : version 0.01 ~byuu (07/14/06) +*/ + +#ifndef __LIBKEYMAP +#define __LIBKEYMAP + +class keymap { +public: + +uint esc; +uint f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12; +uint print_screen, scroll_lock, pause; +uint tilde; +uint num_0, num_1, num_2, num_3, num_4; +uint num_5, num_6, num_7, num_8, num_9; +uint minus, plus, backspace; +uint ins, del, home, end, page_up, page_down; +uint a, b, c, d, e, f, g, h, i, j, k, l, m; +uint n, o, p, q, r, s, t, u, v, w, x, y, z; +uint lbracket, rbracket; +uint pipe, colon, quote, comma, period, question; +uint numpad_0, numpad_1, numpad_2, numpad_3, numpad_4; +uint numpad_5, numpad_6, numpad_7, numpad_8, numpad_9; +uint numpad_plus, numpad_minus, numpad_mul; +uint numpad_div, numpad_enter, numpad_point; +uint numlock, capslock; +uint up, down, left, right; +uint tab, enter, space; +uint lctrl, rctrl, lalt, ralt, lshift, rshift; +uint lwin, rwin, menu; + + uint find(const char *key) { + #define match(n) if(!strcmp(#n, key))return n; + match(esc) + match(f1) match(f2) match(f3) match(f4) match(f5) match(f6) + match(f7) match(f8) match(f9) match(f10) match(f11) match(f12) + match(print_screen) match(scroll_lock) match(pause) + match(tilde) + match(num_0) match(num_1) match(num_2) match(num_3) match(num_4) + match(num_5) match(num_6) match(num_7) match(num_8) match(num_9) + match(minus) match(plus) match(backspace) + match(ins) match(del) match(home) + match(end) match(page_up) match(page_down) + match(a) match(b) match(c) match(d) match(e) match(f) + match(g) match(h) match(i) match(j) match(k) match(l) + match(m) match(n) match(o) match(p) match(q) match(r) + match(s) match(t) match(u) match(v) match(w) match(x) + match(y) match(z) + match(lbracket) match(rbracket) + match(pipe) match(colon) match(quote) + match(comma) match(period) match(question) + match(numpad_0) match(numpad_1) match(numpad_2) match(numpad_3) + match(numpad_4) match(numpad_5) match(numpad_6) match(numpad_7) + match(numpad_8) match(numpad_9) + match(numpad_plus) match(numpad_minus) match(numpad_mul) + match(numpad_div) match(numpad_enter) match(numpad_point) + match(numlock) match(capslock) + match(up) match(down) match(left) match(right) + match(tab) match(enter) match(space) + match(lctrl) match(rctrl) match(lalt) + match(ralt) match(lshift) match(rshift) + match(lwin) match(rwin) match(menu) + #undef match + } + + const char *find(uint key) { + #define match(n) if(n == key)return #n; + match(esc) + match(f1) match(f2) match(f3) match(f4) match(f5) match(f6) + match(f7) match(f8) match(f9) match(f10) match(f11) match(f12) + match(print_screen) match(scroll_lock) match(pause) + match(tilde) + match(num_0) match(num_1) match(num_2) match(num_3) match(num_4) + match(num_5) match(num_6) match(num_7) match(num_8) match(num_9) + match(minus) match(plus) match(backspace) + match(ins) match(del) match(home) + match(end) match(page_up) match(page_down) + match(a) match(b) match(c) match(d) match(e) match(f) + match(g) match(h) match(i) match(j) match(k) match(l) + match(m) match(n) match(o) match(p) match(q) match(r) + match(s) match(t) match(u) match(v) match(w) match(x) + match(y) match(z) + match(lbracket) match(rbracket) + match(pipe) match(colon) match(quote) + match(comma) match(period) match(question) + match(numpad_0) match(numpad_1) match(numpad_2) match(numpad_3) + match(numpad_4) match(numpad_5) match(numpad_6) match(numpad_7) + match(numpad_8) match(numpad_9) + match(numpad_plus) match(numpad_minus) match(numpad_mul) + match(numpad_div) match(numpad_enter) match(numpad_point) + match(numlock) match(capslock) + match(up) match(down) match(left) match(right) + match(tab) match(enter) match(space) + match(lctrl) match(rctrl) match(lalt) + match(ralt) match(lshift) match(rshift) + match(lwin) match(rwin) match(menu) + #undef match + } + + keymap() { + esc = 0; + f1 = f2 = f3 = f4 = f5 = f6 = 0; + f7 = f8 = f9 = f10 = f11 = f12 = 0; + print_screen = scroll_lock = pause = 0; + tilde = 0; + num_0 = num_1 = num_2 = num_3 = num_4 = 0; + num_5 = num_6 = num_7 = num_8 = num_9 = 0; + minus = plus = backspace = 0; + ins = del = home = end = page_up = page_down = 0; + a = b = c = d = e = f = g = h = i = 0; + j = k = l = m = n = o = p = q = r = 0; + s = t = u = v = w = x = y = z = 0; + lbracket = rbracket = 0; + pipe = colon = quote = comma = period = question = 0; + numpad_0 = numpad_1 = numpad_2 = numpad_3 = numpad_4 = 0; + numpad_5 = numpad_6 = numpad_7 = numpad_8 = numpad_9 = 0; + numpad_plus = numpad_minus = numpad_mul = 0; + numpad_div = numpad_enter = numpad_point = 0; + numlock = capslock = 0; + up = down = left = right = 0; + tab = enter = space = 0; + lctrl = rctrl = lalt = ralt = lshift = rshift = 0; + lwin = rwin = menu = 0; + } + +}; + +#endif diff --git a/src/lib/libstring.cpp b/src/lib/libstring.cpp index 712beb63..5c5d40d6 100644 --- a/src/lib/libstring.cpp +++ b/src/lib/libstring.cpp @@ -523,6 +523,23 @@ substring &btoa(substring &str, uint num) { return str; } +bool strfread(substring &str, const char *filename) { + strcpy(str, ""); + +FILE *fp = fopen(filename, "rb"); + if(!fp)return false; + +uint size = fsize(fp); +char *fdata = (char*)malloc(size + 1); + fread(fdata, 1, size, fp); + fclose(fp); + fdata[size] = 0; + strcpy(str, fdata); + free(fdata); + + return true; +} + #include "libstring_math.cpp" #include "libstring_split.cpp" #include "libstring_replace.cpp" diff --git a/src/lib/libstring.h b/src/lib/libstring.h index 52e93558..8cc08440 100644 --- a/src/lib/libstring.h +++ b/src/lib/libstring.h @@ -1,5 +1,5 @@ /* - libstring : version 0.11 ~byuu (07/02/06) + libstring : version 0.11b ~byuu (07/16/06) */ #ifndef __LIBSTRING @@ -141,11 +141,10 @@ substring &uhtoa(substring &str, uint num); char *btoa(char *str, uint num); substring &btoa(substring &str, uint num); -uint strmath(const char *in_str); -uint strmath(substring &in_str); +bool strfread(substring &str, const char *filename); -bool strmathentity(const char *str); -bool strmathentity(substring &str); +int strmath(const char *in_str); +int strmath(substring &in_str); substring &replace(substring &str, const char *key, const char *token); substring &replace(substring &str, const char *key, substring &token); @@ -166,9 +165,6 @@ class substring { public: char *s; uint size; -//inline char* operator*() { return s; } -//inline operator char*() { return s; } - substring(); ~substring(); }; @@ -189,10 +185,8 @@ uint listcount, count; void addto(uint num); //creates all needed strings to make list[num] valid substring &str(uint num); //gets a substring reference, creating it + new strings if needed -//inline char* operator*() { return strptr(str(0)); } -//inline operator char*() { return str(0).s; } - inline operator substring&() { return str(0); } - template inline substring& operator[](T i) { return str(i); } + inline operator substring&() { return str(0); } + template inline substring& operator[](const T i) { return str(i); } string(); ~string(); diff --git a/src/lib/libstring_math.cpp b/src/lib/libstring_math.cpp index 0e96aa69..9aa571b9 100644 --- a/src/lib/libstring_math.cpp +++ b/src/lib/libstring_math.cpp @@ -1,179 +1,121 @@ -#define STRMATH_ADD 1 -#define STRMATH_SUB 2 -#define STRMATH_MUL 3 -#define STRMATH_DIV 4 -#define STRMATH_MOD 5 -#define STRMATH_AND 6 -#define STRMATH_OR 7 -#define STRMATH_XOR 8 -#define STRMATH_SHL 9 -#define STRMATH_SHR 10 +/* + c-style Math Evaluator v1.0 (07/03/2006) + Algorithm: Recursive Descent Processor + Written by: gladius + Optimized by: gladius and byuu + Public Domain +*/ -#define STRMATH_LINKED 64 - -#define STRMATHMODE_NEG 1 -#define STRMATHMODE_NOT 2 - -#define __strunktonum() \ - if (s1[0] == '0' && s1[1] == 'x')r = strhex(s1 + 2); \ - else if(s1[0] == '0' && s1[1] == 'b')r = strbin(s1 + 2); \ - else r = strdec(s1) - -#define __strmath_setmode() \ - if (str[i] == '-') { mode = STRMATHMODE_NEG; i++; } \ - else if(str[i] == '~') { mode = STRMATHMODE_NOT; i++; } \ - else if(str[i] == '+') { i++; } \ - else mode=0 - -#define __strmath_modeset() \ - if (mode == STRMATHMODE_NEG)r *= -1; \ - else if(mode == STRMATHMODE_NOT)r =~ r - -#define __strmath_set(__x) \ - s1[z] = 0; \ - z = 0; \ - __strunktonum(); \ - __strmath_modeset(); \ - array[array_size++] = r; \ - array_gate[array_size] = __x - -/*************************************** -strmath(str) - resolves all math entities from within - str, and returns numerical result - example: strmath("5+5")=10 -***************************************/ -uint p_strmath(const char *str) { -int i = 0, ssl = strlen(str); -uint r, array[128], array_size = 0, z = 0; -uint8 x, mode = 0; -uint8 array_gate[128]; -char *s1; - if(!ssl)return 0; - s1 = (char*)malloc(ssl + 1); - __strmath_setmode(); - while(i < ssl) { - x = str[i++]; - if (x == '+') { __strmath_set(STRMATH_ADD); __strmath_setmode(); } - else if(x == '-') { __strmath_set(STRMATH_SUB); __strmath_setmode(); } - else if(x == '*') { __strmath_set(STRMATH_MUL); __strmath_setmode(); } - else if(x == '/') { __strmath_set(STRMATH_DIV); __strmath_setmode(); } - else if(x == '%') { __strmath_set(STRMATH_MOD); __strmath_setmode(); } - else if(x == '&') { __strmath_set(STRMATH_AND); __strmath_setmode(); } - else if(x == '|') { __strmath_set(STRMATH_OR ); __strmath_setmode(); } - else if(x == '^') { __strmath_set(STRMATH_XOR); __strmath_setmode(); } - else if(x == '<' && str[i] == '<') { __strmath_set(STRMATH_SHL); i++; __strmath_setmode(); } - else if(x == '>' && str[i] == '>') { __strmath_set(STRMATH_SHR); i++; __strmath_setmode(); } - else s1[z++] = x; - } - s1[z] = 0; - __strunktonum(); - __strmath_modeset(); - array[array_size++] = r; - free(s1); - - for(i=1;i>= array[i]; array_gate[i] = STRMATH_LINKED; } - } - - for(i=1;i maxpdepth)maxpdepth = pdepth; - } else if(str[i]==')') { - if(pdepth == 0) { - free(str); - return 0; //error! too many )'s - } - pdepth --; +#define maxlevel 12 +int strmath_rdp(const char *&s, int level = 0) { + if(level == maxlevel) { + if(*s == '(') { + int result = strmath_rdp(++s, 0); + s++; + return result; + } else if(*s == '+') { + return +strmath_rdp(++s, maxlevel); + } else if(*s == '-') { + return -strmath_rdp(++s, maxlevel); + } else if(*s == '!') { + return !strmath_rdp(++s, maxlevel); + } else if(*s == '~') { + return ~strmath_rdp(++s, maxlevel); + } else if(*s >= '0' && *s <= '9') { + int num, len; + sscanf(s, "%d%n", &num, &len); + s += len; + return num; } } - if(pdepth != 0) { - free(str); - return 0; //error! unequal ('s to )'s - } - - pdepth = maxpdepth; - while(pdepth) { - cpdepth = 0; - for(i=0;i' && b == '=') { s++; break; } + if(a == '<')break; + if(a == '>')break; + return lhs; + case 9: + if(a == '<' && b == '<') { s++; break; } + if(a == '>' && b == '>') { s++; break; } + return lhs; + case 10: + if(a == '+')break; + if(a == '-')break; + return lhs; + case 11: + if(a == '*')break; + if(a == '/')break; + if(a == '%')break; + return lhs; + } + if(a == '?') { + int tr = strmath_rdp(++s, level); + int fr = strmath_rdp(++s, level); + lhs = (lhs) ? tr : fr; + } else { + int rhs = strmath_rdp(++s, level + 1); + if (a == '|' && b == '|') lhs = (lhs || rhs); + else if(a == '^' && b == '^') lhs = (!lhs != !rhs); + else if(a == '&' && b == '&') lhs = (lhs && rhs); + else if(a == '|' && b != '|') lhs |= rhs; + else if(a == '^' && b != '^') lhs ^= rhs; + else if(a == '&' && b != '&') lhs &= rhs; + else if(a == '=' && b == '=') lhs = (lhs == rhs); + else if(a == '!' && b == '=') lhs = (lhs != rhs); + else if(a == '<' && b == '=') lhs = (lhs <= rhs); + else if(a == '>' && b == '=') lhs = (lhs >= rhs); + else if(a == '<' && b != '<') lhs = (lhs < rhs); + else if(a == '>' && b != '>') lhs = (lhs > rhs); + else if(a == '<' && b == '<') lhs <<= rhs; + else if(a == '>' && b == '>') lhs >>= rhs; + else if(a == '+') lhs += rhs; + else if(a == '-') lhs -= rhs; + else if(a == '*') lhs *= rhs; + else if(a == '/') lhs /= rhs; + else if(a == '%') lhs %= rhs; } - pdepth--; } - - r = p_strmath(str); - - free(str); - return r; + return lhs; } -uint strmath(substring &in_str) { return strmath(strptr(in_str)); } +#undef maxlevel -bool strmathentity(const char *str) { -int i, ssl = strlen(str); - for(i=0;i' && str[i+1] == '>'))return true; - } - return false; +int strmath(const char *s) { + return strmath_rdp(s); } -bool strmathentity(substring &str) { return strmathentity(strptr(str)); } + +#ifdef __LIBSTRING +int strmath(substring &s) { + return strmath(strptr(s)); +} +#endif diff --git a/src/lib/libvector.h b/src/lib/libvector.h index 4607bafc..4054f665 100644 --- a/src/lib/libvector.h +++ b/src/lib/libvector.h @@ -1,5 +1,5 @@ /* - libvector : version 0.04 ~byuu (12/24/05) + libvector : version 0.04a ~byuu (06/15/05) */ #ifndef __LIBVECTOR @@ -41,40 +41,48 @@ public: //used to free up memory used by vector, but without //actually destroying the vector itself - void release() { - resize(16); + void release() { resize(16); } + + T *handle(uint req_size = 0) { + if(req_size > size)resize(req_size); + return (T*)array; } - T *handle() { return (T*)array; } - - void copy(T *source, uint32 copy_size) { - if(copy_size > size) { - resize(copy_size); - copy_size = size; - } - memcpy(array, source, copy_size * sizeof(T)); + void read(uint start, T *source, uint length) { + if(start + length > size)resize(start + length); + memcpy(array + start, source, length); } - void clear() { - memset(array, 0, size * sizeof(T)); + void read(T *source, uint length) { read(0, source, length); } + + void write(uint start, T *dest, uint length) { + if(start + length > size)resize(start + length); + memcpy(dest, array + start, length); } + void write(T *dest, uint length) { write(0, dest, length); } + + void clear() { memset(array, 0, size * sizeof(T)); } + vector(int newsize, int newsizelimit) { size = newsize; sizelimit = newsizelimit; - array = (T*)calloc(size, sizeof(T)); + array = (T*)malloc(size * sizeof(T)); + clear(); } vector(int newsize) { size = newsize; sizelimit = 1 << 24; - array = (T*)calloc(size, sizeof(T)); + array = (T*)malloc(size * sizeof(T)); + clear(); } vector() { size = 16; sizelimit = 1 << 24; - array = (T*)calloc(size, sizeof(T)); + array = (T*)malloc(size * sizeof(T)); + clear(); } ~vector() { diff --git a/src/memory/bmemory/bmemory.cpp b/src/memory/bmemory/bmemory.cpp index f53a637b..449faffd 100644 --- a/src/memory/bmemory/bmemory.cpp +++ b/src/memory/bmemory/bmemory.cpp @@ -1,72 +1,93 @@ #include "../../base.h" +#include "mapper/mapper.cpp" #include "bmemory_rw.cpp" #include "bmemory_mapper_generic.cpp" void bMemBus::load_cart() { if(rom_loaded == true)return; -uint8 *rom = cartridge.rom; -uint16 index = cartridge.cart.header_index; - dprintf("* Image Name : \"%s\"", cartridge.cart.name); - dprintf("* Region : %s", (cartridge.cart.region == Cartridge::NTSC) ? "NTSC" : "PAL"); - dprintf("* Address Decoder : %0.2x", cartridge.cart.mapper); - dprintf("* SRAM Size : %dkb", cartridge.cart.sram_size / 1024); -char t[256]; - strcpy(t, ""); - if(cartridge.cart.srtc)strcat(t, "S-RTC, "); - if(cartridge.cart.sdd1)strcat(t, "S-DD1, "); - if(cartridge.cart.c4) strcat(t, "Cx4, "); - if(cartridge.cart.dsp1)strcat(t, "DSP-1, "); - if(cartridge.cart.dsp2)strcat(t, "DSP-2, "); - if(cartridge.cart.obc1)strcat(t, "OBC-1, "); - strrtrim(t, ", "); - dprintf("* Coprocessor(s) : %s", (strlen(t) == 0) ? "None" : t); - dprintf("* Reset:%0.4x NMI[n]:%0.4x IRQ[n]:%0.4x BRK[n]:%0.4x COP[n]:%0.4x", - read16(rom, index + 0x3c), //Reset - read16(rom, index + 0x2a), //NMI - read16(rom, index + 0x2e), //IRQ - read16(rom, index + 0x26), //BRK - read16(rom, index + 0x24) //COP - ); -//BRK[e] should be $fff6, however emulation mode brk is technically not supported. -//this needs verification, but I believe brk jumps to IRQ[e] vector. - dprintf("* NMI[e]:%0.4x IRQ[e]:%0.4x BRK[e]:%0.4x COP[e]:%0.4x", - read16(rom, index + 0x3a), //NMI - read16(rom, index + 0x3e), //IRQ - read16(rom, index + 0x3e), //BRK - read16(rom, index + 0x34) //COP - ); - dprintf("* CRC32 : %0.8x", cartridge.cart.crc32); - dprintf(""); - cart_map_reset(); - switch(cartridge.cart.mapper) { + switch(cartridge.info.mapper) { + case Cartridge::PCB: + if(!strcmp(cartridge.info.pcb, "SHVC-1A3B-01")) { cart_map_shvc_1a3b_13(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3B-11")) { cart_map_shvc_1a3b_13(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3B-12")) { cart_map_shvc_1a3b_13(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3B-13")) { cart_map_shvc_1a3b_13(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3B-20")) { cart_map_shvc_1a3b_20(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3M-10")) { cart_map_shvc_1a3m_30(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3M-20")) { cart_map_shvc_1a3m_30(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3M-21")) { cart_map_shvc_1a3m_30(); break; } + if(!strcmp(cartridge.info.pcb, "SHVC-1A3M-30")) { cart_map_shvc_1a3m_30(); break; } + if(!strcmp(cartridge.info.pcb, "BSC-1A5M-01")) { cart_map_bsc_1a5m_01(); break; } + if(!strcmp(cartridge.info.pcb, "BSC-1A7M-01")) { cart_map_bsc_1a7m_01(); break; } + if(!strcmp(cartridge.info.pcb, "BSC-1A7M-10")) { cart_map_bsc_1a7m_10(); break; } + dprintf("* PCB mapper not found"); + return; + case Cartridge::LOROM: case Cartridge::HIROM: case Cartridge::EXLOROM: case Cartridge::EXHIROM: - cart_map_generic(cartridge.cart.mapper); + cart_map_generic(cartridge.info.mapper); break; default: + dprintf("* generic mapper not found"); return; } - if(cartridge.cart.sdd1)cart_map_sdd1(); - if(cartridge.cart.c4) cart_map_c4(); - if(cartridge.cart.dsp1)cart_map_dsp1(); - if(cartridge.cart.dsp2)cart_map_dsp2(); - if(cartridge.cart.obc1)cart_map_obc1(); + if(cartridge.info.sdd1)cart_map_sdd1(); + if(cartridge.info.c4) cart_map_c4(); + if(cartridge.info.dsp1)cart_map_dsp1(); + if(cartridge.info.dsp2)cart_map_dsp2(); + if(cartridge.info.obc1)cart_map_obc1(); cart_map_system(); - if(cartridge.cart.region == Cartridge::NTSC) { +uint region = read(0xffd9) & 0x7f; + cartridge.info.region = (region == 0 || region == 1 || region == 13) ? Cartridge::NTSC : Cartridge::PAL; + if(cartridge.info.region == Cartridge::NTSC) { snes->set_region(SNES::NTSC); } else { snes->set_region(SNES::PAL); } rom_loaded = true; + +//print cartridge info to debug console + + dprintf("* CRC32 : %0.8x", cartridge.info.crc32); + dprintf("* Name : \"%s\"", cartridge.info.name); + dprintf("* PCB : %s", cartridge.info.pcb); + dprintf("* ROM Size : %dmbit", cartridge.info.rom_size / 1024 / 1024 * 8); + dprintf("* RAM Size : %dkbit", cartridge.info.ram_size / 1024 * 8); + dprintf("* Region : %s", (cartridge.info.region == Cartridge::NTSC) ? "NTSC" : "PAL"); +char t[256]; + strcpy(t, ""); + if(cartridge.info.srtc)strcat(t, "S-RTC, "); + if(cartridge.info.sdd1)strcat(t, "S-DD1, "); + if(cartridge.info.c4) strcat(t, "Cx4, "); + if(cartridge.info.dsp1)strcat(t, "DSP-1, "); + if(cartridge.info.dsp2)strcat(t, "DSP-2, "); + if(cartridge.info.obc1)strcat(t, "OBC-1, "); + strrtrim(t, ", "); + dprintf("* Coprocessor(s) : %s", (strlen(t) == 0) ? "None" : t); + dprintf("* Reset:%0.4x NMI[n]:%0.4x IRQ[n]:%0.4x BRK[n]:%0.4x COP[n]:%0.4x", + (read(0xfffc) << 0) | (read(0xfffd) << 8), //Reset + (read(0xffea) << 0) | (read(0xffeb) << 8), //NMI + (read(0xffee) << 0) | (read(0xffef) << 8), //IRQ + (read(0xffe6) << 0) | (read(0xffe7) << 8), //BRK + (read(0xffe4) << 0) | (read(0xffe5) << 8) //COP + ); +//BRK[e] should be $fff6, however emulation mode brk is technically not supported. +//this needs verification, but I believe brk jumps to IRQ[e] vector. + dprintf("* NMI[e]:%0.4x IRQ[e]:%0.4x BRK[e]:%0.4x COP[e]:%0.4x", + (read(0xfffa) << 0) | (read(0xfffb) << 8), //NMI + (read(0xfffe) << 0) | (read(0xffff) << 8), //IRQ + (read(0xfffe) << 0) | (read(0xffff) << 8), //BRK + (read(0xfff4) << 0) | (read(0xfff5) << 8) //COP + ); + dprintf(""); } void bMemBus::unload_cart() { @@ -177,12 +198,12 @@ void bMemBus::cart_map_system() { void bMemBus::power() { cart_write_protect(true); - memset(wram, 0, 0x020000); + memset(wram, 0xff, 0x020000); reset(); } void bMemBus::reset() { - set_speed(false); + set_speed(0); } bMemBus::bMemBus() { diff --git a/src/memory/bmemory/bmemory.h b/src/memory/bmemory/bmemory.h index fbf519a1..20a985cd 100644 --- a/src/memory/bmemory/bmemory.h +++ b/src/memory/bmemory/bmemory.h @@ -7,6 +7,8 @@ uint8 *page_handle[65536]; uint8 (bMemBus::*page_read [65536])(uint32 addr); void (bMemBus::*page_write[65536])(uint32 addr, uint8 data); +#include "mapper/mapper.h" + enum { LOROM = 0x20, HIROM = 0x21, EXLOROM = 0x22, EXHIROM = 0x25 }; enum { TYPE_WRAM, TYPE_MMIO, TYPE_CART }; diff --git a/src/memory/bmemory/bmemory_mapper_generic.cpp b/src/memory/bmemory/bmemory_mapper_generic.cpp index f4c55914..13a597dd 100644 --- a/src/memory/bmemory/bmemory_mapper_generic.cpp +++ b/src/memory/bmemory/bmemory_mapper_generic.cpp @@ -16,8 +16,8 @@ *****/ void bMemBus::cart_map_generic(uint type) { uint32 P0_size, P1_size, ROM_mask, ROM_size, SRAM_size; - ROM_size = cartridge.cart.rom_size; - SRAM_size = cartridge.cart.sram_size; + ROM_size = cartridge.info.rom_size; + SRAM_size = cartridge.info.ram_size; //calculate highest power of 2, which is the size of the first ROM chip P0_size = 0x800000; @@ -64,7 +64,7 @@ uint32 P0_size, P1_size, ROM_mask, ROM_size, SRAM_size; //LoROM SRAM region //$[70-7f|f0-ff]:[0000-7fff] //Note: WRAM is remapped over $[7e-7f]:[0000-ffff] - if((bank & 0x7f) >= 0x70 && (bank & 0x7f) <= 0x7f && (addr & 0x8000) == 0x0000) { + if(bank >= 0x70 && bank <= 0x7f && (addr & 0x8000) == 0x0000) { if(SRAM_size == 0)continue; if(type == Cartridge::LOROM || !(bank & 0x80)) { @@ -141,40 +141,48 @@ void bMemBus::cart_map_c4() { } void bMemBus::cart_map_dsp1() { - if(cartridge.cart.dsp1_mapper == Cartridge::DSP1_LOROM_1MB) { - //$[20-3f]:[8000-ffff] + if(cartridge.info.dsp1_mapper == Cartridge::DSP1_LOROM_1MB) { + //$[20-3f|a0-bf]:[8000-ffff] for(uint bank = 0x20; bank <= 0x3f; bank++) { for(uint page = 0x80; page <= 0xff; page++) { - page_read [(bank << 8) + page] = &bMemBus::read_dsp1; - page_write[(bank << 8) + page] = &bMemBus::write_dsp1; + page_read [0x0000 + (bank << 8) + page] = &bMemBus::read_dsp1; + page_read [0x8000 + (bank << 8) + page] = &bMemBus::read_dsp1; + page_write[0x0000 + (bank << 8) + page] = &bMemBus::write_dsp1; + page_write[0x8000 + (bank << 8) + page] = &bMemBus::write_dsp1; } } - } else if(cartridge.cart.dsp1_mapper == Cartridge::DSP1_LOROM_2MB) { - //$[60-6f]:[0000-7fff] + } else if(cartridge.info.dsp1_mapper == Cartridge::DSP1_LOROM_2MB) { + //$[60-6f|e0-ef]:[0000-7fff] for(uint bank = 0x60; bank <= 0x6f; bank++) { for(uint page = 0x00; page <= 0x7f; page++) { - page_read [(bank << 8) + page] = &bMemBus::read_dsp1; - page_write[(bank << 8) + page] = &bMemBus::write_dsp1; + page_read [0x0000 + (bank << 8) + page] = &bMemBus::read_dsp1; + page_read [0x8000 + (bank << 8) + page] = &bMemBus::read_dsp1; + page_write[0x0000 + (bank << 8) + page] = &bMemBus::write_dsp1; + page_write[0x8000 + (bank << 8) + page] = &bMemBus::write_dsp1; } } - } else if(cartridge.cart.dsp1_mapper == Cartridge::DSP1_HIROM) { - //$[00-1f]:[6000-7fff] + } else if(cartridge.info.dsp1_mapper == Cartridge::DSP1_HIROM) { + //$[00-1f|80-9f]:[6000-7fff] for(uint bank = 0x00; bank <= 0x1f; bank++) { for(uint page = 0x60; page <= 0x7f; page++) { - page_read [(bank << 8) + page] = &bMemBus::read_dsp1; - page_write[(bank << 8) + page] = &bMemBus::write_dsp1; + page_read [0x0000 + (bank << 8) + page] = &bMemBus::read_dsp1; + page_read [0x8000 + (bank << 8) + page] = &bMemBus::read_dsp1; + page_write[0x0000 + (bank << 8) + page] = &bMemBus::write_dsp1; + page_write[0x8000 + (bank << 8) + page] = &bMemBus::write_dsp1; } } } } void bMemBus::cart_map_dsp2() { -//$[20-3f]:[6000-6fff|8000-bfff] +//$[20-3f|a0-bf]:[6000-6fff|8000-bfff] for(uint bank = 0x20; bank <= 0x3f; bank++) { for(uint page = 0x60; page <= 0xbf; page++) { if(page >= 0x70 && page <= 0x7f)continue; - page_read [(bank << 8) + page] = &bMemBus::read_dsp2; - page_write[(bank << 8) + page] = &bMemBus::write_dsp2; + page_read [0x0000 + (bank << 8) + page] = &bMemBus::read_dsp2; + page_read [0x8000 + (bank << 8) + page] = &bMemBus::read_dsp2; + page_write[0x0000 + (bank << 8) + page] = &bMemBus::write_dsp2; + page_write[0x8000 + (bank << 8) + page] = &bMemBus::write_dsp2; } } } diff --git a/src/memory/bmemory/bmemory_rw.cpp b/src/memory/bmemory/bmemory_rw.cpp index 99fac6e8..35c80a1f 100644 --- a/src/memory/bmemory/bmemory_rw.cpp +++ b/src/memory/bmemory/bmemory_rw.cpp @@ -39,13 +39,13 @@ void bMemBus::write_ram(uint32 addr, uint8 data) { // uint8 bMemBus::read_sdd1(uint32 addr) { - addr = sdd1->offset(addr) % cartridge.cart.rom_size; + addr = sdd1->offset(addr) % cartridge.info.rom_size; return cartridge.rom[addr]; } void bMemBus::write_sdd1(uint32 addr, uint8 data) { if(cart_write_protect_enabled == true)return; - addr = sdd1->offset(addr) % cartridge.cart.rom_size; + addr = sdd1->offset(addr) % cartridge.info.rom_size; cartridge.rom[addr] = data; } diff --git a/src/memory/bmemory/mapper/mapper.cpp b/src/memory/bmemory/mapper/mapper.cpp new file mode 100644 index 00000000..65c5b30a --- /dev/null +++ b/src/memory/bmemory/mapper/mapper.cpp @@ -0,0 +1,56 @@ +void bMemBus::cart_map_range( + uint8 bank_lo, uint8 bank_hi, + uint8 page_lo, uint8 page_hi, + uint type, uint offset +) { +uint8 *data = 0; +uint size = 0; +uint index = 0; + + switch(type) { + + case MAP_ROM: { + data = cartridge.rom; + size = cartridge.info.rom_size; + } break; + + case MAP_RAM: { + data = cartridge.sram; + size = cartridge.info.ram_size; + } break; + + } + + if(size) { index = (index + offset) % size; } + + for(uint bank = bank_lo; bank <= bank_hi; bank++) { + for(uint page = page_lo; page <= page_hi; page++) { + uint16 n = (bank << 8) + page; + + page_handle[n] = data + index; + if(size) { index = (index + 256) % size; } + + switch(type) { + + case MAP_ROM: { + page_read [n] = &bMemBus::read_rom; + page_write[n] = &bMemBus::write_rom; + } break; + + case MAP_RAM: { + page_read [n] = &bMemBus::read_ram; + page_write[n] = &bMemBus::write_ram; + } break; + + } + } + } +} + +#define mapper(name) void bMemBus::cart_map_##name() +#define map cart_map_range + +#include "mapper_pcb.cpp" + +#undef cart_map_range +#undef mapper diff --git a/src/memory/bmemory/mapper/mapper.h b/src/memory/bmemory/mapper/mapper.h new file mode 100644 index 00000000..f331d92d --- /dev/null +++ b/src/memory/bmemory/mapper/mapper.h @@ -0,0 +1,21 @@ +enum { + MAP_ROM, + MAP_RAM, + MAP_BSX, + MAP_SDD1, + MAP_CX4, + MAP_DSP1, + MAP_DSP2, + MAP_OBC1, +}; + + void cart_map_range(uint8 bank_lo, uint8 bank_hi, uint8 page_lo, uint8 page_hi, uint type, uint offset = 0); + +#define mapper(name) void cart_map_##name() + mapper(shvc_1a3b_13); + mapper(shvc_1a3b_20); + mapper(shvc_1a3m_30); + mapper(bsc_1a5m_01); + mapper(bsc_1a7m_01); + mapper(bsc_1a7m_10); +#undef mapper diff --git a/src/memory/bmemory/mapper/mapper_pcb.cpp b/src/memory/bmemory/mapper/mapper_pcb.cpp new file mode 100644 index 00000000..f6ddf6f8 --- /dev/null +++ b/src/memory/bmemory/mapper/mapper_pcb.cpp @@ -0,0 +1,95 @@ +//SHVC-1A3B-01 +//SHVC-1A3B-11 +//SHVC-1A3B-12 +//SHVC-1A3B-13 +// +//$[00-1f]:[8000-ffff] ROM P0 +//$[70-7f]:[0000-ffff] RAM +//$[80-9f]:[8000-ffff] ROM P0 +//$[f0-ff]:[0000-ffff] RAM +mapper(shvc_1a3b_13) { + map(0x00, 0x1f, 0x80, 0xff, MAP_ROM); + map(0x70, 0x7f, 0x00, 0xff, MAP_RAM); + map(0x80, 0x9f, 0x80, 0xff, MAP_ROM); + map(0xf0, 0xff, 0x00, 0xff, MAP_RAM); +} + +//SHVC-1A3B-20 +// +//$[00-7f]:[8000-ffff] ROM P0 +//$[70-7f]:[0000-7fff] RAM +//$[80-ff]:[8000-ffff] ROM P0 +//$[f0-ff]:[0000-7fff] RAM +mapper(shvc_1a3b_20) { + map(0x00, 0x7f, 0x80, 0xff, MAP_ROM); + map(0x70, 0x7f, 0x00, 0x7f, MAP_RAM); + map(0x80, 0xff, 0x80, 0xff, MAP_ROM); + map(0xf0, 0xff, 0x00, 0x7f, MAP_RAM); +} + +//SHVC-1A3M-10 +//SHVC-1A3M-20 +//SHVC-1A3M-21 +//SHVC-1A3M-30 +// +//$[00-7f]:[8000-ffff] +//$[70-7f]:[0000-7fff] +//$[80-ff]:[8000-ffff] +//$[f0-ff]:[0000-7fff] +mapper(shvc_1a3m_30) { + map(0x00, 0x7f, 0x80, 0xff, MAP_ROM); + map(0x70, 0x7f, 0x00, 0x7f, MAP_RAM); + map(0x80, 0xff, 0x80, 0xff, MAP_ROM); + map(0xf0, 0xff, 0x00, 0x7f, MAP_RAM); +} + +//unverified +//BSC-1A5M-01 +// +//$[00-1f]:[8000-ffff] ROM P0 +//$[20-3f]:[8000-ffff] ROM P1 +//$[70-7f]:[0000-7fff] RAM +//$[80-9f]:[8000-ffff] ROM P2 +//$[a0-bf]:[8000-ffff] ROM P1 +//$[c0-ef]:[0000-ffff] BSX +mapper(bsc_1a5m_01) { + map(0x00, 0x1f, 0x80, 0xff, MAP_ROM, 0x000000); + map(0x20, 0x3f, 0x80, 0xff, MAP_ROM, 0x100000); + map(0x70, 0x7f, 0x00, 0x7f, MAP_RAM); + map(0x80, 0x9f, 0x80, 0xff, MAP_ROM, 0x200000); + map(0xa0, 0xbf, 0x80, 0xff, MAP_ROM, 0x100000); +} + +//unverified +//BSC-1A7M-01 +// +//$[00-1f]:[8000-ffff] ROM P0 +//$[20-3f]:[8000-ffff] ROM P1 +//$[70-7f]:[0000-7fff] RAM +//$[80-9f]:[8000-ffff] ROM P0 +//$[a0-bf]:[8000-ffff] ROM P1 +//$[c0-ef]:[0000-ffff] BSX +mapper(bsc_1a7m_01) { + map(0x00, 0x1f, 0x80, 0xff, MAP_ROM, 0x000000); + map(0x20, 0x3f, 0x80, 0xff, MAP_ROM, 0x100000); + map(0x70, 0x7f, 0x00, 0x7f, MAP_RAM); + map(0x80, 0x9f, 0x80, 0xff, MAP_ROM, 0x000000); + map(0xa0, 0xbf, 0x80, 0xff, MAP_ROM, 0x100000); +} + +//unverified +//BSC-1A7M-10 +// +//$[00-1f]:[8000-ffff] ROM P0 +//$[20-3f]:[8000-ffff] ROM P1 +//$[70-7f]:[0000-7fff] RAM +//$[80-9f]:[8000-ffff] ROM P2 +//$[a0-bf]:[8000-ffff] ROM P1 +//$[c0-ef]:[0000-ffff] BSX +mapper(bsc_1a7m_10) { + map(0x00, 0x1f, 0x80, 0xff, MAP_ROM, 0x000000); + map(0x20, 0x3f, 0x80, 0xff, MAP_ROM, 0x100000); + map(0x70, 0x7f, 0x00, 0x7f, MAP_RAM); + map(0x80, 0x9f, 0x80, 0xff, MAP_ROM, 0x200000); + map(0xa0, 0xbf, 0x80, 0xff, MAP_ROM, 0x100000); +} diff --git a/src/ppu/bppu/bppu.cpp b/src/ppu/bppu/bppu.cpp index 8f2f2829..dbc974dc 100644 --- a/src/ppu/bppu/bppu.cpp +++ b/src/ppu/bppu/bppu.cpp @@ -10,21 +10,6 @@ void bPPU::scanline() { line.interlace = r_cpu->interlace(); line.interlace_field = r_cpu->interlace_field(); -//this should probably only be done once per frame (at the -//start of vblank), however it is currently done every scanline -//as an attempt to emulate FirstSprite+Y priority mode - if(regs.oam_priority == true) { - if((regs.oam_addr & 3) == 3) { - //FirstSprite+Y priority (untested) - regs.oam_firstsprite = (regs.oam_addr >> 2) + (line.y - 1); - } else { - regs.oam_firstsprite = (regs.oam_addr >> 2); - } - regs.oam_firstsprite &= 127; - } else { - regs.oam_firstsprite = 0; - } - if(line.y == 0) { //RTO flag reset regs.time_over = false; @@ -39,6 +24,13 @@ void bPPU::scanline() { regs.mosaic_countdown = regs.mosaic_size + 1; regs.mosaic_countdown--; + + //OAM sprite priority rotation + if(regs.oam_priority == false) { + regs.oam_firstsprite = 0; + } else { + regs.oam_firstsprite = (regs.oam_addr >> 2) & 127; + } } else { for(int32 bg = BG1; bg <= BG4; bg++) { if(!regs.mosaic_enabled[bg] || !regs.mosaic_countdown) { @@ -52,8 +44,7 @@ void bPPU::scanline() { regs.mosaic_countdown--; } -//TODO: line.y position needs to be verified - if(line.y == (r_cpu->overscan() ? 240 : 225) && regs.display_disabled == false) { + if(line.y == (!r_cpu->overscan() ? 225 : 240) && regs.display_disabled == false) { //OAM address reset regs.oam_addr = regs.oam_baseaddr << 1; } @@ -72,9 +63,14 @@ void bPPU::scanline() { } void bPPU::render_scanline() { +#ifdef FAVOR_SPEED +//bypass RTO status flag calculations if(status.render_output == false)return; +#endif if(line.y > 0 && line.y < (r_cpu->overscan() ? 240 : 225)) { + render_line_oam_rto(); + if(status.render_output == false)return; render_line(); } } diff --git a/src/ppu/bppu/bppu.h b/src/ppu/bppu/bppu.h index 26691976..8a070b48 100644 --- a/src/ppu/bppu/bppu.h +++ b/src/ppu/bppu/bppu.h @@ -150,8 +150,8 @@ struct { void cgram_write(uint16 addr, uint8 value); uint16 get_vram_address(); - bool vram_can_read(); - bool vram_can_write(uint8 &value); + uint8 vram_mmio_read (uint16 addr); + void vram_mmio_write(uint16 addr, uint8 data); void mmio_w2100(uint8 value); //INIDISP void mmio_w2101(uint8 value); //OBSEL diff --git a/src/ppu/bppu/bppu_mmio.cpp b/src/ppu/bppu/bppu_mmio.cpp index 440f9085..71d00d29 100644 --- a/src/ppu/bppu/bppu_mmio.cpp +++ b/src/ppu/bppu/bppu_mmio.cpp @@ -8,17 +8,17 @@ uint16 bPPU::get_vram_address() { uint16 addr; addr = regs.vram_addr; switch(regs.vram_mapping) { - case 0:break; - case 1:addr = (addr & 0xff00) | ((addr & 0x001f) << 3) | ((addr >> 5) & 7);break; - case 2:addr = (addr & 0xfe00) | ((addr & 0x003f) << 3) | ((addr >> 6) & 7);break; - case 3:addr = (addr & 0xfc00) | ((addr & 0x007f) << 3) | ((addr >> 7) & 7);break; + case 0: break; + case 1: addr = (addr & 0xff00) | ((addr & 0x001f) << 3) | ((addr >> 5) & 7); break; + case 2: addr = (addr & 0xfe00) | ((addr & 0x003f) << 3) | ((addr >> 6) & 7); break; + case 3: addr = (addr & 0xfc00) | ((addr & 0x007f) << 3) | ((addr >> 7) & 7); break; } return (addr << 1); } -bool bPPU::vram_can_read() { +uint8 bPPU::vram_mmio_read(uint16 addr) { if(regs.display_disabled == true) { - return true; + return vram_read(addr); } uint16 v = r_cpu->vcounter(); @@ -26,39 +26,57 @@ uint16 hc = r_cpu->hcycles(); uint16 ls = (r_cpu->region_scanlines() >> 1) - 1; if(r_cpu->interlace() && !r_cpu->interlace_field())ls++; - if(v == ls && hc == 1362)return false; - - if(v < (!r_cpu->overscan() ? 224 : 239))return false; - - if(v == (!r_cpu->overscan() ? 224 : 239)) { - if(hc == 1362)return true; - return false; + if(v == ls && hc == 1362) { + return 0x00; } - return true; + if(v < (!r_cpu->overscan() ? 224 : 239)) { + return 0x00; + } + + if(v == (!r_cpu->overscan() ? 224 : 239)) { + if(hc == 1362) { + return vram_read(addr); + } + return 0x00; + } + + return vram_read(addr); } -bool bPPU::vram_can_write(uint8 &value) { +void bPPU::vram_mmio_write(uint16 addr, uint8 data) { if(regs.display_disabled == true) { - return true; + vram_write(addr, data); + return; } uint16 v = r_cpu->vcounter(); uint16 hc = r_cpu->hcycles(); if(v == 0) { - if(hc <= 4)return true; - if(hc == 6) { value = r_cpu->regs.mdr; return true; } - return false; + if(hc <= 4) { + vram_write(addr, data); + return; + } + if(hc == 6) { + vram_write(addr, r_cpu->regs.mdr); + return; + } + return; } - if(v < (r_cpu->overscan() ? 240 : 225))return false; - - if(v == (r_cpu->overscan() ? 240 : 225)) { - if(hc <= 4)return false; - return true; + if(v < (!r_cpu->overscan() ? 225 : 240)) { + return; } - return true; + if(v == (!r_cpu->overscan() ? 225 : 240)) { + if(hc <= 4) { + return; + } + vram_write(addr, data); + return; + } + + vram_write(addr, data); } //INIDISP @@ -78,6 +96,12 @@ void bPPU::mmio_w2101(uint8 value) { void bPPU::mmio_w2102(uint8 value) { regs.oam_baseaddr = (regs.oam_baseaddr & 0x100) | value; regs.oam_addr = regs.oam_baseaddr << 1; + + if(regs.oam_priority == false) { + regs.oam_firstsprite = 0; + } else { + regs.oam_firstsprite = (regs.oam_addr >> 2) & 127; + } } //OAMADDH @@ -85,24 +109,34 @@ void bPPU::mmio_w2103(uint8 value) { regs.oam_priority = bool(value & 0x80); regs.oam_baseaddr = ((value & 1) << 8) | (regs.oam_baseaddr & 0xff); regs.oam_addr = regs.oam_baseaddr << 1; + + if(regs.oam_priority == false) { + regs.oam_firstsprite = 0; + } else { + regs.oam_firstsprite = (regs.oam_addr >> 2) & 127; + } } //OAMDATA void bPPU::mmio_w2104(uint8 value) { if(regs.oam_addr >= 0x0200) { - //does this happen? - //if(!(regs.oam_addr & 1)) { - // regs.oam_latchdata = value; - //} oam_write(regs.oam_addr, value); } else if(!(regs.oam_addr & 1)) { regs.oam_latchdata = value; } else { - oam_write((regs.oam_addr & 0x01fe), regs.oam_latchdata); + oam_write((regs.oam_addr & 0x01fe) + 0, regs.oam_latchdata); oam_write((regs.oam_addr & 0x01fe) + 1, value); } regs.oam_addr++; regs.oam_addr &= 0x03ff; + + if(!(regs.oam_addr & 1)) { + if(regs.oam_priority == false) { + regs.oam_firstsprite = 0; + } else { + regs.oam_firstsprite = (regs.oam_addr >> 2) & 127; + } + } } //BGMODE @@ -220,10 +254,10 @@ void bPPU::mmio_w2115(uint8 value) { regs.vram_incmode = bool(value & 0x80); regs.vram_mapping = (value >> 2) & 3; switch(value & 3) { - case 0:regs.vram_incsize = 1;break; - case 1:regs.vram_incsize = 32;break; - case 2:regs.vram_incsize = 128;break; - case 3:regs.vram_incsize = 128;break; + case 0: regs.vram_incsize = 1; break; + case 1: regs.vram_incsize = 32; break; + case 2: regs.vram_incsize = 128; break; + case 3: regs.vram_incsize = 128; break; } } @@ -231,35 +265,25 @@ void bPPU::mmio_w2115(uint8 value) { void bPPU::mmio_w2116(uint8 value) { regs.vram_addr = (regs.vram_addr & 0xff00) | value; uint16 addr = get_vram_address(); - if(vram_can_read()) { - regs.vram_readbuffer = vram_read(addr); - regs.vram_readbuffer |= vram_read(addr + 1) << 8; - } else { - regs.vram_readbuffer = 0x0000; - } + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; } //VMADDH void bPPU::mmio_w2117(uint8 value) { regs.vram_addr = (value << 8) | (regs.vram_addr & 0x00ff); uint16 addr = get_vram_address(); - if(vram_can_read()) { - regs.vram_readbuffer = vram_read(addr); - regs.vram_readbuffer |= vram_read(addr + 1) << 8; - } else { - regs.vram_readbuffer = 0x0000; - } + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; } //VMDATAL void bPPU::mmio_w2118(uint8 value) { uint16 addr = get_vram_address(); - if(vram_can_write(value)) { - vram_write(addr, value); - bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; - bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; - bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; - } + vram_mmio_write(addr, value); + bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; + bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; + bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; if(regs.vram_incmode == 0) { regs.vram_addr += regs.vram_incsize; @@ -269,12 +293,10 @@ uint16 addr = get_vram_address(); //VMDATAH void bPPU::mmio_w2119(uint8 value) { uint16 addr = get_vram_address() + 1; - if(vram_can_write(value)) { - vram_write(addr, value); - bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; - bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; - bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; - } + vram_mmio_write(addr, value); + bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; + bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; + bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; if(regs.vram_incmode == 1) { regs.vram_addr += regs.vram_incsize; @@ -529,14 +551,17 @@ uint8 bPPU::mmio_r2137() { //OAMDATAREAD uint8 bPPU::mmio_r2138() { regs.ppu1_mdr = oam_read(regs.oam_addr); -//DMV27: OAM writes do not affect latch data -//byuu: Even if they do, this should only affect the low table -//byuu: Disable for now, see what happens... test on hardware -//if(!(regs.oam_addr & 1)) { -// regs.oam_latchdata = regs.ppu1_mdr; -//} regs.oam_addr++; regs.oam_addr &= 0x03ff; + + if(!(regs.oam_addr & 1)) { + if(regs.oam_priority == false) { + regs.oam_firstsprite = 0; + } else { + regs.oam_firstsprite = (regs.oam_addr >> 2) & 127; + } + } + return regs.ppu1_mdr; } @@ -546,12 +571,8 @@ uint16 addr = get_vram_address(); regs.ppu1_mdr = regs.vram_readbuffer; if(regs.vram_incmode == 0) { addr &= 0xfffe; - if(vram_can_read()) { - regs.vram_readbuffer = vram_read(addr); - regs.vram_readbuffer |= vram_read(addr + 1) << 8; - } else { - regs.vram_readbuffer = 0x0000; - } + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; regs.vram_addr += regs.vram_incsize; } return regs.ppu1_mdr; @@ -563,12 +584,8 @@ uint16 addr = get_vram_address() + 1; regs.ppu1_mdr = regs.vram_readbuffer >> 8; if(regs.vram_incmode == 1) { addr &= 0xfffe; - if(vram_can_read()) { - regs.vram_readbuffer = vram_read(addr); - regs.vram_readbuffer |= vram_read(addr + 1) << 8; - } else { - regs.vram_readbuffer = 0x0000; - } + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; regs.vram_addr += regs.vram_incsize; } return regs.ppu1_mdr; diff --git a/src/ppu/bppu/bppu_render.cpp b/src/ppu/bppu/bppu_render.cpp index 48d88030..9a85fd07 100644 --- a/src/ppu/bppu/bppu_render.cpp +++ b/src/ppu/bppu/bppu_render.cpp @@ -161,14 +161,14 @@ void bPPU::render_line() { update_bg_info(); switch(regs.bg_mode) { - case 0:render_line_mode0();break; - case 1:render_line_mode1();break; - case 2:render_line_mode2();break; - case 3:render_line_mode3();break; - case 4:render_line_mode4();break; - case 5:render_line_mode5();break; - case 6:render_line_mode6();break; - case 7:render_line_mode7();break; + case 0: render_line_mode0(); break; + case 1: render_line_mode1(); break; + case 2: render_line_mode2(); break; + case 3: render_line_mode3(); break; + case 4: render_line_mode4(); break; + case 5: render_line_mode5(); break; + case 6: render_line_mode6(); break; + case 7: render_line_mode7(); break; } render_line_output(); diff --git a/src/ppu/bppu/bppu_render.h b/src/ppu/bppu/bppu_render.h index 7e7de347..ac6bbeba 100644 --- a/src/ppu/bppu/bppu_render.h +++ b/src/ppu/bppu/bppu_render.h @@ -77,6 +77,7 @@ void build_sprite_list(); bool is_sprite_on_scanline(); void load_oam_tiles(); void render_oam_tile(int tile_num); +void render_line_oam_rto(); void render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos); void render_line_oam_lores(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos); diff --git a/src/ppu/bppu/bppu_render_bg.cpp b/src/ppu/bppu/bppu_render_bg.cpp index d5a7d400..6e22a0e0 100644 --- a/src/ppu/bppu/bppu_render_bg.cpp +++ b/src/ppu/bppu/bppu_render_bg.cpp @@ -54,40 +54,40 @@ void bPPU::render_line_bg(uint8 bg, uint8 color_depth, uint8 pri0_pos, uint8 pri //nothing to render? if(!pri0_pos && !pri1_pos)return; -bool bg_enabled = regs.bg_enabled[bg]; -bool bgsub_enabled = regs.bgsub_enabled[bg]; +bool bg_enabled = regs.bg_enabled[bg]; +bool bgsub_enabled = regs.bgsub_enabled[bg]; -uint16 opt_valid_bit = (bg == BG1) ? 0x2000 : (bg == BG2) ? 0x4000 : 0x0000; -uint8 bgpal_index = (regs.bg_mode == 0) ? (bg << 5) : 0; +uint16 opt_valid_bit = (bg == BG1) ? 0x2000 : (bg == BG2) ? 0x4000 : 0x0000; +uint8 bgpal_index = (regs.bg_mode == 0) ? (bg << 5) : 0; -uint8 pal_size = 2 << color_depth; //<<2 (*4), <<4 (*16), <<8 (*256) -uint16 tile_mask = 0x0fff >> color_depth; //0x0fff, 0x07ff, 0x03ff +uint8 pal_size = 2 << color_depth; //<<2 (*4), <<4 (*16), <<8 (*256) +uint16 tile_mask = 0x0fff >> color_depth; //0x0fff, 0x07ff, 0x03ff //4 + color_depth = >>(4-6) -- / {16, 32, 64 } bytes/tile //index is a tile number count to add to base tile number uint tiledata_index = regs.bg_tdaddr[bg] >> (4 + color_depth); -uint8 *bg_td = (uint8*)bg_tiledata[color_depth]; -uint8 *bg_td_state = (uint8*)bg_tiledata_state[color_depth]; +uint8 *bg_td = (uint8*)bg_tiledata[color_depth]; +uint8 *bg_td_state = (uint8*)bg_tiledata_state[color_depth]; -uint8 tile_width = bg_info[bg].tw; -uint8 tile_height = bg_info[bg].th; -uint16 mask_x = bg_info[bg].mx; //screen width mask -uint16 mask_y = bg_info[bg].my; //screen height mask +uint8 tile_width = bg_info[bg].tw; +uint8 tile_height = bg_info[bg].th; +uint16 mask_x = bg_info[bg].mx; //screen width mask +uint16 mask_y = bg_info[bg].my; //screen height mask -uint x = 0; -uint y = regs.bg_y[bg]; - if(regs.interlace && regs.hires) { - y = (y << 1) + line.interlace_field; +uint16 x = 0; +uint16 y = regs.bg_y[bg]; +uint16 hscroll = regs.bg_hofs[bg]; +uint16 vscroll = regs.bg_vofs[bg]; + + if(regs.hires) { + hscroll <<= 1; + if(regs.interlace) { + vscroll <<= 1; + y = (y << 1) + line.interlace_field; + } } -uint16 hscroll = (regs.hires) ? (regs.bg_hofs[bg] << 1) : regs.bg_hofs[bg]; -uint16 vscroll = (regs.interlace && regs.hires) ? (regs.bg_vofs[bg] << 1) : regs.bg_vofs[bg]; - hscroll &= mask_x; - vscroll &= mask_y; - uint16 *mtable = (uint16*)mosaic_table[(regs.mosaic_enabled[bg]) ? regs.mosaic_size : 0]; -uint16 mosaic_x; -uint16 mosaic_y; uint16 hval, vval; uint16 t, tile_pri, tile_num; @@ -104,7 +104,7 @@ uint8 *wt_sub = window[bg].sub; int32 prev_x = -1, prev_y = -1; for(x = 0; x < line.width; x++) { - hoffset = x + hscroll; + hoffset = mtable[x] + hscroll; voffset = y + vscroll; if(is_opt_mode) { @@ -139,27 +139,27 @@ int32 prev_x = -1, prev_y = -1; } } - mosaic_x = mtable[hoffset & mask_x]; - mosaic_y = voffset & mask_y; + hoffset &= mask_x; + voffset &= mask_y; - if((mosaic_x >> 3) != prev_x || (mosaic_y >> 3) != prev_y) { - prev_x = (mosaic_x >> 3); - prev_y = (mosaic_y >> 3); + if((hoffset >> 3) != prev_x || (voffset >> 3) != prev_y) { + prev_x = (hoffset >> 3); + prev_y = (voffset >> 3); - t = bg_get_tile(bg, mosaic_x, mosaic_y); + t = bg_get_tile(bg, hoffset, voffset); - mirror_y = bool(t & 0x8000); - mirror_x = bool(t & 0x4000); + mirror_y = bool(t & 0x8000); + mirror_x = bool(t & 0x4000); tile_pri = (t & 0x2000) ? pri1_pos : pri0_pos; tile_num = t; if(tile_width == 4) { //16x16 horizontal tile mirroring - if(bool(mosaic_x & 8) != mirror_x)tile_num++; + if(bool(hoffset & 8) != mirror_x)tile_num++; } if(tile_height == 4) { //16x16 vertical tile mirroring - if(bool(mosaic_y & 8) != mirror_y)tile_num += 16; + if(bool(voffset & 8) != mirror_y)tile_num += 16; } tile_num &= 0x03ff; @@ -173,13 +173,13 @@ int32 prev_x = -1, prev_y = -1; pal_num = ((t >> 10) & 7); pal_index = bgpal_index + (pal_num << pal_size); - ypos = mosaic_y & 7; + ypos = voffset & 7; if(mirror_y)ypos ^= 7; //invert y tile pos tile_ptr = (uint8*)bg_td + (tile_num * 64) + (ypos * 8); } - xpos = mosaic_x & 7; + xpos = hoffset & 7; if(mirror_x)xpos ^= 7; //invert x tile pos col = *(tile_ptr + xpos); if(col) { diff --git a/src/ppu/bppu/bppu_render_cache.cpp b/src/ppu/bppu/bppu_render_cache.cpp index 8cc20a11..dbdacec4 100644 --- a/src/ppu/bppu/bppu_render_cache.cpp +++ b/src/ppu/bppu/bppu_render_cache.cpp @@ -1,27 +1,24 @@ -#define render_bg_tile_line_4(__m) \ - col = 0; \ - if(d0 & __m)col += 1; \ - if(d1 & __m)col += 2; \ +#define render_bg_tile_line_2bpp(mask) \ + col = bool(d0 & mask) << 0; \ + col += bool(d1 & mask) << 1; \ *dest++ = col -#define render_bg_tile_line_16(__m) \ - col = 0; \ - if(d0 & __m)col += 1; \ - if(d1 & __m)col += 2; \ - if(d2 & __m)col += 4; \ - if(d3 & __m)col += 8; \ +#define render_bg_tile_line_4bpp(mask) \ + col = bool(d0 & mask) << 0; \ + col += bool(d1 & mask) << 1; \ + col += bool(d2 & mask) << 2; \ + col += bool(d3 & mask) << 3; \ *dest++ = col -#define render_bg_tile_line_256(__m) \ - col = 0; \ - if(d0 & __m)col += 1; \ - if(d1 & __m)col += 2; \ - if(d2 & __m)col += 4; \ - if(d3 & __m)col += 8; \ - if(d4 & __m)col += 16; \ - if(d5 & __m)col += 32; \ - if(d6 & __m)col += 64; \ - if(d7 & __m)col += 128; \ +#define render_bg_tile_line_8bpp(mask) \ + col = bool(d0 & mask) << 0; \ + col += bool(d1 & mask) << 1; \ + col += bool(d2 & mask) << 2; \ + col += bool(d3 & mask) << 3; \ + col += bool(d4 & mask) << 4; \ + col += bool(d5 & mask) << 5; \ + col += bool(d6 & mask) << 6; \ + col += bool(d7 & mask) << 7; \ *dest++ = col void bPPU::render_bg_tile(uint8 color_depth, uint16 tile_num) { @@ -37,14 +34,14 @@ uint8 *dest; while(y--) { d0 = vram[pos ]; d1 = vram[pos + 1]; - render_bg_tile_line_4(0x80); - render_bg_tile_line_4(0x40); - render_bg_tile_line_4(0x20); - render_bg_tile_line_4(0x10); - render_bg_tile_line_4(0x08); - render_bg_tile_line_4(0x04); - render_bg_tile_line_4(0x02); - render_bg_tile_line_4(0x01); + render_bg_tile_line_2bpp(0x80); + render_bg_tile_line_2bpp(0x40); + render_bg_tile_line_2bpp(0x20); + render_bg_tile_line_2bpp(0x10); + render_bg_tile_line_2bpp(0x08); + render_bg_tile_line_2bpp(0x04); + render_bg_tile_line_2bpp(0x02); + render_bg_tile_line_2bpp(0x01); pos += 2; } bg_tiledata_state[TILE_2BIT][tile_num] = 0; @@ -58,14 +55,14 @@ uint8 *dest; d1 = vram[pos + 1]; d2 = vram[pos + 16]; d3 = vram[pos + 17]; - render_bg_tile_line_16(0x80); - render_bg_tile_line_16(0x40); - render_bg_tile_line_16(0x20); - render_bg_tile_line_16(0x10); - render_bg_tile_line_16(0x08); - render_bg_tile_line_16(0x04); - render_bg_tile_line_16(0x02); - render_bg_tile_line_16(0x01); + render_bg_tile_line_4bpp(0x80); + render_bg_tile_line_4bpp(0x40); + render_bg_tile_line_4bpp(0x20); + render_bg_tile_line_4bpp(0x10); + render_bg_tile_line_4bpp(0x08); + render_bg_tile_line_4bpp(0x04); + render_bg_tile_line_4bpp(0x02); + render_bg_tile_line_4bpp(0x01); pos += 2; } bg_tiledata_state[TILE_4BIT][tile_num] = 0; @@ -83,14 +80,14 @@ uint8 *dest; d5 = vram[pos + 33]; d6 = vram[pos + 48]; d7 = vram[pos + 49]; - render_bg_tile_line_256(0x80); - render_bg_tile_line_256(0x40); - render_bg_tile_line_256(0x20); - render_bg_tile_line_256(0x10); - render_bg_tile_line_256(0x08); - render_bg_tile_line_256(0x04); - render_bg_tile_line_256(0x02); - render_bg_tile_line_256(0x01); + render_bg_tile_line_8bpp(0x80); + render_bg_tile_line_8bpp(0x40); + render_bg_tile_line_8bpp(0x20); + render_bg_tile_line_8bpp(0x10); + render_bg_tile_line_8bpp(0x08); + render_bg_tile_line_8bpp(0x04); + render_bg_tile_line_8bpp(0x02); + render_bg_tile_line_8bpp(0x01); pos += 2; } bg_tiledata_state[TILE_8BIT][tile_num] = 0; @@ -98,9 +95,9 @@ uint8 *dest; } } -#undef render_bg_tile_line_4 -#undef render_bg_tile_line_16 -#undef render_bg_tile_line_256 +#undef render_bg_tile_line_2bpp +#undef render_bg_tile_line_4bpp +#undef render_bg_tile_line_8bpp inline void bPPU::clear_pixel_cache() { uint16 main = get_palette(0); diff --git a/src/ppu/bppu/bppu_render_mode7.cpp b/src/ppu/bppu/bppu_render_mode7.cpp index 6d09416e..720087e7 100644 --- a/src/ppu/bppu/bppu_render_mode7.cpp +++ b/src/ppu/bppu/bppu_render_mode7.cpp @@ -25,15 +25,15 @@ void bPPU::render_line_mode7(uint8 bg, uint8 pri0_pos, uint8 pri1_pos) { int32 px, py; int32 tx, ty, tile, palette; -int32 a = sclip<15>(regs.m7a); //int32(int16(regs.m7a)); -int32 b = sclip<15>(regs.m7b); //int32(int16(regs.m7b)); -int32 c = sclip<15>(regs.m7c); //int32(int16(regs.m7c)); -int32 d = sclip<15>(regs.m7d); //int32(int16(regs.m7d)); +int32 a = sclip<16>(regs.m7a); +int32 b = sclip<16>(regs.m7b); +int32 c = sclip<16>(regs.m7c); +int32 d = sclip<16>(regs.m7d); -int32 cx = sclip<13>(regs.m7x); //(int32(regs.m7x) << 19) >> 19; -int32 cy = sclip<13>(regs.m7y); //(int32(regs.m7y) << 19) >> 19; -int32 hofs = sclip<13>(regs.m7_hofs); //(int32(regs.m7_hofs) << 19) >> 19; -int32 vofs = sclip<13>(regs.m7_vofs); //(int32(regs.m7_vofs + 0) << 19) >> 19; +int32 cx = sclip<13>(regs.m7x); +int32 cy = sclip<13>(regs.m7y); +int32 hofs = sclip<13>(regs.m7_hofs); +int32 vofs = sclip<13>(regs.m7_vofs); int _pri, _x; bool _bg_enabled = regs.bg_enabled[bg]; diff --git a/src/ppu/bppu/bppu_render_oam.cpp b/src/ppu/bppu/bppu_render_oam.cpp index 7d71961d..1066fc43 100644 --- a/src/ppu/bppu/bppu_render_oam.cpp +++ b/src/ppu/bppu/bppu_render_oam.cpp @@ -95,7 +95,8 @@ uint16 chry = (spr->character >> 4) & 15; for(uint tx = 0; tx < tile_width; tx++) { uint sx = (x + (tx << 3)) & 511; - if(sx > 256 && (sx + 7) < 512)continue; //ignore sprites that are offscreen + //ignore sprites that are offscreen, x==256 is a special case that loads all tiles in OBJ + if(x != 256 && sx >= 256 && (sx + 7) < 512)continue; if(regs.oam_tilecount++ > 34)break; uint n = regs.oam_tilecount - 1; @@ -136,7 +137,7 @@ uint8 *tile_ptr = (uint8*)oam_td + (t->tile << 6) + ((t->y & 7) << 3); } } -void bPPU::render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos) { +void bPPU::render_line_oam_rto() { build_sprite_list(); regs.oam_itemcount = 0; @@ -158,14 +159,11 @@ void bPPU::render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 load_oam_tiles(); } - for(int s = 0; s < 34; s++) { - if(oam_tilelist[s].tile == 0xffff)continue; - render_oam_tile(s); - } - regs.time_over |= (regs.oam_tilecount > 34); regs.range_over |= (regs.oam_itemcount > 32); +} +void bPPU::render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos) { if(regs.bg_enabled[OAM] == false && regs.bgsub_enabled[OAM] == false)return; //are layers disabled by user? @@ -176,6 +174,11 @@ void bPPU::render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 //nothing to render? if(!pri0_pos && !pri1_pos && !pri2_pos && !pri3_pos)return; + for(int s = 0; s < 34; s++) { + if(oam_tilelist[s].tile == 0xffff)continue; + render_oam_tile(s); + } + render_line_oam_lores(pri0_pos, pri1_pos, pri2_pos, pri3_pos); } diff --git a/src/snes/audio/audio.cpp b/src/snes/audio/audio.cpp index eb2787e2..af617cba 100644 --- a/src/snes/audio/audio.cpp +++ b/src/snes/audio/audio.cpp @@ -112,6 +112,7 @@ void SNES::log_audio_disable() { } void SNES::audio_init() { + pcmfp = 0; } void SNES::audio_term() { diff --git a/src/snes/snes.cpp b/src/snes/snes.cpp index 59c9bb6e..79b4f875 100644 --- a/src/snes/snes.cpp +++ b/src/snes/snes.cpp @@ -61,12 +61,12 @@ void SNES::power() { r_ppu->power(); r_mem->power(); - if(cartridge.cart.srtc)srtc->power(); - if(cartridge.cart.sdd1)sdd1->power(); - if(cartridge.cart.c4) c4->power(); - if(cartridge.cart.dsp1)dsp1->power(); - if(cartridge.cart.dsp2)dsp2->power(); - if(cartridge.cart.obc1)obc1->power(); + if(cartridge.info.srtc)srtc->power(); + if(cartridge.info.sdd1)sdd1->power(); + if(cartridge.info.c4) c4->power(); + if(cartridge.info.dsp1)dsp1->power(); + if(cartridge.info.dsp2)dsp2->power(); + if(cartridge.info.obc1)obc1->power(); r_mem->flush_mmio_mappers(); for(int i = 0x2100; i <= 0x213f; i++)r_mem->set_mmio_mapper(i, r_ppu); @@ -76,12 +76,12 @@ void SNES::power() { for(int i = 0x4200; i <= 0x421f; i++)r_mem->set_mmio_mapper(i, r_cpu); for(int i = 0x4300; i <= 0x437f; i++)r_mem->set_mmio_mapper(i, r_cpu); - if(cartridge.cart.srtc)srtc->enable(); - if(cartridge.cart.sdd1)sdd1->enable(); - if(cartridge.cart.c4) c4->enable(); - if(cartridge.cart.dsp1)dsp1->enable(); - if(cartridge.cart.dsp2)dsp2->enable(); - if(cartridge.cart.obc1)obc1->enable(); + if(cartridge.info.srtc)srtc->enable(); + if(cartridge.info.sdd1)sdd1->enable(); + if(cartridge.info.c4) c4->enable(); + if(cartridge.info.dsp1)dsp1->enable(); + if(cartridge.info.dsp2)dsp2->enable(); + if(cartridge.info.obc1)obc1->enable(); video_update(); } @@ -96,12 +96,12 @@ void SNES::reset() { r_ppu->reset(); r_mem->reset(); - if(cartridge.cart.srtc)srtc->reset(); - if(cartridge.cart.sdd1)sdd1->reset(); - if(cartridge.cart.c4) c4->reset(); - if(cartridge.cart.dsp1)dsp1->reset(); - if(cartridge.cart.dsp2)dsp2->reset(); - if(cartridge.cart.obc1)obc1->reset(); + if(cartridge.info.srtc)srtc->reset(); + if(cartridge.info.sdd1)sdd1->reset(); + if(cartridge.info.c4) c4->reset(); + if(cartridge.info.dsp1)dsp1->reset(); + if(cartridge.info.dsp2)dsp2->reset(); + if(cartridge.info.obc1)obc1->reset(); video_update(); } @@ -118,9 +118,9 @@ void SNES::scanline() { void SNES::frame() {} -/**************** - *** PAL/NTSC *** - ****************/ +/***** + * PAL/NTSC + *****/ void SNES::set_region(uint8 new_region) { if(new_region == NTSC) { @@ -136,13 +136,21 @@ void SNES::set_region(uint8 new_region) { uint8 SNES::region() { return snes_region; } -/************** - *** Timing *** - **************/ +/***** + * Timing + * + * Note: Stock PAL CPU speed is currently unknown. + * It is thought to be 21281370hz, but this causes + * sound errors in certain games. Therefore, the PAL + * CPU is currently clocked 40000hz slower, at + * 21241370hz. + *****/ void SNES::update_timing() { - sync.counter = 0; - sync.cpu_freq = (snes_region == NTSC) ? 21477272 : 21281370; + sync.counter = 0; + sync.dsp_counter = 0; + + sync.cpu_freq = (snes_region == NTSC) ? 21477272 : 21241370; sync.apu_freq = 24576000; for(int64 i = 0; i < 1024; i++) { @@ -151,9 +159,9 @@ void SNES::update_timing() { } } -/*************************** - *** Debugging functions *** - ***************************/ +/***** + * Debugging functions + *****/ void SNES::notify(uint32 message, uint32 param1, uint32 param2) {} diff --git a/src/ui/Makefile b/src/ui/Makefile new file mode 100644 index 00000000..906ed8cb --- /dev/null +++ b/src/ui/Makefile @@ -0,0 +1,198 @@ +ifeq ($(PLATFORM),win-visualc) +CC = cl +CXX = cl +AS = nasm +RM = del +OBJ = obj +CFLAGS = /nologo /O2 /arch:SSE2 /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 +COMPILE = $(CC) $(CFLAGS) /c +ASSEMBLE = $(AS) -f win32 +LINK = +LIBS = kernel32.lib user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib \ + d3d9.lib d3dx9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib +endif + +ifeq ($(PLATFORM),win-visualc-wip) +CC = cl +CXX = cl +AS = nasm +RM = del +OBJ = obj +CFLAGS = /nologo /O2 /GL /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 +COMPILE = $(CC) $(CFLAGS) /c +ASSEMBLE = $(AS) -f win32 +LINK = /link /LTCG +LIBS = kernel32.lib user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib \ + d3d9.lib d3dx9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib +endif + +ifeq ($(PLATFORM),win-visualc-pgi) +CC = cl +CXX = cl +AS = nasm +RM = del +OBJ = obj +CFLAGS = /nologo /O2 /GL /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 +COMPILE = $(CC) $(CFLAGS) /c +ASSEMBLE = $(AS) -f win32 +LINK = /link /PGD:bsnes.pgd /LTCG:PGINSTRUMENT +LIBS = kernel32.lib user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib \ + d3d9.lib d3dx9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib +endif + +ifeq ($(PLATFORM),win-visualc-pgo) +CC = cl +CXX = cl +AS = nasm +RM = del +OBJ = obj +CFLAGS = /nologo /O2 /arch:SSE2 /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 +COMPILE = $(CC) $(CFLAGS) /c +ASSEMBLE = $(AS) -f win32 +LINK = /link /PGD:bsnes.pgd /LTCG:PGOPTIMIZE +LIBS = kernel32.lib user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib \ + d3d9.lib d3dx9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib +endif + +OBJS = main.$(OBJ) \ + libco.$(OBJ) libstring.$(OBJ) libconfig.$(OBJ) \ + reader.$(OBJ) cart.$(OBJ) cheat.$(OBJ) \ + memory.$(OBJ) bmemory.$(OBJ) \ + cpu.$(OBJ) scpu.$(OBJ) bcpu.$(OBJ) \ + apu.$(OBJ) sapu.$(OBJ) bapu.$(OBJ) \ + bdsp.$(OBJ) \ + ppu.$(OBJ) bppu.$(OBJ) \ + snes.$(OBJ) \ + srtc.$(OBJ) sdd1.$(OBJ) c4.$(OBJ) dsp1.$(OBJ) dsp2.$(OBJ) obc1.$(OBJ) +# adler32.$(OBJ) compress.$(OBJ) crc32.$(OBJ) deflate.$(OBJ) gzio.$(OBJ) inffast.$(OBJ) \ +# inflate.$(OBJ) inftrees.$(OBJ) ioapi.$(OBJ) trees.$(OBJ) unzip.$(OBJ) zip.$(OBJ) zutil.$(OBJ) \ +# jma.$(OBJ) jcrc32.$(OBJ) lzmadec.$(OBJ) 7zlzma.$(OBJ) iiostrm.$(OBJ) inbyte.$(OBJ) lzma.$(OBJ) winout.$(OBJ) + +all: $(OBJS) + rc /r /fobsnes.res bsnes.rc + $(CC) /Febsnes.exe $(CFLAGS) $(OBJS) bsnes.res $(LIBS) $(LINK) + +clean: + $(RM) *.$(OBJ) + $(RM) *.res + $(RM) *.pgd + $(RM) *.pgc + $(RM) *.ilk + $(RM) *.pdb + +######################### +### platform-specific ### +######################### +main.$(OBJ): *.cpp *.h video/* audio/* input/* ../config/* win/* win/settings/* win/debugger/* + $(COMPILE) main.cpp + +################# +### libraries ### +################# +libco.$(OBJ): ../lib/* + $(ASSEMBLE) -o libco.$(OBJ) ../lib/libco_x86.asm + +libstring.$(OBJ): ../lib/*.cpp ../lib/*.h + $(COMPILE) ../lib/libstring.cpp + +libconfig.$(OBJ): ../lib/*.cpp ../lib/*.h + $(COMPILE) ../lib/libconfig.cpp + +############## +### memory ### +############## +memory.$(OBJ): ../memory/memory.cpp ../memory/memory.h + $(COMPILE) ../memory/memory.cpp + +bmemory.$(OBJ): ../memory/bmemory/* ../memory/bmemory/mapper/* + $(COMPILE) ../memory/bmemory/bmemory.cpp + +########### +### cpu ### +########### +cpu.$(OBJ): ../cpu/* + $(COMPILE) ../cpu/cpu.cpp + +scpu.$(OBJ): ../cpu/scpu/* ../cpu/scpu/core/* ../cpu/scpu/dma/* ../cpu/scpu/memory/* ../cpu/scpu/mmio/* ../cpu/scpu/timing/* + $(COMPILE) ../cpu/scpu/scpu.cpp + +bcpu.$(OBJ): ../cpu/bcpu/* + $(COMPILE) ../cpu/bcpu/bcpu.cpp + +########### +### apu ### +########### +apu.$(OBJ): ../apu/* + $(COMPILE) ../apu/apu.cpp + +sapu.$(OBJ): ../apu/sapu/* ../apu/sapu/core/* ../apu/sapu/memory/* ../apu/sapu/timing/* + $(COMPILE) ../apu/sapu/sapu.cpp + +bapu.$(OBJ): ../apu/bapu/* + $(COMPILE) ../apu/bapu/bapu.cpp + +########### +### dsp ### +########### +bdsp.$(OBJ): ../dsp/bdsp/* + $(COMPILE) ../dsp/bdsp/bdsp.cpp + +########### +### ppu ### +########### +ppu.$(OBJ): ../ppu/*.cpp ../ppu/*.h + $(COMPILE) ../ppu/ppu.cpp + +bppu.$(OBJ): ../ppu/bppu/* + $(COMPILE) ../ppu/bppu/bppu.cpp + +################# +### utilities ### +################# +reader.$(OBJ): ../reader/*.cpp ../reader/*.h + $(COMPILE) ../reader/reader.cpp + +cart.$(OBJ): ../cart/*.cpp ../cart/*.h + $(COMPILE) ../cart/cart.cpp + +cheat.$(OBJ): ../cheat/*.cpp ../cheat/*.h + $(COMPILE) ../cheat/cheat.cpp + +############ +### snes ### +############ +snes.$(OBJ): ../snes/* ../snes/video/* ../snes/audio/* ../snes/input/* + $(COMPILE) ../snes/snes.cpp + +##################### +### special chips ### +##################### +srtc.$(OBJ): ../chip/srtc/* + $(COMPILE) ../chip/srtc/srtc.cpp + +sdd1.$(OBJ): ../chip/sdd1/* + $(COMPILE) ../chip/sdd1/sdd1.cpp + +c4.$(OBJ): ../chip/c4/* + $(COMPILE) ../chip/c4/c4.cpp + +dsp1.$(OBJ): ../chip/dsp1/* + $(COMPILE) ../chip/dsp1/dsp1.cpp + +dsp2.$(OBJ): ../chip/dsp2/* + $(COMPILE) ../chip/dsp2/dsp2.cpp + +obc1.$(OBJ): ../chip/obc1/* + $(COMPILE) ../chip/obc1/obc1.cpp + +############ +### zlib ### +############ +adler32.$(OBJ): ../reader/zlib/*.c ../reader/zlib/*.h + $(COMPILE) ../reader/zlib/*.c + +########### +### jma ### +########### +jma.$(OBJ): ../reader/jma/*.cpp ../reader/jma/*.h + $(COMPILE) ../reader/jma/*.cpp diff --git a/src/win/audio/audio.h b/src/ui/audio/audio.h similarity index 63% rename from src/win/audio/audio.h rename to src/ui/audio/audio.h index 3d0b0d55..7089e2df 100644 --- a/src/win/audio/audio.h +++ b/src/ui/audio/audio.h @@ -1,13 +1,11 @@ class Audio { public: -uint32 frequency; +uint frequency; virtual void run(uint32 sample) = 0; - virtual void set_frequency(uint32 new_freq) = 0; + virtual void set_frequency(uint new_freq) = 0; virtual void clear_audio() = 0; virtual void init() = 0; virtual void term() = 0; Audio() { frequency = 32000; } -}; - -#include "dsound.h" +} *uiAudio; diff --git a/src/win/audio/dsound.cpp b/src/ui/audio/dsound.cpp similarity index 91% rename from src/win/audio/dsound.cpp rename to src/ui/audio/dsound.cpp index 9af01646..9f4759ef 100644 --- a/src/win/audio/dsound.cpp +++ b/src/ui/audio/dsound.cpp @@ -5,10 +5,12 @@ void AudioDS::run(uint32 sample) { uint32 pos, size; void *buffer; if(bool(config::system.regulate_speed) == true) { - do { + for(;;) { dsb_b->GetCurrentPosition(&pos, 0); data.read_buffer = pos / data.buffer_size; - } while(data.read_buffer == data.prev_buffer); + if(data.read_buffer != data.prev_buffer)break; + Sleep(1); + } } data.prev_buffer = data.read_buffer; @@ -27,7 +29,7 @@ void AudioDS::run(uint32 sample) { } } -void AudioDS::set_frequency(uint32 new_freq) { +void AudioDS::set_frequency(uint new_freq) { frequency = new_freq; init(); } diff --git a/src/win/audio/dsound.h b/src/ui/audio/dsound.h similarity index 84% rename from src/win/audio/dsound.h rename to src/ui/audio/dsound.h index aaf20d8e..4618e395 100644 --- a/src/win/audio/dsound.h +++ b/src/ui/audio/dsound.h @@ -6,7 +6,7 @@ LPDIRECTSOUND ds; LPDIRECTSOUNDBUFFER dsb_p, dsb_b; DSBUFFERDESC dsbd; WAVEFORMATEX wfx; -uint32 buffer_size; +uint buffer_size; struct { uint32 buffer[16384]; @@ -16,7 +16,7 @@ struct { uint32 samples_per_frame; } data; void run(uint32 sample); - void set_frequency(uint32 new_freq); + void set_frequency(uint new_freq); void clear_audio(); void init(); void term(); diff --git a/src/win/bsnes.cpp b/src/ui/bsnes.cpp similarity index 100% rename from src/win/bsnes.cpp rename to src/ui/bsnes.cpp diff --git a/src/win/bsnes.h b/src/ui/bsnes.h similarity index 100% rename from src/win/bsnes.h rename to src/ui/bsnes.h diff --git a/src/win/bsnes.lnk b/src/ui/bsnes.lnk similarity index 100% rename from src/win/bsnes.lnk rename to src/ui/bsnes.lnk diff --git a/src/win/bsnes.rc b/src/ui/bsnes.rc similarity index 100% rename from src/win/bsnes.rc rename to src/ui/bsnes.rc diff --git a/src/win/cc.bat b/src/ui/cc.bat similarity index 50% rename from src/win/cc.bat rename to src/ui/cc.bat index ec67d554..2dcd14b0 100644 --- a/src/win/cc.bat +++ b/src/ui/cc.bat @@ -1,3 +1,3 @@ -@nmake /NOLOGO +@make PLATFORM=win-visualc @move bsnes.exe ../../bsnes.exe>nul @pause \ No newline at end of file diff --git a/src/ui/clean.bat b/src/ui/clean.bat new file mode 100644 index 00000000..c63abd8d --- /dev/null +++ b/src/ui/clean.bat @@ -0,0 +1 @@ +@make PLATFORM=win-visualc clean diff --git a/src/win/config.cpp b/src/ui/config.cpp similarity index 87% rename from src/win/config.cpp rename to src/ui/config.cpp index 57aefb4b..34e49f95 100644 --- a/src/win/config.cpp +++ b/src/ui/config.cpp @@ -135,28 +135,4 @@ Setting Input::Joypad2::map(&config_file, "input.joypad2.map", "Joypad 2 button "k | joy1.button4; j | joy1.button3; i | joy1.button1; u | joy1.button0; " "o | joy1.button6; l | joy1.button7; lbracket | joy1.button2; rbracket | joy1.button5"); -// - -struct Debugger { - static Setting console_lines; -} debugger; -Setting Debugger::console_lines(&config_file, "debugger.console_lines", "Number of lines buffered for debugger console", - 100, Setting::DEC); - -struct Misc { - static Setting image_format; - static Setting window_style; - static Setting show_fps; - static Setting config_window_alpha_level; -} misc; -Setting Misc::image_format(&config_file, "misc.image_format", "Image format for screenshots\n" - "Valid formats: \"bmp\", \"png\", \"jpg\"", "png"); -Setting Misc::window_style(&config_file, "misc.window_style", "Window style for main emulation window", - "titlebar|frame|minimize|dragmove"); -Setting Misc::show_fps(&config_file, "misc.show_fps", "Show framerate", true, Setting::TRUE_FALSE); -Setting Misc::config_window_alpha_level(&config_file, "misc.config_window_alpha_level", - "Alpha level (opacity) of configuration window\n" - "Value must be between 64 (25% opaque, 75% transparent) and 255 (100% opaque)", - 255, Setting::DEC); - }; diff --git a/src/win/input/dinput.cpp b/src/ui/input/dinput.cpp similarity index 100% rename from src/win/input/dinput.cpp rename to src/ui/input/dinput.cpp diff --git a/src/win/input/dinput.h b/src/ui/input/dinput.h similarity index 100% rename from src/win/input/dinput.h rename to src/ui/input/dinput.h diff --git a/src/win/input/dinput_keymap.cpp b/src/ui/input/dinput_keymap.cpp similarity index 100% rename from src/win/input/dinput_keymap.cpp rename to src/ui/input/dinput_keymap.cpp diff --git a/src/win/input/input.cpp b/src/ui/input/input.cpp similarity index 100% rename from src/win/input/input.cpp rename to src/ui/input/input.cpp diff --git a/src/win/input/input.h b/src/ui/input/input.h similarity index 94% rename from src/win/input/input.h rename to src/ui/input/input.h index 46516f7a..7f1ff840 100644 --- a/src/win/input/input.h +++ b/src/ui/input/input.h @@ -80,6 +80,4 @@ enum { void set_keymap(uint device, uint button, uint keymap); Input(); -}; - -#include "dinput.h" +} *uiInput; diff --git a/src/ui/main.cpp b/src/ui/main.cpp new file mode 100644 index 00000000..e7e70ef5 --- /dev/null +++ b/src/ui/main.cpp @@ -0,0 +1,66 @@ +#define INTERFACE_MAIN + +#include "../base.h" +#include "config.cpp" + +void init_snes(); +void term_snes(); + +/***** + * OS abstraction layer + *****/ + +//#include "video/video.h" +//#include "audio/audio.h" +//#include "input/input.h" + +//#include "video/video.cpp" +//#include "input/input.cpp" + +/***** + * emulation abstraction layer + *****/ + +#include "bsnes.h" + +/***** + * platform abstraction layer + *****/ + +#ifdef PLATFORM_WIN + #include "win/main.cpp" +#else + #error "unsupported platform" +#endif + +#include "bsnes.cpp" + +/***** + * platform independent code + *****/ + +void init_snes() { +#ifdef POLYMORPHISM + deref(mem) = new MEMCORE(); + deref(cpu) = new CPUCORE(); + deref(apu) = new APUCORE(); + deref(dsp) = new DSPCORE(); + deref(ppu) = new PPUCORE(); +#endif + snes = new bSNES(); + bsnes = static_cast(snes); + + snes->init(); +} + +void term_snes() { + snes->term(); +#ifdef POLYMORPHISM + SafeDelete(deref(mem)); + SafeDelete(deref(cpu)); + SafeDelete(deref(apu)); + SafeDelete(deref(dsp)); + SafeDelete(deref(ppu)); +#endif + SafeDelete(snes); +} diff --git a/src/win/video/d3d.cpp b/src/ui/video/d3d.cpp similarity index 100% rename from src/win/video/d3d.cpp rename to src/ui/video/d3d.cpp diff --git a/src/win/video/d3d.h b/src/ui/video/d3d.h similarity index 100% rename from src/win/video/d3d.h rename to src/ui/video/d3d.h diff --git a/src/win/video/ddraw.cpp b/src/ui/video/ddraw.cpp similarity index 100% rename from src/win/video/ddraw.cpp rename to src/ui/video/ddraw.cpp diff --git a/src/win/video/ddraw.h b/src/ui/video/ddraw.h similarity index 100% rename from src/win/video/ddraw.h rename to src/ui/video/ddraw.h diff --git a/src/win/video/video.cpp b/src/ui/video/video.cpp similarity index 100% rename from src/win/video/video.cpp rename to src/ui/video/video.cpp diff --git a/src/win/video/video.h b/src/ui/video/video.h similarity index 92% rename from src/win/video/video.h rename to src/ui/video/video.h index 6a127ea5..dffc5def 100644 --- a/src/win/video/video.h +++ b/src/ui/video/video.h @@ -62,7 +62,4 @@ struct { virtual void update() = 0; virtual void init() = 0; virtual void term() = 0; -}; - -#include "d3d.h" -#include "ddraw.h" +} *uiVideo; diff --git a/src/ui/win/config.cpp b/src/ui/win/config.cpp new file mode 100644 index 00000000..f34fc744 --- /dev/null +++ b/src/ui/win/config.cpp @@ -0,0 +1,25 @@ +namespace config { + +struct Debugger { + static Setting console_lines; +} debugger; +Setting Debugger::console_lines(&config_file, "debugger.console_lines", "Number of lines buffered for debugger console", + 100, Setting::DEC); + +struct Misc { + static Setting image_format; + static Setting window_style; + static Setting show_fps; + static Setting config_window_alpha_level; +} misc; +Setting Misc::image_format(&config_file, "misc.image_format", "Image format for screenshots\n" + "Valid formats: \"bmp\", \"png\", \"jpg\"", "png"); +Setting Misc::window_style(&config_file, "misc.window_style", "Window style for main emulation window", + "titlebar|frame|minimize|dragmove"); +Setting Misc::show_fps(&config_file, "misc.show_fps", "Show framerate", true, Setting::TRUE_FALSE); +Setting Misc::config_window_alpha_level(&config_file, "misc.config_window_alpha_level", + "Alpha level (opacity) of configuration window\n" + "Value must be between 64 (25% opaque, 75% transparent) and 255 (100% opaque)", + 255, Setting::DEC); + +}; diff --git a/src/win/debugger/debugger.cpp b/src/ui/win/debugger/debugger.cpp similarity index 100% rename from src/win/debugger/debugger.cpp rename to src/ui/win/debugger/debugger.cpp diff --git a/src/win/debugger/debugger.h b/src/ui/win/debugger/debugger.h similarity index 100% rename from src/win/debugger/debugger.h rename to src/ui/win/debugger/debugger.h diff --git a/src/win/debugger/ui_debugger.cpp b/src/ui/win/debugger/ui_debugger.cpp similarity index 100% rename from src/win/debugger/ui_debugger.cpp rename to src/ui/win/debugger/ui_debugger.cpp diff --git a/src/win/debugger/ui_debugger.h b/src/ui/win/debugger/ui_debugger.h similarity index 100% rename from src/win/debugger/ui_debugger.h rename to src/ui/win/debugger/ui_debugger.h diff --git a/src/win/debugger/ui_memory.cpp b/src/ui/win/debugger/ui_memory.cpp similarity index 100% rename from src/win/debugger/ui_memory.cpp rename to src/ui/win/debugger/ui_memory.cpp diff --git a/src/win/debugger/ui_memory.h b/src/ui/win/debugger/ui_memory.h similarity index 100% rename from src/win/debugger/ui_memory.h rename to src/ui/win/debugger/ui_memory.h diff --git a/src/win/event.cpp b/src/ui/win/event.cpp similarity index 100% rename from src/win/event.cpp rename to src/ui/win/event.cpp diff --git a/src/win/event.h b/src/ui/win/event.h similarity index 100% rename from src/win/event.h rename to src/ui/win/event.h diff --git a/src/win/main.cpp b/src/ui/win/main.cpp similarity index 69% rename from src/win/main.cpp rename to src/ui/win/main.cpp index c1907460..ed5bdc05 100644 --- a/src/win/main.cpp +++ b/src/ui/win/main.cpp @@ -1,16 +1,28 @@ -#define INTERFACE_MAIN - -#include "../base.h" -#include "../lib/libwin32.h" -#include "../lib/libwin32.cpp" +#include "../../lib/libwin32.h" +#include "../../lib/libwin32.cpp" #include "config.cpp" -#include "bsnes.h" #include "event.h" #include "ui.h" -#include "bsnes.cpp" +#include "../video/video.h" +#include "../audio/audio.h" +#include "../input/input.h" + +#include "../video/video.cpp" +#include "../input/input.cpp" + +#include "../video/d3d.h" +#include "../video/ddraw.h" +#include "../audio/dsound.h" +#include "../input/dinput.h" + +#include "../video/d3d.cpp" +#include "../video/ddraw.cpp" +#include "../audio/dsound.cpp" +#include "../input/dinput.cpp" + #include "event.cpp" #include "ui.cpp" @@ -40,32 +52,6 @@ va_list args; #endif } -void init_snes() { -#ifdef POLYMORPHISM - deref(mem) = new MEMCORE(); - deref(cpu) = new CPUCORE(); - deref(apu) = new APUCORE(); - deref(dsp) = new DSPCORE(); - deref(ppu) = new PPUCORE(); -#endif - snes = new bSNES(); - bsnes = static_cast(snes); - - snes->init(); -} - -void term_snes() { - snes->term(); -#ifdef POLYMORPHISM - SafeDelete(deref(mem)); - SafeDelete(deref(cpu)); - SafeDelete(deref(apu)); - SafeDelete(deref(dsp)); - SafeDelete(deref(ppu)); -#endif - SafeDelete(snes); -} - void get_base_path() { char full_name[4095]; GetFullPathName(__argv[0], 4095, full_name, 0); @@ -88,6 +74,7 @@ string t; } int __stdcall WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { + timeBeginPeriod(1); InitCommonControls(); get_base_path(); @@ -121,5 +108,6 @@ _end: term_ui(); term_snes(); config_file.save(cfg_fn); + timeEndPeriod(1); return 0; } diff --git a/src/win/settings/settings.cpp b/src/ui/win/settings/settings.cpp similarity index 100% rename from src/win/settings/settings.cpp rename to src/ui/win/settings/settings.cpp diff --git a/src/win/settings/settings.h b/src/ui/win/settings/settings.h similarity index 100% rename from src/win/settings/settings.h rename to src/ui/win/settings/settings.h diff --git a/src/win/settings/ui_cheateditor.cpp b/src/ui/win/settings/ui_cheateditor.cpp similarity index 100% rename from src/win/settings/ui_cheateditor.cpp rename to src/ui/win/settings/ui_cheateditor.cpp diff --git a/src/win/settings/ui_cheateditor.h b/src/ui/win/settings/ui_cheateditor.h similarity index 100% rename from src/win/settings/ui_cheateditor.h rename to src/ui/win/settings/ui_cheateditor.h diff --git a/src/win/settings/ui_coloradjust.cpp b/src/ui/win/settings/ui_coloradjust.cpp similarity index 100% rename from src/win/settings/ui_coloradjust.cpp rename to src/ui/win/settings/ui_coloradjust.cpp diff --git a/src/win/settings/ui_coloradjust.h b/src/ui/win/settings/ui_coloradjust.h similarity index 100% rename from src/win/settings/ui_coloradjust.h rename to src/ui/win/settings/ui_coloradjust.h diff --git a/src/win/settings/ui_inputconfig.cpp b/src/ui/win/settings/ui_inputconfig.cpp similarity index 100% rename from src/win/settings/ui_inputconfig.cpp rename to src/ui/win/settings/ui_inputconfig.cpp diff --git a/src/win/settings/ui_inputconfig.h b/src/ui/win/settings/ui_inputconfig.h similarity index 100% rename from src/win/settings/ui_inputconfig.h rename to src/ui/win/settings/ui_inputconfig.h diff --git a/src/win/settings/ui_rastersettings.cpp b/src/ui/win/settings/ui_rastersettings.cpp similarity index 100% rename from src/win/settings/ui_rastersettings.cpp rename to src/ui/win/settings/ui_rastersettings.cpp diff --git a/src/win/settings/ui_rastersettings.h b/src/ui/win/settings/ui_rastersettings.h similarity index 100% rename from src/win/settings/ui_rastersettings.h rename to src/ui/win/settings/ui_rastersettings.h diff --git a/src/win/settings/ui_settings.cpp b/src/ui/win/settings/ui_settings.cpp similarity index 100% rename from src/win/settings/ui_settings.cpp rename to src/ui/win/settings/ui_settings.cpp diff --git a/src/win/settings/ui_settings.h b/src/ui/win/settings/ui_settings.h similarity index 100% rename from src/win/settings/ui_settings.h rename to src/ui/win/settings/ui_settings.h diff --git a/src/win/settings/ui_videosettings.cpp b/src/ui/win/settings/ui_videosettings.cpp similarity index 100% rename from src/win/settings/ui_videosettings.cpp rename to src/ui/win/settings/ui_videosettings.cpp diff --git a/src/win/settings/ui_videosettings.h b/src/ui/win/settings/ui_videosettings.h similarity index 100% rename from src/win/settings/ui_videosettings.h rename to src/ui/win/settings/ui_videosettings.h diff --git a/src/win/ui.cpp b/src/ui/win/ui.cpp similarity index 88% rename from src/win/ui.cpp rename to src/ui/win/ui.cpp index 179d54de..1afad2b7 100644 --- a/src/win/ui.cpp +++ b/src/ui/win/ui.cpp @@ -1,10 +1,3 @@ -#include "video/video.cpp" -#include "video/d3d.cpp" -#include "video/ddraw.cpp" -#include "audio/dsound.cpp" -#include "input/input.cpp" -#include "input/dinput.cpp" - #include "ui_main.cpp" #include "ui_about.cpp" #include "settings/settings.cpp" diff --git a/src/win/ui.h b/src/ui/win/ui.h similarity index 90% rename from src/win/ui.h rename to src/ui/win/ui.h index 6fdec92a..cd5b67d3 100644 --- a/src/win/ui.h +++ b/src/ui/win/ui.h @@ -1,12 +1,5 @@ #define KeyDown(__key) ((GetAsyncKeyState(__key) & 0x8000) ? 1 : 0) -#include "video/video.h" -#include "audio/audio.h" -#include "input/input.h" -Video *uiVideo; -Audio *uiAudio; -Input *uiInput; - namespace global { Font vwf, fwf, font_about, font_header, font_list; }; diff --git a/src/win/ui_about.cpp b/src/ui/win/ui_about.cpp similarity index 100% rename from src/win/ui_about.cpp rename to src/ui/win/ui_about.cpp diff --git a/src/win/ui_main.cpp b/src/ui/win/ui_main.cpp similarity index 100% rename from src/win/ui_main.cpp rename to src/ui/win/ui_main.cpp diff --git a/src/win/Makefile b/src/win/Makefile deleted file mode 100644 index c4e56da1..00000000 --- a/src/win/Makefile +++ /dev/null @@ -1,157 +0,0 @@ -CC = cl -AS = nasm -CFLAGS = /nologo /O2 /arch:SSE2 -#CFLAGS = /nologo /O2 /GL /arch:SSE2 -#CFLAGS = /nologo /O2 /GL /EHsc -COMPILE = $(CC) $(CFLAGS) /c -ASSEMBLE = $(AS) -f win32 - -OBJS = main.obj \ - libco.obj libstring.obj libconfig.obj libbpf.obj \ - reader.obj cart.obj cheat.obj \ - memory.obj bmemory.obj \ - cpu.obj scpu.obj bcpu.obj \ - apu.obj sapu.obj bapu.obj \ - bdsp.obj \ - ppu.obj bppu.obj \ - snes.obj \ - srtc.obj sdd1.obj c4.obj dsp1.obj dsp2.obj obc1.obj -# adler32.obj compress.obj crc32.obj deflate.obj gzio.obj inffast.obj \ -# inflate.obj inftrees.obj ioapi.obj trees.obj unzip.obj zip.obj zutil.obj \ -# jma.obj jcrc32.obj lzmadec.obj 7zlzma.obj iiostrm.obj inbyte.obj lzma.obj winout.obj -LIBS = kernel32.lib user32.lib gdi32.lib comdlg32.lib comctl32.lib \ - d3d9.lib d3dx9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib - -all: $(OBJS) - rc /r /fobsnes.res bsnes.rc - $(CC) /Febsnes.exe $(CFLAGS) $(OBJS) bsnes.res $(LIBS) -# $(CC) /Febsnes.exe $(CFLAGS) $(OBJS) bsnes.res $(LIBS) /link /PGD:bsnes.pgd /LTCG:PGINSTRUMENT -# $(CC) /Febsnes.exe $(CFLAGS) $(OBJS) bsnes.res $(LIBS) /link /PGD:bsnes.pgd /LTCG:PGOPTIMIZE - -clean: - del *.obj - del *.res - del *.pgd - del *.pgc - del *.ilk - del *.pdb - -###################### -### win32-specific ### -###################### -main.obj: *.cpp *.h video/* audio/* input/* settings/* debugger/* ../config/* - $(COMPILE) main.cpp - -################# -### libraries ### -################# -libco.obj: ../lib/* - $(ASSEMBLE) -o libco.obj ../lib/libco_x86.asm - -libstring.obj: ../lib/*.cpp ../lib/*.h - $(COMPILE) ../lib/libstring.cpp - -libconfig.obj: ../lib/*.cpp ../lib/*.h - $(COMPILE) ../lib/libconfig.cpp - -libbpf.obj: ../lib/*.cpp ../lib/*.h - $(COMPILE) ../lib/libbpf.cpp - -############## -### memory ### -############## -memory.obj: ../memory/memory.cpp ../memory/memory.h - $(COMPILE) ../memory/memory.cpp - -bmemory.obj: ../memory/bmemory/* - $(COMPILE) ../memory/bmemory/bmemory.cpp - -########### -### cpu ### -########### -cpu.obj: ../cpu/* - $(COMPILE) ../cpu/cpu.cpp - -scpu.obj: ../cpu/scpu/* ../cpu/scpu/core/* ../cpu/scpu/dma/* ../cpu/scpu/memory/* ../cpu/scpu/mmio/* ../cpu/scpu/timing/* - $(COMPILE) ../cpu/scpu/scpu.cpp - -bcpu.obj: ../cpu/bcpu/* - $(COMPILE) ../cpu/bcpu/bcpu.cpp - -########### -### apu ### -########### -apu.obj: ../apu/* - $(COMPILE) ../apu/apu.cpp - -sapu.obj: ../apu/sapu/* ../apu/sapu/core/* ../apu/sapu/memory/* ../apu/sapu/timing/* - $(COMPILE) ../apu/sapu/sapu.cpp - -bapu.obj: ../apu/bapu/* - $(COMPILE) ../apu/bapu/bapu.cpp - -########### -### dsp ### -########### -bdsp.obj: ../dsp/bdsp/* - $(COMPILE) ../dsp/bdsp/bdsp.cpp - -########### -### ppu ### -########### -ppu.obj: ../ppu/*.cpp ../ppu/*.h - $(COMPILE) ../ppu/ppu.cpp - -bppu.obj: ../ppu/bppu/* - $(COMPILE) ../ppu/bppu/bppu.cpp - -################# -### utilities ### -################# -reader.obj: ../reader/*.cpp ../reader/*.h - $(COMPILE) ../reader/reader.cpp - -cart.obj: ../cart/*.cpp ../cart/*.h - $(COMPILE) ../cart/cart.cpp - -cheat.obj: ../cheat/*.cpp ../cheat/*.h - $(COMPILE) ../cheat/cheat.cpp - -############ -### snes ### -############ -snes.obj: ../snes/* ../snes/video/* ../snes/audio/* ../snes/input/* - $(COMPILE) ../snes/snes.cpp - -##################### -### special chips ### -##################### -srtc.obj: ../chip/srtc/* - $(COMPILE) ../chip/srtc/srtc.cpp - -sdd1.obj: ../chip/sdd1/* - $(COMPILE) ../chip/sdd1/sdd1.cpp - -c4.obj: ../chip/c4/* - $(COMPILE) ../chip/c4/c4.cpp - -dsp1.obj: ../chip/dsp1/* - $(COMPILE) ../chip/dsp1/dsp1.cpp - -dsp2.obj: ../chip/dsp2/* - $(COMPILE) ../chip/dsp2/dsp2.cpp - -obc1.obj: ../chip/obc1/* - $(COMPILE) ../chip/obc1/obc1.cpp - -############ -### zlib ### -############ -adler32.obj: ../reader/zlib/*.c ../reader/zlib/*.h - $(COMPILE) ../reader/zlib/*.c - -########### -### jma ### -########### -jma.obj: ../reader/jma/*.cpp ../reader/jma/*.h - $(COMPILE) ../reader/jma/*.cpp diff --git a/src/win/clean.bat b/src/win/clean.bat deleted file mode 100644 index e0f3d11c..00000000 --- a/src/win/clean.bat +++ /dev/null @@ -1 +0,0 @@ -@nmake clean /NOLOGO
  • 2j^^dW(DBZTY>%C*F3oaj7k2T-$%G(kp%v_ugT7~jn{ziBGG)Js!Vq#1q5}d(` zrR}GUPRMJk@i(@8SUE9~MfU2C+r1l$bMNMFQB$oiWqX(Z8_eZ)gp<9}a@uPzAA^X+ zyZku{k4D(+UH%e{BJ}ZY{vEen}&P4h$jl2Ao`f(m^9qH> zB8<$C+o`-4&&;z3dn^Bm|HuqwB8t%VC^GOguIF*RitBA$?`rQ>BV$xW&wry;(aR*5 zSJCqI6jp0!HHFn0dY-~+4gHJ4Y7J3C)@tY(guRvP@V`S1seq&+=cuBWEZT!wN#GT{ z^m{3MDKC8s!lLK!e<;(Wjt>#{R_?)ndKgsE_5rR>)LMtUE0GShNsc5|gC^*ojzyFY z;sSS3Sk>)LguRtJ@SlY3!1X1s)@b0}D4pH`IWRDKH@|#3!cggcgdMqWB70vUG zwF~M=rZLEI<(meW{)#IRmddA+Xy>K@hzMSJ6mDMERroKu%h8nGt&Vu*66~W-yM;QW z9e9=YXp?IQa6^;p61sWi6x>*7q5-#}1S&evpecM(g14~OZB6kuR zkrN+71S;09$i`jt^Z>1{8>7expcuzlO&JZM%L2Mzrs6tJ7(@>xEfQWDM+S3oIir}^MdpJN2>K|$=0 zWc2VpTOpKRxb`&S8L>+#(zC?JsOy$Wh)!!zZX>})>hJN0$)zH?^V*5_ayRiQn+{dbpz@4L^A%{ zeNRx0*nO3~aTDF|U>)XtA`#&Y+4RK;69xyl$3pT}^^(UXVvsh44zB3`!-Y6Gf8>`~ ze4kGL>Z2)i7+Hb4+Tv*ytDgM=jzBt;fnlEB*|zLeZr&RtpSmTr(O93lt2ixW+(GY0 zgDVAZXIsIUD2FOf378Iw?*2&cIq<-R@<(FrrFMDPzwN#hS3SNL76X@6dD}I3PO@<_ zzF;@bYNb{9$+=AsL=LENr6s<^8NOcAwx*N&ofNj^BFGeqMfVNJ^NP0MmCW%65P#tU z2%&=%$0~Z$72#EMe)t1%6}|;W!G>~ z$%}lHNbprpK}2cGjG?`csAs3u^Dpo1-o5JU{l+WuZkB&^ebesxG1>LtWSn;r-PBpa zW0x}-Uz1o);|m>k;hHtb+15ajsUXzCD+)8jIrPtmMNJS9JT?(al*g2xmuk z09o9+bA5 zeXUygVY`vOMGi{i1~2CP>KCh(^?!u$naA>n*V6Z@@d>eGIM9hYEc*t5d?jWl)w{)+ zMHxY_@&oPS_Mvay2I8&s?L_)AYVans2B@%40wPj#ER~1;f|rBNY9L?Dxad9!y7JTM zP)MwaU53y9%01}2+6@PLI=4)R4u!y@W_nrDw=xqk(KDb3+e)-I=-e`cU|&@>qg#l6 z5VDGWRpUUB<7C^gz?P}mF%rJ>wudHyzN%5g>h^+5UP(-qCyydrc(b_Vi<{xXT76%b zCNB8|6u5ih>EZHqh1_K2O9QJXgQ+mEI+t!`2ayx@S?yvyNFU@Ff$!N+hVg+Li85GV zlgA5zm7}uh^N209eKCS|FJ??DWm_2(9$D|Lq7r+ns9?8r?77&6K>C<#MbA2Tdm49( zwO%TSSmX5IMol9y?{n&?8;s0-o>uR_!)hw_S4qTX_p$f2;UU9JAIliAwq1DzAsQ@p z&`tz$WTARO-t1z{cEs$y>fcFnvw_jmcKDT2dsjwd+jSy7w~dbiC;Clh7RLi$@F77l z#v`--yql%)12fbI-tzzNfg4fRg4<>-zuGl3@vMDsnN_UKwH|K}oake&7>UtW^xW}f ztWY_VP1WtL1y;df87a}Q+!IO8GiNDivq^Er6y4w0l25FwjCn0HL#K@kpS9Glf&F^B97&PV{H;c8eu!kI(;Yfq8_;LuQZ$i1Ynuz;h zaD%P8mX$q@eqcJU1YA~dl{VUaD~P@ALy%TzBql*;X?9VLV+4D%i}D;N1apwn+J;CLX;+Qpl2 z+&kt9`t%}ZiJuegO+yE&rbw|S*E%9M-k%#^AM66X_p6*K@rB!hctL!$A#4hjxqONC zJu?N}21r0M6Mz-#MPyXv$*Ms)H4#|(k^L}}!aVK^O%{EdMXb$-S&p%!Zv7Y8r6cuC z3EPW~OVuTz9Rt=SBU`ZvWu=9qr+(2zY<-zb>rR?Oexxom+de^A_tOfq?Q?u;_zQ## ztV;;Df>G28TFR{cTr0Ag%I*IFbOGV)T3Lyu9p$kst1Q#h1a`slKMEIFZ$x%quBH59 zR^~x^BeJOV79j+MKA;u)OFSQST|S&;XC`HbSN%n*2+4_d$f`cF-jEqX+g?q`7vbC> zkbf*E(Oev;NEAK)fcN287lUI~+77X%$ST(4#HVgeZ4jS;A|1Id(eRQ}e2kPjrgDfx zZKozLo*2{irft7?ue)_Y`p6v;;Hz9i-b0&X`tRx*a>knzUwTWUON>ziL(aC?%j4d*J|&Yi{C)Vjc*8w@RK+a)vB<&G%Hj4EVUNfzKbwa=RzxvV`Dc~ z^eivL_>0-&U?G$(WYHJ)MfZI~!wc<|hnyfv_$7nui9A(f4H0Yiu|yjOT2?#@jz-X# zML!rq-!e*oTc-eG_BH%qmQ9bP4=50dHzW@r*B~a%sAPC_F|&*>=t0l4F-RFd1fQnH zcqtgR&=6gW;ilkPDF!`U6|Eld0XkZE1Z-yNbBggiyI~6f&Mp1$AK57bO_}M3pJfY8 ztwC8tx!S@%8t#4yk-~QxvsG=bJXX?;Kgw<+O^({_B(&SH@u>~+ zc2y-Qm6KQ>fi}x6C)xEkYO&(>@&gem%xwb?<>|$h(FdU*6b8(i>*1Qpo=&ob+MCc|iq*D#d@CFFN3-7QYS$(2QP0|+#V&MRa>kC2{g&L)Sb2#A z*Kw$Ao9mLZZLdT9hg>~lR1C5AT|KiS+@28~Plkf2R81G&>Ey+`4jPPGjSX3-FhP8l zI-ju-oli#R&gXb5>wYdphS2{GVcm~oFw5S>djErN=UuhiX+(BDq5ftc0-uF@ril7y zHi0RZe~Q)YI%xDhYW@Ma!OKKCPvKznf%q*UEMI!047d@S9}P-ZsaUMZG^aFZQx>UJw#^gop(RAZwVY~19yy}Zb@#;Z&1u~f+u}IkxK!xp&AJpYH&s#RVNmkB#|UlDrZyPcY3@Hx-eYfOy^ch` zZb4nq-qHB9(QMR^+{Ax|z@VIkUq%&d&-g@qI18wA3(cCafE#rybv@)n!8-3^Ai;}3 zVSKTXd_p8&8x9x+kKBTD3_H+0{TzJdtP~2_U91@K^Lipg(=b&01rR|Qp?(e@XulPC z>jDxJzY0Q}TgV%QC;M51JQ0TSE=^U*6lkiVxDdQAe4Ht41YGmUMYm&nDu$nq*vWL~&9=aeJNJ#8#4{N7J+rtYy9<~Pq62d;h_OOFW zNgY1wpBY3Vb^0`awHsDPbo!2~U=xXQbA(N(1I;;Y!ZC#D%N%70o1+Y2a#t9_%VE=z z=I+rI-V39XDgc(UKiX2rPzqrvuU-vh6r;MB4%>pqQOis(mw^^Gk8g`3%p(Cv@FP$d z-!Y~#)r`ix5y|)kpy0E__+M?}1^k2rvx!xuD`WcH>X;%o4tAmk$`UY~!%?x4)o^2$ za}c`mqAVjD#m|D6B~Y+>J%Ymx2)f$i=iBjl@MVu=3+O!(O1&%7p{=sc8P7Kc{d z`b12UR6PtdxdDC!9}m(ead1WjP5?f-=MNNw$`^<$6f&R|DY;m?3rP-%t`nlT=LpDw&7uLQv~9(1LO9jr?vX$;CrmosPnS>ER@nsyRum>WL|W~#lY7oKD-u` z;gz72PnKC8#2RF`@(>;v>b?`NRMK;K?%30@(oDc=wVFzUdy8FseP^k+iatq&)$2Ii z7@JE$GrAEnllGHaWGcbd#g85+)Eo7BkN&VA0fb=pVc>;Ql5d|iYg7;4^<{8qia|`-Y^7XVA!~s`K>3vQGWy?4KldV;Dy^T-0)T8h+@=XNWjk@KmnpuyOJz6 zY>%V|Oz;y5&>`MbU{p0jOAQ++{lgS03^ZFuYXjwya*feX??+!DO<0yK9L9Awh&^y0h-(uV_u)!IH~;~^BK$FU+YjUj z318$0m*E}6vV@WA_7t4Vr@l&HYP$LY)q8?Vo>Chq;m|4+4<3f;!M=wUrmx| zXEbt>gfWpONi-fxQIn+qeL#$yB+Wg?*cd%YN{mq_Nu7p1iI07ck5DH`Y#=Lu#e@gE z2k=$q@O&s8Nbn9&^s)6B6i&?mOB^*x8XlRLO_DC8k37>PsST4PoG|PYi0Nw8Zp2*7w&<8VSCEY!#ldJ=0w*i^TKaSXH4S~7D2-I zPJCCPyuZK8FavdrU0#yBUA#9L%Rltv8^ub~O;C!oO{^*YO{`fw&M+AtHLv&>J3a|; zKwI!g0pH+#-b#VBxsTD$OPDs$ot)aD`}Q$Vi*ytnX%<3a?TzVT&G>7?+P&0sZbgag zz8llYC!JtJcJa8nelWtCn|`+CBk~Hm7ho1wuX;lUc<76<3!e;5fqGYU?`Iq=*=4pp z7IsIgZu%l)z5I(^?%{>YzSvkV)}Aop3*i+r0?Q5|n;9n;6{fbYrJXVQsRp`})6?Il z8tkIy@7KoR=U35I3dNfK4}%nV`k_k(8PMm&!@sz+Vm2J$X66hx4_ry!aP>jc?3E{e z5gc>?U->8Iv$(ISC^in1sIOux9yae4YfE~|jhN{E<;tfIo`24jk2x>8Q9sh5QIj(w za;CcvZ8xe_W9cKh9z``oyEh!S{rA;R5UJGFkE5TnVgM@Z;Tthotjy_6#bryN@XU7Z zS8C&vu!1;(fu{|AeYWOd%cDo4X2nO&7=++LsI~J7Nn0S@GYsu(B3RV5OHiBlCWEGS z1CAcyE}$EzO;xnpEnyLsg1bSVDu1O9knN1Qt0W;Ejp}34$XwcqJM%vu`v6 zlRZm_nTJobC(%?D3m0z!O}^APepIvvn4xWz&gEUIiDizta!X~hgt|E3Q0qIp*+% z+$?mt7_j*IIqZ~c_2%?fbLb3)oC-N%uJn_X5-oTe4q=0OH{#{uwap zqZfYnaw{i<*K|%6XHGm?(%GY8Y>x}bBm;|zkm7*lcKN7GU@cu;-)HgOeFX!!tf`myJN5-ZbF)k z@Vmd#g4z%FshJr5UNRJ&TP->chNMeevI!wH&=O^xlWMa$lb^#6-_~ z>GJ` zi#o(l_t7UGL@gbf1*<(I{~MBQs3%+TRkNn#tELvj4G{JCZ<@A?p0BRPcc~7LN|GTC zJBRIif37@pls$D1u)u^+h9bI;A(-*A=(gZV;*wthSDvEjrnp4<4w10bEnF%UMBVCR z&5%Z#KA`!l$lHJ|JW;G&&2suReij7+;FWc|aNoppy!s-rshfW7cr@Siz zKJaIio+G0OwqcEdB@I2EWhJ~&=P0f`3y+2~>k@jT=y?K|y*V}ov4ikao{>=A<|?u< z+ET3|8^f0BlO%f!9YKS9HJ{*I5Vvz#7 zvAc458~D@-o8A?@RsW#L?5hfoKTrJ;G5(x^75rbupPNNDt)8{&p-3>k`}c|#Am-nDDgB*?Y}A!liJ8x1o^2oEk?~E$W<1pMe@k#vj}l%ZIluh zPLEjs@(F|^T7iz9P|7KqRI*7yvTqWk>5eZxCjf(p}(UgL^gt;Z^WY_*PrtYs~iB)8=R4(2M*Fe8lcov!T759D9}|#E7oXkO6YD-HJPTw7fZ! z>~da?otBmG#~SUvyc{e`FhfQ=dlH!?=D!g$+(O>!r$MpH)dXls4Dc{90#8*_&5kdf zFfi#@d_s;F>|(&`!dV7q#kKgwVVV=Q31V~4(U)X`^w3x?DLI%rJ@|RhKs{* zJlHD_pEcO=o2*zy<4jj@0kj5RG!+@AsS2$5gU_NK=sk7}{wt{p#2QozGM{Y?r>#6B zA?K6>QU)&qjjDznzw%4f0m$)I(SKB9HEygL8Aq%CXsLf?B*V&OVFnZ) zZh!j1P&fe`fi>ZH(Ssw4?jteI!(9+6MP=^vE8d*@py35P2{JEH9kYkSbz;Y74(;7r z?7pHo{-Sb9#M63NCc)XtQHMA0zOaOI3z+LKTJ+}v7KR1TXONi##VVG1^RD&gT*m~% zV8=l)GH4$x80_5}U}HJs0tu+2qMUGfv6(xLCHCg!rr}sO&a-vjiQ*+5-pm_AKGhV2kF; zt6;+L2vmmMSWgv1&4E7xy9)!o)l{v)YO?hf=i!0gl?N$ag}8N~w~FdGSVv|5WDjxPYVzy*TM+rdgx8i1(~gD}j`EcsgYK>V zg#K53ivJSNGd=W)T~T6B?u?2~)1%bpo0LgAB5{gVCST$iXa`PM7+lY`vQHH^ZW_Int?jdt75sMdHNBp&o;ehG^5ME1EQx zGC8xkgrbMeX`T}6-~PdQR?<4@oNUBZy;yr1GqTMhZEa}TS61U~UOlQ>)w@WcS{1z) zM`mS&ZoMmMSBdR`NwBL8k#e;jg0XEOwyMndVor{0fbSVxr(OUK-sYFGh4cQEE$m192ZXl(lMdnEa713jRg25<&urma z2t6OufCs?13fG;WSK*ol-i5fXf{@q2a~Ag=cu*3qI`D1B^)bTV;7URI+i*Py9zU*^ zaMj{!!u15MuaKc`uVzcaR0uXf=yMf0?24G7&>Ipad28iX;UK;UbvSe#2G+^TO?W?` zz%)1{(IS2(vQgd@K5J9(y<;?K!cPqr;kF1;_B?uw`oX4Es0cL+H3nIFB`w9Rnhl7AH&`xmO`l zgH9qIqj4(;$I(Cz<1$0Qg}5#*$zkzPxNC)UNk1m?lNx+y;e+oD@EPE@pOOOH-5)Sb z!|udTtSy_$6KHecl$p?l-^14Mib-OlGwT7YCJm?otLXj~AME2h64*CLfY}J3Cu3ux zEnb!90^PuN_1MP483~=LbJ1|YzhCs!V~A75iS7*~s&@P+v1SpS&qx+)TN=K%1SU_6 z>weOixd*RxITu}yfom)H@X~_aH-417uktV*LaaO~48oY^{sEBOj1vnuY)B^-@MZ<4 zL>xbqnm|&|A8tZWJ%1>A<}p^?%~^Rexdw`0-#L^`I60Ij;6MvX=r?u2dBonh5>c*1 z6hG=j;u-X7>I!g^8SDn_yo-EFbZ^AF0a(+(%ZtNLQEQs(@c76z4PG{(ICD?XVJQ0b zEyTkM(`Q*+UzoB3j`SmS9hNp@ln-Xo%7D%5;q;-eZHG@cehUS_WHC7$kM$xBf~M1N zI3;0n3oSKe4;6xE_0pW<0MrTyXnR)E8VUuCbw5Gc3rv|9=gj;xthIOWu|=jeY5XYX zDW~Xu4Fs{~K;U%84g=l?`;FJh`4**3~H+ft0 zC4SULxfL#$KULFXsF!nUX(rb~*nfQikB7Ci6bU1>G=;?@wIsoP)&R5Uq^6;z5o&rI z=`<~QW0Un2S9i0@`l=<&0uM#w3@4uSAG`MpSf`dz8uYnt49!hH0z3UVZ4J~2K>jM{28 z;>g^7Sc$%(-8mA4dLN{7vDzR`XDb`$ahv;eL718ts13I=2l(r(=t9<*I+3 zHuRG!f82%|rXQe_gY@OKCU#88;M`0q!zlK9e*@}&ycwfwH{MU9H#VNYC~96CWk7*B zr+prB;Thh6FB)k)I4MFKAENteY$YJAu?a&n=zLReySViB3Y@qEfh!+`=kn=c9ws|WNgT_VPZ30Iukj-^`&h>tR4 z5rf8^-tqmnn9f<6^qSu?&rKm5I9a#whSt)7(SW08?_t1!9~_zNB0 zhrNhELL8faz)7Sl@x$fO#r|H3E_OHU+<`x=!!NLzh&W{#rIxr76=J_P^96RXp5A8!$+L4(SpKAMtI$$jI#T~EPr7&&g)Q~NBTsU zCp)SU3y6e6*hDz@@|wWQiW}-?lcuf zXz-qM6nQEYnZK(edXDFI(4eGFmb;>e=TPCOKhfR+m=Cn)s>e}*DD6GHjAb>fy=y92 zJlvzadR}xng+B@B@YR}4b_Boa}&dszV0#)9BzX8WH z&7MJsIya}#iF1SF0_SGd^NXHU4-lDsl|gh@y<p|# z6-Mj0zgg13W?)0C z=iZKylQsFlP?wdxkBK2RUi9?;gwFGlPA@>H^3FtwW(TfCctzB+Ad9|u4$S@5AZ(T2 zm>3hhldb;v(2Ms@#Kj-O2gWv{RKr)mGitdG& zOxis^7Mc9-PUEI0)p>^mom`Pcg?ry@9#4Yu9<9Hm> zAD>JUIOn1Pn16ZJEW@%&>!4m87u`Wc_fJ6_@eKD*HYn^|{nJr&KGeruiYGcZtNoMb zipc(HK4PqYLjNah!PG|Zy>srlV=9`|xhnXc|5Cw!?_e$Qovp=&S%)OL)*tI!!FRE8 zsh$5I_T4P{$%MqGt#q zcEbp}VNQ%#<0lT+p%`o|AVpl5U}!kh4Fr>OBQfAS&&eTlATb_Wo>^YxR9rd(-6ov} zru6My#3lYq*xXo3d2Fn}erUkAnHk{b4pYVBqPs6MrR~P%4s(rnS4OvSt2?@l4;;_p z;STEnjK0GlXp`8?_ftH&V~=$?n>MH>xT`j7f}093t1a(gAN>rQLc1%vzHD8pP1?4+y^4K2qzye;>u1w{M>p$ z5e1GgG{f|fLccx={nDE{=@%F?<6gdIV`$Zc$gu}T7|6pEX%E&4IE4KZkk2#!K1WZc zCMNI>UBpRdd4#~>3d(M=iWDs@6;>{yZu}i{^@~>|V?bXgkL4Li;V(IqucgFvao8); z?@`sX8H*}ddk;&TlOh>g`16c(2|r}t5P@$gx}ghy6U|-`nNiatb5+}#k6J*fqcHFf zlsO>qayqS@=8EQD-%kPRV{4tt!F)~*#=hsR09Svv6d*p#HCkfQOP2;0zcVpe4`(Or z?Q|s^;4e(!SxKf%e$ze61&aGTR+aBN#gv$a`135PJ?bp8#X7k5-rFkI1k+|xyUw&` zJ{GHgHlB&wVzK`#I?6qlSxV+Lp$XrYflQPxfFf5}ieOlsO1?Y}mFtI)$;wr}#{!@@|VLcQtw}!)*(Oq&{rlCf(rztenjr?E2ImQDxQgw_a&11X(?kS^!)^~e%AWSr1!vg9MZ z<{{&R;z)@^gm5n&2Q~02nDjv#lXM?sglk{>M-hqdrZfp(Paomsg95>BUbU}+=s4_t za^T8#Kg0>Hd5!K8ZIwuCWN|XWumW<}G%#WdGonBiA4bd$x{D=_*Bd!g%8IhdY9%+C3XtM{tdt`A1 zJGb9$udyW%Y(R{(s*=Gnd_kOnn6|5)UC-`csqN&zv$(Q3z#hcxkMBU@9d#76MqY(> ziGtQ8{4%VH)=(~J?WjlvEwlAGu1yi$L}}_zeA-eeV!e=t($sOZ+YICyR-_Ktm;g-_ z$z6aS0wLCvQ)*Zspc4ia$HC4Z4g!#6||Sq zqdm}W0UBb0?_kCXTeb7gKyVM-k5{0xdYqg2ca(U187z&H zgr)Q~S`m*Azi1mh%%CtEla#gev1U9SR`msFPz3z#^$_q6&@QUbDW?b0i1vEszl_FL zBDKeK4NYdok9E&CX&7HiVLynV)H&bTNR6!-*sHiA8t;d~j2cFKO(J7Q<5S+uj*n${ z3wwQkVP63ENbsam5L84sp+^nvd(Md2tN@>#I7v3a|JmJ#Hny>1cQL zc=$K0W+{-L666N8OG9^%uM=QT)j`(QeQqlPEEV>-f;$;;U&b0X8l-s7!flcfGs2}n5j*@m-)+U- z`IxVz`TY{V(2BOp*M zVTVEQ3C}4}e-?L~s5d}0)Ub$RyABa;obagpJ&;JA--c{67b%5z}O zQs7=1{;}U%i2JPi>mP$O7uYYH8J}oMy<3@a4ot*r)wR!H(ZxLwKe_7q;HyrzSO-_O zTf~085;%azi0AZ}ikQ5U2*)n|jh#fh5x#kaAWg7*;3RTgkvK>i|51wXOXdBIPTceq zj{fk=s`jER5e}YO=kt|~7yV--6Z3$gyLoxWVY5>=hlaS2j>kP} zu+KDcNXMI9ozh{1YbPZUQiwGcUax;@ZfZqb#AVni9$LAi^xmZ1*vUU>&->B}ObNwDpI)};p2_iM@qlz2b z9}#L+1Njt|9^9>~ZUQM^9I-1DbMcGL<>ehWI9xpV0g@e2yeR)8NMHW8SsyR_ z{7qZyWoixHAe$|VPsOR^3^&=jfVB`)sZgz(xT&^Ougr?lU#v$+zYOFuWHz$-RbPdA zBr|W=m>H#e!|CYHsZq~c9Jd*sr!k>!gjH&yj=NB)XFWD(%)Q^i>SHdI3bXnLdl{gD zFNX{|diZZxy!#^vTYVYe{1?ms=~ga@YssM4hHeHmyqB*@U)bft{-EYd%T;wfW_kWT z%+gL5_r2oFpcX#fFobXbSnJ*}&UWIq{i`q5%q8A4>$&lsTG5R+Z|5hpX_t{|sDG{I zV9xQ5-g+3|a=(FHuJ?>isxUIC1U%9`ffemz<+57t8?J+ZvqopKO!KLjsg})~ece)c zFTAHyfsCZO?uoXB{{(~>RUQ0UilKb6`6M6yMBD-WJsC7X!F!Upmi*aQ z+l}^dSat<%p*$by<}w&hXp2x1^|v=3_hwKWRttnb0%t1V^Q=&nk->!BR0W2yq&K$y zv=}6o{%hoQR@N|{Prteu>IV~fpcym3IT4o8B&j02Hib3miSSp18#g9Rg{ zT7QpdAvTRVx1xp1-_Zp{3m{btdeW*dk?12FEL`dr4i@}(CVkEo6a&Ud-I}zfk6UN! zDo$^zBKx=e$hO(k$+oDHgKU-CBmVH(JK2*f+KDlc-mwp7;8e<(K#;!uOzV5MGt3V7 zY0EdSJCxQJ39iEvm^snz0&J`ldgwUB-2_7rE#rzPI-bUF7VQy;oGPEO>dp>=MkVAsu&y%35LcgH3O= zV=%QL9cYGgHlwmNo{S%-b4NAA*Q>Dp)R6ZO;`Q4%0x7TK0l8UOW@Fk z1@V6fXsbJ8AH)ZQzJ@%E?hu6oN(Kd16dKhoq2JJN+KplSm%WB=hT!Gnl=&ny%OA`# zbY)R~IQS7705_K5#v=YizeV^~$_#p{VPP@I2J99Lq_)tN+84+CVUHVLZ+as+HKuj)r~ti$yeZd+%~`Oe5xXDp zHgeytpj%3T0i@xbCV$oa0Zh1XAwMUVQIL3jDj@i&PDx+5YK4)tqT=!&&VE zzLuCb$DF_jiFh9!apC-aM2w*#e!eykx9cbe4Q%E2G5|l@&d+)U=V8onX*^f82XrMR zpm%WER~VfX6U9*qM3RnX9yulf#?m_AHL%=g(SKba_)Qj?f=B&p<0tO9mmA}r`!X(Y zgy)_u2jAD@mDfBx;`gG>~mzCcVi)(oI+{% z2zsl9m+%Wi#ib9qJ(w;mACmJy=|gD!o1TKH7>GrMuoHO^S9ZpUI)$KiVxF;s@>*xW zArzU3=d71m_+0Ev=>2>#L2tF(XuPX9=?@eq{b>!RuavboI7Q0{*fl#5ffPrepvu}| zhzjUUczQ-4=4E5ge>VW*^7&+sA1X^(OW>w~yVRpLAWJ!u~IAfviN5WbzuYU^We**8YGR- zB(8r{_DLVRU>W-#6;r(ue2#y|=k?)Gj3G>$oMyL|-P7zKR#W9Pj~&;hDbmNX9vq6I zY1$mxa?6WD27e>#1)u!nVgY83oGjCYt$Uz(i&Cd3$jL3|LS7FyDFzoqA_fZl5i!hk*J*htHSA( zSRw7w4B7d2q7ZLM(8WF7a!>{sJ2kb!Pd;*R4{9E&89LxBBW%CvlmkN^%S=aQ+~x1A zi=khy6t4FmMpPo6-ouUfcfzDd0iJx!g*es!_;BXHh@((974sR+O2Q{TzB&g?!RVxt zBa_67P76<9gyq<3w0vu&^{AbW{B<3QcKAACAmt=}SsRXUgFdl`{ZDPCi6SbNrN%7y z)_$W7yQb)kx=3^Qc5FNlo<9b33`cAKa^pckS0%~u{#)WuHzgOn;-=*EYfL#w$t5ss zp2oVahe~CksK+)1=PpSRFx1cG74jE>B37kO3NQFYODo&ob|YS1v0+=q4hf0)NMy4% z;)cCtn_p14MxDpkG(Xj9cu0%lhmvVZ@A@Q2gUCW z=Ut1pGPuKc-gR}uqxSp8AR!ONQ$(USFG_(><)M|oJajGTjrjhc8}YXXyAj`4D2zDo zKc3COunTkH9V&b5y87@fhdf+{ne+)cH;=ud4));7d6CI_=mkjwp8%oSf!Y_Pi$qiREYoUs!T<0dLi5ax~#ZryPxV z5%$j(q)gXUN@ew?^%n!(v|cQ(Wr#OO(Y;Ecu`M7HBev=bG@fGba-? zUi*_uW9Was#~lJ)JzR-&ZLE%lKx3uvjv28jBjf&c=7eLojcRcF^o+zOZPP z<$*BG44HndMkisSEyR^C(VR3JAVNf~@V>Z_yNK80bvMmUian!-^a`g=xFu5x=0c5V z*7$*7sFj0sS03~h%)=m^6wG3%KcR>h%UM_KT&#bQ{d)rpV~Y@^?@Nhqc$!b)XV}~S z8{-}b{^YYUwe9^Db)bLjLpzEFskeojxkajHLrtVa+S%leDpG-9WLuEMcJ|fLvrlGL z;G3)%AFIrsC!`cYT1kFM&CK%HxLc^_Q&7(k(k~fXrGbXJuU{FgB?^};1 z$qb_XkNwcK4~Gi+@Me83##&Fz+A3&wRM4KRpl!6P>%*NUv@)*j&bj|FhrUgPNP79+ z?CBPBN|V<0F9jWnhZl}Zj>6G}TT!L0zUA8bhz!!Zj-4QX99;8e7-o9P-9TA!v;D$* zVYYllD3B$?TOxS@>a`c9y48g%qbrBTuz@R#D;PLK9FZbYx;QL9#*a>n;oUG|88Yey z>P!BfqCr8aaWYzT+e2dfQ(nAZd<}x}l56&6FE}`~u>rcdi4j?^bJ~2LOn^+AT zJ18>pZ>|95X7$irt1)8;&r|BzEhNHA5jKRYRBtIFJ6X3Uf-;wK=zE6FFJQ_L=AM*+ z{}Z+*Ck@#ci|guUes}KPPp3z>IpuX;7cd|k!vtA z*;B9$rAf~h@+OP-zNE}XDAQ~rGIKf2qJA8D`6}kGvgmL-2a5)m_w@~r`uK(&ypzgf z)5nw)w_pu=O{_ml$%u4QoCa*oqvN6S z@nS~9j=U+3Nrtg5Ug1?JD@WwxqP85Y1RmHw=p+xlLRS(0`Bz)D3h-^a!;MJ|Pn z$qkZd3`4kuDnFy>`E6)hW+!#hsA917{SJ{3ud3Ahnyqg=O8tfDg+Iyz>+4$g_yWZE zoBrs7d%Y=A+R7Wr{&N624(lyWRV`keucZt>3j5+oktaPin0!5nDMEO9T3uUq)Q zysd6=w5O(RN+GKo8Hzauvm1@3u-W~0@%Y_Y6>^aNQOfq zCF)}zb)b$A^3|Aq{Kf%isXM_ zp^@qFb9*BRRXu7rbj3a8W8zvGvfPjH6y=o1KjfIQ^W4xo2FlUul=rrAuxk^#_HmI< z_!!`T5HdYDpQ)fd_ewTif0KBBDe#nd_Z5W&r<4iz*ypg0_9bWL^lKe&POaEuamqTJ z(3ser_!|!)KtNEWn@1txohbxSo*{z0`QmPI@f_x(Rk((?ch(X5;mWQf*vq(KTQ=-8 z_CJt~u)YD6i8FqY?U61D=P$cO;gYzPB;BEqG)*MdHc83;S!c)&zpT@=;M)#S_!(XM zh(a}pg3ocW2a0;j@LERH2XE;qxO*iI*xDW=9Eq-?8u0{&+j*KWG+4V2z zGC`+$k9baaW$cI^nON>>_GlD@376&B5&ENWnv}pF6Np;hkeC&ihGmmL%FXe#|M?DW z#0lUNB-lzl-7fFp2|U$4q57WGKdWEAwzurTYa1ell6+++f#H>yDEt~x{@Y{&t1h$- z6G&-^=dq!hPCYc6EdB4MUKEvef%&tfGZw)4JGVuHl$iG_y6JvD)De8JC5GrOVu5cw zY{x{ZNZF>IhVl`ZXDv%_c$QwC${}P%HT8R4xZ`Yp1@(rN+^BcaQ5PcfCE^=4d+>ku z%ecYC$Ree%B>2SFtG556_&O7f&Xono8XnfYlQPRL$}A5l3@TmLhe1F8sB84hmJSAW zDvAB4J{)T4W8K9vi${1}OF_HCn~au}tLX~bxe0C0_itN!;GNdO!JOuB;a+}t@m7mD zTzUzlAgPDwa``1TTz*+Um#Z(qZ*bShbk*T7Q&!iZVI`b86d3cixRz6G+?=N_{n$jk zdMOIxl?<#;sQ&l9cO6r0(A|5g`B7H0mSsmbz$`@tC)THeGX_)jjF|EMSp+oN(r;b` zcm!#)SJ3e%j^GBIjI(ZwYdPs6s5Uw6bz$7`v>Salhv#hAr+=(_ghOURG}Dkd7=Rn_ z;{7%B$~i>rLe3##hdV1cv7&+lEQT|P&E+pI1jP6ElMyR{x05MV{L+dUdQ_AVVVKS8c=Kr&#? zU0RoCkhz$D>UT_2(k<^ zZKZgNmwmq=g|;HdNBF{uAWIk)ysJ{X!WBZ!b%cCYmPy~j_OtA#iqNU>ISr1ist4x?2DL8q6FHh~yZUPSMn1)KK6$C+vU zDI$n?DdohM_N!&b@C%{U?&o6o#^W>W8?Et6yp9%r2QYYQE7q!GvzVpkIoPlRv7^R@ zQ?EMMu#GS7CizEbn5%AhNpPsWA+rgrc(`C*9anZFZ_b}hVq_n|@$Yi+^At>a`TxAl z-28g7H?u<;+L5{4>>6;3jG9M)R@r0g-|$yJ1Uo=m-PGUzxA70@|Hw`V=x%XxQ#ayM z#kEBI3SvkgD&1o8O|k#d8Cr_?tck})nCX2T5;h8%p_ham{NB#*q)Lv!%Bv;|$0rL} zK>P>xZ{jOUCtCw+Evx(0rIJ7XU6s6<#hX&u#AA`Z%$g#8+{Vug=*L%KI51|l{k=EZ3T{|}iPM(Fb7-wrlAg5r>|Pw@CbJYz2sow#-`rF-oOrb1NO}Wq*xK7N5rkPE}6Nya@f5#)yXU;1DsWyH76i ziBK=S(iBwC9;Kk2is+f;%GSS0s6Z=%B`i@n=NXe?qHT`+EvXVtz*; z1+hA0T`Xhg#CpbjTEeu}GZK-JB*oK$@}G|HwS-SuFf#l4#_33Jv+?|Xw@^kaGk!o3 z$|M*Eg}K6N)c%S1uPpM9c)?*dx?w0Ep-k|1kXfU=5wEWx-nA#<4`3#Fwc)lUmq3fk z@*PbLb0L<;_UnibeBQyTtv&_NT4}a}q+}^*G)zW*u_IJ}79!aTpHc`V++a%WHF#0% zsomMYeQLpOgDFKlcN?TM#gaL;u{FdWi^?MYAB%NjC9-bUAH($L^<$1#l12RgC6;{@ z$Vvn`8SSnvORv@dvk+iTw7USG0QO3chpho(@@G z?o$%@W4$fwG8oJX3+4<4F@H#Qv-hYsD?z)5FRWm&XKjyQ@WUp~#9$Pz?8G2b1O6(f zRc=ag{I*<20=b%)C8Vr*BQ3<@*E+SRJ z)!p${I2g=^)4j||wea0Y`mWB=|0&v#fV4}|1_K-R%^0-1)Fu*Jh!wyN1ZZw1Kym)C zuov-YQ6Q@jWHdtxd%?+lOT7w^l>lp?-8FVey$W!oF95U2+#c)S++}CH5vz>7gdm%s z-PL7Ly<9Mg0I7`N0{l(yu{#0&;Of!9hldijX=B$W$QZOs!R@(GtTmMe!{jT5{~O?t z+u?j+$!(Ga?y4&+sp*v4nYgNs^Ot!Cm^l*o$0x?D8j3K5)9z=#veNEgei*o%NkzoR*7lh7RKF(feDqz#J;r=R1nItz6ZlR8YNlGH@ z$1hw6Ru{*sTVV| z5TqsYoxpXc=VQlLzyKMf=i9l?j`mO!xr7U?3~~=T35$GjT-hQoGSDvkjntEI^r3-6 z^ocDF`su^eUWYG(AmQ_On{ry>_Kp++|MY~Lvds|KIz^(ALfHsJ9JsHGL{<;Nwlyeb zwq@c$Oxfon+Qs}uVkdiJ9q|SV;;q}b5r3%^uAS!(T!Af6Fc%{6@ey5^H#!3#I&j>p z8aD15D*(b*^^$0JZ$hPQsq4l2D8a+SP)#+Gijc)mPT3j=?!yX-crR!-e$lyVXq`$2 ztp!iPJMi0przR?HZl@jxyz>H_*K#!uIH$(}U0*=`%iNC}|GIubr~|*%(xAB2GNk0j z7oK$U;DP~T37SiTQf3Wb>(cX`2M_WP4{YJdq+%%yR>#`X;=jG1j~%5+y# zA&0^kz*)M$d5Xr|6x*1j^?w#66(_TP_*$E@$aT{8>T?eDa4<`z^@eW!yZUqMIUnn< z=JnT^*wbDkM_CGndpk465yfa~LTmJ#~c{3~3R&{;}IHgh_r1j~cX3vql zi_;^V+m7U}BLiQo%IsV*QGnHr+aqFzQaoGX+P!VPC2WXu&X-r%bCy#Ev#9=A_?*tI zRlr}W)}uf87Gdi6GwW6)&0R;mJbD9S0(JWS&i5kdkYd(Ou?fFRZb{6AU0#K{lB!yV zsOW4nYpo;Fa=PkHo7gU=?igt#mJ2QU0QPdyczbO(N;i~^djR4r(jc(3-?R8?ds=90 zPi)TaUj!!}MFr{G68N-kXApRKQp~Uukr^2oZE)uvbez1WxAWc4ra39_ZH=2x^`xDr z27PxTc=cJb{M7n7TFuwBzHB>h`+041fKy>%3qRlcwr92JByvAQVH&$6bwYAAT`v?|4s}Qtw5UCXRj77% zX%&qMqZ0#R%ZQhJf}jU&m7xcDTc-cZP7k75>-mC2$Bu5QJkruF7^b9(wg3L4r*VXB z>|G)U4quKK}ECXxe`mEaS7|XIZRUF>45BOZh&1(JkMzPipcl{PC=i zK8q<&lVTdy30l)Ilv^{UVph#;b#9p@m+I==EQJH#DjaxDEP{l;KU_e^U8v^$9!8}{ zci?Ut`ErH5W$%!pn%S9}%2sfL1?_Jf!1|+4=&>e`n@1ZvxJB(nYod0UVaO>LkEs4( zDPZ0sI+J#FBPLlq`W!>~@aR4m&&a7*L$vK1qH_91UUR`7eSxlyK(hpm&nq1b6})r) z;g+qRewKZ^Bc=u(Xip@xZT{rO4u3D(&be*=PoHh?=4m5^r)^Jbv=Mq&7CUKF>rtQ!TMt6hyz>?0@4x!>@{VvG)05HsL1lsb zsIox*G>U1i{CA$nlF zIU>`>B0B2AdTjT|zLE%aOFE5U)dt?;S>+42XCK8VDCXnuT93vkJ9>I5;{j!+&6Sxx ziogS0l{5YGF22^8^vZ5s*2X>MU=od_G070YR|6mWF@~*x$7bV_3fg59v_C@C%Zc{e zdZCaRWQ?f)gN}D3;ceTG)%Cm?^v-;XLGhVpSeYkSM({eEs3&U{D7A|v;#zv&J%SUG zGoM5AEc0SpNTEJ8JZAU^Y#FJKIREA&bgi*QaOQCz&Xn}y%o_^YgB7&Ly3oe^2T4UW zyoK%@^-%lOPdGTU;$Cmg%!6^`pjf-O1w7?TV;rcTSR{04fJma=hG)0l z#6-O;k#{cK5N~@&xlen}^h3{w1$DGjL9Qwr0B#zhK{E9tA*Yh5`*q?7rcOZpM>Xx+ zkO4}YNJIJXv{9I+*8Y3TUEh12&7tnDe^Br~q@dkJL3<`*B1IMjPmds%bD~Z5H`tKy zw$;t_DR1|%nVLZSs@z}j>r7X8v-Hs5b{NlkSD)E-BF^_EeHY_!{xD5hEG|+k{6Dck zqj9d0LV;$ub{9O_DkkSfag7Fobw>_`X(0E%KlHSNclFS@5AQmHcRp`gz2+lyg%s3_ zi))rSUVkp9aBoZz4RgW0@d(14+#}{aNr>Cb8~Bj7M)pA-28~3)1NDwe!%)rGJcJ_; zBO2Pqiw0g_C-zx1Am_soRM#^suNt#jz^8(#GAms#UOkao*6kZ+I<(Bnzw*tMQsB0o zrBQNJXMCiigH>6*yqYkbjWY{9D)NFSzQ3o29-YOKm&836j2z}7aZi@Gi@!5A=RtWf|jIjSdclvJiz#$hmMNv6ORqfFcB^Zt*z8;83VjM#EVPYBET#4mrfDb3| zw9v<>&x_JdUeR6fCE6*J7!!%@E#kvsM#_k%T`v`-T>5}_v!2Hvx%0IbN_QUTY^9W2 z#IW)BBes#nF4nektpG0O)h`*ZvyafuXmikX-b{m+#!UmY00gZ6DGKU{Whk#QQiCXW z8L5f5md2tP#DUgdrM0*V2^X&Q+`jU5T^OUtQ`sJthVn7vbs>yC0qdi`^7}t}0j!9E z`DI~0B<5eTAcqlu@}P#eFc(oux&g3YKXO2}I2x}M^tKnH>==j+iU6mo^h3P5c3pB* zVl?)(;5+h((c-n4=~*!K^iY9^S>&p;1h*prD`h7R2FXiyDqvmh%Sgj4i@*2p-IRhv zFCwz~)^`KT*N@HGc<7+CN)cn5r(v&JmHya_u|9Id_2@w-gL?zPM|wfV^1*MUUI}%> zsMU{*9o*<_^w^mRXp6w}8^^}r`5kz^-;Rh;{ph_%2Hp{1@>pf0bqWtN8XxHhh&Os#heISzg6L zs`=>0Eb7^j2|xu)wXjt%8*b8i)bGy{ukdM^QTT>Z$Ot50|84*GV~6CWySxBVv|HXs4OLyH`Z#H3(L`Gqi*ubB{?j|0HpU` zfyOjDIA=dLs|WkB;8QK3uRB7uYGE<`%*!mRXAqvI8fhU?GvTEMTEMRY82d2e#OE(* zS^mO9&_XQLo8$l6=N6gm`;Lc+XMk<8V!!gTI|^7Mt|j$OifhUCA`O|^y1xjd>BL*^ zWcv~H#Qwr#|4sGG(&iHB0(UiQUZ$Y_wSxL_1@#PZ?Xmx|sYmR;&&l|l$eS$22ZBqw zyHn+3-0$B{mHGT5wg6Oo3jX91_fHh)N`;&vt|e!_71xq80u2vO{+%M$Tz}gEd6TaE zFuL+_ig<)0SON~?xa8JV9-c^2G#brm<5i8mENKA#+V)o<}WCi=MyQ6WKlk0Qk_aKShULn@mr5L zSacj>B3V=vfiGBOpdg4aAt%|wjiKS)1fS~D6w^Y_;-wC3TE*6tM0{zg+}J@`BEyLq z7F)+8V0|+p^{>9ZxX!W}>K4o6_|O5_KdDu}paIuXt8xoc$f-Y3N0Uxb=eX;CI?qNu z4Ad+P{ZB=t{g<7b2Bkcfp5WgPvuX8OUq%t*Z>}$QJ>tpoF|Uhh^0c}BJ4l)Lba5@` zy-r*^SuW;%pU1pcKg9DUG|eNE>_8aPY>f}E@cU8bF*rbLe;K|%(hT{V+5Coe)9(|S z*MIb$O!pt%KI=JgEqPdmmo&l_W-izDq-CV~hxGw~@4nEPI2ufpxk9#Zst`!Ij@ROo z<)?OspTQ-a*T_+P=-c|3(m`rU59M#bfpF!YzQx3I$wLdG_~VLp2Qr`S9#?3;#% z%q(aRLjrKV4mf}S-&X+(>Vaeu0p3QG?CSBdF<%=yfgq2f-33`t2fSIIy2RKNo9=v4 z#-?S_9*#{j-;-pFO1b4}X(t@@=Jylgh_4dh8}A$GCaxvFUr|!SJ*@na-^6YqySsR0 z-dIMAkQK1a58}d3YAa9h^@Oec4egv0-iSw|H&9d}zKqu-jIgz7sbF52Dd56f7}{BT zbV02{h|8olyyGPh+|fk(La?dg6Cxh1(-c~|BlL|yd-Y#_E+YdU*F+L$e{S@k0S zlRme3nl7U8h0Uz|h0Qq+;E|zY75NyVi`-9j0ho+-mmuA8d^(on%2{&O@ z=Og@VHHY#x(o@iNb?E(v@@fkDq+Ue&kh*M!c9Eo(!LC1L(EbFG>mTn1^f>?PNmyFX z;`4;bZV8?wuBGZ-=52&wQ+wbK(gc?P3)PzuE)rt>2?asG1TPV)ss2Gr8u?J+1+LQNJ@}`FyHLI%t99jT+}xpjUm`y8$_t;GY3X6S z(>5CaX4$jKULOvnedy-UHgPRE)bS?IO3t#!pA`QqEaLTnvft{{yuX=)L$lGf4~IJV zqzNCv;v#8xr3nU8Kd9h6O2K=cg7@aj8rp(8<2<;N1*T4##)5ZC?tI%eE9#&0xoECI z2S!x0mk6vAJ5W>vzCK$=f>_ZO;f!Cz@`9MIwnlJul7mUK|NW+DkX-sW+AWL4vTI?d zIQyrKN5oRyIon6e%h@{Sxne2AhkQXhe1C{aazzJWqI`g0A~wBbc3ekhr*-81f!V9g zceHc9nC^JzbZP#%t}r*HR0e+MYgf3*LRsHKCEvh+mQ57aX33WD=2A#n= zLq=OPm=Eug{iChLf_ob3eHGOEi)*Q4SF#AiDgIz?uf4XDDYJ2kYka zaOcOJKCHSYGw)nwr;sy8@lM$PvI_3QVWokq#J%5V zZro!ScUNQ~RPEMc9rc|J9rnKnsN!T6zkf^zU>uujam#vpU> zI`L<;txZ-*@2wQoT?n>9|S!Vh(U+L#2!(7(7xSq)x7^%CbIpb&~f#SE?jc-8qPWA=aV zJ(5e~3wV&=y;@8HLenfhf=gYk?um?G`)}@= ziiRtpb0ts*yRW@n?ZZm%pQYTZ;gEl>Kh zN<9T79w#qfQ&4a4wuZXU>AA~XsDu8H(wv05tR5jg^b*;`_iPV|c;=x>#HWAh9#3Ht zmnE>qZp=b1Kpqln3v!mH5f?jWdE-N#l@!?cpf*dPv;93R*R47Z2Cdm57-V=H|5DcB zA8nsbys0P9*4<+r1?|#^2%Tux{=kj)wGk3+=%4fT|0Iw2<+Iuj<{Y|77e(RpB3$1` zeGxY3B?pDKm^3F8j47C>YcBE0_3T z{{h6W0L{=2F2`^7Rh@D^jJbv-TVSm-rZ@TmniB2R_~k^q-iKoTQlQr9cnh^Tz0i#} zp9ic`BtmxnP{7V}j#F1L#thix%b2@;7_)4H4`UX^F(bm~AI}!`H;MOI5#dX`+YWK# z4YUPg-k+;8rf3ZZV|M=O&6s=NC&n0f{j-dCVZKo_3Q%}=&HL;ryTnCxiDws#Z?e%_ z^EkFtoMhzpPA66*N3ua}u->OaHz>_5k;a;UTO=2W&{bX&-=T?Gr!m5l&zFnr4cx zISW(loZ%i+FL5n>jdV4%ZNp+rc>U)$Cua(Pcs{Dr&4)43TWB8S`c9Tlif#Y;kelqHn*AU)|hLe zmMJynBIxa8%vT@F3Cj3Ws7$LRk~7jS%(>U0GQ}~J4`UwoVa!gyu=)BNW&h1I5fwW zJbYd2yE8IyQUvy5mS>Pau-n6Ml{-SbzyHMt|E0&W_y5xFzi*ILdIjH2hr8K(6&eMy zNHRVBg_}&#etI`nkClvI9;e>LU??Bv|g z_dfkpXK}MC4i;B2y;=Mr0xCN*a+Th>u3*SBD*s05eXK5{Lr;#ZlVXuESP4Tx zfQmP_UTlsy|A8hMh9l75{qNpl7~sSBPZqn)=Am3}tsDoZ;W~e28wdr-a8gh(K6$n- z-Vc#@+gkZNhVo&2;mpkDg=Iv4kMn1mD!4x+t|jwF5$=w({(oYD%!#^S{=FVD+rwr) z%|F=klsEI|XKFY9iDq_3!0x%BXi!e@4CfIM_)4_zQPBQE3H4j)8H%NvGr)hMhwM8O6_*`F{bzAr^8JL$3~c2uy0wu zi+OWtHsxJRL##e!?~f4!UqJ}dLu+Htyr6`|mrU!M(4hF|#>bw!I_R=d|y_H9d)COjSf{f?Lux)$Ze~S?!@&hR>_HZ?NUn zi!=Grozr4}k->A8jwxC}{1Y8n4Hx9MI-~m$_s|+$w2M#A@{Xi@M-rg z==1#ew^JGY2Z;4iEC-1emTP?OAwm;e|Zb`nJ7E%r=fhpmgiwyeQfIhF2@PP4Gb)ozw;=V=Tk6m@5CI4 zS39L4E{rRs11jQ6%Q|dpb@ap;AL38f`cK!lt+mhBlKP)=)vsj zw$Yh^7b3{$7)XV{;2PyKGDiQHx@lyWgwROq)<6IU)^5~KO$cpZU)$Y4aE50Gl7=P8 zp3k7zMm=X2Js&A&o3lOEjq4TJoRtwze}ns}x5=E{M;K;9Kb6)?J&p3w)6Sitr-r7e za}-6j6j$o$=fKISr*$CVtfy7+!+Z{%Vm=iaV-oxBxrEpku`o}Fr^ltpqyB539ZQ1r zR|lR=nnzFTGT-ENx6D5%uBFVsyNV@6t|}&Q)d7Z#^G~PD_xwZ`ovFZC$~+C_BlGqA zWxf;#-8$k%Nd@yV3g!_C=FM5_T}ir-`RgcZt1`d3ltbooZL?$^qzI;z6mo9h@Lw3E zA>bDY+@!l$u6AYR5U>J{-Dm?IMv$1Xd~LdRC&QeFC>E`cV)bhzYQt%v#{5ehHd%^7 z#^ltbxa24ttF<+-VqJCn6Q3zRR)uN7XmLCmuQVIa@lbMSr<4I{OGlzN;*;GRHn~maiq| zOO?{V4b}`7;zBO^P1O;^t{`RdG!jL`W% z?x2%IY;sMiFuFb7V2_UE4JG2lfsqpvj87^4|ErV2KjH-hUA^lmWx{pW-AWRpEIbsQ z&i5%)wIUsS|F>Fwd}rXk!Mc_VBP|(|z!+w_$+g;dVau8_Wd<}R{9^QIT!vqaj?aMo ze4U#@1@40VG&nYVG|G-CBH~F0*)+DN)N*YJvj^ z*o^pPB%PBo3>}#Tafw^Yu)|o`=lT4L)?PWGhh=VqXeI@`8EbI*l**m*sK@URZ4%?L zH#s(HH;vs2eTuPrSYuB*z+-2lvFAdahbG2SP#udS#R!QVStxXlwL|CgxHN|Y%q2}{ zutOGV3I7|;{>ov-=3d-zL1rJU3Fs{#3C?VX?3h)8MxYc%nR#UJw z7t}HEb3FenEi%cAur?M04&EjP@OQ)F+YlvcUA~in`R!tmK+2c*pr`cEmkgGe7vzm^ zZF$TXK$`F3zH26_(=^Ns`gFAU8g95Cck1e!ivX7^>N`9h$5ScR?F8^KqtWi_vBM`C z;7R}*W+U8iL4FKdqI5Z)x*Va}m?!nIlL@eyI(A;2BMk}g`t%ILJ@#ihWC4O4jdmB3 zPtVYhJbMd(kD%QJcwPtGK!67Xp!ohCJGj{}SjxPo5ac+tySl7CO9SjnfW^`70xX9U z5R@JtBEURow*U>{_Lk_7cM;@AVMqa(WueyP6_h&7GYe#w0&u`04RAXFc161bNh2^k zS?_WNLAFA>12QoD)wx=iZxY}WXmMb7kzN^9T_3$67#^tOwZ%ihd`<$_3Z;kAcMuv?lvg;U>&Vdgv8$UdxkW zDdH}OCbKi16GrK3Q4yXeBlp7H(}it|oNnFdOgGX)_o55j-;DbrUa#^S`pGNCzYpW% zW<^4St$rL3F(~RUT9@yfh_Vyd*w7VN8@iQ?Zl#B4{Tk1H3y6`40Tg0lBZitQO-DIo z*^d#P<&fl29Q8eoKgsns1jfe{qle%*A|m_c8M?-(LB9eiG{a3PcjLn9CDJ^JCVphL z`w{DjchRamF&It2a$6z7l9JDeTX1na*X2b71z)H^L{6;G8h4w5bB6G2ldanwaU0V$ zuQ4m^kfs;_#W_94@h*?~U0IihPgqN%+DD(Xq6{f7nnuJ%nh||*D?RiPy2E(YftRQ{ z)-?e{;dZKlv)gGfcwDUh5?1F)8u)b2Al_a!I{}JvBb51L@Zn0XTbYGWV@1EsM88K1 z;)m`k4%G6W|`S zyHvX73!46QA;6Mor;{Z6)9HPwNN#{sLP6MnFn~{(4E8O9uDni|yh>}A>7kC|p}wSV z%>j!JP8F~@UF?R<>Bg{|mIE(GIh4ih&X8ci>rxC52);jKFJo$z3m{ZC#Y zd$CL56{(w6Xm<@)eWeB%2|xrxE6HHpY{k)7qe`ENi zWm=D40&DXK+Fe8E(*fThz#CsFfRSiW%zsw`G?yxXWtM{f3S>=!%%wt>fIKRIF$9=Z zmD9S5HNcaX0azOCuG##?=HDHEeoc@+;D!tGE!~?XG8HXFLu~&p4ZNNeVI86oIq^HB@F0oud1|rPUEtQVfzAR9{{$IKHvIY;BvvI?P z!hv-XSsR6k1h^LMF2F8ZHNY1I3X=(i=TsEVtpU8U{!^cN-j5rup64J$b?aDuf}4P5 z7u2-=u%P+8Z)*PnNa-~ko5d`?DO3FPuvyfUD4+ zT;D)QbSusk5?S%huV~$r0*4OR!}#r*{LP(Or`f5~lW2DVj@hLFre6SHKeSVDWsGl; z*K72eXthVb2ftmNme{RzI*K~YiuMs(Gg1$jn^c4ke6KyyfgUl|;s&02_N*jh|8Yzp_{1ny$M*Q+ z8sj5`H;W~ih*0BR!++fN3dd8RPmJ%bv&nfo&Z$(Mi72r&%Zm>tpXn#~t` zHNZ{=K~BUC7i8pq4YDc$nrfGg_Gy6G39vlcT|GXh_n1zzF_LftWLuomj-*eYN6FR- zn(Kqu2$}^0$K_@Q2LG(XoXvosp&0fCx6JaC$8_p25lM<+Y$)&S4A&_wv z5+D~=KktV9ReapTgw{4l8`v=j-I!G&75Lp3zk%o|3@h+?8KOnY6|WRU^))e$kdCt| zko_=+p@ZX4Xn#i;aoAz^fO!8WbdW}Q0XJN@E&9<73BZK}_#xU|fDI05fGGr+fOZ$) z8wWMOrwoGZjvFq>DF-x2TCp~Vq1^?TsY^xjlj=y~V>{ya^8(nIwG!euYr!GuacL@-~f zQ@2HN#27lbgk7k9jfy2XFb_QXd3IYL($CtN<@?dXf_1FM!d-z1HKjmpL8boI-9+5Q zpqow;Q2PoaHbheC_!{ORN(i^{^13-azr`Qee^IYn)mKj44riJJZ*w}@(cK%=9o{}g zS)MnOn}1wz6(L^wnb5Y25NCeHOgf`!*mFgoVHsxWAv~+L&@CX-0)GV0?=zs`mW3>Y zA#gJT%K~B>LtH37-wgzZ=8A||cQ!}rrpH6^AP1|~x)F@n@n89=>!8Ev_C?U^(4Qld z1IsrAR$wbc=ottJ>1fHH=$s4MVY6|Jy~E~hZ1KhSXJfLg%e67M4rjdwMr}C?T;~G9 zs=r<9>YP;}npLlSJZvuvOIFG%ntTjW3G%*j06>WXC=o#B?w|0$mC(TbXs?2HeENh& ziw%sN^C0R!Vz*DrGa^5>cKh_kr5Op}5wTgQ@M2!ctLW2p5LYo=lWDXQXm^Qp5gqVl z0*pXAsBJXMY75#x6omv=szUfIrUZWxveqktq^;0N_F4hHA4usAtRNfR8K!-OUJ;hC zUHBR3H&aoreq2NO*Iy|9D2^L0oZEtA%H-By46`2EU4W5oC7`9R9}wJ`Haxc%qG)RI zz`Gm&vQ}8gH;|qAC=aG)VA+TlPH1{LkMQ(9vj9fK@$^QVA`-L@P>rmu#qXaEV}{S- zz6+fNVe?_@PvKM)wMq9;wcj5CRAXAU76UL0u_d?38Xr3ijY4NE_4uWw+P1BE=$ zUu?ktwl}NT*Z70J>M<5%Ijixn(x7}UqWXOp1b;qalM~9%H_IdsOGNAe8s#Jw#u5ms zavrG`Mmm3tV0irkn^*vrM6PxZZVE>3#9Pf+@1nZ@Mt}m~DU4?Alr%zL z^6fxyIv()cDp`iUkdq!7DW07U)|&kR%LjJjOH6C|OH4Oli{*jc=jbAQVE00@>~G)C zbAE;-BQ5l#_>*8-{4WryD7w!NCpV$^7bz(-t=`O$0A-;-{t*b~!wkK)68~15 zh2k{+`0l*!fZ6P#9p@F1!Qpolmb`?@*M%UE#u7`$f{&1L!I0x1KM8Tke8T^<0j8K9 z$v|)&WpX8OBlOnyEJp<}8;Djolbb=V_ZkFF3U%N6ywPvih|#ZuKN5EM$8K1|KL2cE z9|m5FKfw1}*5{;xB+$){F(PA*5+dyjkRVn=li3eAfZYAij;1c~I`FMvTpTg3(_q^> z1tI+48j``X1Hm=gQU1psn1F>#Y8s(40Xp+3F83+!*>DoirSarO$xMTJ}3&X8Iok7Bl{}AVI zNWiJMWe)z(0(_{b18_H5C0rHUG1sC6vo4BdFQLH!{zZFykRxCRrr6_S?y$}21uQFC zO5OYjOJ+P2JI)Y$e3tw~{ZO*Eh2a9h7v2O}cZ52l12Ye1iP`7DbLQM_77<&6B<7qd z*&?u~Z_ZO0898IkMfejo`a?)i%E6)I(Y>&HK=&+^tQQ;7r*WdDxh#8z;kQ$n83TqS2CnOo{1x~@nm=Ci{3Oz3r{b}*Xs0hbMGfxY} zb1((tA1W`f4e+hAl}9wbWxr=i?^NL-HPA8qCbs?vh38K<~#%Y$zMyP*o} z@dw6wquhS)d`*S~whA^=o4-TL*rXd?Z_^N14g$-H;4{x;v#gofv>(@c}R)oXwvj0pJY{GrohQdb7p^ypHfh@%CsoY}Kgnz#()FE3}44r6DG58J~yFly*>*ffue(9ldzzczs zs09DWP$a+iZUR7%`5?%Y%CGly1 zwki64-cMs_o38a@c}iU(a8X)+MP#;R7nl&+~ALcU~O_|Q83vE-sC=}NF zB{@R4HbFfJe=5lPyn&6Pq$km2D$_!pFWQp$n04c3F5E~DeY%hD*X8>pgFoRoW^)80 z@i3kx2+ujJEVd)cNlooI+_#&q?nTr0U@$*O^N$RjL|bxdVnQ-Hg{VfGmC&)Yc&~o% zZSkf(&KB<@`~gDKP&X7-U_VN5Xo!W05VH(IWN4CgCXkwoEL$YmxeN%EP`&OJP&|Mz z;l+D}Nr1T>85HQVt=>|;V9i%@)-)Ic>Z5<6!-vHx_zqngaqS8X35`>Zp zRBnKPmOMX3BcT3-q(3QE_=Ukd0EI#O7%mW;QW@CblgqSgzX-+yW<}^ZaS)(&tj8vb zP}yFUpbhcA!yW^RcYh~>#N*f7{EJ-CApT`pqL(p-L3C*VStJJ~&J!7k-ULY=6G)^~ zz$AJ8^uqcfoOphUTWz*w+z8W>9y zyik~V!m-Uw^d;yw%(|P7yP)4Qy9r2!Hv0gF{a-Y#&cxn^Jd&*@2Xiu{{Upo9pEz!Aq{4>(eSm;9}?Kzh?z5)+G_;!4x4bAB>Z4M>z;4LAVwF+41i8k}zMH^6i`3=&KW|TLuw94ynd! z9}w6e5%Ju!lPz#lXusguN^lVQ@+N$~q#p%2NvI&+HS7c|YsQF^k!{wW%n{lT)*}vy z*&WKY(JW5JDLr&z2l^cM1Abo#6=ih(*M1ij@!^tFZ@6 z0yXY46JRf`MzS=bu^lWQRIk`$l)^@uCFw73$k+!N4SR|^+c9iC2zRnUdvbSRBt24C zfmUUM?MyUr4AK)A=})vltMWu6A@}33Y9!=7$iFC0<#$mGD^czGtsOb`KslIHp)0(# zFiZA}C>2r56N=r~f_V@yAnAnd1WFx>#W9NcZtuo~Ir%HQ7L)CX`3tsXwVpjnCA>5v zbOmcYqSv!n|D%z2iQ--Z^oox5^L?_hEmotWQs@Z0&O=$$HcF05B5q=u#DMlXO|F7B z3QbO;iJvHb;f~?)NH$nF<&le!HGX6T?&*U}*Pj@NCVrx^Ct4NJN@ExZe?;ji(kzTN ze&npDJnYxyVFQ}Tp<4-eONchisk!|eUj6E}oKv!LR$R|T6GJ1N|I=7z+)!fa)hO4c>bX5V;ciodmuH24lM9Mi{A+@`_HEpV1^4 z?8V=Q{{*{cvTF(ZAJuOp5YQIX8(`0psSJXca0{A#yUbKCw;Z@lxy*#9%e6m>w5swi zwF;K=8=DXTo*)yV2Rg&~vrLINQ3cxzvnU7=0zruo0~fIkxV{X7Rl#7MK1{f<{?~xq zqo~a>vHE#xU02q+@|1I!ZCTrB|6f7abe*uY4sR!Fm+;%Qp7+=#Z9T685vMk_XGiy` zSHy=!Ll2-?COthL;-p99JPEIm{SPNS1#umA5h2cTxhZs%3t>dxz5I(Ld<*}wB>WqY zog}AX-rKIOo&(!- z3LQkNO`-4cn+e|nMqCH2iB=o*9{gs|=b#ma4*M9IZP;e`&9Ied+e7%Z6)Tx8h*ldk zCw>F*`(cV8s<}6@*~&$3V$o(u53!JY8i^m_o(wxLf7QY6Wc+AY>?EK0WjTK^hLXDOPVb0@!>= zU~rmCa8%hTxs|Oszl{3IX0pNYj)F}$Zn5f(OCT8}42@$66A{Y}!Q(<4CR%sz#a$p_ z{PG<^iJ;tkb_Yz%kj4>#l#YY(%ZS3SJ6R#XIWk7)z{Z`C4@F(gflnsa#of^xAx)nb zfH|y$D=QL80TV>P^N`KuD438iy=`)zL##=hBmZNbzyW-a)Wyjdcdu zmi4nUQU@CLpt;hD&kmTq5r>Pm5Qu337D4ntjr+{esI}pjK^tF}iJ%Xyo8|q&ur}61 zjYOn}ZMA3M*2Lp8V3n=gJIM&9hd$W|^iscP zD)tpo8bN9pwkN?B4g7^y<=yYw5jADvq|&ix(tI8%3I=@zgVO$sTv#AONX1LuDM(_( zfk$7ZVa$htMkc+zOTE1Smp3{w*4n|<2JgC;^zO0>qpI zZwij2E&(YX5bY0$M>_#45nAm8^$3NoahS-kM35gzi(C_?GDZW`uu<#9QBo<#u|OsY zz#XZuefBKk|1g__$brnqs92XC`te(gPaDI7M*^c}9Rg7UAZlQF$4i0b!<$F8jKG1} z<1XCD$f&+`RP%(FMzu`ndp5_|nF*j{#Po+h7>t9tvaX`P8GGqy?Oq`EP~-QAK(IM} z1y;1G6IlLWy}*h+#`@!Nxi=twPaf5(PV3a>3H@3JmXl>&d5{eLV;8V3WJhTJA`qo{ zLSIyb>eFcWIp`zv6$}pwkHdL^X7mS)b{U{8t@#9A9c>H8r{Z8wl=nc3qUL-)gjoN4|!q z;zwp<7raDfL_r7AV{pfO1ubDFt)|@JT};OEQmZW=cff3Oo0u8;_z1~>LBYkIb=;B* z21zIt$$%Bl>|f2akEI135v4~##zZX9nZW|V?`bK2N9fE#4EYHnclap(n$D@S(5%|f zGKTV9e_KmnuVYU|Cid?mg86~Fk|iWHjTt~N8FyR5X{#Le`de!PYfLGxTPe#J%ebp4*9tTX6k41SLH1MM|n0 z(OSMl?7;n}I|^DXLgJtc4Qu{reE6YxL+7uLTBm1xcBxtHoVpL>O#`xSa4?B_+; z0H_=eIGxauY3sk_LR+uR)9}q<5W-)>i zHP}r0x*P&jFN9KxZWyVF_8E>O1Um_At_bt|DLRLsDuYJo%pYnvLEV962vc$qG8S_h zf}zogabgp;G3vlx*p6wm4lHG46oJ*K{ulk1rT(*ENkN&Cdq%ghmCB{nn)CSmG!m{bJ~vhXpVMV%BwszBMB}VMNj3b~MtZE) zz1-^xuJ(|zI|pU7SHzoqZK$bK)vu|=N~MPXDDB|E6_7TnF(X$Jhta^=A-d?sAUKSM zwua*{8U{Cf$o!#R+L27aLh z6CfU9X%*3y!ng?pwpuW400RVy0RhpURi!si9my~p-1_J%l)EWdGn3mJ7UPcj4q6!QWu&4KE=NuWTzlLxuSC=LuhK)q zF%T&GF{}WxAe^Y3l#la;;4>J|EcO=DuZsX003dKYA6OeBfL=R*uCf7$hfIX=w1#x- zx~Pg)rKDd1P09TJ?<(hP3OQ#pjb@Y8p3No1xpFo;J2_@^2zSiYXvxGt-Jy-MrC^{K z&F#=R>I?dZ2=snuXG?I)jL*EYCDd6@gb3W(G3NyOKjJ{_JDR|=XkoY>36eH};2DOq z&wqIox6B{W6jt8xly>EZ9pY#2E9-dnE$0}8amRcCEfl!yGYiYuf*iCKTF|y!a}~&t zS^Tk|fcBtY>hhr3i6gE|yz4B2rxV4(*zcth%op%sR{Z-t{J8bA3osNNZ;L|yPe1pW z8CK&yb1j%@L0(6w>{$FL1ren6l|PUdhW27N7W{~7eWfe%H1l`dwVofJ#h#}pEiN3# z{&RCF7Z!XS+xN#Yw{2G$CnON3L>a-9yHte?F=fT1!a-7=TvYV#sc73Z*a%b|xA9OwLW7nT8=tIR?4eO_rp3t zo4@%I8cI8sZBJPY?dB&4$`Am)Ih*6ackzcklW+Wg;3rI@<^!41ZwbNt&JNxVwSOWG z6sqBrgzeOHtD!ZZk^zL{?_}z1yX(pK>B+?iJi}r&l$r*UBbQFDH#M!O2lYVpfnTx< zo}b0DH1Q|X;OOEp=)d_=IcImJsJmfs?4W)Aoi_h+@-MXleR8_(4?2TOR>sx{YbL}N z(BC>i@QbCkOSqrG0>Kjw6;GS^K9na1Pr!2d#?j`~Xd)HV4eP*PZ^p z2W5c$npq~}o6BC^%|dIqJI;U2_t1vvmgj}Ac>F5CzofXHgDHYf6Uk}BE_Qvvrp?%E zyt0Jl^9%?ChZt-oT0cf53$j>ap(2a#Q~Xr;uq>;A{<@9omJY6TO8P&}t^~e@>-$gg zf*?$2+NNp=($-!??J6&pXBWFtl(wO&swJ(KnvjQ^5pmV{C}Tc<=%77J@;()+-2^}`ybA0KvY3Uuy!cK`~>c0a|BEm z0yXO)Q$-S}UvsvSrcNAXn+e;QKq-6o2S#5Gh}}a0YMar8qvJjwt&zE|bIDw^c3y29 z$~75m!~w0@mLnS)i-I~PwkohNkoN3PL}iWpL?)zhzibwIx^c`5jb<(@{Y#-y9Z=hs z$Z@#(01!_Yj#k;(_2-|N4rpsetB^XDmQAlO0RJBpKci6E*oi_wM%{>iogW|HJ*S6IIG9HY*>T zN)gQ|WD8^g->3E(?fPyV2U$&IC^lTh7QRef4A5MvJupH@ofv{sJ!@g|Q?wL84{%DS z&jLi~n_EZ?-G4&eukUDfUkLsYek+Nib>X+`Ey2o9oV6d0lDeGsg4E?kVDxxE%tPs5 zHM#kp0CoDvT!nN-ey~<(nzeFl3~(+5D+6TvE_exiH%KHGKRoEMxL8cCA|J{@6qGY;LL{}3K+fb(#!cg;b%s{&dRHYik zj<$0;Aa=KdsE<#OG;B~e0<}aUvq4%E!3K7d zVXqRXTrbmj+c1D~gbYW_3P5v3%xr+zilgMwazWnD^{3Ht2oQ69zV9lXKUpD_Mu#!M zFb17%@=&Ib(xyM31;`PNlP-k@#vu8%bsy2bBIM zAefmwKk)R;2k+v=n6yQhwE4zt>K|a<|A4hqiNa2Wr9LAk=5Ea;=2?`On*qXfYq9-> zSK*JN)Lulddqyz2B+;zv_Af*83j${nBUn@67MC7`7}Tf1y4VP zedQ3eT@Gz&y?jXjLO1<%-G~Cy{!L`YhbaoG0%At#I;^qT71vS7I~4u|G}lnb0%#p= zIrXtv7IWKMUr1)2(?aNh{GV_fDBS~4J_&6AuHEV%=9rHsVhgB;U^FxTs@O?eVY1QU z5B4R1(SHPl>5h()=$6y_N0z^T1xlZd05$cVdC8Q$;OA1CE6t=PS3g6OKLKIh$v*8f zJgSdhgZOM?8@ zK@wyFF#1_Q@=d%OaX()_^RlUy{|Jd&n5>o;YH50LfQ+#jk9adf&x_L{q=b_5DJ4i3 zoAtl4Otz&lu=0+@f`H~4i~sF4)w(iF669ukLoH+da{ws)3_z@ZVVQ7;xgTDD6=eke5$!NubSTh z#4R$Rui$PoUkYe0!+Z@8-9LKzQPv&0s{e~{tK&-o#1EcQ%K+89hJ|O{4ECKWPm+Z9uCUhQ88G?(^O0m8~dOE8{N zwx5Hv@lH3B%Tzqz$;)L7pu#~Pi$_39F?_{#?b%}Xc5MpadH?{PZAo*e5AWsKcyUnt zZee>GBeixu(F{w?mu;)HlZIR(+4ciK*rHQ$w&6oCKrO*gX43Ll1(>9`^%5kpECh^R z8xYXp{G*J|5G#~7#BPa^RK#b9-P)7K$Y%j!VJiDH=riY`zYx5TuxMZ%OK|C^<0kT^ zAian(vz>X!m!I5#=JNJO0Qrm|^ZlEWyWx&{xb2I9eRP+}eZNmNHvpQ8`yznsRct{z zxarU%-=O_=7y8?Q{wV&Ro;OAl+3HHBJVSBtme=_`0nH^(3nr|Lpu_b4@1JBis+bqg zYF!IZ*8P)>mF(@9WR0($dDqZ>={r1`WwU1D!G;w&-L6ZUxkbR}%>ZFKy2)bE4VLNZ z0i*X6bpO`&<V*D8wFn>qIr-RJPxrjev2J?=bE}CR>F=PjT?%0bE}I08?%9IVcw9 z9TZal;ucG>#kQj47d(u$RQ}3^^B4U)fS7O~E~i+8t;$J+?Sawj0>X5zla_9(JK#Sl zJgWnv-@F-MPDH04=Ij1&+}hUkLj~ZrliqbR;G_Bb%?RsUMG_^gyCh0|VDujVVNuq; zCedZomFQ*zqb~=9>CRyc=Z)Asm7sr4f9UH$Y3Guy)1lBkkpK$faco{LH%^mNjbZdR z%G}}C_O4xZZ+KA>Yz#2^Vn8^apK|^igo~y65B!+L4CscCgnufH&ZbXNK##>Ubna`7 zZ3HP{&jnP7H5p|lJ#V|tAT`!sdjS@-nJ6>uSF#FGvI?J)3N-;?x-qRR+p6w8IM}x0 z>m6Y94S+D+k8LEn!Dbv9{Z9l+?On_{c|1p(PY>qumCV>`zKq)An$)Y#zs)eqjLEeDT<6T3V#b4BrDrUj|6N;{8hZ^XZ14u}EBo zEg&M$dj6REA;3f;?^QJ4wEI5MjCe6$8W+*5dO;pkBc{Ndmt)zS+S4cB;?(j39Ma{J z_%GvTtiB^YUz#kUdA_!P_ygg=T#Ed)PH=>l65|yqMTUlxK&UP7RWGCJ}PF zxk)>d@*>>~t7-X48j-yK6{D;J%A}Wg|0uWlpCO?qm$SAwAO1t`$|w5HWun0qSj*hO zm3<(q5kP7z#01Hq)W4J^o~F99Z%7&31(bdb5GEW1#jTiogh;f8b_Zbe%Yfu7R0k63 zU2I^U>O$OqszO97LyW*Yq<>2n-K`_Z_FqBpuX>a7yv~*44D8csMB`mK4cpTkA5ci2 zLI+~zgVGYKj7OrEaNr5*aiGS7{D(gq&}#(Ut9h?}2wo?>Exux2_|904uQ2YLfc`7| zn(sU|I0FhC6Wg?m!II5tL`XJU2#j7D5D4?h3gZ|K`VT?TxPiW95+vN_Ju#K;0pa$R zqeUR!;QDTpY?8*4Ad)&jj_1k*YW6OLR~Ric%?ssNOgpirw5{n!bmJffdw1awI!`qkyZl%vAdZy5#1byINUVqdC4ID|46}B>3Ldz+`xL636~&C zSkYEdUd~PeMlS(KzR`98x8?Qcy2yqpNs??H^7H`IVDIJBu2@C6-3fC0uf2o@I2bVn zlZJCOK!u&cP`34-L#;nUMqsrb50un8CO<Mi@#|1q{d{}onS zQAD=dqEyH<5Z2}%?(~x+Y0+2;nZJP1BLJcM$4{RCUZ5VDhFdA^bxc`&s++{`_89j< zRSa_O?)A5%?!x5m!hz9?1HyE_4wC3fYO>np~h;_CrhSd5`!tmYz_JvW z>Ug1iP1TB;>Ed`;Te{wtv!?+nJeZ8~Q|C|o2*rBvYuLoJ)g|OC%k&-OweDVE^u~a& zt+v6YwCdE1XR^ofg&%P?xRi#=P5^|De7Y!}x@`v+*<)a3GPK`~l$4LO?WoxuG&5r4kVhdc{IbOks0+&6QLEz?sp=jeKVq!`j2;b0K1OIw*Znv0K_R_=|NNg4vn}$2*2lPh zq^~rtmeN7@k%znreENy;jWlp}BN)t)yrzI zHWe6s06)GJw=<_E0u+T*%0bi@#?DG*zGO}WRLJ}}$_8sM_I6KY&G*kTaj#ilhX)31 z!t=-`dF`4^2;iaU||Ze!k~G}Gg; z8Fe$)S^Z1?b^|I*F%o6AS{3XRED^RGlSBvxMqdetFDKadkDHPZ^YE?=v)h29SBu>u z`C0FLVDxF?k+=UZ7M&#F)it(+XHaIA7m>X4_*F~T53tbYHI8ZQ5<8T;>6EPv;FiR-Pad))|{dC`e+I;dQAX)#j~}Rj9m#O=ZY2aR{@sn zQkaekK>o{>IR}9fjGw+MDnpEiG&aQ?>+r?+eL!>Z?FkT@=jFGp7OK0eh9{)fp-vD` zdK4f`cv<3@lz6EXJGV4 zCr!dMo1x^v1%T$V#sq*!izE7@Y*X>G@^IODN$O*}M&spYfDFaIy=ON0Uf%NzFDf}H zg_h_20m)~CJ;tSWebeivEs_`da^!G8@%@z?KY9HYU~Co@(ULc5-1pC;?L~mN#T&Rg zn72hUKy%rrCP236TAthI%}DmW*dZ|6>vFU{dr>moVG33UAU3l+yzVXouTYE?<1$#P zF%eUGR~4fJZQ^=+XsYfnPDnk_H!Ah_0m*kfPNhDI!q)jx4JE4bIL68)ZI1nC8zNd6 zVJ(8|;3zcDiC(`Ixz`Z6mJk8N*aVaY2QdCw1gz5Il0&bQCTtfo>Bm``T zc(*3cxkoL2_?T4~P`K}DGJLMEMJPF60W_EMuLb7gR$BLr{Si*O>td>>PG_38H<1M( z-{cw@^1)0!qVaqAe{@)asNQU5`Z%0KOswx0t8us_P_t)2r=KmyM8gK zj`9AztocKAACeEQiU6Z$ii4|J^1%2@KIR=u17nvs=6wwl zlV$3WcEGC%F9M^-07CYC+Vi(vxJRvTD`^_|wA|?ixzlab>0;68k}OGyQS~H8OaexK z50G3=&5{4RQ>UNsh{=0WV*Ut1ZKCy3igZ98ELsT0AA%v4G~v07C)FrH(vklW~DxUmuz8zu=+bt`VR5X ze>jqk8O4$>`T#22*6Dwxr2-^uD$l__g37#qclJ9Forcz?d7s0XsA1j|PV+um8W+PB zQ^N*0aLgwV+(gs1n`xsTa6>|DtVRTB;?#K}z-D|UB~*eF^)CR)H!W8uzI{XjStbvK zVy{VKZ!!&qhy1KMj~<%G99L(*1+xW+R(50%(zum9URNY$H=&1K4Ul{ko<_U|A^|e5 zKXI^P@p`qo#A|b9j6b~$K!&YrVwUA5mvMMyH5o2HZQT!y-XD;Bx__R!pXjulS+XD( zk^diH$IBi3^|!gZrTrJqEeqS*+buxpZv()D^wl&=lJT`9;ZuRpKL;eoc*^}GXZ!-l zvb-1Rg(2Ee8lug3h-&7*)f0a6eL!SwsGAX|T5U`V_1G=R^-HiMR}*0L?*L)>KfGnp zNdxE&K#c)}`-kmOVcG*-B}c8rcR#HaLmDvp_kb{6Z%oyeP11@>eLHCq{{axDn~lw= zMfbJ5C>#fjo(KrOe`wzCS~yI)u=v7!=z487`G~&YS1J}t(6^>G6w7y@RiI`mZA}w> zgT!cc|HJQ+IvOzg6hPv4YP{gSguu&psO_8w&TY%&+xrhh^Jo6E*I1(Ih{44M+S3W~ zZ;3chers`6Cs-&IkbI*ng4kVugEB|1C08H3EX#cy$7;puqLJ*Z3}AGvvhbEaj&&@; zb#ngj-h{ap0+P>|TQV1tJlDfi>~A}LNKv@)k7XkP$Sr1)Ye zvo6&!jw}&Z6qN$+8DR7|faD`$Ac@!n5o#oxN*5``8~%4%8RDD#)BUzN;ISKO=IfSu zM0LG)zR@y@Xg+yEGcEQbs4dkF%BoESM$Z6*P4J^UMkgMTf_fs2(Jufor?AP$WBE$? zU^XPsiXqUL^Yku~1Q~}V&ZB|Rmjl9dZDc2$DIz(cCOKgrAWSzC6GdLXx&ak_9f`7* zkHdPCfa^M%@(qLbv#1V4aiBM9QUBiLMk}z%O33^ zFX{#(45I%TMFBMzVAG0{DZPjo+ck6uD+5k~K&g46pXr(qv^(t8+0 zx@Qe~#ZRrnVEV6svvD4Gw)Bx4dI?Z+s7B8}PM~6(5Z0U|*1b2d7v}aO?7Seg?+d61 zh|VZK&At$G*4OA_LVIgD7JEtbG5+oojpE~}rz76CsO{OeO;K*kuDN_ma?J^H%`re& z0$pA5-a@*&?#yU~B{1nRh zxO~}k2p!ws67?oDX3nj>xi};K@c1JFV8Qwolnw6;N1`!G2TB;FBl=yOH<Fb0U&InHE^-zrs82zhckiEAK^6=Vtquf zhW?FC&cRYbBOeNdkwUFo2vf91q?&TRq+z{d@c82yQ94)Qf5hYgT+r2H2K*1Ir9}0* zvEHIn?MR%nvV!j+-3tXZ_jNx>!;V1dCjl|#OD}4PdZGZ?PcMoL#avvnnOySQI@QTc zuNh{dj*k|$m=wUg%B^>r>nM&tcMXRm!wOnRl?KGH%SKp>n+%o2cJGs=?n+W`0wmvD zHV1dJ^;71$cVc%Vts3Lc{kgv+Kx3fvL4cS>sA!A>Qe{qAQ<&|tF#Tm=ej;Hy8YV=L z6nMpK(H09mVRiRN(Sq+k)}qZujM0R8IZ!>{a5^#>iu{bl9vKKficrz);di-*wxS0b z-@i}?4eSmU;z5wnSWAFLm?XC1;j{65hx;+cH}~k5JKDc%e&50RanVK$G3U_<@y0wF zj>{F|%XYm6ifMG1i7g2%a(w0hnnsNeUFnmO4FL{mdTMzqI@aN2)U(!|CGfw{}|s zthe9JQZO_Ez_6DGvB1(C`Ad?f)dNYIO~B}N0b#l~5Y2*bCyB3QS`3^MzCuMro~{y;6W%O~S#8Zk~lZ=y^lJET9rL~XWdg3Lz1BlYnf%$TkR~d`XdXo20!73t98G0K3B@&08L!xw(pm^findeg!@XQ=^;I`p2hJ6 zTsC8%rf)Nf)cMV-7D08xY0#;?;RV8fhg@cy2vvI5^m}@z`dX<@ zTC(l{G}j6KFMYB8^JVahh#uQYAJWx|LjW1var4qL!U3-MHo`B!8JeqhFb_etB;XM} z5s8}Kzk+36ZvX!@FxV{Sa|}Mls%*Fn3hUl1^U5$QCx zE;!gb_Jw9-@XCl649ChuYQBI(zwK)LBGPKw=M=Id>Y5#ybFuDc*@NRGr#QIc+bNgO zBe!@NxghRWzW)rb!7uq&S^l6&MmE1 zK#Bn%bSFTjCWEk!GSusi zl`I>iNV;T@L#3sa{f%E?kW4_B?gKPM{LvdI$UwJ$l`Pi^qzM0cL( z?t#vGuQgcLS|o%?qGMAZanu&!YCH0~#jw9#pF-FN?E#D}n|35!xk#ts=7V(T0-3Zu zk@g127wINEnXtKP6^Qmnz_7QAhv8V^M0szw|0hY|A+)zk2gI=X4+tr4aRvLTyeaoE zpyFI%C(3!{!TY}pHp>D{p=%iv05bjiHZ`L~#ZpnfYr(ZC{I7wOLP zsyG)MMN=w&8}Q#|=;;C$m@H2p=#tkmEwMYyblno^2!FQFV%fZK58oljDC)e z+I$R;3u9!Kb%^CbfFP4blj~2=+B86YtcHDYn4M#y|Bvo8B-2FiqqAdQ$(`*W(rp0w zA}z8&lWFG=?OjTPetkNRBc{!oc>6Rio;yW{p%MiT8OWm|1#WKT^8wLi~-Ro|n)#6v)V=$Jn9zM-r&u!J+8gTE8SHTaf;?BG(#;f_=D)CRx ztm_Cxf+(g=dV>g=;}dn)zV{tM|KU{?JMpfeOA=?+vH!h;@bKNpM}4_OzjM-+OXlyK zxL7b=&d=@yQIWg$dOP^- zhpoNGK#!!)&4Ii96G?y#TrmaEvT_PA7f2swa+g>rTWQQZaDVcHDXaelN!I^lS-oWW zvw*Nphf7$IWhETkKi&+m$cn2`X4<>wC7wNGo+p9PTL_-xB@e|34;7D<)b-z;TN{*!){z5X}|eE$RTrEdr1ctQL2T78)&n&2ItN`@j>_ z#K+V&4yzA4Rv*$8iVtZ)Lh*kU`AWp<8I&1VaGccT{jpTZDJ1+)07X9uBsXd4mYOu+ zO3o&tMH%3Xp5+#&^J%eFv>1pZKVz)Y{evud<=-ACeT`W8-?a$+tdLO?&H^eT<}k`E zMe;5=&Hj7APO~2Zqn`l)Sv`5M$n+YQH2#eZHSHL1L*tOWPhzd<{jIIFv@}p%fRcYx zYqrP`#}Po5Pxo@gx3zv2k+xrsw5?h`p|%J(^TSD`&*}#)P~i5H{H6z0d)Fvb=pw z=t={s;<5s!+{JB}SME>c)M^DYCs6*NaO^J!Mc1bW1Ubi6xq_;4(js)?2U8^ zF#1tIn6>AOL>D(-qWcIKeJCJIcR;esHk5shDD4-V{@Fun1zpGZ79eKO`$OBX9Z?=k z+E=S?9NDG8{Db|yWz6bgRCSMVNrjV=h)3p1A_fAZ{{{$H^>5AJKg1a9TFEnIcQDNlUHO?g-CZX$h#&+4DKad zGIy255X|OT>`fQM!d(&?05PyelGY*|!e7N$pdZgEUK#kM9swF8C3l(o;_rq zZ3dAsctJRic^aG5XNV`Wtjq-XX)|)dZSUo#xK%L}ERFfr`a+ZDr;kkXt!JBsvYw^r zCP+O7dH205^!$xWxi<=P8;FfU2rI^7-fwBBZf_I@w#ECehP2n(83w5PED!&=w0hWr zMXfLUZ}rM@#nb(al>qr79rv9~+LK5>1V|#)tQY4uEs$xe6YY--@}7N%)TLzhd>f+i zMk4_kzlD?qpO|iV(a=x&q2AVrK|{THOs2Zkb?l7!u#f&Xb}2FZ`*&||kp}CNQ_^5< z4UB#j5On&cCB@{{_O9k4oR2;XX&RW_)W^M5v{=%blW0W~+JK;Yy&>Vy;iUJ27BoQG zYxb_@Q4~6hhEzt*&qyWtkV(tqk*7$D3CqLig}odvZTg8vqO~_kderz?(jycYy)+=q zaEnbhLi+yoGJtcj{stg!@}<1*Z?RHh{Q>R!BLHE#_jrk6ZeiZ!itp(#5;$t1O>F(S zon)J!jB~JoxH-e@4$17YP|@4s<~^hC%PX6!T=Cu0e&D!8J>*s~O;$yjf!b0Zi&8aV z8m~!nn0XvPaOxWa#MtY|CE6;s;F6gp>myFgkW6jHL$0`^1#K6bMvL6=ER(422TO4N z4a~yVpjj_WFf7s_>{CsDOKYCafadZ}Q-HX|w0LS^T0My?zHKoCIKc~z2z6x z-B;FU5HNZ>KwywLPMCAkP>z+epQ4=bf!V$jmUANhTA&Q#VNRSsS~FzD4gem;GSgc) z0u0-WhJ$~RIzF~kGGsI`dKMroU=`colJ7zQ6^rFSl$rDn)&wjIoqu0O1tv)7CmgY{ zIRkFNcsbXM{s?F*+jWEEXwuBMOOEtrff`e3Q-yf@6vx3_@g2vvkP29jQ&?^an;sNP&pwj(I-zXj(@6`=HZ_Y%A+A{uYf1r} zE5-`}WMuYH2r&FYWFh!0qbX03Z}i3c8pk|YNqxe-eHg2{=VH06rf)UB+ZaaQZseb6 zO=$LzVXj_*v3z(PBxrG+^{;fG}Ng%%;Lx{wOoBAC@Wt*oBrYl*)cCWc98llq;8K z-uw!96+=azKiv*yb=;638g$~TO5v$6*>l@Xjt*Rm6sAb1P=-`A z-m$ri3$o1pJ#6R%g}d28$ygmVp!8Y*G2vC)2CDnKOn49&{eYmWAbY9yCW&Dnc_|DK zUjwn|ad{y28xJkCdw)U=c}HaKa@OG@lC5zaqWu9N7PAqeMcD9F5jn|7C<6EeB^Q&a zI&MEN>V@%i4_GbuorsZVkpJzE#XdsHwVT~4DcgKCH9IUW$$fNAvgmC2*+>sy^b|l? z()TZkCkCqf8(2j=HRuAko&q%B1B8}<2(gA2N6B=__n2*M0l!ayfL{UR zi!^+$O!^s-mH>#yg7NiIJ$3*|PT&8#GR*eeX_RHEv(VL72jes44ql)RJ_CqN(cY&i z>Pe=kiZYBB*H4VU_NOF&zP?tnNCYr?H9(m4X_;<`Ot+2bz7}*ZpOyIin;(0rEyC9%N>|OwzpZ*!_PFtEvxzGiuh`UB8GwDpZ=kZ3z8lC^D331f( z=hU;0RFH*Ln{AX@NifQ4fbtk649iesxpJ}=EmyFOF`llaceB?jTTGPWZC5$|Wy!w&5~R}r5=yA!=FkH%YfOJi1l_S=6a>SIYbct- z>!n|1X6=Z!BtUGs3)z;H@w}>%o#Xca!4wVuvMJn!<;#0v!030yZMK83w78xSunzk# z;nof0g8!_*%o&&4kgse#eolmJs{pd~u+`|iNG44r(xw0jQgz(*7bKf#-gk-O#ltp* zoN}UajE9Cq`YLS;d_>6{>>q6rRU%CR$QS7o1d2(D`|sYr6F_?fFkiH{W>~Z!T~DNE z0m>76cl1L*5X zTQvX6Z1>me!3bI2G!yCoRKxChN3mFu8 z*7N{zSeG=X5;DF1BCs&^*T~Dpsfi}8-B+VCFCW9Y%PzUENa`yRAnt4W5h?OK@`=P~ zVD!%b@x{{3Ct1dNQ1kO%8w;Kv0p^SL^96GETZnWZK)y&@l$TemGl;Y{Kt@uCoodS5 zkEe6vXr;>swEpm+v={S@oy*!2tHV#3f=X_YNh=U(cBUB4AEukV9zgc7QqgZ*F>t&T!IIL`fO=xQ^$qmh}vW#SVcE!a_CF* zKR&?m+mAA{zC`;oKsjj*(%CP{W{x1zWPp5;29=RX1BvuL?&`^;nwWh@!Y# zkT78~5t^IVN2Iv-d48Z2hEg#u<$lz2shn8z zU2AVlhGoL|+#$?<&a=9fm=t%KGzCC|G*qfOzkh9?-s;b7%^4oTyH$3QG)Z$p5rf{} zzJM1(0TIqs$4yn`4E-Gu3_D>H$jS3ImSeU@wUI=74ltY9j^|`%J&52srbwGWeO@N0 zO9Wl%A&9kCG{?503_e!!)=lP)cRkqoFv;3|xg^ z5<_Gm%CPR{s+{D*;xqkdbyKq@pnSSpcL3PU?7>9ZOi<}DhcWo@>UBkW^%@9f`7Y)_ zE9!c3#dp*-rpb~dd-JXob;Bmu!PE>0rnrH)GuI#q3nqd{}DY%`Drh)yT;JS$rJ5!$kqxlL933d zkR!TI5?c?ja*y`hi5jkRYY2d&eMF5`UlFSUlQqckZQ*C*l`IPo~}?BhJS@i zWcWGNc{~@#dLhiXxpAdB8`{|FJ%L}y)-4Y467NG$V~OWAp=}N5HzNT(>8)KEtk$*& zr$--jy*k>lOQX>AAc^QIHi^Cj-}Zz=6Q@V}>1oj_fcTcefFL91lpD;q6uOwzU{v+p zXZTs(g5F{>{yWu22U!2QKmJ?p;X~@7A3z)z3Z@%t5d4SzOzsOz;x^Jz+UrmxdF5eq zBA;Qi890x2(pwJONnsIs=}Lbw9WEqR>+jg3<-PIta9RL3Ol2+vF5+z|+dx0V)cPTS zeA%+r0a?>TkZO8az__=%*aKRsR_2QD&@T3r&EgF{q!ym4OoE&Q$d@4JFPnmB2xLF+ zlTSgrpJ4dS=T}gE>y+J2jX#I)=h^zcn+@;&Zh(T&JjeShBmHG#EF`|~0+c87zLH{u z1@8Z}fgjiaH6BO?D9;t&1}FfW&`KS*E<~OU>QI+=K!EeD+5K!fIS1TCE;2nv`(J-* za@tpZx&SF{#nXSZnxWO6Pta;9K*k6TTViVQ`tzj!LIX|T3YajaY^3+D$h2o-p>217xcd}5M;5c) z7?c^9{(&UZ&s^~>(=^~jkDA=&?w{l?hfZ)@iI z2dC1OxIY1-{{@H;P}VhjAM2`_KNJx^0?J+mjCo!|PO#j2hAX~J`I|@{uYV=AsKpiE zEuICA`*?2}jS+l*kxZf{^hUKl-vx~=n8deaMP_vZ<4c2O^JH&rrN>y`0L0AiV_jq^ zaFr{*#nJWy$xU`(*Jd@@$Q9pB<^jhoIw28REt+%1cZ*8Eaf`NzcHA~a**Jf1iIT;q z0atwUDZ|ZkJ)MmjVltnSB(X{4if=Z9fn#wV|BL;v)$@&islD$ee*ovp2m5czK8X4l zKKKpiQIA!ZhXHmn;qS0JnjTHHMKUTt=Huqqii|3zWx=Q*8f~*J3mzoPZ z%4+r@(kTG3%rjws%Z903$*U%5`H^tcrlEEVEnx-Md^e$QQstStbfhFs51%+FJ;bWG zpZPu)Rd>M=0m|wyec?(|xK)}Ra0^jpi9Z@A_x}#peD~i9IBwGMxZNZniYvZbybK(- zIK0a4c_+#Y9EOWWmaX2ViuRO%a{RAWZkIOt)92 zOL{h2!^iB1&`00Dpq;JyQ0kjl`66AvRTi@ukuC&CkgD;n+1!U|)JoehF6%JJI{!Jl zTV~-$EcOA!8k9L8g-tM5a@)}`3&l^e{C^5ne7De!0?C~;_eh=8u^Ffr@f4Q(nu}^jJ_NYW?h&Sl;nD! zE52KF1P*dt2&H|Q_X+OQ8@J#}o`4Qd*5?=JTO z$6Y>JA+@;972hom0mm(>t)l!MLGS;o31M8J7P*ssL137E8KzU=wD~l(QmSc%dDJpz zBd+-Fwj6NWqRtMRO(m3#{PQYG`k)+BbhVvwUKtw$`@8@UGf723$TC&{U*9FkQj06T zWqB4jJAY|ykf-f%d4W2r2M~9(hI6>NWnP4eeqe!_KRVu%x{E?ZFZZp9>gTq_>w+?~ z3dGjQGS$Nbs<3!kp56CpAi2pAG!bg~+aQxsX5jMGw6_;q`}wH(-r6Uw*31@tuSgwt;)?H%UjvT&2*!+T*~7sV-z_dt z3v0sEL21X^Pukm1{|I2rvkPW&izglJJZ(8p1vqZ82$Q%7l36G-u+?=N*cfF7HoPJ6 zuFe(6>+Afd1d!aMQXi?wi(K)oV)mQVVXlJ#|B>QsunkJg@YnOUU_Ya5oImva+lF>V znMwb0we$fVfqCxY{ycRj&A!SOtz+XcPNm&8|1yW)9xBsn$c( zE?_BRoox-wk`_k0fzi7G!rgxSt<>$isOTf`>jI1#_?@jsZ!(7*C^?G-!(lJg~tn)a<6g4w{kB4$6Z}PG7>_a7K!QEt~RhR z%1pVohYehUveEw=J#A=vl(F#ZQ(Zg>>%t{^?v1@mi?A5Sj!t;kSlv%N_l|hgIHZjn zYs0F@YTtY<5spU%H&so-@3U=vzDAiB(qZR?;zJ-H9(rVqxvof#mqlJF^NF5 z%(;N?2MhQ9i83r$z8JF3(bKeu^S;{*<-!e2HU0jR%yR1{ReVPeeInY(f1ja=;Qs;2 z-027u^cJzE2n}!9BsEaBm5ID9XT!mLAWL@=FZgE;9xG`uUdj1$?X7d>e`o+&pmD=<8)Qm*u6a!RQD0TH8pieX3QPE;K zT8OT`MVY($5d~ct#a=h}1)fye7noN#n!gD<4P1x)Kateuhi&>kb78AJQyT!-Aaf=(;uXfLWqs-7UmnA;IsOWR1nO1ul6Ti^5lvo68mw+1u zuqP&dOZ>K|=*_=2nM91Vm}vSdsBo{xY^c6R0Q-J!k?NgMX37N#66>j4@vY}b;J8Iu zgrp@*39c9|^4veWP0>xGZWInlgr*;g1C!EsZD26UOu6cw#QX=Y_!cJ_IBv15pJ0RM zuhvx8@ht&W^kyhCX&ua9LX1i%^JaC)Robko2@eS1@112Tml`Dn| z>LkJD^?pKR-)#}3#Hk6ZP_CUpKN~f$0Znr)f?^yQF-5oPf0i<*xY%R12wK7*uK5+{<<)5{v z=(lR2@pHLJ%_ z)t`i$Ca*cgW)zMxGpdS$Wty_6=%Ksl#!jwHnf2`TCdLh-LF3)@MO2u}H54o^XHe0% zg3F{rJzYv;)uk-P-^`a?%D+)j%I#@RrRNf-axfi#e|9SVJDp0_vrc8#I;XPzb(d1L zYLv34kxLmcI7-=?>Qv@D?^5m-bt%=WxRe(LL@9%}IF&8!G?y~2qDy)GL8NkXV3cyH zjZ?XF#;Mc*gRaw^O1DUtvY5?;)u{QiqmdEq6O@}zT=(sYhf+0eaS#2ZE+!lyc;)C}rL%r&4-?Q;FQ}RLXC3Dsio&l>7KQt%*w+ z0}IUR7Nt~&1zOgQQsQBO8}*`;N*$v#Wrrh5NiXA4CV}|oX{S;TCQOD2Z=Z51J9j&k z*eI9M34i}M5UEUl&818UfSc+=s5Q{^N~AKZwo~~4Un#hcSa4=Qpv6w*5ri2w!>OF~ zcPjH&I+frboyz#OPNiI3m(uy9Q|Z_MF;oXUR%=e>+GkP9J42j`24C)f6sfpJM=1k0 zJC)bqvr5IC$^w|PN}N*}u*s?X0vB{$=2W^O2>pGQY zh=H`zk;>|h(EMSf()tZ(*EC9rz8MtJ z!Kp;Qi-3a*|GF2c1kc8(Y4220U#7oNO7b?Ra{i)IiHB>ur(+ahv_v9~HeeWje9GBQ zSq3w_+a^jWgP^Jn3sk|_?g=K>Mnx&-Ve*&mv{a70AEi{yZmA4M@V%=?Di3-)m0NJn z6x6@Pe?Q~D+8vxTE{p+(zE8 zsqUVa9GI{J<0}Inw~=U-*oYLa;&wshh>WE8+kkDY@1X`G>eSA-(=0R~DW3Qx#or?G zEh(8-(vv()re(!*|5=PuQZn_?*>s=Dd*Ph*gyA?BRkwc8VaUled(8iJ>EXF|rAX@c z;b5(#w#FJFF$jJ6r7QS1CIOdC9}yy?zM8f}O*^ipO)o_V{J`gU^i03#HNCU|oB}24 z6-51OqaJS5M-NcbCWN4@re%O%qXWZh#rUODXL0Gz<6mWjqhIf>X8$owO8S3%BP)>* zew%S=Q_K!vOgXDW7dYQlF->5DQT3iN~| z)Gymv>9IbnY&)1Esbv|{jGF_{(DG#${LV5YNR1B2>&&rD=|si$Wg!sCzT5&vsGGi2 z$H#G9vm6>7(C9$#;q7vHRQ2rhepnPQq_!;6ukRM>fuoDP`}aC>tLb9zXOD5du+JMM z5yRQrJvrPBdehsNtHRrpaiRn#e##CoTy8tDKcKnX-T@$X`)fX1l;akL+wnw<-0nH8 z<8;JmM7}h<4yR+ePELOTR-z}0IlYc$T=on6VzOC#y4EIeNhmDs~cRw2R>qSy%d)o3O?xfApVU@C)t(QqA_E6 z40a9}-m+icoa1j_4iD{pn4NuPV}4F)i`N6LB=^foWV3j(`f9!Pkq;gl=IiUz=J;)m z++HH*u$S=m5^S8?uULzth2f7wi_yU{G_pK8k1M{1aXfLSP{Z;Tog2d#=gc{VF-CHVlHm;q_uDE)_l(F#ezhW< z0TzG|@mB-8bnD*3bECVr1PnHa5^ZXt5~e5-Ck6*Z$0X0a2hs880seSvbn%~Y!s)1` zrKS(VL;vK&ckr)g`}zt*vmGaf@fkt!x?k*n>e`mAlbVM=X*~N zj-Yo@jZ5E(e-VIh0=QsO>=^ule8778n|+XGnq+WTuw#S)roRSwG=a78-Ya8OM+2^w6El*nE%$QpwzwVR)y+y68=nn_Z-`5Scj zb}kvuC&K_HbO?rPiEdi}NaG&|s^hvL-1QC!RwN^itR`VfYAe5(cN`xbz*U zz%4T%sqO6UEB(B`)rFK5L9-5)!^#2#JY+p%X|TkM9qF(5b^o+c-1^JRVQsWutkyzJ ziwy9zuGDD9@M4ZF?DsF!+8KSfrq&5=v~T#;m41DK#UkdEFGtSRvi z13q$;xOg;yb ztmfebiBotI_Dlx1J zg61iSSI{da};GJ{R@)G1U|`u^K`EiKu4g`NF9I5uP{EXIggZq!4IYAS4LC z%(**xDw{reQ+OQMrKZ!kuDTyWG~V7^3vY+i4pd?)o{Xs;sKiuEtO>Mdf6SrFXjud0 zm_t|4m72C&UHfPJ`Er@(3!vN3_;ckP$M0l@sc9$hb=jK^*)Zq zoJb9NLrn`R0X0gSa%eG!ye8xLZGkZrmy*b= zbw{Ii;a$~)OGbkc@s|q03B{0=x*!~4kg^M@XW z;x5VqB~hiJOtD##J(~f-5R;J7LQKWof{=zk)*mJ%q7|`AF*03LT_B8uSP zvCj0vfqzN9LI8qn$QXK7{x)#kCfTegqcRY z80ukEr`a@Re7H6he_@)c0kFbOL>IKELo0W8*Bfm33W%yfD8kC`j6Iu;)s~}O_^^t| zc_3EP{)}t<47?W&?kVlU%X{``UM>=Mt`Krr#e?VKFBJ0c8eSaigDAU|R1>n$8$=(H z+We%F8jzWc@jpWU4f7N^kR1u9>fI0`q+sg!*4vS1VjKYz^kQ&8{M|zO4>UiI5C0mB z^cH}Du6c}OY*`pnKZSPNk;6$t{q+ag*$Zx%t1kM>lSRTNEcWz1|6qx=raV?&8dhpl zFpygbIT*;s(ApmxgT@8%g;Ox1e28DMGD<;yI*!Px=OOX83t6f_lZTI}&zFrA9sM=f zwkEchuc6P8CXW6xPD_X;Xss zlrm~zl=2V$J2thYat{CX0&E8AMKDMDO>3zX#eZT(j=vh(CFPj9c58RfO?c>B;kf&L z=&cC;(ZY)=v9(gC)~0+N_prc-M!>~Zj@wjoCpuPQKjw8je(=vb$mOrZ{}$92BR6y_ zH9&5^ve&&cwqyPAHTQw`%0X&cF=fIbR1i!FJ7dclt^GQCtH`ZWCj3G4C*torv`?7Yl0;PVt7cSOzjMsl)UoSeYoIK&z4F>XtfdL8Jn6p z!nBnEm^OREeYJOTF`6BXRlK^kD<(P&ZIZesCX---R7+hR@(j(EA-HD^Z0U%Ms@G|z zNu5sfC)Nbv9t;Ftna14@h<%RM#aoIPl3n5i8$t>~e7HID8Y^bOIPjV{ojZ}6v$J;jD$7<-dr9%nCz zLn*lo{p%T@RWl4zNQYq0)T}xvmFON~FdDI?U*9BV*?X%;E0!_!3&q=>8t*_UxeWd5 zX_r;AGFo=cs`Enk5Wkk8CHj_b(6{vH&D!&0$Al`#b|0^~5@gD9#esvwu`NRtq@eY0 zJ!q@McQ2jo?Tw&mFgFNlcyoGS|l`(-~Ha<;Y7duv4Ym3{W$t%QBG=iijX>F6nC`ZWA|XMctLo9Ps2>a*p3&09X&G98@A=@rIl(!g%&bYUz39o}ojK_5+ z=B4bWF@CNm_(iTKikjM-Qn$wy660`TUYyaUxT9!`_>$P|VBZ-`EH)qjltbq-?*$~e z9=WHJdTPQxFjF^oe4?&(6-T&-XWkER?DQPCdmNRT>gLHqC$*VzQ*~5z44c|!Mp&?; za*3gn+bHUaU6?(p0Y7YVn;E@=9o6tr+E>78?0s6@tK(ln85CGGx`Nfs8S0A6%zH&s zgK!?vG0d|g^M0YEj*ssoPKF4Pu@%(xjQPpS? zMooI$GN|?w;e&!2wLbU6uWNWEgGopVJQR;rp~&$3D&=g~wOrJTRTky5bV) z2+Plt?#7=KuEb=X3yg70Uj{(L3G6shJNfavdoZPO!}v3WQc5?7NuJ$u70~Kh=HZz@ zjbk!r%qZdL>lZ%bP6az-s=FAX5YMJDi2H@A?sLkFkAfT(aV$aS7n$cmQ(OVq+?~CV`Ji;%{S5WX zUqO!bc%~k3=-hz^nO^_+GmiLs{uHX%I*|fvI~GsvlpTN0;W(^rc6YxBSbXM___Gej zUUl>M4pdJKiM)F}^Faa6pP3H>9EVZ^q9`_T2D#tVSeu9ifo1BWD0{XL0LSQ%_$~;$EuZm=&ruFdmByyMq z_$Rpn!X1qRX7V)5Ozj>U0oXDVw5=-F}iPa4HL90&Ar=sVtvO(vaR>fLr=P~zwc%9qaR zJdM2<V*w}Ll{?((P%3}W!#YyFreh1G4CX%LD2T%AK(N2XP_hK^7 z7L0N1igE0u|Ho(gV>4+CvD9dc#DfthQW_UQ+@+Kb%yJdL=~F*{Jr;Z;vQy`t0~1fS z5&Lm!LM04@m42Sz51w%+eg%}8Ku>{ECeW(Gy+ci?i(344zxb^+X(o3Z+3V>yR}iAKh@1UVCT&HfmJi(GqUfv?#E%#9+T_}9#JG-3&o0@vT01h zPIcl|`XKyvS1_vEU06$Oca>(gO92n?ODY6t7`6(o$N29N-e7@c5K6A#Fg9b8>_Y1J zu^^4e0QZn&SLxJ#w>(>kVRj+!DyWD_!TlBp&@EKzPQ8uQo>KzVgd157WgV1Ol3k&m zt=!uA8fQ=o!Aq48BQWn?`EP3)e~Vig!9FDW~eY0QW4XV7{|IjD1)klf4K?QX-ibwJvvZxDsx}VIfWiBX*`# zs{)B4GE#!7#3VNhz<&i}wB%-iC=|he#gm&ohhAfni)J-@ayP4)L-CdoJ=1e5B$Z$V zPo5BSY^?5ggar&E#l9hI04=@eBA{Lbk!(jUs)<3QE2yobET)&o_F)~RHeGw3iWIdC znmwnwFC*X$F}&Y`0c(8(FrI{AUE-WfoR8nm&Ym->rLq|R)mjs!OvZmlP~P-Ql+s}} zE_0aw^Aw8<#R0RQN69`zAROLfiQ!4?igRBKhu|s0?mr(fyii{{NXC`RXRC!_p@kD8 z`pXAK2`~MEd3tSPG&Pve6aRMcbPw(^<=F=v9DiT)n-cTjweIm(Lp(`z@~EyYk#X4p zC*auRV3+P{+DDWx@p}uM0(y8xR;v0SWfGl8#yvpX9-jAqynP9L6h+hbY_cQ)0uvxW zfkEIR?GN}f-XD=@08zF@6-E{LO47qo>WrJ5LWUx)pkQ?{DL#e?Ia zgn+k255B+@s#&YifW5~CPJ2$C_nb}(3`iKA)9q}n?wJC71fcJ8qgS93)&L3SfWU6g zvF3Hl%BmA+7}b~ob<0_D!7(>Q$^u_vK`A&+k-+YPW5R4C?uiYS{SjZcJkWUBiy+{6 zvE;}#Aq-fOmUmvFCy9i?3l9lEd_=|d}XQ|Yc4*Y&pG7bFq&f$S~ zR(mo=g#mYvg%l1Pz|fNejStW%1$c_yTpIRgUC5-PKcv%}r|)O!y_d{p>GY;_=sZbK z7AbF7LZE0&CJYq6Ln-iKtYo?w>_Huy<%~_f*;nV9Nxn z&p!qG6ogRV+X)cSJ4eH)nGmSBCWv{^C$lxIAPr^T=nEmwiCDj9$uqNsaVSMHeg^~w z%0MPL(293=GPy5Q^l?*_E`bFdAsPc^FxJ)+1Z=TcT*_u181kUnsP_hy2tkfcq!#-m z^+UN1of_cfIbUCVay3bkw8F&A{jh@>fTFCJe_nqrm_OS;v4#7@gYHf2yg9I2ToMdc z$JaSP4lvC_d+9u*Yh$~x?igBf^_&L@F9~^fvRv9fQ+{)EzK}Q0@3iv+Y+IT*u}%eb z%|EZ72Gc*!p#?iN$)sU_hG9cv6}@W^fEx$vC60H=Zzm@IDKr;u2ig!zw&%ZKOongH zzgnxqLwHh}8kQTk)l!ej&#k`@VoeLc$JtH&gu;DJoEP^K0(k1-iNSLU&rv*!koN+f zH!RQ2Om)c+OZ%tU`*a6X5Hi1!pQ({&S1kade9rFVh|-A;c|7Mc9(@dQdTp>Dkz#hR z-?Hc0#NH(N=lzV5gg@G7`Ir8Pzuj#v7!Cy`-oUK&~qlz0pw+3>w3+-L;(u_F* zWyr&5gb0YG!=03wGLpzaG3doM7a50LMZ=wHPu!c%qIqb9xd&il*z4YOPU7)V6yN4| zCZ~yY%IcJ>#r+F@LU#J_8{EfiU54MFb<6L(fk49UGWA)fFo~E7&+B-;#S@PK-h=cR zc%H!XB%UDBJ0bld-v7mef8b=HUcGwDmR}v4E_qJ($Pr8O(lXr}Z{AF~Y)SV%TLR&8 zcC=Xd3IY+1AWZ*8VZd7)@5y>2=mk*B>OII&4rZ$I_GOO&{24&wh zDm&2#$8=wnU1(5tu~FHdjpR4J#WoGuIIR0hehv}ZXO&ggmSVTKHwVxPN%0;yMM7r- zBidm(?+E)|7U*>wQv4%ElbO_;fpE7Vf&uT7#9645Bzikj>bAiAg_P9cXkZ`qQ>n-t z&(7--MK3i`utR_fOFO#`Fj^w7UEol`2|=QQNJK(!v9LE4JWhuSkX{|d)%$Tec3a?} zxcY0)@u25KF!m4{XeX|Q=?4jA-zCHziaqL~RkW;e}^ENiY0SVis!pv>~0uXVz+lY3k+o9?4UVBBV&nA&O+GL zG+`Dnvf9)kp$+K^|B&X`HzYnNmMrt5ERNz<(~-$)kQ65)nXwgR=M%6m^ZWsUJ_p?> z3_j5n4Z~WF!b7FBL>13X(QmT&4uze3s^^C~o(pHCWfR6hJB9=72ojG$H1TK?d8!EPM#TjTn8%CB`Gta$w zKJ@^GjZNqjjUJ3o=d119o4-T`s9i!CxvA_NC~+{c1d64)H};}=V#^H?d3>(`@-I3Z|q;DCP1zmMCDofKO>H&yHVuP}dJ7exs+8{>xpM>-6hWs~` zv&*1LQh~xsH}|!AjK+inw|gDAT>=;Q;kl4|T`P*f|IVFCfl4>U1tk}G`Vjqn(|mms zgK|8O(Okuk`*P?xPIV={0nh0~;%O|pK-Jw%fOztffw z4q0N!Ri5u-i#y)3iTV@RweP#aU%8zvc|>?WjeYLQe9MWJOL3D_*pExT?Bu8Rdy;N;9Z&` z#0g~JuVNmdtR7~%9j=I;)QbVZQ*EQh@msN47)8jjF5cipr*eIL&h=O6TwhZ{h%rwD`o$Vg%*YmT}x1r8()VYXu)5s217pL7>Y3IrWATa-G zmfu>3lLj~dlUIv1%wVmt)f{Hjo2#W*=pY38E8yS!lU6OOv+7Su2?dsPTBWK zaEJc9Od&7f2F17jWm`@Xg}V!nhOTujguUv53f~Fxy)I5p$=D+@Cv}%?In8|4Jyi70 z1C7JJ#WhlWjbip^48Fxx29IL68I$961=MQ`5OM|MDRyT~YG} zF)v}#NKuZtu9BayIQJf~oyimRgPo9rqmjz|h}W9(mLjiaW!S0p;djaTllh~{<91x& zj>rV!a(=A8;6zzc8~}h)Ox@P}%`qYzR1s=FM;QeduMC1_WZ02AP@#Hm=N8ZWi@W`D zq7c5GK}`$3$Qxetv;Z~2_>#!x3H_Unq{37=lL(^hqiMv6GMYPlM<7bqOM!5rkSY}h z!eMY9<-B%bqR@e{6v07wAS2Li6%6frO=xek18Co@4vUj*pp|SFw*zHek*bqq$2OHD zw^djOA~DBl!ZzXTPBPY0gD4fnBfKvaiR=c9^+$!uy?~cC!y?fFNjqVaN=wK}^k*e{ zx6N$B=4UFOpHj%pX?V3t zQWx|3CaLzlL85W7#0->Y2c{(C6h8`=w$Q7jI^oj?1JTLcM9(oB4i~nQ8!revjdjlD zX?s!adj8D?Z6#m@#S`IglbhD9s$1E)y;oPAD`)bnFRO5ir|o7MTQe3*@wA2S&xk}a zfL0XLcY||kf*8+9PyLv1I^s(`^=&oJBJhc)erC;Pt+#mlv(miVd|CC)=nqNmnf1AN zyd3(e9VW|Ln`C(lUB;3ux6n|dpQ;AYULU(Odv0iNsBz-)LCpLIe~(0u3@yJl*6NHt z<6+Jf3m<j}!zo0Xlf72Rhjdg?V4J+C%PZ&q}QR`d%)(Ml>> z-JCm8(;G#l-SUlE+5LvHuTa@L$xeeF(3>?|S1bCZq39ec+Cz0zr8g^D4TLfrd}Szl zI~9HQD&7Nnha^JnM_SnfhO#$O*`#K?EWKH?ey!+1L(zs*v|TIiDobxxbdpx|kfG?0 zm?|sJx8SYf4S!GSL3gd}VU%SG3mxB`)i|Op)jFW|h2E?ZY(9L5M+^XBsOU5m$@FGL z$yJYG<7-3Fqpv{!U74-+o8GMK+gjP9hO!$_c4a%V^nxDrW<}>{MZYl=T}nj-wN-kv zqNBB<)rO)EzXJVpCKALSw1Uz!cbI-qq2+08jrH{W@X>h%APcoJ-!k}tJG%c&5F*}ihdg|nm=Ua3V1_P zi}Ys2#%jgB(~GrRIkTIJrA2_l0Cn{ z>C)MPop#CdkRD#Jzit@TqDGJXcoYdF@2lY4b#YK5Reew%Ypn63UPJT-P}DuArSJ)@ z3;8bGLTkuX8GlZlaF={z(h|86BiBVs*byaijXoLrVUCckT|NtUY8Qc!_%$QZ+e?KZ z7M@4C%k}_VUFJ0OJ8N^rmT9qYKgZU|-arNOdO5&gPafDZQoG}p6TagX2J?Y&B;NtK zG!opt;7}wLOhR-pxBM+I%Zy;20vNxuC0Pi|)X^YZG7(Ge2E=s)1|;(xK6zgm#>6&4 zq`~C~qgAw3g~v132#BtV@bSE-!VycEz0fcm9b+Ec5PTQ_RDQ|*1!`=VVQxo;3S`1K z(R;TM%qegQbUU9jt!ZP0Xq4xY)UL-3S(hl(O$@eL_2Y zGWG;UruY+k`N#LN6?g9?mgFR1+BLwtf#(Ms)THt7v?Tvv-y6VI`d-)ve0vdszjFgO z)IA<-h~Nn<$Uc}NB-`1tOtJ7GRvg6|A@ZDB1HmuV8VLSJt$_-uV&V931w$I76*~;5pz- z1z{Hp>DD8!fCzab(XbJ0uU0^Cm0kf>#h0Pwsx=VXi0V`WK^tnoNZs&k1tKKzl(m@pDbVCX+y2^ytcowU962Vji-Q_XLB;?S$t@>u>F2sAQ`Fqv$Y3dsv)?nqy z2gF@&SANGFp|{jVO&FrSZ)6SFmECF_-xXp7$E$CA#0ZW@0<53F5%DT9CF9oux|+lJ z)z0{}_|7!O(SgA!{xLnlus!|t8Jmhe5-911as5VOegeJ}#wMBEhc5l_*>VKwj77}= zH@(AZoGnL?SV_$Q(|o9AAh<=Z0p@V483>-xGwk_KQ2XG8B1(iu0x@Vz{(Y1RY9G{# z+VV$GqAhBHD;kygqpBWCPGbF$n9%@ zuAQyO6utL_o6V%QSgS0=T4f>DDhshz5t7{HtXY=Gnq?ua*;IUZIoxb&xLFor&9V?{ zmW5ceEW}!6A=WAjX|3YuXE%75a3Db*hMQ#})+`ILW?6_e%R;PK7Glk^kk%}2<1JB} zO>2}8Zk2^tt1QG?Wg%)+YRrPHSr%f=vXIuSUG&}*Zq^=dmW5ceEX0~+A=X(IVy&_e zYn6qxR%1l(A#j((86hUzEDNz_S%@{uLabR9V$HHpCQjy>!t)U1*4oAK3)vNUv$k-v zEX0~+A=WH~q;l3SOJwb`Q080g=4S2Wwx_bLmK zjaNE?u$Fsr% zSSu2BLTg6NnSdM&4aP5=l0(+#x1>;l=X_oGbIpyVqwx9P-~hRREDz-g?D)TM5i;~* zb9u3itQc)aQOsXJ1`rmYeJ=~_`IilTZ-f_AX5ZOA>#oH&~~2% zXfuz%A_o8s#WNPqL_DqVbj9=2(SAZNyzj>IAfCtY%*8Wm3cf~!N5bR7(++7j;oSu9 zOuPr-8HeZoDUwro1OZaoR5aQGnMusq&%KU3O|g}ly@m)fn;Zc_klv%GCyq+4Yj+-6>Ukzj#$_A@zO^-FD-b;-JtL@Y6resQu3DW=RwIXIrkBg8z zoxDRhM7VZTaG$w?(;YF4m2Z7JS|~rU_UM ziaoDE9_D7tcCFk_loRJwqX}C3@gx<0_%70V-dvQ26J+m)$eHE_o{DkP4;6RR!v&AH zKtf>TotQ$|?DE$95)=yDNM^RQV$8IW(~^*ogZ($okcy>^DFk$VDm9Xqmi_DNfyS9+ zC?O9aGL%$7g%;-v=%eTS9r#U71aQEf2&cKkBlWW2e8&Bg8K5-$hu zeV!HB*c~!b^e$kLletuWE-#M`6@+Hq!)j2sMDGkkp}Sd_0~^OHlof>9UCoM9ck`we zgb04#?FAtMk~a!{(7OvvG{-xJz~0DSvkdd{)1mP{GOB z9JEvki;&V4!fqXKEY!TMPL#ZH+LU0EB*Dn|e#V!zBTSMybtH{vwdyoW>V`QPlY^K! zJ*c1m!DPGM4R;$E4QHGBIK=8Iqw(z<@OcKZ1;LPco*{V35)gQ2zv(D zyn7}DT4@2cof8FDpTt^^Ue#@{t53^Xu$z|#;kB_1M-6*Bl*7TSg5AHVIga%8)J&`) zOWo|H2Ym(PKkF+Xt=8XoA-WPg9?yJ)mNjn^+kaUwCl<2KPF}+3PiC48c5fWc;&eef zcy!N9qr*!&Lu_b1cf_H?DZ|+#Bo!u7^U-h*3+#5ExS6|pDHzZCV}Pz5!eo@qXzuEh zWuMXB)h9-HB+b=RT0nz;IM%(x?FUA2Z4l>{=RM^y8GlTY_A4Kt1^153ny+xIQ4$1> z@$CoP*sJWFTim-6*NkpNd0ZKRK32CJw*B6!vzz-EHvR)|UPsEL?0Fx`r_>o=t`bW} z^tM!z47G-!7QCBeRt@PrC<>HEVq%K^nHa1op zjs3Nnj;bpv2WHyP68M>z$8e^ z#M>%z*EK|fd>cC1EeKJTP&}u*TRJD?H^O}MY)SE)PoUJ+55ZE_35N;XKU&fzm|qPMgqV0rq`f=QTbcYhaQMx zSr7|j5uwEPcyqT-YGV)huwV-{=lMN>TATeoaFbm8K0#iei8cd&{`xwiXrp)?HN5`m zw-<;K+}WrE+MNo#kY6bl{N!Tn-A7?HAWs)JM%5)$rSwzt8w5rrV{uE#rhL@o`FoW% z$k((69EjCNL)i(_ZPRWg-~YY1Q_6&c=X96RxuM2F^&mlB)c=AMLQ@IZa@(8>boT{e zx$cAup+JjNoIS{A;E2l7&W*ni`q*9@e$}58sYxf16cFSK*cZwvaCDI?YB2UbDTzac z7_oRS?m-3m*y;GH#d!S1O~@O1;Qa}48fho=A8W7FePrm%!eHLDJ#m3C?|O_oZB*zh zz)Z^y?K70)#qtjZ>LqavGA2}2v(DY8UAH-qs}u5T$pav0<;idpl0Sx?q>d$%cd{q! zc*XFum4o>gLX)}$p-p$;2%$L$=L^s8_PiT$tvPR+Kf4y}1VzofAg&_hU++0C!fWiA z^hJZQWaE=VxPG|=;wCG#cud3CqU?4R;GL{?lz^vs1!ikrI!)RC;w%@}5L==0ur8>~ zN}N0RuWg=VF{n_nC9_=|P$9XtWTpx;E6PsUJ;&o+f#hehS>fzd6acFTBq+FFNB&?E z#`u`X40H`n9j-l-af}*v=jg(7zecWp+z1g~mx=J&nmfm@+PU#si1FP!a~M3ygU9NXZl$y({rzOt4NFQakac#~`)9m56DJ4={(@btPV?KvTbZh9|~Ud|<2D zjL4p6`o=b1w)EYYW|BWA(Z3aI5BaoorZ%hOI^{@F;`5pm04#=x#+tECrXU~wEgVFR zj23M*RcP)cYn%0SC$oFvBKU*oVe00yLMF_62&V_xN`|$J`R>3jdhV={kY7h)8J>iM znxEe%6DbaO33h%54}L#7Cdea=3#O{0;)k=z$V5K|v){ObJpKx z;d*%~ETIXjh#nu;DoZC3`%bINk=?hpr=SNUMGBUas?i_X+E=&=whK02-`c`+Es^do zpuf0o^NW9RbA)=8&ln>-m&S6~-^Fcssw6zuo~5$Ci`((khLAgn*cptnXXoJDlDRRr zFL$r+gluR8R5tHx#r;OCK&h>HDnZP9L3pke-u?pm+pC}j{^mdFFG$5ZrXo$OWa(&v z5|n$v2Gqc{h#-wR2BQcPh3Bq8*k3?@dr1XXQ$`_uB}O@e<6=Sqr&0ZaR0*kMv5p62 z3KEDHv=}G0`q!Nq1N|h%pVVvn3|mF}?e3Yi;C~jA_nSL278$X7m!y7aQsdDh-S%52O3ONaz+lbayx+%G;8t2Q{J3 zbHpRuKTUL%RZH-PtAu_!aola#I9kcDO?epIv68`aDH*`jit$-T91n*`+P6c;fz`n zU+QrM>|?nseex|+S>MY<8ojRXG62^i zsPcID!5B(#81|maUau9KCbc$aYTZ46iiSEYx!B&z_w3--RIlWFnJyw2<75NVj^hKs|E1_K| zIupW$BH9FE=Y&r`<<;}!+MjPs*CaM&iwi{5gN^OcGqA6H`Wx(P&{=&8=sP5=0PcuV zxVL-8=M%?WBcU)9Y&-jWhSKv-{OIzS7SR7thc zh1+8(EmgjGl$Uqo*)m(+SayxpHxKC&@3gP+bnJ9}jqkDJ^c4(N*~J zR|rNt%kY$1o@#I_Jud>yAL01{;bp&Fh`IXS8U2N4*^=&Ke;2WZefx|Dg=g84?qh!! zv4ws6jF@q>_O0XVILpfWL8)|s6_Lu$s1t<36^IFI#r=#h8?I<#CLV z%JXHLffc>8kSILMmI@#J?d9XEHkpo>Ek->_aU!TL7@pIa?8_#(#hXYyDPBdrHhi(+ zV=$-STYdvl@ohF-vECY6;VN?4J@ZKGNdUtLeI|Py0`4J+g?GM!i`mT}u6b^fFe%1A zBF5je*LKm|}z^{`&`7(-uuWxl@ ztIWIL3F4Np-iIcE7`g^k6#?qC85-1H!*Ka`FhwN;%w7u!rs&y~1bGP!4qrD&M#5QV zVoY9#k5f?EwwwkEKhcvg%ZDRhA>zV!GpMl3M)%$bLxTMIRTo0+F8pPBDn;&Ud_PlH z+fy_`PakP~Nl)|VDx*Nr%YZaNl)^L_I=}?--xQ4i@~4(zkPR`)$Z+BUN$f6K1R{9* zo4`nKQal2j>41Y3_>8OeQVwSxe{Gd_z%GLCFgoK!-xTBabfO;t8&o{GX2yYW>4!<@MUPBbu*CKB#9v)`g9a5?}Eu|;^~oRlf@ZE!?a!QLfyJ^*AP&EN4Z{^(z$|gv0jawMQe;4q=sBbkUWN3RPIwcf*Eyu_ z21rKgE&{dNZ}&0b>E6Va5}XcW;K~m#k^!2D>q}*&6irwzHuL@3D13jg4WoMy_Hde? zkd>)o;Y}}N-@Yw8$pQ_5@olcMV+nW%*>CLuO*~sNtqXI_Kwpmn^mzbPCBVr(nglq8 zkVyjkbPbmP^gUE20sc*FU_pe$SFX#f8Z`q=0-%0YWC4%_Xl!^!L~MTPe?kQ0zlsSH zA{v^3;uk_9N}Ua991#hk&pS&)L;*r!MBpo{g$sLeL|g;8#1JtJdkz&5(xogBjU(p*aWA8iI1m{kQMu4-Tvq2INBux_J;`1$_gfre18(uSB zoyQRsC;C=_P<+jJ2O%kpsW>4o2ChW-ChH$}0Z%YkDGuzgtPG=RI#C5?J2RSwL_t$} z2Zknzw2UOZ_mExB;gc~mkNnO!Kg)tJfy3t_Oe%bhF-aRI7g}6cbyra~04kM0(rc`a zG$us+Otqn$`0JR!N*M_h;ntl5*`H}w=jL8~Scy?z8N$8_6iH@WW~n$l%tW}06pcW* zgiZzq!T#!sF&sbC1gAYkBfwEQMq!X%@NXstfdyxtq-hoNyefyxWL%)o-u{Yv_K3M> z&qe9k1L&D5D;Rt(HQPV;KM4z~tmq|*o|nz+Rvv}jcBevfcgC^Xsbb-8wKNeSh1_%E z_@y6wc?}u@6A;;8!N`M;C@85Pj}12wcte3?3jz6Jq)!UCisTMxSyy6 zE9Obk0Vl-zhsE|929x1_{8U`1asaN^kF~Q6xNodoDMOhn7(3t4RAie*zm=j9Mt?`Q z@aRb`0~m>RQ5G3|nJL!I45vpFI7idN3`Vkr^VhBA5%^1ryeyjpasxBaCQ*RC!GV%M zYXYF4)dKa+b@LKr#TjX3$@XBF!aA~EbL42s1| zDVb^dPxIu9_+0^NUX}V_pnK0i*?9q6q$k~qB)>Burh;Gw?m!dlpv8xf3KG}fG_l|8 zaSqStOi;$6naE6V8RASCX<`B|MI$i5A6>&tkc1!hxpFD9V}uFLj}(mn=Q_|MtSTFp z7`gvX7+i@HzX!7bpZm87*^v3N`!ujO8NT&8_FAAE79rq66&r7~4&%)|CqY{;y+^T3 zGO^Jb)gxmqqS&CR1O0dMXwz^!6pb*PlU>4Sqq*aqm?##`Ba*+1KUWA<^o&+_h7vN55gr4c>tU@MV*WpRL;we5E!}{lC zbY#mflCm6$sG_L| zE2xUDA}ppV77gJEq+Rip_+y-ja4p7j!a@G~*`8f9K29^M2>zUST1c4@M=U9Kbtr?i z>Mb`u*FmHbni}vSdM9?)R=9BpX=^842N%8Dng~MeiHW|Pc%{(Lf9Y>qPaU_K2H>J- z1kQ8Z6c*Dor6c1>UqqSwGjVw9ToauB6paAqY>zM;LJs55c?@D(e?-M$JuV|9?U;?O0U|lZxEOBtaz4cRc%@A)*)~M~sorS%lFas4F*SePoQhg$UctizUP3T=tzW{7oJ<a!?3wb{%*_l>rZNeFLb@HxaOeszqJs_YuAxouR&4iD0y&nL?u>vD!^t_|`ws1;Yl zFcKZUA5%}D)Ir(@MCOL{(&YCq#&ER9@_V@h@u3x`JlJ|cz`pw4{_^8@yWkra2?hI~H|~Lze!Q z=SFAqVm30$Vs?a^h|Cgg5RN~iFE9AHJv#9)Tavj=x4wDmca1Xj2Xmld4b2(XhPy$F zg&lEZtF0zM=7B7FZ%^i$7*uPe=~399jo8qUq3@6k>O1dOQI3fLUZUuw4B#odIfALd9)-h$Px&4T-K0$6|WL-vnKR?8TtWPLvM3$ub{QP02Vq`d%AVzNzG88P>-$n0sNCvi@t@lql^8%g7 z>nPY1<$(SzbjGlHsbjXDe_w{gP0g&-%gRbBC%IG->kc}!SgH;>=fBeS#!7RXLVD)0 z{V#0+zCn(EcpPb|V&UMcn96yvN+I?1;yapp`X@q~K-s3*zm@?Y*?O=cR(2n}LTa-0 z|G1fnYDMujcu>cn+3t~szB4UO-Nb!7&mv`_3mLQjM^Cfc!>}kFdAJi3Cw>M_+q^CN z`#=qn4eNggRTWXSpW#uopRSlfFf_Q%IpYL(zUnGKYKuw`mq$NHy$FSfF?8PpQC8vl zkc3L=Y?J+`dOvExJgX!|t2K;jT|4_9$iZLCT0`T}svMLo=Envd!n1^*j9;M-z;S9= zpNzG}sBkP`>>NxGzw2YzeEj;#-{uEw`ctfaE+fqw}4 zXBwbkykjGeca?d0QLe&<-(R8JbwUb-V1H5Wq4+-K7Q7hW^h4l^rE+kPsV^reYFz77 z0d=~4n8g3={IS41OJ9pJOY<>d$lMW85dOZG3qtI_ApA}v1{pCN2m5CG$JJF}_*l$~ zh#KWrhmiXaZWBk$?L_O_Lgdn%BD?p;U+6Z>KV{w~;9C^nt1x#J`B8AJO%ump!^K#Tyfu9~ILHnbCew)Z6MY2k}b{o!d?jR9V zgg;k|f>vh5qF*G%0>5PBv2#ALY+D!nvw2oz=FN8_^XA-p;Oa$E^HTZ8zKpo9SaT2% zl(9#x(=2P3VVY$aBb|+r)`;LdD;UIA;G*fJ(&dbArDg;kiiAMmFZKUIXJPtpjClvq zB+3rrD@+O1e$RCyE{96D%Fm6*hrUmf)>fu%Y}K9X$uGe@T_3?BM8|dCW0z}YBh~(Q zSr`15Xs4m;7(t3gm`ac7XfT`SUfcmXFcBW(OyFkTCpC5FO8pPUlPOZ~3zn~leF^ct zX#NB3wFCU4aNpN9FxdDNcfedWGc5+{ z>gyP`lQjeNxBHA*R6N0lg3+Ei=q<%YmNUcC2!+{1-RF8&V}8*rBL6%)SlT?1_@FL3 zkItI0brntXNcX=k>gZxv$)SU0%eoz2w%64&F5BKo*JxuHkC1uo-WAVMuy)5O{kKE2 z#P<*|{*coAJVr(vzgKYh#+)<~lr$7zG9!sHnU_472@Y&w2vhz8JVs>NflvyRiTH3r z#N2P70x2v1&2-`mWP+4F*%qatXKCF#hN2N0x=0Nzh?e^pdZ)~}?{CZ;l0T-sT=z`V z)XAb~gsC$Ne5IMC%BwokbV%eBrg@1m?8TaFm6CBY^O+_5`Ql6n`;cn8Wi zCT(c=9#lVdZB)-`a`d&)bWT&n=lM{>?Igv8Uj0v#^iuzy{)0GWRCCPT6per#Rc|ya zO`loK+Zg8Mt=kf}sb4+V1k_2<2teCIE}=Bnnth?A{;&H_ z?rs0n->2(XkU1A$n8|!T0df_Z{9~PSW0RGcFFMkJqFj3O9i87E*CBh5u1Jn^$;y23k z<;LV(N*Xa)ZVWX7SXNPnC_BsseB?Y#~t4i@%H0d+>O}tg6 zuqcmpK@ogwaZ2RFR$rr zg#-0n2%SGMUiaRKYlBSTnuGw^WIur8VZ=FG8~a+NH~b4C=6ZJ`_f_oPBj)y{x^q!i zE?~WtO12g|6IHh&`6#UC=ulw>xXNtV`t1|Lmiv1|@WBCg^V?<1u`6{^UR(b^$60Aa z&_599uG7sO!_RN2JJnbcL^nZk)EXKH6_4=H0dIN#a876aU^g2AB=Dtt8V3s`9*Q;_ zr-c(er*2?k z+$cGNCRq^%aV-EuK%$Dnm#|fpujkyt>l2Jv7s9`7Fvh+^tScC_5vs~PhjQ}!iTZ5hH|c~R?207}qu|O>VB20Q zTS#94*&4@BS7-iEyw#;par}aQRVYm%)3svF5SF*YyudK1l6kudKk%iBX?fZj#-zju z9R41-D^t%#WrJb<_yDNAeWMhGphIa=RNiTxtl_y@2pvv&7&1mj&EfS%)a)|FHk)E= zj4?@m)fknZF~y!V#U3-o?lr|Gm|`Oka|N)=D8f(R!LHzp@8wJoJ=5X*lfDh|Zlt_x zHPAXd-Y?}O;35WifSeg_!WI7XU^WWKyOB=^LikA%{BCaT3|t(XM@@;vozTd0=YGeW z){;<+5_00tI^)>M?C9c&iGd2aJqV!QZp}tCfX`nlHQ*V!0oGQ~j_mP}zqs_Q&Q%?o zi`Joge5(AH7bc-Z+c2Jr`TI4}NjPC)vRDH@#43vJ!6m(Tcw%;-On&8kwIg2oJaGD9 z3~;o30bj6GCP?UyVRGG%*=Lws6A`seuE9t%POd?SD@!MVQ>?bfI>bW@@S|-80Ivg{ z0l-p%Z-p?I`ee8@TY$Lo^+X7l!x$OKSQQsKzNTUg58vFC>3l@}K11SlwCQ0aUk;M; z%W(@*1z|K%`Ok3@kTA}~J1NwZGftlT9$z^6AUC4SYX}>Va#J9}z~{quqEzE|V+;fD zV8(276|>O4!gqm`1Pf~8sg5qU&J(UI`-ziC)6p=Yg!LWrr5nTnEjw;7QpDa%q$c#i z?^X!14|XY|D4B_P#EYAuk7!b0VJfLatGY;5fFc7?4i_DrP83AF5L38>rq3YpOECz*wo*KwJzX!ZRoX?eslN-$1+aU#c-c@C{I} zj?>aZKnBG28h{$#YCwjm>@&=+>_M8&3uB@9Feab$pSX- zV8*cia0a_cRm{=a1({1PSD9Q7LLh~L1#eJFsFj+9`|R?^j#p6oA72Y6>r7iX7Sr7mE?^0KB#Np+R4DYfon$+aV%WRPJ{Sj3VksmB6~TGn5N4jZo0G7`t%0IlhgwTW&`4;Bl~>yn?qzJO=+S&~p(I zA}ab#xekR(koq?74)|-MFGfY*88;Gq{5Z^N#K%nuMjs9XH(Alkt1i(C`l7v3yv^Q<{OB417)fZwNhpytpo70btg_IKst#zp0$+=N-7ts#?BhusOw1cLQ zt4QK=qX`l&mGUIY|AJ1g3S`67z(&yn{R|68n%k@1E-!~CiK^;tc^!Gf z)%RMBxuOD+7yb_=tiD1P4sD0k;y7loM|WT+$k@&M56GP{S80xCK$(n) zf_OquZ8#}K%*`hR&Bw<`wOpw^nhx))y6;1_pLFR+*mV)n_K!!dl`7Q)^kPnwdP6Ap z70T78^7~kuXevwU)%2B!Tjz2y(u{L?KGo4>`4d#dIF~V%@1ZJ@Jm_0e-|wZqn@2|H zZ!o~WM6B`By_aP3+`5!|J>}{H@M8fq$f8+@TKj)Dt&s+a=b|cl|8uE|WEp^i>gbBv zCp2WBX&_gVR?(0x>+16~&SsMD4nyg_|7jPrG>qK|VaRj~|nE>)pETyp>B%P-J}58-|o?xL}Wt?5wK zaYvNg5@O#ow?)Z4K`pPbw5;3zZlS?noeSyEAVZT5TsYWx+`MqgfAUmX#LYU`!*Anf z1eUWsvG;{{(CEGR6LB;@><&pGrSH@z9nRm2%HQ9L9=Y)aJID>{0WIaa78?&(>W+MP zf_#tKaa}8kU%_lJ7Of-(&T}))u}%^FEp8u=5+YgyY{Whn5CytLo9cfOjvpC|y828x z1$D&0L5C65IY?q(p-{FU(a1uTR7YnaQr4|3^eWQGQbun7H$k;(kIz}C+nYr+2Xvk- zpgCaS+52e{poXMY83l$kRH12Tt#UomjD74(RrEf#qAC_PuS->QOw6KD>HWG7QOOGB zRwNps7wF zADqe-EpBZr#3D+o)>Cg;+tBVmP1=t}_R-q>JZ~ht0rMjs zQ8#Yz1~-Bmb>j(GX_YhutLJF7FY1($4d3Np9pgKmJ~)3@H34Sb(r4CMEa7|>D_8%D z_Uybpnn_HX{tb}SDQRf$N4@iAp>P+P(>7*>#cyJ;6Yxh~CF#wuW|t!#*2N8TUA_hl z03Q3QBc+pW@({nxe?Z+*LPL;SLIe<|JD~N5)ViOj)rAzmZUkD=rHa|oU-FvaRN!qy z06T#@LX!f64NbN@^(C}b4l+c9luRUjY8+&NJ~L+$pXoE;o;9%lTA6b!F`8jH8AEmS z8884*D{pqCDv@}z8Hvz8(FZ0efS1OW-s$4`a*F(TvKOxaIGQzhOYwrU(Lcgq*Z9g`KMD0MQP=b(KciYw03PRRiTs_~wn}tWS=k}) zMmo4zvYa1)9mv>$sLa1i=pT{lUI^O`Px83dy$4_-DB1L5;>no z<0_f>wJp_)BnHP4&yA(J`cRg$p-AD6gDs3OmRXjuJZ>J#y;Q}5uw1I5Ls_)Sgs=ic zO$d`l*p>T{XvElkR7c0y1VokB2S*uNV?tOfXm{obA1js6LRI))&zVoCzC- zw-!-0yj=AouDNz)1=5TteVMB0C|!i8vVIs^<@diWOxT)w+$LI=+Lj^r4O-VD;o@Ik zBln$XrYnhtb8#eOPGu)1bHd+$mP?QjQP1o1A}u^Q395aa8O$G}1?aZr7^J>eUWu7S zXi@jdPa$fh`W&Pg_R8+n*nbgP)I*JjXm0LwMj6>_a57Pnqm8==tEX~1@nIya{7AWL zDA!_~;QoJ22`#B~kx!pFi{CX-c`l;X;XHseBbD!`Dms-XQWeYe986UVqJ_h+CW60C zb{`%7XEY1-NmPQU75*zoGs0gf?`9|3gw3lW+gIcy`1kK~GeX!SM? zPdCQALlt!XdXXv+Li95$N%0{Ojvseb>E^#_2pdN80W6IMO1z4w6-Nt^W~9Uds-h1@ zqAC_j+)Gu;r0|&_9jF-w_XDCdJd!&=RrKL)Lsa?KAWZI`aq5kgJiLcHhInMv zRocS+`ApVirfE#IC#K!s z13=2Q=b|*p^hW3Xq?FNg!mX%>5HgUPoY@WJE<@Bxi1(0YB=@_BE3JkD^N*|O zg!0Tb4bypC+mEP9*_|AnTU{Nb9bCoZ)_S(JWdioqh1hO-Hc_%57S^Ssj{iOjpa#*w z45t_NBIjC+NX6;B8E|OWK_&IsnE5`+B*L<0>~b$kY?e#Xvs#NQ}U@90~U_NBvI zklb99la#0zoNMmN3`9*MBK>C)5{&>SQXPHrj-Wc0$(un{A}utZRG|-9WUAKng|#FM zbgaHk!a!4pB>ov#Wid$u!=M*Y9lZ|)RL9bX`>BdP()!eE9ZCrJ4MS0Z)F90WUZS&?|2uO*bz+_B4-S{Uxu%dl9A0wSQ~O4j=RSieuC8 z>iHn2=NS_UULdKfBYHlfRus%cnh^z$QWYHq)2IqZffWAk{}`&HBYFefgwUb9gQykC zGNc)yEJa-T1M=U1$Y}c$Mpq?6J0B1c^&!7XL^SplU0sMYRSEMJXRUjwir(2O zm_Q9cq%y>dCdnz7YasEVXF`!vz}VuA-&lph+3Ov&UAXSSAS$`HW^WC-vy)@`yN_r0&-?8*kE-aceu}6vZ-}8)`2SbX`lNHmT3Vkh+`odBCj)|CrYd@~i>QhP!Q@hA z==&iei4J53k%WLi{%W6sS4xp+gi=CvbSQ699SfAFkp^A%L2S`A--Q_n%LyvEbc3(hij@jYDZ?z`jH>n#iTW}+=fa=z+ zT-ak=Ua!Nt39oAyEJLkn8xgMzU4U*qjEgU7Cm6p?Z2|i$5;R-0sveJ5d#~;`^i_Lb zfE~i%%i9^;>Dha>7!)npWy1A?=IK6#X0nB#!;r>Mjq^wL%RED=j*ja-RL6qr>!^;- zjmx2a87N9SKr574NHY@jajK#Np&g)Pg_28kbSR`=8=$<7s1?d$q#2=Co&S8c|j`!#5}@;&Z&11CM?(+NtiH9his~%L+ndcED$?U6@6G=ZB>E5|CD|i zVJqTF(G5%_hb;o-l<1>Gy<*oAQ}5a!YVBQpq#1ixkE-asyGUX>+&fkOJVkO^hjIs2 zcmoc`AZmq@i8LdWTM$=nybGPx75_)Jnwq&AQKgxAkdk)_rCwzos?lRn-N*MYK|~G`k0h23>F;sS6dj1|o09Cjn^z z&?U+z_=Yu`%mv5J;gD~a34^O~&Sx0G3Pi0Vm`_K6_<%>4-T@>i%ivssFOl7_OqXaq z5H=8JyO{+(j=%zMT3Fx>GYc%EDx3v${o6xzbQbsq)<(kss>t}bqPLkrw^JD%=N}`g za~9V=-$a_B)m}s;ovkGVBRzx86+1u%IIGIQd*{0y`3`g*Dh;C=0x z3m`t@Rh#_&@cToJar`HL$AN?`W?v#6(HcGhK*9AUkKnf(n|i2ztOEyjHo*{fH_@EvWsR z%IK&KQkmUUMyJqXNNPhfb4hUj+}BK@*;Gbv=6*yar zKZg-l-ZQ%`K4Ko#-PB{3WmKe?NrwK6qCz?5VSSAQ3B#~K$gVts_bn`+Zb3YgZ5fBdRQi9a!$qhe$?swvFhHcw}TWOX6hG9fW+43rd?K;m$Dw$hGkO zHuNq9Q7a1UNHcaWma6ET`)%W;D5yr70R;kxX#nywd?uBrasSO^?5?5IrzlZZBQpsP zI_?Nftapa<<`zgZ_Kt478+uodst|z;_R!yH8Q3m`oi-I(Yjh}wXsxlZK_#s<1~&K% zab*ViQs{&ZkpR@2IfJORnIlNknqlZaOm%cz?xZ>vc3MYubSTeYjWR%)ho}|G!${Mh z&~LFlL{)SkQxR2O8)H6y2$JZ~JHLiRhXn^OA?UPzRzOf>Fn_{pHY|p2oyhp2E&TzRg@sz74e!-O9>? z=xl}ZX*qj6>eV+5k0YGER~fSuNT=V@&PBk$K<`0EAe?LWAC@C-CAA-EMp7419i7yV zBdWB7FNH=+kn(XNlTONeiA=;m`U&-|NHXXP((P13C+rYJm09GVaSu=k#DyjPZHPw} za<|lFC5>*Vr&U`24r0o!EG>y@OY~U_$>`87FMXUVx5lrU9Is;{AioAvthWC=+BaZz zH&lDW{Mk&}zh(ZsgERwDCGUTbptQ$9e|k_UTf(Syk$w*>llX9-G6zYTX{!KX^I`CJ zj~Nbw4Q-EDta^V9V7;Yx1BXln?5rA+JURHTRn|6A)N>Eps@hdNNRb8|FO)s_x#nhWo z>W5ZZsw960Jc18nZ2tv=**Sp%fmc;>q;=T~*jO)Y~^R za?v9iBd03oD$wA8_%JP5&$c2?lIfDqyOIEY&yAOcZj9i znC<^y24}GXpp)4j6+^V8ax5njgqHJ{) z9J`30HsjsI_0J{XZ~3}QieHQ3_-fcRI$#81du|DZ7CmWq2uoKxh3_SYFnEYV_@ui- zSUelghfX2&6Q}URaEFlLbO4&l?04k2NdL-_syhtO}0Q#f>^L+J6oQ;2mV zeS|}pvCb(h+~5@U;CW{g@}F=BFO@lkp=f{pPN(qhO%6e->EICli-Mjx4#5k6L(qWZ zA%}3VuR~~*;t-~fcL>*^6SF>c3V)_Mgt&54L=^^d5rqqwhm#(@BM@q z(1C~0Km{6D@|II*)5{?w<~f9Wfq``!ox(iy_+*7sSX}88f&h3kFwg@XxnZC~=mpI6 zL>({cA4C092=~LlvM~CO9S*?(3~Zd~5Jmt4mB3m%bf8fSpkjY5hcE!W9MsGqG;HM% zmZ1TAl~d^Two|xn46uVyi~t6X0s~z;I)s5JQ-6z7_#7io*zFYN^l%8rCOCwh=lcnb z0Q5ho|KfcP;rf2S5bC~igF~>P6MZp&Z(rwNJR%a_5`i3atK$0ZUcaUM(99CjGz@72%rP^V^mG^9YX7-zye0JyuCxX_FoR6 z3iW%V{vr$@7aceStd)Ux#-Q$$84lrr%}$|Ze~0i>JJA1`o6-AcokG(Lhw#R=4&hOt z?gSc02NUf@$G*kLe|gLyl%fM}(C`3Ioe4U&dIMwtd7f}NgrDm;gsEK}!edh$LUNo# zIE(rZqSM{LQ>#IO-j6$k_rMSJ0XTrV8}Pong+n+z1oY1UqvfLTF`)9Q=bgfOkfb)a zc_K#eAV&4e#ePCHc;u!D4&kd;oI+8WLwM#^hwv0Sa5CN@?85+F#Hgo%4{GW;1n0Sa zLUYuA9QC*U$0@YS23A^w-pzqo(IG5J1~ykXg-08soo)cO4cu7T#v$y&^9VXI0vNa+ z4a8v7@7Hw*rvyB}Od9|j+#47IkPYJt%^Pl~MbpUt~q#6a94n_T!&h``D1~U$B zO8dq)?0*A!XeSz{m7f>ModVfJG1X`L{$=(7L zaIf!;Bpb>VK5;5W@SM2C?|E>=V3ybE4CJriIWLM&-jBRcT473|Ly)`A|10D<5$pF% z&zr-_`3u^r&C;7Ci6upS5H2_d3tnhk(a<#e`pJI`5tNi$;4t@ZCwm&>{g)SHvpi2A zP7lg84i|nJ2@0N8sI)BMLQHFEX>$Ph&?YQziMM|N{q41VMt@;>8jG{POWW|&2aTVV z^e?5aN}_DcxQh1M)$6_7$2;!_#Zwo{5mH;D4DNnXvw80b%Uj{?UqF9*Eogzi`O}v9 z@u4D{z|My&=TQ!dQ;Gtm2aBG2)3rQ}dV(KiMxwC%8if4|=x?tDS5tc79Z2^tCB!jb zqsn=dDfn25;zZ`M?7w2J{eLyuI`#hEXr=#OqusfazF9f?L!3G;1trph_yvH5>JMSj z4`c-K;G4bG*aMZ}lAZq3d;|4bQ{m#TR8xXM- zPq{00>uCS@G(t`V!uppi^K;d&)QKfK{0GwyrEfjEug$@;75wMn$K?;l&U>?eYx?$d zOwXWVcOSFmcS71ZZ!oV1eTq2$M%tUZ`h)~gdKtecpWg)Wix3*Bc31Nz3?>ORd+^tW zRJ<~4-d|&@sU$l}%~nlN;SHYzJJrq2_V1H#0aHVG)usWA@_!|k{w{Y!66vUQe|Hsz z@*2>u?YaV6@)HUEBsBfLWUKjsTBQiJ8)(8eLkZv%?Tf^&dV&qVd7T}I!A~|;@%$vC zc=*5I3yFURGb|L^lLA$kv3BE!i_Q z@dA-)Y9iIE`3^LZJ%bZtROGQX&f;gvV$*{a@7pR^+#X`BT0L|(D3+d=dm>He!-g6k*7Hcjh~vr= zg!gSVrwI;==xwu59gxHuoY|70t+|fJW-K8^r3&y@ts(O`A}7O?@o%Lmcpb`Jtdh}C zd#WcE9{M~+kixC8@6qPhrN$~y(^j*e5d#fzY)C+e&xmW)gjOZp~tD5uZ&mV5W+U0pCJMV$?8 z8Dph+rledTzJXB5uaC&Zih?OA5`fhl_6$m~5w9FTAg1Qf&YkcwP7BKMxy5r*2;zHn zFTl=%BuS2A{iDR|VxYs6I1|0jH2g#*rIe!BB;KiW>M-$5`a20UKG`qsV>!Zdk_@!^u&Lo`7u3=@PkJv}sSW@o2x=SuWj$o8C09-WiB z@~v-&2;Dx-F2={w?|hXqz`6a?x_3LAQ6YN!pN|o+MrVSTdlxwq15#%5TB*YYp(v+$ zk&|2u`xgyQL1tF*n6#u(MH7>^I6J~-ky$jcU6C`jXn2}@@V&o6D9{7#CuNT;8lTo( zF8L4}hffo_g?f%pOBLsVq(bp)aAU*^h2&*xQ6pi)UogBQvXhD> zD)1;TP)!AfumWP?t>%^av@_TibQDYJo^d83w@$}`te=5L=8T(R&P zEi;y9N*gKnD>XM6xt=YyjM*5*+X0o705{&85rIi zZwM1-$B{tCG(_5EkDS*0`@zDfP~+}k(~OED{H~98=UHI9QXaGauTb%L4EA5U{tCTs zLzT2Ui~bK|?*kB3mA8-IfdNOGX~qJh#KIbjl3EfhN-QiSDzZToG!5;|Y+`NK49s@X z3(Y`txl*=TTA3>|w%M+=wCfg>5r%>mZDh6C>bBNedkEUKGQ%Y2_dMs$a0hq4@9(vE z?&mq@bIv{Y+;h*L&-pVBls`q8yP$lYZ&%uzsj?H$l$pLt(Osq9_LDa$73X>npioxe zKQHson{v@ArIi}teN7wiNl94@;0%DKB{H11hryiQhY@kbcnD@NDj?WaL+=RmynA^6 zira9TCm_V=QVF_;4c*rdAbB_LXFKJdPA$o&}tqY=UgOn51r&Ipbk_6hU&qg2v1EW6`;4v&=aRb>Ae+( z;MjCh59-Q9nNCHyS*dUt*}e=pngVXzo(j;*HT2S{=ahQhTE5U&RqBNIc?)B7))1@1t-EKs?Q3k2F%^Ni0G)oc{pm)U3lcgi6Vv_gQ)Vs&q%#tN@i3-rm$dHe- zEjB*yvrzUfREG*Rm7wc2bce<14O7>QmO4=V&%)_#F;e;;<@1mc>yBs&It;yqU#QWf zQUlpEbl-Mr#6C;vrK^-Cg6_h-=SacZ6B}XVk%pd#I#69_s1A#H=!w)wPEiTEJ%;XK zBiaHl)9IZuyo^u>s`krdrVfv`ma1k(Q3tAphU!rnt5Hn;Vq`#y3OD0jQ3<+!L)UFV zkvh9#h4)KC(R}w*fL^saH{a93cqe{v5RicX8~q^o;0G6^i$Iy!m1@R_OgiJmHTM z(bL5%op|{2B=LJ(^-siBT;@f3HWgvjdmv{hi);J6h$Yg2(ERR2V6i<4zk3B-j7|j~ zz#|SKW3$?!%C0Yd;A3gzakp>7y~ZsaSEPt1k)!fyH`8s8KC(sm9uNH4JF-E(yY9UF zc*V=NAYX_KpCYQD>k&T*4u&g=8jIZ7WyK;m8&fvP^V3!-jed6kS&iwRIlf&fj2my< zT|}o@?sUkRHs0ZK-p_`9jC-b5wEnUr%NTVV+{4LB(Ky$&S7y~rP0w0|E^C7L0-bts z-<5c!Mee1d1znf6t>@jQh|^ai3WtlGdvrAM-5albH(Xa6d4VQ8^48(P{L1PUZ*9X* z>g=in>F6%g2Wqap)ajqHKTZ+qqj>1Zcp_TvXY2jG!vntlT)iNrBPMUj()pczs05(SWAk_JmKU#JlQ<`^V>0= z^@W|wX4QtXpnt!uHk{0>`d)1~3BvMw8y|k>WH>za?}+t*9nP0)JkMNDGjJX*dZO-0 zLO!IUnDa|Q?++ibaiiV@g!YBw?+^4nThqpu0CV1A^phGNRuG?WAldnF8L0E+K;93A;y>CLz)K53!bvf&f;a0sn3*r@{Uh(C-?N+F`(66=Y=in#Irj)oUPX}}P-n2|9 zO| zHtt;5DrY94przv!DC7ll{C0aTQc};9Bq6xd|1AS|`2-H2eh;EgIGlBNz?%`{jVgVw zT~)5)v1Y&xUknN@ZsmMswoSL!PAPU(o{!&mo>GuXk7b|trb8<*j?WuTUWAw0YlVaF z!6aMNe!htko9~CGo&IN$2fiPEtlHK4J|w*$9hqh4^ShjNR~Rm+n(RzM0+XjE1@uI| zT0C4X-ZI{>e45@z5PR%1^1Wm3(tPiu@rH&92IIq9Qi^+zFkG~};O6PYy?=w#n&bZ{ zP>ycAUQwRDUU~5;ToolgUWs4(hx8AU;^X5jaU0aXi&b1?C~h|N zWV;{l#fODK0#YZtJTi4uK!gWPJ@5H=UEUiJUB!h^?H+m%>OgfJ2NEiY_~0T%X_3-x zo~X12lF>2BmXUaAPe43JhvG?jW~I_ZkbNT=9hsH+Uob$F&y1B%-W z#i7i4;M6oy0eZsFi{_PA$0vVkc2NhaGP@{?pH4t_xi`xs=ctkVGJ>9xWmFoLxYG z1k18Jq$<;Es!|849z#{Wxgk}VUQ?AiP+hGWx?Y(A?-Abro&S=E)rR^WL%SwMn-)nU z%jGatmQbpN_c>oqu$_m|LNcGgqhFWPDjx-F)g2?HJCm!zy|`5-oF1d3hkO9K%T&_c zCEb|{sV|d5_tDZ_CX4#=#yxuS>hZYmb=Fp1F?TbN{R=N0>XG{T(_=fJ`R<$;lUAW&(n|Sr{)@9K)hDUs|-f z3X<5NfmI82Sd3L`@>420bw%zX*{`Kpt5BS=d6-#?W6Q=H4Wrce@G=ZqFCd;+gBBVT z@iBc5(XjNW^mW$deipH2wb4u3ve-YQMe5Rs7k-k7e$tdRH{y40G+2OM(vWpc#LF4= zx|d$kigkhXqHQgmoyZ|W*3D?yVhmY&wR_QjF=nYl)~p%nGd*SAYFM%`pop<#J^yK( z@+#XM{avxYncerQGTFTrKVV=}#{Q9a7M|LJA7m`DhzaZEP)b?_vzMO>Z@1X_Yvi(` zk3k`1SE|QIWA?Jo0`paO9(vbq@sm~zDGs1Fa$R}}RWS4^+8ME(oe4i_JIkT%4F8Pb zR(8a67VT5(Hni*3VwjPGPslW!V#w8Py=No+QT1*ZPMfx>(rn89S5xjFo-sKO7*c+{ z3UdM-TCx?wlxeW%-S}D@1pFY#tx~W%{dY+Lznk_;DI_`lk4Yf~mV7CsI{mLpA>z?8svDdaf)7fB)4=`WE&p3{H76!M*ZO$voh z|F5Nh`GY@60rLlMO9Ar-pGpDq2j5Ep^9PRCd9Q^|{{>Q5aRQZl(jDV2ggq+dW+@+&@^&c?NSR-; z({IGNL&`>+?Wlj?aZ)PnlJYb1279FZYbke2SxB88DL*dVKalczDesr^lTv1tj9-qC z`iG>vN6Lq#{Fao3lplBJoCgnL&epSlzrTh;mFO>38DRZojSA*{Jlv*!k)&H?1OQgq_QeGu=1$(2V#q?r~I@I_}aq_g%%8ru&(2n?#M?iwpdRt z#6`0;IBp`p&6#{f`j_TGyIH>w;PqZLgm^23IU=31;3T6?dD=Hjjd zX6+qH@4tQ+Vs|RN114Lf^d2+WVx?EXXf_h=Zbj`qX?l8<-a(VyqxAk@vWj7m{&ZNR zOO)QDrsmI;-cjZ)?pJydBj> z%=WY)c?;w~vJGy z-(f(u;Ju@yCtq09ldmn}d0ZxeZ^`h)UHGnW7pAuN3+cUoC}MaY1X(;K;{SK)@8Xvx z9~J&d@^h2H81dib zo%yblSe8=WQFHtvr@!GPE|)0p$l4ny8hw(^L){lC6gSPefD;0x-fEiUPn|c+J0J6g z)WA?f&Kpt|AHfdZv`&=)jS;@HViC*yzm5d#tUzhWB~AMYu~F{lu9o z2E$D~G7d}v8_}HYy%SYY#aK)r$dQhWi8{EwRQ2RnEU4JrDxFl!Ne+)aqEl%2W3I!^ zM>A7+<**de7x8*7gc4H7D^ob1DWsoR_JHijHxqkoVb{Rjaz+w4&%dq^V4(=jVJ^9|Fd;_CeBd){m?TKg=(pzPyL3so38WtX> zG3k8IuxFqGtc8<#ZS}%3>Fdl92hcNbrHe;TL{~jIX9Auu&ig@3EGve^LIo&J=CyVI zxwkPERXmPp^f9e;#LCa6O2*>y9yDVyrn6&R!`-1fs?%`)+T&sD#kxORPp-iPhh}Zi9bSx>eF@c| zmb$%8|KqJ_^X=~(0*6V{Iumm~7@f_5ZP=XdVMS2e&#tvOhr>>HNvWv27si35sDQ*T zFNU-NQp;WN64ls@7xwze7n8H?61FtxtfAZ8bejt|?*>vY=}lDm{5+^^quV`nyMk_a zFzW4a6K7Fsr{tj2L%k)`JDpJ-Bt?Q05r(zcs|xa;k<*~;Jxcm>QtYV-dzBwSmy+%y zwUgdQ+CiE^x{P!?shjkE(q}im;#58+5I?+Uur(CvM?{fus_;U>1jyz1RdU-qKJpXlp>Z&PNZ zI^{J|(b!SZ*qy5r&WlGqb7=g{oa#zC=wOYr{-KL4V@u%e@oq(AA1`sAQ7rEK6?;*3 z^uv;7wyNd8FB7;_+pS^UWZ5g@wopj#ruaM9upgJJtIDfmcA(o zQxc4r*WnRY{XZhcVkhLW7>f8ge5ylv{4gV~L&Tza0$%F?v|0jmyN_-g>1M;i3Ne$C z3sMWMpP~f5UN738CMna+n3&lnzRs;9bzqgu(K>0j$-ETtrYIm^$>%f{<9V=e- zMBhMsnSR_^H)<><{2s>0N4cs1wwB+JJ~~J`12jmwJ_m!Rt4cvPN##mXDnA9fpnQ_r z9-TO6P1zK90!c=P$!+~F9j2uyhpp5=?Jqk_lttm`__}t21#a&AWo9*=hpB5fs!1lQr_ zjd9y90~mP}SvXeA#a42fO5U3q2z(?)(OAM%F?U!RsQ|r<4NQTN$_^9|??`6Wy-=0& zF)~W(L{&YDyes(NQ!A9#sJqHI;88=5MKK-`_tmGkFEQ@9kvmLY|vtws=YS(ntKD-xz2Hhi0@A6c(8nU4|a*hpRKpeGUONNmlkx_Q#Rt+v2p zhw;!=*F&}j9{Zf~6v%NUfycf8an^kUOUa}IfhW0M$88DJ_TlEQGuF7!v%SUP~AReVtQ-RG#9VJ6=9THJu|ldxQ~2 za#kiMSA`PNv%=8zOWlfT-uReTAQh=#t_8bUF4n@F5DQwpOoP&{NPZjDv+qMeJBZkbH#KsEIOnaoHbH}37_I*w?xh?P3X zv1a+q#tO5Wj3mmrC`O0zDekYkFbb8?@}hgPBeaDoz1#0Ltn#xPx4GT_h7skU3r)wW z&nyb2g+k^+C0~D@(Zk)X)$NB0=7>Cv(~lZ+L)u+OA}f3JueGZEPXCx5uE1^dSkxio z5$sq4@y>^S#14#7@8KkjvKnB_d-YGi+Z+-=MoF9F5gITtr>h zgslrLbZe|SEQ+sSBdFazC_X}W3^O|ZM#PF)ixpT;)HNMl5VW@4RH{<9U*v)v@J5SRVYgFEOxzw1ogOSRkOJq5IHoL7=Z& zF1`~fk6QlV0?S`Y^35=eqyjZtz+;691{(6*4Ng0qhD6G!B5NxC4-uxx2;DIeBEG|z zhhcpGLY}+cy-5+1+XbIRV||ZPwz1-aDhC1|%Np(^gGYRU+ z>3lRt1|N;Kz7`qoG&~ws`S>>>t3)~8pct70*q)8vQrfviN@s#xKPK>_VX)Kaw;YX` zl+qhnF02uUwjU|0<?im0K4A83;h6o9`7NbXk*+<;pg!VkiSS1KZccX z+1Wd)*qby4j!(%*Qfj7FF_KR7PZ3icVycgwG|0at`GrA7 zz8$BOv@FC8fJ*)u&SnaKL+Bd?8pR z`9`X)nA9#(!8;$8uXI8A?Rn_y@+G6EyBtHR+FgAA9Wb5uraApMdjh{!hiI@9&D>(y zVnxXj^?$R-anwCr+I|G5s$yx?Lr{mE*itXMIRma z0gowq4X``8Rcwv(4XiA!8r4t>i@CzhK6=m2FRi`-)%oym*T=zT-+XWvSMmL6DJ~7Q z7!g8CwJK}gx~)JtfWLnH{fNKQ=iy`k{AJ>A8vbVD?@s)w_}h)YO8jZ~TZ_MU@%Ie= zKE~g3`1=R`Uc%p3_`3`D`5xET@OLd_%lrZ?F^r41CM1rqjXdX^QKy|_U*A6>zEW-4 z^CT+LNPm!h9j}hOlFy>GP4VY}7DT^@}F0@E#<0VmPAEc&k_*M*JM3M=E zitZrwKKsdya4Qb2IUC*gWH&vMtxw^uao)pRtYUPQZ^J^U$8l?;F_gEZ5{+SbhO!NB z2n(04tT@L|l>JqyNQH2Zkv_`e0Ys!HR~zA6Mz{+Qj(w|`8&p4qnw)oNF*K8?>BPuj z(y2+ILb%5}l!R$!67=MwMrfH7%F(1y7GLp0O3r**K5u$7DbtLkG^^+ed1XLqL<3S5 zf06;07y&bkfVWl5J~d@j;3I4`6mz1A_nfLo1u7mk6bt3Es@RqAHs89;dfCU2si6{; z(_o*(dy+l(BZLVlc;G}MnxS&B~>woVjhSGO)G<~X!m7a1`xF=$I=aorJ<3N|bVj@$xMCzTI!op!Gqz+OjRU;{kIGqx? zR8e(LVXNUE9Vu~0k0}*f#FT1BmTB1yKE+~gD1g7*n3^Fbyc-V7fTe9L24XTQhBg)+ zF_99>oET4u#Z;U{NfvGgC43*MBH}6X`x3|Tb++-N75}CrzvRy;u_6%Mzttw|ocAEL zu;`Wd;)JHi@{`gwc7(;BsKs8i_#Gv7y+sox_SeOFO6=mxeWYy}=c6Yre01bcLOe)G z4nTfRiNhCh7bT90#5_tIafxC|atL<=B-!OI@9l>zQf6HQO53njPKg`9LtON8`sf^?UcCEPT)Awa2wa+2^@(RZsT%2@dPEVR}`zmDnu@H6gX5i+{V?B z0!MX)+vKuJoO~5-rBEL3e=h%7#%#HGt(KP9eq7JsJ1 z_0eJ%B`&8HuR>~J{*?Ek${1E6`PsH{f<-(o)gh@ur^u-uQA>$aN8$lWoQ)FqQsT^) zxRVm+)5Kg#oURkMQj#-+(}tBkDSTX8g6tXQL|znd|l&XoMVbMXpI5o5GKk|9bWrDQUc`( zVH9>Psm_hD%dkpOKGJpI?_}QHX>K>?e(1& z8J%)Oi33m?*BH}Vtq?(*hi24H^$^4AzVWueV>!QD!k8vJG_i>UC4+5=y@TV=n^+lg^io4PfZDc)vzvbLs}L#n`jFxDNA= zb$c5*u#oeQH|!n6`iU9##UnBQ7*nRZyVw7FuO&qt(^z!Pk1a<~O^KTjCrXxo{xaf%?~Spd(LLBkC%P6oINZdq8ZFf4lP=J;A4Xh`IFCVZh{3bY$~ z8b$~V$CRskD#tb?ii(|px# zx24PK#`G?hjD7r69Jd<5)`Y?~Ef+Jn8Q6Y#1YJYag9AMrHq#Tf*&fO>{ID zOUkfz7pG`ozY7+(zIF&R#3KFn!Eo0IKbjuB>(sMLO1-;akn`SaK}Wd;-4(fw{4kvc z0m!5tbhG((pat++|*syp}B$% z06GJlqmO(w!qR5dQJ=^RAntmA4z3|5dnu925hpFNSIGDc&Gv^CsQcc60Nq;@YV zd46)X*(k6lES1G@@*7Uy&7xCW)pgAlFMCAL`b;{-S7t$r)0J>~S2|heVJYq#aSPE( z$ORSfcm*CfDyVN0{$7~W-nRqSw~g{<>`W|~U0POw@vp-1@6-%*Y$^)%BNexmhCkBB zxll|!6}IsE-Yr-s#p0!3nttfU^)EbONpo(&uA=Zq5pUbgYdwq4THpSJ#o^?5oE{?) zuGx0;`h!ncE^=;+IG!Hs$YB*VM;VUMC`PEI6-sC`J(F{hE^!e|txX%S+tj=L7)s6| zJhYdF7N*F9Sxy#f?>ZzAWu7yh*jfkFCLachs}~N2-!SGuVd3?*V1Q|Czu@Z3z_@A4 zvGeReNr`t4JhaLApx)aAWW?2ibtmEk`YUfpsR`jlKWA6Jhrva6?7@`kt4E&RYETi@7>?G2CH1>j|hI>THK|G4@CrB-tesrMlcryFM8|WUO0peEEXvr3RmqCTU z$0$Di2rvlqy|^1c`_cP9hgl)^zJ1KB7g4~B(gm}A&c!jiJ?tf=w1=vZ158p3i+Z zI$bp`XWe}4L;3zW8pBKQGXL^jIP7o#iL>r=I0fWg<%WZlsBO1==%MB2?AiLIsH@kW zcFWze&NkQL)SR$XrK9;R)2Dh+M6uz*<_Uj9*D*XuWQNsKj4!BjLGK@Datn3eM{vq& zk2-FGW3<*cuD<@%+4>Tg@s%m#CCf1K&gK?Vk(Pu&^7@zn$EG44$ewlZ5#}Ft5EfmTxdLcj4JF^Z< z?1EeR8vPcf!FqP?`8YTqUb$G3_#CcNu<28ut~ehJtB5SVLw^_P%hr!%?fdpOl?h|_ z`TiQN+gEvOgAL9}n9#>AT)9y zGlgxLOkDZA1^VvWeY;XS5SbggDTvTj)|hlUYg`peg@5rDHky79-!vFV1MuDnJ%!)Z!S)e-Q^kcw3O{fRyCdzjFf+#8w}ztbbq z5HsA-P9tUuwifqVG3>$i{M6nP=C0*jhK=C%GMqWii#T^)cl}FD7h!#CO(AWAS zN8pc%ueU1`#M{}}Yy^`m&Yd}d6GP{NdI!UDD1gZwt)8k{xlLI6PKLcd8XiSBW85ab z`SN5qP%yID5-2z`Q0@$raTb*pw;pa*2~9aw~jbQ?^9Tx(7CKy#+#E zjSEIf+NSHswN3fBh_xem8-d%h;{_KmprkxSC=%`;k;X`O#{}#>L$Tgfii!G~M?x$Jb5onS0WOgc0@~nE& zhy8G9ums{Tw!v<8^nJhaCD5BEx-kmb0nr_cxQY<-gdzG>j?nG0C!#0qW_a{V7%$cg zx*}@^qqR07;48)!?o9OYaDbRnD(2mSH9%?NulelCYX#U?^v@SCpEJ9xA_u24{A^Cy zY>@*?P(wl5Yj{>PGWM%Gy6XMxx3kv3E+DAuZ(rS^%~+~CxZ+2fft^EbL#~UoRbFk? z5^Ytr)>b1!Y=d75q#C_6qqPMScUnDHGiguA1yH&%;aArPEv0J(+fO8!=KYX6)JlDc6dCG@(za#I6RNwn4B9gMX5F>;);F$r!hoF zYdU5s1NG;_SG2Ah3}1~2V|4)Ip`1;O-dWcVxvSm=88dy5>_9T@MVG`Rpgy9jJ_T1L z9kOdSx67e*9)XQ*k1@#=aV31jSci(Z;V!c);!OwD2vlJ;ogyv?!(C=qB+?;g6Z4>I zym13oIwdhTlsxu+hmp|PUJW>uDCtx&BEm=La`{Th+Ie4GK6-Y=*dev0h*CG2U>tvu+bs%Qim2?3p>c;w-OXWq%If(QDV>F35^{nM>E|&e?0-|8%Pt-h_iS zZg1$AH#C-ud|utrg=xNids$?0nr~o)^WllV#mgFiDdTsm2E#uMXJ8>NzGNKpk(XB6 zmBJH0&Z>x;8Sbf3&%g_}LK|C0SrB}x4KI-nt%r~nZZ5q+wWBS=*|l0hl70ha=kIrF z1t~SE%ThH>uJg8G`K8UddjIoW=FMa64mx^(A6L5*G2iJ3v&(i(0Z9hfm*ek0~2NM zkl;+FkO^Mktos#i-9nDj%k&xP6RDhyP!oIJ`%){-!S2uZdbJri6fRFI&BsSQR7FHj zD9PbaK>s)^+~xA;ByY1tSDh0%;- z9d!?Hm@KCRFk+JP4Lvf0Q;@+a&edPS24<|IKj>&lyLoMsxInG_0Sys)d9T55=VvKd zdue=loz__%*r8M=px&&yxnZZQxiPDR6SaxLs z^T||p+ ziT*K5?)n8+Sk6-AI!nYO*ID+6vg^=EdV5|kXC9(OK5{M5_h+>?EOOf#d`8nLFXFq6 zIRA%@hv6T(79lYqY+I}u{vSsD8+zKmOxzk5c&vfBS65R7>*78YYs((f;Si{04Lwvy zc+XP(O0lOF>FF}Q!jjiAIHa%o#UOr!fznSYSt;E?=?I!CQ3h#VuLVnIxb?f<91Ijk z7Dn(OLz^)UK)+PAN~=fkLevNh52qxgLlJA{qAS9Pe1?3(3K;LfU5D$#Bpuw%mV3UiZFwvfm zKriEi>BzMLYlQ{of+BPWY9Fa#6ljy=to#hjOQPYX&-JyxsewC6$G@c)jwM2{@V>~4 zz(Ocr`@}a`wkI8UDf}wlt?GVbNxyYj7 zt%P~S)0LPq8iV0$Dv)L4WRB^bk=yznv|>ot!t{3F?9KJ>?!|FU8-Bs=g$qZyV2Z`c zDHevW#JN+Gm(a)BRe(l8mcruFGVd&o+-nhq7YCTivA=f_oZeUj6>p_6V&@D)XTo^Q zI9Rl)ZcaS>Va8y%jm}~Z^u+z=Lb--9eRmhbu|kt}Ge+fIXT-uuyv~HHuu1^2Y8p3lkBj8R^4HY+N&m}seg&z`Q88y$LbR3cA{hH z!~R8N8`d-6=EXBLk5?;PqUUjbI-H!3a$sbeuiuSY5=9y-K`JuC$qU()EVVY;-Nl&1 zmbXAJaw5(E(v#frMHt$2imfO+zFmgpSM>2WSr#9>C^|GRYgO{_L2MsHwsD%^+usd4 zu4?^H9C0b>NQC%00i!hR(a%6jq5ru&e28xu)rd7vYe$7CJE!XxIN~N`6{L7MU|^tU z7-&W+riYoQ#iEhCG|gxaFnn7H&JOkZk7mYSl5un77CG`3SjC_uqIf-$kD0iVVsR;a zF=i;h*kN+B<(15m__N|w+{wzb9oSCmPYjNN=1lRe1$U`ePQ%M&kE_HZKBdbeR>Q@@ z*xsef6E^9BPAo#bE<@R+iw!OwOw2Nr3ogE0g|a(>fKR{?>BHyK`?fxEXwbfXzAgTo z5t})Ia))L8N?ZI^wMOImnL}(uaimmI;4$`O0*^f=F(h#daIyB-Z;Z=UUb6AuUV$qmrb zpZ5b7@BByN;`kGb& zIRhSy+U6ucJQIJ(_&cjBZ!Et-&2!#jt@OxZZH%+7k|SdjN;HSsngBdeoNbP@Do#8lDJtF5`I}0)`T?N@` zX=!Mvg4M9GQN))5bEQ^b)0bQ8j#ZvkVL?YEoScD=B+^an%)8vumB-`96ntDb6He;j z6Qd3i>~F`?JN65mbSz(@+ zTk7sANXHp#7OgxZ>nk0VJo;W~v&+zM+;@ou9ln#9v$a_#voY?$@m*y&vEnv5`%h-3 zAy3zx%*F*hj5GUI>{fA#8~eb^UR!YcP-XqZX>sS+(q7I}+B}b6_saRF#l31#8(TNP z^88vJGQMri)7L4lE`1>nJ)KrM^d%aLCADS+2exUM8VVr>RY06v+-~*tTB;7$cJVg8 zK1H)a|VNL4R*z&lGi!W_4pS z180z(w+hon?O}FnOK7}GD=o_k*X~ZihpfN5^HUo}o;V=fRr>{7sN8FppVQD&^JY!W z57#bt<*szrcOk*nyxeOasO%eqN#64?vr|#q$r(VfYr*F0f8W_>!+Op`s&C*t{XJ)W z4>vjZ2CiLR?i*O@^c_G9_$)Gf$H(KaHjoQoPnyEC`Mz5jhka6bnD{p}*v-)&n63