do not crash on fault in debugger
This commit is contained in:
parent
3886e216f0
commit
77a12c0fa1
1 changed files with 53 additions and 46 deletions
|
@ -138,73 +138,80 @@ void console_ncurses::panel_update_thread()
|
||||||
myusleep(1000000 / refresh_rate);
|
myusleep(1000000 / refresh_rate);
|
||||||
|
|
||||||
// note that these are approximately as there's no mutex on the emulation
|
// note that these are approximately as there's no mutex on the emulation
|
||||||
uint16_t current_PSW = c->getPSW();
|
try {
|
||||||
int run_mode = current_PSW >> 14;
|
uint16_t current_PSW = c->getPSW();
|
||||||
|
int run_mode = current_PSW >> 14;
|
||||||
|
|
||||||
uint16_t current_PC = c->getPC();
|
uint16_t current_PC = c->getPC();
|
||||||
uint32_t full_addr = b->calculate_physical_address(run_mode, current_PC, false, false, true, i_space);
|
uint32_t full_addr = b->calculate_physical_address(run_mode, current_PC, false, false, true, i_space);
|
||||||
|
|
||||||
uint16_t current_instr = b->readWord(current_PC);
|
uint16_t current_instr = b->readWord(current_PC);
|
||||||
|
|
||||||
auto data = c->disassemble(current_PC);
|
auto data = c->disassemble(current_PC);
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lck(ncurses_mutex);
|
std::unique_lock<std::mutex> lck(ncurses_mutex);
|
||||||
|
|
||||||
werase(w_panel->win);
|
werase(w_panel->win);
|
||||||
|
|
||||||
//
|
//
|
||||||
wattron(w_panel->win, COLOR_PAIR(1 + run_mode));
|
wattron(w_panel->win, COLOR_PAIR(1 + run_mode));
|
||||||
|
|
||||||
for(uint8_t b=0; b<22; b++)
|
for(uint8_t b=0; b<22; b++)
|
||||||
mvwprintw(w_panel->win, 0, 1 + 22 - b, "%c", full_addr & (1 << b) ? '1' : '0');
|
mvwprintw(w_panel->win, 0, 1 + 22 - b, "%c", full_addr & (1 << b) ? '1' : '0');
|
||||||
|
|
||||||
wattron(w_panel->win, COLOR_PAIR(1));
|
wattron(w_panel->win, COLOR_PAIR(1));
|
||||||
|
|
||||||
for(uint8_t b=0; b<16; b++)
|
for(uint8_t b=0; b<16; b++)
|
||||||
mvwprintw(w_panel->win, 1, 1 + 16 - b, "%c", current_PSW & (1 << b) ? '1' : '0');
|
mvwprintw(w_panel->win, 1, 1 + 16 - b, "%c", current_PSW & (1 << b) ? '1' : '0');
|
||||||
|
|
||||||
for(uint8_t b=0; b<16; b++)
|
for(uint8_t b=0; b<16; b++)
|
||||||
mvwprintw(w_panel->win, 1, 1 + 16 - b + 17, "%c", current_instr & (1 << b) ? '1' : '0');
|
mvwprintw(w_panel->win, 1, 1 + 16 - b + 17, "%c", current_instr & (1 << b) ? '1' : '0');
|
||||||
|
|
||||||
mvwprintw(w_panel->win, 4, 1, "LEDs:");
|
mvwprintw(w_panel->win, 4, 1, "LEDs:");
|
||||||
|
|
||||||
uint16_t leds = b->get_console_leds();
|
uint16_t leds = b->get_console_leds();
|
||||||
|
|
||||||
for(uint8_t b=0; b<16; b++)
|
for(uint8_t b=0; b<16; b++)
|
||||||
mvwprintw(w_panel->win, 4, 1 + 22 - b, "%c", leds & (1 << b) ? '1' : '0');
|
mvwprintw(w_panel->win, 4, 1 + 22 - b, "%c", leds & (1 << b) ? '1' : '0');
|
||||||
|
|
||||||
wattron(w_panel->win, COLOR_PAIR(5));
|
wattron(w_panel->win, COLOR_PAIR(5));
|
||||||
|
|
||||||
mvwprintw(w_panel->win, 1, 1 + 35, "%c%c%c",
|
mvwprintw(w_panel->win, 1, 1 + 35, "%c%c%c",
|
||||||
running_flag ? '+' : '-',
|
running_flag ? '+' : '-',
|
||||||
disk_read_activity_flag ? '*' : 'o',
|
disk_read_activity_flag ? '*' : 'o',
|
||||||
disk_write_activity_flag ? '*' : 'o');
|
disk_write_activity_flag ? '*' : 'o');
|
||||||
|
|
||||||
wattron(w_panel->win, COLOR_PAIR(0));
|
wattron(w_panel->win, COLOR_PAIR(0));
|
||||||
|
|
||||||
// disassembler
|
// disassembler
|
||||||
auto registers = data["registers"];
|
auto registers = data["registers"];
|
||||||
auto psw = data["psw"][0];
|
auto psw = data["psw"][0];
|
||||||
|
|
||||||
std::string instruction_values;
|
std::string instruction_values;
|
||||||
for(auto iv : data["instruction-values"])
|
for(auto iv : data["instruction-values"])
|
||||||
instruction_values += (instruction_values.empty() ? "" : ",") + iv;
|
instruction_values += (instruction_values.empty() ? "" : ",") + iv;
|
||||||
|
|
||||||
std::string work_values;
|
std::string work_values;
|
||||||
for(auto wv : data["work-values"])
|
for(auto wv : data["work-values"])
|
||||||
work_values += (work_values.empty() ? "" : ",") + wv;
|
work_values += (work_values.empty() ? "" : ",") + wv;
|
||||||
|
|
||||||
std::string instruction = data["instruction-text"].at(0);
|
std::string instruction = data["instruction-text"].at(0);
|
||||||
|
|
||||||
mvwprintw(w_panel->win, 2, 1, "R0: %s, R1: %s, R2: %s, R3: %s, R4: %s, R5: %s, SP: %s, PC: %s",
|
mvwprintw(w_panel->win, 2, 1, "R0: %s, R1: %s, R2: %s, R3: %s, R4: %s, R5: %s, SP: %s, PC: %s",
|
||||||
registers[0].c_str(), registers[1].c_str(), registers[2].c_str(), registers[3].c_str(), registers[4].c_str(), registers[5].c_str(),
|
registers[0].c_str(), registers[1].c_str(), registers[2].c_str(), registers[3].c_str(), registers[4].c_str(), registers[5].c_str(),
|
||||||
registers[6].c_str(), registers[7].c_str());
|
registers[6].c_str(), registers[7].c_str());
|
||||||
mvwprintw(w_panel->win, 3, 1, "PSW: %s, instr: %s",
|
mvwprintw(w_panel->win, 3, 1, "PSW: %s, instr: %s",
|
||||||
psw.c_str(),
|
psw.c_str(),
|
||||||
instruction_values.c_str());
|
instruction_values.c_str());
|
||||||
mvwprintw(w_panel->win, 3, 46, "%s - %s",
|
mvwprintw(w_panel->win, 3, 46, "%s - %s",
|
||||||
instruction.c_str(),
|
instruction.c_str(),
|
||||||
work_values.c_str());
|
work_values.c_str());
|
||||||
|
}
|
||||||
|
catch(int trap) {
|
||||||
|
std::unique_lock<std::mutex> lck(ncurses_mutex);
|
||||||
|
|
||||||
|
werase(w_panel->win);
|
||||||
|
}
|
||||||
|
|
||||||
// speed
|
// speed
|
||||||
uint64_t cur_instr_cnt = c->get_instructions_executed_count();
|
uint64_t cur_instr_cnt = c->get_instructions_executed_count();
|
||||||
|
|
Loading…
Add table
Reference in a new issue