ISA memory cards: Implement EMS frame address recalculation.
This commit is contained in:
@@ -363,27 +363,24 @@ ems_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
dev->ems[vpage].enabled = (val & 0x80);
|
dev->ems[vpage].enabled = (val & 0x80);
|
||||||
dev->ems[vpage].page = (val & 0x7f);
|
dev->ems[vpage].page = (val & 0x7f);
|
||||||
|
|
||||||
/* Make sure we can do that.. */
|
if (dev->ems[vpage].page < dev->ems_pages) {
|
||||||
if (dev->flags & FLAG_CONFIG) {
|
/* Pre-calculate the page address in EMS RAM. */
|
||||||
if (dev->ems[vpage].page < dev->ems_pages) {
|
dev->ems[vpage].addr = dev->ram + dev->ems_start + ((val & 0x7f) * EMS_PGSIZE);
|
||||||
/* Pre-calculate the page address in EMS RAM. */
|
} else {
|
||||||
dev->ems[vpage].addr = dev->ram + dev->ems_start + ((val & 0x7f) * EMS_PGSIZE);
|
/* That page does not exist. */
|
||||||
} else {
|
dev->ems[vpage].enabled = 0;
|
||||||
/* That page does not exist. */
|
}
|
||||||
dev->ems[vpage].enabled = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->ems[vpage].enabled) {
|
if (dev->ems[vpage].enabled) {
|
||||||
/* Update the EMS RAM address for this page. */
|
/* Update the EMS RAM address for this page. */
|
||||||
mem_mapping_set_exec(&dev->ems[vpage].mapping,
|
mem_mapping_set_exec(&dev->ems[vpage].mapping,
|
||||||
dev->ems[vpage].addr);
|
dev->ems[vpage].addr);
|
||||||
|
|
||||||
/* Enable this page. */
|
/* Enable this page. */
|
||||||
mem_mapping_enable(&dev->ems[vpage].mapping);
|
mem_mapping_enable(&dev->ems[vpage].mapping);
|
||||||
} else {
|
} else {
|
||||||
/* Disable this page. */
|
/* Disable this page. */
|
||||||
mem_mapping_disable(&dev->ems[vpage].mapping);
|
mem_mapping_disable(&dev->ems[vpage].mapping);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -408,8 +405,13 @@ ems_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
*/
|
*/
|
||||||
isamem_log("EMS: write(%02x) to register 1 !\n");
|
isamem_log("EMS: write(%02x) to register 1 !\n");
|
||||||
dev->ems[vpage].frame = val;
|
dev->ems[vpage].frame = val;
|
||||||
if (val)
|
dev->frame_addr = 0x000c4000 + ((((dev->ems[2].frame & 0x80) >> 5) ||
|
||||||
dev->flags |= FLAG_CONFIG;
|
((dev->ems[1].frame & 0x80) >> 6) ||
|
||||||
|
((dev->ems[0].frame & 0x80) >> 7)) << 14);
|
||||||
|
mem_mapping_disable(&dev->ems[0].mapping);
|
||||||
|
mem_mapping_disable(&dev->ems[1].mapping);
|
||||||
|
mem_mapping_disable(&dev->ems[2].mapping);
|
||||||
|
mem_mapping_disable(&dev->ems[3].mapping);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user