This commit is contained in:
Akamaki
2025-02-15 23:25:57 +09:00
parent 5f831603e9
commit 0a7c329405

View File

@@ -145,7 +145,7 @@ static struct ps2_t {
static uint8_t ps2_cache[65536]; static uint8_t ps2_cache[65536];
static int ps2_cache_valid[65536 / 8]; static int ps2_cache_valid[65536 / 8];
static void mem_encoding_update(void); static void mem_encoding_update(void);
#define ENABLE_PS2_MCA_LOG 1
#ifdef ENABLE_PS2_MCA_LOG #ifdef ENABLE_PS2_MCA_LOG
int ps2_mca_do_log = ENABLE_PS2_MCA_LOG; int ps2_mca_do_log = ENABLE_PS2_MCA_LOG;
@@ -367,53 +367,59 @@ static uint8_t
ps55_model_50t_read(uint16_t port) ps55_model_50t_read(uint16_t port)
{ {
ps2_mca_log(" Read SysBrd %04X xx %04X:%04X\n", port, cs >> 4, cpu_state.pc); ps2_mca_log(" Read SysBrd %04X xx %04X:%04X\n", port, cs >> 4, cpu_state.pc);
switch (port) switch (port) {
{ case 0x100:
case 0x100: return ps2.planar_id & 0xff;
return ps2.planar_id & 0xff; case 0x101:
case 0x101: return ps2.planar_id >> 8;
return ps2.planar_id >> 8; case 0x102:
case 0x102: return ps2.option[0];
return ps2.option[0]; case 0x103:
case 0x103: uint8_t val = 0xff;
uint8_t val = 0xff; /*
/* I/O 103h - Bit 7-4: Memory Card ID (Connector 1 or 3)
I/O 103h - Bit 7-4: Memory Card ID (Connector 1 or 3) Bit 3-0: Memory Card ID (Connector 2)
Bit 3-0: Memory Card ID (Connector 2)
Memory Card ID: 7h = 2 MB Memory Card 2 or 3 Installed Memory Card ID: 7h = 2 MB Memory Card 2 or 3 Installed
5h = 4 MB Memory Card 2 Installed 5h = 4 MB Memory Card 2 Installed
*/ */
switch (mem_size / 1024) switch (mem_size / 1024) {
{ case 2:
case 2: if (ps2.option[1] & 0x04)
if (ps2.option[1] & 0x04) val = 0xff; val = 0xff;
else val = 0x7f; else
break; val = 0x7f;
case 4: break;
if (ps2.option[1] & 0x04) val = 0xff; case 4:
else val = 0x77; if (ps2.option[1] & 0x04)
break; val = 0xff;
case 6: else
if (ps2.option[1] & 0x04) val = 0x7f; val = 0x77;
else val = 0x77; break;
break; case 6:
case 8: if (ps2.option[1] & 0x04)
default: val = 0x7f;
if (ps2.option[1] & 0x04) val = 0x5f; else
else val = 0x77; val = 0x77;
break; break;
} case 8:
ps2_mca_log(" Read MCA %04X %02X %04X:%04X mem_size = %d, ps2option1 = %2X\n", port, val, cs >> 4, cpu_state.pc, mem_size, ps2.option[1]); default:
return val; if (ps2.option[1] & 0x04)
case 0x104: val = 0x5f;
return ps2.option[2]; else
case 0x105: val = 0x77;
return ps2.option[3]; break;
case 0x106: }
return ps2.subaddr_lo; ps2_mca_log(" Read MCA %04X %02X %04X:%04X mem_size = %d, ps2option1 = %2X\n", port, val, cs >> 4, cpu_state.pc, mem_size, ps2.option[1]);
case 0x107: return val;
return ps2.subaddr_hi; case 0x104:
return ps2.option[2];
case 0x105:
return ps2.option[3];
case 0x106:
return ps2.subaddr_lo;
case 0x107:
return ps2.subaddr_hi;
} }
return 0xff; return 0xff;
} }
@@ -421,44 +427,47 @@ ps55_model_50t_read(uint16_t port)
static uint8_t static uint8_t
ps55_model_50v_read(uint16_t port) ps55_model_50v_read(uint16_t port)
{ {
switch (port) switch (port) {
{ case 0x100:
case 0x100: return ps2.planar_id & 0xff;
return ps2.planar_id & 0xff; case 0x101:
case 0x101: return ps2.planar_id >> 8;
return ps2.planar_id >> 8; case 0x102:
case 0x102: return ps2.option[0];
return ps2.option[0]; case 0x103:
case 0x103: uint8_t val = 0xff;
uint8_t val = 0xff; /*
/* I/O 103h - Bit 7-4: Reserved
I/O 103h - Bit 7-4: Reserved Bit 3-0: Memory Card ID (Connector 3 or 1)
Bit 3-0: Memory Card ID (Connector 3 or 1)
Memory Card ID: 8h = 4 MB Memory Card IV Installed Memory Card ID: 8h = 4 MB Memory Card IV Installed
Fh = No Card Installed Fh = No Card Installed
*/ */
switch (mem_size / 1024) switch (mem_size / 1024) {
{ case 4:
case 4: if (ps2.option[1] & 0x04)
if (ps2.option[1] & 0x04) val = 0xff; val = 0xff;
else val = 0xf8; else
break; val = 0xf8;
case 8: break;
default: case 8:
if (ps2.option[1] & 0x04) val = 0xf8; default:
else val = 0xf8; if (ps2.option[1] & 0x04)
break; val = 0xf8;
} else
return val; val = 0xf8;
case 0x104: break;
return ps2.option[2] & 0xf3; }
case 0x105: return val;
return ps2.option[3]; case 0x104:
case 0x106: /* Reading cache ID (bit 3-2) always returns zero */
return ps2.subaddr_lo; return ps2.option[2] & 0xf3;
case 0x107: case 0x105:
return ps2.subaddr_hi; return ps2.option[3];
case 0x106:
return ps2.subaddr_lo;
case 0x107:
return ps2.subaddr_hi;
} }
return 0xff; return 0xff;
} }
@@ -763,71 +772,66 @@ static void
ps55_model_50tv_write(uint16_t port, uint8_t val) ps55_model_50tv_write(uint16_t port, uint8_t val)
{ {
ps2_mca_log(" Write SysBrd %04X %02X %04X:%04X\n", port, val, cs >> 4, cpu_state.pc); ps2_mca_log(" Write SysBrd %04X %02X %04X:%04X\n", port, val, cs >> 4, cpu_state.pc);
switch (port) switch (port) {
{ case 0x102:
case 0x102: lpt1_remove();
lpt1_remove(); serial_remove(ps2.uart);
serial_remove(ps2.uart); if (val & 0x04) {
if (val & 0x04) if (val & 0x08)
{ serial_setup(ps2.uart, COM1_ADDR, COM1_IRQ);
if (val & 0x08) else
serial_setup(ps2.uart, COM1_ADDR, COM1_IRQ); serial_setup(ps2.uart, COM2_ADDR, COM2_IRQ);
else
serial_setup(ps2.uart, COM2_ADDR, COM2_IRQ);
}
if (val & 0x10)
{
switch ((val >> 5) & 3)
{
case 0:
lpt1_setup(LPT_MDA_ADDR);
break;
case 1:
lpt1_setup(LPT1_ADDR);
break;
case 2:
lpt1_setup(LPT2_ADDR);
break;
default:
break;
} }
} if (val & 0x10) {
ps2.option[0] = val; switch ((val >> 5) & 3) {
break; case 0:
case 0x103: lpt1_setup(LPT_MDA_ADDR);
ps2.option[1] = val; break;
break; case 1:
case 0x104: lpt1_setup(LPT1_ADDR);
if ((ps2.option[2] ^ val) & 1) { break;
mem_encoding_update(); case 2:
if (val & 1)/* Disable E0000 - E0FFF(Make 2 KB hole for Display Adapter) */ lpt1_setup(LPT2_ADDR);
{ break;
ps2_mca_log("ROM E0000-E0FFF is disabled.\n"); default:
//mem_mapping_set_addr(&bios_mapping 0xe1000, 0x1f000); break;
mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); }
//mem_mapping_disable(&bios_mapping[0]);
} }
else/* Enable E0000 - E0FFF for BIOS */ ps2.option[0] = val;
{ break;
ps2_mca_log("ROM E0000-E0FFF is enabled.\n"); case 0x103:
//mem_mapping_set_addr(&bios_mapping 0xe0000, 0x20000); ps2.option[1] = val;
//mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_DISABLED); break;
//mem_mapping_enable(&bios_mapping[0]); case 0x104:
if ((ps2.option[2] ^ val) & 1) {
mem_encoding_update();
if (val & 1) {
/* Disable E0000 - E0FFF (Make 2 KB hole for Display Adapter) */
ps2_mca_log("ROM E0000-E0FFF is disabled.\n");
// mem_mapping_set_addr(&bios_mapping 0xe1000, 0x1f000);
mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
// mem_mapping_disable(&bios_mapping[0]);
} else {
/* Enable E0000 - E0FFF for BIOS */
ps2_mca_log("ROM E0000-E0FFF is enabled.\n");
// mem_mapping_set_addr(&bios_mapping 0xe0000, 0x20000);
// mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_DISABLED);
// mem_mapping_enable(&bios_mapping[0]);
}
} }
} ps2.option[2] = val;
ps2.option[2] = val; break;
break; case 0x105:
case 0x105: ps2.option[3] = val;
ps2.option[3] = val; break;
break; case 0x106:
case 0x106: ps2.subaddr_lo = val;
ps2.subaddr_lo = val; break;
break; case 0x107:
case 0x107: ps2.subaddr_hi = val;
ps2.subaddr_hi = val; break;
break; default:
default: break;
break;
} }
} }
@@ -1339,20 +1343,19 @@ static void
mem_encoding_write_ps55(uint16_t addr, uint8_t val, void* p) mem_encoding_write_ps55(uint16_t addr, uint8_t val, void* p)
{ {
//ps2_mca_log(" Write Memory Encoding %04X %02X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc); //ps2_mca_log(" Write Memory Encoding %04X %02X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
switch (addr) switch (addr) {
{ case 0xe0:
case 0xe0: ps2.mem_regs[0] = val;
ps2.mem_regs[0] = val; break;
break; case 0xe1:
case 0xe1: ps2.mem_regs[1] = val;
ps2.mem_regs[1] = val; break;
break; default:
default: break;
break;
} }
mem_encoding_update(); mem_encoding_update();
if (ps2.option[2] & 1) /* reset memstate for E0000 - E0FFFh hole */ if (ps2.option[2] & 1) {
{ /* reset memstate for E0000 - E0FFFh hole */
mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
} }
} }
@@ -1479,8 +1482,8 @@ mem_encoding_write_cached_ps55(uint16_t addr, uint8_t val, UNUSED(void *priv))
flushmmucache(); flushmmucache();
ps2_mca_log("mem_encoding_write: low ram mapping enabled\n"); ps2_mca_log("mem_encoding_write: low ram mapping enabled\n");
} }
if (ps2.option[2] & 1) /* reset memstate for E0000 - E0FFFh hole */ if (ps2.option[2] & 1) {
{ /* reset memstate for E0000 - E0FFFh hole */
mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
} }
} }
@@ -1845,7 +1848,6 @@ ps55_mca_board_model_50t_init()
{ {
ps2_mca_board_common_init(); ps2_mca_board_common_init();
//mem_remap_top(256);
ps2.split_addr = mem_size * 1024; ps2.split_addr = mem_size * 1024;
/* The slot 5 is reserved for the Integrated Fixed Disk II (an internal ESDI hard drive). */ /* The slot 5 is reserved for the Integrated Fixed Disk II (an internal ESDI hard drive). */
mca_init(5); mca_init(5);
@@ -1861,14 +1863,6 @@ ps55_mca_board_model_50t_init()
ps2.mem_regs[1] = 2; ps2.mem_regs[1] = 2;
ps2.option[2] &= 0xfe; /* Bit 0: Disable E0000-E0FFFh (4 KB) */ ps2.option[2] &= 0xfe; /* Bit 0: Disable E0000-E0FFFh (4 KB) */
//resize bios_mapping 0,1
//mem_mapping_set_addr(&bios_mapping[0], 0xe0000, 0x1000);
//mem_mapping_set_exec(&bios_mapping[0], rom + (0x20000 & biosmask));
//mem_mapping_set_addr(&bios_mapping[1], 0xe1000, 0x7000);
//mem_mapping_set_exec(&bios_mapping[1], rom + (0x21000 & biosmask));
//mem_mapping_add(&bios_mapping[0], 0xe0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x20000 & biosmask), MEM_MAPPING_EXTERNAL | MEM_MAPPING_ROM, 0);
//mem_mapping_add(&bios_mapping[1], 0xe4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x23000 & biosmask), MEM_MAPPING_EXTERNAL | MEM_MAPPING_ROM, 0);
mem_mapping_add(&ps2.split_mapping, mem_mapping_add(&ps2.split_mapping,
(mem_size + 256) * 1024, (mem_size + 256) * 1024,
256 * 1024, 256 * 1024,
@@ -1897,7 +1891,6 @@ ps55_mca_board_model_50v_init()
{ {
ps2_mca_board_common_init(); ps2_mca_board_common_init();
//mem_remap_top(256);
ps2.split_addr = mem_size * 1024; ps2.split_addr = mem_size * 1024;
/* The slot 5 is reserved for the Integrated Fixed Disk II (an internal ESDI hard drive). */ /* The slot 5 is reserved for the Integrated Fixed Disk II (an internal ESDI hard drive). */
mca_init(5); mca_init(5);