From 9521237b0b8718a31f47f52448108d21776114d4 Mon Sep 17 00:00:00 2001 From: SarahW Date: Sun, 16 Jul 2017 16:17:59 +0100 Subject: [PATCH] Added Samsung SPC-4200P emulation. IDE Drive Diagnostics command now doesn't complete immediately (required by SPC-4200P BIOS). Patch from Greatpsycho. --- src/ibm.h | 1 + src/ide.c | 6 ++++++ src/mem.c | 7 +++++++ src/model.c | 1 + src/nvr.c | 2 ++ 5 files changed, 17 insertions(+) diff --git a/src/ibm.h b/src/ibm.h index 81e5ae4..df8dcfa 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -404,6 +404,7 @@ enum ROM_CMDPC30, ROM_AMI286, ROM_AWARD286, + ROM_SPC4200P, ROM_DELL200, ROM_MISC286, ROM_IBMAT386, diff --git a/src/ide.c b/src/ide.c index 6d5d4e3..085097b 100644 --- a/src/ide.c +++ b/src/ide.c @@ -1045,6 +1045,12 @@ void writeide(int ide_board, uint16_t addr, uint8_t val) return; case WIN_DRIVE_DIAGNOSTICS: /* Execute Drive Diagnostics */ + ide->atastat = BUSY_STAT; + timer_process(); + idecallback[ide_board]=200*IDE_TIME; + timer_update_outstanding(); + return; + case WIN_PIDENTIFY: /* Identify Packet Device */ case WIN_SET_MULTIPLE_MODE: /*Set Multiple Mode*/ // output=1; diff --git a/src/mem.c b/src/mem.c index a9eb585..031d1f8 100644 --- a/src/mem.c +++ b/src/mem.c @@ -385,6 +385,13 @@ int loadbios() fclose(f); return 1; + case ROM_SPC4200P: + f=romfopen("spc4200p/u8.01","rb"); + if (!f) break; + fread(rom,65536,1,f); + fclose(f); + return 1; + case ROM_EUROPC: // return 0; f=romfopen("europc/50145","rb"); diff --git a/src/model.c b/src/model.c index 1a0d512..ca64a94 100644 --- a/src/model.c +++ b/src/model.c @@ -123,6 +123,7 @@ MODEL models[] = {"[286] IBM PS/1 model 2011", ROM_IBMPS1_2011, "ibmps1es", { {"", cpus_ps1_m2011}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2, 512,16384,512, ps1_m2011_init, NULL}, {"[286] IBM PS/2 Model 30-286", ROM_IBMPS2_M30_286, "ibmps2_m30_286", { {"", cpus_ps2_m30_286}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps2_m30_286_init, NULL}, {"[286] IBM PS/2 Model 50", ROM_IBMPS2_M50, "ibmps2_m50", { {"", cpus_ps2_m30_286}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 16, 1, ps2_model_50_init, NULL}, + {"[286] Samsung SPC-4200P", ROM_SPC4200P, "spc4200p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 512,2048, 128, at_scat_init, NULL}, {"[386SX] Acer 386SX25/N", ROM_ACER386, "acer386", { {"Intel", cpus_acer}, {"", NULL}, {"", NULL}}, 1, MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, at_acer386sx_init, NULL}, {"[386SX] AMI 386SX clone", ROM_AMI386SX, "ami386", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, 0, MODEL_AT|MODEL_HAS_IDE, 512,16384,128, at_headland_init, NULL}, diff --git a/src/nvr.c b/src/nvr.c index 33df4b6..9258eea 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -227,6 +227,7 @@ void loadnvr() case ROM_CMDPC30: f = nvrfopen("cmdpc30.nvr", "rb"); nvrmask = 127; break; case ROM_AMI286: f = nvrfopen("ami286.nvr", "rb"); nvrmask = 127; break; case ROM_AWARD286: f = nvrfopen("award286.nvr", "rb"); nvrmask = 127; break; + case ROM_SPC4200P: f = nvrfopen("spc4200p.nvr", "rb"); nvrmask = 127; break; case ROM_DELL200: f = nvrfopen("dell200.nvr", "rb"); nvrmask = 127; break; case ROM_IBMAT386: f = nvrfopen("at386.nvr", "rb"); nvrmask = 127; break; case ROM_DESKPRO_386: f = nvrfopen("deskpro386.nvr", "rb"); break; @@ -290,6 +291,7 @@ void savenvr() case ROM_CMDPC30: f = nvrfopen("cmdpc30.nvr", "wb"); break; case ROM_AMI286: f = nvrfopen("ami286.nvr", "wb"); break; case ROM_AWARD286: f = nvrfopen("award286.nvr", "wb"); break; + case ROM_SPC4200P: f = nvrfopen("spc4200p.nvr", "wb"); break; case ROM_DELL200: f = nvrfopen("dell200.nvr", "wb"); break; case ROM_IBMAT386: f = nvrfopen("at386.nvr", "wb"); break; case ROM_DESKPRO_386: f = nvrfopen("deskpro386.nvr", "wb"); break;