Skip to content

Commit

Permalink
Fix #114 Fix #113 Fix #110 and other things
Browse files Browse the repository at this point in the history
The variable tab was never meant to be connected to the debugger in the first place. That is what the TI-OS view is for.
  • Loading branch information
mateoconlechuga committed Apr 9, 2017
1 parent 48dc5d0 commit fde65d0
Show file tree
Hide file tree
Showing 23 changed files with 605 additions and 423 deletions.
166 changes: 94 additions & 72 deletions core/debug/disasm.cpp

Large diffs are not rendered by default.

15 changes: 11 additions & 4 deletions core/debug/disasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,23 +30,30 @@ extern disasm_highlights_state_t disasmHighlight;
typedef std::unordered_map<uint32_t, std::string> map_t;
typedef std::unordered_map<std::string, uint32_t> map_value_t;

enum forceTypes {
FORCE_NONE,
FORCE_ADL,
FORCE_NONADL
};

typedef struct {
std::string opcode;
std::string arguments;
std::string mode_suffix;
std::string modeSuffix;
std::string data;
unsigned int size;
} eZ80_instuction_t;

typedef struct {
eZ80_instuction_t instruction;
int32_t base_address;
int32_t new_address;
int32_t baseAddress;
int32_t newAddress;
uint8_t prefix, suffix;
bool adl, iw, il, l;
int forceAdl;
map_t map;
map_value_t reverseMap;
std::string spacing_string;
std::string space;
} disasm_state_t;

extern disasm_state_t disasm;
Expand Down
12 changes: 6 additions & 6 deletions core/debug/stepping.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@

void debug_set_step_next(void) {
debug_clear_temp_break();
disasm.base_address = cpu.registers.PC;
disasm.baseAddress = cpu.registers.PC;
disasm.adl = cpu.ADL;
disassembleInstruction();
debugger.stepOverFirstStep = true;
debugger.stepOverInstrEnd = disasm.new_address;
debugger.stepOverInstrEnd = disasm.newAddress;
debugger.data.block[debugger.stepOverInstrEnd] |= DBG_TEMP_EXEC_BREAKPOINT;
debugger.stepOverMode = cpu.ADL;
debugger.stepOutSPL = 0;
Expand All @@ -24,10 +24,10 @@ void debug_set_step_next(void) {

void debug_set_step_in(void) {
debug_clear_temp_break();
disasm.base_address = cpu.registers.PC;
disasm.baseAddress = cpu.registers.PC;
disasm.adl = cpu.ADL;
disassembleInstruction();
debugger.stepOverInstrEnd = disasm.new_address;
debugger.stepOverInstrEnd = disasm.newAddress;
debugger.data.block[debugger.stepOverInstrEnd] |= DBG_TEMP_EXEC_BREAKPOINT;
debugger.stepOverMode = cpu.ADL;
debugger.stepOverFirstStep = false;
Expand All @@ -36,10 +36,10 @@ void debug_set_step_in(void) {

void debug_set_step_over(void) {
debug_clear_temp_break();
disasm.base_address = cpu.registers.PC;
disasm.baseAddress = cpu.registers.PC;
disasm.adl = cpu.ADL;
disassembleInstruction();
debugger.stepOverInstrEnd = disasm.new_address;
debugger.stepOverInstrEnd = disasm.newAddress;
debugger.data.block[debugger.stepOverInstrEnd] |= DBG_TEMP_EXEC_BREAKPOINT;
debugger.stepOverMode = cpu.ADL;
debugger.stepOverFirstStep = false;
Expand Down
22 changes: 2 additions & 20 deletions core/emu.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,10 @@ bool emu_save_rom(const char *file) {
return false;
}

gui_set_busy(true);

success = (fwrite(mem.flash.block, 1, SIZE_FLASH, savedRom) == SIZE_FLASH);

fclose(savedRom);

gui_set_busy(false);

return success;
}

Expand All @@ -60,8 +56,6 @@ bool emu_save(const char *file) {

image = (emu_image_t*)malloc(size);

gui_set_busy(true);

do {
if (!image) {
break;
Expand All @@ -79,8 +73,6 @@ bool emu_save(const char *file) {
free(image);
fclose(savedImage);

gui_set_busy(false);

return success;
}

Expand All @@ -89,7 +81,6 @@ bool emu_load(const char *romImage, const char *savedImage) {
long lSize;
FILE *imageFile = NULL;

gui_set_busy(true);
emu_cleanup();

do {
Expand All @@ -98,7 +89,7 @@ bool emu_load(const char *romImage, const char *savedImage) {
imageFile = fopen_utf8(savedImage, "rb");

if (!imageFile) {
gui_console_printf("[CEmu] Could not located image file\n");
gui_console_printf("[CEmu] Could not open image file\n");
break;
}
if (fseek(imageFile, 0L, SEEK_END) < 0) {
Expand Down Expand Up @@ -298,8 +289,6 @@ bool emu_load(const char *romImage, const char *savedImage) {
emu_cleanup();
}

gui_set_busy(false);

return ret;
}

Expand All @@ -308,16 +297,9 @@ void emu_cleanup(void) {
}

static void EMSCRIPTEN_KEEPALIVE emu_reset(void) {
/* Reset the scheduler */
sched_reset();

sched.items[SCHED_THROTTLE].clock = CLOCK_27M;
sched.items[SCHED_THROTTLE].proc = throttle_interval_event;

/* Reset the ASIC */
asic_reset();

/* Drain everything */
cpuEvents = EVENT_NONE;

sched_update_next_event();
Expand All @@ -326,7 +308,7 @@ static void EMSCRIPTEN_KEEPALIVE emu_reset(void) {
static void emu_main_loop_inner(void) {
if (!emulationPaused) {
if (cpuEvents & EVENT_RESET) {
gui_console_printf("[CEmu] Calculator reset triggered...\n");
gui_console_printf("[CEmu] Reset triggered.\n");
asic_reset();
cpuEvents &= ~EVENT_RESET;
}
Expand Down
1 change: 0 additions & 1 deletion core/emu.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ void gui_debugger_raise_or_disable(bool);
void gui_console_err_printf(const char *, ...);
void gui_debugger_send_command(int, uint32_t);
void gui_render_gif_frame(void);
void gui_set_busy(bool);
void gui_emu_sleep(unsigned long);

bool emu_load(const char*,const char*);
Expand Down
2 changes: 2 additions & 0 deletions core/schedule.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ void sched_reset(void) {
memcpy(sched.clockRates, def_rates, sizeof(def_rates));
memset(sched.items, 0, sizeof sched.items);
sched.nextIndex = 0;
sched.items[SCHED_THROTTLE].clock = CLOCK_27M;
sched.items[SCHED_THROTTLE].proc = throttle_interval_event;
}

void event_repeat(int index, uint64_t ticks) {
Expand Down
8 changes: 4 additions & 4 deletions gui/qt/basiccodeviewerwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@

BasicCodeViewerWindow::BasicCodeViewerWindow(QWidget *p) : QDialog(p), ui(new Ui::BasicCodeViewerWindow) {
ui->setupUi(this);
setWindowTitle(tr("Variable viewer"));
ui->plainTextEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
connect(ui->pushButton, &QPushButton::clicked, this, &BasicCodeViewerWindow::toggleFormat);
}

void BasicCodeViewerWindow::setVariableName(const QString &name) {
variableName = name;
setWindowTitle(tr("Variable viewer") + " | " + variableName);
setWindowTitle(tr("Variable viewer") + QStringLiteral(" | ") + variableName);
}

void BasicCodeViewerWindow::on_pushButton_clicked() {
showingFormatted = !showingFormatted;
void BasicCodeViewerWindow::toggleFormat() {
showingFormatted ^= true;
showCode();
}

Expand Down
2 changes: 1 addition & 1 deletion gui/qt/basiccodeviewerwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class BasicCodeViewerWindow : public QDialog {
~BasicCodeViewerWindow();

private slots:
void on_pushButton_clicked();
void toggleFormat();

private:
void showCode();
Expand Down
10 changes: 8 additions & 2 deletions gui/qt/basiccodeviewerwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
<string>Variable viewer</string>
</property>
<property name="windowIcon">
<iconset resource="resources.qrc">
<normaloff>:/icons/resources/icons/icon.ico</normaloff>:/icons/resources/icons/icon.ico</iconset>
</property>
<property name="modal">
<bool>false</bool>
Expand Down Expand Up @@ -63,6 +67,8 @@
</item>
</layout>
</widget>
<resources/>
<resources>
<include location="resources.qrc"/>
</resources>
<connections/>
</ui>
48 changes: 33 additions & 15 deletions gui/qt/debugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ void MainWindow::debuggerInstall() {
ui->de_->installEventFilter(this);
ui->pc->installEventFilter(this);
ui->spl->installEventFilter(this);
disasm.forceAdl = FORCE_NONE;
}

// ------------------------------------------------
Expand Down Expand Up @@ -747,14 +748,14 @@ void MainWindow::breakpointGUIAdd() {
breakpointRemoveSelectedRow();
}

int32_t base_address = disasm.base_address;
int32_t new_address = disasm.new_address;
int32_t base_address = disasm.baseAddress;
int32_t new_address = disasm.newAddress;

disasm.base_address = address;
disasm.baseAddress = address;
disasmHighlight.hit_exec_breakpoint = false;
disassembleInstruction();
disasm.base_address = base_address;
disasm.new_address = new_address;
disasm.baseAddress = base_address;
disasm.newAddress = new_address;

c.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor);
c.setPosition(c.position()+9, QTextCursor::MoveAnchor);
Expand Down Expand Up @@ -1027,16 +1028,16 @@ void MainWindow::watchpointGUIAdd() {
watchpointRemoveSelectedRow();
}

int32_t base_address = disasm.base_address;
int32_t new_address = disasm.new_address;
int32_t base_address = disasm.baseAddress;
int32_t new_address = disasm.newAddress;

disasm.base_address = address;
disasm.baseAddress = address;
disasmHighlight.hit_read_watchpoint = false;
disasmHighlight.hit_write_watchpoint = false;
disassembleInstruction();

disasm.base_address = base_address;
disasm.new_address = new_address;
disasm.baseAddress = base_address;
disasm.newAddress = new_address;

c.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor);
c.setPosition(c.position()+7, QTextCursor::MoveAnchor);
Expand Down Expand Up @@ -1392,18 +1393,18 @@ void MainWindow::updateDisasmView(const int sentBase, const bool newPane) {
fromPane = newPane;
disasmOffsetSet = false;
disasm.adl = ui->checkADL->isChecked();
disasm.base_address = -1;
disasm.new_address = addressPane - ((newPane) ? 0x40 : 0);
if (disasm.new_address < 0) { disasm.new_address = 0; }
int32_t last_address = disasm.new_address + 0x120;
disasm.baseAddress = -1;
disasm.newAddress = addressPane - ((newPane) ? 0x40 : 0);
if (disasm.newAddress < 0) { disasm.newAddress = 0; }
int32_t last_address = disasm.newAddress + 0x120;
if (last_address > 0xFFFFFF) { last_address = 0xFFFFFF; }

disconnect(ui->disassemblyView->verticalScrollBar(), &QScrollBar::valueChanged, this, &MainWindow::scrollDisasmView);
ui->disassemblyView->clear();
ui->disassemblyView->cursorState(false);
ui->disassemblyView->clearAllHighlights();

while (disasm.new_address < last_address) {
while (disasm.newAddress < last_address) {
drawNextDisassembleLine();
}

Expand All @@ -1418,6 +1419,23 @@ void MainWindow::updateDisasmView(const int sentBase, const bool newPane) {
// Misc
// ------------------------------------------------

void MainWindow::disasmToggleAdl(int state) {
switch (state) {
default:
case Qt::PartiallyChecked:
disasm.forceAdl = FORCE_NONE;
break;
case Qt::Checked:
disasm.forceAdl = FORCE_ADL;
break;
case Qt::Unchecked:
disasm.forceAdl = FORCE_NONADL;
break;
}
prevDisasmAddress = ui->disassemblyView->getSelectedAddress().toUInt(Q_NULLPTR, 16);
updateDisasmView(prevDisasmAddress, true);
}

void MainWindow::debuggerTabSwitched(int tab) {
if (tab == 0) {
updateDisasmView(prevDisasmAddress, true);
Expand Down
6 changes: 3 additions & 3 deletions gui/qt/dockwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ DockWidget::DockWidget(QTabWidget *tabs, QWidget *parent) : DockWidget{tabs->tab
}

DockWidget::DockWidget(const QString &title, QWidget *parent)
: QDockWidget{title, parent}, m_hide_title{new QWidget{this}}, m_title_height{-1} {
: QDockWidget{title, parent}, titleHide{new QWidget{this}}, titleHeight{-1} {
setObjectName(windowTitle());
}

void DockWidget::toggleState(bool visible) {
visible |= isWindow();
if ((visible) ^ (titleBarWidget() == Q_NULLPTR)) {
if (!visible) {
m_title_height = widget()->y();
titleHeight = widget()->y();
}
setTitleBarWidget(visible ? Q_NULLPTR : m_hide_title);
setTitleBarWidget(visible ? Q_NULLPTR : titleHide);
}
}
4 changes: 2 additions & 2 deletions gui/qt/dockwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ class DockWidget : public QDockWidget {
void toggleState(bool visible);

private:
QWidget *m_hide_title;
int m_title_height;
QWidget *titleHide;
int titleHeight;
};

#endif
4 changes: 0 additions & 4 deletions gui/qt/emuthread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,6 @@ void EmuThread::setDebugStepOutMode() {
inDebugger = false;
}

void gui_set_busy(bool busy) {
emit emu_thread->isBusy(busy);
}

// Called occasionally, only way to do something in the same thread the emulator runs in.
void EmuThread::doStuff() {
std::chrono::steady_clock::time_point cur_time = std::chrono::steady_clock::now();
Expand Down
1 change: 0 additions & 1 deletion gui/qt/emuthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ class EmuThread : public QThread {

// Status
void actualSpeedChanged(int);
void isBusy(bool busy);

// Save/Restore state
void saved(bool);
Expand Down
Loading

0 comments on commit fde65d0

Please sign in to comment.