- [NEW] Adaptat zx_screen per a que reba el offset en memoria on està la memòria de video, per a ser mes modular. Pero crec que les diferencies en el timing van a fer necessari un modul nou per a cada spectrum. Ja vorem quan estiga mes descansat.

This commit is contained in:
2024-12-19 22:33:58 +01:00
parent 68843ab6b3
commit 4a0e2b3b7d
3 changed files with 16 additions and 5 deletions

View File

@@ -81,7 +81,7 @@ int main(int argc, char *argv[])
SDL_Init(SDL_INIT_EVERYTHING); SDL_Init(SDL_INIT_EVERYTHING);
z80debug::init(); z80debug::init();
zxscreen::init(); zxscreen::init(0x4000, 0x5800);
ui::menu::init(); ui::menu::init();
ui::menu::setexitcallback(actions::exitMenu); ui::menu::setexitcallback(actions::exitMenu);

View File

@@ -33,6 +33,9 @@ namespace zxscreen
int pixels_draw = 0; int pixels_draw = 0;
uint16_t pixel_base_addr = 0x4000;
uint16_t color_base_addr = 0x5800;
uint16_t pixel_addr[69888]; uint16_t pixel_addr[69888];
uint16_t color_addr[69888]; uint16_t color_addr[69888];
uint8_t zx_pixels[352*296]; uint8_t zx_pixels[352*296];
@@ -175,8 +178,15 @@ namespace zxscreen
focus(); focus();
} }
void init() void setBaseAddresses(const uint16_t pixeladdr, const uint16_t coloraddr)
{ {
pixel_base_addr = pixeladdr;
color_base_addr = coloraddr;
}
void init(const uint16_t pixeladdr, const uint16_t coloraddr)
{
setBaseAddresses(pixeladdr, coloraddr);
create_tables(); create_tables();
reinit(); reinit();
} }
@@ -203,13 +213,13 @@ namespace zxscreen
*(ptr_pixel++) = border_color; *(ptr_pixel++) = border_color;
*(ptr_pixel++) = border_color; *(ptr_pixel++) = border_color;
} else { } else {
uint8_t color = z80mem::get()->readMem(0x5800+color_addr[t_screen]); uint8_t color = z80mem::get()->readMem(color_base_addr + color_addr[t_screen]);
uint8_t c1 = color&0x7, c2 = (color>>3)&0x7; uint8_t c1 = color&0x7, c2 = (color>>3)&0x7;
if ((color&0x80) && flash) { c1=c2; c2=color&0x7; } if ((color&0x80) && flash) { c1=c2; c2=color&0x7; }
if ((color&0x40)) { c1 |= 0x8; c2 |= 0x8; } if ((color&0x40)) { c1 |= 0x8; c2 |= 0x8; }
uint16_t address = /*(0x4000) |*/ (pixel_addr[t_screen]&0x1FFF); uint16_t address = /*(0x4000) |*/ (pixel_addr[t_screen]&0x1FFF);
uint8_t mask = 1 << (pixel_addr[t_screen]>>13); uint8_t mask = 1 << (pixel_addr[t_screen]>>13);
uint8_t block = z80mem::get()->readMem(0x4000 + address); uint8_t block = z80mem::get()->readMem(pixel_base_addr + address);
*(ptr_pixel++)=(block&mask) ? c1 : c2; *(ptr_pixel++)=(block&mask) ? c1 : c2;
mask>>=1; mask>>=1;
*(ptr_pixel++)=(block&mask) ? c1 : c2; *(ptr_pixel++)=(block&mask) ? c1 : c2;

View File

@@ -3,7 +3,8 @@
namespace zxscreen namespace zxscreen
{ {
void init(); void init(const uint16_t pixeladdr, const uint16_t coloraddr);
void setBaseAddresses(const uint16_t pixeladdr, const uint16_t coloraddr);
void reinit(); void reinit();
void focus(); void focus();
void refresh(const uint32_t dt, const bool full=false); void refresh(const uint32_t dt, const bool full=false);