Skip to content

Commit f3428fa

Browse files
committed
little improvement
1 parent acae8a2 commit f3428fa

File tree

7 files changed

+98
-89
lines changed

7 files changed

+98
-89
lines changed

emulator/src/Chipset/CPU.cpp

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -194,27 +194,27 @@ namespace casioemu {
194194
{&CPU::OP_DSR , H_DS | H_DW, 0xE300, {{0, 0x00FF, 0}, {0, 0, 0}}},
195195
{&CPU::OP_DSR , H_DS | H_DW, 0x900F, {{1, 0x000F, 4}, {0, 0, 0}}}};
196196

197-
// name array_size array_base stub stub_array
197+
// name array_size array_base stub stub_array
198198
CPU::RegisterRecord CPU::register_record_sources[] = {
199-
{ "r", 16, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_r},
200-
{ "cr", 16, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_cr},
201-
{ "pc", 1, 0, (RegisterStubPointer)&CPU::reg_pc, nullptr },
202-
{ "csr", 1, 0, (RegisterStubPointer)&CPU::reg_csr, nullptr },
203-
{ "lr", 1, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr},
204-
{ "elr1", 1, 1, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr},
205-
{ "elr2", 1, 2, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr},
206-
{ "elr3", 1, 3, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr},
207-
{ "lcsr", 1, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
208-
{"ecsr1", 1, 1, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
209-
{"ecsr2", 1, 2, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
210-
{"ecsr3", 1, 3, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
211-
{ "psw", 1, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
212-
{"epsw1", 1, 1, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
213-
{"epsw2", 1, 2, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
214-
{"epsw3", 1, 3, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
215-
{ "sp", 1, 0, (RegisterStubPointer)&CPU::reg_sp, nullptr },
216-
{ "ea", 1, 0, (RegisterStubPointer)&CPU::reg_ea, nullptr },
217-
{ "dsr", 1, 0, (RegisterStubPointer)&CPU::reg_dsr, nullptr }};
199+
{ "r", 16, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_r },
200+
{ "cr", 16, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_cr },
201+
{ "pc", 1, 0, (RegisterStubPointer)&CPU::reg_pc, nullptr },
202+
{ "csr", 1, 0, (RegisterStubPointer)&CPU::reg_csr, nullptr },
203+
{ "lr", 1, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr },
204+
{ "elr1", 1, 1, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr },
205+
{ "elr2", 1, 2, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr },
206+
{ "elr3", 1, 3, nullptr, (RegisterStubArrayPointer)&CPU::reg_elr },
207+
{ "lcsr", 1, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
208+
{"ecsr1", 1, 1, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
209+
{"ecsr2", 1, 2, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
210+
{"ecsr3", 1, 3, nullptr, (RegisterStubArrayPointer)&CPU::reg_ecsr},
211+
{ "psw", 1, 0, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
212+
{"epsw1", 1, 1, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
213+
{"epsw2", 1, 2, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
214+
{"epsw3", 1, 3, nullptr, (RegisterStubArrayPointer)&CPU::reg_epsw},
215+
{ "sp", 1, 0, (RegisterStubPointer)&CPU::reg_sp, nullptr },
216+
{ "ea", 1, 0, (RegisterStubPointer)&CPU::reg_ea, nullptr },
217+
{ "dsr", 1, 0, (RegisterStubPointer)&CPU::reg_dsr, nullptr }};
218218

219219
void CPU::OP_NOP() {
220220
}
@@ -262,7 +262,7 @@ namespace casioemu {
262262

263263
for (size_t px = 0; px != permutation_count; ++px) {
264264
if (opcode_dispatch[permutation_buffer[px]])
265-
continue;
265+
PANIC("clashing opcode %04X\n", permutation_buffer[px]);
266266
opcode_dispatch[permutation_buffer[px]] = &handler_stub;
267267
}
268268
}
@@ -334,9 +334,14 @@ namespace casioemu {
334334
}
335335

336336
uint16_t CPU::Fetch() {
337-
reg_csr.raw &= impl_csr_mask;
338-
if (reg_pc.raw & 1)
337+
if (reg_csr.raw & ~impl_csr_mask) {
338+
logger::Info("warning: CSR masked bits set\n");
339+
reg_csr.raw &= impl_csr_mask;
340+
}
341+
if (reg_pc.raw & 1) {
342+
logger::Info("warning: PC LSB set\n");
339343
reg_pc.raw &= ~1;
344+
}
340345
uint16_t opcode = emulator.chipset.mmu.ReadCode((reg_csr.raw << 16) | reg_pc.raw);
341346
reg_pc.raw = (uint16_t)(reg_pc.raw + 2);
342347
return opcode;
@@ -355,7 +360,7 @@ namespace casioemu {
355360
OpcodeSource *handler = opcode_dispatch[impl_opcode];
356361

357362
if (!handler)
358-
continue;
363+
logger::Info("unrecognized instruction %04X at %06zX\n", impl_opcode, (((size_t)reg_csr.raw) << 16) | (reg_pc.raw - 2));
359364

360365
impl_long_imm = 0;
361366
if (handler->hint & H_TI)

emulator/src/Chipset/CPUControl.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,22 +189,31 @@ namespace casioemu {
189189
void CPU::OP_BL() {
190190
reg_lr = reg_pc;
191191
reg_lcsr = reg_csr;
192-
if (!stack.empty() && !stack.back().lr_pushed) {
193-
}
192+
if (!stack.empty() && !stack.back().lr_pushed)
193+
logger::Info("BL is executed before %06zX without saving LR value\n",
194+
((size_t)reg_csr.raw) << 16 | reg_pc.raw);
194195
OP_B();
195196
stack.push_back({false, 0, reg_csr, reg_pc});
196197
}
197198

198199
// * Miscellaneous Instructions
199200
void CPU::OP_RT() {
200201
if (stack.empty()) {
202+
logger::Info("RT is executed before %06zX, but the stack is empty\n",
203+
((size_t)reg_csr.raw) << 16 | reg_pc.raw);
201204
} else {
202-
if (stack.back().lr_pushed) {
203-
}
205+
if (stack.back().lr_pushed)
206+
logger::Info("RT is executed before %06zX, but LR is pushed for the last frame\n",
207+
((size_t)reg_csr.raw) << 16 | reg_pc.raw);
204208
stack.pop_back();
205209
}
206210
reg_csr = reg_lcsr;
207211
reg_pc = reg_lr;
212+
if (code_viewer) {
213+
if ((code_viewer->debug_flags & DEBUG_RET_TRACE) && code_viewer->TryTrigBP(reg_csr, reg_pc, false)) {
214+
emulator.SetPaused(true);
215+
}
216+
}
208217
}
209218

210219
void CPU::OP_RTI() {

emulator/src/Chipset/CPUPushPop.cpp

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,32 @@ namespace casioemu {
1818
}
1919

2020
void CPU::OP_PUSHL() {
21-
if (impl_operands[1].value & 2) {
21+
if (impl_operands[1].value & 2) { // PUSH ...,ELR,...
2222
if (memory_model == MM_LARGE)
2323
Push16(reg_ecsr[reg_psw & PSW_ELEVEL]);
2424
Push16(reg_elr[reg_psw & PSW_ELEVEL]);
2525
}
26-
if (impl_operands[1].value & 4)
26+
if (impl_operands[1].value & 4) { // PUSH ...,EPSW,...
2727
Push16(reg_epsw[reg_psw & PSW_ELEVEL]);
28-
if (impl_operands[1].value & 8) {
28+
}
29+
if (impl_operands[1].value & 8) { // PUSH ...,LR,...
2930
if (memory_model == MM_LARGE)
3031
Push16(reg_lcsr);
3132
Push16(reg_lr);
32-
33-
if (stack.empty()) {
34-
} else if (stack.back().lr_pushed) {
35-
} else {
33+
if (stack.empty())
34+
logger::Info("PUSH LR is called before %06zX, but the stack is empty\n",
35+
((size_t)reg_csr.raw) << 16 | reg_pc.raw);
36+
else if (stack.back().lr_pushed)
37+
logger::Info("PUSH LR is called before %06zX, but LR is already pushed for the last frame\n",
38+
((size_t)reg_csr.raw) << 16 | reg_pc.raw);
39+
else {
3640
stack.back().lr_pushed = true;
3741
stack.back().lr_push_address = reg_sp;
3842
}
3943
}
40-
if (impl_operands[1].value & 1)
44+
if (impl_operands[1].value & 1) { // PUSH ...,EA,...
4145
Push16(reg_ea);
46+
}
4247
}
4348

4449
void CPU::OP_POP() {
@@ -52,8 +57,9 @@ namespace casioemu {
5257
}
5358

5459
void CPU::OP_POPL() {
55-
if (impl_operands[0].value & 1) // POP ...,EA,...
60+
if (impl_operands[0].value & 1) { // POP ...,EA,...
5661
reg_ea = Pop16();
62+
}
5763
if (impl_operands[0].value & 8) { // POP ...,LR,...
5864
/**
5965
* Sometimes a function calls another function in one branch, and
@@ -68,22 +74,21 @@ namespace casioemu {
6874
if (memory_model == MM_LARGE)
6975
reg_lcsr = Pop16() & 0x000F;
7076
}
71-
if (impl_operands[0].value & 4) // POP ...,PSW,...
77+
if (impl_operands[0].value & 4) { // POP ...,PSW,...
7278
reg_psw = Pop16();
79+
}
7380
if (impl_operands[0].value & 2) { // POP ...,PC,...
7481
int oldsp = reg_sp;
7582
reg_pc = Pop16();
7683
if (memory_model == MM_LARGE)
7784
reg_csr = Pop16() & 0x000F;
85+
if (!stack.empty() && stack.back().lr_pushed && stack.back().lr_push_address == oldsp)
86+
stack.pop_back();
7887
if (code_viewer) {
79-
if (code_viewer->debug_flags & DEBUG_RET_TRACE) {
80-
if (code_viewer->TryTrigBP(reg_csr, reg_pc, false)) {
81-
emulator.SetPaused(true);
82-
}
88+
if ((code_viewer->debug_flags & DEBUG_RET_TRACE) && code_viewer->TryTrigBP(reg_csr, reg_pc, false)) {
89+
emulator.SetPaused(true);
8390
}
8491
}
85-
if (!stack.empty() && stack.back().lr_pushed && stack.back().lr_push_address == oldsp)
86-
stack.pop_back();
8792
}
8893
}
8994

emulator/src/Chipset/MMU.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
#include "Chipset.hpp"
66
#include <cstring>
77

8+
89
namespace casioemu {
10+
const uint8_t UNMAPPED_VALUE = 0x00;
11+
912
MMU::MMU(Emulator &_emulator) : emulator(_emulator) {
1013
segment_dispatch = new MemoryByte *[0x100];
1114
for (size_t ix = 0; ix != 0x100; ++ix)
@@ -16,7 +19,6 @@ namespace casioemu {
1619
for (size_t ix = 0; ix != 0x100; ++ix)
1720
if (segment_dispatch[ix])
1821
delete[] segment_dispatch[ix];
19-
2022
delete[] segment_dispatch;
2123
}
2224

@@ -36,7 +38,7 @@ namespace casioemu {
3638
MMU *mmu = *(MMU **)lua_topointer(lua_state, 1);
3739
size_t offset = lua_tointeger(lua_state, 2);
3840
if (offset & 1) {
39-
logger::Info("lua: code[] offset has LSB set, rounding to even\n");
41+
logger::Info("code[-] offset has LSB set, rounding to even\n");
4042
offset &= ~1;
4143
}
4244
lua_pushinteger(lua_state, mmu->ReadCode(offset));
@@ -144,14 +146,16 @@ namespace casioemu {
144146

145147
MemoryByte *segment = segment_dispatch[segment_index];
146148
if (!segment) {
149+
logger::Info("code read from offset %04zX of unmapped segment %02zX\n", segment_offset, segment_index);
147150
emulator.HandleMemoryError();
148-
return 0xFF;
151+
return UNMAPPED_VALUE;
149152
}
150153

151154
MMURegion *region = segment[segment_offset].region;
152155
if (!region) {
156+
logger::Info("code read from unmapped offset %04zX of segment %02zX\n", segment_offset, segment_index);
153157
emulator.HandleMemoryError();
154-
return 0xFF;
158+
return UNMAPPED_VALUE;
155159
}
156160

157161
return (((uint16_t)region->read(region, offset + 1)) << 8) | region->read(region, offset);
@@ -166,8 +170,9 @@ namespace casioemu {
166170

167171
MemoryByte *segment = segment_dispatch[segment_index];
168172
if (!segment) {
173+
logger::Info("read from offset %04zX of unmapped segment %02zX\n", segment_offset, segment_index);
169174
emulator.HandleMemoryError();
170-
return 0xFF;
175+
return UNMAPPED_VALUE;
171176
}
172177

173178
MemoryByte &byte = segment[segment_offset];
@@ -181,8 +186,9 @@ namespace casioemu {
181186
}
182187
}
183188
if (!region) {
189+
logger::Info("read from unmapped offset %04zX of segment %02zX\n", segment_offset, segment_index);
184190
emulator.HandleMemoryError();
185-
return 0xFF;
191+
return UNMAPPED_VALUE;
186192
}
187193

188194
return region->read(region, offset);
@@ -197,7 +203,7 @@ namespace casioemu {
197203

198204
MemoryByte *segment = segment_dispatch[segment_index];
199205
if (!segment) {
200-
// logger::Info("write to offset %04zX of unmapped segment %02zX (%02zX)\n", segment_offset, segment_index, data);
206+
logger::Info("write to offset %04zX of unmapped segment %02zX (%02zX)\n", segment_offset, segment_index, data);
201207
emulator.HandleMemoryError();
202208
return;
203209
}
@@ -213,7 +219,7 @@ namespace casioemu {
213219
}
214220
}
215221
if (!region) {
216-
// logger::Info("write to unmapped offset %04zX of segment %02zX (%02zX)\n", segment_offset, segment_index, data);
222+
logger::Info("write to unmapped offset %04zX of segment %02zX (%02zX)\n", segment_offset, segment_index, data);
217223
emulator.HandleMemoryError();
218224
return;
219225
}

emulator/src/Gui/CodeViewer.cpp

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,39 +18,35 @@
1818

1919
casioemu::Emulator *m_emu = nullptr;
2020

21-
// 0:0000~0:00FF is vector table, should be handled
2221
CodeViewer::CodeViewer(std::string path) {
2322
src_path = path;
2423
std::ifstream f(src_path, std::ios::in);
2524
if (!f.is_open()) {
26-
PANIC("\nFail to open disassembly code src: %s\n", src_path.c_str());
25+
casioemu::logger::Info("Fail to open disassembly, so code viewer won't be loaded: %s\n", src_path.c_str());
2726
}
28-
casioemu::logger::Info("Start to read code src ...\n");
29-
char buf[200]{0};
30-
char adr[6]{0};
27+
casioemu::logger::Info("Start to load disassembly ...\n");
28+
char buf[200], adr[6];
3129
while (!f.eof()) {
30+
memset(buf, 0, sizeof(buf));
31+
memset(adr, 0, sizeof(adr));
3232
f.getline(buf, 200);
33-
// 1sf, extract segment number
3433
uint8_t seg = buf[1] - '0';
3534
uint8_t len = strlen(buf);
3635
if (!len)
3736
break;
3837
if (len > max_col)
3938
max_col = len;
4039
memcpy(adr, buf + 2, 4);
41-
// casioemu::logger::Info("[%s %d %d]\n",adr,seg,len);
4240
uint16_t offset = std::stoi(adr, 0, 16);
4341
CodeElem e;
4442
e.offset = offset;
4543
e.segment = seg;
46-
memset(e.srcbuf, 0, 40);
44+
memset(e.srcbuf, 0, sizeof(e.srcbuf));
4745
memcpy(e.srcbuf, buf + 28, len - 28);
4846
codes.push_back(e);
49-
memset(buf, 0, 200);
50-
memset(adr, 0, 6);
5147
}
5248
f.close();
53-
casioemu::logger::Info("Read src codes over!\n");
49+
casioemu::logger::Info("Successfully loaded disassembly!\n");
5450
max_row = codes.size();
5551
is_loaded = true;
5652
}
@@ -78,11 +74,18 @@ CodeElem CodeViewer::LookUp(uint8_t seg, uint16_t offset, int *idx) {
7874
return CodeElem(it->segment, it->offset);
7975
}
8076

81-
/**
82-
* called before the instruction is executed (for breakpoints/step, in CPU.cpp) or
83-
* right after a POP PC is executed (for TRACE, in CPUPushPop.cpp)
84-
*/
85-
bool CodeViewer::TryTrigBP(uint8_t seg, uint16_t offset, bool bp_mode) {
77+
bool CodeViewer::TryTrigBP(uint8_t seg, uint16_t offset, bool is_bp) {
78+
if (!is_loaded) {
79+
return false;
80+
}
81+
if (!is_bp) { // step/trace
82+
int idx = 0;
83+
LookUp(seg, offset, &idx);
84+
cur_row = idx;
85+
bp = idx;
86+
need_roll = true;
87+
return true;
88+
}
8689
for (auto it = break_points.begin(); it != break_points.end(); it++) {
8790
if (it->second == 1) {
8891
CodeElem e = codes[it->first];
@@ -94,14 +97,6 @@ bool CodeViewer::TryTrigBP(uint8_t seg, uint16_t offset, bool bp_mode) {
9497
}
9598
}
9699
}
97-
if (!bp_mode && (debug_flags & DEBUG_STEP || debug_flags & DEBUG_RET_TRACE)) { // pause for step/trace
98-
int idx = 0;
99-
LookUp(seg, offset, &idx);
100-
cur_row = idx;
101-
bp = idx;
102-
need_roll = true;
103-
return true;
104-
}
105100
return false;
106101
}
107102

@@ -183,13 +178,6 @@ void CodeViewer::DrawWindow() {
183178
ImGui::End();
184179
return;
185180
}
186-
ImVec2 sz;
187-
h *= 10;
188-
w *= max_col;
189-
sz.x = w;
190-
sz.y = h;
191-
// ImGui::SetNextWindowSize(sz);
192-
// ImGui::SetNextWindowContentSize(sz);
193181
ImGui::Begin("Disassemble Window", 0);
194182
ImGui::BeginChild("##scrolling", ImVec2(0, -ImGui::GetWindowHeight() / 2));
195183
DrawContent();

emulator/src/Gui/ui.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ void gui_loop() {
2121
if (!m_emu->Running())
2222
return;
2323

24-
// cv.LookUp(1, 0x1235);
2524
ImGuiIO &io = ImGui::GetIO();
2625

2726
ImGui_ImplSDLRenderer2_NewFrame();

0 commit comments

Comments
 (0)