diff --git a/src/engine/cmdStream.cpp b/src/engine/cmdStream.cpp index 351aaecb9..489b16b61 100644 --- a/src/engine/cmdStream.cpp +++ b/src/engine/cmdStream.cpp @@ -89,6 +89,7 @@ bool DivCSPlayer::tick() { command=fastCmds[next&15]; } else if (next>=0xe0 && next<=0xef) { // preset delay chan[i].waitTicks=fastDelays[next&15]; + chan[i].lastWaitLen=chan[i].waitTicks; } else switch (next) { case 0xb4: // note on null e->dispatchCmd(DivCommand(DIV_CMD_NOTE_ON,i,DIV_NOTE_NULL)); @@ -156,12 +157,15 @@ bool DivCSPlayer::tick() { break; case 0xfc: chan[i].waitTicks=(unsigned short)stream.readS(); + chan[i].lastWaitLen=chan[i].waitTicks; break; case 0xfd: chan[i].waitTicks=(unsigned char)stream.readC(); + chan[i].lastWaitLen=chan[i].waitTicks; break; case 0xfe: chan[i].waitTicks=1; + chan[i].lastWaitLen=chan[i].waitTicks; break; case 0xff: chan[i].readPos=chan[i].startPos; diff --git a/src/engine/cmdStream.h b/src/engine/cmdStream.h index 8ecc17c67..4704b41b9 100644 --- a/src/engine/cmdStream.h +++ b/src/engine/cmdStream.h @@ -23,12 +23,15 @@ #include "defines.h" #include "safeReader.h" +#define DIV_MAX_CSTRACE 64 + class DivEngine; struct DivCSChannelState { unsigned int startPos; unsigned int readPos; int waitTicks; + int lastWaitLen; int note, pitch; int volume, volMax, volSpeed; @@ -39,11 +42,7 @@ struct DivCSChannelState { unsigned int callStack[8]; unsigned char callStackPos; - struct TraceEntry { - unsigned int addr; - unsigned char length; - unsigned char data[11]; - } trace[32]; + unsigned int trace[DIV_MAX_CSTRACE]; unsigned char tracePos; bool doCall(unsigned int addr); @@ -51,6 +50,7 @@ struct DivCSChannelState { DivCSChannelState(): readPos(0), waitTicks(0), + lastWaitLen(0), note(-1), pitch(0), volume(0x7f00), @@ -64,7 +64,12 @@ struct DivCSChannelState { arp(0), arpStage(0), arpTicks(0), - callStackPos(0) {} + callStackPos(0), + tracePos(0) { + for (int i=0; i #include "imgui.h" +String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr) { + return "TODO"; +} + void FurnaceGUI::drawCSPlayer() { if (nextWindow==GUI_WINDOW_CS_PLAYER) { csPlayerOpen=true; @@ -58,6 +62,71 @@ void FurnaceGUI::drawCSPlayer() { if (ImGui::BeginTabBar("CSOptions")) { int chans=e->getTotalChannelCount(); if (ImGui::BeginTabItem("Status")) { + if (ImGui::BeginTable("CSStat",11,ImGuiTableFlags_SizingFixedSame|ImGuiTableFlags_ScrollX|ImGuiTableFlags_Borders)) { + ImGui::TableSetupScrollFreeze(1,1); + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableNextColumn(); + ImGui::Text("channel"); + ImGui::TableNextColumn(); + ImGui::Text("start"); + ImGui::TableNextColumn(); + ImGui::Text("PC"); + ImGui::TableNextColumn(); + ImGui::Text("wait"); + ImGui::TableNextColumn(); + ImGui::Text("SP"); + ImGui::TableNextColumn(); + ImGui::Text("note"); + ImGui::TableNextColumn(); + ImGui::Text("pitch"); + ImGui::TableNextColumn(); + ImGui::Text("vol"); + ImGui::TableNextColumn(); + ImGui::Text("vols"); + ImGui::TableNextColumn(); + ImGui::Text("vib"); + ImGui::TableNextColumn(); + ImGui::Text("porta"); + ImGui::TableNextColumn(); + ImGui::Text("arp"); + + for (int i=0; igetChanState(i); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("%d",i); + ImGui::TableNextColumn(); + ImGui::Text("$%.4x",state->startPos); + ImGui::TableNextColumn(); + ImGui::Text("$%.4x",state->readPos); + ImGui::TableNextColumn(); + ImGui::Text("%d/%d",state->waitTicks,state->lastWaitLen); + ImGui::TableNextColumn(); + ImGui::Text("%d",state->callStackPos); + ImGui::TableNextColumn(); + ImGui::Text("%d",state->note); + ImGui::TableNextColumn(); + ImGui::Text("%d",state->pitch); + ImGui::TableNextColumn(); + ImGui::Text("$%.4X",state->volume); + ImGui::TableNextColumn(); + ImGui::Text("%+d",state->volSpeed); + ImGui::TableNextColumn(); + ImGui::Text("%d/%d (%d)",state->vibratoDepth,state->vibratoRate,state->vibratoPos); + ImGui::TableNextColumn(); + ImGui::Text("-> %d (%d)",state->portaTarget,state->portaSpeed); + ImGui::TableNextColumn(); + ImGui::Text("$%.2X",state->arp); + } + + ImGui::EndTable(); + } + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Trace")) { + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Disassemble")) { ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Hex")) {