diff --git a/CMakeLists.txt b/CMakeLists.txt
index 424e08ec3..29e5e1a3a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -114,21 +114,23 @@ option(QT           "QT GUI"
 
 # Development branch features
 #
-#                      Option       Description                                     Def.    Condition       Otherwise
-#                      ------       -----------                                     ----    ---------       ---------
-cmake_dependent_option(AMD_K5       "AMD K5"                                        ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(CYRIX_6X86   "Cyrix 6x86"                                    ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(GUSMAX       "Gravis UltraSound MAX"                         ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(LASERXT      "VTech Laser XT"                                ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(MGA          "Matrox Mystique graphics adapters"             ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(NO_SIO       "Machines without emulated Super I/O chips"     ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(OLIVETTI     "Olivetti M290"                                 ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(OPEN_AT      "OpenAT"                                        ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(PAS16        "Pro Audio Spectrum 16"                         OFF     "DEV_BRANCH"    OFF)
-cmake_dependent_option(SIO_DETECT   "Super I/O Detection Helper"                    ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(VGAWONDER    "ATI VGA Wonder (ATI-18800)"                    ON      "DEV_BRANCH"    OFF)
-cmake_dependent_option(VNC          "VNC renderer"                                  OFF     "DEV_BRANCH"    OFF)
-cmake_dependent_option(XL24         "ATI VGA Wonder XL24 (ATI-28800-6)"             ON      "DEV_BRANCH"    OFF)
+#                      Option         Description                                   Def.    Condition       Otherwise
+#                      ------         -----------                                   ----    ---------       ---------
+cmake_dependent_option(AMD_K5         "AMD K5"                                      ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(CYRIX_6X86     "Cyrix 6x86"                                  ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(GUSMAX         "Gravis UltraSound MAX"                       ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(LASERXT        "VTech Laser XT"                              ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(MGA            "Matrox Mystique graphics adapters"           ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(NO_SIO         "Machines without emulated Super I/O chips"   ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(OLIVETTI       "Olivetti M290"                               ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(OPEN_AT        "OpenAT"                                      ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(PAS16          "Pro Audio Spectrum 16"                       OFF     "DEV_BRANCH"    OFF)
+cmake_dependent_option(SIO_DETECT     "Super I/O Detection Helper"                  ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(VGAWONDER      "ATI VGA Wonder (ATI-18800)"                  ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(VNC            "VNC renderer"                                OFF     "DEV_BRANCH"    OFF)
+cmake_dependent_option(XL24           "ATI VGA Wonder XL24 (ATI-28800-6)"           ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage"                                 ON      "DEV_BRANCH"    OFF)
+cmake_dependent_option(ISAMEM_IAB     "Intel Above Board"                           ON      "DEV_BRANCH"    OFF)
 
 # Ditto but for Qt
 if (QT)
diff --git a/src/86box.c b/src/86box.c
index 0970a6cb6..4cee64445 100644
--- a/src/86box.c
+++ b/src/86box.c
@@ -160,7 +160,8 @@ int GAMEBLASTER = 0;				/* (C) sound option */
 int GUS = 0;					/* (C) sound option */
 int SSI2001 = 0;				/* (C) sound option */
 int voodoo_enabled = 0;				/* (C) video option */
-uint32_t mem_size = 0;				/* (C) memory size */
+uint32_t mem_size = 0;				/* (C) memory size (Installed on system board)*/
+uint32_t isa_mem_size = 0;	/* (C) memory size (ISA Memory Cards) */
 int	cpu_use_dynarec = 0;			/* (C) cpu uses/needs Dyna */
 int cpu = 0;					/* (C) cpu type */
 int fpu_type = 0;				/* (C) fpu type */
@@ -976,9 +977,6 @@ pc_reset_hard_init(void)
 	/* Reset and reconfigure the Sound Card layer. */
 	sound_card_reset();
 
-	/* Reset any ISA memory cards. */
-	isamem_reset();
-
 	/* Reset any ISA RTC cards. */
 	isartc_reset();
 
diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt
index 17a9ca1bb..2b7b34c7b 100644
--- a/src/device/CMakeLists.txt
+++ b/src/device/CMakeLists.txt
@@ -21,4 +21,12 @@ add_library(dev OBJECT bugger.c cassette.c cartridge.c hasp.c hwm.c hwm_lm75.c h
 
 if(LASERXT)
     target_compile_definitions(dev PRIVATE USE_LASERXT)
+endif()
+
+if(ISAMEM_RAMPAGE)
+    target_compile_definitions(dev PRIVATE USE_ISAMEM_RAMPAGE)
+endif()
+
+if(ISAMEM_IAB)
+    target_compile_definitions(dev PRIVATE USE_ISAMEM_IAB)
 endif()
\ No newline at end of file
diff --git a/src/device/ibm_5161.c b/src/device/ibm_5161.c
index 3924e61dd..f6ed88476 100644
--- a/src/device/ibm_5161.c
+++ b/src/device/ibm_5161.c
@@ -54,15 +54,29 @@ ibm_5161_in(uint16_t port, void *priv)
     ret = dev->regs[port & 0x0007];
 
     switch (port) {
-	case 0x211:
-	case 0x215:
+	case 0x210: /* Write to latch expansion bus data (ED0-ED7) */
+				/* Read to verify expansion bus data (ED0-ED7) */
+		break;
+	case 0x214: /* Write to latch data bus bits (DO - 07) */
+				/* Read data bus bits (DO - D7) */
+		break;
+	case 0x211: /* Read high-order address bits (A8 - A 15) */
+	case 0x215: /* Read high-order address bits (A8 - A 15) */
 		ret = (get_last_addr() >> 8) & 0xff;
 		break;
-	case 0x212:
-	case 0x216:
+	case 0x212: /* Read low-order address bits (A0 - A7) */
+	case 0x216: /* Read low-order address bits (A0 - A7) */
 		ret = get_last_addr() & 0xff;
 		break;
-	case 0x213:
+	case 0x213: /* Write 00 to disable expansion unit */
+				/* Write 01 to enable expansion unit */
+				/* Read status of expansion unit
+						00 = enable/disable
+						01 = wait-state request flag
+						02-03 = not used
+						04-07 = switch position
+							1 = Off
+							0 =On */
 		ret = dev->regs[3] & 0x01;
 		break;
     }
diff --git a/src/device/isamem.c b/src/device/isamem.c
index a11a3d68b..b16d5d247 100644
--- a/src/device/isamem.c
+++ b/src/device/isamem.c
@@ -84,6 +84,16 @@
 
 #include "cpu.h"
 
+#define ISAMEM_IBMXT_CARD 0
+#define ISAMEM_GENXT_CARD 1
+#define ISAMEM_IBMAT_CARD 2
+#define ISAMEM_GENAT_CARD 3
+#define ISAMEM_P5PAK_CARD 4
+#define ISAMEM_A6PAK_CARD 5
+#define ISAMEM_EMS5150_CARD 6
+#define ISAMEM_EV159_CARD 10
+#define ISAMEM_RAMPAGEXT_CARD 11
+#define ISAMEM_ABOVEBOARD_CARD 12
 
 #define ISAMEM_DEBUG	0
 
@@ -95,6 +105,9 @@
 #define EMS_PGSIZE	(16 << 10)		/* one page is this big */
 #define EMS_MAXPAGE	4			/* number of viewport pages */
 
+#define EXTRAM_CONVENTIONAL 0
+#define EXTRAM_HIGH 1
+#define EXTRAM_XMS 2
 
 typedef struct {
     int8_t	enabled;			/* 1=ENABLED */
@@ -398,28 +411,31 @@ isamem_init(const device_t *info)
     /* Do per-board initialization. */
     tot = 0;
     switch(dev->board) {
-	case 0:		/* IBM PC/XT Memory Expansion Card */
-	case 2:		/* Paradise Systems 5-PAK */
+	case ISAMEM_IBMXT_CARD:		/* IBM PC/XT Memory Expansion Card */
+	case ISAMEM_GENXT_CARD:		/* Generic PC/XT Memory Expansion Card */
+	case ISAMEM_P5PAK_CARD:		/* Paradise Systems 5-PAK */
+	case ISAMEM_A6PAK_CARD:		/* AST SixPakPlus */
 		dev->total_size = device_get_config_int("size");
 		dev->start_addr = device_get_config_int("start");
 		tot = dev->total_size;
 		break;
 
-	case 1:		/* IBM PC/AT Memory Expansion Card */
+	case ISAMEM_IBMAT_CARD:		/* IBM PC/AT Memory Expansion Card */
+	case ISAMEM_GENAT_CARD:		/* Generic PC/AT Memory Expansion Card */
 		dev->total_size = device_get_config_int("size");
 		dev->start_addr = device_get_config_int("start");
 		tot = dev->total_size;
 		dev->flags |= FLAG_WIDE;
 		break;
 
-	case 3:		/* Micro Mainframe EMS-5150(T) */
+	case ISAMEM_EMS5150_CARD:		/* Micro Mainframe EMS-5150(T) */
 		dev->base_addr = device_get_config_hex16("base");
 		dev->total_size = device_get_config_int("size");
 		dev->frame_addr = 0xD0000;
 		dev->flags |= (FLAG_EMS | FLAG_CONFIG);
 		break;
 
-	case 10:	/* Everex EV-159 RAM 3000 */
+	case ISAMEM_EV159_CARD:	/* Everex EV-159 RAM 3000 */
 		dev->base_addr = device_get_config_hex16("base");
 		dev->total_size = device_get_config_int("size");
 		dev->start_addr = device_get_config_int("start");
@@ -433,7 +449,8 @@ isamem_init(const device_t *info)
 dev->frame_addr = 0xE0000;
 		break;
 
-	case 11:
+	case ISAMEM_RAMPAGEXT_CARD: /* AST RAMpage/XT */
+	case ISAMEM_ABOVEBOARD_CARD: /* Intel AboveBoard */
 		dev->base_addr = device_get_config_hex16("base");
 		dev->total_size = device_get_config_int("size");
 		dev->start_addr = device_get_config_int("start");
@@ -496,8 +513,8 @@ dev->frame_addr = 0xE0000;
 			t = tot;
 		isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10);
 
-		dev->ext_ram[0].ptr = ptr;
-		dev->ext_ram[0].base = addr;
+		dev->ext_ram[EXTRAM_CONVENTIONAL].ptr = ptr;
+		dev->ext_ram[EXTRAM_CONVENTIONAL].base = addr;
 
 		/* Create, initialize and enable the low-memory mapping. */
 		mem_mapping_add(&dev->low_mapping, addr, t,
@@ -507,7 +524,7 @@ dev->frame_addr = 0xE0000;
 				ram_writeb, 
 				(dev->flags&FLAG_WIDE) ? ram_writew : NULL,
 				NULL,
-				ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[0]);
+				ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_CONVENTIONAL]);
 
 		/* Tell the memory system this is external RAM. */
 		mem_set_mem_state(addr, t,
@@ -531,8 +548,8 @@ dev->frame_addr = 0xE0000;
 
 		isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10);
 
-		dev->ext_ram[1].ptr = ptr;
-		dev->ext_ram[1].base = addr + tot;
+		dev->ext_ram[EXTRAM_HIGH].ptr = ptr;
+		dev->ext_ram[EXTRAM_HIGH].base = addr + tot;
 
 		/* Update and enable the remap. */
 		mem_mapping_set(&ram_remapped_mapping,
@@ -540,7 +557,7 @@ dev->frame_addr = 0xE0000;
 				ram_readb, ram_readw, NULL,
 				ram_writeb, ram_writew, NULL,
 				ptr, MEM_MAPPING_EXTERNAL,
-				&dev->ext_ram[1]);
+				&dev->ext_ram[EXTRAM_HIGH]);
 		mem_mapping_disable(&ram_remapped_mapping);
 
 		/* Tell the memory system this is external RAM. */
@@ -565,14 +582,14 @@ dev->frame_addr = 0xE0000;
 	t = tot;
 	isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10);
 
-	dev->ext_ram[2].ptr = ptr;
-	dev->ext_ram[2].base = addr;
+	dev->ext_ram[EXTRAM_XMS].ptr = ptr;
+	dev->ext_ram[EXTRAM_XMS].base = addr;
 
 	/* Create, initialize and enable the high-memory mapping. */
 	mem_mapping_add(&dev->high_mapping, addr, t,
 			ram_readb, ram_readw, NULL,
 			ram_writeb, ram_writew, NULL,
-			ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[2]);
+			ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_XMS]);
 
 	/* Tell the memory system this is external RAM. */
 	mem_set_mem_state(addr, t, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
@@ -583,6 +600,8 @@ dev->frame_addr = 0xE0000;
 	addr += t;
     }
 
+    isa_mem_size += dev->total_size - (k >> 10);
+
     /* If EMS is enabled, use the remainder for EMS. */
     if (dev->flags & FLAG_EMS) {
 	/* EMS 3.2 cannot have more than 2048KB per board. */
@@ -663,7 +682,7 @@ static const device_config_t ibmxt_config[] =
 	},
 	{
 		"start", "Start Address", CONFIG_SPINNER, "", 256, "",
-		{ 0, 640-64, 64 },
+		{ 0, 576, 64 },
 		{ { 0 } }
 	},
 	{
@@ -674,23 +693,50 @@ static const device_config_t ibmxt_config[] =
 static const device_t ibmxt_device = {
     "IBM PC/XT Memory Expansion",
     DEVICE_ISA,
-    0,
+    ISAMEM_IBMXT_CARD,
     isamem_init, isamem_close, NULL,
     { NULL }, NULL, NULL,
     ibmxt_config
 };
 
 
+static const device_config_t genericxt_config[] =
+{
+	{
+		"size", "Memory Size", CONFIG_SPINNER, "", 16, "",
+		{ 0, 640, 16 },
+		{ { 0 } }
+	},
+	{
+		"start", "Start Address", CONFIG_SPINNER, "", 0, "",
+		{ 0, 624, 16 },
+		{ { 0 } }
+	},
+	{
+		"", "", -1
+	}
+};
+
+static const device_t genericxt_device = {
+    "Generic PC/XT Memory Expansion",
+    DEVICE_ISA,
+    ISAMEM_GENXT_CARD,
+    isamem_init, isamem_close, NULL,
+    { NULL }, NULL, NULL,
+    genericxt_config
+};
+
+
 static const device_config_t ibmat_config[] =
 {
 	{
 		"size", "Memory Size", CONFIG_SPINNER, "", 512, "",
-		{ 0, 4096, 512 },
+		{ 0, 12288, 512 },
 		{ { 0 } }
 	},
 	{
 		"start", "Start Address", CONFIG_SPINNER, "", 512, "",
-		{ 0, 16128, 128 },
+		{ 0, 15872, 512 },
 		{ { 0 } }
 	},
 	{
@@ -701,13 +747,40 @@ static const device_config_t ibmat_config[] =
 static const device_t ibmat_device = {
     "IBM PC/AT Memory Expansion",
     DEVICE_ISA,
-    1,
+    ISAMEM_IBMAT_CARD,
     isamem_init, isamem_close, NULL,
     { NULL }, NULL, NULL,
     ibmat_config
 };
 
 
+static const device_config_t genericat_config[] =
+{
+	{
+		"size", "Memory Size", CONFIG_SPINNER, "", 512, "",
+		{ 0, 16384, 512 },
+		{ { 0 } }
+	},
+	{
+		"start", "Start Address", CONFIG_SPINNER, "", 512, "",
+		{ 0, 15872, 128 },
+		{ { 0 } }
+	},
+	{
+		"", "", -1
+	}
+};
+
+static const device_t genericat_device = {
+    "Generic PC/AT Memory Expansion",
+    DEVICE_ISA,
+    ISAMEM_GENAT_CARD,
+    isamem_init, isamem_close, NULL,
+    { NULL }, NULL, NULL,
+    genericat_config
+};
+
+
 static const device_config_t p5pak_config[] =
 {
 	{
@@ -728,13 +801,40 @@ static const device_config_t p5pak_config[] =
 static const device_t p5pak_device = {
     "Paradise Systems 5-PAK",
     DEVICE_ISA,
-    2,
+    ISAMEM_P5PAK_CARD,
     isamem_init, isamem_close, NULL,
     { NULL }, NULL, NULL,
     p5pak_config
 };
 
 
+static const device_config_t a6pak_config[] =
+{
+	{
+		"size", "Memory Size", CONFIG_SPINNER, "", 64, "",
+		{ 0, 576, 64 },
+		{ { 0 } }
+	},
+	{
+		"start", "Start Address", CONFIG_SPINNER, "", 256, "",
+		{ 64, 512, 64 },
+		{ { 0 } }
+	},
+	{
+		"", "", -1
+	}
+};
+
+static const device_t a6pak_device = {
+    "AST SixPakPlus",
+    DEVICE_ISA,
+    ISAMEM_A6PAK_CARD,
+    isamem_init, isamem_close, NULL,
+    { NULL }, NULL, NULL,
+    a6pak_config
+};
+
+
 static const device_config_t ems5150_config[] =
 {
 	{
@@ -774,7 +874,7 @@ static const device_config_t ems5150_config[] =
 static const device_t ems5150_device = {
     "Micro Mainframe EMS-5150(T)",
     DEVICE_ISA,
-    3,
+    ISAMEM_EMS5150_CARD,
     isamem_init, isamem_close, NULL,
     { NULL }, NULL, NULL,
     ems5150_config
@@ -877,7 +977,7 @@ static const device_config_t ev159_config[] =
 static const device_t ev159_device = {
     "Everex EV-159 RAM 3000 Deluxe",
     DEVICE_ISA,
-    10,
+    ISAMEM_EV159_CARD,
     isamem_init, isamem_close, NULL,
     { NULL }, NULL, NULL,
     ev159_config
@@ -975,10 +1075,10 @@ static const device_config_t rampage_config[] =
 	}
 };
 
-static const device_t isamem_rampage_device = {
+static const device_t rampage_device = {
     "AST RAMpage/XT",
     DEVICE_ISA,
-    11,
+    ISAMEM_RAMPAGEXT_CARD,
     isamem_init, isamem_close, NULL,
     { NULL }, NULL, NULL,
     rampage_config
@@ -986,14 +1086,119 @@ static const device_t isamem_rampage_device = {
 #endif
 
 
+#ifdef USE_ISAMEM_IAB
+static const device_config_t iab_config[] =
+{
+	{
+		"base", "Address", CONFIG_HEX16, "", 0x0258, "", { 0 },
+		{
+			{
+				"208H", 0x0208
+			},
+			{
+				"218H", 0x0218
+			},
+			{
+				"258H", 0x0258
+			},
+			{
+				"268H", 0x0268
+			},
+			{
+				"2A8H", 0x02A8
+			},
+			{
+				"2B8H", 0x02B8
+			},
+			{
+				"2E8H", 0x02E8
+			},
+			{
+				""
+			}
+		},
+	},
+	{
+		"frame", "Frame Address", CONFIG_HEX20, "", 0, "", { 0 },
+		{
+			{
+				"Disabled", 0x00000
+			},
+			{
+				"C000H", 0xC0000
+			},
+			{
+				"D000H", 0xD0000
+			},
+			{
+				"E000H", 0xE0000
+			},
+			{
+				""
+			}
+		},
+	},
+	{
+		"width", "I/O Width", CONFIG_SELECTION, "", 8, "", { 0 },
+		{
+			{
+				"8-bit", 8
+			},
+			{
+				"16-bit", 16
+			},
+			{
+				""
+			}
+		},
+	},
+	{
+		"speed", "Transfer Speed", CONFIG_SELECTION, "", 0, "", { 0 },
+		{
+			{
+				"Standard", 0
+			},
+			{
+				"High-Speed", 1
+			},
+			{
+				""
+			}
+		}
+	},
+	{
+		"size", "Memory Size", CONFIG_SPINNER, "", 128,
+		"",
+		{ 0, 8192, 128 },
+		{ 0 }
+	},
+	{
+		"", "", -1
+	}
+};
+
+static const device_t iab_device = {
+    "Intel AboveBoard",
+    DEVICE_ISA,
+    ISAMEM_ABOVEBOARD_CARD,
+    isamem_init, isamem_close, NULL,
+    { NULL }, NULL, NULL,
+    iab_config
+};
+#endif
+
+
 static const struct {
     const char		*internal_name;
     const device_t	*dev;
 } boards[] = {
-    { "none",		NULL			},
+    { "none",		NULL				},
     { "ibmxt",		&ibmxt_device		},
+    { "genericxt",	&genericxt_device	},
     { "ibmat",		&ibmat_device		},
+    { "genericat",	&genericat_device	},
     { "p5pak",		&p5pak_device		},
+    { "a6pak",		&a6pak_device		},
     { "ems5150",	&ems5150_device		},
     { "ev159",		&ev159_device		},
 #ifdef USE_ISAMEM_BRAT
@@ -1003,9 +1208,9 @@ static const struct {
     { "rampage",	&rampage_device		},
 #endif
 #ifdef USE_ISAMEM_IAB
-    { "iab",		&iab_device		},
+    { "iab",		&iab_device			},
 #endif
-    { "",		NULL			}
+    { "",			NULL				}
 };
 
 
@@ -1014,6 +1219,9 @@ isamem_reset(void)
 {
     int k, i;
 
+    /* We explicitly set to zero here or bad things happen */
+    isa_mem_size = 0;
+
     for (i = 0; i < ISAMEM_MAX; i++) {
 	k = isamem_type[i];
 	if (k == 0) continue;
diff --git a/src/device/isartc.c b/src/device/isartc.c
index d587f9015..bc1fa795b 100644
--- a/src/device/isartc.c
+++ b/src/device/isartc.c
@@ -83,6 +83,11 @@
 #include <86box/isartc.h>
 
 
+#define ISARTC_EV170	0
+#define ISARTC_DTK		1
+#define ISARTC_P5PAK	2
+#define ISARTC_A6PAK	3
+
 #define ISARTC_DEBUG	0
 
 
@@ -506,7 +511,7 @@ isartc_init(const device_t *info)
 
     /* Do per-board initialization. */
     switch(dev->board) {
-	case 0:		/* Everex EV-170 Magic I/O */
+	case ISARTC_EV170:		/* Everex EV-170 Magic I/O */
 		dev->flags |= FLAG_YEAR80;
 		dev->base_addr = device_get_config_hex16("base");
 		dev->base_addrsz = 32;
@@ -519,7 +524,7 @@ isartc_init(const device_t *info)
 		dev->year = MM67_AL_DOM;	/* year, NON STANDARD */
 		break;
 
-	case 1:		/* DTK PII-147 Hexa I/O Plus */
+	case ISARTC_DTK:		/* DTK PII-147 Hexa I/O Plus */
 		dev->flags |= FLAG_YEARBCD;
 		dev->base_addr = device_get_config_hex16("base");
 		dev->base_addrsz = 32;
@@ -531,7 +536,8 @@ isartc_init(const device_t *info)
 		dev->year = MM67_AL_HUNTEN;	/* year, NON STANDARD */
 		break;
 
-	case 2:		/* Paradise Systems 5PAK */
+	case ISARTC_P5PAK:		/* Paradise Systems 5PAK */
+	case ISARTC_A6PAK:		/* AST SixPakPlus */
 		dev->flags |= FLAG_YEAR80;
 		dev->base_addr = 0x02c0;
 		dev->base_addrsz = 32;
@@ -627,7 +633,7 @@ static const device_config_t ev170_config[] = {
 static const device_t ev170_device = {
     "Everex EV-170 Magic I/O",
     DEVICE_ISA,
-    0,
+    ISARTC_EV170,
     isartc_init, isartc_close, NULL,
     { NULL }, NULL, NULL,
     ev170_config
@@ -657,7 +663,7 @@ static const device_config_t pii147_config[] = {
 static const device_t pii147_device = {
     "DTK PII-147 Hexa I/O Plus",
     DEVICE_ISA,
-    1,
+    ISARTC_DTK,
     isartc_init, isartc_close, NULL,
     { NULL }, NULL, NULL,
     pii147_config
@@ -693,13 +699,49 @@ static const device_config_t p5pak_config[] = {
 static const device_t p5pak_device = {
     "Paradise Systems 5-PAK",
     DEVICE_ISA,
-    2,
+    ISARTC_P5PAK,
     isartc_init, isartc_close, NULL,
     { NULL }, NULL, NULL,
     p5pak_config
 };
 
 
+static const device_config_t a6pak_config[] = {
+	{
+		"irq", "IRQ", CONFIG_SELECTION, "", -1, "", { 0 },
+		{
+			{
+				"Disabled", -1
+			},
+			{
+				"IRQ2", 2
+			},
+			{
+				"IRQ3", 3
+			},
+			{
+				"IRQ5", 5
+			},
+			{
+				""
+			}
+		},
+	},
+	{
+		"", "", -1
+	}
+};
+
+static const device_t a6pak_device = {
+    "AST SixPakPlus",
+    DEVICE_ISA,
+    ISARTC_A6PAK,
+    isartc_init, isartc_close, NULL,
+    { NULL }, NULL, NULL,
+    a6pak_config
+};
+
+
 static const struct {
     const char		*internal_name;
     const device_t	*dev;
@@ -708,6 +750,7 @@ static const struct {
     { "ev170",	&ev170_device	},
     { "pii147",	&pii147_device	},
     { "p5pak",	&p5pak_device	},
+    { "a6pak",	&a6pak_device	},
     { "",	NULL		},
 };
 
diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c
index 78c17ae19..9b7f98f64 100644
--- a/src/device/keyboard_xt.c
+++ b/src/device/keyboard_xt.c
@@ -55,6 +55,17 @@
 #define STAT_IFULL      0x02
 #define STAT_OFULL      0x01
 
+// Keyboard Types
+#define KBD_TYPE_PC81     0
+#define KBD_TYPE_PC82     1
+#define KBD_TYPE_XT82     2
+#define KBD_TYPE_XT86     3
+#define KBD_TYPE_COMPAQ   4
+#define KBD_TYPE_TANDY    5
+#define KBD_TYPE_TOSHIBA  6
+#define KBD_TYPE_VTECH    7
+#define KBD_TYPE_OLIVETTI 8
+#define KBD_TYPE_ZENITH   9
 
 typedef struct {
     int want_irq;        
@@ -357,8 +368,8 @@ kbd_log(const char *fmt, ...)
 #endif
 
 static uint8_t
-get_fdd_switch_settings(){
-    
+get_fdd_switch_settings() {
+
     int i, fdd_count = 0;
     
     for (i = 0; i < FDD_NUM; i++) {
@@ -369,20 +380,18 @@ get_fdd_switch_settings(){
     if (!fdd_count)
         return 0x00;
     else
-        return ((fdd_count - 1) << 6) | 0x01;    
-
+        return ((fdd_count - 1) << 6) | 0x01;
 }
 
 static uint8_t
-get_videomode_switch_settings(){
-    
+get_videomode_switch_settings() {
+
     if (video_is_mda())
         return 0x30;
     else if (video_is_cga())
         return 0x20;	/* 0x10 would be 40x25 */
     else
-        return 0x00;    
-
+        return 0x00;
 }
 
 static void
@@ -392,7 +401,7 @@ kbd_poll(void *priv)
 
     timer_advance_u64(&kbd->send_delay_timer, 1000 * TIMER_USEC);
 
-    if (!(kbd->pb & 0x40) && (kbd->type != 5))
+    if (!(kbd->pb & 0x40) && (kbd->type != KBD_TYPE_TANDY))
 	return;
 
     if (kbd->want_irq) {
@@ -504,7 +513,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
     xtkbd_t *kbd = (xtkbd_t *)priv;
 
     switch (port) {
-	case 0x61:
+	case 0x61: /* Keyboard Control Register (aka Port B) */
 		if (!(kbd->pb & 0x40) && (val & 0x40)) {
 			key_queue_start = key_queue_end = 0;
 			kbd->want_irq = 0;
@@ -514,9 +523,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
 		kbd->pb = val;
 		ppi.pb = val;
 
-                timer_process();
+        timer_process();
 
-		if ((kbd->type <= 1) && (cassette != NULL))
+		if (((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) && (cassette != NULL))
 			pc_cas_set_motor(cassette, (kbd->pb & 0x08) == 0);
 
 		speaker_update();
@@ -535,13 +544,13 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
 		}
 
 #ifdef ENABLE_KEYBOARD_XT_LOG
-		if (kbd->type <= 1)
+		if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82))
 			kbd_log("Cassette motor is %s\n", !(val & 0x08) ? "ON" : "OFF");
 #endif
 		break;
 #ifdef ENABLE_KEYBOARD_XT_LOG
-	case 0x62:
-		if (kbd->type <= 1)
+	case 0x62: /* Switch Register (aka Port C) */
+		if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82))
 			kbd_log("Cassette IN is %i\n", !!(val & 0x10));
 		break;
 #endif
@@ -554,16 +563,17 @@ kbd_read(uint16_t port, void *priv)
 {
     xtkbd_t *kbd = (xtkbd_t *)priv;
     uint8_t ret = 0xff;
-    
 
     switch (port) {
-	case 0x60:
-		if ((kbd->pb & 0x80) && ((kbd->type <= 3) || (kbd->type == 9))) {
-			if (kbd->type <= 1)
+	case 0x60: /* Keyboard Data Register  (aka Port A) */
+		if ((kbd->pb & 0x80) && ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)
+                || (kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86)
+                || (kbd->type == KBD_TYPE_ZENITH))) {
+			if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82))
 				ret = (kbd->pd & ~0x02) | (hasfpu ? 0x02 : 0x00);
-			else if ((kbd->type == 2) || (kbd->type == 3))
+			else if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86))
 				ret = 0xff;	/* According to Ruud on the PCem forum, this is supposed to return 0xFF on the XT. */
-			else if (kbd->type == 9) {
+			else if (kbd->type == KBD_TYPE_ZENITH) {
 				/* Zenith Data Systems Z-151
 				 * SW1 switch settings:
 				 * bits 6-7: floppy drive number
@@ -586,32 +596,41 @@ kbd_read(uint16_t port, void *priv)
 			ret = kbd->pa;
 		break;
 
-	case 0x61:
+	case 0x61: /* Keyboard Control Register (aka Port B) */
 		ret = kbd->pb;
 		break;
 
-	case 0x62:
-		if (kbd->type == 0)
-			ret = 0x00;
-		else if (kbd->type == 1) {
-			if (kbd->pb & 0x04)
-				ret = ((mem_size - 64) / 32) & 0x0f;
+	case 0x62: /* Switch Register (aka Port C) */
+		if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) {
+			if (kbd->pb & 0x04) /* PB2 */
+                switch (mem_size + isa_mem_size) {
+                    case 64:
+                    case 48:
+                    case 32:
+                    case 16:
+                        ret = 0x00;
+                        break;
+                    default:
+                        ret = (((mem_size + isa_mem_size) - 64) / 32) & 0x0f;
+                        break;
+                }
 			else
-				ret = ((mem_size - 64) / 32) >> 4;
-		}  else if (kbd->type == 8 || kbd->type == 9) {
+				ret = (((mem_size + isa_mem_size) - 64) / 32) >> 4;
+		}  else if (kbd->type == KBD_TYPE_OLIVETTI
+                        || kbd->type == KBD_TYPE_ZENITH) {
 			/* Olivetti M19 or Zenith Data Systems Z-151 */
-			if (kbd->pb & 0x04)
+			if (kbd->pb & 0x04) /* PB2 */
 				ret = kbd->pd & 0xbf;
-			else 
+			else
 				ret = kbd->pd >> 4;
 		} else {
-			if (kbd->pb & 0x08)
+			if (kbd->pb & 0x08) /* PB3 */
 				ret = kbd->pd >> 4;
 			else {
 				/* LaserXT = Always 512k RAM;
 				   LaserXT/3 = Bit 0: set = 512k, clear = 256k. */
 #if defined(DEV_BRANCH) && defined(USE_LASERXT)
-				if (kbd->type == 6)
+				if (kbd->type == KBD_TYPE_TOSHIBA)
 					ret = ((mem_size == 512) ? 0x0d : 0x0c) | (hasfpu ? 0x02 : 0x00);
 				else
 #endif
@@ -622,19 +641,21 @@ kbd_read(uint16_t port, void *priv)
 
 		/* This is needed to avoid error 131 (cassette error).
 		   This is serial read: bit 5 = clock, bit 4 = data, cassette header is 256 x 0xff. */
-		if (kbd->type <= 1) {
+		if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) {
 			if (cassette == NULL)
 				ret |= (ppispeakon ? 0x10 : 0);
 			else
 				ret |= (pc_cas_get_inp(cassette) ? 0x10 : 0);
 		}
 
-		if (kbd->type == 5)
+		if (kbd->type == KBD_TYPE_TANDY)
 			ret |= (tandy1k_eeprom_read() ? 0x10 : 0);
 		break;
 
-	case 0x63:
-		if ((kbd->type == 2) || (kbd->type == 3) || (kbd->type == 4) || (kbd->type == 6))
+	case 0x63: /* Keyboard Configuration Register (aka Port D) */
+		if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86)
+                || (kbd->type == KBD_TYPE_COMPAQ)
+                || (kbd->type == KBD_TYPE_TOSHIBA))
 			ret = kbd->pd;
 		break;
     }
@@ -685,9 +706,14 @@ kbd_init(const device_t *info)
 
     video_reset(gfxcard);
 
-    if ((kbd->type <= 3) || (kbd->type == 4) || (kbd->type == 6) || (kbd->type == 8)) {
+    if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)
+            || (kbd->type == KBD_TYPE_XT82) || (kbd->type <= KBD_TYPE_XT86)
+            || (kbd->type == KBD_TYPE_COMPAQ)
+            || (kbd->type == KBD_TYPE_TOSHIBA)
+            || (kbd->type == KBD_TYPE_OLIVETTI)) {
+
         /* DIP switch readout: bit set = OFF, clear = ON. */
-        if (kbd->type == 8)
+        if (kbd->type == KBD_TYPE_OLIVETTI)
 		/* Olivetti M19
 		 * Jumpers J1, J2 - monitor type. 
 		 * 01 - mono (high-res)
@@ -699,10 +725,13 @@ kbd_init(const device_t *info)
 		    /* Switches 7, 8 - floppy drives. */
 		    kbd->pd = get_fdd_switch_settings();
 
+        /* Siitches 5, 6 - video card type */
 	    kbd->pd |= get_videomode_switch_settings();
 
         /* Switches 3, 4 - memory size. */
-        if ((kbd->type == 3) || (kbd->type == 4) || (kbd->type == 6)) {
+        if ((kbd->type == KBD_TYPE_XT86)
+                || (kbd->type == KBD_TYPE_COMPAQ)
+                || (kbd->type == KBD_TYPE_TOSHIBA)) {
             switch (mem_size) {
                 case 256:
                     kbd->pd |= 0x00;
@@ -718,34 +747,49 @@ kbd_init(const device_t *info)
                     kbd->pd |= 0x0c;
                     break;
             }
-	    } else if (kbd->type >= 1) {
+	    } else if (kbd->type == KBD_TYPE_XT82) {
             switch (mem_size) {
-                case 64:
+                case 64:  /* 1x64k */
                     kbd->pd |= 0x00;
                     break;
-                case 128:
+                case 128: /* 2x64k */
                     kbd->pd |= 0x04;
                     break;
-                case 192:
+                case 192: /* 3x64k */
                     kbd->pd |= 0x08;
                     break;
-                case 256:
+                case 256: /* 4x64k */
                 default:
                     kbd->pd |= 0x0c;
                     break;
             }
-        } else {
+	    } else if (kbd->type == KBD_TYPE_PC82) {
             switch (mem_size) {
-                case 16:
-                    kbd->pd |= 0x00;
-                    break;
-                case 32:
-                    kbd->pd |= 0x04;
-                    break;
-                case 48:
+                case 192: /* 3x64k, not supported by stock BIOS due to bugs */
                     kbd->pd |= 0x08;
                     break;
-                case 64:
+                case 64:  /* 4x16k */
+                case 96:  /* 2x32k + 2x16k */
+                case 128: /* 4x32k */
+                case 160: /* 2x64k + 2x16k */
+                case 224: /* 3x64k + 1x32k */
+                case 256: /* 4x64k */
+                default:
+                    kbd->pd |= 0x0c;
+                    break;
+            }
+        } else { /* really just the PC '81 */
+            switch (mem_size) {
+                case 16: /* 1x16k */
+                    kbd->pd |= 0x00;
+                    break;
+                case 32: /* 2x16k */
+                    kbd->pd |= 0x04;
+                    break;
+                case 48: /* 3x16k */
+                    kbd->pd |= 0x08;
+                    break;
+                case 64: /* 4x16k */
                 default:
                     kbd->pd |= 0x0c;
                     break;
@@ -755,7 +799,7 @@ kbd_init(const device_t *info)
         /* Switch 2 - 8087 FPU. */
         if (hasfpu)
             kbd->pd |= 0x02;
-    } else if (kbd-> type == 9) {
+    } else if (kbd-> type == KBD_TYPE_ZENITH) {
         /* Zenith Data Systems Z-151
         * SW2 switch settings:
         * bit 7: monitor frequency
@@ -799,8 +843,8 @@ kbd_init(const device_t *info)
 
     keyboard_set_table(scancode_xt);
 
-    is_tandy = (kbd->type == 5);
-    is_t1x00 = (kbd->type == 6);
+    is_tandy = (kbd->type == KBD_TYPE_TANDY);
+    is_t1x00 = (kbd->type == KBD_TYPE_TOSHIBA);
 
     is_amstrad = 0;
 
@@ -831,7 +875,7 @@ kbd_close(void *priv)
 const device_t keyboard_pc_device = {
     "IBM PC Keyboard (1981)",
     0,
-    0,
+    KBD_TYPE_PC81,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -841,7 +885,7 @@ const device_t keyboard_pc_device = {
 const device_t keyboard_pc82_device = {
     "IBM PC Keyboard (1982)",
     0,
-    1,
+    KBD_TYPE_PC82,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -851,7 +895,7 @@ const device_t keyboard_pc82_device = {
 const device_t keyboard_xt_device = {
     "XT (1982) Keyboard",
     0,
-    2,
+    KBD_TYPE_XT82,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -861,7 +905,7 @@ const device_t keyboard_xt_device = {
 const device_t keyboard_xt86_device = {
     "XT (1986) Keyboard",
     0,
-    3,
+    KBD_TYPE_XT86,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -871,7 +915,7 @@ const device_t keyboard_xt86_device = {
 const device_t keyboard_xt_compaq_device = {
     "Compaq Portable Keyboard",
     0,
-    4,
+    KBD_TYPE_COMPAQ,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -881,7 +925,7 @@ const device_t keyboard_xt_compaq_device = {
 const device_t keyboard_tandy_device = {
     "Tandy 1000 Keyboard",
     0,
-    5,
+    KBD_TYPE_TANDY,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -891,7 +935,7 @@ const device_t keyboard_tandy_device = {
 const device_t keyboard_xt_t1x00_device = {
     "Toshiba T1x00 Keyboard",
     0,
-    6,
+    KBD_TYPE_TOSHIBA,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -902,7 +946,7 @@ const device_t keyboard_xt_t1x00_device = {
 const device_t keyboard_xt_lxt3_device = {
     "VTech Laser XT3 Keyboard",
     0,
-    7,
+    KBD_TYPE_VTECH,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -913,7 +957,7 @@ const device_t keyboard_xt_lxt3_device = {
 const device_t keyboard_xt_olivetti_device = {
     "Olivetti XT Keyboard",
     0,
-    8,
+    KBD_TYPE_OLIVETTI,
     kbd_init,
     kbd_close,
     kbd_reset,
@@ -923,7 +967,7 @@ const device_t keyboard_xt_olivetti_device = {
 const device_t keyboard_xt_zenith_device = {
     "Zenith XT Keyboard",
     0,
-    9,
+    KBD_TYPE_ZENITH,
     kbd_init,
     kbd_close,
     kbd_reset,
diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c
index 545eafd72..5f47a5c34 100644
--- a/src/floppy/fdc.c
+++ b/src/floppy/fdc.c
@@ -2311,7 +2311,7 @@ fdc_reset(void *priv)
     fdc->max_track = (fdc->flags & FDC_FLAG_MORE_TRACKS) ? 85 : 79;
 
     fdc_remove(fdc);
-    fdc_set_base(fdc, (fdc->flags & FDC_FLAG_PCJR) ? 0x00f0 : 0x03f0);
+    fdc_set_base(fdc, (fdc->flags & FDC_FLAG_PCJR) ? FDC_PRIMARY_PCJR_ADDR : FDC_PRIMARY_ADDR);
 
     current_drive = 0;
 
@@ -2342,12 +2342,12 @@ fdc_init(const device_t *info)
 
     fdc->flags = info->local;
 
-    fdc->irq = 6;
+    fdc->irq = FDC_PRIMARY_IRQ;
 
     if (fdc->flags & FDC_FLAG_PCJR)
 	timer_add(&fdc->watchdog_timer, fdc_watchdog_poll, fdc, 0);
     else
-	fdc->dma_ch = 2;
+	fdc->dma_ch = FDC_PRIMARY_DMA;
 
     fdc_log("FDC added: %04X (flags: %08X)\n", fdc->base_address, fdc->flags);
 
diff --git a/src/floppy/fdc_magitronic.c b/src/floppy/fdc_magitronic.c
index 2242cf760..807e021e7 100644
--- a/src/floppy/fdc_magitronic.c
+++ b/src/floppy/fdc_magitronic.c
@@ -101,7 +101,7 @@ b215_init(const device_t *info)
     rom_init(&dev->rom, ROM_B215, ROM_ADDR, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL);
 
     dev->fdc_controller = device_add(&fdc_um8398_device);
-    io_sethandler(0x03f0, 1, b215_read, NULL, NULL, NULL, NULL, NULL, dev);
+    io_sethandler(FDC_PRIMARY_ADDR, 1, b215_read, NULL, NULL, NULL, NULL, NULL, dev);
 
     return dev;
 }
diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h
index e5f0bac94..af4a6a962 100644
--- a/src/include/86box/86box.h
+++ b/src/include/86box/86box.h
@@ -122,7 +122,8 @@ extern int	sound_is_float,			/* (C) sound uses FP values */
 		GUS, GUSMAX,			/* (C) sound option */
 		SSI2001,			/* (C) sound option */
 		voodoo_enabled;			/* (C) video option */
-extern uint32_t	mem_size;			/* (C) memory size */
+extern uint32_t	mem_size;			/* (C) memory size (Installed on system board) */
+extern uint32_t	isa_mem_size;		/* (C) memory size (ISA Memory Cards) */
 extern int	cpu,				/* (C) cpu type */
 		cpu_use_dynarec,		/* (C) cpu uses/needs Dyna */
 		fpu_type;			/* (C) fpu type */
diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h
index 87404e174..f50e82b58 100644
--- a/src/include/86box/fdc.h
+++ b/src/include/86box/fdc.h
@@ -24,6 +24,22 @@
 
 extern int fdc_type;
 
+#define FDC_PRIMARY_ADDR		0x03f0
+#define FDC_PRIMARY_IRQ			6
+#define FDC_PRIMARY_DMA			2
+#define FDC_PRIMARY_PCJR_ADDR	0x00f0
+#define FDC_PRIMARY_PCJR_IRQ	6
+#define FDC_PRIMARY_PCJR_DMA	2
+#define FDC_SECONDARY_ADDR		0x0370
+#define FDC_SECONDARY_IRQ		6
+#define FDC_SECONDARY_DMA		2
+#define FDC_TERTIARY_ADDR		0x0360
+#define FDC_TERTIARY_IRQ		6
+#define FDC_TERTIARY_DMA		2
+#define FDC_QUATERNARY_ADDR		0x03e0
+#define FDC_QUATERNARY_IRQ		6
+#define FDC_QUATERNARY_DMA		2
+
 #define FDC_FLAG_PCJR		0x01	/* PCjr */
 #define FDC_FLAG_DISKCHG_ACTLOW	0x02	/* Amstrad, PS/1, PS/2 ISA */
 #define FDC_FLAG_AT		0x04	/* AT+, PS/x */
diff --git a/src/include/86box/snd_mpu401.h b/src/include/86box/snd_mpu401.h
index 93df18a80..433bf09a1 100644
--- a/src/include/86box/snd_mpu401.h
+++ b/src/include/86box/snd_mpu401.h
@@ -19,6 +19,8 @@
  *		Copyright 2016-2020 Miran Grca.
  *		Copyright 2016-2020 TheCollector1995.
  */
+#ifndef SOUND_MPU401_H
+# define SOUND_MPU401_H
 
 #define MPU401_VERSION	0x15
 #define MPU401_REVISION	0x01
@@ -160,3 +162,6 @@ extern void	mpu401_irq_attach(mpu_t *mpu, void (*ext_irq_update)(void *priv, int
 
 extern int	MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort);
 extern void	MPU401_InputMsg(void *p, uint8_t *msg, uint32_t len);
+
+
+#endif	/*SOUND_MPU401_H*/
diff --git a/src/machine/machine.c b/src/machine/machine.c
index 59c4bee04..5813c1d1a 100644
--- a/src/machine/machine.c
+++ b/src/machine/machine.c
@@ -40,6 +40,7 @@
 #include "cpu.h"
 #include <86box/video.h>
 #include <86box/machine.h>
+#include <86box/isamem.h>
 
 
 int bios_only = 0;
@@ -101,6 +102,9 @@ machine_init_ex(int m)
 	/* Prepare some video-related things if we're using internal
 	   or no video. */
 	video_pre_reset(gfxcard);
+
+	/* Reset any ISA memory cards. */
+	isamem_reset();
     }
 
     /* All good, boot the machine! */
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index 17a3dc335..3a95bebda 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -105,7 +105,7 @@ const machine_type_t machine_types[] = {
 const machine_t machines[] = {
     /* 8088 Machines */
     { "[8088] IBM PC (1981)",			"ibmpc",		MACHINE_TYPE_8088,		CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0,										MACHINE_PC,									   16,    64,  16,    0,		      machine_pc_init, NULL			},
-    { "[8088] IBM PC (1982)",			"ibmpc82",		MACHINE_TYPE_8088,		CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0,										MACHINE_PC,									  256,   256, 256,    0,		    machine_pc82_init, NULL			},
+    { "[8088] IBM PC (1982)",			"ibmpc82",		MACHINE_TYPE_8088,		CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0,										MACHINE_PC,									   64,   256,  64,    0,		      machine_pc82_init, NULL		},
     { "[8088] IBM PCjr",			"ibmpcjr",		MACHINE_TYPE_8088,		CPU_PKG_8088, 0, 4772728, 4772728, 0, 0, 0, 0,									MACHINE_PC | MACHINE_VIDEO_FIXED | MACHINE_CARTRIDGE,				  128,   640, 128,    0,		    machine_pcjr_init, pcjr_get_device		},
     { "[8088] IBM XT (1982)",			"ibmxt",		MACHINE_TYPE_8088,		CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0,										MACHINE_PC,									   64,   256,  64,    0,		      machine_xt_init, NULL			},
     { "[8088] IBM XT (1986)",			"ibmxt86",		MACHINE_TYPE_8088,		CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0,										MACHINE_PC,									  256,   640,  64,    0,		    machine_xt86_init, NULL			},
diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c
index 13744c3cd..ed97f2ab2 100644
--- a/src/scsi/scsi_aha154x.c
+++ b/src/scsi/scsi_aha154x.c
@@ -1259,6 +1259,9 @@ static const device_config_t aha_154xb_config[] = {
                         {
                                 "D800H", 0xd8000
                         },
+                        {
+                                "DC00H", 0xdc000
+                        },
                         {
                                 ""
                         }
@@ -1357,6 +1360,9 @@ static const device_config_t aha_154x_config[] = {
                         {
                                 "D800H", 0xd8000
                         },
+                        {
+                                "DC00H", 0xdc000
+                        },
                         {
                                 ""
                         }
@@ -1450,12 +1456,21 @@ static const device_config_t aha_154xcf_config[] = {
                         {
                                 "C800H", 0xc8000
                         },
+                        {
+                                "CC00H", 0xcc000
+                        },
                         {
                                 "D000H", 0xd0000
                         },
+                        {
+                                "D400H", 0xd4000
+                        },
                         {
                                 "D800H", 0xd8000
                         },
+                        {
+                                "DC00H", 0xdc000
+                        },
                         {
                                 ""
                         }
diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c
index 3a085241c..483b7548c 100644
--- a/src/sound/snd_pas16.c
+++ b/src/sound/snd_pas16.c
@@ -17,6 +17,7 @@
 #include <86box/filters.h>
 #include <86box/snd_mpu401.h>
 #include <86box/snd_opl.h>
+#include <86box/snd_sb.h>
 #include <86box/snd_sb_dsp.h>
 
 
@@ -413,7 +414,7 @@ static void pas16_pit_out(uint16_t port, uint8_t val, void *p)
                 {
                         if (!(val & 0x20))
                         {
-                                if (val & 2) pas16->pit.rl[0] = timer_get_remaining_u64(&pit.timer[0]) / PITCONST;;
+                                if (val & 2) pas16->pit.rl[0] = timer_get_remaining_u64(&pas16->pit.timer[0]) / PITCONST;;
                                 if (val & 4) pas16->pit.rl[1] = pas16->pit.c[1];
                                 if (val & 8) pas16->pit.rl[2] = pas16->pit.c[2];
                         }
@@ -429,7 +430,7 @@ static void pas16_pit_out(uint16_t port, uint8_t val, void *p)
                 if (!(pas16->pit.ctrl & 0x30))
                 {
 			if (!t)
-                                pas16->pit.rl[t] = timer_get_remaining_u64(&pit.timer[t]) / PITCONST;
+                                pas16->pit.rl[t] = timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST;
 			else
 			{
 	                        pas16->pit.rl[t] = pas16->pit.c[t];
@@ -450,7 +451,7 @@ static void pas16_pit_out(uint16_t port, uint8_t val, void *p)
                         {
                                 pas16->pit.rm[t] = 3;
 				if (!t)
-                                        pas16->pit.rl[t] = timer_get_remaining_u64(&pit.timer[t]) / PITCONST;
+                                        pas16->pit.rl[t] = timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST;
 				else
 	                                pas16->pit.rl[t] = pas16->pit.c[t];
                         }
@@ -519,8 +520,8 @@ static uint8_t pas16_pit_in(uint16_t port, void *p)
                         pas16->pit.rereadlatch[t] = 0;
                         if (!t)
                         {
-                                pas16->pit.rl[t] = timer_get_remaining_u64(&pit.timer[t]) / PITCONST;
-                                if ((timer_get_remaining_u64(&pit.timer[t]) / PITCONST) > 65536) 
+                                pas16->pit.rl[t] = timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST;
+                                if ((timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST) > 65536) 
                                         pas16->pit.rl[t] = 0xFFFF;
                         }
                         else
diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw
index de29effc5..9ee608c4f 100644
--- a/src/win/Makefile.mingw
+++ b/src/win/Makefile.mingw
@@ -69,6 +69,12 @@ ifeq ($(DEV_BUILD), y)
  ifndef XL24
   XL24		:= y
  endif
+ ifndef ISAMEM_RAMPAGE
+  ISAMEM_RAMPAGE := y
+ endif
+ ifndef ISAMEM_IAB
+  ISAMEM_IAB := y
+ endif
  ifndef OLIVETTI
   OLIVETTI	:= y
  endif
@@ -118,6 +124,12 @@ else
  ifndef XL24
   XL24		:= n
  endif
+ ifndef ISAMEM_RAMPAGE
+  ISAMEM_RAMPAGE := n
+ endif
+ ifndef ISAMEM_IAB
+  ISAMEM_IAB := n
+ endif
  ifndef OLIVETTI
   OLIVETTI	:= n
  endif
@@ -450,6 +462,14 @@ ifeq ($(XL24), y)
 OPTS		+= -DUSE_XL24
 endif
 
+ifeq ($(ISAMEM_RAMPAGE), y)
+OPTS        += -DUSE_ISAMEM_RAMPAGE
+endif
+
+ifeq ($(ISAMEM_IAB), y)
+OPTS        += -DUSE_ISAMEM_IAB
+endif
+
 ifeq ($(OLIVETTI), y)
 OPTS		+= -DUSE_OLIVETTI
 DEVBROBJ	+= olivetti_eva.o
diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc
index 6bb1f222a..43289dbfc 100644
--- a/src/win/languages/ru-RU.rc
+++ b/src/win/languages/ru-RU.rc
@@ -31,8 +31,8 @@ BEGIN
     END
     POPUP "&Вид"
     BEGIN
-        MENUITEM "&Скрыть строку статуса",		IDM_VID_HIDE_STATUS_BAR
-        MENUITEM "Hide &toolbar",		IDM_VID_HIDE_TOOLBAR
+        MENUITEM "&Скрыть строку состояния",		IDM_VID_HIDE_STATUS_BAR
+        MENUITEM "С&крыть панель инструментов",		IDM_VID_HIDE_TOOLBAR
         MENUITEM SEPARATOR
         MENUITEM "&Изменяемый размер окна",          IDM_VID_RESIZE
         MENUITEM "&Запомнить размер и положение",  IDM_VID_REMEMBER
@@ -98,7 +98,7 @@ BEGIN
     POPUP "&Инструменты"
     BEGIN
         MENUITEM "&Настройки машины...",                IDM_CONFIG
-        MENUITEM "&Обновление значков строки статуса",	IDM_UPDATE_ICONS
+        MENUITEM "&Обновление значков строки состояния",	IDM_UPDATE_ICONS
         MENUITEM SEPARATOR
         MENUITEM "Сделать с&криншот\tCtrl+F11",  IDM_ACTION_SCREENSHOT
         MENUITEM SEPARATOR
@@ -208,7 +208,7 @@ CdromSubmenu MENU DISCARDABLE
 BEGIN
     POPUP ""
     BEGIN
-        MENUITEM "&Mute",					IDM_CDROM_MUTE
+        MENUITEM "О&тключить звук",					IDM_CDROM_MUTE
         MENUITEM SEPARATOR
         MENUITEM "П&устой",					IDM_CDROM_EMPTY
         MENUITEM "&Снова загрузить предыдущий образ",			IDM_CDROM_RELOAD
@@ -294,8 +294,8 @@ END
 #define STR_MACHINE_TYPE	"Тип машины:"
 #define STR_MACHINE		"Системная плата:"
 #define STR_CONFIGURE		"Настройка"
-#define STR_CPU_TYPE		"Тип ЦПУ:"
-#define STR_SPEED		"Speed:"
+#define STR_CPU_TYPE		"Тип ЦП:"
+#define STR_SPEED		"Скорость:"
 #define STR_FPU			"FPU:"
 #define STR_WAIT_STATES		"Циклы ожидания:"
 #define STR_MB			"МБ"
@@ -463,7 +463,7 @@ BEGIN
     IDS_2102	"Система управления полетом Thrustmaster"
     IDS_2103	"Нет"
     IDS_2104	"Невозможно загрузить ускорители клавиатуры."
-    IDS_2105	"Невозможно зарегистрировать необработанный ввод."
+    IDS_2105	"Невозможно зарегистрировать необработанный (RAW) ввод."
     IDS_2106	"%u"
     IDS_2107	"%u МБ (CHS: %i, %i, %i)"
     IDS_2108	"Дисковод %i (%s): %ls"
@@ -525,21 +525,21 @@ BEGIN
     IDS_2143	"Шейдеры OpenGL (*.GLSL)\0*.GLSL\0Все файлы (*.*)\0*.*\0"
     IDS_2144	"Параметры OpenGL"
     IDS_2145	"Вы загружаете неподдерживаемую конфигурацию"
-    IDS_2146	"Выбор типов CPU для этой системной платы на данной эмулируемой машине отключен.\n\nЭто позволяет выбрать процессор, который в противном случае несовместим с выбранной материнской платой. Однако, вы можете столкнуться с несовместимостью с BIOS материнской платы или другим ПО.\n\nВключение этого параметра официально не поддерживается, и все поданные отчеты об ошибках могут быть закрыты как недействительные."
+    IDS_2146	"Выбор типов ЦП для этой системной платы на данной эмулируемой машине отключен.\n\nЭто позволяет выбрать процессор, который в противном случае несовместим с выбранной материнской платой. Однако, вы можете столкнуться с несовместимостью с BIOS материнской платы или другим ПО.\n\nВключение этого параметра официально не поддерживается, и все поданные отчеты об ошибках могут быть закрыты как недействительные."
     IDS_2147	"Продолжить"
     IDS_2148	"Кассета: %s"
     IDS_2149	"Образы кассет (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Все файлы (*.*)\0*.*\0"
     IDS_2150	"Картридж %i: %ls"
     IDS_2151	"Образы картриджей (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Все файлы (*.*)\0*.*\0"
-    IDS_2152	"Error initializing renderer"
-    IDS_2153	"OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-    IDS_2154	"Resume execution"
-    IDS_2155	"Pause execution"
-    IDS_2156	"Press Ctrl+Alt+Del"
-    IDS_2157	"Press Ctrl+Alt+Esc"
-    IDS_2158	"Hard reset"
-    IDS_2159	"ACPI shutdown"
-    IDS_2160	"Settings"
+    IDS_2152	"Ошибка инициализации рендерера"
+    IDS_2153	"Невозможно инициализировать рендерер OpenGL (3.0). Пожалуйста, используйте другой рендерер."
+    IDS_2154	"Возобновить выполнение"
+    IDS_2155	"Приостановить выполнение"
+    IDS_2156	"Нажать Ctrl+Alt+Del"
+    IDS_2157	"Нажать Ctrl+Alt+Esc"
+    IDS_2158	"Холодная перезагрузка"
+    IDS_2159	"Сигнал завершения ACPI"
+    IDS_2160	"Настройки машины"
 END
 
 STRINGTABLE DISCARDABLE 
@@ -548,10 +548,10 @@ BEGIN
     IDS_4097	"%01i:%01i"
     IDS_4098	"%01i"
     IDS_4099	"MFM/RLL или ESDI дисководов CD-ROM никогда не существовало"
-    IDS_4100	"Custom..."
-    IDS_4101	"Custom (large)..."
+    IDS_4100	"Задать вручную..."
+    IDS_4101	"Задать вручную (large)..."
     IDS_4102	"Создать новый жёсткий диск"
-    IDS_4103	"Добавить существующий жёсткий диск"
+    IDS_4103	"Выбрать существующий жёсткий диск"
     IDS_4104	"Размер образов дисков HDI не может превышать 4 ГБ."
     IDS_4105	"Размер образов дисков не может превышать 127 ГБ."
     IDS_4106	"Образы жёстких дисков (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Все файлы (*.*)\0*.*\0"
diff --git a/src/win/win_new_floppy.c b/src/win/win_new_floppy.c
index b692a070e..4f0f1255f 100644
--- a/src/win/win_new_floppy.c
+++ b/src/win/win_new_floppy.c
@@ -52,8 +52,13 @@ typedef struct {
 } disk_size_t;
 
 
-static const disk_size_t disk_sizes[14] = {	{	0,  1, 2, 1, 0,  40,  8, 2, 0xfe, 2, 2,  1,  64 },		/* 160k */
-						{	0,  1, 2, 1, 0,  40,  9, 2, 0xfc, 2, 2,  1,  64 },		/* 180k */
+static const disk_size_t disk_sizes[14] = {
+//						{	1,  1, 2, 1, 1,  77, 26, 0,    0, 4, 2,  6,  68 },		/* 250k 8" */
+//						{	1,  2, 2, 1, 1,  77, 26, 0,    0, 4, 2,  6,  68 },		/* 500k 8" */
+//						{	1,  1, 2, 1, 1,  77,  8, 3,    0, 1, 2,  2, 192 },		/* 616k 8" */
+//						{	1,  2, 0, 1, 1,  77,  8, 3,    0, 1, 2,  2, 192 },		/* 1232k 8" */
+						{	0,  1, 2, 1, 0,  40,  8, 2, 0xfe, 1, 2,  1,  64 },		/* 160k */
+						{	0,  1, 2, 1, 0,  40,  9, 2, 0xfc, 1, 2,  2,  64 },		/* 180k */
 						{	0,  2, 2, 1, 0,  40,  8, 2, 0xff, 2, 2,  1, 112 },		/* 320k */
 						{	0,  2, 2, 1, 0,  40,  9, 2, 0xfd, 2, 2,  2, 112 },		/* 360k */
 						{	0,  2, 2, 1, 0,  80,  8, 2, 0xfb, 2, 2,  2, 112 },		/* 640k */
@@ -698,7 +703,7 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
     uint8_t disk_size, rpm_mode;
     int ret;
     FILE *f;
-    int zip_types, mo_types;
+    int zip_types, mo_types, floppy_types;
     wchar_t *twcs;
 
     switch (message) {
@@ -716,7 +721,8 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
 			for (i = 0; i < mo_types; i++)
 		                SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_5902 + i));
 		} else {
-			for (i = 0; i < 12; i++)
+			floppy_types = 12;
+			for (i = 0; i < floppy_types; i++)
 		                SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_5888 + i));
 		}
                 SendMessage(h, CB_SETCURSEL, 0, 0);