- [FIX] ui module should only update renderer when it actually changes

- [NEW] Disassembly window now can scroll with cursors or mouse wheel
- [NEW] Added valgrind script and supporting file
This commit is contained in:
2024-12-06 11:53:31 +01:00
parent 80a8d3b0cd
commit 970aaa518f
7 changed files with 85 additions and 33 deletions

View File

@@ -107,15 +107,28 @@ int main(int argc, char *argv[])
z80debug::refresh();
zxscreen::redraw();
}
if (e.type == SDL_MOUSEWHEEL) {
if (e.wheel.mouseX<46 && e.wheel.mouseY<20) {
if (e.wheel.y>0) {
z80debug::cursorback();
z80debug::refresh();
} else if (e.wheel.y<0) {
z80debug::cursorfwd();
z80debug::refresh();
}
}
}
if (e.type == SDL_KEYDOWN) {
if (e.key.keysym.scancode==SDL_SCANCODE_ESCAPE) {
should_exit=true; break;
} else if (e.key.keysym.scancode==SDL_SCANCODE_F10) {
z80debug::history::gototop();
const uint8_t dt = z80::step();
z80debug::refresh();
zxscreen::refresh(dt);
zxscreen::redraw();
} else if (e.key.keysym.scancode==SDL_SCANCODE_F11) {
z80debug::history::gototop();
const uint8_t dt = z80debug::next();
zxscreen::refresh(dt);
zxscreen::redraw();
@@ -133,11 +146,17 @@ int main(int argc, char *argv[])
const uint8_t dt = z80::step();
z80debug::cont();
zxscreen::refresh(dt);
} else if (e.key.keysym.scancode==SDL_SCANCODE_F6) {
/*} else if (e.key.keysym.scancode==SDL_SCANCODE_F6) {
z80debug::history::gototop();
const uint8_t dt = z80::step();
z80debug::refresh();
zxscreen::refresh(dt);
zxscreen::refresh(dt);*/
} else if (e.key.keysym.scancode==SDL_SCANCODE_UP) {
z80debug::cursorback();
z80debug::refresh();
} else if (e.key.keysym.scancode==SDL_SCANCODE_DOWN) {
z80debug::cursorfwd();
z80debug::refresh();
} else if (e.key.keysym.scancode==SDL_SCANCODE_RETURN) {
z80debug::executeConsole();
} else if (e.key.keysym.scancode==SDL_SCANCODE_BACKSPACE) {

1
ui.cpp
View File

@@ -39,6 +39,7 @@ namespace ui
void setrenderer(SDL_Renderer *renderer)
{
if (!surf) init();
if (ren==renderer) return;
ren = renderer;
if (tex) SDL_DestroyTexture(tex);
tex = SDL_CreateTextureFromSurface(ren, surf);

12
valgrind-sup.txt Normal file
View File

@@ -0,0 +1,12 @@
{
ignore_unversioned_libs
Memcheck:Leak
...
obj:*/lib*/lib*.so
}
{
ignore_versioned_libs
Memcheck:Leak
...
obj:*/lib*/lib*.so.*
}

2
valgrind.sh Executable file
View File

@@ -0,0 +1,2 @@
#!/bin/bash
valgrind --tool=memcheck --leak-check=full --leak-resolution=high --suppressions=valgrind-sup.txt ./z80

View File

@@ -1066,6 +1066,7 @@ namespace z80
uint32_t step()
{
z80debug::setcursor(rPC);
current_opcode_address = rPC;
t = 0;
const uint8_t opcode = READ_M1();

View File

@@ -30,6 +30,8 @@ namespace z80debug
uint8_t breakpoints[65536];
uint16_t cursor = 0;
char temp[256];
const char *tohex(int value, int numdigits)
{
@@ -112,6 +114,26 @@ namespace z80debug
*/
}
void printDissasemblerLine(const uint16_t address, const int line)
{
uint8_t colors[4] = { COLOR_RED, COLOR_CYAN, COLOR_GRAY, COLOR_WHITE};
if (is_debugging && (address == z80::getPC())) {
for (int i=0; i<4;++i) colors[i]=COLOR_YELLOW;
ui::printrect(0,line, 44,1, COLOR_BLUE);
}
if (breakpoints[address]&9) ui::printtxt(0,line,"*", colors[0]);
ui::printtxt(1,line,tohex(address,4), colors[1]);
if (z80::getMemTag(address)==MEMTAG_INST) {
ui::printtxt(7,line, z80dis::getOpcode(address), colors[2]);
ui::printtxt(19,line, z80dis::getAsm(address), colors[3]);
} else {
ui::printtxt(7,line, tohex(z80::getMem()[address],2), COLOR_GRAY);
ui::printtxt(19,line, "?????????", COLOR_GRAY);
}
}
void refresh()
{
ui::setrenderer(ren);
@@ -125,49 +147,24 @@ namespace z80debug
ui::printtxt(3,0, "ASSEMBLER:", COLOR_WHITE);
ui::setoffset(1, 1);
/*printtxt(1,0, "19C4:", COLOR_CYAN);
printtxt(7,0, "10 EE", COLOR_GRAY);
printtxt(19,0, "DJNZ 0x19B4", COLOR_WHITE);
printrect(0,1, 44,1, COLOR_BLUE);
printtxt(1,1, "19C6:", COLOR_YELLOW);
printtxt(7,1, "01 3C 00", COLOR_YELLOW);
printtxt(19,1, "LD BC,0x003C", COLOR_YELLOW);*/
uint8_t colors[4] = { COLOR_RED, COLOR_CYAN, COLOR_GRAY, COLOR_WHITE};
uint16_t pc = z80::getPC();
uint8_t *memory = z80::getMem();
if (is_debugging) {
for (int i=0; i<4;++i) colors[i]=COLOR_YELLOW;
ui::printrect(0,8, 44,1, COLOR_BLUE);
}
if (breakpoints[pc]&9) ui::printtxt(0,8,"*", colors[0]);
ui::printtxt(1,8,tohex(pc,4), colors[1]);
ui::printtxt(7,8, z80dis::getOpcode(pc), colors[2]);
ui::printtxt(19,8, z80dis::getAsm(pc), colors[3]);
uint16_t pc = cursor; //z80::getPC();
uint16_t pos = pc;
printDissasemblerLine(pc, 8);
for (int i=9;i<18;++i) {
pos += z80dis::getOpcodeSize(pos);
if (breakpoints[pos]&9) ui::printtxt(0,i,"*", COLOR_RED);
ui::printtxt(1,i,tohex(pos,4), COLOR_CYAN);
ui::printtxt(7,i, z80dis::getOpcode(pos), COLOR_GRAY);
ui::printtxt(19,i, z80dis::getAsm(pos), COLOR_WHITE);
printDissasemblerLine(pos, i);
}
pos = pc;
for (int i=7;i>=0;--i) {
pos = find_previous_opcode(pos);
if (breakpoints[pos]&9) ui::printtxt(0,i,"*", COLOR_RED);
ui::printtxt(1,i,tohex(pos,4), COLOR_CYAN);
if (z80::getMemTag(pos)==MEMTAG_INST) {
ui::printtxt(7,i, z80dis::getOpcode(pos), COLOR_GRAY);
ui::printtxt(19,i, z80dis::getAsm(pos), COLOR_WHITE);
} else {
ui::printtxt(7,i, tohex(z80::getMem()[pos],2), COLOR_GRAY);
ui::printtxt(19,i, "?????????", COLOR_GRAY);
}
printDissasemblerLine(pos, i);
}
//for (int i=0;i<20;++i) printtxt(1,i,tohex(pc,4), COLOR_CYAN);
ui::setoffset(0, 0);
ui::box(46,0,25,8,COLOR_WHITE);
@@ -513,6 +510,22 @@ namespace z80debug
fclose(f);
}
void setcursor(const uint16_t address)
{
cursor = address;
}
void cursorfwd()
{
cursor += z80dis::getOpcodeSize(cursor);
}
void cursorback()
{
cursor = find_previous_opcode(cursor);
}
namespace history
{
void store()

View File

@@ -27,6 +27,10 @@ namespace z80debug
void loadngo(const char* filename, const char* addr);
void setcursor(const uint16_t address);
void cursorfwd();
void cursorback();
namespace history
{
void store();