- [NEW] ui::placetext() i ui::placechar, pa ficar text en qualsevol pixel

- [NEW] [Z80Analize] backspace esborra tots els tags
- [NEW] [zx-128bankviewer] Es mostra quina pàgina de memòria està asignada a cada bank
- [FIX] [zx_128mem] es filtra el port al que escolta la memòria
- [NEW] [zx_screen] Es mostra en quina pantalla estem (normal o shadow)
- [FIX] [zx_screen] tots els tipos per al calcul de adreces passats a uint32_t
- [NEW] [zx_ula] afegides combinacions de cursors per a major comoditat
This commit is contained in:
2025-07-22 13:31:21 +02:00
parent 4b4e1df8f9
commit 3fd28136f6
8 changed files with 85 additions and 10 deletions

16
ui.cpp
View File

@@ -88,6 +88,22 @@ namespace ui
for (int i=0; i<strlen(text);++i) if (text[i]!=32) printchar(x+i, y, text[i]);
}
void placechar(int x, int y, char chr, uint8_t color)
{
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 {x, y, CHR_W*2, CHR_H*2};
SDL_RenderCopy(ren, tex, &src, &dst);
}
void placetxt(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<strlen(text);++i) if (text[i]!=32) placechar(x+i*CHR_W*2, y, text[i]);
}
void setClicked(const bool value)
{
clicked = value;

3
ui.h
View File

@@ -33,6 +33,9 @@ namespace ui
void printchar(int x, int y, char chr, uint8_t color=255);
void printtxt(int x, int y, const char *text, uint8_t color);
void placechar(int x, int y, char chr, uint8_t color=255);
void placetxt(int x, int y, const char *text, uint8_t color);
void setClicked(const bool value);
const bool getClicked();
}

View File

@@ -54,7 +54,8 @@ namespace z80analyze
*/
} else if (e->key.keysym.scancode == SDL_SCANCODE_BACKSPACE) {
const uint32_t size = z80mem::get()->getSize();
for (int i=0; i<size; ++i) z80mem::get()->setTag(i, z80mem::get()->getTag(i) & ~MEMTAG_TOUCHED);
//for (int i=0; i<size; ++i) z80mem::get()->setTag(i, z80mem::get()->getTag(i) & ~MEMTAG_TOUCHED);
for (int i=0; i<size; ++i) z80mem::get()->setTag(i, MEMTAG_NONE);
refresh();
z80debug::refresh();
}

View File

@@ -1,14 +1,18 @@
#include "zx_128bankviewer.h"
#include "z80.h"
#include "z80mem.h"
#include "zx_128mem.h"
#include "ui.h"
//#include "ui_window.h"
void zx_128bankviewer::show()
{
if (!win)
{
win = SDL_CreateWindow("Z80 Analyzer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 128, 512, SDL_WINDOW_SHOWN);
win = SDL_CreateWindow("Z80 Bank Viewer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 128, 512, SDL_WINDOW_SHOWN);
ren = SDL_CreateRenderer(win, -1, 0);
tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 128, 512);
uitex = ui::createtexture(ren);
//ui::window::registerWindow(SDL_GetWindowID(win), handleEvent);
}
@@ -20,6 +24,8 @@ void zx_128bankviewer::refresh()
{
if (!win) return;
ui::setrenderer(ren, uitex);
Uint32 *pixels;
int pitch;
SDL_LockTexture(tex, NULL, (void**)&pixels, &pitch);
@@ -35,6 +41,18 @@ void zx_128bankviewer::refresh()
SDL_UnlockTexture(tex);
SDL_RenderCopy(ren, tex, NULL, NULL);
char temp[256];
zx_128mem* mem = ((zx_128mem*)z80mem::get());
sprintf(temp, "%u", mem->getPage(0));
ui::placetxt(1,1,temp, COLOR_WHITE);
sprintf(temp, "%u", mem->getPage(1));
ui::placetxt(1,129,temp, COLOR_WHITE);
sprintf(temp, "%u", mem->getPage(2));
ui::placetxt(1,257,temp, COLOR_WHITE);
sprintf(temp, "%u", mem->getPage(3));
ui::placetxt(1,385,temp, COLOR_WHITE);
SDL_RenderPresent(ren);
}

View File

@@ -22,6 +22,7 @@ zx_128mem::zx_128mem()
void zx_128mem::port_out(int port, int val)
{
if (port != 0x7ffd) return;
if (config & ZX_128MEM_DISPAG) return;
const bool shadow = config & ZX_128MEM_SCREEN;
config = val;
@@ -163,3 +164,26 @@ uint8_t *zx_128mem::rawTagPtr(uint32_t address)
{
return &tags[address];
}
uint8_t zx_128mem::getPage(uint8_t bank)
{
switch(bank) {
case 0:
return (config & ZX_128MEM_ROM) ? 1 : 0;
break;
case 1:
return 5;
break;
case 2:
return 2;
break;
case 3:
return config & ZX_128MEM_PAGE;
break;
}
}
bool zx_128mem::getShadowScreen()
{
return config & ZX_128MEM_SCREEN;
}

View File

@@ -28,6 +28,9 @@ class zx_128mem : public z80mem
uint8_t *rawPtr(uint32_t address);
uint8_t *rawTagPtr(uint32_t address);
uint8_t getPage(uint8_t bank);
bool getShadowScreen();
protected:
uint8_t config;

View File

@@ -7,6 +7,7 @@
#include "ui_window.h"
#include "z80debug.h"
#include "ui.h"
#include "zx_128mem.h"
namespace zxscreen
{
@@ -39,11 +40,11 @@ namespace zxscreen
int pixels_draw = 0;
uint16_t pixel_base_addr = 0x4000;
uint16_t color_base_addr = 0x5800;
uint32_t pixel_base_addr = 0x4000;
uint32_t color_base_addr = 0x5800;
uint16_t *pixel_addr = nullptr; //[69888];
uint16_t *color_addr = nullptr; //[69888];
uint32_t *pixel_addr = nullptr; //[69888];
uint32_t *color_addr = nullptr; //[69888];
uint8_t zx_pixels[352*296];
uint8_t *ptr_pixel = zx_pixels;
@@ -56,11 +57,11 @@ namespace zxscreen
if (pixel_addr) free(pixel_addr);
if (color_addr) free(color_addr);
pixel_addr = (uint16_t*)malloc(t_states_total*sizeof(uint16_t));
color_addr = (uint16_t*)malloc(t_states_total*sizeof(uint16_t));
pixel_addr = (uint32_t*)malloc(t_states_total*sizeof(uint32_t));
color_addr = (uint32_t*)malloc(t_states_total*sizeof(uint32_t));
uint16_t *ptr_pixel = pixel_addr;
uint16_t *ptr_color = color_addr;
uint32_t *ptr_pixel = pixel_addr;
uint32_t *ptr_color = color_addr;
// vsync
for (int i=0; i<t_states_per_scanline*vsync_lines;++i) { *(ptr_pixel++) = 0; *(ptr_color++) = SCREEN_SYNC; } // En el 128K 16 passa a ser 15 i 224 passa a ser 228
@@ -300,6 +301,9 @@ namespace zxscreen
// Pintem la textura a pantalla
SDL_RenderCopy(ren, tex, NULL, &dest_rect);
zx_128mem* mem = ((zx_128mem*)z80mem::get());
ui::printtxt(0,0,mem->getShadowScreen()?"SHADOW":"NORMAL", COLOR_WHITE);
if (present)
SDL_RenderPresent(ren);
else

View File

@@ -131,6 +131,12 @@ namespace zx_ula
// Keys in a normal keyboard that ara combinations in the zx one
if (keys[SDL_SCANCODE_BACKSPACE]) zx_keyboard[KEY_SHIFT] = zx_keyboard[KEY_0] = 1;
if (keys[SDL_SCANCODE_PERIOD]) zx_keyboard[KEY_SYMBOL] = zx_keyboard[KEY_M] = 1;
if (keys[SDL_SCANCODE_UP]) zx_keyboard[KEY_SHIFT] = zx_keyboard[KEY_7] = 1;
if (keys[SDL_SCANCODE_DOWN]) zx_keyboard[KEY_SHIFT] = zx_keyboard[KEY_6] = 1;
if (keys[SDL_SCANCODE_LEFT]) zx_keyboard[KEY_SHIFT] = zx_keyboard[KEY_5] = 1;
if (keys[SDL_SCANCODE_RIGHT]) zx_keyboard[KEY_SHIFT] = zx_keyboard[KEY_8] = 1;
}
int port_in(int port)