mirror of https://github.com/bsnes-emu/bsnes.git
Update to v088r01 release.
byuu says: - GB::CPU::Core -> Processor::LR35902 - Processor::LR35902 -> jump table to switch table - GB::LCD -> GB::PPU - static frequency for DMG (no multiplication on clock ticks) - GB::PPU::interface->videoRefresh() moved outside scheduler (use host thread) - namespace NES -> Famicom - namespace SNES -> SuperFamicom - namespace GB -> GameBoy - namespace GBA -> GameBoyAdvance - removed boot.rom writeout in GB::System
This commit is contained in:
parent
77bb5b7891
commit
abe639ea91
|
@ -1,7 +1,7 @@
|
|||
#ifndef BASE_HPP
|
||||
#define BASE_HPP
|
||||
|
||||
static const char Version[] = "088";
|
||||
static const char Version[] = "088.01";
|
||||
|
||||
#include <nall/platform.hpp>
|
||||
#include <nall/algorithm.hpp>
|
||||
|
|
|
@ -2,7 +2,7 @@ options += gameboy
|
|||
|
||||
gb_objects := gb-interface gb-system gb-scheduler
|
||||
gb_objects += gb-memory gb-cartridge
|
||||
gb_objects += gb-cpu gb-apu gb-lcd
|
||||
gb_objects += gb-cpu gb-ppu gb-apu
|
||||
gb_objects += gb-cheat gb-video
|
||||
objects += $(gb_objects)
|
||||
|
||||
|
@ -12,7 +12,7 @@ obj/gb-scheduler.o: $(gb)/scheduler/scheduler.cpp $(call rwildcard,$(gb)/schedul
|
|||
obj/gb-cartridge.o: $(gb)/cartridge/cartridge.cpp $(call rwildcard,$(gb)/cartridge/)
|
||||
obj/gb-memory.o: $(gb)/memory/memory.cpp $(call rwildcard,$(gb)/memory/)
|
||||
obj/gb-cpu.o: $(gb)/cpu/cpu.cpp $(call rwildcard,$(gb)/cpu/)
|
||||
obj/gb-ppu.o: $(gb)/ppu/ppu.cpp $(call rwildcard,$(gb)/ppu/)
|
||||
obj/gb-apu.o: $(gb)/apu/apu.cpp $(call rwildcard,$(gb)/apu/)
|
||||
obj/gb-lcd.o: $(gb)/lcd/lcd.cpp $(call rwildcard,$(gb)/lcd/)
|
||||
obj/gb-cheat.o: $(gb)/cheat/cheat.cpp $(call rwildcard,$(gb)/cheat/)
|
||||
obj/gb-video.o: $(gb)/video/video.cpp $(call rwildcard,$(gb)/video/)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
#define APU_CPP
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
#include "square1/square1.cpp"
|
||||
#include "square2/square2.cpp"
|
||||
|
@ -48,7 +48,7 @@ void APU::main() {
|
|||
|
||||
interface->audioSample(master.center, master.left, master.right);
|
||||
|
||||
clock += 1 * cpu.frequency;
|
||||
clock++;
|
||||
if(clock >= 0 && scheduler.sync != Scheduler::SynchronizeMode::All) co_switch(scheduler.active_thread = cpu.thread);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
#define CARTRIDGE_CPP
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
#include "mbc0/mbc0.cpp"
|
||||
#include "mbc1/mbc1.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
Cheat cheat;
|
||||
|
||||
|
|
|
@ -1,145 +0,0 @@
|
|||
#include "registers.hpp"
|
||||
void (CPU::*opcode_table[256])();
|
||||
void (CPU::*opcode_table_cb[256])();
|
||||
void initialize_opcode_table();
|
||||
|
||||
void op_xx();
|
||||
void op_cb();
|
||||
|
||||
//8-bit load commands
|
||||
template<unsigned x, unsigned y> void op_ld_r_r();
|
||||
template<unsigned x> void op_ld_r_n();
|
||||
template<unsigned x> void op_ld_r_hl();
|
||||
template<unsigned x> void op_ld_hl_r();
|
||||
void op_ld_hl_n();
|
||||
template<unsigned x> void op_ld_a_rr();
|
||||
void op_ld_a_nn();
|
||||
template<unsigned x> void op_ld_rr_a();
|
||||
void op_ld_nn_a();
|
||||
void op_ld_a_ffn();
|
||||
void op_ld_ffn_a();
|
||||
void op_ld_a_ffc();
|
||||
void op_ld_ffc_a();
|
||||
void op_ldi_hl_a();
|
||||
void op_ldi_a_hl();
|
||||
void op_ldd_hl_a();
|
||||
void op_ldd_a_hl();
|
||||
|
||||
//16-bit load commands
|
||||
template<unsigned x> void op_ld_rr_nn();
|
||||
void op_ld_nn_sp();
|
||||
void op_ld_sp_hl();
|
||||
template<unsigned x> void op_push_rr();
|
||||
template<unsigned x> void op_pop_rr();
|
||||
|
||||
//8-bit arithmetic commands
|
||||
void opi_add_a(uint8 x);
|
||||
template<unsigned x> void op_add_a_r();
|
||||
void op_add_a_n();
|
||||
void op_add_a_hl();
|
||||
|
||||
void opi_adc_a(uint8 x);
|
||||
template<unsigned x> void op_adc_a_r();
|
||||
void op_adc_a_n();
|
||||
void op_adc_a_hl();
|
||||
|
||||
void opi_sub_a(uint8 x);
|
||||
template<unsigned x> void op_sub_a_r();
|
||||
void op_sub_a_n();
|
||||
void op_sub_a_hl();
|
||||
|
||||
void opi_sbc_a(uint8 x);
|
||||
template<unsigned x> void op_sbc_a_r();
|
||||
void op_sbc_a_n();
|
||||
void op_sbc_a_hl();
|
||||
|
||||
void opi_and_a(uint8 x);
|
||||
template<unsigned x> void op_and_a_r();
|
||||
void op_and_a_n();
|
||||
void op_and_a_hl();
|
||||
|
||||
void opi_xor_a(uint8 x);
|
||||
template<unsigned x> void op_xor_a_r();
|
||||
void op_xor_a_n();
|
||||
void op_xor_a_hl();
|
||||
|
||||
void opi_or_a(uint8 x);
|
||||
template<unsigned x> void op_or_a_r();
|
||||
void op_or_a_n();
|
||||
void op_or_a_hl();
|
||||
|
||||
void opi_cp_a(uint8 x);
|
||||
template<unsigned x> void op_cp_a_r();
|
||||
void op_cp_a_n();
|
||||
void op_cp_a_hl();
|
||||
|
||||
template<unsigned x> void op_inc_r();
|
||||
void op_inc_hl();
|
||||
template<unsigned x> void op_dec_r();
|
||||
void op_dec_hl();
|
||||
void op_daa();
|
||||
void op_cpl();
|
||||
|
||||
//16-bit arithmetic commands
|
||||
template<unsigned x> void op_add_hl_rr();
|
||||
template<unsigned x> void op_inc_rr();
|
||||
template<unsigned x> void op_dec_rr();
|
||||
void op_add_sp_n();
|
||||
void op_ld_hl_sp_n();
|
||||
|
||||
//rotate/shift commands
|
||||
void op_rlca();
|
||||
void op_rla();
|
||||
void op_rrca();
|
||||
void op_rra();
|
||||
template<unsigned x> void op_rlc_r();
|
||||
void op_rlc_hl();
|
||||
template<unsigned x> void op_rl_r();
|
||||
void op_rl_hl();
|
||||
template<unsigned x> void op_rrc_r();
|
||||
void op_rrc_hl();
|
||||
template<unsigned x> void op_rr_r();
|
||||
void op_rr_hl();
|
||||
template<unsigned x> void op_sla_r();
|
||||
void op_sla_hl();
|
||||
template<unsigned x> void op_swap_r();
|
||||
void op_swap_hl();
|
||||
template<unsigned x> void op_sra_r();
|
||||
void op_sra_hl();
|
||||
template<unsigned x> void op_srl_r();
|
||||
void op_srl_hl();
|
||||
|
||||
//single-bit commands
|
||||
template<unsigned b, unsigned x> void op_bit_n_r();
|
||||
template<unsigned b> void op_bit_n_hl();
|
||||
template<unsigned b, unsigned x> void op_set_n_r();
|
||||
template<unsigned b> void op_set_n_hl();
|
||||
template<unsigned b, unsigned x> void op_res_n_r();
|
||||
template<unsigned b> void op_res_n_hl();
|
||||
|
||||
//control commands
|
||||
void op_ccf();
|
||||
void op_scf();
|
||||
void op_nop();
|
||||
void op_halt();
|
||||
void op_stop();
|
||||
void op_di();
|
||||
void op_ei();
|
||||
|
||||
//jump commands
|
||||
void op_jp_nn();
|
||||
void op_jp_hl();
|
||||
template<unsigned x, bool y> void op_jp_f_nn();
|
||||
void op_jr_n();
|
||||
template<unsigned x, bool y> void op_jr_f_n();
|
||||
void op_call_nn();
|
||||
template<unsigned x, bool y> void op_call_f_nn();
|
||||
void op_ret();
|
||||
template<unsigned x, bool y> void op_ret_f();
|
||||
void op_reti();
|
||||
template<unsigned n> void op_rst_n();
|
||||
|
||||
//disassembler.cpp
|
||||
string disassemble(uint16 pc);
|
||||
string disassemble_opcode(uint16 pc);
|
||||
string disassemble_opcode_cb(uint16 pc);
|
|
@ -1,519 +0,0 @@
|
|||
#ifdef CPU_CPP
|
||||
|
||||
void CPU::initialize_opcode_table() {
|
||||
opcode_table[0x00] = &CPU::op_nop;
|
||||
opcode_table[0x01] = &CPU::op_ld_rr_nn<BC>;
|
||||
opcode_table[0x02] = &CPU::op_ld_rr_a<BC>;
|
||||
opcode_table[0x03] = &CPU::op_inc_rr<BC>;
|
||||
opcode_table[0x04] = &CPU::op_inc_r<B>;
|
||||
opcode_table[0x05] = &CPU::op_dec_r<B>;
|
||||
opcode_table[0x06] = &CPU::op_ld_r_n<B>;
|
||||
opcode_table[0x07] = &CPU::op_rlca;
|
||||
opcode_table[0x08] = &CPU::op_ld_nn_sp;
|
||||
opcode_table[0x09] = &CPU::op_add_hl_rr<BC>;
|
||||
opcode_table[0x0a] = &CPU::op_ld_a_rr<BC>;
|
||||
opcode_table[0x0b] = &CPU::op_dec_rr<BC>;
|
||||
opcode_table[0x0c] = &CPU::op_inc_r<C>;
|
||||
opcode_table[0x0d] = &CPU::op_dec_r<C>;
|
||||
opcode_table[0x0e] = &CPU::op_ld_r_n<C>;
|
||||
opcode_table[0x0f] = &CPU::op_rrca;
|
||||
opcode_table[0x10] = &CPU::op_stop;
|
||||
opcode_table[0x11] = &CPU::op_ld_rr_nn<DE>;
|
||||
opcode_table[0x12] = &CPU::op_ld_rr_a<DE>;
|
||||
opcode_table[0x13] = &CPU::op_inc_rr<DE>;
|
||||
opcode_table[0x14] = &CPU::op_inc_r<D>;
|
||||
opcode_table[0x15] = &CPU::op_dec_r<D>;
|
||||
opcode_table[0x16] = &CPU::op_ld_r_n<D>;
|
||||
opcode_table[0x17] = &CPU::op_rla;
|
||||
opcode_table[0x18] = &CPU::op_jr_n;
|
||||
opcode_table[0x19] = &CPU::op_add_hl_rr<DE>;
|
||||
opcode_table[0x1a] = &CPU::op_ld_a_rr<DE>;
|
||||
opcode_table[0x1b] = &CPU::op_dec_rr<DE>;
|
||||
opcode_table[0x1c] = &CPU::op_inc_r<E>;
|
||||
opcode_table[0x1d] = &CPU::op_dec_r<E>;
|
||||
opcode_table[0x1e] = &CPU::op_ld_r_n<E>;
|
||||
opcode_table[0x1f] = &CPU::op_rra;
|
||||
opcode_table[0x20] = &CPU::op_jr_f_n<ZF, 0>;
|
||||
opcode_table[0x21] = &CPU::op_ld_rr_nn<HL>;
|
||||
opcode_table[0x22] = &CPU::op_ldi_hl_a;
|
||||
opcode_table[0x23] = &CPU::op_inc_rr<HL>;
|
||||
opcode_table[0x24] = &CPU::op_inc_r<H>;
|
||||
opcode_table[0x25] = &CPU::op_dec_r<H>;
|
||||
opcode_table[0x26] = &CPU::op_ld_r_n<H>;
|
||||
opcode_table[0x27] = &CPU::op_daa;
|
||||
opcode_table[0x28] = &CPU::op_jr_f_n<ZF, 1>;
|
||||
opcode_table[0x29] = &CPU::op_add_hl_rr<HL>;
|
||||
opcode_table[0x2a] = &CPU::op_ldi_a_hl;
|
||||
opcode_table[0x2b] = &CPU::op_dec_rr<HL>;
|
||||
opcode_table[0x2c] = &CPU::op_inc_r<L>;
|
||||
opcode_table[0x2d] = &CPU::op_dec_r<L>;
|
||||
opcode_table[0x2e] = &CPU::op_ld_r_n<L>;
|
||||
opcode_table[0x2f] = &CPU::op_cpl;
|
||||
opcode_table[0x30] = &CPU::op_jr_f_n<CF, 0>;
|
||||
opcode_table[0x31] = &CPU::op_ld_rr_nn<SP>;
|
||||
opcode_table[0x32] = &CPU::op_ldd_hl_a;
|
||||
opcode_table[0x33] = &CPU::op_inc_rr<SP>;
|
||||
opcode_table[0x34] = &CPU::op_inc_hl;
|
||||
opcode_table[0x35] = &CPU::op_dec_hl;
|
||||
opcode_table[0x36] = &CPU::op_ld_hl_n;
|
||||
opcode_table[0x37] = &CPU::op_scf;
|
||||
opcode_table[0x38] = &CPU::op_jr_f_n<CF, 1>;
|
||||
opcode_table[0x39] = &CPU::op_add_hl_rr<SP>;
|
||||
opcode_table[0x3a] = &CPU::op_ldd_a_hl;
|
||||
opcode_table[0x3b] = &CPU::op_dec_rr<SP>;
|
||||
opcode_table[0x3c] = &CPU::op_inc_r<A>;
|
||||
opcode_table[0x3d] = &CPU::op_dec_r<A>;
|
||||
opcode_table[0x3e] = &CPU::op_ld_r_n<A>;
|
||||
opcode_table[0x3f] = &CPU::op_ccf;
|
||||
opcode_table[0x40] = &CPU::op_ld_r_r<B, B>;
|
||||
opcode_table[0x41] = &CPU::op_ld_r_r<B, C>;
|
||||
opcode_table[0x42] = &CPU::op_ld_r_r<B, D>;
|
||||
opcode_table[0x43] = &CPU::op_ld_r_r<B, E>;
|
||||
opcode_table[0x44] = &CPU::op_ld_r_r<B, H>;
|
||||
opcode_table[0x45] = &CPU::op_ld_r_r<B, L>;
|
||||
opcode_table[0x46] = &CPU::op_ld_r_hl<B>;
|
||||
opcode_table[0x47] = &CPU::op_ld_r_r<B, A>;
|
||||
opcode_table[0x48] = &CPU::op_ld_r_r<C, B>;
|
||||
opcode_table[0x49] = &CPU::op_ld_r_r<C, C>;
|
||||
opcode_table[0x4a] = &CPU::op_ld_r_r<C, D>;
|
||||
opcode_table[0x4b] = &CPU::op_ld_r_r<C, E>;
|
||||
opcode_table[0x4c] = &CPU::op_ld_r_r<C, H>;
|
||||
opcode_table[0x4d] = &CPU::op_ld_r_r<C, L>;
|
||||
opcode_table[0x4e] = &CPU::op_ld_r_hl<C>;
|
||||
opcode_table[0x4f] = &CPU::op_ld_r_r<C, A>;
|
||||
opcode_table[0x50] = &CPU::op_ld_r_r<D, B>;
|
||||
opcode_table[0x51] = &CPU::op_ld_r_r<D, C>;
|
||||
opcode_table[0x52] = &CPU::op_ld_r_r<D, D>;
|
||||
opcode_table[0x53] = &CPU::op_ld_r_r<D, E>;
|
||||
opcode_table[0x54] = &CPU::op_ld_r_r<D, H>;
|
||||
opcode_table[0x55] = &CPU::op_ld_r_r<D, L>;
|
||||
opcode_table[0x56] = &CPU::op_ld_r_hl<D>;
|
||||
opcode_table[0x57] = &CPU::op_ld_r_r<D, A>;
|
||||
opcode_table[0x58] = &CPU::op_ld_r_r<E, B>;
|
||||
opcode_table[0x59] = &CPU::op_ld_r_r<E, C>;
|
||||
opcode_table[0x5a] = &CPU::op_ld_r_r<E, D>;
|
||||
opcode_table[0x5b] = &CPU::op_ld_r_r<E, E>;
|
||||
opcode_table[0x5c] = &CPU::op_ld_r_r<E, H>;
|
||||
opcode_table[0x5d] = &CPU::op_ld_r_r<E, L>;
|
||||
opcode_table[0x5e] = &CPU::op_ld_r_hl<E>;
|
||||
opcode_table[0x5f] = &CPU::op_ld_r_r<E, A>;
|
||||
opcode_table[0x60] = &CPU::op_ld_r_r<H, B>;
|
||||
opcode_table[0x61] = &CPU::op_ld_r_r<H, C>;
|
||||
opcode_table[0x62] = &CPU::op_ld_r_r<H, D>;
|
||||
opcode_table[0x63] = &CPU::op_ld_r_r<H, E>;
|
||||
opcode_table[0x64] = &CPU::op_ld_r_r<H, H>;
|
||||
opcode_table[0x65] = &CPU::op_ld_r_r<H, L>;
|
||||
opcode_table[0x66] = &CPU::op_ld_r_hl<H>;
|
||||
opcode_table[0x67] = &CPU::op_ld_r_r<H, A>;
|
||||
opcode_table[0x68] = &CPU::op_ld_r_r<L, B>;
|
||||
opcode_table[0x69] = &CPU::op_ld_r_r<L, C>;
|
||||
opcode_table[0x6a] = &CPU::op_ld_r_r<L, D>;
|
||||
opcode_table[0x6b] = &CPU::op_ld_r_r<L, E>;
|
||||
opcode_table[0x6c] = &CPU::op_ld_r_r<L, H>;
|
||||
opcode_table[0x6d] = &CPU::op_ld_r_r<L, L>;
|
||||
opcode_table[0x6e] = &CPU::op_ld_r_hl<L>;
|
||||
opcode_table[0x6f] = &CPU::op_ld_r_r<L, A>;
|
||||
opcode_table[0x70] = &CPU::op_ld_hl_r<B>;
|
||||
opcode_table[0x71] = &CPU::op_ld_hl_r<C>;
|
||||
opcode_table[0x72] = &CPU::op_ld_hl_r<D>;
|
||||
opcode_table[0x73] = &CPU::op_ld_hl_r<E>;
|
||||
opcode_table[0x74] = &CPU::op_ld_hl_r<H>;
|
||||
opcode_table[0x75] = &CPU::op_ld_hl_r<L>;
|
||||
opcode_table[0x76] = &CPU::op_halt;
|
||||
opcode_table[0x77] = &CPU::op_ld_hl_r<A>;
|
||||
opcode_table[0x78] = &CPU::op_ld_r_r<A, B>;
|
||||
opcode_table[0x79] = &CPU::op_ld_r_r<A, C>;
|
||||
opcode_table[0x7a] = &CPU::op_ld_r_r<A, D>;
|
||||
opcode_table[0x7b] = &CPU::op_ld_r_r<A, E>;
|
||||
opcode_table[0x7c] = &CPU::op_ld_r_r<A, H>;
|
||||
opcode_table[0x7d] = &CPU::op_ld_r_r<A, L>;
|
||||
opcode_table[0x7e] = &CPU::op_ld_r_hl<A>;
|
||||
opcode_table[0x7f] = &CPU::op_ld_r_r<A, A>;
|
||||
opcode_table[0x80] = &CPU::op_add_a_r<B>;
|
||||
opcode_table[0x81] = &CPU::op_add_a_r<C>;
|
||||
opcode_table[0x82] = &CPU::op_add_a_r<D>;
|
||||
opcode_table[0x83] = &CPU::op_add_a_r<E>;
|
||||
opcode_table[0x84] = &CPU::op_add_a_r<H>;
|
||||
opcode_table[0x85] = &CPU::op_add_a_r<L>;
|
||||
opcode_table[0x86] = &CPU::op_add_a_hl;
|
||||
opcode_table[0x87] = &CPU::op_add_a_r<A>;
|
||||
opcode_table[0x88] = &CPU::op_adc_a_r<B>;
|
||||
opcode_table[0x89] = &CPU::op_adc_a_r<C>;
|
||||
opcode_table[0x8a] = &CPU::op_adc_a_r<D>;
|
||||
opcode_table[0x8b] = &CPU::op_adc_a_r<E>;
|
||||
opcode_table[0x8c] = &CPU::op_adc_a_r<H>;
|
||||
opcode_table[0x8d] = &CPU::op_adc_a_r<L>;
|
||||
opcode_table[0x8e] = &CPU::op_adc_a_hl;
|
||||
opcode_table[0x8f] = &CPU::op_adc_a_r<A>;
|
||||
opcode_table[0x90] = &CPU::op_sub_a_r<B>;
|
||||
opcode_table[0x91] = &CPU::op_sub_a_r<C>;
|
||||
opcode_table[0x92] = &CPU::op_sub_a_r<D>;
|
||||
opcode_table[0x93] = &CPU::op_sub_a_r<E>;
|
||||
opcode_table[0x94] = &CPU::op_sub_a_r<H>;
|
||||
opcode_table[0x95] = &CPU::op_sub_a_r<L>;
|
||||
opcode_table[0x96] = &CPU::op_sub_a_hl;
|
||||
opcode_table[0x97] = &CPU::op_sub_a_r<A>;
|
||||
opcode_table[0x98] = &CPU::op_sbc_a_r<B>;
|
||||
opcode_table[0x99] = &CPU::op_sbc_a_r<C>;
|
||||
opcode_table[0x9a] = &CPU::op_sbc_a_r<D>;
|
||||
opcode_table[0x9b] = &CPU::op_sbc_a_r<E>;
|
||||
opcode_table[0x9c] = &CPU::op_sbc_a_r<H>;
|
||||
opcode_table[0x9d] = &CPU::op_sbc_a_r<L>;
|
||||
opcode_table[0x9e] = &CPU::op_sbc_a_hl;
|
||||
opcode_table[0x9f] = &CPU::op_sbc_a_r<A>;
|
||||
opcode_table[0xa0] = &CPU::op_and_a_r<B>;
|
||||
opcode_table[0xa1] = &CPU::op_and_a_r<C>;
|
||||
opcode_table[0xa2] = &CPU::op_and_a_r<D>;
|
||||
opcode_table[0xa3] = &CPU::op_and_a_r<E>;
|
||||
opcode_table[0xa4] = &CPU::op_and_a_r<H>;
|
||||
opcode_table[0xa5] = &CPU::op_and_a_r<L>;
|
||||
opcode_table[0xa6] = &CPU::op_and_a_hl;
|
||||
opcode_table[0xa7] = &CPU::op_and_a_r<A>;
|
||||
opcode_table[0xa8] = &CPU::op_xor_a_r<B>;
|
||||
opcode_table[0xa9] = &CPU::op_xor_a_r<C>;
|
||||
opcode_table[0xaa] = &CPU::op_xor_a_r<D>;
|
||||
opcode_table[0xab] = &CPU::op_xor_a_r<E>;
|
||||
opcode_table[0xac] = &CPU::op_xor_a_r<H>;
|
||||
opcode_table[0xad] = &CPU::op_xor_a_r<L>;
|
||||
opcode_table[0xae] = &CPU::op_xor_a_hl;
|
||||
opcode_table[0xaf] = &CPU::op_xor_a_r<A>;
|
||||
opcode_table[0xb0] = &CPU::op_or_a_r<B>;
|
||||
opcode_table[0xb1] = &CPU::op_or_a_r<C>;
|
||||
opcode_table[0xb2] = &CPU::op_or_a_r<D>;
|
||||
opcode_table[0xb3] = &CPU::op_or_a_r<E>;
|
||||
opcode_table[0xb4] = &CPU::op_or_a_r<H>;
|
||||
opcode_table[0xb5] = &CPU::op_or_a_r<L>;
|
||||
opcode_table[0xb6] = &CPU::op_or_a_hl;
|
||||
opcode_table[0xb7] = &CPU::op_or_a_r<A>;
|
||||
opcode_table[0xb8] = &CPU::op_cp_a_r<B>;
|
||||
opcode_table[0xb9] = &CPU::op_cp_a_r<C>;
|
||||
opcode_table[0xba] = &CPU::op_cp_a_r<D>;
|
||||
opcode_table[0xbb] = &CPU::op_cp_a_r<E>;
|
||||
opcode_table[0xbc] = &CPU::op_cp_a_r<H>;
|
||||
opcode_table[0xbd] = &CPU::op_cp_a_r<L>;
|
||||
opcode_table[0xbe] = &CPU::op_cp_a_hl;
|
||||
opcode_table[0xbf] = &CPU::op_cp_a_r<A>;
|
||||
opcode_table[0xc0] = &CPU::op_ret_f<ZF, 0>;
|
||||
opcode_table[0xc1] = &CPU::op_pop_rr<BC>;
|
||||
opcode_table[0xc2] = &CPU::op_jp_f_nn<ZF, 0>;
|
||||
opcode_table[0xc3] = &CPU::op_jp_nn;
|
||||
opcode_table[0xc4] = &CPU::op_call_f_nn<ZF, 0>;
|
||||
opcode_table[0xc5] = &CPU::op_push_rr<BC>;
|
||||
opcode_table[0xc6] = &CPU::op_add_a_n;
|
||||
opcode_table[0xc7] = &CPU::op_rst_n<0x00>;
|
||||
opcode_table[0xc8] = &CPU::op_ret_f<ZF, 1>;
|
||||
opcode_table[0xc9] = &CPU::op_ret;
|
||||
opcode_table[0xca] = &CPU::op_jp_f_nn<ZF, 1>;
|
||||
opcode_table[0xcb] = &CPU::op_cb;
|
||||
opcode_table[0xcc] = &CPU::op_call_f_nn<ZF, 1>;
|
||||
opcode_table[0xcd] = &CPU::op_call_nn;
|
||||
opcode_table[0xce] = &CPU::op_adc_a_n;
|
||||
opcode_table[0xcf] = &CPU::op_rst_n<0x08>;
|
||||
opcode_table[0xd0] = &CPU::op_ret_f<CF, 0>;
|
||||
opcode_table[0xd1] = &CPU::op_pop_rr<DE>;
|
||||
opcode_table[0xd2] = &CPU::op_jp_f_nn<CF, 0>;
|
||||
opcode_table[0xd3] = &CPU::op_xx;
|
||||
opcode_table[0xd4] = &CPU::op_call_f_nn<CF, 0>;
|
||||
opcode_table[0xd5] = &CPU::op_push_rr<DE>;
|
||||
opcode_table[0xd6] = &CPU::op_sub_a_n;
|
||||
opcode_table[0xd7] = &CPU::op_rst_n<0x10>;
|
||||
opcode_table[0xd8] = &CPU::op_ret_f<CF, 1>;
|
||||
opcode_table[0xd9] = &CPU::op_reti;
|
||||
opcode_table[0xda] = &CPU::op_jp_f_nn<CF, 1>;
|
||||
opcode_table[0xdb] = &CPU::op_xx;
|
||||
opcode_table[0xdc] = &CPU::op_call_f_nn<CF, 1>;
|
||||
opcode_table[0xdd] = &CPU::op_xx;
|
||||
opcode_table[0xde] = &CPU::op_sbc_a_n;
|
||||
opcode_table[0xdf] = &CPU::op_rst_n<0x18>;
|
||||
opcode_table[0xe0] = &CPU::op_ld_ffn_a;
|
||||
opcode_table[0xe1] = &CPU::op_pop_rr<HL>;
|
||||
opcode_table[0xe2] = &CPU::op_ld_ffc_a;
|
||||
opcode_table[0xe3] = &CPU::op_xx;
|
||||
opcode_table[0xe4] = &CPU::op_xx;
|
||||
opcode_table[0xe5] = &CPU::op_push_rr<HL>;
|
||||
opcode_table[0xe6] = &CPU::op_and_a_n;
|
||||
opcode_table[0xe7] = &CPU::op_rst_n<0x20>;
|
||||
opcode_table[0xe8] = &CPU::op_add_sp_n;
|
||||
opcode_table[0xe9] = &CPU::op_jp_hl;
|
||||
opcode_table[0xea] = &CPU::op_ld_nn_a;
|
||||
opcode_table[0xeb] = &CPU::op_xx;
|
||||
opcode_table[0xec] = &CPU::op_xx;
|
||||
opcode_table[0xed] = &CPU::op_xx;
|
||||
opcode_table[0xee] = &CPU::op_xor_a_n;
|
||||
opcode_table[0xef] = &CPU::op_rst_n<0x28>;
|
||||
opcode_table[0xf0] = &CPU::op_ld_a_ffn;
|
||||
opcode_table[0xf1] = &CPU::op_pop_rr<AF>;
|
||||
opcode_table[0xf2] = &CPU::op_ld_a_ffc;
|
||||
opcode_table[0xf3] = &CPU::op_di;
|
||||
opcode_table[0xf4] = &CPU::op_xx;
|
||||
opcode_table[0xf5] = &CPU::op_push_rr<AF>;
|
||||
opcode_table[0xf6] = &CPU::op_or_a_n;
|
||||
opcode_table[0xf7] = &CPU::op_rst_n<0x30>;
|
||||
opcode_table[0xf8] = &CPU::op_ld_hl_sp_n;
|
||||
opcode_table[0xf9] = &CPU::op_ld_sp_hl;
|
||||
opcode_table[0xfa] = &CPU::op_ld_a_nn;
|
||||
opcode_table[0xfb] = &CPU::op_ei;
|
||||
opcode_table[0xfc] = &CPU::op_xx;
|
||||
opcode_table[0xfd] = &CPU::op_xx;
|
||||
opcode_table[0xfe] = &CPU::op_cp_a_n;
|
||||
opcode_table[0xff] = &CPU::op_rst_n<0x38>;
|
||||
|
||||
opcode_table_cb[0x00] = &CPU::op_rlc_r<B>;
|
||||
opcode_table_cb[0x01] = &CPU::op_rlc_r<C>;
|
||||
opcode_table_cb[0x02] = &CPU::op_rlc_r<D>;
|
||||
opcode_table_cb[0x03] = &CPU::op_rlc_r<E>;
|
||||
opcode_table_cb[0x04] = &CPU::op_rlc_r<H>;
|
||||
opcode_table_cb[0x05] = &CPU::op_rlc_r<L>;
|
||||
opcode_table_cb[0x06] = &CPU::op_rlc_hl;
|
||||
opcode_table_cb[0x07] = &CPU::op_rlc_r<A>;
|
||||
opcode_table_cb[0x08] = &CPU::op_rrc_r<B>;
|
||||
opcode_table_cb[0x09] = &CPU::op_rrc_r<C>;
|
||||
opcode_table_cb[0x0a] = &CPU::op_rrc_r<D>;
|
||||
opcode_table_cb[0x0b] = &CPU::op_rrc_r<E>;
|
||||
opcode_table_cb[0x0c] = &CPU::op_rrc_r<H>;
|
||||
opcode_table_cb[0x0d] = &CPU::op_rrc_r<L>;
|
||||
opcode_table_cb[0x0e] = &CPU::op_rrc_hl;
|
||||
opcode_table_cb[0x0f] = &CPU::op_rrc_r<A>;
|
||||
opcode_table_cb[0x10] = &CPU::op_rl_r<B>;
|
||||
opcode_table_cb[0x11] = &CPU::op_rl_r<C>;
|
||||
opcode_table_cb[0x12] = &CPU::op_rl_r<D>;
|
||||
opcode_table_cb[0x13] = &CPU::op_rl_r<E>;
|
||||
opcode_table_cb[0x14] = &CPU::op_rl_r<H>;
|
||||
opcode_table_cb[0x15] = &CPU::op_rl_r<L>;
|
||||
opcode_table_cb[0x16] = &CPU::op_rl_hl;
|
||||
opcode_table_cb[0x17] = &CPU::op_rl_r<A>;
|
||||
opcode_table_cb[0x18] = &CPU::op_rr_r<B>;
|
||||
opcode_table_cb[0x19] = &CPU::op_rr_r<C>;
|
||||
opcode_table_cb[0x1a] = &CPU::op_rr_r<D>;
|
||||
opcode_table_cb[0x1b] = &CPU::op_rr_r<E>;
|
||||
opcode_table_cb[0x1c] = &CPU::op_rr_r<H>;
|
||||
opcode_table_cb[0x1d] = &CPU::op_rr_r<L>;
|
||||
opcode_table_cb[0x1e] = &CPU::op_rr_hl;
|
||||
opcode_table_cb[0x1f] = &CPU::op_rr_r<A>;
|
||||
opcode_table_cb[0x20] = &CPU::op_sla_r<B>;
|
||||
opcode_table_cb[0x21] = &CPU::op_sla_r<C>;
|
||||
opcode_table_cb[0x22] = &CPU::op_sla_r<D>;
|
||||
opcode_table_cb[0x23] = &CPU::op_sla_r<E>;
|
||||
opcode_table_cb[0x24] = &CPU::op_sla_r<H>;
|
||||
opcode_table_cb[0x25] = &CPU::op_sla_r<L>;
|
||||
opcode_table_cb[0x26] = &CPU::op_sla_hl;
|
||||
opcode_table_cb[0x27] = &CPU::op_sla_r<A>;
|
||||
opcode_table_cb[0x28] = &CPU::op_sra_r<B>;
|
||||
opcode_table_cb[0x29] = &CPU::op_sra_r<C>;
|
||||
opcode_table_cb[0x2a] = &CPU::op_sra_r<D>;
|
||||
opcode_table_cb[0x2b] = &CPU::op_sra_r<E>;
|
||||
opcode_table_cb[0x2c] = &CPU::op_sra_r<H>;
|
||||
opcode_table_cb[0x2d] = &CPU::op_sra_r<L>;
|
||||
opcode_table_cb[0x2e] = &CPU::op_sra_hl;
|
||||
opcode_table_cb[0x2f] = &CPU::op_sra_r<A>;
|
||||
opcode_table_cb[0x30] = &CPU::op_swap_r<B>;
|
||||
opcode_table_cb[0x31] = &CPU::op_swap_r<C>;
|
||||
opcode_table_cb[0x32] = &CPU::op_swap_r<D>;
|
||||
opcode_table_cb[0x33] = &CPU::op_swap_r<E>;
|
||||
opcode_table_cb[0x34] = &CPU::op_swap_r<H>;
|
||||
opcode_table_cb[0x35] = &CPU::op_swap_r<L>;
|
||||
opcode_table_cb[0x36] = &CPU::op_swap_hl;
|
||||
opcode_table_cb[0x37] = &CPU::op_swap_r<A>;
|
||||
opcode_table_cb[0x38] = &CPU::op_srl_r<B>;
|
||||
opcode_table_cb[0x39] = &CPU::op_srl_r<C>;
|
||||
opcode_table_cb[0x3a] = &CPU::op_srl_r<D>;
|
||||
opcode_table_cb[0x3b] = &CPU::op_srl_r<E>;
|
||||
opcode_table_cb[0x3c] = &CPU::op_srl_r<H>;
|
||||
opcode_table_cb[0x3d] = &CPU::op_srl_r<L>;
|
||||
opcode_table_cb[0x3e] = &CPU::op_srl_hl;
|
||||
opcode_table_cb[0x3f] = &CPU::op_srl_r<A>;
|
||||
opcode_table_cb[0x40] = &CPU::op_bit_n_r<0, B>;
|
||||
opcode_table_cb[0x41] = &CPU::op_bit_n_r<0, C>;
|
||||
opcode_table_cb[0x42] = &CPU::op_bit_n_r<0, D>;
|
||||
opcode_table_cb[0x43] = &CPU::op_bit_n_r<0, E>;
|
||||
opcode_table_cb[0x44] = &CPU::op_bit_n_r<0, H>;
|
||||
opcode_table_cb[0x45] = &CPU::op_bit_n_r<0, L>;
|
||||
opcode_table_cb[0x46] = &CPU::op_bit_n_hl<0>;
|
||||
opcode_table_cb[0x47] = &CPU::op_bit_n_r<0, A>;
|
||||
opcode_table_cb[0x48] = &CPU::op_bit_n_r<1, B>;
|
||||
opcode_table_cb[0x49] = &CPU::op_bit_n_r<1, C>;
|
||||
opcode_table_cb[0x4a] = &CPU::op_bit_n_r<1, D>;
|
||||
opcode_table_cb[0x4b] = &CPU::op_bit_n_r<1, E>;
|
||||
opcode_table_cb[0x4c] = &CPU::op_bit_n_r<1, H>;
|
||||
opcode_table_cb[0x4d] = &CPU::op_bit_n_r<1, L>;
|
||||
opcode_table_cb[0x4e] = &CPU::op_bit_n_hl<1>;
|
||||
opcode_table_cb[0x4f] = &CPU::op_bit_n_r<1, A>;
|
||||
opcode_table_cb[0x50] = &CPU::op_bit_n_r<2, B>;
|
||||
opcode_table_cb[0x51] = &CPU::op_bit_n_r<2, C>;
|
||||
opcode_table_cb[0x52] = &CPU::op_bit_n_r<2, D>;
|
||||
opcode_table_cb[0x53] = &CPU::op_bit_n_r<2, E>;
|
||||
opcode_table_cb[0x54] = &CPU::op_bit_n_r<2, H>;
|
||||
opcode_table_cb[0x55] = &CPU::op_bit_n_r<2, L>;
|
||||
opcode_table_cb[0x56] = &CPU::op_bit_n_hl<2>;
|
||||
opcode_table_cb[0x57] = &CPU::op_bit_n_r<2, A>;
|
||||
opcode_table_cb[0x58] = &CPU::op_bit_n_r<3, B>;
|
||||
opcode_table_cb[0x59] = &CPU::op_bit_n_r<3, C>;
|
||||
opcode_table_cb[0x5a] = &CPU::op_bit_n_r<3, D>;
|
||||
opcode_table_cb[0x5b] = &CPU::op_bit_n_r<3, E>;
|
||||
opcode_table_cb[0x5c] = &CPU::op_bit_n_r<3, H>;
|
||||
opcode_table_cb[0x5d] = &CPU::op_bit_n_r<3, L>;
|
||||
opcode_table_cb[0x5e] = &CPU::op_bit_n_hl<3>;
|
||||
opcode_table_cb[0x5f] = &CPU::op_bit_n_r<3, A>;
|
||||
opcode_table_cb[0x60] = &CPU::op_bit_n_r<4, B>;
|
||||
opcode_table_cb[0x61] = &CPU::op_bit_n_r<4, C>;
|
||||
opcode_table_cb[0x62] = &CPU::op_bit_n_r<4, D>;
|
||||
opcode_table_cb[0x63] = &CPU::op_bit_n_r<4, E>;
|
||||
opcode_table_cb[0x64] = &CPU::op_bit_n_r<4, H>;
|
||||
opcode_table_cb[0x65] = &CPU::op_bit_n_r<4, L>;
|
||||
opcode_table_cb[0x66] = &CPU::op_bit_n_hl<4>;
|
||||
opcode_table_cb[0x67] = &CPU::op_bit_n_r<4, A>;
|
||||
opcode_table_cb[0x68] = &CPU::op_bit_n_r<5, B>;
|
||||
opcode_table_cb[0x69] = &CPU::op_bit_n_r<5, C>;
|
||||
opcode_table_cb[0x6a] = &CPU::op_bit_n_r<5, D>;
|
||||
opcode_table_cb[0x6b] = &CPU::op_bit_n_r<5, E>;
|
||||
opcode_table_cb[0x6c] = &CPU::op_bit_n_r<5, H>;
|
||||
opcode_table_cb[0x6d] = &CPU::op_bit_n_r<5, L>;
|
||||
opcode_table_cb[0x6e] = &CPU::op_bit_n_hl<5>;
|
||||
opcode_table_cb[0x6f] = &CPU::op_bit_n_r<5, A>;
|
||||
opcode_table_cb[0x70] = &CPU::op_bit_n_r<6, B>;
|
||||
opcode_table_cb[0x71] = &CPU::op_bit_n_r<6, C>;
|
||||
opcode_table_cb[0x72] = &CPU::op_bit_n_r<6, D>;
|
||||
opcode_table_cb[0x73] = &CPU::op_bit_n_r<6, E>;
|
||||
opcode_table_cb[0x74] = &CPU::op_bit_n_r<6, H>;
|
||||
opcode_table_cb[0x75] = &CPU::op_bit_n_r<6, L>;
|
||||
opcode_table_cb[0x76] = &CPU::op_bit_n_hl<6>;
|
||||
opcode_table_cb[0x77] = &CPU::op_bit_n_r<6, A>;
|
||||
opcode_table_cb[0x78] = &CPU::op_bit_n_r<7, B>;
|
||||
opcode_table_cb[0x79] = &CPU::op_bit_n_r<7, C>;
|
||||
opcode_table_cb[0x7a] = &CPU::op_bit_n_r<7, D>;
|
||||
opcode_table_cb[0x7b] = &CPU::op_bit_n_r<7, E>;
|
||||
opcode_table_cb[0x7c] = &CPU::op_bit_n_r<7, H>;
|
||||
opcode_table_cb[0x7d] = &CPU::op_bit_n_r<7, L>;
|
||||
opcode_table_cb[0x7e] = &CPU::op_bit_n_hl<7>;
|
||||
opcode_table_cb[0x7f] = &CPU::op_bit_n_r<7, A>;
|
||||
opcode_table_cb[0x80] = &CPU::op_res_n_r<0, B>;
|
||||
opcode_table_cb[0x81] = &CPU::op_res_n_r<0, C>;
|
||||
opcode_table_cb[0x82] = &CPU::op_res_n_r<0, D>;
|
||||
opcode_table_cb[0x83] = &CPU::op_res_n_r<0, E>;
|
||||
opcode_table_cb[0x84] = &CPU::op_res_n_r<0, H>;
|
||||
opcode_table_cb[0x85] = &CPU::op_res_n_r<0, L>;
|
||||
opcode_table_cb[0x86] = &CPU::op_res_n_hl<0>;
|
||||
opcode_table_cb[0x87] = &CPU::op_res_n_r<0, A>;
|
||||
opcode_table_cb[0x88] = &CPU::op_res_n_r<1, B>;
|
||||
opcode_table_cb[0x89] = &CPU::op_res_n_r<1, C>;
|
||||
opcode_table_cb[0x8a] = &CPU::op_res_n_r<1, D>;
|
||||
opcode_table_cb[0x8b] = &CPU::op_res_n_r<1, E>;
|
||||
opcode_table_cb[0x8c] = &CPU::op_res_n_r<1, H>;
|
||||
opcode_table_cb[0x8d] = &CPU::op_res_n_r<1, L>;
|
||||
opcode_table_cb[0x8e] = &CPU::op_res_n_hl<1>;
|
||||
opcode_table_cb[0x8f] = &CPU::op_res_n_r<1, A>;
|
||||
opcode_table_cb[0x90] = &CPU::op_res_n_r<2, B>;
|
||||
opcode_table_cb[0x91] = &CPU::op_res_n_r<2, C>;
|
||||
opcode_table_cb[0x92] = &CPU::op_res_n_r<2, D>;
|
||||
opcode_table_cb[0x93] = &CPU::op_res_n_r<2, E>;
|
||||
opcode_table_cb[0x94] = &CPU::op_res_n_r<2, H>;
|
||||
opcode_table_cb[0x95] = &CPU::op_res_n_r<2, L>;
|
||||
opcode_table_cb[0x96] = &CPU::op_res_n_hl<2>;
|
||||
opcode_table_cb[0x97] = &CPU::op_res_n_r<2, A>;
|
||||
opcode_table_cb[0x98] = &CPU::op_res_n_r<3, B>;
|
||||
opcode_table_cb[0x99] = &CPU::op_res_n_r<3, C>;
|
||||
opcode_table_cb[0x9a] = &CPU::op_res_n_r<3, D>;
|
||||
opcode_table_cb[0x9b] = &CPU::op_res_n_r<3, E>;
|
||||
opcode_table_cb[0x9c] = &CPU::op_res_n_r<3, H>;
|
||||
opcode_table_cb[0x9d] = &CPU::op_res_n_r<3, L>;
|
||||
opcode_table_cb[0x9e] = &CPU::op_res_n_hl<3>;
|
||||
opcode_table_cb[0x9f] = &CPU::op_res_n_r<3, A>;
|
||||
opcode_table_cb[0xa0] = &CPU::op_res_n_r<4, B>;
|
||||
opcode_table_cb[0xa1] = &CPU::op_res_n_r<4, C>;
|
||||
opcode_table_cb[0xa2] = &CPU::op_res_n_r<4, D>;
|
||||
opcode_table_cb[0xa3] = &CPU::op_res_n_r<4, E>;
|
||||
opcode_table_cb[0xa4] = &CPU::op_res_n_r<4, H>;
|
||||
opcode_table_cb[0xa5] = &CPU::op_res_n_r<4, L>;
|
||||
opcode_table_cb[0xa6] = &CPU::op_res_n_hl<4>;
|
||||
opcode_table_cb[0xa7] = &CPU::op_res_n_r<4, A>;
|
||||
opcode_table_cb[0xa8] = &CPU::op_res_n_r<5, B>;
|
||||
opcode_table_cb[0xa9] = &CPU::op_res_n_r<5, C>;
|
||||
opcode_table_cb[0xaa] = &CPU::op_res_n_r<5, D>;
|
||||
opcode_table_cb[0xab] = &CPU::op_res_n_r<5, E>;
|
||||
opcode_table_cb[0xac] = &CPU::op_res_n_r<5, H>;
|
||||
opcode_table_cb[0xad] = &CPU::op_res_n_r<5, L>;
|
||||
opcode_table_cb[0xae] = &CPU::op_res_n_hl<5>;
|
||||
opcode_table_cb[0xaf] = &CPU::op_res_n_r<5, A>;
|
||||
opcode_table_cb[0xb0] = &CPU::op_res_n_r<6, B>;
|
||||
opcode_table_cb[0xb1] = &CPU::op_res_n_r<6, C>;
|
||||
opcode_table_cb[0xb2] = &CPU::op_res_n_r<6, D>;
|
||||
opcode_table_cb[0xb3] = &CPU::op_res_n_r<6, E>;
|
||||
opcode_table_cb[0xb4] = &CPU::op_res_n_r<6, H>;
|
||||
opcode_table_cb[0xb5] = &CPU::op_res_n_r<6, L>;
|
||||
opcode_table_cb[0xb6] = &CPU::op_res_n_hl<6>;
|
||||
opcode_table_cb[0xb7] = &CPU::op_res_n_r<6, A>;
|
||||
opcode_table_cb[0xb8] = &CPU::op_res_n_r<7, B>;
|
||||
opcode_table_cb[0xb9] = &CPU::op_res_n_r<7, C>;
|
||||
opcode_table_cb[0xba] = &CPU::op_res_n_r<7, D>;
|
||||
opcode_table_cb[0xbb] = &CPU::op_res_n_r<7, E>;
|
||||
opcode_table_cb[0xbc] = &CPU::op_res_n_r<7, H>;
|
||||
opcode_table_cb[0xbd] = &CPU::op_res_n_r<7, L>;
|
||||
opcode_table_cb[0xbe] = &CPU::op_res_n_hl<7>;
|
||||
opcode_table_cb[0xbf] = &CPU::op_res_n_r<7, A>;
|
||||
opcode_table_cb[0xc0] = &CPU::op_set_n_r<0, B>;
|
||||
opcode_table_cb[0xc1] = &CPU::op_set_n_r<0, C>;
|
||||
opcode_table_cb[0xc2] = &CPU::op_set_n_r<0, D>;
|
||||
opcode_table_cb[0xc3] = &CPU::op_set_n_r<0, E>;
|
||||
opcode_table_cb[0xc4] = &CPU::op_set_n_r<0, H>;
|
||||
opcode_table_cb[0xc5] = &CPU::op_set_n_r<0, L>;
|
||||
opcode_table_cb[0xc6] = &CPU::op_set_n_hl<0>;
|
||||
opcode_table_cb[0xc7] = &CPU::op_set_n_r<0, A>;
|
||||
opcode_table_cb[0xc8] = &CPU::op_set_n_r<1, B>;
|
||||
opcode_table_cb[0xc9] = &CPU::op_set_n_r<1, C>;
|
||||
opcode_table_cb[0xca] = &CPU::op_set_n_r<1, D>;
|
||||
opcode_table_cb[0xcb] = &CPU::op_set_n_r<1, E>;
|
||||
opcode_table_cb[0xcc] = &CPU::op_set_n_r<1, H>;
|
||||
opcode_table_cb[0xcd] = &CPU::op_set_n_r<1, L>;
|
||||
opcode_table_cb[0xce] = &CPU::op_set_n_hl<1>;
|
||||
opcode_table_cb[0xcf] = &CPU::op_set_n_r<1, A>;
|
||||
opcode_table_cb[0xd0] = &CPU::op_set_n_r<2, B>;
|
||||
opcode_table_cb[0xd1] = &CPU::op_set_n_r<2, C>;
|
||||
opcode_table_cb[0xd2] = &CPU::op_set_n_r<2, D>;
|
||||
opcode_table_cb[0xd3] = &CPU::op_set_n_r<2, E>;
|
||||
opcode_table_cb[0xd4] = &CPU::op_set_n_r<2, H>;
|
||||
opcode_table_cb[0xd5] = &CPU::op_set_n_r<2, L>;
|
||||
opcode_table_cb[0xd6] = &CPU::op_set_n_hl<2>;
|
||||
opcode_table_cb[0xd7] = &CPU::op_set_n_r<2, A>;
|
||||
opcode_table_cb[0xd8] = &CPU::op_set_n_r<3, B>;
|
||||
opcode_table_cb[0xd9] = &CPU::op_set_n_r<3, C>;
|
||||
opcode_table_cb[0xda] = &CPU::op_set_n_r<3, D>;
|
||||
opcode_table_cb[0xdb] = &CPU::op_set_n_r<3, E>;
|
||||
opcode_table_cb[0xdc] = &CPU::op_set_n_r<3, H>;
|
||||
opcode_table_cb[0xdd] = &CPU::op_set_n_r<3, L>;
|
||||
opcode_table_cb[0xde] = &CPU::op_set_n_hl<3>;
|
||||
opcode_table_cb[0xdf] = &CPU::op_set_n_r<3, A>;
|
||||
opcode_table_cb[0xe0] = &CPU::op_set_n_r<4, B>;
|
||||
opcode_table_cb[0xe1] = &CPU::op_set_n_r<4, C>;
|
||||
opcode_table_cb[0xe2] = &CPU::op_set_n_r<4, D>;
|
||||
opcode_table_cb[0xe3] = &CPU::op_set_n_r<4, E>;
|
||||
opcode_table_cb[0xe4] = &CPU::op_set_n_r<4, H>;
|
||||
opcode_table_cb[0xe5] = &CPU::op_set_n_r<4, L>;
|
||||
opcode_table_cb[0xe6] = &CPU::op_set_n_hl<4>;
|
||||
opcode_table_cb[0xe7] = &CPU::op_set_n_r<4, A>;
|
||||
opcode_table_cb[0xe8] = &CPU::op_set_n_r<5, B>;
|
||||
opcode_table_cb[0xe9] = &CPU::op_set_n_r<5, C>;
|
||||
opcode_table_cb[0xea] = &CPU::op_set_n_r<5, D>;
|
||||
opcode_table_cb[0xeb] = &CPU::op_set_n_r<5, E>;
|
||||
opcode_table_cb[0xec] = &CPU::op_set_n_r<5, H>;
|
||||
opcode_table_cb[0xed] = &CPU::op_set_n_r<5, L>;
|
||||
opcode_table_cb[0xee] = &CPU::op_set_n_hl<5>;
|
||||
opcode_table_cb[0xef] = &CPU::op_set_n_r<5, A>;
|
||||
opcode_table_cb[0xf0] = &CPU::op_set_n_r<6, B>;
|
||||
opcode_table_cb[0xf1] = &CPU::op_set_n_r<6, C>;
|
||||
opcode_table_cb[0xf2] = &CPU::op_set_n_r<6, D>;
|
||||
opcode_table_cb[0xf3] = &CPU::op_set_n_r<6, E>;
|
||||
opcode_table_cb[0xf4] = &CPU::op_set_n_r<6, H>;
|
||||
opcode_table_cb[0xf5] = &CPU::op_set_n_r<6, L>;
|
||||
opcode_table_cb[0xf6] = &CPU::op_set_n_hl<6>;
|
||||
opcode_table_cb[0xf7] = &CPU::op_set_n_r<6, A>;
|
||||
opcode_table_cb[0xf8] = &CPU::op_set_n_r<7, B>;
|
||||
opcode_table_cb[0xf9] = &CPU::op_set_n_r<7, C>;
|
||||
opcode_table_cb[0xfa] = &CPU::op_set_n_r<7, D>;
|
||||
opcode_table_cb[0xfb] = &CPU::op_set_n_r<7, E>;
|
||||
opcode_table_cb[0xfc] = &CPU::op_set_n_r<7, H>;
|
||||
opcode_table_cb[0xfd] = &CPU::op_set_n_r<7, L>;
|
||||
opcode_table_cb[0xfe] = &CPU::op_set_n_hl<7>;
|
||||
opcode_table_cb[0xff] = &CPU::op_set_n_r<7, A>;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,11 +1,11 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
#define CPU_CPP
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
#include "core/core.cpp"
|
||||
#include "mmio/mmio.cpp"
|
||||
#include "timing/timing.cpp"
|
||||
#include "mmio.cpp"
|
||||
#include "memory.cpp"
|
||||
#include "timing.cpp"
|
||||
#include "serialization.cpp"
|
||||
CPU cpu;
|
||||
|
||||
|
@ -20,42 +20,40 @@ void CPU::main() {
|
|||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
}
|
||||
|
||||
if(trace) print(disassemble(r[PC]), "\n");
|
||||
interrupt_test();
|
||||
uint8 opcode = op_read(r[PC]++);
|
||||
(this->*opcode_table[opcode])();
|
||||
exec();
|
||||
}
|
||||
}
|
||||
|
||||
void CPU::interrupt_raise(CPU::Interrupt id) {
|
||||
if(id == Interrupt::Vblank) {
|
||||
status.interrupt_request_vblank = 1;
|
||||
if(status.interrupt_enable_vblank) status.halt = false;
|
||||
if(status.interrupt_enable_vblank) r.halt = false;
|
||||
}
|
||||
|
||||
if(id == Interrupt::Stat) {
|
||||
status.interrupt_request_stat = 1;
|
||||
if(status.interrupt_enable_stat) status.halt = false;
|
||||
if(status.interrupt_enable_stat) r.halt = false;
|
||||
}
|
||||
|
||||
if(id == Interrupt::Timer) {
|
||||
status.interrupt_request_timer = 1;
|
||||
if(status.interrupt_enable_timer) status.halt = false;
|
||||
if(status.interrupt_enable_timer) r.halt = false;
|
||||
}
|
||||
|
||||
if(id == Interrupt::Serial) {
|
||||
status.interrupt_request_serial = 1;
|
||||
if(status.interrupt_enable_serial) status.halt = false;
|
||||
if(status.interrupt_enable_serial) r.halt = false;
|
||||
}
|
||||
|
||||
if(id == Interrupt::Joypad) {
|
||||
status.interrupt_request_joypad = 1;
|
||||
if(status.interrupt_enable_joypad) status.halt = status.stop = false;
|
||||
if(status.interrupt_enable_joypad) r.halt = r.stop = false;
|
||||
}
|
||||
}
|
||||
|
||||
void CPU::interrupt_test() {
|
||||
if(status.ime) {
|
||||
if(r.ime) {
|
||||
if(status.interrupt_request_vblank && status.interrupt_enable_vblank) {
|
||||
status.interrupt_request_vblank = 0;
|
||||
return interrupt_exec(0x0040);
|
||||
|
@ -84,7 +82,7 @@ void CPU::interrupt_test() {
|
|||
}
|
||||
|
||||
void CPU::interrupt_exec(uint16 pc) {
|
||||
status.ime = 0;
|
||||
r.ime = 0;
|
||||
op_write(--r[SP], r[PC] >> 8);
|
||||
op_write(--r[SP], r[PC] >> 0);
|
||||
r[PC] = pc;
|
||||
|
@ -93,8 +91,19 @@ void CPU::interrupt_exec(uint16 pc) {
|
|||
op_io();
|
||||
}
|
||||
|
||||
void CPU::stop() {
|
||||
if(status.speed_switch) {
|
||||
r.stop = false;
|
||||
status.speed_switch = 0;
|
||||
status.speed_double ^= 1;
|
||||
if(status.speed_double == 0) frequency = 4 * 1024 * 1024;
|
||||
if(status.speed_double == 1) frequency = 8 * 1024 * 1024;
|
||||
}
|
||||
}
|
||||
|
||||
void CPU::power() {
|
||||
create(Main, 4 * 1024 * 1024);
|
||||
LR35902::power();
|
||||
|
||||
for(unsigned n = 0xc000; n <= 0xdfff; n++) bus.mmio[n] = this; //WRAM
|
||||
for(unsigned n = 0xe000; n <= 0xfdff; n++) bus.mmio[n] = this; //WRAM (mirror)
|
||||
|
@ -140,10 +149,6 @@ void CPU::power() {
|
|||
r[HL] = 0x0000;
|
||||
|
||||
status.clock = 0;
|
||||
status.halt = false;
|
||||
status.stop = false;
|
||||
status.ei = false;
|
||||
status.ime = 0;
|
||||
|
||||
status.p15 = 0;
|
||||
status.p14 = 0;
|
||||
|
@ -195,8 +200,4 @@ void CPU::power() {
|
|||
status.interrupt_enable_vblank = 0;
|
||||
}
|
||||
|
||||
CPU::CPU() : trace(false) {
|
||||
initialize_opcode_table();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
struct CPU : Thread, MMIO {
|
||||
#include "core/core.hpp"
|
||||
#include "mmio/mmio.hpp"
|
||||
#include "timing/timing.hpp"
|
||||
|
||||
bool trace;
|
||||
|
||||
struct CPU : Processor::LR35902, Thread, MMIO {
|
||||
enum class Interrupt : unsigned {
|
||||
Vblank,
|
||||
Stat,
|
||||
|
@ -15,10 +9,6 @@ struct CPU : Thread, MMIO {
|
|||
|
||||
struct Status {
|
||||
unsigned clock;
|
||||
bool halt;
|
||||
bool stop;
|
||||
bool ei;
|
||||
bool ime;
|
||||
|
||||
//$ff00 JOYP
|
||||
bool p15;
|
||||
|
@ -96,10 +86,32 @@ struct CPU : Thread, MMIO {
|
|||
void interrupt_raise(Interrupt id);
|
||||
void interrupt_test();
|
||||
void interrupt_exec(uint16 pc);
|
||||
void stop();
|
||||
void power();
|
||||
|
||||
void serialize(serializer&);
|
||||
CPU();
|
||||
|
||||
//mmio.cpp
|
||||
unsigned wram_addr(uint16 addr) const;
|
||||
void mmio_joyp_poll();
|
||||
uint8 mmio_read(uint16 addr);
|
||||
void mmio_write(uint16 addr, uint8 data);
|
||||
|
||||
//memory.cpp
|
||||
void op_io();
|
||||
uint8 op_read(uint16 addr);
|
||||
void op_write(uint16 addr, uint8 data);
|
||||
void cycle_edge();
|
||||
uint8 debugger_read(uint16 addr);
|
||||
|
||||
//timing.cpp
|
||||
void add_clocks(unsigned clocks);
|
||||
void timer_262144hz();
|
||||
void timer_65536hz();
|
||||
void timer_16384hz();
|
||||
void timer_8192hz();
|
||||
void timer_4096hz();
|
||||
void hblank();
|
||||
};
|
||||
|
||||
extern CPU cpu;
|
||||
|
|
|
@ -19,10 +19,14 @@ void CPU::op_write(uint16 addr, uint8 data) {
|
|||
}
|
||||
|
||||
void CPU::cycle_edge() {
|
||||
if(status.ei) {
|
||||
status.ei = false;
|
||||
status.ime = 1;
|
||||
if(r.ei) {
|
||||
r.ei = false;
|
||||
r.ime = 1;
|
||||
}
|
||||
}
|
||||
|
||||
uint8 CPU::debugger_read(uint16 addr) {
|
||||
return bus.read(addr);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,4 +0,0 @@
|
|||
unsigned wram_addr(uint16 addr) const;
|
||||
void mmio_joyp_poll();
|
||||
uint8 mmio_read(uint16 addr);
|
||||
void mmio_write(uint16 addr, uint8 data);
|
|
@ -1,30 +1,13 @@
|
|||
#ifdef CPU_CPP
|
||||
|
||||
void CPU::serialize(serializer &s) {
|
||||
LR35902::serialize(s);
|
||||
Thread::serialize(s);
|
||||
|
||||
s.array(wram);
|
||||
s.array(hram);
|
||||
|
||||
s.integer(r.a.data);
|
||||
s.integer(r.f.z);
|
||||
s.integer(r.f.n);
|
||||
s.integer(r.f.h);
|
||||
s.integer(r.f.c);
|
||||
s.integer(r.b.data);
|
||||
s.integer(r.c.data);
|
||||
s.integer(r.d.data);
|
||||
s.integer(r.e.data);
|
||||
s.integer(r.h.data);
|
||||
s.integer(r.l.data);
|
||||
s.integer(r.sp.data);
|
||||
s.integer(r.pc.data);
|
||||
|
||||
s.integer(status.clock);
|
||||
s.integer(status.halt);
|
||||
s.integer(status.stop);
|
||||
s.integer(status.ei);
|
||||
s.integer(status.ime);
|
||||
|
||||
s.integer(status.p15);
|
||||
s.integer(status.p14);
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#ifdef CPU_CPP
|
||||
|
||||
#include "opcode.cpp"
|
||||
|
||||
void CPU::add_clocks(unsigned clocks) {
|
||||
system.clocks_executed += clocks;
|
||||
if(system.sgb()) scheduler.exit(Scheduler::ExitReason::StepEvent);
|
||||
|
@ -23,11 +21,11 @@ void CPU::add_clocks(unsigned clocks) {
|
|||
if((status.clock & 511) == 0) timer_8192hz();
|
||||
if((status.clock & 1023) == 0) timer_4096hz();
|
||||
|
||||
lcd.clock -= clocks * lcd.frequency;
|
||||
if(lcd.clock <= 0) co_switch(scheduler.active_thread = lcd.thread);
|
||||
ppu.clock -= clocks;
|
||||
if(ppu.clock < 0) co_switch(scheduler.active_thread = ppu.thread);
|
||||
|
||||
apu.clock -= clocks * apu.frequency;
|
||||
if(apu.clock <= 0) co_switch(scheduler.active_thread = apu.thread);
|
||||
apu.clock -= clocks;
|
||||
if(apu.clock < 0) co_switch(scheduler.active_thread = apu.thread);
|
||||
}
|
||||
|
||||
void CPU::timer_262144hz() {
|
|
@ -1,13 +0,0 @@
|
|||
void add_clocks(unsigned clocks);
|
||||
void timer_262144hz();
|
||||
void timer_65536hz();
|
||||
void timer_16384hz();
|
||||
void timer_8192hz();
|
||||
void timer_4096hz();
|
||||
void hblank();
|
||||
|
||||
//opcode.cpp
|
||||
void op_io();
|
||||
uint8 op_read(uint16 addr);
|
||||
void op_write(uint16 addr, uint8 data);
|
||||
void cycle_edge();
|
|
@ -1,17 +1,18 @@
|
|||
#ifndef GB_HPP
|
||||
#define GB_HPP
|
||||
#ifndef GAMEBOY_HPP
|
||||
#define GAMEBOY_HPP
|
||||
|
||||
#include <base/base.hpp>
|
||||
#include <processor/lr35902/lr35902.hpp>
|
||||
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
namespace Info {
|
||||
static const char Name[] = "bgbc";
|
||||
static const unsigned SerializerVersion = 3;
|
||||
static const char Name[] = "bgb";
|
||||
static const unsigned SerializerVersion = 4;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
bgbc - Game Boy, Super Game Boy, and Game Boy Color emulator
|
||||
bgb - Game Boy, Super Game Boy, and Game Boy Color emulator
|
||||
author: byuu
|
||||
license: GPLv3
|
||||
project started: 2010-12-27
|
||||
|
@ -19,11 +20,11 @@ namespace GB {
|
|||
|
||||
#include <libco/libco.h>
|
||||
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
struct Thread {
|
||||
cothread_t thread;
|
||||
unsigned frequency;
|
||||
int64 clock;
|
||||
signed clock;
|
||||
|
||||
inline void create(void (*entrypoint)(), unsigned frequency) {
|
||||
if(thread) co_delete(thread);
|
||||
|
@ -50,8 +51,8 @@ namespace GB {
|
|||
#include <gb/scheduler/scheduler.hpp>
|
||||
#include <gb/cartridge/cartridge.hpp>
|
||||
#include <gb/cpu/cpu.hpp>
|
||||
#include <gb/ppu/ppu.hpp>
|
||||
#include <gb/apu/apu.hpp>
|
||||
#include <gb/lcd/lcd.hpp>
|
||||
#include <gb/cheat/cheat.hpp>
|
||||
#include <gb/video/video.hpp>
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
Interface *interface = nullptr;
|
||||
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
unsigned vram_addr(uint16 addr) const;
|
||||
uint8 mmio_read(uint16 addr);
|
||||
void mmio_write(uint16 addr, uint8 data);
|
|
@ -1,7 +1,7 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
#define MEMORY_CPP
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
Unmapped unmapped;
|
||||
Bus bus;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#ifdef LCD_CPP
|
||||
#ifdef PPU_CPP
|
||||
|
||||
void LCD::cgb_render() {
|
||||
void PPU::cgb_render() {
|
||||
for(unsigned n = 0; n < 160; n++) {
|
||||
line[n] = 0x7fff;
|
||||
origin[n] = Origin::None;
|
||||
|
@ -23,7 +23,7 @@ void LCD::cgb_render() {
|
|||
//0x20: horizontal flip
|
||||
//0x08: VRAM bank#
|
||||
//0x07: palette#
|
||||
void LCD::cgb_read_tile(bool select, unsigned x, unsigned y, unsigned &tile, unsigned &attr, unsigned &data) {
|
||||
void PPU::cgb_read_tile(bool select, unsigned x, unsigned y, unsigned &tile, unsigned &attr, unsigned &data) {
|
||||
unsigned tmaddr = 0x1800 + (select << 10);
|
||||
tmaddr += (((y >> 3) << 5) + (x >> 3)) & 0x03ff;
|
||||
|
||||
|
@ -46,7 +46,7 @@ void LCD::cgb_read_tile(bool select, unsigned x, unsigned y, unsigned &tile, uns
|
|||
if(attr & 0x20) data = hflip(data);
|
||||
}
|
||||
|
||||
void LCD::cgb_render_bg() {
|
||||
void PPU::cgb_render_bg() {
|
||||
unsigned iy = (status.ly + status.scy) & 255;
|
||||
unsigned ix = status.scx, tx = ix & 7;
|
||||
|
||||
|
@ -71,7 +71,7 @@ void LCD::cgb_render_bg() {
|
|||
}
|
||||
}
|
||||
|
||||
void LCD::cgb_render_window() {
|
||||
void PPU::cgb_render_window() {
|
||||
if(status.ly - status.wy >= 144u) return;
|
||||
if(status.wx >= 167u) return;
|
||||
unsigned iy = status.wyc++;
|
||||
|
@ -106,7 +106,7 @@ void LCD::cgb_render_window() {
|
|||
//0x20: horizontal flip
|
||||
//0x08: VRAM bank#
|
||||
//0x07: palette#
|
||||
void LCD::cgb_render_ob() {
|
||||
void PPU::cgb_render_ob() {
|
||||
const unsigned Height = (status.ob_size == 0 ? 8 : 16);
|
||||
unsigned sprite[10], sprites = 0;
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
#ifdef LCD_CPP
|
||||
#ifdef PPU_CPP
|
||||
|
||||
void LCD::dmg_render() {
|
||||
void PPU::dmg_render() {
|
||||
for(unsigned n = 0; n < 160; n++) {
|
||||
line[n] = 0x00;
|
||||
origin[n] = Origin::None;
|
||||
|
@ -17,7 +17,7 @@ void LCD::dmg_render() {
|
|||
interface->lcdScanline();
|
||||
}
|
||||
|
||||
uint16 LCD::dmg_read_tile(bool select, unsigned x, unsigned y) {
|
||||
uint16 PPU::dmg_read_tile(bool select, unsigned x, unsigned y) {
|
||||
unsigned tmaddr = 0x1800 + (select << 10), tdaddr;
|
||||
tmaddr += (((y >> 3) << 5) + (x >> 3)) & 0x03ff;
|
||||
if(status.bg_tiledata_select == 0) {
|
||||
|
@ -29,7 +29,7 @@ uint16 LCD::dmg_read_tile(bool select, unsigned x, unsigned y) {
|
|||
return (vram[tdaddr + 0] << 0) | (vram[tdaddr + 1] << 8);
|
||||
}
|
||||
|
||||
void LCD::dmg_render_bg() {
|
||||
void PPU::dmg_render_bg() {
|
||||
unsigned iy = (status.ly + status.scy) & 255;
|
||||
unsigned ix = status.scx, tx = ix & 7;
|
||||
unsigned data = dmg_read_tile(status.bg_tilemap_select, ix, iy);
|
||||
|
@ -48,7 +48,7 @@ void LCD::dmg_render_bg() {
|
|||
}
|
||||
}
|
||||
|
||||
void LCD::dmg_render_window() {
|
||||
void PPU::dmg_render_window() {
|
||||
if(status.ly - status.wy >= 144u) return;
|
||||
if(status.wx >= 167u) return;
|
||||
unsigned iy = status.wyc++;
|
||||
|
@ -75,7 +75,7 @@ void LCD::dmg_render_window() {
|
|||
//0x40: vertical flip
|
||||
//0x20: horizontal flip
|
||||
//0x10: palette#
|
||||
void LCD::dmg_render_ob() {
|
||||
void PPU::dmg_render_ob() {
|
||||
const unsigned Height = (status.ob_size == 0 ? 8 : 16);
|
||||
unsigned sprite[10], sprites = 0;
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
#ifdef LCD_CPP
|
||||
#ifdef PPU_CPP
|
||||
|
||||
unsigned LCD::vram_addr(uint16 addr) const {
|
||||
unsigned PPU::vram_addr(uint16 addr) const {
|
||||
return (status.vram_bank * 0x2000) + (addr & 0x1fff);
|
||||
}
|
||||
|
||||
uint8 LCD::mmio_read(uint16 addr) {
|
||||
uint8 PPU::mmio_read(uint16 addr) {
|
||||
if(addr >= 0x8000 && addr <= 0x9fff) return vram[vram_addr(addr)];
|
||||
if(addr >= 0xfe00 && addr <= 0xfe9f) return oam[addr & 0xff];
|
||||
|
||||
|
@ -90,7 +90,7 @@ uint8 LCD::mmio_read(uint16 addr) {
|
|||
return 0x00;
|
||||
}
|
||||
|
||||
void LCD::mmio_write(uint16 addr, uint8 data) {
|
||||
void PPU::mmio_write(uint16 addr, uint8 data) {
|
||||
if(addr >= 0x8000 && addr <= 0x9fff) { vram[vram_addr(addr)] = data; return; }
|
||||
if(addr >= 0xfe00 && addr <= 0xfe9f) { oam[addr & 0xff] = data; return; }
|
||||
|
|
@ -6,20 +6,20 @@
|
|||
|
||||
//LX = 0-455
|
||||
|
||||
#define LCD_CPP
|
||||
namespace GB {
|
||||
#define PPU_CPP
|
||||
namespace GameBoy {
|
||||
|
||||
#include "mmio.cpp"
|
||||
#include "dmg.cpp"
|
||||
#include "cgb.cpp"
|
||||
#include "mmio/mmio.cpp"
|
||||
#include "serialization.cpp"
|
||||
LCD lcd;
|
||||
PPU ppu;
|
||||
|
||||
void LCD::Main() {
|
||||
lcd.main();
|
||||
void PPU::Main() {
|
||||
ppu.main();
|
||||
}
|
||||
|
||||
void LCD::main() {
|
||||
void PPU::main() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
|
@ -40,14 +40,14 @@ void LCD::main() {
|
|||
}
|
||||
}
|
||||
|
||||
void LCD::add_clocks(unsigned clocks) {
|
||||
clock += clocks * cpu.frequency;
|
||||
void PPU::add_clocks(unsigned clocks) {
|
||||
clock += clocks;
|
||||
if(clock >= 0 && scheduler.sync != Scheduler::SynchronizeMode::All) {
|
||||
co_switch(scheduler.active_thread = cpu.thread);
|
||||
}
|
||||
}
|
||||
|
||||
void LCD::scanline() {
|
||||
void PPU::scanline() {
|
||||
status.lx -= 456;
|
||||
if(++status.ly == 154) frame();
|
||||
|
||||
|
@ -65,8 +65,7 @@ void LCD::scanline() {
|
|||
}
|
||||
}
|
||||
|
||||
void LCD::frame() {
|
||||
interface->videoRefresh(screen);
|
||||
void PPU::frame() {
|
||||
cpu.mmio_joyp_poll();
|
||||
|
||||
status.ly = 0;
|
||||
|
@ -74,14 +73,14 @@ void LCD::frame() {
|
|||
scheduler.exit(Scheduler::ExitReason::FrameEvent);
|
||||
}
|
||||
|
||||
unsigned LCD::hflip(unsigned data) const {
|
||||
unsigned PPU::hflip(unsigned data) const {
|
||||
return ((data & 0x8080) >> 7) | ((data & 0x4040) >> 5)
|
||||
| ((data & 0x2020) >> 3) | ((data & 0x1010) >> 1)
|
||||
| ((data & 0x0808) << 1) | ((data & 0x0404) << 3)
|
||||
| ((data & 0x0202) << 5) | ((data & 0x0101) << 7);
|
||||
}
|
||||
|
||||
void LCD::power() {
|
||||
void PPU::power() {
|
||||
create(Main, 4 * 1024 * 1024);
|
||||
|
||||
for(unsigned n = 0x8000; n <= 0x9fff; n++) bus.mmio[n] = this; //VRAM
|
||||
|
@ -152,7 +151,7 @@ void LCD::power() {
|
|||
status.obpi = 0;
|
||||
}
|
||||
|
||||
LCD::LCD() {
|
||||
PPU::PPU() {
|
||||
}
|
||||
|
||||
}
|
|
@ -1,6 +1,4 @@
|
|||
struct LCD : Thread, MMIO {
|
||||
#include "mmio/mmio.hpp"
|
||||
|
||||
struct PPU : Thread, MMIO {
|
||||
struct Status {
|
||||
unsigned lx;
|
||||
unsigned wyc;
|
||||
|
@ -71,6 +69,11 @@ struct LCD : Thread, MMIO {
|
|||
|
||||
unsigned hflip(unsigned data) const;
|
||||
|
||||
//mmio.cpp
|
||||
unsigned vram_addr(uint16 addr) const;
|
||||
uint8 mmio_read(uint16 addr);
|
||||
void mmio_write(uint16 addr, uint8 data);
|
||||
|
||||
//dmg.cpp
|
||||
void dmg_render();
|
||||
uint16 dmg_read_tile(bool select, unsigned x, unsigned y);
|
||||
|
@ -88,7 +91,7 @@ struct LCD : Thread, MMIO {
|
|||
void power();
|
||||
|
||||
void serialize(serializer&);
|
||||
LCD();
|
||||
PPU();
|
||||
};
|
||||
|
||||
extern LCD lcd;
|
||||
extern PPU ppu;
|
|
@ -1,6 +1,6 @@
|
|||
#ifdef LCD_CPP
|
||||
#ifdef PPU_CPP
|
||||
|
||||
void LCD::serialize(serializer &s) {
|
||||
void PPU::serialize(serializer &s) {
|
||||
Thread::serialize(s);
|
||||
|
||||
s.array(screen);
|
|
@ -1,7 +1,7 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
#define SCHEDULER_CPP
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
Scheduler scheduler;
|
||||
|
||||
|
|
|
@ -42,8 +42,8 @@ void System::serialize_all(serializer &s) {
|
|||
cartridge.serialize(s);
|
||||
system.serialize(s);
|
||||
cpu.serialize(s);
|
||||
ppu.serialize(s);
|
||||
apu.serialize(s);
|
||||
lcd.serialize(s);
|
||||
}
|
||||
|
||||
void System::serialize_init() {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
#define SYSTEM_CPP
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
#include "serialization.cpp"
|
||||
System system;
|
||||
|
@ -11,6 +11,7 @@ void System::run() {
|
|||
|
||||
scheduler.enter();
|
||||
if(scheduler.exit_reason() == Scheduler::ExitReason::FrameEvent) {
|
||||
interface->videoRefresh(ppu.screen);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -19,7 +20,7 @@ void System::runtosave() {
|
|||
runthreadtosave();
|
||||
|
||||
scheduler.sync = Scheduler::SynchronizeMode::All;
|
||||
scheduler.active_thread = lcd.thread;
|
||||
scheduler.active_thread = ppu.thread;
|
||||
runthreadtosave();
|
||||
|
||||
scheduler.sync = Scheduler::SynchronizeMode::All;
|
||||
|
@ -34,16 +35,12 @@ void System::runthreadtosave() {
|
|||
scheduler.enter();
|
||||
if(scheduler.exit_reason() == Scheduler::ExitReason::SynchronizeEvent) break;
|
||||
if(scheduler.exit_reason() == Scheduler::ExitReason::FrameEvent) {
|
||||
interface->videoRefresh(ppu.screen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void System::init() {
|
||||
file fp;
|
||||
fp.open("/home/byuu/Desktop/boot.rom", file::mode::write);
|
||||
fp.write(bootROM.sgb, 256);
|
||||
fp.close();
|
||||
|
||||
assert(interface != 0);
|
||||
}
|
||||
|
||||
|
@ -56,8 +53,8 @@ void System::power() {
|
|||
bus.power();
|
||||
cartridge.power();
|
||||
cpu.power();
|
||||
ppu.power();
|
||||
apu.power();
|
||||
lcd.power();
|
||||
scheduler.init();
|
||||
|
||||
clocks_executed = 0;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <gb/gb.hpp>
|
||||
|
||||
#define VIDEO_CPP
|
||||
namespace GB {
|
||||
namespace GameBoy {
|
||||
|
||||
Video video;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
#include "registers.cpp"
|
||||
#include "mmio.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
#include "eeprom.cpp"
|
||||
#include "flashrom.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
#include "registers.cpp"
|
||||
#include "mmio.cpp"
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <base/base.hpp>
|
||||
#include <processor/arm/arm.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
namespace Info {
|
||||
static const char Name[] = "bgba";
|
||||
static const unsigned SerializerVersion = 1;
|
||||
|
@ -20,7 +20,7 @@ namespace GBA {
|
|||
|
||||
#include <libco/libco.h>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
enum : unsigned { Byte = 8, Half = 16, Word = 32 };
|
||||
|
||||
struct Thread {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
Interface *interface = nullptr;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
#include "mmio.cpp"
|
||||
#include "serialization.cpp"
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
//vblank: 68 scanlines ( 83776 cycles)
|
||||
//frame: 228 scanlines (280896 cycles)
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
#include "registers.cpp"
|
||||
#include "background.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
Scheduler scheduler;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
#include "bios.cpp"
|
||||
#include "serialization.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <gba/gba.hpp>
|
||||
|
||||
namespace GBA {
|
||||
namespace GameBoyAdvance {
|
||||
|
||||
Video video;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
#include "envelope.cpp"
|
||||
#include "sweep.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
#include "chip/chip.cpp"
|
||||
#include "board/board.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
Cheat cheat;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
#include "core/core.cpp"
|
||||
#include "memory/memory.cpp"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
Input input;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
Interface *interface = nullptr;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
Bus bus;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#include <base/base.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
namespace Info {
|
||||
static const char Name[] = "bnes";
|
||||
static const unsigned SerializerVersion = 1;
|
||||
|
@ -11,7 +11,7 @@ namespace NES {
|
|||
}
|
||||
|
||||
/*
|
||||
bnes - NES emulator
|
||||
bnes - Famicom emulator
|
||||
authors: byuu, Ryphecha
|
||||
license: GPLv3
|
||||
project started: 2011-09-05
|
||||
|
@ -19,7 +19,7 @@ namespace NES {
|
|||
|
||||
#include <libco/libco.h>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
struct Thread {
|
||||
cothread_t thread;
|
||||
unsigned frequency;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
PPU ppu;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
Scheduler scheduler;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
System system;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <nes/nes.hpp>
|
||||
|
||||
#define VIDEO_CPP
|
||||
namespace NES {
|
||||
namespace Famicom {
|
||||
|
||||
Video video;
|
||||
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
processor_objects :=
|
||||
processor_objects += $(if $(findstring arm,$(processors)),processor-arm)
|
||||
processor_objects += $(if $(findstring hg51b,$(processors)),processor-hg51b)
|
||||
processor_objects += $(if $(findstring lr35902,$(processors)),processor-lr35902)
|
||||
processor_objects += $(if $(findstring upd96050,$(processors)),processor-upd96050)
|
||||
objects += $(processor_objects)
|
||||
|
||||
processor := processor
|
||||
obj/processor-arm.o: $(processor)/arm/arm.cpp $(call rwildcard,$(processor)/arm)
|
||||
obj/processor-hg51b.o: $(processor)/hg51b/hg51b.cpp $(call rwildcard,$(processor)/hg51b)
|
||||
obj/processor-lr35902.o: $(processor)/lr35902/lr35902.cpp $(call rwildcard,$(processor)/lr35902)
|
||||
obj/processor-upd96050.o: $(processor)/upd96050/upd96050.cpp $(call rwildcard,$(processor)/upd96050)
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
#ifdef CPU_CPP
|
||||
|
||||
string CPU::disassemble(uint16 pc) {
|
||||
string LR35902::disassemble(uint16 pc) {
|
||||
char output[80];
|
||||
memset(output, ' ', sizeof output);
|
||||
output[79] = 0;
|
||||
|
@ -21,11 +19,11 @@ string CPU::disassemble(uint16 pc) {
|
|||
return output;
|
||||
}
|
||||
|
||||
string CPU::disassemble_opcode(uint16 pc) {
|
||||
uint8 opcode = bus.read(pc);
|
||||
uint8 p0 = bus.read(pc + 1);
|
||||
uint8 p1 = bus.read(pc + 2);
|
||||
uint8 p2 = bus.read(pc + 3);
|
||||
string LR35902::disassemble_opcode(uint16 pc) {
|
||||
uint8 opcode = debugger_read(pc);
|
||||
uint8 p0 = debugger_read(pc + 1);
|
||||
uint8 p1 = debugger_read(pc + 2);
|
||||
uint8 p2 = debugger_read(pc + 3);
|
||||
|
||||
switch(opcode) {
|
||||
case 0x00: return { "nop" };
|
||||
|
@ -289,11 +287,11 @@ string CPU::disassemble_opcode(uint16 pc) {
|
|||
return "";
|
||||
}
|
||||
|
||||
string CPU::disassemble_opcode_cb(uint16 pc) {
|
||||
uint8 opcode = bus.read(pc);
|
||||
uint8 p0 = bus.read(pc + 1);
|
||||
uint8 p1 = bus.read(pc + 2);
|
||||
uint8 p2 = bus.read(pc + 3);
|
||||
string LR35902::disassemble_opcode_cb(uint16 pc) {
|
||||
uint8 opcode = debugger_read(pc);
|
||||
uint8 p0 = debugger_read(pc + 1);
|
||||
uint8 p1 = debugger_read(pc + 2);
|
||||
uint8 p2 = debugger_read(pc + 3);
|
||||
|
||||
switch(opcode) {
|
||||
case 0x00: return { "rlc b" };
|
||||
|
@ -556,5 +554,3 @@ string CPU::disassemble_opcode_cb(uint16 pc) {
|
|||
|
||||
return "";
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,127 +1,121 @@
|
|||
#ifdef CPU_CPP
|
||||
|
||||
#include "table.cpp"
|
||||
#include "disassembler.cpp"
|
||||
|
||||
void CPU::op_xx() {
|
||||
void LR35902::op_xx() {
|
||||
}
|
||||
|
||||
void CPU::op_cb() {
|
||||
uint8 opcode = op_read(r[PC]++);
|
||||
(this->*opcode_table_cb[opcode])();
|
||||
void LR35902::op_cb() {
|
||||
exec_cb();
|
||||
}
|
||||
|
||||
//8-bit load commands
|
||||
|
||||
template<unsigned x, unsigned y> void CPU::op_ld_r_r() {
|
||||
template<unsigned x, unsigned y> void LR35902::op_ld_r_r() {
|
||||
r[x] = r[y];
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_ld_r_n() {
|
||||
template<unsigned x> void LR35902::op_ld_r_n() {
|
||||
r[x] = op_read(r[PC]++);
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_ld_r_hl() {
|
||||
template<unsigned x> void LR35902::op_ld_r_hl() {
|
||||
r[x] = op_read(r[HL]);
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_ld_hl_r() {
|
||||
template<unsigned x> void LR35902::op_ld_hl_r() {
|
||||
op_write(r[HL], r[x]);
|
||||
}
|
||||
|
||||
void CPU::op_ld_hl_n() {
|
||||
void LR35902::op_ld_hl_n() {
|
||||
op_write(r[HL], op_read(r[PC]++));
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_ld_a_rr() {
|
||||
template<unsigned x> void LR35902::op_ld_a_rr() {
|
||||
r[A] = op_read(r[x]);
|
||||
}
|
||||
|
||||
void CPU::op_ld_a_nn() {
|
||||
void LR35902::op_ld_a_nn() {
|
||||
uint8 lo = op_read(r[PC]++);
|
||||
uint8 hi = op_read(r[PC]++);
|
||||
r[A] = op_read((hi << 8) | (lo << 0));
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_ld_rr_a() {
|
||||
template<unsigned x> void LR35902::op_ld_rr_a() {
|
||||
op_write(r[x], r[A]);
|
||||
}
|
||||
|
||||
void CPU::op_ld_nn_a() {
|
||||
void LR35902::op_ld_nn_a() {
|
||||
uint8 lo = op_read(r[PC]++);
|
||||
uint8 hi = op_read(r[PC]++);
|
||||
op_write((hi << 8) | (lo << 0), r[A]);
|
||||
}
|
||||
|
||||
void CPU::op_ld_a_ffn() {
|
||||
void LR35902::op_ld_a_ffn() {
|
||||
r[A] = op_read(0xff00 + op_read(r[PC]++));
|
||||
}
|
||||
|
||||
void CPU::op_ld_ffn_a() {
|
||||
void LR35902::op_ld_ffn_a() {
|
||||
op_write(0xff00 + op_read(r[PC]++), r[A]);
|
||||
}
|
||||
|
||||
void CPU::op_ld_a_ffc() {
|
||||
void LR35902::op_ld_a_ffc() {
|
||||
r[A] = op_read(0xff00 + r[C]);
|
||||
}
|
||||
|
||||
void CPU::op_ld_ffc_a() {
|
||||
void LR35902::op_ld_ffc_a() {
|
||||
op_write(0xff00 + r[C], r[A]);
|
||||
}
|
||||
|
||||
void CPU::op_ldi_hl_a() {
|
||||
void LR35902::op_ldi_hl_a() {
|
||||
op_write(r[HL], r[A]);
|
||||
r[HL]++;
|
||||
}
|
||||
|
||||
void CPU::op_ldi_a_hl() {
|
||||
void LR35902::op_ldi_a_hl() {
|
||||
r[A] = op_read(r[HL]);
|
||||
r[HL]++;
|
||||
}
|
||||
|
||||
void CPU::op_ldd_hl_a() {
|
||||
void LR35902::op_ldd_hl_a() {
|
||||
op_write(r[HL], r[A]);
|
||||
r[HL]--;
|
||||
}
|
||||
|
||||
void CPU::op_ldd_a_hl() {
|
||||
void LR35902::op_ldd_a_hl() {
|
||||
r[A] = op_read(r[HL]);
|
||||
r[HL]--;
|
||||
}
|
||||
|
||||
//16-bit load commands
|
||||
|
||||
template<unsigned x> void CPU::op_ld_rr_nn() {
|
||||
template<unsigned x> void LR35902::op_ld_rr_nn() {
|
||||
r[x] = op_read(r[PC]++) << 0;
|
||||
r[x] |= op_read(r[PC]++) << 8;
|
||||
}
|
||||
|
||||
void CPU::op_ld_nn_sp() {
|
||||
void LR35902::op_ld_nn_sp() {
|
||||
uint16 addr = op_read(r[PC]++) << 0;
|
||||
addr |= op_read(r[PC]++) << 8;
|
||||
op_write(addr + 0, r[SP] >> 0);
|
||||
op_write(addr + 1, r[SP] >> 8);
|
||||
}
|
||||
|
||||
void CPU::op_ld_sp_hl() {
|
||||
void LR35902::op_ld_sp_hl() {
|
||||
r[SP] = r[HL];
|
||||
op_io();
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_push_rr() {
|
||||
template<unsigned x> void LR35902::op_push_rr() {
|
||||
op_write(--r[SP], r[x] >> 8);
|
||||
op_write(--r[SP], r[x] >> 0);
|
||||
op_io();
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_pop_rr() {
|
||||
template<unsigned x> void LR35902::op_pop_rr() {
|
||||
r[x] = op_read(r[SP]++) << 0;
|
||||
r[x] |= op_read(r[SP]++) << 8;
|
||||
}
|
||||
|
||||
//8-bit arithmetic commands
|
||||
|
||||
void CPU::opi_add_a(uint8 x) {
|
||||
void LR35902::opi_add_a(uint8 x) {
|
||||
uint16 rh = r[A] + x;
|
||||
uint16 rl = (r[A] & 0x0f) + (x & 0x0f);
|
||||
r[A] = rh;
|
||||
|
@ -131,11 +125,11 @@ void CPU::opi_add_a(uint8 x) {
|
|||
r.f.c = rh > 0xff;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_add_a_r() { opi_add_a(r[x]); }
|
||||
void CPU::op_add_a_n() { opi_add_a(op_read(r[PC]++)); }
|
||||
void CPU::op_add_a_hl() { opi_add_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_add_a_r() { opi_add_a(r[x]); }
|
||||
void LR35902::op_add_a_n() { opi_add_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_add_a_hl() { opi_add_a(op_read(r[HL])); }
|
||||
|
||||
void CPU::opi_adc_a(uint8 x) {
|
||||
void LR35902::opi_adc_a(uint8 x) {
|
||||
uint16 rh = r[A] + x + r.f.c;
|
||||
uint16 rl = (r[A] & 0x0f) + (x & 0x0f) + r.f.c;
|
||||
r[A] = rh;
|
||||
|
@ -145,11 +139,11 @@ void CPU::opi_adc_a(uint8 x) {
|
|||
r.f.c = rh > 0xff;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_adc_a_r() { opi_adc_a(r[x]); }
|
||||
void CPU::op_adc_a_n() { opi_adc_a(op_read(r[PC]++)); }
|
||||
void CPU::op_adc_a_hl() { opi_adc_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_adc_a_r() { opi_adc_a(r[x]); }
|
||||
void LR35902::op_adc_a_n() { opi_adc_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_adc_a_hl() { opi_adc_a(op_read(r[HL])); }
|
||||
|
||||
void CPU::opi_sub_a(uint8 x) {
|
||||
void LR35902::opi_sub_a(uint8 x) {
|
||||
uint16 rh = r[A] - x;
|
||||
uint16 rl = (r[A] & 0x0f) - (x & 0x0f);
|
||||
r[A] = rh;
|
||||
|
@ -159,11 +153,11 @@ void CPU::opi_sub_a(uint8 x) {
|
|||
r.f.c = rh > 0xff;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_sub_a_r() { opi_sub_a(r[x]); }
|
||||
void CPU::op_sub_a_n() { opi_sub_a(op_read(r[PC]++)); }
|
||||
void CPU::op_sub_a_hl() { opi_sub_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_sub_a_r() { opi_sub_a(r[x]); }
|
||||
void LR35902::op_sub_a_n() { opi_sub_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_sub_a_hl() { opi_sub_a(op_read(r[HL])); }
|
||||
|
||||
void CPU::opi_sbc_a(uint8 x) {
|
||||
void LR35902::opi_sbc_a(uint8 x) {
|
||||
uint16 rh = r[A] - x - r.f.c;
|
||||
uint16 rl = (r[A] & 0x0f) - (x & 0x0f) - r.f.c;
|
||||
r[A] = rh;
|
||||
|
@ -173,11 +167,11 @@ void CPU::opi_sbc_a(uint8 x) {
|
|||
r.f.c = rh > 0xff;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_sbc_a_r() { opi_sbc_a(r[x]); }
|
||||
void CPU::op_sbc_a_n() { opi_sbc_a(op_read(r[PC]++)); }
|
||||
void CPU::op_sbc_a_hl() { opi_sbc_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_sbc_a_r() { opi_sbc_a(r[x]); }
|
||||
void LR35902::op_sbc_a_n() { opi_sbc_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_sbc_a_hl() { opi_sbc_a(op_read(r[HL])); }
|
||||
|
||||
void CPU::opi_and_a(uint8 x) {
|
||||
void LR35902::opi_and_a(uint8 x) {
|
||||
r[A] &= x;
|
||||
r.f.z = r[A] == 0;
|
||||
r.f.n = 0;
|
||||
|
@ -185,11 +179,11 @@ void CPU::opi_and_a(uint8 x) {
|
|||
r.f.c = 0;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_and_a_r() { opi_and_a(r[x]); }
|
||||
void CPU::op_and_a_n() { opi_and_a(op_read(r[PC]++)); }
|
||||
void CPU::op_and_a_hl() { opi_and_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_and_a_r() { opi_and_a(r[x]); }
|
||||
void LR35902::op_and_a_n() { opi_and_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_and_a_hl() { opi_and_a(op_read(r[HL])); }
|
||||
|
||||
void CPU::opi_xor_a(uint8 x) {
|
||||
void LR35902::opi_xor_a(uint8 x) {
|
||||
r[A] ^= x;
|
||||
r.f.z = r[A] == 0;
|
||||
r.f.n = 0;
|
||||
|
@ -197,11 +191,11 @@ void CPU::opi_xor_a(uint8 x) {
|
|||
r.f.c = 0;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_xor_a_r() { opi_xor_a(r[x]); }
|
||||
void CPU::op_xor_a_n() { opi_xor_a(op_read(r[PC]++)); }
|
||||
void CPU::op_xor_a_hl() { opi_xor_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_xor_a_r() { opi_xor_a(r[x]); }
|
||||
void LR35902::op_xor_a_n() { opi_xor_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_xor_a_hl() { opi_xor_a(op_read(r[HL])); }
|
||||
|
||||
void CPU::opi_or_a(uint8 x) {
|
||||
void LR35902::opi_or_a(uint8 x) {
|
||||
r[A] |= x;
|
||||
r.f.z = r[A] == 0;
|
||||
r.f.n = 0;
|
||||
|
@ -209,11 +203,11 @@ void CPU::opi_or_a(uint8 x) {
|
|||
r.f.c = 0;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_or_a_r() { opi_or_a(r[x]); }
|
||||
void CPU::op_or_a_n() { opi_or_a(op_read(r[PC]++)); }
|
||||
void CPU::op_or_a_hl() { opi_or_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_or_a_r() { opi_or_a(r[x]); }
|
||||
void LR35902::op_or_a_n() { opi_or_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_or_a_hl() { opi_or_a(op_read(r[HL])); }
|
||||
|
||||
void CPU::opi_cp_a(uint8 x) {
|
||||
void LR35902::opi_cp_a(uint8 x) {
|
||||
uint16 rh = r[A] - x;
|
||||
uint16 rl = (r[A] & 0x0f) - (x & 0x0f);
|
||||
r.f.z = (uint8)rh == 0;
|
||||
|
@ -222,18 +216,18 @@ void CPU::opi_cp_a(uint8 x) {
|
|||
r.f.c = rh > 0xff;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_cp_a_r() { opi_cp_a(r[x]); }
|
||||
void CPU::op_cp_a_n() { opi_cp_a(op_read(r[PC]++)); }
|
||||
void CPU::op_cp_a_hl() { opi_cp_a(op_read(r[HL])); }
|
||||
template<unsigned x> void LR35902::op_cp_a_r() { opi_cp_a(r[x]); }
|
||||
void LR35902::op_cp_a_n() { opi_cp_a(op_read(r[PC]++)); }
|
||||
void LR35902::op_cp_a_hl() { opi_cp_a(op_read(r[HL])); }
|
||||
|
||||
template<unsigned x> void CPU::op_inc_r() {
|
||||
template<unsigned x> void LR35902::op_inc_r() {
|
||||
r[x]++;
|
||||
r.f.z = r[x] == 0;
|
||||
r.f.n = 0;
|
||||
r.f.h = (r[x] & 0x0f) == 0x00;
|
||||
}
|
||||
|
||||
void CPU::op_inc_hl() {
|
||||
void LR35902::op_inc_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
op_write(r[HL], ++n);
|
||||
r.f.z = n == 0;
|
||||
|
@ -241,14 +235,14 @@ void CPU::op_inc_hl() {
|
|||
r.f.h = (n & 0x0f) == 0x00;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_dec_r() {
|
||||
template<unsigned x> void LR35902::op_dec_r() {
|
||||
r[x]--;
|
||||
r.f.z = r[x] == 0;
|
||||
r.f.n = 1;
|
||||
r.f.h = (r[x] & 0x0f) == 0x0f;
|
||||
}
|
||||
|
||||
void CPU::op_dec_hl() {
|
||||
void LR35902::op_dec_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
op_write(r[HL], --n);
|
||||
r.f.z = n == 0;
|
||||
|
@ -256,7 +250,7 @@ void CPU::op_dec_hl() {
|
|||
r.f.h = (n & 0x0f) == 0x0f;
|
||||
}
|
||||
|
||||
void CPU::op_daa() {
|
||||
void LR35902::op_daa() {
|
||||
uint16 a = r[A];
|
||||
if(r.f.n == 0) {
|
||||
if(r.f.h || (a & 0x0f) > 0x09) a += 0x06;
|
||||
|
@ -274,7 +268,7 @@ void CPU::op_daa() {
|
|||
r.f.c |= a & 0x100;
|
||||
}
|
||||
|
||||
void CPU::op_cpl() {
|
||||
void LR35902::op_cpl() {
|
||||
r[A] ^= 0xff;
|
||||
r.f.n = 1;
|
||||
r.f.h = 1;
|
||||
|
@ -282,7 +276,7 @@ void CPU::op_cpl() {
|
|||
|
||||
//16-bit arithmetic commands
|
||||
|
||||
template<unsigned x> void CPU::op_add_hl_rr() {
|
||||
template<unsigned x> void LR35902::op_add_hl_rr() {
|
||||
op_io();
|
||||
uint32 rb = (r[HL] + r[x]);
|
||||
uint32 rn = (r[HL] & 0xfff) + (r[x] & 0xfff);
|
||||
|
@ -292,17 +286,17 @@ template<unsigned x> void CPU::op_add_hl_rr() {
|
|||
r.f.c = rb > 0xffff;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_inc_rr() {
|
||||
template<unsigned x> void LR35902::op_inc_rr() {
|
||||
op_io();
|
||||
r[x]++;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_dec_rr() {
|
||||
template<unsigned x> void LR35902::op_dec_rr() {
|
||||
op_io();
|
||||
r[x]--;
|
||||
}
|
||||
|
||||
void CPU::op_add_sp_n() {
|
||||
void LR35902::op_add_sp_n() {
|
||||
op_io();
|
||||
op_io();
|
||||
signed n = (int8)op_read(r[PC]++);
|
||||
|
@ -313,7 +307,7 @@ void CPU::op_add_sp_n() {
|
|||
r[SP] += n;
|
||||
}
|
||||
|
||||
void CPU::op_ld_hl_sp_n() {
|
||||
void LR35902::op_ld_hl_sp_n() {
|
||||
op_io();
|
||||
signed n = (int8)op_read(r[PC]++);
|
||||
r.f.z = 0;
|
||||
|
@ -325,7 +319,7 @@ void CPU::op_ld_hl_sp_n() {
|
|||
|
||||
//rotate/shift commands
|
||||
|
||||
void CPU::op_rlca() {
|
||||
void LR35902::op_rlca() {
|
||||
r[A] = (r[A] << 1) | (r[A] >> 7);
|
||||
r.f.z = 0;
|
||||
r.f.n = 0;
|
||||
|
@ -333,7 +327,7 @@ void CPU::op_rlca() {
|
|||
r.f.c = r[A] & 0x01;
|
||||
}
|
||||
|
||||
void CPU::op_rla() {
|
||||
void LR35902::op_rla() {
|
||||
bool c = r[A] & 0x80;
|
||||
r[A] = (r[A] << 1) | (r.f.c << 0);
|
||||
r.f.z = 0;
|
||||
|
@ -342,7 +336,7 @@ void CPU::op_rla() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
void CPU::op_rrca() {
|
||||
void LR35902::op_rrca() {
|
||||
r[A] = (r[A] >> 1) | (r[A] << 7);
|
||||
r.f.z = 0;
|
||||
r.f.n = 0;
|
||||
|
@ -350,7 +344,7 @@ void CPU::op_rrca() {
|
|||
r.f.c = r[A] & 0x80;
|
||||
}
|
||||
|
||||
void CPU::op_rra() {
|
||||
void LR35902::op_rra() {
|
||||
bool c = r[A] & 0x01;
|
||||
r[A] = (r[A] >> 1) | (r.f.c << 7);
|
||||
r.f.z = 0;
|
||||
|
@ -359,7 +353,7 @@ void CPU::op_rra() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_rlc_r() {
|
||||
template<unsigned x> void LR35902::op_rlc_r() {
|
||||
r[x] = (r[x] << 1) | (r[x] >> 7);
|
||||
r.f.z = r[x] == 0;
|
||||
r.f.n = 0;
|
||||
|
@ -367,7 +361,7 @@ template<unsigned x> void CPU::op_rlc_r() {
|
|||
r.f.c = r[x] & 0x01;
|
||||
}
|
||||
|
||||
void CPU::op_rlc_hl() {
|
||||
void LR35902::op_rlc_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
n = (n << 1) | (n >> 7);
|
||||
op_write(r[HL], n);
|
||||
|
@ -377,7 +371,7 @@ void CPU::op_rlc_hl() {
|
|||
r.f.c = n & 0x01;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_rl_r() {
|
||||
template<unsigned x> void LR35902::op_rl_r() {
|
||||
bool c = r[x] & 0x80;
|
||||
r[x] = (r[x] << 1) | (r.f.c << 0);
|
||||
r.f.z = r[x] == 0;
|
||||
|
@ -386,7 +380,7 @@ template<unsigned x> void CPU::op_rl_r() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
void CPU::op_rl_hl() {
|
||||
void LR35902::op_rl_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
bool c = n & 0x80;
|
||||
n = (n << 1) | (r.f.c << 0);
|
||||
|
@ -397,7 +391,7 @@ void CPU::op_rl_hl() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_rrc_r() {
|
||||
template<unsigned x> void LR35902::op_rrc_r() {
|
||||
r[x] = (r[x] >> 1) | (r[x] << 7);
|
||||
r.f.z = r[x] == 0;
|
||||
r.f.n = 0;
|
||||
|
@ -405,7 +399,7 @@ template<unsigned x> void CPU::op_rrc_r() {
|
|||
r.f.c = r[x] & 0x80;
|
||||
}
|
||||
|
||||
void CPU::op_rrc_hl() {
|
||||
void LR35902::op_rrc_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
n = (n >> 1) | (n << 7);
|
||||
op_write(r[HL], n);
|
||||
|
@ -415,7 +409,7 @@ void CPU::op_rrc_hl() {
|
|||
r.f.c = n & 0x80;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_rr_r() {
|
||||
template<unsigned x> void LR35902::op_rr_r() {
|
||||
bool c = r[x] & 0x01;
|
||||
r[x] = (r[x] >> 1) | (r.f.c << 7);
|
||||
r.f.z = r[x] == 0;
|
||||
|
@ -424,7 +418,7 @@ template<unsigned x> void CPU::op_rr_r() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
void CPU::op_rr_hl() {
|
||||
void LR35902::op_rr_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
bool c = n & 0x01;
|
||||
n = (n >> 1) | (r.f.c << 7);
|
||||
|
@ -435,7 +429,7 @@ void CPU::op_rr_hl() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_sla_r() {
|
||||
template<unsigned x> void LR35902::op_sla_r() {
|
||||
bool c = r[x] & 0x80;
|
||||
r[x] <<= 1;
|
||||
r.f.z = r[x] == 0;
|
||||
|
@ -444,7 +438,7 @@ template<unsigned x> void CPU::op_sla_r() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
void CPU::op_sla_hl() {
|
||||
void LR35902::op_sla_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
bool c = n & 0x80;
|
||||
n <<= 1;
|
||||
|
@ -455,7 +449,7 @@ void CPU::op_sla_hl() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_swap_r() {
|
||||
template<unsigned x> void LR35902::op_swap_r() {
|
||||
r[x] = (r[x] << 4) | (r[x] >> 4);
|
||||
r.f.z = r[x] == 0;
|
||||
r.f.n = 0;
|
||||
|
@ -463,7 +457,7 @@ template<unsigned x> void CPU::op_swap_r() {
|
|||
r.f.c = 0;
|
||||
}
|
||||
|
||||
void CPU::op_swap_hl() {
|
||||
void LR35902::op_swap_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
n = (n << 4) | (n >> 4);
|
||||
op_write(r[HL], n);
|
||||
|
@ -473,7 +467,7 @@ void CPU::op_swap_hl() {
|
|||
r.f.c = 0;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_sra_r() {
|
||||
template<unsigned x> void LR35902::op_sra_r() {
|
||||
bool c = r[x] & 0x01;
|
||||
r[x] = (int8)r[x] >> 1;
|
||||
r.f.z = r[x] == 0;
|
||||
|
@ -482,7 +476,7 @@ template<unsigned x> void CPU::op_sra_r() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
void CPU::op_sra_hl() {
|
||||
void LR35902::op_sra_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
bool c = n & 0x01;
|
||||
n = (int8)n >> 1;
|
||||
|
@ -493,7 +487,7 @@ void CPU::op_sra_hl() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
template<unsigned x> void CPU::op_srl_r() {
|
||||
template<unsigned x> void LR35902::op_srl_r() {
|
||||
bool c = r[x] & 0x01;
|
||||
r[x] >>= 1;
|
||||
r.f.z = r[x] == 0;
|
||||
|
@ -502,7 +496,7 @@ template<unsigned x> void CPU::op_srl_r() {
|
|||
r.f.c = c;
|
||||
}
|
||||
|
||||
void CPU::op_srl_hl() {
|
||||
void LR35902::op_srl_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
bool c = n & 0x01;
|
||||
n >>= 1;
|
||||
|
@ -515,34 +509,34 @@ void CPU::op_srl_hl() {
|
|||
|
||||
//single-bit commands
|
||||
|
||||
template<unsigned b, unsigned x> void CPU::op_bit_n_r() {
|
||||
template<unsigned b, unsigned x> void LR35902::op_bit_n_r() {
|
||||
r.f.z = (r[x] & (1 << b)) == 0;
|
||||
r.f.n = 0;
|
||||
r.f.h = 1;
|
||||
}
|
||||
|
||||
template<unsigned b> void CPU::op_bit_n_hl() {
|
||||
template<unsigned b> void LR35902::op_bit_n_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
r.f.z = (n & (1 << b)) == 0;
|
||||
r.f.n = 0;
|
||||
r.f.h = 1;
|
||||
}
|
||||
|
||||
template<unsigned b, unsigned x> void CPU::op_set_n_r() {
|
||||
template<unsigned b, unsigned x> void LR35902::op_set_n_r() {
|
||||
r[x] |= 1 << b;
|
||||
}
|
||||
|
||||
template<unsigned b> void CPU::op_set_n_hl() {
|
||||
template<unsigned b> void LR35902::op_set_n_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
n |= 1 << b;
|
||||
op_write(r[HL], n);
|
||||
}
|
||||
|
||||
template<unsigned b, unsigned x> void CPU::op_res_n_r() {
|
||||
template<unsigned b, unsigned x> void LR35902::op_res_n_r() {
|
||||
r[x] &= ~(1 << b);
|
||||
}
|
||||
|
||||
template<unsigned b> void CPU::op_res_n_hl() {
|
||||
template<unsigned b> void LR35902::op_res_n_hl() {
|
||||
uint8 n = op_read(r[HL]);
|
||||
n &= ~(1 << b);
|
||||
op_write(r[HL], n);
|
||||
|
@ -550,61 +544,55 @@ template<unsigned b> void CPU::op_res_n_hl() {
|
|||
|
||||
//control commands
|
||||
|
||||
void CPU::op_ccf() {
|
||||
void LR35902::op_ccf() {
|
||||
r.f.n = 0;
|
||||
r.f.h = 0;
|
||||
r.f.c = !r.f.c;
|
||||
}
|
||||
|
||||
void CPU::op_scf() {
|
||||
void LR35902::op_scf() {
|
||||
r.f.n = 0;
|
||||
r.f.h = 0;
|
||||
r.f.c = 1;
|
||||
}
|
||||
|
||||
void CPU::op_nop() {
|
||||
void LR35902::op_nop() {
|
||||
}
|
||||
|
||||
void CPU::op_halt() {
|
||||
status.halt = true;
|
||||
while(status.halt == true) op_io();
|
||||
void LR35902::op_halt() {
|
||||
r.halt = true;
|
||||
while(r.halt == true) op_io();
|
||||
}
|
||||
|
||||
void CPU::op_stop() {
|
||||
if(status.speed_switch) {
|
||||
status.speed_switch = 0;
|
||||
status.speed_double ^= 1;
|
||||
frequency = 4 * 1024 * 1024;
|
||||
if(status.speed_double) frequency *= 2;
|
||||
return;
|
||||
}
|
||||
status.stop = true;
|
||||
while(status.stop == true) op_io();
|
||||
void LR35902::op_stop() {
|
||||
r.stop = true;
|
||||
stop();
|
||||
while(r.stop == true) op_io();
|
||||
}
|
||||
|
||||
void CPU::op_di() {
|
||||
status.ime = 0;
|
||||
void LR35902::op_di() {
|
||||
r.ime = 0;
|
||||
}
|
||||
|
||||
void CPU::op_ei() {
|
||||
status.ei = true;
|
||||
//status.ime = 1;
|
||||
void LR35902::op_ei() {
|
||||
r.ei = true;
|
||||
//r.ime = 1;
|
||||
}
|
||||
|
||||
//jump commands
|
||||
|
||||
void CPU::op_jp_nn() {
|
||||
void LR35902::op_jp_nn() {
|
||||
uint8 lo = op_read(r[PC]++);
|
||||
uint8 hi = op_read(r[PC]++);
|
||||
r[PC] = (hi << 8) | (lo << 0);
|
||||
op_io();
|
||||
}
|
||||
|
||||
void CPU::op_jp_hl() {
|
||||
void LR35902::op_jp_hl() {
|
||||
r[PC] = r[HL];
|
||||
}
|
||||
|
||||
template<unsigned x, bool y> void CPU::op_jp_f_nn() {
|
||||
template<unsigned x, bool y> void LR35902::op_jp_f_nn() {
|
||||
uint8 lo = op_read(r[PC]++);
|
||||
uint8 hi = op_read(r[PC]++);
|
||||
if(r.f[x] == y) {
|
||||
|
@ -613,13 +601,13 @@ template<unsigned x, bool y> void CPU::op_jp_f_nn() {
|
|||
}
|
||||
}
|
||||
|
||||
void CPU::op_jr_n() {
|
||||
void LR35902::op_jr_n() {
|
||||
int8 n = op_read(r[PC]++);
|
||||
r[PC] += n;
|
||||
op_io();
|
||||
}
|
||||
|
||||
template<unsigned x, bool y> void CPU::op_jr_f_n() {
|
||||
template<unsigned x, bool y> void LR35902::op_jr_f_n() {
|
||||
int8 n = op_read(r[PC]++);
|
||||
if(r.f[x] == y) {
|
||||
r[PC] += n;
|
||||
|
@ -627,7 +615,7 @@ template<unsigned x, bool y> void CPU::op_jr_f_n() {
|
|||
}
|
||||
}
|
||||
|
||||
void CPU::op_call_nn() {
|
||||
void LR35902::op_call_nn() {
|
||||
uint8 lo = op_read(r[PC]++);
|
||||
uint8 hi = op_read(r[PC]++);
|
||||
op_write(--r[SP], r[PC] >> 8);
|
||||
|
@ -636,7 +624,7 @@ void CPU::op_call_nn() {
|
|||
op_io();
|
||||
}
|
||||
|
||||
template<unsigned x, bool y> void CPU::op_call_f_nn() {
|
||||
template<unsigned x, bool y> void LR35902::op_call_f_nn() {
|
||||
uint8 lo = op_read(r[PC]++);
|
||||
uint8 hi = op_read(r[PC]++);
|
||||
if(r.f[x] == y) {
|
||||
|
@ -647,14 +635,14 @@ template<unsigned x, bool y> void CPU::op_call_f_nn() {
|
|||
}
|
||||
}
|
||||
|
||||
void CPU::op_ret() {
|
||||
void LR35902::op_ret() {
|
||||
uint8 lo = op_read(r[SP]++);
|
||||
uint8 hi = op_read(r[SP]++);
|
||||
r[PC] = (hi << 8) | (lo << 0);
|
||||
op_io();
|
||||
}
|
||||
|
||||
template<unsigned x, bool y> void CPU::op_ret_f() {
|
||||
template<unsigned x, bool y> void LR35902::op_ret_f() {
|
||||
op_io();
|
||||
if(r.f[x] == y) {
|
||||
uint8 lo = op_read(r[SP]++);
|
||||
|
@ -664,19 +652,17 @@ template<unsigned x, bool y> void CPU::op_ret_f() {
|
|||
}
|
||||
}
|
||||
|
||||
void CPU::op_reti() {
|
||||
void LR35902::op_reti() {
|
||||
uint8 lo = op_read(r[SP]++);
|
||||
uint8 hi = op_read(r[SP]++);
|
||||
r[PC] = (hi << 8) | (lo << 0);
|
||||
op_io();
|
||||
status.ime = 1;
|
||||
r.ime = 1;
|
||||
}
|
||||
|
||||
template<unsigned n> void CPU::op_rst_n() {
|
||||
template<unsigned n> void LR35902::op_rst_n() {
|
||||
op_write(--r[SP], r[PC] >> 8);
|
||||
op_write(--r[SP], r[PC] >> 0);
|
||||
r[PC] = n;
|
||||
op_io();
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,541 @@
|
|||
#include <processor/processor.hpp>
|
||||
#include "lr35902.hpp"
|
||||
|
||||
namespace Processor {
|
||||
|
||||
#include "instructions.cpp"
|
||||
#include "disassembler.cpp"
|
||||
#include "serialization.cpp"
|
||||
|
||||
void LR35902::power() {
|
||||
r.halt = false;
|
||||
r.stop = false;
|
||||
r.ei = false;
|
||||
r.ime = false;
|
||||
}
|
||||
|
||||
void LR35902::exec() {
|
||||
uint8 opcode = op_read(r[PC]++);
|
||||
switch(opcode) {
|
||||
case 0x00: return op_nop();
|
||||
case 0x01: return op_ld_rr_nn<BC>();
|
||||
case 0x02: return op_ld_rr_a<BC>();
|
||||
case 0x03: return op_inc_rr<BC>();
|
||||
case 0x04: return op_inc_r<B>();
|
||||
case 0x05: return op_dec_r<B>();
|
||||
case 0x06: return op_ld_r_n<B>();
|
||||
case 0x07: return op_rlca();
|
||||
case 0x08: return op_ld_nn_sp();
|
||||
case 0x09: return op_add_hl_rr<BC>();
|
||||
case 0x0a: return op_ld_a_rr<BC>();
|
||||
case 0x0b: return op_dec_rr<BC>();
|
||||
case 0x0c: return op_inc_r<C>();
|
||||
case 0x0d: return op_dec_r<C>();
|
||||
case 0x0e: return op_ld_r_n<C>();
|
||||
case 0x0f: return op_rrca();
|
||||
case 0x10: return op_stop();
|
||||
case 0x11: return op_ld_rr_nn<DE>();
|
||||
case 0x12: return op_ld_rr_a<DE>();
|
||||
case 0x13: return op_inc_rr<DE>();
|
||||
case 0x14: return op_inc_r<D>();
|
||||
case 0x15: return op_dec_r<D>();
|
||||
case 0x16: return op_ld_r_n<D>();
|
||||
case 0x17: return op_rla();
|
||||
case 0x18: return op_jr_n();
|
||||
case 0x19: return op_add_hl_rr<DE>();
|
||||
case 0x1a: return op_ld_a_rr<DE>();
|
||||
case 0x1b: return op_dec_rr<DE>();
|
||||
case 0x1c: return op_inc_r<E>();
|
||||
case 0x1d: return op_dec_r<E>();
|
||||
case 0x1e: return op_ld_r_n<E>();
|
||||
case 0x1f: return op_rra();
|
||||
case 0x20: return op_jr_f_n<ZF, 0>();
|
||||
case 0x21: return op_ld_rr_nn<HL>();
|
||||
case 0x22: return op_ldi_hl_a();
|
||||
case 0x23: return op_inc_rr<HL>();
|
||||
case 0x24: return op_inc_r<H>();
|
||||
case 0x25: return op_dec_r<H>();
|
||||
case 0x26: return op_ld_r_n<H>();
|
||||
case 0x27: return op_daa();
|
||||
case 0x28: return op_jr_f_n<ZF, 1>();
|
||||
case 0x29: return op_add_hl_rr<HL>();
|
||||
case 0x2a: return op_ldi_a_hl();
|
||||
case 0x2b: return op_dec_rr<HL>();
|
||||
case 0x2c: return op_inc_r<L>();
|
||||
case 0x2d: return op_dec_r<L>();
|
||||
case 0x2e: return op_ld_r_n<L>();
|
||||
case 0x2f: return op_cpl();
|
||||
case 0x30: return op_jr_f_n<CF, 0>();
|
||||
case 0x31: return op_ld_rr_nn<SP>();
|
||||
case 0x32: return op_ldd_hl_a();
|
||||
case 0x33: return op_inc_rr<SP>();
|
||||
case 0x34: return op_inc_hl();
|
||||
case 0x35: return op_dec_hl();
|
||||
case 0x36: return op_ld_hl_n();
|
||||
case 0x37: return op_scf();
|
||||
case 0x38: return op_jr_f_n<CF, 1>();
|
||||
case 0x39: return op_add_hl_rr<SP>();
|
||||
case 0x3a: return op_ldd_a_hl();
|
||||
case 0x3b: return op_dec_rr<SP>();
|
||||
case 0x3c: return op_inc_r<A>();
|
||||
case 0x3d: return op_dec_r<A>();
|
||||
case 0x3e: return op_ld_r_n<A>();
|
||||
case 0x3f: return op_ccf();
|
||||
case 0x40: return op_ld_r_r<B, B>();
|
||||
case 0x41: return op_ld_r_r<B, C>();
|
||||
case 0x42: return op_ld_r_r<B, D>();
|
||||
case 0x43: return op_ld_r_r<B, E>();
|
||||
case 0x44: return op_ld_r_r<B, H>();
|
||||
case 0x45: return op_ld_r_r<B, L>();
|
||||
case 0x46: return op_ld_r_hl<B>();
|
||||
case 0x47: return op_ld_r_r<B, A>();
|
||||
case 0x48: return op_ld_r_r<C, B>();
|
||||
case 0x49: return op_ld_r_r<C, C>();
|
||||
case 0x4a: return op_ld_r_r<C, D>();
|
||||
case 0x4b: return op_ld_r_r<C, E>();
|
||||
case 0x4c: return op_ld_r_r<C, H>();
|
||||
case 0x4d: return op_ld_r_r<C, L>();
|
||||
case 0x4e: return op_ld_r_hl<C>();
|
||||
case 0x4f: return op_ld_r_r<C, A>();
|
||||
case 0x50: return op_ld_r_r<D, B>();
|
||||
case 0x51: return op_ld_r_r<D, C>();
|
||||
case 0x52: return op_ld_r_r<D, D>();
|
||||
case 0x53: return op_ld_r_r<D, E>();
|
||||
case 0x54: return op_ld_r_r<D, H>();
|
||||
case 0x55: return op_ld_r_r<D, L>();
|
||||
case 0x56: return op_ld_r_hl<D>();
|
||||
case 0x57: return op_ld_r_r<D, A>();
|
||||
case 0x58: return op_ld_r_r<E, B>();
|
||||
case 0x59: return op_ld_r_r<E, C>();
|
||||
case 0x5a: return op_ld_r_r<E, D>();
|
||||
case 0x5b: return op_ld_r_r<E, E>();
|
||||
case 0x5c: return op_ld_r_r<E, H>();
|
||||
case 0x5d: return op_ld_r_r<E, L>();
|
||||
case 0x5e: return op_ld_r_hl<E>();
|
||||
case 0x5f: return op_ld_r_r<E, A>();
|
||||
case 0x60: return op_ld_r_r<H, B>();
|
||||
case 0x61: return op_ld_r_r<H, C>();
|
||||
case 0x62: return op_ld_r_r<H, D>();
|
||||
case 0x63: return op_ld_r_r<H, E>();
|
||||
case 0x64: return op_ld_r_r<H, H>();
|
||||
case 0x65: return op_ld_r_r<H, L>();
|
||||
case 0x66: return op_ld_r_hl<H>();
|
||||
case 0x67: return op_ld_r_r<H, A>();
|
||||
case 0x68: return op_ld_r_r<L, B>();
|
||||
case 0x69: return op_ld_r_r<L, C>();
|
||||
case 0x6a: return op_ld_r_r<L, D>();
|
||||
case 0x6b: return op_ld_r_r<L, E>();
|
||||
case 0x6c: return op_ld_r_r<L, H>();
|
||||
case 0x6d: return op_ld_r_r<L, L>();
|
||||
case 0x6e: return op_ld_r_hl<L>();
|
||||
case 0x6f: return op_ld_r_r<L, A>();
|
||||
case 0x70: return op_ld_hl_r<B>();
|
||||
case 0x71: return op_ld_hl_r<C>();
|
||||
case 0x72: return op_ld_hl_r<D>();
|
||||
case 0x73: return op_ld_hl_r<E>();
|
||||
case 0x74: return op_ld_hl_r<H>();
|
||||
case 0x75: return op_ld_hl_r<L>();
|
||||
case 0x76: return op_halt();
|
||||
case 0x77: return op_ld_hl_r<A>();
|
||||
case 0x78: return op_ld_r_r<A, B>();
|
||||
case 0x79: return op_ld_r_r<A, C>();
|
||||
case 0x7a: return op_ld_r_r<A, D>();
|
||||
case 0x7b: return op_ld_r_r<A, E>();
|
||||
case 0x7c: return op_ld_r_r<A, H>();
|
||||
case 0x7d: return op_ld_r_r<A, L>();
|
||||
case 0x7e: return op_ld_r_hl<A>();
|
||||
case 0x7f: return op_ld_r_r<A, A>();
|
||||
case 0x80: return op_add_a_r<B>();
|
||||
case 0x81: return op_add_a_r<C>();
|
||||
case 0x82: return op_add_a_r<D>();
|
||||
case 0x83: return op_add_a_r<E>();
|
||||
case 0x84: return op_add_a_r<H>();
|
||||
case 0x85: return op_add_a_r<L>();
|
||||
case 0x86: return op_add_a_hl();
|
||||
case 0x87: return op_add_a_r<A>();
|
||||
case 0x88: return op_adc_a_r<B>();
|
||||
case 0x89: return op_adc_a_r<C>();
|
||||
case 0x8a: return op_adc_a_r<D>();
|
||||
case 0x8b: return op_adc_a_r<E>();
|
||||
case 0x8c: return op_adc_a_r<H>();
|
||||
case 0x8d: return op_adc_a_r<L>();
|
||||
case 0x8e: return op_adc_a_hl();
|
||||
case 0x8f: return op_adc_a_r<A>();
|
||||
case 0x90: return op_sub_a_r<B>();
|
||||
case 0x91: return op_sub_a_r<C>();
|
||||
case 0x92: return op_sub_a_r<D>();
|
||||
case 0x93: return op_sub_a_r<E>();
|
||||
case 0x94: return op_sub_a_r<H>();
|
||||
case 0x95: return op_sub_a_r<L>();
|
||||
case 0x96: return op_sub_a_hl();
|
||||
case 0x97: return op_sub_a_r<A>();
|
||||
case 0x98: return op_sbc_a_r<B>();
|
||||
case 0x99: return op_sbc_a_r<C>();
|
||||
case 0x9a: return op_sbc_a_r<D>();
|
||||
case 0x9b: return op_sbc_a_r<E>();
|
||||
case 0x9c: return op_sbc_a_r<H>();
|
||||
case 0x9d: return op_sbc_a_r<L>();
|
||||
case 0x9e: return op_sbc_a_hl();
|
||||
case 0x9f: return op_sbc_a_r<A>();
|
||||
case 0xa0: return op_and_a_r<B>();
|
||||
case 0xa1: return op_and_a_r<C>();
|
||||
case 0xa2: return op_and_a_r<D>();
|
||||
case 0xa3: return op_and_a_r<E>();
|
||||
case 0xa4: return op_and_a_r<H>();
|
||||
case 0xa5: return op_and_a_r<L>();
|
||||
case 0xa6: return op_and_a_hl();
|
||||
case 0xa7: return op_and_a_r<A>();
|
||||
case 0xa8: return op_xor_a_r<B>();
|
||||
case 0xa9: return op_xor_a_r<C>();
|
||||
case 0xaa: return op_xor_a_r<D>();
|
||||
case 0xab: return op_xor_a_r<E>();
|
||||
case 0xac: return op_xor_a_r<H>();
|
||||
case 0xad: return op_xor_a_r<L>();
|
||||
case 0xae: return op_xor_a_hl();
|
||||
case 0xaf: return op_xor_a_r<A>();
|
||||
case 0xb0: return op_or_a_r<B>();
|
||||
case 0xb1: return op_or_a_r<C>();
|
||||
case 0xb2: return op_or_a_r<D>();
|
||||
case 0xb3: return op_or_a_r<E>();
|
||||
case 0xb4: return op_or_a_r<H>();
|
||||
case 0xb5: return op_or_a_r<L>();
|
||||
case 0xb6: return op_or_a_hl();
|
||||
case 0xb7: return op_or_a_r<A>();
|
||||
case 0xb8: return op_cp_a_r<B>();
|
||||
case 0xb9: return op_cp_a_r<C>();
|
||||
case 0xba: return op_cp_a_r<D>();
|
||||
case 0xbb: return op_cp_a_r<E>();
|
||||
case 0xbc: return op_cp_a_r<H>();
|
||||
case 0xbd: return op_cp_a_r<L>();
|
||||
case 0xbe: return op_cp_a_hl();
|
||||
case 0xbf: return op_cp_a_r<A>();
|
||||
case 0xc0: return op_ret_f<ZF, 0>();
|
||||
case 0xc1: return op_pop_rr<BC>();
|
||||
case 0xc2: return op_jp_f_nn<ZF, 0>();
|
||||
case 0xc3: return op_jp_nn();
|
||||
case 0xc4: return op_call_f_nn<ZF, 0>();
|
||||
case 0xc5: return op_push_rr<BC>();
|
||||
case 0xc6: return op_add_a_n();
|
||||
case 0xc7: return op_rst_n<0x00>();
|
||||
case 0xc8: return op_ret_f<ZF, 1>();
|
||||
case 0xc9: return op_ret();
|
||||
case 0xca: return op_jp_f_nn<ZF, 1>();
|
||||
case 0xcb: return op_cb();
|
||||
case 0xcc: return op_call_f_nn<ZF, 1>();
|
||||
case 0xcd: return op_call_nn();
|
||||
case 0xce: return op_adc_a_n();
|
||||
case 0xcf: return op_rst_n<0x08>();
|
||||
case 0xd0: return op_ret_f<CF, 0>();
|
||||
case 0xd1: return op_pop_rr<DE>();
|
||||
case 0xd2: return op_jp_f_nn<CF, 0>();
|
||||
case 0xd3: return op_xx();
|
||||
case 0xd4: return op_call_f_nn<CF, 0>();
|
||||
case 0xd5: return op_push_rr<DE>();
|
||||
case 0xd6: return op_sub_a_n();
|
||||
case 0xd7: return op_rst_n<0x10>();
|
||||
case 0xd8: return op_ret_f<CF, 1>();
|
||||
case 0xd9: return op_reti();
|
||||
case 0xda: return op_jp_f_nn<CF, 1>();
|
||||
case 0xdb: return op_xx();
|
||||
case 0xdc: return op_call_f_nn<CF, 1>();
|
||||
case 0xdd: return op_xx();
|
||||
case 0xde: return op_sbc_a_n();
|
||||
case 0xdf: return op_rst_n<0x18>();
|
||||
case 0xe0: return op_ld_ffn_a();
|
||||
case 0xe1: return op_pop_rr<HL>();
|
||||
case 0xe2: return op_ld_ffc_a();
|
||||
case 0xe3: return op_xx();
|
||||
case 0xe4: return op_xx();
|
||||
case 0xe5: return op_push_rr<HL>();
|
||||
case 0xe6: return op_and_a_n();
|
||||
case 0xe7: return op_rst_n<0x20>();
|
||||
case 0xe8: return op_add_sp_n();
|
||||
case 0xe9: return op_jp_hl();
|
||||
case 0xea: return op_ld_nn_a();
|
||||
case 0xeb: return op_xx();
|
||||
case 0xec: return op_xx();
|
||||
case 0xed: return op_xx();
|
||||
case 0xee: return op_xor_a_n();
|
||||
case 0xef: return op_rst_n<0x28>();
|
||||
case 0xf0: return op_ld_a_ffn();
|
||||
case 0xf1: return op_pop_rr<AF>();
|
||||
case 0xf2: return op_ld_a_ffc();
|
||||
case 0xf3: return op_di();
|
||||
case 0xf4: return op_xx();
|
||||
case 0xf5: return op_push_rr<AF>();
|
||||
case 0xf6: return op_or_a_n();
|
||||
case 0xf7: return op_rst_n<0x30>();
|
||||
case 0xf8: return op_ld_hl_sp_n();
|
||||
case 0xf9: return op_ld_sp_hl();
|
||||
case 0xfa: return op_ld_a_nn();
|
||||
case 0xfb: return op_ei();
|
||||
case 0xfc: return op_xx();
|
||||
case 0xfd: return op_xx();
|
||||
case 0xfe: return op_cp_a_n();
|
||||
case 0xff: return op_rst_n<0x38>();
|
||||
}
|
||||
}
|
||||
|
||||
void LR35902::exec_cb() {
|
||||
uint8 opcode = op_read(r[PC]++);
|
||||
switch(opcode) {
|
||||
case 0x00: return op_rlc_r<B>();
|
||||
case 0x01: return op_rlc_r<C>();
|
||||
case 0x02: return op_rlc_r<D>();
|
||||
case 0x03: return op_rlc_r<E>();
|
||||
case 0x04: return op_rlc_r<H>();
|
||||
case 0x05: return op_rlc_r<L>();
|
||||
case 0x06: return op_rlc_hl();
|
||||
case 0x07: return op_rlc_r<A>();
|
||||
case 0x08: return op_rrc_r<B>();
|
||||
case 0x09: return op_rrc_r<C>();
|
||||
case 0x0a: return op_rrc_r<D>();
|
||||
case 0x0b: return op_rrc_r<E>();
|
||||
case 0x0c: return op_rrc_r<H>();
|
||||
case 0x0d: return op_rrc_r<L>();
|
||||
case 0x0e: return op_rrc_hl();
|
||||
case 0x0f: return op_rrc_r<A>();
|
||||
case 0x10: return op_rl_r<B>();
|
||||
case 0x11: return op_rl_r<C>();
|
||||
case 0x12: return op_rl_r<D>();
|
||||
case 0x13: return op_rl_r<E>();
|
||||
case 0x14: return op_rl_r<H>();
|
||||
case 0x15: return op_rl_r<L>();
|
||||
case 0x16: return op_rl_hl();
|
||||
case 0x17: return op_rl_r<A>();
|
||||
case 0x18: return op_rr_r<B>();
|
||||
case 0x19: return op_rr_r<C>();
|
||||
case 0x1a: return op_rr_r<D>();
|
||||
case 0x1b: return op_rr_r<E>();
|
||||
case 0x1c: return op_rr_r<H>();
|
||||
case 0x1d: return op_rr_r<L>();
|
||||
case 0x1e: return op_rr_hl();
|
||||
case 0x1f: return op_rr_r<A>();
|
||||
case 0x20: return op_sla_r<B>();
|
||||
case 0x21: return op_sla_r<C>();
|
||||
case 0x22: return op_sla_r<D>();
|
||||
case 0x23: return op_sla_r<E>();
|
||||
case 0x24: return op_sla_r<H>();
|
||||
case 0x25: return op_sla_r<L>();
|
||||
case 0x26: return op_sla_hl();
|
||||
case 0x27: return op_sla_r<A>();
|
||||
case 0x28: return op_sra_r<B>();
|
||||
case 0x29: return op_sra_r<C>();
|
||||
case 0x2a: return op_sra_r<D>();
|
||||
case 0x2b: return op_sra_r<E>();
|
||||
case 0x2c: return op_sra_r<H>();
|
||||
case 0x2d: return op_sra_r<L>();
|
||||
case 0x2e: return op_sra_hl();
|
||||
case 0x2f: return op_sra_r<A>();
|
||||
case 0x30: return op_swap_r<B>();
|
||||
case 0x31: return op_swap_r<C>();
|
||||
case 0x32: return op_swap_r<D>();
|
||||
case 0x33: return op_swap_r<E>();
|
||||
case 0x34: return op_swap_r<H>();
|
||||
case 0x35: return op_swap_r<L>();
|
||||
case 0x36: return op_swap_hl();
|
||||
case 0x37: return op_swap_r<A>();
|
||||
case 0x38: return op_srl_r<B>();
|
||||
case 0x39: return op_srl_r<C>();
|
||||
case 0x3a: return op_srl_r<D>();
|
||||
case 0x3b: return op_srl_r<E>();
|
||||
case 0x3c: return op_srl_r<H>();
|
||||
case 0x3d: return op_srl_r<L>();
|
||||
case 0x3e: return op_srl_hl();
|
||||
case 0x3f: return op_srl_r<A>();
|
||||
case 0x40: return op_bit_n_r<0, B>();
|
||||
case 0x41: return op_bit_n_r<0, C>();
|
||||
case 0x42: return op_bit_n_r<0, D>();
|
||||
case 0x43: return op_bit_n_r<0, E>();
|
||||
case 0x44: return op_bit_n_r<0, H>();
|
||||
case 0x45: return op_bit_n_r<0, L>();
|
||||
case 0x46: return op_bit_n_hl<0>();
|
||||
case 0x47: return op_bit_n_r<0, A>();
|
||||
case 0x48: return op_bit_n_r<1, B>();
|
||||
case 0x49: return op_bit_n_r<1, C>();
|
||||
case 0x4a: return op_bit_n_r<1, D>();
|
||||
case 0x4b: return op_bit_n_r<1, E>();
|
||||
case 0x4c: return op_bit_n_r<1, H>();
|
||||
case 0x4d: return op_bit_n_r<1, L>();
|
||||
case 0x4e: return op_bit_n_hl<1>();
|
||||
case 0x4f: return op_bit_n_r<1, A>();
|
||||
case 0x50: return op_bit_n_r<2, B>();
|
||||
case 0x51: return op_bit_n_r<2, C>();
|
||||
case 0x52: return op_bit_n_r<2, D>();
|
||||
case 0x53: return op_bit_n_r<2, E>();
|
||||
case 0x54: return op_bit_n_r<2, H>();
|
||||
case 0x55: return op_bit_n_r<2, L>();
|
||||
case 0x56: return op_bit_n_hl<2>();
|
||||
case 0x57: return op_bit_n_r<2, A>();
|
||||
case 0x58: return op_bit_n_r<3, B>();
|
||||
case 0x59: return op_bit_n_r<3, C>();
|
||||
case 0x5a: return op_bit_n_r<3, D>();
|
||||
case 0x5b: return op_bit_n_r<3, E>();
|
||||
case 0x5c: return op_bit_n_r<3, H>();
|
||||
case 0x5d: return op_bit_n_r<3, L>();
|
||||
case 0x5e: return op_bit_n_hl<3>();
|
||||
case 0x5f: return op_bit_n_r<3, A>();
|
||||
case 0x60: return op_bit_n_r<4, B>();
|
||||
case 0x61: return op_bit_n_r<4, C>();
|
||||
case 0x62: return op_bit_n_r<4, D>();
|
||||
case 0x63: return op_bit_n_r<4, E>();
|
||||
case 0x64: return op_bit_n_r<4, H>();
|
||||
case 0x65: return op_bit_n_r<4, L>();
|
||||
case 0x66: return op_bit_n_hl<4>();
|
||||
case 0x67: return op_bit_n_r<4, A>();
|
||||
case 0x68: return op_bit_n_r<5, B>();
|
||||
case 0x69: return op_bit_n_r<5, C>();
|
||||
case 0x6a: return op_bit_n_r<5, D>();
|
||||
case 0x6b: return op_bit_n_r<5, E>();
|
||||
case 0x6c: return op_bit_n_r<5, H>();
|
||||
case 0x6d: return op_bit_n_r<5, L>();
|
||||
case 0x6e: return op_bit_n_hl<5>();
|
||||
case 0x6f: return op_bit_n_r<5, A>();
|
||||
case 0x70: return op_bit_n_r<6, B>();
|
||||
case 0x71: return op_bit_n_r<6, C>();
|
||||
case 0x72: return op_bit_n_r<6, D>();
|
||||
case 0x73: return op_bit_n_r<6, E>();
|
||||
case 0x74: return op_bit_n_r<6, H>();
|
||||
case 0x75: return op_bit_n_r<6, L>();
|
||||
case 0x76: return op_bit_n_hl<6>();
|
||||
case 0x77: return op_bit_n_r<6, A>();
|
||||
case 0x78: return op_bit_n_r<7, B>();
|
||||
case 0x79: return op_bit_n_r<7, C>();
|
||||
case 0x7a: return op_bit_n_r<7, D>();
|
||||
case 0x7b: return op_bit_n_r<7, E>();
|
||||
case 0x7c: return op_bit_n_r<7, H>();
|
||||
case 0x7d: return op_bit_n_r<7, L>();
|
||||
case 0x7e: return op_bit_n_hl<7>();
|
||||
case 0x7f: return op_bit_n_r<7, A>();
|
||||
case 0x80: return op_res_n_r<0, B>();
|
||||
case 0x81: return op_res_n_r<0, C>();
|
||||
case 0x82: return op_res_n_r<0, D>();
|
||||
case 0x83: return op_res_n_r<0, E>();
|
||||
case 0x84: return op_res_n_r<0, H>();
|
||||
case 0x85: return op_res_n_r<0, L>();
|
||||
case 0x86: return op_res_n_hl<0>();
|
||||
case 0x87: return op_res_n_r<0, A>();
|
||||
case 0x88: return op_res_n_r<1, B>();
|
||||
case 0x89: return op_res_n_r<1, C>();
|
||||
case 0x8a: return op_res_n_r<1, D>();
|
||||
case 0x8b: return op_res_n_r<1, E>();
|
||||
case 0x8c: return op_res_n_r<1, H>();
|
||||
case 0x8d: return op_res_n_r<1, L>();
|
||||
case 0x8e: return op_res_n_hl<1>();
|
||||
case 0x8f: return op_res_n_r<1, A>();
|
||||
case 0x90: return op_res_n_r<2, B>();
|
||||
case 0x91: return op_res_n_r<2, C>();
|
||||
case 0x92: return op_res_n_r<2, D>();
|
||||
case 0x93: return op_res_n_r<2, E>();
|
||||
case 0x94: return op_res_n_r<2, H>();
|
||||
case 0x95: return op_res_n_r<2, L>();
|
||||
case 0x96: return op_res_n_hl<2>();
|
||||
case 0x97: return op_res_n_r<2, A>();
|
||||
case 0x98: return op_res_n_r<3, B>();
|
||||
case 0x99: return op_res_n_r<3, C>();
|
||||
case 0x9a: return op_res_n_r<3, D>();
|
||||
case 0x9b: return op_res_n_r<3, E>();
|
||||
case 0x9c: return op_res_n_r<3, H>();
|
||||
case 0x9d: return op_res_n_r<3, L>();
|
||||
case 0x9e: return op_res_n_hl<3>();
|
||||
case 0x9f: return op_res_n_r<3, A>();
|
||||
case 0xa0: return op_res_n_r<4, B>();
|
||||
case 0xa1: return op_res_n_r<4, C>();
|
||||
case 0xa2: return op_res_n_r<4, D>();
|
||||
case 0xa3: return op_res_n_r<4, E>();
|
||||
case 0xa4: return op_res_n_r<4, H>();
|
||||
case 0xa5: return op_res_n_r<4, L>();
|
||||
case 0xa6: return op_res_n_hl<4>();
|
||||
case 0xa7: return op_res_n_r<4, A>();
|
||||
case 0xa8: return op_res_n_r<5, B>();
|
||||
case 0xa9: return op_res_n_r<5, C>();
|
||||
case 0xaa: return op_res_n_r<5, D>();
|
||||
case 0xab: return op_res_n_r<5, E>();
|
||||
case 0xac: return op_res_n_r<5, H>();
|
||||
case 0xad: return op_res_n_r<5, L>();
|
||||
case 0xae: return op_res_n_hl<5>();
|
||||
case 0xaf: return op_res_n_r<5, A>();
|
||||
case 0xb0: return op_res_n_r<6, B>();
|
||||
case 0xb1: return op_res_n_r<6, C>();
|
||||
case 0xb2: return op_res_n_r<6, D>();
|
||||
case 0xb3: return op_res_n_r<6, E>();
|
||||
case 0xb4: return op_res_n_r<6, H>();
|
||||
case 0xb5: return op_res_n_r<6, L>();
|
||||
case 0xb6: return op_res_n_hl<6>();
|
||||
case 0xb7: return op_res_n_r<6, A>();
|
||||
case 0xb8: return op_res_n_r<7, B>();
|
||||
case 0xb9: return op_res_n_r<7, C>();
|
||||
case 0xba: return op_res_n_r<7, D>();
|
||||
case 0xbb: return op_res_n_r<7, E>();
|
||||
case 0xbc: return op_res_n_r<7, H>();
|
||||
case 0xbd: return op_res_n_r<7, L>();
|
||||
case 0xbe: return op_res_n_hl<7>();
|
||||
case 0xbf: return op_res_n_r<7, A>();
|
||||
case 0xc0: return op_set_n_r<0, B>();
|
||||
case 0xc1: return op_set_n_r<0, C>();
|
||||
case 0xc2: return op_set_n_r<0, D>();
|
||||
case 0xc3: return op_set_n_r<0, E>();
|
||||
case 0xc4: return op_set_n_r<0, H>();
|
||||
case 0xc5: return op_set_n_r<0, L>();
|
||||
case 0xc6: return op_set_n_hl<0>();
|
||||
case 0xc7: return op_set_n_r<0, A>();
|
||||
case 0xc8: return op_set_n_r<1, B>();
|
||||
case 0xc9: return op_set_n_r<1, C>();
|
||||
case 0xca: return op_set_n_r<1, D>();
|
||||
case 0xcb: return op_set_n_r<1, E>();
|
||||
case 0xcc: return op_set_n_r<1, H>();
|
||||
case 0xcd: return op_set_n_r<1, L>();
|
||||
case 0xce: return op_set_n_hl<1>();
|
||||
case 0xcf: return op_set_n_r<1, A>();
|
||||
case 0xd0: return op_set_n_r<2, B>();
|
||||
case 0xd1: return op_set_n_r<2, C>();
|
||||
case 0xd2: return op_set_n_r<2, D>();
|
||||
case 0xd3: return op_set_n_r<2, E>();
|
||||
case 0xd4: return op_set_n_r<2, H>();
|
||||
case 0xd5: return op_set_n_r<2, L>();
|
||||
case 0xd6: return op_set_n_hl<2>();
|
||||
case 0xd7: return op_set_n_r<2, A>();
|
||||
case 0xd8: return op_set_n_r<3, B>();
|
||||
case 0xd9: return op_set_n_r<3, C>();
|
||||
case 0xda: return op_set_n_r<3, D>();
|
||||
case 0xdb: return op_set_n_r<3, E>();
|
||||
case 0xdc: return op_set_n_r<3, H>();
|
||||
case 0xdd: return op_set_n_r<3, L>();
|
||||
case 0xde: return op_set_n_hl<3>();
|
||||
case 0xdf: return op_set_n_r<3, A>();
|
||||
case 0xe0: return op_set_n_r<4, B>();
|
||||
case 0xe1: return op_set_n_r<4, C>();
|
||||
case 0xe2: return op_set_n_r<4, D>();
|
||||
case 0xe3: return op_set_n_r<4, E>();
|
||||
case 0xe4: return op_set_n_r<4, H>();
|
||||
case 0xe5: return op_set_n_r<4, L>();
|
||||
case 0xe6: return op_set_n_hl<4>();
|
||||
case 0xe7: return op_set_n_r<4, A>();
|
||||
case 0xe8: return op_set_n_r<5, B>();
|
||||
case 0xe9: return op_set_n_r<5, C>();
|
||||
case 0xea: return op_set_n_r<5, D>();
|
||||
case 0xeb: return op_set_n_r<5, E>();
|
||||
case 0xec: return op_set_n_r<5, H>();
|
||||
case 0xed: return op_set_n_r<5, L>();
|
||||
case 0xee: return op_set_n_hl<5>();
|
||||
case 0xef: return op_set_n_r<5, A>();
|
||||
case 0xf0: return op_set_n_r<6, B>();
|
||||
case 0xf1: return op_set_n_r<6, C>();
|
||||
case 0xf2: return op_set_n_r<6, D>();
|
||||
case 0xf3: return op_set_n_r<6, E>();
|
||||
case 0xf4: return op_set_n_r<6, H>();
|
||||
case 0xf5: return op_set_n_r<6, L>();
|
||||
case 0xf6: return op_set_n_hl<6>();
|
||||
case 0xf7: return op_set_n_r<6, A>();
|
||||
case 0xf8: return op_set_n_r<7, B>();
|
||||
case 0xf9: return op_set_n_r<7, C>();
|
||||
case 0xfa: return op_set_n_r<7, D>();
|
||||
case 0xfb: return op_set_n_r<7, E>();
|
||||
case 0xfc: return op_set_n_r<7, H>();
|
||||
case 0xfd: return op_set_n_r<7, L>();
|
||||
case 0xfe: return op_set_n_hl<7>();
|
||||
case 0xff: return op_set_n_r<7, A>();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,167 @@
|
|||
#ifndef PROCESSOR_LR35902_HPP
|
||||
#define PROCESSOR_LR35902_HPP
|
||||
|
||||
namespace Processor {
|
||||
|
||||
//Sharp LR35902 (Game Boy Z80-derivative)
|
||||
|
||||
struct LR35902 {
|
||||
#include "registers.hpp"
|
||||
|
||||
virtual void op_io() = 0;
|
||||
virtual uint8 op_read(uint16 addr) = 0;
|
||||
virtual void op_write(uint16 addr, uint8 data) = 0;
|
||||
virtual void stop() = 0;
|
||||
virtual uint8 debugger_read(uint16 addr) { return 0u; }
|
||||
|
||||
void power();
|
||||
void exec();
|
||||
void exec_cb();
|
||||
void serialize(serializer&);
|
||||
|
||||
privileged:
|
||||
void op_xx();
|
||||
void op_cb();
|
||||
|
||||
//8-bit load commands
|
||||
template<unsigned x, unsigned y> void op_ld_r_r();
|
||||
template<unsigned x> void op_ld_r_n();
|
||||
template<unsigned x> void op_ld_r_hl();
|
||||
template<unsigned x> void op_ld_hl_r();
|
||||
void op_ld_hl_n();
|
||||
template<unsigned x> void op_ld_a_rr();
|
||||
void op_ld_a_nn();
|
||||
template<unsigned x> void op_ld_rr_a();
|
||||
void op_ld_nn_a();
|
||||
void op_ld_a_ffn();
|
||||
void op_ld_ffn_a();
|
||||
void op_ld_a_ffc();
|
||||
void op_ld_ffc_a();
|
||||
void op_ldi_hl_a();
|
||||
void op_ldi_a_hl();
|
||||
void op_ldd_hl_a();
|
||||
void op_ldd_a_hl();
|
||||
|
||||
//16-bit load commands
|
||||
template<unsigned x> void op_ld_rr_nn();
|
||||
void op_ld_nn_sp();
|
||||
void op_ld_sp_hl();
|
||||
template<unsigned x> void op_push_rr();
|
||||
template<unsigned x> void op_pop_rr();
|
||||
|
||||
//8-bit arithmetic commands
|
||||
void opi_add_a(uint8 x);
|
||||
template<unsigned x> void op_add_a_r();
|
||||
void op_add_a_n();
|
||||
void op_add_a_hl();
|
||||
|
||||
void opi_adc_a(uint8 x);
|
||||
template<unsigned x> void op_adc_a_r();
|
||||
void op_adc_a_n();
|
||||
void op_adc_a_hl();
|
||||
|
||||
void opi_sub_a(uint8 x);
|
||||
template<unsigned x> void op_sub_a_r();
|
||||
void op_sub_a_n();
|
||||
void op_sub_a_hl();
|
||||
|
||||
void opi_sbc_a(uint8 x);
|
||||
template<unsigned x> void op_sbc_a_r();
|
||||
void op_sbc_a_n();
|
||||
void op_sbc_a_hl();
|
||||
|
||||
void opi_and_a(uint8 x);
|
||||
template<unsigned x> void op_and_a_r();
|
||||
void op_and_a_n();
|
||||
void op_and_a_hl();
|
||||
|
||||
void opi_xor_a(uint8 x);
|
||||
template<unsigned x> void op_xor_a_r();
|
||||
void op_xor_a_n();
|
||||
void op_xor_a_hl();
|
||||
|
||||
void opi_or_a(uint8 x);
|
||||
template<unsigned x> void op_or_a_r();
|
||||
void op_or_a_n();
|
||||
void op_or_a_hl();
|
||||
|
||||
void opi_cp_a(uint8 x);
|
||||
template<unsigned x> void op_cp_a_r();
|
||||
void op_cp_a_n();
|
||||
void op_cp_a_hl();
|
||||
|
||||
template<unsigned x> void op_inc_r();
|
||||
void op_inc_hl();
|
||||
template<unsigned x> void op_dec_r();
|
||||
void op_dec_hl();
|
||||
void op_daa();
|
||||
void op_cpl();
|
||||
|
||||
//16-bit arithmetic commands
|
||||
template<unsigned x> void op_add_hl_rr();
|
||||
template<unsigned x> void op_inc_rr();
|
||||
template<unsigned x> void op_dec_rr();
|
||||
void op_add_sp_n();
|
||||
void op_ld_hl_sp_n();
|
||||
|
||||
//rotate/shift commands
|
||||
void op_rlca();
|
||||
void op_rla();
|
||||
void op_rrca();
|
||||
void op_rra();
|
||||
template<unsigned x> void op_rlc_r();
|
||||
void op_rlc_hl();
|
||||
template<unsigned x> void op_rl_r();
|
||||
void op_rl_hl();
|
||||
template<unsigned x> void op_rrc_r();
|
||||
void op_rrc_hl();
|
||||
template<unsigned x> void op_rr_r();
|
||||
void op_rr_hl();
|
||||
template<unsigned x> void op_sla_r();
|
||||
void op_sla_hl();
|
||||
template<unsigned x> void op_swap_r();
|
||||
void op_swap_hl();
|
||||
template<unsigned x> void op_sra_r();
|
||||
void op_sra_hl();
|
||||
template<unsigned x> void op_srl_r();
|
||||
void op_srl_hl();
|
||||
|
||||
//single-bit commands
|
||||
template<unsigned b, unsigned x> void op_bit_n_r();
|
||||
template<unsigned b> void op_bit_n_hl();
|
||||
template<unsigned b, unsigned x> void op_set_n_r();
|
||||
template<unsigned b> void op_set_n_hl();
|
||||
template<unsigned b, unsigned x> void op_res_n_r();
|
||||
template<unsigned b> void op_res_n_hl();
|
||||
|
||||
//control commands
|
||||
void op_ccf();
|
||||
void op_scf();
|
||||
void op_nop();
|
||||
void op_halt();
|
||||
void op_stop();
|
||||
void op_di();
|
||||
void op_ei();
|
||||
|
||||
//jump commands
|
||||
void op_jp_nn();
|
||||
void op_jp_hl();
|
||||
template<unsigned x, bool y> void op_jp_f_nn();
|
||||
void op_jr_n();
|
||||
template<unsigned x, bool y> void op_jr_f_n();
|
||||
void op_call_nn();
|
||||
template<unsigned x, bool y> void op_call_f_nn();
|
||||
void op_ret();
|
||||
template<unsigned x, bool y> void op_ret_f();
|
||||
void op_reti();
|
||||
template<unsigned n> void op_rst_n();
|
||||
|
||||
//disassembler.cpp
|
||||
string disassemble(uint16 pc);
|
||||
string disassemble_opcode(uint16 pc);
|
||||
string disassemble_opcode_cb(uint16 pc);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -92,6 +92,11 @@ struct Registers {
|
|||
Register16 sp;
|
||||
Register16 pc;
|
||||
|
||||
bool halt;
|
||||
bool stop;
|
||||
bool ei;
|
||||
bool ime;
|
||||
|
||||
Register& operator[](unsigned r) {
|
||||
static Register* table[] = { &a, &f, &af, &b, &c, &bc, &d, &e, &de, &h, &l, &hl, &sp, &pc };
|
||||
return *table[r];
|
|
@ -0,0 +1,20 @@
|
|||
void LR35902::serialize(serializer &s) {
|
||||
s.integer(r.a.data);
|
||||
s.integer(r.f.z);
|
||||
s.integer(r.f.n);
|
||||
s.integer(r.f.h);
|
||||
s.integer(r.f.c);
|
||||
s.integer(r.b.data);
|
||||
s.integer(r.c.data);
|
||||
s.integer(r.d.data);
|
||||
s.integer(r.e.data);
|
||||
s.integer(r.h.data);
|
||||
s.integer(r.l.data);
|
||||
s.integer(r.sp.data);
|
||||
s.integer(r.pc.data);
|
||||
|
||||
s.integer(r.halt);
|
||||
s.integer(r.stop);
|
||||
s.integer(r.ei);
|
||||
s.integer(r.ime);
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define CPU_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
CPU cpu;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define DSP_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
DSP dsp;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define PPU_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
PPU ppu;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define PPU_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
PPU ppu;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SMP_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
SMP smp;
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <nall/sha256.hpp>
|
||||
|
||||
#define CARTRIDGE_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "markup.cpp"
|
||||
#include "serialization.cpp"
|
||||
|
@ -61,7 +61,7 @@ void Cartridge::load(Mode cartridge_mode, const string &markup) {
|
|||
break;
|
||||
case Mode::SuperGameBoy:
|
||||
#if defined(GAMEBOY)
|
||||
sha256 = GB::cartridge.sha256();
|
||||
sha256 = GameBoy::cartridge.sha256();
|
||||
#else
|
||||
throw "Game Boy support not present";
|
||||
#endif
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define CHEAT_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
Cheat cheat;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define ARMDSP_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "memory.cpp"
|
||||
#include "serialization.cpp"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define BSX_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
#include "satellaview/satellaview.cpp"
|
||||
#include "cartridge/cartridge.cpp"
|
||||
#include "flash/flash.cpp"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define HITACHIDSP_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "memory.cpp"
|
||||
#include "serialization.cpp"
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define ICD2_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "interface/interface.cpp"
|
||||
#include "mmio/mmio.cpp"
|
||||
|
@ -15,14 +15,14 @@ void ICD2::Enter() { icd2.enter(); }
|
|||
void ICD2::enter() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
GB::system.runtosave();
|
||||
GameBoy::system.runtosave();
|
||||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
}
|
||||
|
||||
if(r6003 & 0x80) {
|
||||
GB::system.run();
|
||||
step(GB::system.clocks_executed);
|
||||
GB::system.clocks_executed = 0;
|
||||
GameBoy::system.run();
|
||||
step(GameBoy::system.clocks_executed);
|
||||
GameBoy::system.clocks_executed = 0;
|
||||
} else { //DMG halted
|
||||
audio.coprocessor_sample(0x0000, 0x0000);
|
||||
step(1);
|
||||
|
@ -69,9 +69,9 @@ void ICD2::reset() {
|
|||
joyp14lock = 0;
|
||||
pulselock = true;
|
||||
|
||||
GB::interface = this;
|
||||
GB::system.init();
|
||||
GB::system.power();
|
||||
GameBoy::interface = this;
|
||||
GameBoy::system.init();
|
||||
GameBoy::system.power();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
class ICD2 : GB::Interface, public Coprocessor {
|
||||
class ICD2 : GameBoy::Interface, public Coprocessor {
|
||||
public:
|
||||
unsigned revision;
|
||||
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
//called on rendered lines 0-143 (not on Vblank lines 144-153)
|
||||
void ICD2::lcdScanline() {
|
||||
if((GB::lcd.status.ly & 7) == 0) {
|
||||
if((GameBoy::ppu.status.ly & 7) == 0) {
|
||||
lcd.row = (lcd.row + 1) & 3;
|
||||
}
|
||||
|
||||
unsigned offset = (lcd.row * 160 * 8) + ((GB::lcd.status.ly & 7) * 160);
|
||||
memcpy(lcd.buffer + offset, GB::lcd.screen + GB::lcd.status.ly * 160, 160 * sizeof(uint16));
|
||||
unsigned offset = (lcd.row * 160 * 8) + ((GameBoy::ppu.status.ly & 7) * 160);
|
||||
memcpy(lcd.buffer + offset, GameBoy::ppu.screen + GameBoy::ppu.status.ly * 160, 160 * sizeof(uint16));
|
||||
}
|
||||
|
||||
void ICD2::joypWrite(bool p15, bool p14) {
|
||||
|
@ -88,7 +88,7 @@ void ICD2::audioSample(int16_t center, int16_t left, int16_t right) {
|
|||
}
|
||||
|
||||
bool ICD2::inputPoll(unsigned id) {
|
||||
GB::cpu.status.mlt_req = joyp_id & mlt_req;
|
||||
GameBoy::cpu.status.mlt_req = joyp_id & mlt_req;
|
||||
|
||||
unsigned data = 0x00;
|
||||
switch(joyp_id & mlt_req) {
|
||||
|
@ -98,15 +98,15 @@ bool ICD2::inputPoll(unsigned id) {
|
|||
case 3: data = ~r6007; break;
|
||||
}
|
||||
|
||||
switch((GB::Input)id) {
|
||||
case GB::Input::Start: return data & 0x80;
|
||||
case GB::Input::Select: return data & 0x40;
|
||||
case GB::Input::B: return data & 0x20;
|
||||
case GB::Input::A: return data & 0x10;
|
||||
case GB::Input::Down: return data & 0x08;
|
||||
case GB::Input::Up: return data & 0x04;
|
||||
case GB::Input::Left: return data & 0x02;
|
||||
case GB::Input::Right: return data & 0x01;
|
||||
switch((GameBoy::Input)id) {
|
||||
case GameBoy::Input::Start: return data & 0x80;
|
||||
case GameBoy::Input::Select: return data & 0x40;
|
||||
case GameBoy::Input::B: return data & 0x20;
|
||||
case GameBoy::Input::A: return data & 0x10;
|
||||
case GameBoy::Input::Down: return data & 0x08;
|
||||
case GameBoy::Input::Up: return data & 0x04;
|
||||
case GameBoy::Input::Left: return data & 0x02;
|
||||
case GameBoy::Input::Right: return data & 0x01;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -19,7 +19,7 @@ uint8 ICD2::read(unsigned addr) {
|
|||
|
||||
//LY counter
|
||||
if(addr == 0x6000) {
|
||||
r6000_ly = GB::lcd.status.ly;
|
||||
r6000_ly = GameBoy::ppu.status.ly;
|
||||
r6000_row = lcd.row;
|
||||
return r6000_ly;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
void ICD2::serialize(serializer &s) {
|
||||
Thread::serialize(s);
|
||||
GB::system.serialize_all(s);
|
||||
GameBoy::system.serialize_all(s);
|
||||
|
||||
for(unsigned n = 0; n < 64; n++) s.array(packet[n].data);
|
||||
s.integer(packetsize);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define LINK_HPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
Link link;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define MSU1_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
MSU1 msu1;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define NECDSP_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
NECDSP necdsp;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define NSS_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
NSS nss;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define OBC1_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
OBC1 obc1;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SA1_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
SA1 sa1;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SDD1_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
SDD1 sdd1;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SPC7110_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
SPC7110 spc7110;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SRTC_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
SRTC srtc;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SUFAMITURBO_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
SufamiTurbo sufamiturbo;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SUPERFX_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
#include "bus/bus.cpp"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define CONTROLLER_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "gamepad/gamepad.cpp"
|
||||
#include "multitap/multitap.cpp"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define CPUCORE_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "serialization.cpp"
|
||||
#include "algorithms.cpp"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define CPU_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
CPU cpu;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define DSP_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
DSP dsp;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
Interface *interface = nullptr;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define MEMORY_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
Bus bus;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define PPU_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
PPU ppu;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SMPCORE_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
#include "algorithms.cpp"
|
||||
#include "opcodes.cpp"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SMP_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
SMP smp;
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include <processor/hg51b/hg51b.hpp>
|
||||
#include <processor/upd96050/upd96050.hpp>
|
||||
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
namespace Info {
|
||||
static const char Name[] = "bsnes";
|
||||
static const unsigned SerializerVersion = 24;
|
||||
|
@ -14,7 +14,7 @@ namespace SNES {
|
|||
}
|
||||
|
||||
/*
|
||||
bsnes - SNES emulator
|
||||
bsnes - Super Famicom emulator
|
||||
author: byuu
|
||||
license: GPLv3
|
||||
project started: 2004-10-14
|
||||
|
@ -26,7 +26,7 @@ namespace SNES {
|
|||
#include <gb/gb.hpp>
|
||||
#endif
|
||||
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
struct Thread {
|
||||
cothread_t thread;
|
||||
unsigned frequency;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <snes/snes.hpp>
|
||||
|
||||
#define SYSTEM_CPP
|
||||
namespace SNES {
|
||||
namespace SuperFamicom {
|
||||
|
||||
System system;
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#endif
|
||||
|
||||
#include <snes/snes.hpp>
|
||||
namespace SNES = SuperFamicom;
|
||||
|
||||
#include <nall/config.hpp>
|
||||
#include <nall/directory.hpp>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
processors := arm hg51b upd96050
|
||||
processors := arm hg51b lr35902 upd96050
|
||||
include processor/Makefile
|
||||
|
||||
include $(nes)/Makefile
|
||||
|
|
|
@ -3,6 +3,11 @@
|
|||
#include <gb/gb.hpp>
|
||||
#include <gba/gba.hpp>
|
||||
|
||||
namespace NES = Famicom;
|
||||
namespace SNES = SuperFamicom;
|
||||
namespace GB = GameBoy;
|
||||
namespace GBA = GameBoyAdvance;
|
||||
|
||||
#include <nall/compositor.hpp>
|
||||
#include <nall/config.hpp>
|
||||
#include <nall/directory.hpp>
|
||||
|
|
|
@ -37,11 +37,11 @@ Config::Config() {
|
|||
append(input.driver = "", "Input::Driver");
|
||||
append(input.focusPolicy = 1, "Input::FocusPolicy");
|
||||
|
||||
append(nes.controllerPort1Device = 1, "NES::Controller::Port1");
|
||||
append(nes.controllerPort2Device = 0, "NES::Controller::Port2");
|
||||
append(nes.controllerPort1Device = 1, "Famicom::Controller::Port1");
|
||||
append(nes.controllerPort2Device = 0, "Famicom::Controller::Port2");
|
||||
|
||||
append(snes.controllerPort1Device = 1, "SNES::Controller::Port1");
|
||||
append(snes.controllerPort2Device = 0, "SNES::Controller::Port2");
|
||||
append(snes.controllerPort1Device = 1, "SuperFamciom::Controller::Port1");
|
||||
append(snes.controllerPort2Device = 0, "SuperFamicom::Controller::Port2");
|
||||
|
||||
load(application->path("settings.cfg"));
|
||||
save(application->path("settings.cfg"));
|
||||
|
|
|
@ -375,13 +375,10 @@ MainWindow::MainWindow() {
|
|||
}
|
||||
|
||||
void MainWindow::synchronize() {
|
||||
if(interface->cartridgeLoaded()) {
|
||||
toolsStateSave.setEnabled(true);
|
||||
toolsStateLoad.setEnabled(true);
|
||||
} else {
|
||||
toolsStateSave.setEnabled(false);
|
||||
toolsStateLoad.setEnabled(false);
|
||||
}
|
||||
bool enable = interface->cartridgeLoaded();
|
||||
toolsStateSave.setEnabled(enable);
|
||||
toolsStateLoad.setEnabled(enable);
|
||||
toolsInformationWindow.setEnabled(enable);
|
||||
}
|
||||
|
||||
void MainWindow::setupVideoFilters() {
|
||||
|
|
Loading…
Reference in New Issue