diff --git a/src/keyboard.h b/src/keyboard.h
index 388f29d10..289b1a40c 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -8,7 +8,7 @@
*
* Definitions for the keyboard interface.
*
- * Version: @(#)keyboard.h 1.0.13 2018/03/19
+ * Version: @(#)keyboard.h 1.0.14 2018/03/22
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -68,6 +68,7 @@ extern const device_t keyboard_at_toshiba_device;
extern const device_t keyboard_ps2_device;
extern const device_t keyboard_ps2_ami_device;
extern const device_t keyboard_ps2_mca_device;
+extern const device_t keyboard_ps2_mca_2_device;
extern const device_t keyboard_ps2_quadtel_device;
#endif
diff --git a/src/keyboard_at.c b/src/keyboard_at.c
index 87e7af857..2a78ef62c 100644
--- a/src/keyboard_at.c
+++ b/src/keyboard_at.c
@@ -8,7 +8,7 @@
*
* Intel 8042 (AT keyboard controller) emulation.
*
- * Version: @(#)keyboard_at.c 1.0.32 2018/03/19
+ * Version: @(#)keyboard_at.c 1.0.33 2018/03/22
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -1900,6 +1900,10 @@ kbd_init(const device_t *info)
timer_add(kbd_poll, &keyboard_delay, TIMER_ALWAYS_ENABLED, kbd);
if ((kbd->flags & KBC_TYPE_MASK) != KBC_TYPE_ISA) {
+ if ((kbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2)
+ keyboard_mode &= ~0x03; /* These machines force translation off, so the keyboard
+ must start in scan code set 0. */
+
timer_add(kbd_refresh,
&kbd->refresh_time, TIMER_ALWAYS_ENABLED, kbd);
}
@@ -2020,6 +2024,16 @@ const device_t keyboard_ps2_mca_device = {
NULL, NULL, NULL, NULL
};
+const device_t keyboard_ps2_mca_2_device = {
+ "PS/2 Keyboard",
+ 0,
+ KBC_TYPE_PS2_2 | KBC_VEN_IBM_MCA,
+ kbd_init,
+ kbd_close,
+ kbd_reset,
+ NULL, NULL, NULL, NULL
+};
+
const device_t keyboard_ps2_quadtel_device = {
"PS/2 Keyboard (Quadtel/MegaPC)",
0,
diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c
index a51fe1143..0aeed187a 100644
--- a/src/machine/m_ps2_mca.c
+++ b/src/machine/m_ps2_mca.c
@@ -741,6 +741,67 @@ static void ps2_mem_expansion_write(int port, uint8_t val, void *p)
mem_mapping_disable(&ps2.expansion_mapping);
}
+static void ps2_mca_mem_fffc_init(int start_mb)
+{
+ uint32_t planar_size, expansion_start;
+
+ if (start_mb == 2) {
+ planar_size = 0x160000;
+ expansion_start = 0x260000;
+ } else {
+ planar_size = (start_mb - 1) << 20;
+ expansion_start = start_mb << 20;
+ }
+
+ mem_mapping_set_addr(&ram_high_mapping, 0x100000, planar_size);
+
+ ps2.mem_pos_regs[0] = 0xff;
+ ps2.mem_pos_regs[1] = 0xfc;
+
+ switch ((mem_size / 1024) - start_mb)
+ {
+ case 1:
+ ps2.mem_pos_regs[4] = 0xfc; /* 11 11 11 00 = 0 0 0 1 */
+ break;
+ case 2:
+ ps2.mem_pos_regs[4] = 0xfe; /* 11 11 11 10 = 0 0 0 2 */
+ break;
+ case 3:
+ ps2.mem_pos_regs[4] = 0xf2; /* 11 11 00 10 = 0 0 1 2 */
+ break;
+ case 4:
+ ps2.mem_pos_regs[4] = 0xfa; /* 11 11 10 10 = 0 0 2 2 */
+ break;
+ case 5:
+ ps2.mem_pos_regs[4] = 0xca; /* 11 00 10 10 = 0 1 2 2 */
+ break;
+ case 6:
+ ps2.mem_pos_regs[4] = 0xea; /* 11 10 10 10 = 0 2 2 2 */
+ break;
+ case 7:
+ ps2.mem_pos_regs[4] = 0x2a; /* 00 10 10 10 = 1 2 2 2 */
+ break;
+ case 8:
+ ps2.mem_pos_regs[4] = 0xaa; /* 10 10 10 10 = 2 2 2 2 */
+ break;
+ }
+
+ mca_add(ps2_mem_expansion_read, ps2_mem_expansion_write, NULL);
+ mem_mapping_add(&ps2.expansion_mapping,
+ expansion_start,
+ (mem_size - (start_mb << 10)) << 10,
+ mem_read_ram,
+ mem_read_ramw,
+ mem_read_raml,
+ mem_write_ram,
+ mem_write_ramw,
+ mem_write_raml,
+ &ram[expansion_start],
+ MEM_MAPPING_INTERNAL,
+ NULL);
+ mem_mapping_disable(&ps2.expansion_mapping);
+}
+
static void ps2_mca_board_model_50_init()
{
ps2_mca_board_common_init();
@@ -754,53 +815,7 @@ static void ps2_mca_board_model_50_init()
if (mem_size > 2048)
{
/* Only 2 MB supported on planar, create a memory expansion card for the rest */
- mem_mapping_set_addr(&ram_high_mapping, 0x100000, 0x160000);
-
- ps2.mem_pos_regs[0] = 0xff;
- ps2.mem_pos_regs[1] = 0xfc;
-
- switch (mem_size/1024)
- {
- case 3:
- ps2.mem_pos_regs[4] = 0xfc; /* 11 11 11 00 = 0 0 0 1 */
- break;
- case 4:
- ps2.mem_pos_regs[4] = 0xfe; /* 11 11 11 10 = 0 0 0 2 */
- break;
- case 5:
- ps2.mem_pos_regs[4] = 0xf2; /* 11 11 00 10 = 0 0 1 2 */
- break;
- case 6:
- ps2.mem_pos_regs[4] = 0xfa; /* 11 11 10 10 = 0 0 2 2 */
- break;
- case 7:
- ps2.mem_pos_regs[4] = 0xca; /* 11 00 10 10 = 0 1 2 2 */
- break;
- case 8:
- ps2.mem_pos_regs[4] = 0xea; /* 11 10 10 10 = 0 2 2 2 */
- break;
- case 9:
- ps2.mem_pos_regs[4] = 0x2a; /* 00 10 10 10 = 1 2 2 2 */
- break;
- case 10:
- ps2.mem_pos_regs[4] = 0xaa; /* 10 10 10 10 = 2 2 2 2 */
- break;
- }
-
- mca_add(ps2_mem_expansion_read, ps2_mem_expansion_write, NULL);
- mem_mapping_add(&ps2.expansion_mapping,
- 0x260000,
- (mem_size - 2048)*1024,
- mem_read_ram,
- mem_read_ramw,
- mem_read_raml,
- mem_write_ram,
- mem_write_ramw,
- mem_write_raml,
- &ram[0x260000],
- MEM_MAPPING_INTERNAL,
- NULL);
- mem_mapping_disable(&ps2.expansion_mapping);
+ ps2_mca_mem_fffc_init(2);
}
device_add(&ps1vga_device);
@@ -1005,7 +1020,6 @@ static void ps2_mca_board_model_70_type34_init(int is_type4)
{
ps2_mca_board_common_init();
- mem_remap_top_256k();
ps2.split_addr = mem_size * 1024;
mca_init(4);
@@ -1015,7 +1029,7 @@ static void ps2_mca_board_model_70_type34_init(int is_type4)
device_add(&ps2_nvr_device);
io_sethandler(0x00e0, 0x0003, mem_encoding_read_cached, NULL, NULL, mem_encoding_write_cached, NULL, NULL, NULL);
-
+
ps2.mem_regs[1] = 2;
switch (mem_size/1024)
@@ -1073,41 +1087,7 @@ static void ps2_mca_board_model_70_type34_init(int is_type4)
if (mem_size > 8192)
{
/* Only 8 MB supported on planar, create a memory expansion card for the rest */
- mem_mapping_set_addr(&ram_high_mapping, 0x100000, 0x700000);
-
- ps2.mem_pos_regs[0] = 0xff;
- ps2.mem_pos_regs[1] = 0xfc;
-
- switch (mem_size/1024)
- {
- case 10:
- ps2.mem_pos_regs[4] = 0xfe;
- break;
- case 12:
- ps2.mem_pos_regs[4] = 0xfa;
- break;
- case 14:
- ps2.mem_pos_regs[4] = 0xea;
- break;
- case 16:
- ps2.mem_pos_regs[4] = 0xaa;
- break;
- }
-
- mca_add(ps2_mem_expansion_read, ps2_mem_expansion_write, NULL);
- mem_mapping_add(&ps2.expansion_mapping,
- 0x800000,
- (mem_size - 8192)*1024,
- mem_read_ram,
- mem_read_ramw,
- mem_read_raml,
- mem_write_ram,
- mem_write_ramw,
- mem_write_raml,
- &ram[0x800000],
- MEM_MAPPING_INTERNAL,
- NULL);
- mem_mapping_disable(&ps2.expansion_mapping);
+ ps2_mca_mem_fffc_init(8);
}
device_add(&ps1vga_device);
@@ -1176,55 +1156,7 @@ static void ps2_mca_board_model_80_type2_init(int is486)
if ((mem_size > 4096) && !is486)
{
/* Only 4 MB supported on planar, create a memory expansion card for the rest */
- mem_mapping_set_addr(&ram_high_mapping, 0x100000, 0x300000);
-
- ps2.mem_pos_regs[0] = 0xff;
- ps2.mem_pos_regs[1] = 0xfc;
-
- switch (mem_size/1024)
- {
- case 5:
- ps2.mem_pos_regs[4] = 0xfc; /* 11 11 11 00 = 0 0 0 1 */
- break;
- case 6:
- ps2.mem_pos_regs[4] = 0xfe; /* 11 11 11 10 = 0 0 0 2 */
- break;
- case 7:
- ps2.mem_pos_regs[4] = 0xf2; /* 11 11 00 10 = 0 0 1 2 */
- break;
- case 8:
- ps2.mem_pos_regs[4] = 0xfa; /* 11 11 10 10 = 0 0 2 2 */
- break;
- case 9:
- ps2.mem_pos_regs[4] = 0xca; /* 11 00 10 10 = 0 1 2 2 */
- break;
- case 10:
- ps2.mem_pos_regs[4] = 0xea; /* 11 10 10 10 = 0 2 2 2 */
- break;
- case 11:
- ps2.mem_pos_regs[4] = 0x2a; /* 00 10 10 10 = 1 2 2 2 */
- break;
- case 12:
- ps2.mem_pos_regs[4] = 0xaa; /* 10 10 10 10 = 2 2 2 2 */
- break;
- }
-
- /* pclog("ps2.mem_pos_regs[4] = %08X\n", ps2.mem_pos_regs[4]); */
-
- mca_add(ps2_mem_expansion_read, ps2_mem_expansion_write, NULL);
- mem_mapping_add(&ps2.expansion_mapping,
- 0x400000,
- (mem_size - 4096)*1024,
- mem_read_ram,
- mem_read_ramw,
- mem_read_raml,
- mem_write_ram,
- mem_write_ramw,
- mem_write_raml,
- &ram[0x400000],
- MEM_MAPPING_INTERNAL,
- NULL);
- mem_mapping_disable(&ps2.expansion_mapping);
+ ps2_mca_mem_fffc_init(4);
}
device_add(&ps1vga_device);
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index 8f02f57c8..eaee5820a 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -11,7 +11,7 @@
* NOTES: OpenAT wip for 286-class machine with open BIOS.
* PS2_M80-486 wip, pending receipt of TRM's for machine.
*
- * Version: @(#)machine_table.c 1.0.26 2018/03/18
+ * Version: @(#)machine_table.c 1.0.27 2018/03/22
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -104,7 +104,7 @@ const machine_t machines[] = {
#if defined(DEV_BRANCH) && defined(USE_PORTABLE3)
{ "[386DX ISA] Compaq Portable III (386)", ROM_PORTABLEIII386, "portableiii386", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_AT | MACHINE_HDC | MACHINE_VIDEO, 1, 14, 1, 127, machine_at_compaq_init, NULL, nvr_at_close },
#endif
- { "[386DX MCA] IBM PS/2 model 70 (type 3)", ROM_IBMPS2_M70_TYPE3, "ibmps2_m70_type3", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 2, 16, 2, 63, machine_ps2_model_70_type3_init, NULL, nvr_at_close },
+ { "[386DX MCA] IBM PS/2 model 70 (type 3)", ROM_IBMPS2_M70_TYPE3, "ibmps2_m70_type3", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 2, 16, 2, 63, machine_ps2_model_70_type3_init, NULL, nvr_at_close },
{ "[386DX MCA] IBM PS/2 model 80", ROM_IBMPS2_M80, "ibmps2_m80", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 1, 12, 1, 63, machine_ps2_model_80_init, NULL, nvr_at_close },
@@ -114,7 +114,7 @@ const machine_t machines[] = {
{ "[486 ISA] DTK PKM-0038S E-2", ROM_DTK486, "dtk486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 128, 1, 127, machine_at_dtk486_init, NULL, nvr_at_close },
{ "[486 ISA] IBM PS/1 model 2133", ROM_IBMPS1_2133, "ibmps1_2133", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 1, 64, 1, 127, machine_ps1_m2133_init, NULL, nvr_at_close },
- { "[486 MCA] IBM PS/2 model 70 (type 4)", ROM_IBMPS2_M70_TYPE4, "ibmps2_m70_type4", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 2, 64, 2, 63, machine_ps2_model_70_type4_init, NULL, nvr_at_close },
+ { "[486 MCA] IBM PS/2 model 70 (type 4)", ROM_IBMPS2_M70_TYPE4, "ibmps2_m70_type4", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 2, 16, 2, 63, machine_ps2_model_70_type4_init, NULL, nvr_at_close },
#ifdef WALTJE
{ "[486 MCA] IBM PS/2 model 80-486", ROM_IBMPS2_M80_486, "ibmps2_m80-486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 1, 32, 1, 63, machine_ps2_model_80_486_init, NULL, nvr_at_close },