gambatte fixes: Properly save MBC3 without RTC
[lsnes.git] / libgambatte-patches / svn537 / 0006-Fix-read-write-of-A-PC-and-CycleCounter-when-executi.patch
blob2d52fcd4cb3ae75228feb97c61806794dc7dc6b4
1 From 24df3ca0d17d37bb3192b0ddf28cc16d9b4f8fa5 Mon Sep 17 00:00:00 2001
2 From: Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
3 Date: Mon, 24 Mar 2014 14:01:29 +0200
4 Subject: [PATCH 6/9] Fix read/write of A, PC and CycleCounter when executing
6 ---
7 libgambatte/src/cpu.cpp | 9 +++++++++
8 libgambatte/src/cpu.h | 3 +++
9 libgambatte/src/gambatte.cpp | 10 +++++-----
10 3 files changed, 17 insertions(+), 5 deletions(-)
12 diff --git a/libgambatte/src/cpu.cpp b/libgambatte/src/cpu.cpp
13 index 037fff2..7f10986 100644
14 --- a/libgambatte/src/cpu.cpp
15 +++ b/libgambatte/src/cpu.cpp
16 @@ -44,6 +44,9 @@ CPU::CPU(time_t (**_getCurrentTime)())
17 , l(0x4D)
18 , skip_(false)
19 , emuflags(0)
20 +, pcptr(&pc_)
21 +, aptr(&a_)
22 +, cyclecountptr(&cycleCounter_)
26 @@ -514,10 +517,13 @@ void CPU::process(unsigned const cycles) {
27 mem_.setEndtime(cycleCounter_, cycles);
29 unsigned char a = a_;
30 + aptr = &a;
31 unsigned cycleCounter = cycleCounter_;
32 + cyclecountptr = &cycleCounter;
34 while (mem_.isActive()) {
35 unsigned short pc = pc_;
36 + pcptr = &pc;
38 if (mem_.halted()) {
39 if (cycleCounter < mem_.nextEventTime()) {
40 @@ -2020,11 +2026,14 @@ void CPU::process(unsigned const cycles) {
43 pc_ = pc;
44 + pcptr = &pc_;
45 cycleCounter = mem_.event(cycleCounter);
48 a_ = a;
49 + aptr = &a_;
50 cycleCounter_ = cycleCounter;
51 + cyclecountptr = &cycleCounter_;
55 diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h
56 index c2a340b..4df0958 100644
57 --- a/libgambatte/src/cpu.h
58 +++ b/libgambatte/src/cpu.h
59 @@ -101,6 +101,9 @@ public:
60 unsigned short sp;
61 unsigned hf1, hf2, zf, cf;
62 unsigned char a_, b, c, d, e, /*f,*/ h, l;
63 + unsigned char* aptr;
64 + unsigned short* pcptr;
65 + unsigned* cyclecountptr;
66 private:
67 Memory mem_;
68 bool skip_;
69 diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp
70 index f2310ed..d54f5df 100644
71 --- a/libgambatte/src/gambatte.cpp
72 +++ b/libgambatte/src/gambatte.cpp
73 @@ -301,14 +301,14 @@ std::string GB::version()
74 uint32_t GB::get_cpureg(enum cpu_register _reg)
76 switch(_reg) {
77 - case REG_CYCLECOUNTER: return p_->cpu.cycleCounter_;
78 - case REG_PC: return p_->cpu.pc_;
79 + case REG_CYCLECOUNTER: return *p_->cpu.cyclecountptr;
80 + case REG_PC: return *p_->cpu.pcptr;
81 case REG_SP: return p_->cpu.sp;
82 case REG_HF1: return p_->cpu.hf1;
83 case REG_HF2: return p_->cpu.hf2;
84 case REG_ZF: return p_->cpu.zf;
85 case REG_CF: return p_->cpu.cf;
86 - case REG_A: return p_->cpu.a_;
87 + case REG_A: return *p_->cpu.aptr;
88 case REG_B: return p_->cpu.b;
89 case REG_C: return p_->cpu.c;
90 case REG_D: return p_->cpu.d;
91 @@ -325,13 +325,13 @@ uint32_t GB::get_cpureg(enum cpu_register _reg)
92 void GB::set_cpureg(enum cpu_register _reg, uint32_t val)
94 switch(_reg) {
95 - case REG_PC: p_->cpu.pc_ = val; break;
96 + case REG_PC: *p_->cpu.pcptr = val; break;
97 case REG_SP: p_->cpu.sp = val; break;
98 case REG_HF1: p_->cpu.hf1 = val; break;
99 case REG_HF2: p_->cpu.hf2 = val; break;
100 case REG_ZF: p_->cpu.zf = val; break;
101 case REG_CF: p_->cpu.cf = val; break;
102 - case REG_A: p_->cpu.a_ = val; break;
103 + case REG_A: *p_->cpu.aptr = val; break;
104 case REG_B: p_->cpu.b = val; break;
105 case REG_C: p_->cpu.c = val; break;
106 case REG_D: p_->cpu.d = val; break;
108 2.1.3