99 lines
3.4 KiB
C
99 lines
3.4 KiB
C
#include "ibm.h"
|
|
#include "acc2036.h"
|
|
#include "io.h"
|
|
#include "mem.h"
|
|
|
|
static struct
|
|
{
|
|
int reg_idx;
|
|
uint8_t regs[256];
|
|
} acc2036;
|
|
|
|
static void acc2036_shadow_recalc()
|
|
{
|
|
if (acc2036.regs[0x2c] & 8)
|
|
{
|
|
switch (acc2036.regs[0x22] & 3)
|
|
{
|
|
case 0:
|
|
mem_set_mem_state(0xf0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
|
break;
|
|
case 1:
|
|
mem_set_mem_state(0xf0000, 0x10000, MEM_READ_INTERNAL | MEM_WRITE_EXTERNAL);
|
|
break;
|
|
case 2:
|
|
mem_set_mem_state(0xf0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_INTERNAL);
|
|
break;
|
|
case 3:
|
|
mem_set_mem_state(0xf0000, 0x10000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
mem_set_mem_state(0xf0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
|
|
|
if (acc2036.regs[0x2c] & 4)
|
|
{
|
|
switch (acc2036.regs[0x22] & 3)
|
|
{
|
|
case 0:
|
|
mem_set_mem_state(0xe0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
|
break;
|
|
case 1:
|
|
mem_set_mem_state(0xe0000, 0x10000, MEM_READ_INTERNAL | MEM_WRITE_EXTERNAL);
|
|
break;
|
|
case 2:
|
|
mem_set_mem_state(0xe0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_INTERNAL);
|
|
break;
|
|
case 3:
|
|
mem_set_mem_state(0xe0000, 0x10000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
mem_set_mem_state(0xe0000, 0x10000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
|
}
|
|
|
|
static void acc2036_write(uint16_t addr, uint8_t val, void *p)
|
|
{
|
|
if (!(addr & 1))
|
|
acc2036.reg_idx = val;
|
|
else
|
|
{
|
|
acc2036.regs[acc2036.reg_idx] = val;
|
|
// pclog("Write ACC2036 R%02x %02x %04x:%04x %i\n", acc2036.reg_idx, val, CS,cpu_state.pc, ins);
|
|
|
|
switch (acc2036.reg_idx)
|
|
{
|
|
case 0x22:
|
|
case 0x2c:
|
|
acc2036_shadow_recalc();
|
|
break;
|
|
|
|
case 0x23:
|
|
mem_mapping_disable(&ram_remapped_mapping);
|
|
if (val & 0x10)
|
|
{
|
|
if (acc2036.regs[0x2c] & 0xc)
|
|
mem_remap_top_256k();
|
|
else
|
|
mem_remap_top_384k();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static uint8_t acc2036_read(uint16_t addr, void *p)
|
|
{
|
|
if (!(addr & 1))
|
|
return acc2036.reg_idx;
|
|
|
|
return acc2036.regs[acc2036.reg_idx];
|
|
}
|
|
|
|
void acc2036_init()
|
|
{
|
|
memset(&acc2036, 0, sizeof(acc2036));
|
|
io_sethandler(0x00f2, 0x0002, acc2036_read, NULL, NULL, acc2036_write, NULL, NULL, NULL);
|
|
}
|