diff --git a/console_ncurses.cpp b/console_ncurses.cpp index b65b8e5..ab26630 100644 --- a/console_ncurses.cpp +++ b/console_ncurses.cpp @@ -138,73 +138,80 @@ void console_ncurses::panel_update_thread() myusleep(1000000 / refresh_rate); // note that these are approximately as there's no mutex on the emulation - uint16_t current_PSW = c->getPSW(); - int run_mode = current_PSW >> 14; + try { + uint16_t current_PSW = c->getPSW(); + int run_mode = current_PSW >> 14; - uint16_t current_PC = c->getPC(); - uint32_t full_addr = b->calculate_physical_address(run_mode, current_PC, false, false, true, i_space); + uint16_t current_PC = c->getPC(); + 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 lck(ncurses_mutex); + std::unique_lock 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++) - mvwprintw(w_panel->win, 0, 1 + 22 - b, "%c", full_addr & (1 << b) ? '1' : '0'); + for(uint8_t b=0; b<22; b++) + 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++) - mvwprintw(w_panel->win, 1, 1 + 16 - b, "%c", current_PSW & (1 << b) ? '1' : '0'); + for(uint8_t b=0; b<16; b++) + mvwprintw(w_panel->win, 1, 1 + 16 - b, "%c", current_PSW & (1 << b) ? '1' : '0'); - for(uint8_t b=0; b<16; b++) - mvwprintw(w_panel->win, 1, 1 + 16 - b + 17, "%c", current_instr & (1 << b) ? '1' : '0'); + 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, 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++) - mvwprintw(w_panel->win, 4, 1 + 22 - b, "%c", leds & (1 << b) ? '1' : '0'); + for(uint8_t b=0; b<16; b++) + 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", - running_flag ? '+' : '-', - disk_read_activity_flag ? '*' : 'o', - disk_write_activity_flag ? '*' : 'o'); + mvwprintw(w_panel->win, 1, 1 + 35, "%c%c%c", + running_flag ? '+' : '-', + disk_read_activity_flag ? '*' : 'o', + disk_write_activity_flag ? '*' : 'o'); - wattron(w_panel->win, COLOR_PAIR(0)); + wattron(w_panel->win, COLOR_PAIR(0)); - // disassembler - auto registers = data["registers"]; - auto psw = data["psw"][0]; + // disassembler + auto registers = data["registers"]; + auto psw = data["psw"][0]; - std::string instruction_values; - for(auto iv : data["instruction-values"]) - instruction_values += (instruction_values.empty() ? "" : ",") + iv; + std::string instruction_values; + for(auto iv : data["instruction-values"]) + instruction_values += (instruction_values.empty() ? "" : ",") + iv; - std::string work_values; - for(auto wv : data["work-values"]) - work_values += (work_values.empty() ? "" : ",") + wv; + std::string work_values; + for(auto wv : data["work-values"]) + 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", - 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()); - mvwprintw(w_panel->win, 3, 1, "PSW: %s, instr: %s", - psw.c_str(), - instruction_values.c_str()); - mvwprintw(w_panel->win, 3, 46, "%s - %s", - instruction.c_str(), - work_values.c_str()); + 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[6].c_str(), registers[7].c_str()); + mvwprintw(w_panel->win, 3, 1, "PSW: %s, instr: %s", + psw.c_str(), + instruction_values.c_str()); + mvwprintw(w_panel->win, 3, 46, "%s - %s", + instruction.c_str(), + work_values.c_str()); + } + catch(int trap) { + std::unique_lock lck(ncurses_mutex); + + werase(w_panel->win); + } // speed uint64_t cur_instr_cnt = c->get_instructions_executed_count();