Potential fix for MS OS/2.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user