More magic number work in CGA

This commit is contained in:
Jasmine Iwanek
2025-06-20 19:06:48 -04:00
parent 527ed8e365
commit 3dbc4bb771

View File

@@ -48,8 +48,10 @@
#define DOUBLE_INTERPOLATE_SRGB 2
#define DOUBLE_INTERPOLATE_LINEAR 3
typedef union
{
#define DEVICE_VRAM 0x4000
#define DEVICE_VRAM_MASK 0x3fff
typedef union {
uint32_t color;
struct {
uint8_t b;
@@ -206,11 +208,11 @@ cga_write(uint32_t addr, uint8_t val, void *priv)
{
cga_t *cga = (cga_t *) priv;
cga->vram[addr & 0x3fff] = val;
cga->vram[addr & DEVICE_VRAM_MASK] = val;
if (cga->snow_enabled) {
int offset = ((timer_get_remaining_u64(&cga->timer) / CGACONST) * 2) & 0xfc;
cga->charbuffer[offset] = cga->vram[addr & 0x3fff];
cga->charbuffer[offset | 1] = cga->vram[addr & 0x3fff];
cga->charbuffer[offset] = cga->vram[addr & DEVICE_VRAM_MASK];
cga->charbuffer[offset | 1] = cga->vram[addr & DEVICE_VRAM_MASK];
}
cga_waitstates(cga);
}
@@ -223,10 +225,10 @@ cga_read(uint32_t addr, void *priv)
cga_waitstates(cga);
if (cga->snow_enabled) {
int offset = ((timer_get_remaining_u64(&cga->timer) / CGACONST) * 2) & 0xfc;
cga->charbuffer[offset] = cga->vram[addr & 0x3fff];
cga->charbuffer[offset | 1] = cga->vram[addr & 0x3fff];
cga->charbuffer[offset] = cga->vram[addr & DEVICE_VRAM_MASK];
cga->charbuffer[offset | 1] = cga->vram[addr & DEVICE_VRAM_MASK];
}
return cga->vram[addr & 0x3fff];
return cga->vram[addr & DEVICE_VRAM_MASK];
}
void
@@ -253,7 +255,7 @@ cga_recalctimings(cga_t *cga)
static void
cga_render(cga_t *cga, int line)
{
uint16_t cursoraddr = (cga->crtc[CGA_CRTC_CURSOR_ADDR_LOW] | (cga->crtc[CGA_CRTC_CURSOR_ADDR_HIGH] << 8)) & 0x3fff;
uint16_t cursoraddr = (cga->crtc[CGA_CRTC_CURSOR_ADDR_LOW] | (cga->crtc[CGA_CRTC_CURSOR_ADDR_HIGH] << 8)) & DEVICE_VRAM_MASK;
int drawcursor;
int x;
int column;
@@ -313,8 +315,8 @@ cga_render(cga_t *cga, int line)
} else if (!(cga->cgamode & CGA_MODE_FLAG_GRAPHICS)) {
for (x = 0; x < cga->crtc[CGA_CRTC_HDISP]; x++) {
if (cga->cgamode & CGA_MODE_FLAG_VIDEO_ENABLE) {
chr = cga->vram[(cga->memaddr << 1) & 0x3fff];
attr = cga->vram[((cga->memaddr << 1) + 1) & 0x3fff];
chr = cga->vram[(cga->memaddr << 1) & DEVICE_VRAM_MASK];
attr = cga->vram[((cga->memaddr << 1) + 1) & DEVICE_VRAM_MASK];
} else
chr = attr = 0;
drawcursor = ((cga->memaddr == cursoraddr) && cga->cursorvisible && cga->cursoron);
@@ -605,7 +607,7 @@ cga_poll(void *priv)
cga->vadj--;
if (!cga->vadj) {
cga->cgadispon = 1;
cga->memaddr = cga->memaddr_backup = (cga->crtc[CGA_CRTC_START_ADDR_LOW] | (cga->crtc[CGA_CRTC_START_ADDR_HIGH] << 8)) & 0x3fff;
cga->memaddr = cga->memaddr_backup = (cga->crtc[CGA_CRTC_START_ADDR_LOW] | (cga->crtc[CGA_CRTC_START_ADDR_HIGH] << 8)) & DEVICE_VRAM_MASK;
cga->scanline = 0;
}
} else if (cga->scanline == cga->crtc[CGA_CRTC_MAX_SCANLINE_ADDR]) {
@@ -623,7 +625,7 @@ cga_poll(void *priv)
cga->vadj = cga->crtc[CGA_CRTC_VTOTAL_ADJUST];
if (!cga->vadj) {
cga->cgadispon = 1;
cga->memaddr = cga->memaddr_backup = (cga->crtc[CGA_CRTC_START_ADDR_LOW] | (cga->crtc[CGA_CRTC_START_ADDR_HIGH] << 8)) & 0x3fff;
cga->memaddr = cga->memaddr_backup = (cga->crtc[CGA_CRTC_START_ADDR_LOW] | (cga->crtc[CGA_CRTC_START_ADDR_HIGH] << 8)) & DEVICE_VRAM_MASK;
}
switch (cga->crtc[CGA_CRTC_CURSOR_START] & 0x60) {
@@ -728,7 +730,7 @@ cga_poll(void *priv)
cga->cursorvisible = 1;
if (cga->cgadispon && (cga->cgamode & CGA_MODE_FLAG_HIGHRES)) {
for (x = 0; x < (cga->crtc[CGA_CRTC_HDISP] << 1); x++)
cga->charbuffer[x] = cga->vram[((cga->memaddr << 1) + x) & 0x3fff];
cga->charbuffer[x] = cga->vram[((cga->memaddr << 1) + x) & DEVICE_VRAM_MASK];
}
}
}
@@ -754,7 +756,7 @@ cga_standalone_init(UNUSED(const device_t *info))
cga->revision = device_get_config_int("composite_type");
cga->snow_enabled = device_get_config_int("snow_enabled");
cga->vram = malloc(0x4000);
cga->vram = malloc(DEVICE_VRAM);
cga_comp_init(cga->revision);
timer_add(&cga->timer, cga_poll, cga, 1);