Potential fix for MS OS/2.

This commit is contained in:
OBattler
2025-05-17 06:18:48 +02:00
parent f7c2728582
commit 45316f9be0

View File

@@ -135,7 +135,10 @@ compaq_plasma_write(uint32_t addr, uint8_t val, void *priv)
{ {
compaq_plasma_t *self = (compaq_plasma_t *) priv; compaq_plasma_t *self = (compaq_plasma_t *) priv;
self->cga.vram[addr & 0x7fff] = val; if (self->port_23c6 & 0x08)
self->font_ram[addr & 0x1fff] = val;
else
self->cga.vram[addr & 0x7fff] = val;
compaq_plasma_waitstates(&self->cga); compaq_plasma_waitstates(&self->cga);
} }
@@ -146,29 +149,11 @@ compaq_plasma_read(uint32_t addr, void *priv)
uint8_t ret; uint8_t ret;
compaq_plasma_waitstates(&self->cga); compaq_plasma_waitstates(&self->cga);
ret = (self->cga.vram[addr & 0x7fff]);
return ret; if (self->port_23c6 & 0x08)
} ret = (self->font_ram[addr & 0x1fff]);
else
static void ret = (self->cga.vram[addr & 0x7fff]);
compaq_plasma_font_write(uint32_t addr, uint8_t val, void *priv)
{
compaq_plasma_t *self = (compaq_plasma_t *) priv;
addr &= 0x1fff;
self->font_ram[addr] = val;
}
static uint8_t
compaq_plasma_font_read(uint32_t addr, void *priv)
{
compaq_plasma_t *self = (compaq_plasma_t *) priv;
uint8_t ret = 0x00;
addr &= 0x1fff;
ret = self->font_ram[addr];
return ret; return ret;
} }
@@ -203,18 +188,20 @@ compaq_plasma_out(uint16_t addr, uint8_t val, void *priv)
case 0x13c6: case 0x13c6:
self->port_13c6 = val; self->port_13c6 = val;
compaq_plasma_display_set((self->port_13c6 & 0x08) ? 1 : 0); compaq_plasma_display_set((self->port_13c6 & 0x08) ? 1 : 0);
/*
For bits 2-0, John gives 0 = CGA, 1 = EGA, 3 = MDA;
Another source (Ralf Brown?) gives 4 = CGA, 5 = EGA, 7 = MDA;
This leads me to believe bit 2 is not relevant to the mode.
*/
if ((val & 0x03) == 0x03)
mem_mapping_set_addr(&self->cga.mapping, 0xb0000, 0x08000);
else
mem_mapping_set_addr(&self->cga.mapping, 0xb8000, 0x08000);
break; break;
case 0x23c6: case 0x23c6:
self->port_23c6 = val; self->port_23c6 = val;
pclog("Write 23c6=%02x.\n", val); pclog("Write 23c6=%02x.\n", val);
if (val & 0x08) { /* Disable internal CGA */
mem_mapping_disable(&self->cga.mapping);
mem_mapping_enable(&self->font_ram_mapping);
} else {
mem_mapping_enable(&self->cga.mapping);
mem_mapping_disable(&self->font_ram_mapping);
}
compaq_plasma_recalcattrs(self); compaq_plasma_recalcattrs(self);
break; break;
@@ -725,6 +712,15 @@ compaq_plasma_recalcattrs(compaq_plasma_t *self)
} }
} }
void
compaq_dump(void)
{
FILE *f = fopen("d:\\86boxnew\\compaq_plasma_vram.dmp", "wb");
for (int i = 0; i < 65536; i++)
fputc(mem_readb_phys(0x000b0000 + i), f);
fclose(f);
}
static void * static void *
compaq_plasma_init(UNUSED(const device_t *info)) compaq_plasma_init(UNUSED(const device_t *info))
{ {
@@ -744,8 +740,10 @@ compaq_plasma_init(UNUSED(const device_t *info))
timer_set_callback(&self->cga.timer, compaq_plasma_poll); timer_set_callback(&self->cga.timer, compaq_plasma_poll);
timer_set_p(&self->cga.timer, self); timer_set_p(&self->cga.timer, self);
mem_mapping_add(&self->cga.mapping, 0xb8000, 0x08000, compaq_plasma_read, NULL, NULL, compaq_plasma_write, NULL, NULL, NULL, MEM_MAPPING_EXTERNAL, self); mem_mapping_add(&self->cga.mapping, 0xb8000, 0x08000,
mem_mapping_add(&self->font_ram_mapping, 0xb8000, 0x02000, compaq_plasma_font_read, NULL, NULL, compaq_plasma_font_write, NULL, NULL, NULL, MEM_MAPPING_EXTERNAL, self); compaq_plasma_read, NULL, NULL,
compaq_plasma_write, NULL, NULL,
NULL, MEM_MAPPING_EXTERNAL, self);
for (int i = 1; i <= 2; i++) { for (int i = 1; i <= 2; i++) {
io_sethandler(0x03c6 + (i << 12), 0x0001, compaq_plasma_in, NULL, NULL, compaq_plasma_out, NULL, NULL, self); io_sethandler(0x03c6 + (i << 12), 0x0001, compaq_plasma_in, NULL, NULL, compaq_plasma_out, NULL, NULL, self);
io_sethandler(0x07c6 + (i << 12), 0x0001, compaq_plasma_in, NULL, NULL, compaq_plasma_out, NULL, NULL, self); io_sethandler(0x07c6 + (i << 12), 0x0001, compaq_plasma_in, NULL, NULL, compaq_plasma_out, NULL, NULL, self);
@@ -768,6 +766,8 @@ compaq_plasma_close(void *priv)
{ {
compaq_plasma_t *self = (compaq_plasma_t *) priv; compaq_plasma_t *self = (compaq_plasma_t *) priv;
compaq_dump();
free(self->cga.vram); free(self->cga.vram);
free(self->font_ram); free(self->font_ram);
free(self); free(self);