From c8638b9b2be6b73351376b3f14686a7974e96687 Mon Sep 17 00:00:00 2001 From: SarahW Date: Sat, 7 Mar 2020 13:47:37 +0000 Subject: [PATCH] Added Samsung SPC-4620P. Patch from Greatpsycho. --- src/ibm.h | 1 + src/mem_bios.c | 21 +++++++++++++++++++++ src/model.c | 1 + src/nvr.c | 2 ++ src/scat.c | 1 + src/vid_ati28800.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/vid_ati28800.h | 1 + src/video.c | 22 ++++++++++++++++++++-- 8 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/ibm.h b/src/ibm.h index bcaf310..889d029 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -200,6 +200,7 @@ enum ROM_GW286CT, ROM_SPC4200P, ROM_SPC4216P, + ROM_SPC4620P, ROM_DELL200, ROM_MISC286, ROM_IBMAT386, diff --git a/src/mem_bios.c b/src/mem_bios.c index 956c526..85f8169 100644 --- a/src/mem_bios.c +++ b/src/mem_bios.c @@ -418,6 +418,27 @@ int loadbios() } break; + case ROM_SPC4620P: + f=romfopen("spc4620p/svb6120a_font.rom","rb"); + if (!f) break; + fclose(f); + f = romfopen("spc4620p/31005h.u8", "rb"); + ff = romfopen("spc4620p/31005h.u10","rb"); + if (f && ff) + { + fseek(f, 0x8000, SEEK_SET); + fseek(ff, 0x8000, SEEK_SET); + for (c = 0x0000; c < 0x10000; c += 2) + { + rom[c] = getc(f); + rom[c + 1] = getc(ff); + } + fclose(ff); + fclose(f); + return 1; + } + break; + case ROM_EUROPC: // return 0; f=romfopen("europc/50145","rb"); diff --git a/src/model.c b/src/model.c index 97ea917..1e205e5 100644 --- a/src/model.c +++ b/src/model.c @@ -183,6 +183,7 @@ MODEL models[] = {"[286] IBM XT Model 286", ROM_IBMXT286, "ibmxt286", { {"", cpus_ibmxt286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT, 256,15872, 128, ibm_at_init, NULL}, {"[286] Samsung SPC-4200P", ROM_SPC4200P, "spc4200p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 512, 2048, 128, at_scat_init, NULL}, {"[286] Samsung SPC-4216P", ROM_SPC4216P, "spc4216p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 5, 1, at_scat_init, NULL}, + {"[286] Samsung SPC-4620P", ROM_SPC4620P, "spc4620p", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_DISABLE_HW|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 5, 1, at_scat_init, NULL}, {"[286] Toshiba T3100e", ROM_T3100E, "t3100e", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED|MODEL_AT|MODEL_HAS_IDE, 1024, 5120, 256, at_t3100e_init, NULL}, {"[286] Trigem 286M", ROM_TG286M, "tg286m", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 512, 8192, 128, at_headland_init, NULL}, {"[286] Tulip AT Compact", ROM_TULIP_TC7, "tulip_tc7", { {"", cpus_286}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 640,15872, 128, ibm_at_init, NULL}, diff --git a/src/nvr.c b/src/nvr.c index 4a5cead..1ebc5a9 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -301,6 +301,7 @@ void loadnvr() case ROM_GW286CT: f = nvrfopen("gw286ct.nvr", "rb"); nvrmask = 127; break; case ROM_SPC4200P: f = nvrfopen("spc4200p.nvr", "rb"); nvrmask = 127; break; case ROM_SPC4216P: f = nvrfopen("spc4216p.nvr", "rb"); nvrmask = 127; break; + case ROM_SPC4620P: f = nvrfopen("spc4620p.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; @@ -403,6 +404,7 @@ void savenvr() case ROM_GW286CT: f = nvrfopen("gw286ct.nvr", "wb"); break; case ROM_SPC4200P: f = nvrfopen("spc4200p.nvr", "wb"); break; case ROM_SPC4216P: f = nvrfopen("spc4216p.nvr", "wb"); break; + case ROM_SPC4620P: f = nvrfopen("spc4620p.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; diff --git a/src/scat.c b/src/scat.c index ca41c39..a4a4b3f 100644 --- a/src/scat.c +++ b/src/scat.c @@ -1369,6 +1369,7 @@ void scat_init() { case ROM_GW286CT: case ROM_SPC4216P: + case ROM_SPC4620P: scat_regs[SCAT_VERSION] = 4; break; default: diff --git a/src/vid_ati28800.c b/src/vid_ati28800.c index 005d1f0..a86bf2a 100644 --- a/src/vid_ati28800.c +++ b/src/vid_ati28800.c @@ -383,6 +383,39 @@ void *ati28800k_init() return ati28800; } +void *ati28800k_spc4620p_init() +{ + ati28800_t *ati28800 = malloc(sizeof(ati28800_t)); + memset(ati28800, 0, sizeof(ati28800_t)); + + ati28800->port_03dd_val = 0; + ati28800->get_korean_font_base = 0; + ati28800->get_korean_font_index = 0; + ati28800->get_korean_font_enabled = 0; + ati28800->get_korean_font_kind = 0; + ati28800->in_get_korean_font_kind_set = 0; + ati28800->ksc5601_mode_enabled = 0; + + rom_init_interleaved(&ati28800->bios_rom, "spc4620p/31005h.u8", "spc4620p/31005h.u10", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + loadfont("spc4620p/svb6120a_font.rom", 6); + + svga_init(&ati28800->svga, ati28800, 1 << 19, /*512kb*/ + ati28800k_recalctimings, + ati28800k_in, ati28800k_out, + NULL, + NULL); + + io_sethandler(0x01ce, 0x0002, ati28800k_in, NULL, NULL, ati28800k_out, NULL, NULL, ati28800); + io_sethandler(0x03c0, 0x0020, ati28800k_in, NULL, NULL, ati28800k_out, NULL, NULL, ati28800); + + ati28800->svga.miscout = 1; + ati28800->svga.ksc5601_sbyte_mask = 0; + + ati_eeprom_load(&ati28800->eeprom, "svb6120a.nvr", 0); + + return ati28800; +} + static int ati28800_available() { return rom_present("bios.bin"); @@ -457,3 +490,15 @@ device_t ati28800k_device = ati28800_force_redraw, ati28800k_add_status_info }; + +device_t ati28800k_spc4620p_device = +{ + "SVB-6120A", + 0, + ati28800k_spc4620p_init, + ati28800_close, + NULL, + ati28800_speed_changed, + ati28800_force_redraw, + ati28800k_add_status_info +}; diff --git a/src/vid_ati28800.h b/src/vid_ati28800.h index 51f3615..ed30dbb 100644 --- a/src/vid_ati28800.h +++ b/src/vid_ati28800.h @@ -1,2 +1,3 @@ extern device_t ati28800_device; extern device_t ati28800k_device; +extern device_t ati28800k_spc4620p_device; diff --git a/src/video.c b/src/video.c index 2c7dd21..1b3a91b 100644 --- a/src/video.c +++ b/src/video.c @@ -141,6 +141,7 @@ static video_timings_t timing_vga = {VIDEO_ISA, 8,16,32, 8,16,32}; static video_timings_t timing_ps1_svga = {VIDEO_ISA, 6, 8,16, 6, 8,16}; static video_timings_t timing_t3100e = {VIDEO_ISA, 8,16,32, 8,16,32}; static video_timings_t timing_t1000 = {VIDEO_ISA, 8,16,32, 8,16,32}; +static video_timings_t timing_spc4620p = {VIDEO_ISA, 2, 2, 4, 4, 4, 8}; static video_timings_t timing_pc425x = {VIDEO_BUS, 5, 5, 9, 20,20,30}; static video_timings_t timing_pb410a = {VIDEO_BUS, 5, 5, 9, 20,20,30}; static video_timings_t timing_pb570 = {VIDEO_BUS, 4, 4, 8, 10,10,20}; @@ -211,7 +212,11 @@ device_t *video_card_getdevice(int card, int romset) case ROM_MEGAPC: return ¶dise_wd90c11_megapc_device; - + + case ROM_SPC4620P: + if (card == GFX_BUILTIN) + return &ati28800k_spc4620p_device; + case ROM_ACER386: return &oti067_acer386_device; @@ -587,6 +592,11 @@ void video_updatetiming() if (gfxcard == GFX_BUILTIN) timing = &timing_wd90c11; break; + + case ROM_SPC4620P: + if (gfxcard == GFX_BUILTIN) + timing = &timing_spc4620p; + break; case ROM_ACER386: if (gfxcard == GFX_BUILTIN) @@ -780,7 +790,15 @@ void video_init() return; } break; - + + case ROM_SPC4620P: + if (gfxcard == GFX_BUILTIN) + { + device_add(&ati28800k_spc4620p_device); + return; + } + break; + case ROM_ACER386: device_add(&oti067_acer386_device); if (gfxcard != GFX_BUILTIN)