2010-08-09 13:33:44 +00:00
|
|
|
class CPU : public Processor, public CPUcore, public PPUcounter, public MMIO {
|
2010-08-09 13:28:56 +00:00
|
|
|
public:
|
Updated to v067r21 release.
byuu says:
This moves toward a profile-selection mode. Right now, it is incomplete.
There are three binaries, one for each profile. The GUI selection
doesn't actually do anything yet. There will be a launcher in a future
release that loads each profile's respective binary.
I reverted away from blargg's SMP library for the time being, in favor
of my own. This will fix most of the csnes/bsnes-performance bugs. This
causes a 10% speed hit on 64-bit platforms, and a 15% speed hit on
32-bit platforms. I hope to be able to regain that speed in the future,
I may also experiment with creating my own fast-SMP core which drops bus
hold delays and TEST register support (never used by anything, ever.)
Save states now work in all three cores, but they are not
cross-compatible. The profile name is stored in the description field of
the save states, and it won't load a state if the profile name doesn't
match.
The debugger only works on the research target for now. Give it time and
it will return for the other targets.
Other than that, let's please resume testing on all three once again.
See how far we get this time :)
I can confirm the following games have issues on the performance
profile:
- Armored Police Metal Jacket (minor logo flickering, not a big deal)
- Chou Aniki (won't start, so obviously unplayable)
- Robocop vs The Terminator (major in-game flickering, unplayable)
Anyone still have that gigantic bsnes thread archive from the ZSNES
forum? Maybe I posted about how to fix those two broken games in there,
heh.
I really want to release this as v1.0, but my better judgment says we
need to give it another week. Damn.
2010-10-20 11:22:44 +00:00
|
|
|
enum : bool { Threaded = true };
|
2010-08-09 13:28:56 +00:00
|
|
|
array<Processor*> coprocessors;
|
|
|
|
alwaysinline void step(unsigned clocks);
|
|
|
|
alwaysinline void synchronize_smp();
|
|
|
|
void synchronize_ppu();
|
|
|
|
void synchronize_coprocessor();
|
|
|
|
|
2010-08-09 13:33:44 +00:00
|
|
|
uint8 pio();
|
|
|
|
bool joylatch();
|
|
|
|
alwaysinline bool interrupt_pending() { return status.interrupt_pending; }
|
|
|
|
alwaysinline uint8 port_read(uint8 port) { return apu_port[port & 3]; }
|
|
|
|
alwaysinline void port_write(uint8 port, uint8 data) { apu_port[port & 3] = data; }
|
2010-08-09 13:28:56 +00:00
|
|
|
|
Updated to v067r21 release.
byuu says:
This moves toward a profile-selection mode. Right now, it is incomplete.
There are three binaries, one for each profile. The GUI selection
doesn't actually do anything yet. There will be a launcher in a future
release that loads each profile's respective binary.
I reverted away from blargg's SMP library for the time being, in favor
of my own. This will fix most of the csnes/bsnes-performance bugs. This
causes a 10% speed hit on 64-bit platforms, and a 15% speed hit on
32-bit platforms. I hope to be able to regain that speed in the future,
I may also experiment with creating my own fast-SMP core which drops bus
hold delays and TEST register support (never used by anything, ever.)
Save states now work in all three cores, but they are not
cross-compatible. The profile name is stored in the description field of
the save states, and it won't load a state if the profile name doesn't
match.
The debugger only works on the research target for now. Give it time and
it will return for the other targets.
Other than that, let's please resume testing on all three once again.
See how far we get this time :)
I can confirm the following games have issues on the performance
profile:
- Armored Police Metal Jacket (minor logo flickering, not a big deal)
- Chou Aniki (won't start, so obviously unplayable)
- Robocop vs The Terminator (major in-game flickering, unplayable)
Anyone still have that gigantic bsnes thread archive from the ZSNES
forum? Maybe I posted about how to fix those two broken games in there,
heh.
I really want to release this as v1.0, but my better judgment says we
need to give it another week. Damn.
2010-10-20 11:22:44 +00:00
|
|
|
void enter();
|
2010-08-09 13:33:44 +00:00
|
|
|
void power();
|
|
|
|
void reset();
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2010-08-09 13:33:44 +00:00
|
|
|
void serialize(serializer&);
|
|
|
|
CPU();
|
|
|
|
~CPU();
|
|
|
|
|
|
|
|
private:
|
2010-08-09 13:28:56 +00:00
|
|
|
#include "dma/dma.hpp"
|
|
|
|
#include "memory/memory.hpp"
|
|
|
|
#include "mmio/mmio.hpp"
|
|
|
|
#include "timing/timing.hpp"
|
|
|
|
|
2010-08-09 13:33:44 +00:00
|
|
|
uint8 cpu_version;
|
|
|
|
|
2010-08-09 13:28:56 +00:00
|
|
|
struct Status {
|
|
|
|
bool interrupt_pending;
|
|
|
|
uint16 interrupt_vector;
|
|
|
|
|
|
|
|
unsigned clock_count;
|
|
|
|
unsigned line_clocks;
|
|
|
|
|
|
|
|
//timing
|
|
|
|
bool irq_lock;
|
|
|
|
|
|
|
|
unsigned dram_refresh_position;
|
|
|
|
bool dram_refreshed;
|
|
|
|
|
|
|
|
unsigned hdma_init_position;
|
|
|
|
bool hdma_init_triggered;
|
|
|
|
|
|
|
|
unsigned hdma_position;
|
|
|
|
bool hdma_triggered;
|
|
|
|
|
|
|
|
bool nmi_valid;
|
|
|
|
bool nmi_line;
|
|
|
|
bool nmi_transition;
|
|
|
|
bool nmi_pending;
|
|
|
|
bool nmi_hold;
|
|
|
|
|
|
|
|
bool irq_valid;
|
|
|
|
bool irq_line;
|
|
|
|
bool irq_transition;
|
|
|
|
bool irq_pending;
|
|
|
|
bool irq_hold;
|
|
|
|
|
|
|
|
bool reset_pending;
|
|
|
|
|
|
|
|
//DMA
|
|
|
|
bool dma_active;
|
|
|
|
unsigned dma_counter;
|
|
|
|
unsigned dma_clocks;
|
|
|
|
bool dma_pending;
|
|
|
|
bool hdma_pending;
|
|
|
|
bool hdma_mode; //0 = init, 1 = run
|
|
|
|
|
|
|
|
//MMIO
|
|
|
|
//$2181-$2183
|
|
|
|
uint32 wram_addr;
|
|
|
|
|
|
|
|
//$4016-$4017
|
|
|
|
bool joypad_strobe_latch;
|
|
|
|
uint32 joypad1_bits;
|
|
|
|
uint32 joypad2_bits;
|
|
|
|
|
|
|
|
//$4200
|
|
|
|
bool nmi_enabled;
|
|
|
|
bool hirq_enabled, virq_enabled;
|
|
|
|
bool auto_joypad_poll;
|
|
|
|
|
|
|
|
//$4201
|
|
|
|
uint8 pio;
|
|
|
|
|
|
|
|
//$4202-$4203
|
|
|
|
uint8 wrmpya;
|
|
|
|
uint8 wrmpyb;
|
|
|
|
|
|
|
|
//$4204-$4206
|
|
|
|
uint16 wrdiva;
|
|
|
|
uint8 wrdivb;
|
|
|
|
|
|
|
|
//$4207-$420a
|
|
|
|
uint16 hirq_pos, virq_pos;
|
|
|
|
|
|
|
|
//$420d
|
|
|
|
unsigned rom_speed;
|
|
|
|
|
|
|
|
//$4214-$4217
|
|
|
|
uint16 rddiv;
|
|
|
|
uint16 rdmpy;
|
|
|
|
|
|
|
|
//$4218-$421f
|
|
|
|
uint8 joy1l, joy1h;
|
|
|
|
uint8 joy2l, joy2h;
|
|
|
|
uint8 joy3l, joy3h;
|
|
|
|
uint8 joy4l, joy4h;
|
|
|
|
} status;
|
|
|
|
|
|
|
|
struct ALU {
|
|
|
|
unsigned mpyctr;
|
|
|
|
unsigned divctr;
|
|
|
|
unsigned shift;
|
|
|
|
} alu;
|
|
|
|
|
2010-08-09 13:33:44 +00:00
|
|
|
static void Enter();
|
|
|
|
void op_irq();
|
|
|
|
debugvirtual void op_step();
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
friend class CPUDebugger;
|
|
|
|
};
|
|
|
|
|
|
|
|
#if defined(DEBUGGER)
|
|
|
|
#include "debugger/debugger.hpp"
|
|
|
|
extern CPUDebugger cpu;
|
|
|
|
#else
|
|
|
|
extern CPU cpu;
|
|
|
|
#endif
|