/*This is the Chips and Technologies C82100 chipset used in the Amstrad PC5086 model*/ #include "ibm.h" #include "io.h" #include "x86.h" #include "superxt.h" static uint8_t superxt_regs[256]; static int superxt_index; static int superxt_emspage[4]; void superxt_write(uint16_t port, uint8_t val, void *priv) { switch (port) { case 0x22: superxt_index = val; break; case 0x23: superxt_regs[superxt_index] = val; case 0x0208: case 0x4208: case 0x8208: case 0xC208: superxt_emspage[port >> 14] = val; break; // default: // pclog("%04X:%04X SUPERXT WRITE : %04X, %02X\n", CS, cpu_state.pc, port, val); } } uint8_t superxt_read(uint16_t port, void *priv) { switch (port) { case 0x22: return superxt_index; case 0x23: return superxt_regs[superxt_index]; case 0x0208: case 0x4208: case 0x8208: case 0xC208: return superxt_emspage[port >> 14]; // default: // pclog("%04X:%04X SUPERXT READ : %04X\n", CS, cpu_state.pc, port); } return 0xff; } void superxt_init() { /* Set register 0x42 to invalid configuration at startup */ superxt_regs[0x42] = 0; io_sethandler(0x0022, 0x0002, superxt_read, NULL, NULL, superxt_write, NULL, NULL, NULL); io_sethandler(0x0208, 0x0001, superxt_read, NULL, NULL, superxt_write, NULL, NULL, NULL); io_sethandler(0x4208, 0x0001, superxt_read, NULL, NULL, superxt_write, NULL, NULL, NULL); io_sethandler(0x8208, 0x0001, superxt_read, NULL, NULL, superxt_write, NULL, NULL, NULL); io_sethandler(0xc208, 0x0001, superxt_read, NULL, NULL, superxt_write, NULL, NULL, NULL); }