From 2f4e79bc50a1de124f2544b505abac3b18ac83ea Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 9 Dec 2024 15:33:35 +0100 Subject: [PATCH] =?UTF-8?q?-=20[NEW]=20Gesti=C3=B3=20dels=20events=20de=20?= =?UTF-8?q?cada=20finestra=20per=20separat=20-=20[NEW]=20Symbols=20per=20a?= =?UTF-8?q?=20etiquetar=20adreces=20-=20[NEW]=20Mapa=20de=20mem=C3=B2ria?= =?UTF-8?q?=20"tocada"=20-=20[NEW]=20En=20el=20mapa=20de=20mem=C3=B2ria=20?= =?UTF-8?q?al=20passar=20el=20ratol=C3=AD=20mostra=20l'adre=C3=A7a=20-=20[?= =?UTF-8?q?NEW]=20En=20el=20mapa=20de=20mem=C3=B2ria=20es=20mostra=20en=20?= =?UTF-8?q?roig=20la=20posici=C3=B3=20del=20contador=20de=20programa=20-?= =?UTF-8?q?=20[NEW]=20Reempla=C3=A7=20en=20els=20opcodes=20de=20adreces=20?= =?UTF-8?q?conegudes=20per=20la=20seua=20etiqueta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- boom.sav | Bin 0 -> 49183 bytes main.cpp | 113 ++++++------------------------------------------- symbols.txt | 2 + ui_window.cpp | 33 +++++++++++++++ ui_window.h | 12 ++++++ z80.cpp | 14 ++++++ z80.h | 4 ++ z80analyze.cpp | 35 ++++++++++++++- z80debug.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++++++- z80dis.cpp | 32 +++++++++++++- z80dis.h | 1 + zx_screen.cpp | 47 ++++++++++++++++++++ 12 files changed, 299 insertions(+), 104 deletions(-) create mode 100644 boom.sav create mode 100644 symbols.txt create mode 100644 ui_window.cpp create mode 100644 ui_window.h diff --git a/boom.sav b/boom.sav new file mode 100644 index 0000000000000000000000000000000000000000..6600edff1ebb227908742eee2510187068c9497b GIT binary patch literal 49183 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 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index 9871456..123d9da 100644 --- a/main.cpp +++ b/main.cpp @@ -11,6 +11,7 @@ #include "ui.h" #include "ui_menu.h" #include "z80analyze.h" +#include "ui_window.h" uint8_t memory[65536]; uint32_t time = 0; @@ -68,6 +69,7 @@ int main(int argc, char *argv[]) fread(memory, 1024, 16, f); fclose(f); + z80dis::loadSymbols(); z80::reset(memory); z80::connect_port(0xfe, zx_ula::port_in, zx_ula::port_out); @@ -114,108 +116,20 @@ int main(int argc, char *argv[]) { while (SDL_PollEvent(&e)) { + bool result = true; + if (e.type == SDL_QUIT) { should_exit=true; break; } + if (e.type == SDL_MOUSEBUTTONUP) result = ui::window::sendEvent(e.button.windowID, &e); + if (e.type == SDL_MOUSEMOTION) result = ui::window::sendEvent(e.motion.windowID, &e); + if (e.type == SDL_WINDOWEVENT) result = ui::window::sendEvent(e.window.windowID, &e); + if (e.type == SDL_MOUSEWHEEL) result = ui::window::sendEvent(e.wheel.windowID, &e); + if (e.type == SDL_KEYDOWN) result = ui::window::sendEvent(e.key.windowID, &e); + if (e.type == SDL_TEXTINPUT) result = ui::window::sendEvent(e.text.windowID, &e); + if (e.type == SDL_MOUSEBUTTONUP && e.button.button==1) ui::setClicked(true); - if ((e.type==SDL_WINDOWEVENT) && (e.window.event==SDL_WINDOWEVENT_CLOSE)) { - should_exit=true; break; - } - if (z80debug::debugging()) { - if ((e.type==SDL_WINDOWEVENT) && ((e.window.event==SDL_WINDOWEVENT_SHOWN) || (e.window.event==SDL_WINDOWEVENT_EXPOSED))) { - z80debug::refresh(); - zxscreen::redraw(); - } - if (e.type == SDL_MOUSEWHEEL) { - if (e.wheel.mouseX<46*CHR_W && e.wheel.mouseY<20*CHR_H) { - 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(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F1) { - z80debug::history::gototop(); - z80debug::refresh(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F2) { - z80debug::history::goback(); - z80debug::refresh(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F3) { - z80debug::history::goforward(); - z80debug::refresh(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F5) { - z80debug::history::gototop(); - const uint8_t dt = z80::step(); - z80debug::cont(); - zxscreen::refresh(dt); - /*} else if (e.key.keysym.scancode==SDL_SCANCODE_F6) { - z80debug::history::gototop(); - const uint8_t dt = z80::step(); - z80debug::refresh(); - 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) { - z80debug::DeleteCharConsole(); - } - } - if (e.type == SDL_TEXTINPUT) { - z80debug::sendToConsole(e.text.text); - } - - } else if (z80debug::paused()) { - if (e.type == SDL_KEYDOWN) { - if (e.key.keysym.scancode==SDL_SCANCODE_ESCAPE) { - const uint8_t dt = z80::step(); - z80debug::cont(); - zxscreen::refresh(dt); - } - } - - } else { - if (e.type == SDL_KEYDOWN) { - if (e.key.keysym.scancode==SDL_SCANCODE_ESCAPE) { - z80debug::pause(); - ui::setrenderer(zxscreen::getrenderer()); - zxscreen::redraw(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F1) { - zxscreen::decZoom(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F2) { - zxscreen::incZoom(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F3) { - zxscreen::toggleFullscreen(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F8) { - z80debug::stop(); - zxscreen::redraw(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F12) { - zx_tape::play(); - } else if (e.key.keysym.scancode==SDL_SCANCODE_F11) { - zx_tape::rewind(); - } - } - } + if (!result) + should_exit = true; break; } if (!z80debug::debugging() && !z80debug::paused()) { @@ -261,6 +175,7 @@ int main(int argc, char *argv[]) while (SDL_GetTicks() + +namespace ui +{ + namespace window + { + struct window_t + { + Uint32 window; + bool (*callback)(SDL_Event*); + }; + std::vector windows; + + void registerWindow(Uint32 window, bool(*callback)(SDL_Event*)) + { + for (auto win : windows) if (win.window == window) return; + windows.push_back((window_t){window, callback}); + } + + void unregisterWindow(Uint32 window) + { + for (auto win = windows.begin(); win != windows.end(); win++) if ((*win).window == window) { windows.erase(win); return; } + } + + bool sendEvent(Uint32 window, SDL_Event *e) + { + for (auto win : windows) if (win.window == window) return win.callback(e); + return true; + } + + } +} diff --git a/ui_window.h b/ui_window.h new file mode 100644 index 0000000..1ff0983 --- /dev/null +++ b/ui_window.h @@ -0,0 +1,12 @@ +#pragma once +#include + +namespace ui +{ + namespace window + { + void registerWindow(Uint32 window, bool(*callback)(SDL_Event *e)); + void unregisterWindow(Uint32 window); + bool sendEvent(Uint32 window, SDL_Event *e); + } +} diff --git a/z80.cpp b/z80.cpp index e286f1a..1c860ad 100644 --- a/z80.cpp +++ b/z80.cpp @@ -7,6 +7,7 @@ namespace z80 { static uint8_t *memory = nullptr; static uint8_t memtag[65536]; + static uint8_t memtouched[65536]; static uint32_t t = 0; static uint16_t current_opcode_address = 0; bool options[Z80_NUM_OPTIONS] = { true }; @@ -1071,6 +1072,7 @@ namespace z80 t = 0; const uint8_t opcode = READ_M1(); memtag[current_opcode_address] = MEMTAG_INST; + memtouched[current_opcode_address] = MEMTAG_INST; uint16_t tmp; switch (opcode) @@ -2738,6 +2740,18 @@ namespace z80 uint8_t getMemTag(const uint16_t addr) { return memtag[addr]; }; + void clearMemTag() + { + for (int i=0; i<65536; ++i) memtag[i] = MEMTAG_NONE; + } + + uint8_t getMemTouched(const uint16_t addr) { return memtouched[addr]; } + + void clearMemTouched() + { + for (int i=0; i<65536; ++i) memtouched[i] = MEMTAG_NONE; + } + const bool getOption(const int option) { return options[option]; diff --git a/z80.h b/z80.h index 7920c39..053128e 100644 --- a/z80.h +++ b/z80.h @@ -37,6 +37,10 @@ namespace z80 void setPC(const uint16_t addr); uint8_t getMemTag(const uint16_t addr); + void clearMemTag(); + + uint8_t getMemTouched(const uint16_t addr); + void clearMemTouched(); const bool getOption(const int option); void setOption(const int option, const bool value); diff --git a/z80analyze.cpp b/z80analyze.cpp index 996531b..43b8e18 100644 --- a/z80analyze.cpp +++ b/z80analyze.cpp @@ -1,6 +1,7 @@ #include "z80analyze.h" #include "z80.h" #include +#include "ui_window.h" namespace z80analyze { @@ -8,34 +9,64 @@ namespace z80analyze SDL_Renderer *ren = nullptr; SDL_Texture *tex = nullptr; + void refreshTitle(); + + bool handleEvent(SDL_Event *e) + { + if (e->type == SDL_MOUSEBUTTONUP) + { + z80::clearMemTouched(); + refresh(); + } + if (e->type == SDL_MOUSEMOTION) + { + refreshTitle(); + } + return true; + } + void show() { if (!win) { - win = SDL_CreateWindow("Z80 Analyzer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 256, 256, SDL_WINDOW_SHOWN); + win = SDL_CreateWindow("Z80 Analyzer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 512, 512, SDL_WINDOW_SHOWN); ren = SDL_CreateRenderer(win, -1, 0); tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 256, 256); + ui::window::registerWindow(SDL_GetWindowID(win), handleEvent); } refresh(); } + char tmp[10]; + void refreshTitle() + { + int mx, my; + SDL_GetMouseState(&mx, &my); + mx/=2; my/=2; + SDL_SetWindowTitle(win, SDL_itoa(mx+my*256, tmp, 16)); + } void refresh() { + if (!win) return; + Uint32 *pixels; int pitch; SDL_LockTexture(tex, NULL, (void**)&pixels, &pitch); for (int i=0; i<65536; ++i) { - uint8_t tag = z80::getMemTag(i); + uint8_t tag = z80::getMemTouched(i); pixels[i] = tag==MEMTAG_NONE ? 0x808080 : tag==MEMTAG_DATA ? 0x0000FF : 0x00FF00; } + pixels[z80::getPC()] = 0xFF0000; SDL_UnlockTexture(tex); SDL_RenderCopy(ren, tex, NULL, NULL); SDL_RenderPresent(ren); + refreshTitle(); } void hide() { + ui::window::unregisterWindow(SDL_GetWindowID(win)); SDL_DestroyTexture(tex); SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); diff --git a/z80debug.cpp b/z80debug.cpp index ec65fb5..e308917 100644 --- a/z80debug.cpp +++ b/z80debug.cpp @@ -5,6 +5,10 @@ #include "zx_ula.h" #include "zx_tape.h" #include "ui.h" +#include "ui_window.h" +#include "zx_screen.h" +#include "z80analyze.h" + namespace z80debug { namespace history @@ -40,6 +44,85 @@ namespace z80debug return temp; } + bool eventHandler(SDL_Event *e) + { + if (z80debug::debugging()) { + if (e->type==SDL_WINDOWEVENT) { + if ((e->window.event==SDL_WINDOWEVENT_SHOWN) || (e->window.event==SDL_WINDOWEVENT_EXPOSED)) { + z80debug::refresh(); + zxscreen::redraw(); + } else if (e->window.event == SDL_WINDOWEVENT_CLOSE) { + z80debug::history::gototop(); + const uint8_t dt = z80::step(); + z80debug::cont(); + zxscreen::refresh(dt); + } + } + if (e->type == SDL_MOUSEWHEEL) { + if (e->wheel.mouseX<46*CHR_W && e->wheel.mouseY<20*CHR_H) { + 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) { + return false; + } 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(); + z80analyze::refresh(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F11) { + z80debug::history::gototop(); + const uint8_t dt = z80debug::next(); + zxscreen::refresh(dt); + zxscreen::redraw(); + z80analyze::refresh(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F1) { + z80debug::history::gototop(); + z80debug::refresh(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F2) { + z80debug::history::goback(); + z80debug::refresh(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F3) { + z80debug::history::goforward(); + z80debug::refresh(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F5) { + z80debug::history::gototop(); + const uint8_t dt = z80::step(); + z80debug::cont(); + zxscreen::refresh(dt); + /*} else if (e->key.keysym.scancode==SDL_SCANCODE_F6) { + z80debug::history::gototop(); + const uint8_t dt = z80::step(); + z80debug::refresh(); + 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) { + z80debug::DeleteCharConsole(); + } + } + if (e->type == SDL_TEXTINPUT) { + z80debug::sendToConsole(e->text.text); + } + } + return true; + } + void processCommand(); void init() @@ -54,12 +137,14 @@ namespace z80debug if (win) return; win = SDL_CreateWindow("Z80 Debugger", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 71*CHR_W, 34*CHR_H, SDL_WINDOW_RESIZABLE); ren = SDL_CreateRenderer(win, -1, 0); + ui::window::registerWindow(SDL_GetWindowID(win), eventHandler); z80debug::refresh(); } void hide() { + ui::window::unregisterWindow(SDL_GetWindowID(win)); if (ren) SDL_DestroyRenderer(ren); if (win) SDL_DestroyWindow(win); ren = NULL; @@ -140,6 +225,8 @@ namespace z80debug SDL_SetRenderDrawColor(ren, 30, 30, 30, 255); SDL_RenderClear(ren); + // DISSASSEBLY + // ****************************************** ui::setoffset(0, 0); ui::box(0,0,46,20,COLOR_WHITE); @@ -166,6 +253,9 @@ namespace z80debug printDissasemblerLine(pos, i); } + // REGISTERS + // ****************************************** + ui::setoffset(0, 0); ui::box(46,0,25,8,COLOR_WHITE); ui::printrect(48,0, 12,1, COLOR_DARK); @@ -210,6 +300,10 @@ namespace z80debug ui::printtxt(6,5,"N", flags&0x02 ? (mod_flags&0x02 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x02 ? COLOR_BROWN : COLOR_GRAY) ); ui::printtxt(7,5,"C", flags&0x01 ? (mod_flags&0x01 ? COLOR_RED : COLOR_WHITE) : (mod_flags&0x01 ? COLOR_BROWN : COLOR_GRAY) ); + + // STACK + // ****************************************** + ui::setoffset(0, 0); ui::box(46,8,11,12,COLOR_WHITE); ui::printrect(48,8, 8,1, COLOR_DARK); @@ -227,6 +321,10 @@ namespace z80debug sp+=2; } + + // BREAKPOINTS + // ****************************************** + ui::setoffset(0, 0); ui::box(57,8,14,12,COLOR_WHITE); ui::printrect(59,8, 9,1, COLOR_DARK); @@ -245,6 +343,10 @@ namespace z80debug } } + + // MEMORY + // ****************************************** + ui::setoffset(0, 0); ui::box(0,20,71,8,COLOR_WHITE); ui::printrect(2,20, 9,1, COLOR_DARK); @@ -264,6 +366,10 @@ namespace z80debug //printtxt(53,0, "0123456789AB\tDEF", COLOR_GRAY); } + + // CONSOLE + // ****************************************** + ui::setoffset(0, 0); ui::box(0,28,71,6,COLOR_WHITE); ui::printrect(2,28, 10,1, COLOR_DARK); @@ -355,7 +461,9 @@ namespace z80debug z80::step(); z80debug::cont(); } else if (strcmp(cmd, "r")==0 || strcmp(cmd, "reset")==0) { - z80::reset(z80::getMem()); + uint8_t *mem = z80::getMem(); + for (int i=0; i<65536; ++i) mem[i]=0; + z80::reset(mem); z80::connect_port(0xfe, zx_ula::port_in, zx_ula::port_out); //for (int i=0; i<65536; ++i) breakpoints[i]=0; z80debug::refresh(); diff --git a/z80dis.cpp b/z80dis.cpp index fd40232..6b69bdb 100644 --- a/z80dis.cpp +++ b/z80dis.cpp @@ -7,6 +7,8 @@ namespace z80dis { char buffer[256]; int opcode_size = 0; + char symbols[65536][15]; + // $%04x // $%02x // %hhd @@ -35,6 +37,20 @@ namespace z80dis // const char *iy_opcodes[256] = {"", "", "", "", "inc b", "dec b", "ld b,N", "", "", "add iy,bc", "", "", "inc c", "dec c", "ld c,N", "", "", "", "", "", "inc d", "dec d", "ld d,N", "", "", "add iy,de", "", "", "inc e", "dec e", "ld e,N", "", "", "ld iy,NN", "ld (NN),iy", "inc iy", "inc iyh", "dec iyh", "ld iyh,N", "", "", "add iy,iy", "ld iy,(NN)", "dec iy", "inc iyl", "dec iyl", "ld iyl,N", "", "", "", "", "", "inc (iy+D)", "dec (iy+D)", "ld (iy+D),N", "", "", "add iy,sp", "", "", "inc a", "dec a", "ld a,N", "", "ld b,b", "ld b,c", "ld b,d", "ld b,e", "ld b,iyh", "ld b,iyl", "ld b,(iy+D)", "ld b,a", "ld c,b", "ld c,c", "ld c,d", "ld c,e", "ld c,iyh", "ld c,iyl", "ld c,(iy+D)", "ld c,a", "ld d,b", "ld d,c", "ld d,d", "ld d,e", "ld d,iyh", "ld d,iyl", "ld d,(iy+D)", "ld d,a", "ld e,b", "ld e,c", "ld e,d", "ld e,e", "ld e,iyh", "ld e,iyl", "ld e,(iy+D)", "ld e,a", "ld iyh,b", "ld iyh,c", "ld iyh,d", "ld iyh,e", "ld iyh,iyh", "ld iyh,iyl", "ld h,(iy+D)", "ld iyh,a", "ld iyl,b", "ld iyl,c", "ld iyl,d", "ld iyl,e", "ld iyl,iyh", "ld iyl,iyl", "ld l,(iy+D)", "ld iyl,a", "ld (iy+D),b", "ld (iy+D),c", "ld (iy+D),d", "ld (iy+D),e", "ld (iy+D),h", "ld (iy+D),l", "", "ld (iy+D),a", "ld a,b", "ld a,c", "ld a,d", "ld a,e", "ld a,iyh", "ld a,iyl", "ld a,(iy+D)", "ld a,a", "add a,b", "add a,c", "add a,d", "add a,e", "add a,iyh", "add a,iyl", "add a,(iy+D)", "add a,a", "adc a,b", "adc a,c", "adc a,d", "adc a,e", "adc a,iyh", "adc a,iyl", "adc a,(iy+D)", "adc a,a", "sub b", "sub c", "sub d", "sub e", "sub iyh", "sub iyl", "sub (iy+D)", "sub a", "sbc a,b", "sbc a,c", "sbc a,d", "sbc a,e", "sbc a,iyh", "sbc a,iyl", "sbc a,(iy+D)", "sbc a,a", "and b", "and c", "and d", "and e", "and iyh", "and iyl", "and (iy+D)", "and a", "xor b", "xor c", "xor d", "xor e", "xor iyh", "xor iyl", "xor (iy+D)", "xor a", "or b", "or c", "or d", "or e", "or iyh", "or iyl", "or (iy+D)", "or a", "cp b", "cp c", "cp d", "cp e", "cp iyh", "cp iyl", "cp (iy+D)", "cp a", "", "", "", "", "", "", "", "", "", "", "", "_IY Bit_", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "pop iy", "", "ex (sp),iy", "", "push iy", "", "", "", "jp (iy)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ld sp,iy", "", "", "", "", "", ""}; // const char *iy_bit_opcodes[256] = {"rlc (iy+D),b", "rlc (iy+D),c", "rlc (iy+D),d", "rlc (iy+D),e", "rlc (iy+D),h", "rlc (iy+D),l", "rlc (iy+D)", "rlc (iy+D),a", "rrc (iy+D),b", "rrc (iy+D),c", "rrc (iy+D),d", "rrc (iy+D),e", "rrc (iy+D),h", "rrc (iy+D),l", "rrc (iy+D)", "rrc (iy+D),a", "rl (iy+D),b", "rl (iy+D),c", "rl (iy+D),d", "rl (iy+D),e", "rl (iy+D),h", "rl (iy+D),l", "rl (iy+D)", "rl (iy+D),a", "rr (iy+D),b", "rr (iy+D),c", "rr (iy+D),d", "rr (iy+D),e", "rr (iy+D),h", "rr (iy+D),l", "rr (iy+D)", "rr (iy+D),a", "sla (iy+D),b", "sla (iy+D),c", "sla (iy+D),d", "sla (iy+D),e", "sla (iy+D),h", "sla (iy+D),l", "sla (iy+D)", "sla (iy+D),a", "sra (iy+D),b", "sra (iy+D),c", "sra (iy+D),d", "sra (iy+D),e", "sra (iy+D),h", "sra (iy+D),l", "sra (iy+D)", "sra (iy+D),a", "sll (iy+D),b", "sll (iy+D),c", "sll (iy+D),d", "sll (iy+D),e", "sll (iy+D),h", "sll (iy+D),l", "sll (iy+D)", "sll (iy+D),a", "srl (iy+D),b", "srl (iy+D),c", "srl (iy+D),d", "srl (iy+D),e", "srl (iy+D),h", "srl (iy+D),l", "srl (iy+D)", "srl (iy+D),a", "bit 0,(iy+D)", "bit 0,(iy+D)", "bit 0,(iy+D)", "bit 0,(iy+D)", "bit 0,(iy+D)", "bit 0,(iy+D)", "bit 0,(iy+D)", "bit 0,(iy+D)", "bit 1,(iy+D)", "bit 1,(iy+D)", "bit 1,(iy+D)", "bit 1,(iy+D)", "bit 1,(iy+D)", "bit 1,(iy+D)", "bit 1,(iy+D)", "bit 1,(iy+D)", "bit 2,(iy+D)", "bit 2,(iy+D)", "bit 2,(iy+D)", "bit 2,(iy+D)", "bit 2,(iy+D)", "bit 2,(iy+D)", "bit 2,(iy+D)", "bit 2,(iy+D)", "bit 3,(iy+D)", "bit 3,(iy+D)", "bit 3,(iy+D)", "bit 3,(iy+D)", "bit 3,(iy+D)", "bit 3,(iy+D)", "bit 3,(iy+D)", "bit 3,(iy+D)", "bit 4,(iy+D)", "bit 4,(iy+D)", "bit 4,(iy+D)", "bit 4,(iy+D)", "bit 4,(iy+D)", "bit 4,(iy+D)", "bit 4,(iy+D)", "bit 4,(iy+D)", "bit 5,(iy+D)", "bit 5,(iy+D)", "bit 5,(iy+D)", "bit 5,(iy+D)", "bit 5,(iy+D)", "bit 5,(iy+D)", "bit 5,(iy+D)", "bit 5,(iy+D)", "bit 6,(iy+D)", "bit 6,(iy+D)", "bit 6,(iy+D)", "bit 6,(iy+D)", "bit 6,(iy+D)", "bit 6,(iy+D)", "bit 6,(iy+D)", "bit 6,(iy+D)", "bit 7,(iy+D)", "bit 7,(iy+D)", "bit 7,(iy+D)", "bit 7,(iy+D)", "bit 7,(iy+D)", "bit 7,(iy+D)", "bit 7,(iy+D)", "bit 7,(iy+D)", "res 0,(iy+D),b", "res 0,(iy+D),c", "res 0,(iy+D),d", "res 0,(iy+D),e", "res 0,(iy+D),h", "res 0,(iy+D),l", "res 0,(iy+D)", "res 0,(iy+D),a", "res 1,(iy+D),b", "res 1,(iy+D),c", "res 1,(iy+D),d", "res 1,(iy+D),e", "res 1,(iy+D),h", "res 1,(iy+D),l", "res 1,(iy+D)", "res 1,(iy+D),a", "res 2,(iy+D),b", "res 2,(iy+D),c", "res 2,(iy+D),d", "res 2,(iy+D),e", "res 2,(iy+D),h", "res 2,(iy+D),l", "res 2,(iy+D)", "res 2,(iy+D),a", "res 3,(iy+D),b", "res 3,(iy+D),c", "res 3,(iy+D),d", "res 3,(iy+D),e", "res 3,(iy+D),h", "res 3,(iy+D),l", "res 3,(iy+D)", "res 3,(iy+D),a", "res 4,(iy+D),b", "res 4,(iy+D),c", "res 4,(iy+D),d", "res 4,(iy+D),e", "res 4,(iy+D),h", "res 4,(iy+D),l", "res 4,(iy+D)", "res 4,(iy+D),a", "res 5,(iy+D),b", "res 5,(iy+D),c", "res 5,(iy+D),d", "res 5,(iy+D),e", "res 5,(iy+D),h", "res 5,(iy+D),l", "res 5,(iy+D)", "res 5,(iy+D),a", "res 6,(iy+D),b", "res 6,(iy+D),c", "res 6,(iy+D),d", "res 6,(iy+D),e", "res 6,(iy+D),h", "res 6,(iy+D),l", "res 6,(iy+D)", "res 6,(iy+D),a", "res 7,(iy+D),b", "res 7,(iy+D),c", "res 7,(iy+D),d", "res 7,(iy+D),e", "res 7,(iy+D),h", "res 7,(iy+D),l", "res 7,(iy+D)", "res 7,(iy+D),a", "set 0,(iy+D),b", "set 0,(iy+D),c", "set 0,(iy+D),d", "set 0,(iy+D),e", "set 0,(iy+D),h", "set 0,(iy+D),l", "set 0,(iy+D)", "set 0,(iy+D),a", "set 1,(iy+D),b", "set 1,(iy+D),c", "set 1,(iy+D),d", "set 1,(iy+D),e", "set 1,(iy+D),h", "set 1,(iy+D),l", "set 1,(iy+D)", "set 1,(iy+D),a", "set 2,(iy+D),b", "set 2,(iy+D),c", "set 2,(iy+D),d", "set 2,(iy+D),e", "set 2,(iy+D),h", "set 2,(iy+D),l", "set 2,(iy+D)", "set 2,(iy+D),a", "set 3,(iy+D),b", "set 3,(iy+D),c", "set 3,(iy+D),d", "set 3,(iy+D),e", "set 3,(iy+D),h", "set 3,(iy+D),l", "set 3,(iy+D)", "set 3,(iy+D),a", "set 4,(iy+D),b", "set 4,(iy+D),c", "set 4,(iy+D),d", "set 4,(iy+D),e", "set 4,(iy+D),h", "set 4,(iy+D),l", "set 4,(iy+D)", "set 4,(iy+D),a", "set 5,(iy+D),b", "set 5,(iy+D),c", "set 5,(iy+D),d", "set 5,(iy+D),e", "set 5,(iy+D),h", "set 5,(iy+D),l", "set 5,(iy+D)", "set 5,(iy+D),a", "set 6,(iy+D),b", "set 6,(iy+D),c", "set 6,(iy+D),d", "set 6,(iy+D),e", "set 6,(iy+D),h", "set 6,(iy+D),l", "set 6,(iy+D)", "set 6,(iy+D),a", "set 7,(iy+D),b", "set 7,(iy+D),c", "set 7,(iy+D),d", "set 7,(iy+D),e", "set 7,(iy+D),h", "set 7,(iy+D),l", "set 7,(iy+D)", "set 7,(iy+D),a"}; + void loadSymbols() + { + for (int i=0; i<65536; ++i) symbols[i][0] = 0; + FILE *f = fopen("symbols.txt", "r"); + while (true) { + uint16_t address; + char tmp[15]; + const int result = fscanf(f, "%x %s", &address, tmp); + if (result != 2) break; + strcpy(symbols[address], tmp); + } + fclose(f); + } + const char *getBase(const uint16_t pos) { const uint8_t *memory = &z80::getMem()[pos]; @@ -93,8 +109,20 @@ namespace z80dis { opcode_size+=2; const uint16_t word = *(uint16_t*)(memory+1); - strcpy(base, buffer); - sprintf(buffer, base, word); + if (symbols[word][0]!=0) { + char *p = strstr(buffer, "$"); + (*p)='%'; p++; + (*p)='s'; p++; + while (*(p-1) != 0) { + *p = *(p+3); + p++; + } + strcpy(base, buffer); + sprintf(buffer, base, symbols[word]); + } else { + strcpy(base, buffer); + sprintf(buffer, base, word); + } } if (strstr(buffer, "2x") && strstr(buffer, "hhd")) diff --git a/z80dis.h b/z80dis.h index c1e0a54..cf27ee1 100644 --- a/z80dis.h +++ b/z80dis.h @@ -4,6 +4,7 @@ namespace z80dis { + void loadSymbols(); const char *getAsm(const uint16_t pos); const char *getOpcode(const uint16_t pos); const int getOpcodeSize(const uint16_t pos); diff --git a/zx_screen.cpp b/zx_screen.cpp index 2adfa1f..c11c10a 100644 --- a/zx_screen.cpp +++ b/zx_screen.cpp @@ -3,6 +3,9 @@ #include "zx_ula.h" #include #include "zx_tape.h" +#include "ui_window.h" +#include "z80debug.h" +#include "ui.h" namespace zxscreen { @@ -85,8 +88,50 @@ namespace zxscreen //printf("COUNT: %i\n", count); } + bool eventHandler(SDL_Event *e) + { + if ((e->type==SDL_WINDOWEVENT) && (e->window.event==SDL_WINDOWEVENT_CLOSE)) { + return false; + } + if (!z80debug::debugging()) { + if (z80debug::paused()) { + if (e->type == SDL_KEYDOWN) { + if (e->key.keysym.scancode==SDL_SCANCODE_ESCAPE) { + const uint8_t dt = z80::step(); + z80debug::cont(); + zxscreen::refresh(dt); + } + } + } else { + if (e->type == SDL_KEYDOWN) { + if (e->key.keysym.scancode==SDL_SCANCODE_ESCAPE) { + z80debug::pause(); + ui::setrenderer(zxscreen::getrenderer()); + zxscreen::redraw(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F1) { + zxscreen::decZoom(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F2) { + zxscreen::incZoom(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F3) { + zxscreen::toggleFullscreen(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F8) { + z80debug::stop(); + zxscreen::redraw(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F12) { + zx_tape::play(); + } else if (e->key.keysym.scancode==SDL_SCANCODE_F11) { + zx_tape::rewind(); + } + } + } + } + return true; + } + void reinit() { + if (win) ui::window::unregisterWindow(SDL_GetWindowID(win)); + if (tex) SDL_DestroyTexture(tex); if (ren) SDL_DestroyRenderer(ren); if (win) SDL_DestroyWindow(win); @@ -96,6 +141,8 @@ namespace zxscreen ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 352, 296); + ui::window::registerWindow(SDL_GetWindowID(win), eventHandler); + if (fullscreen) { int w, h;