more work on the command stream debugger

This commit is contained in:
tildearrow 2024-03-09 17:36:44 -05:00
parent 53ff3c2f70
commit 5dd62d45fa
3 changed files with 84 additions and 6 deletions

View file

@ -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;

View file

@ -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<DIV_MAX_CSTRACE; i++) {
trace[i]=0;
}
}
};
class DivCSPlayer {

View file

@ -21,6 +21,10 @@
#include <fmt/printf.h>
#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; i<chans; i++) {
DivCSChannelState* state=cs->getChanState(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")) {