#include "z80debug.h" #include #include "z80.h" #include "z80dis.h" namespace z80debug { #define CHR_W 6 #define CHR_H 13 #define COLOR_BLACK 0 #define COLOR_DARK_BLUE 1 #define COLOR_GREEN 2 #define COLOR_TEAL 3 #define COLOR_BROWN 4 #define COLOR_PURPLE 5 #define COLOR_ORANGE 6 #define COLOR_GRAY 7 #define COLOR_DARK 8 #define COLOR_BLUE 9 #define COLOR_LIME 10 #define COLOR_CYAN 11 #define COLOR_RED 12 #define COLOR_MAGENTA 13 #define COLOR_YELLOW 14 #define COLOR_WHITE 15 uint8_t colors[16][3] = { {0,0,0}, {0,0,128}, {0,128,0}, {0,128,128}, {128,0,0}, {128,0,128}, {255,128,0}, {128,128,128}, {30,30,30}, {0,0,255}, {0,255,0}, {0,255,255}, {255,0,0}, {255,0,255}, {255,255,0}, {255,255,255}, }; uint8_t offset_x = 0; uint8_t offset_y = 0; SDL_Window *win = nullptr; SDL_Renderer *ren = nullptr; SDL_Texture *tex = nullptr; uint16_t mem_viewer_pos = 0; char temp[256]; const char *tohex(int value, int numdigits) { if (numdigits==2) sprintf(temp, "%02X", value); else if (numdigits==4) sprintf(temp, "%04X", value); return temp; } void show() { if (win) return; win = SDL_CreateWindow("Z80 Debugger", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 71*CHR_W, 28*CHR_H, SDL_WINDOW_SHOWN); ren = SDL_CreateRenderer(win, -1, 0); tex = SDL_CreateTextureFromSurface(ren, SDL_LoadBMP("font.bmp")); SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_BLEND); z80debug::refresh(); } void box(int x, int y, int w, int h, uint8_t color) { SDL_Rect rect {((offset_x+x)*CHR_W)+3, ((offset_y+y)*CHR_H)+6, w*CHR_W-6, h*CHR_H-13}; SDL_SetRenderDrawColor(ren, colors[color][0], colors[color][1], colors[color][2], 255); SDL_RenderDrawRect(ren, &rect); } void printrect(int x, int y, int w, int h, uint8_t color) { SDL_Rect rect {(offset_x+x)*CHR_W, (offset_y+y)*CHR_H, w*CHR_W, h*CHR_H}; SDL_SetRenderDrawColor(ren, colors[color][0], colors[color][1], colors[color][2], 255); SDL_RenderFillRect(ren, &rect); } void printchar(int x, int y, char chr, uint8_t color=255) { if (color != 255) SDL_SetRenderDrawColor(ren, colors[color][0], colors[color][1], colors[color][2], 255); if (chr==32) return; if (chr<32 || chr>127) chr = '.'; SDL_Rect src {((chr-32)&0xf)*CHR_W, ((chr-32)>>4)*CHR_H, CHR_W, CHR_H}; SDL_Rect dst {(offset_x+x)*CHR_W, (offset_y+y)*CHR_H, CHR_W, CHR_H}; SDL_RenderCopy(ren, tex, &src, &dst); } void printtxt(int x, int y, const char *text, uint8_t color) { SDL_SetTextureColorMod(tex, colors[color][0], colors[color][1], colors[color][2]); for (int i=0; i=0;--i) { pos = find_previous_opcode(pos); printtxt(1,i,tohex(pos,4), COLOR_CYAN); printtxt(7,i, z80dis::getOpcode(&memory[pos]), COLOR_GRAY); printtxt(19,i, z80dis::getAsm(&memory[pos]), COLOR_WHITE); } //for (int i=0;i<20;++i) printtxt(1,i,tohex(pc,4), COLOR_CYAN); offset_x = offset_y = 0; box(46,0,25,8,COLOR_WHITE); printrect(48,0, 12,1, COLOR_DARK); printtxt(49,0, "REGISTERS:", COLOR_WHITE); offset_x=47; offset_y=1; printtxt(0,0, "AF AF' IX ", COLOR_WHITE); printtxt(0,1, "BC BC' IY ", COLOR_WHITE); printtxt(0,2, "DE DE' SP ", COLOR_WHITE); printtxt(0,3, "HL HL' PC ", COLOR_WHITE); printtxt(0,5, "(BC) (DE) (HL) ", COLOR_WHITE); printtxt(3,0, tohex(z80::getAF(), 4), COLOR_GRAY); printtxt(11,0, tohex(z80::getAF(true), 4), COLOR_GRAY); printtxt(19,0, tohex(z80::getIX(), 4), COLOR_GRAY); printtxt(3,1, tohex(z80::getBC(), 4), COLOR_GRAY); printtxt(11,1, tohex(z80::getBC(true), 4), COLOR_GRAY); printtxt(19,1, tohex(z80::getIY(), 4), COLOR_GRAY); printtxt(3,2, tohex(z80::getDE(), 4), COLOR_GRAY); printtxt(11,2, tohex(z80::getDE(true), 4), COLOR_GRAY); printtxt(19,2, tohex(z80::getSP(), 4), COLOR_GRAY); printtxt(3,3, tohex(z80::getHL(), 4), COLOR_GRAY); printtxt(11,3, tohex(z80::getHL(true), 4), COLOR_GRAY); printtxt(19,3, tohex(z80::getPC(), 4), COLOR_GRAY); printtxt(5,5, tohex(memory[z80::getBC()], 2), COLOR_GRAY); printtxt(13,5, tohex(memory[z80::getDE()], 2), COLOR_GRAY); printtxt(21,5, tohex(memory[z80::getHL()], 2), COLOR_GRAY); offset_x=offset_y=0; box(0,20,71,8,COLOR_WHITE); printrect(2,20, 9,1, COLOR_DARK); printtxt(3,20, "MEMORY:", COLOR_WHITE); offset_x=1; offset_y=21; uint16_t mem_viewer_cursor = mem_viewer_pos; for (int i=0; i<6; ++i) { printtxt(0,i, tohex(mem_viewer_cursor, 4), COLOR_CYAN); for (int j=0; j<16; ++j) { printtxt(5+j*3, i, tohex(memory[mem_viewer_cursor++],2), COLOR_WHITE); printchar(53+j, i, memory[mem_viewer_cursor++], COLOR_GRAY); } //printtxt(5,0, "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", COLOR_WHITE); //printtxt(53,0, "0123456789AB\tDEF", COLOR_GRAY); } SDL_RenderPresent(ren); } }