diff --git a/src/ibm.h b/src/ibm.h index 3edbad6..5d3ac3b 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -209,6 +209,8 @@ enum ROM_MEGAPC, ROM_AMA932J, ROM_AMI386SX, + ROM_SPC6000A, + ROM_SPC6033P, ROM_AMI486, ROM_WIN486, ROM_PCI486, diff --git a/src/keyboard_at.c b/src/keyboard_at.c index 40987c1..5cadb78 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -522,9 +522,9 @@ void keyboard_at_write(uint16_t port, uint8_t val, void *priv) key_ctrl_queue_start = key_ctrl_queue_end = 0; keyboard_at.status &= ~STAT_OFULL; } - /* T3100e expects STAT_IFULL to be set immediately + /* T3100e and Samsung SPC-6000A expects STAT_IFULL to be set immediately * after sending 0xAA */ - if(romset == ROM_T3100E) keyboard_at.status |= STAT_IFULL; + if(romset == ROM_T3100E || romset == ROM_SPC6000A) keyboard_at.status |= STAT_IFULL; keyboard_at.status |= STAT_SYSFLAG; keyboard_at.mem[0] |= 0x04; keyboard_at_adddata(0x55); diff --git a/src/mem_bios.c b/src/mem_bios.c index f524f57..270080d 100644 --- a/src/mem_bios.c +++ b/src/mem_bios.c @@ -446,6 +446,37 @@ int loadbios() } break; + case ROM_SPC6000A: + f = romfopen("spc6000a/3c80.u27", "rb"); + ff = romfopen("spc6000a/9f80.u26","rb"); + if (f && ff) + { + for (c = 0x8000; c < 0x10000; c += 2) + { + rom[c] = getc(f); + rom[c + 1] = getc(ff); + } + fclose(ff); + fclose(f); + return 1; + } + break; + + case ROM_SPC6033P: + f=romfopen("spc6033p/svb6120a_font.rom","rb"); + if (!f) break; + fclose(f); + f=romfopen("spc6033p/phoenix.bin","rb"); + if (f) + { + fseek(f, 0x10000, SEEK_SET); + romfread(rom,65536,1,f); + + 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 380a04f..1b8c40f 100644 --- a/src/model.c +++ b/src/model.c @@ -203,6 +203,7 @@ MODEL models[] = {"[386SX] IBM PS/2 Model 55SX", ROM_IBMPS2_M55SX, "ibmps2_m55sx", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 8, 1, ps2_model_55sx_init, NULL}, {"[386SX] KMX-C-02", ROM_KMXC02, "kmxc02", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT, 512,16384, 512, at_scatsx_init, NULL}, {"[386SX] Packard Bell Legend 300SX", ROM_PB_L300SX, "pb_l300sx", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 1, 16, 1, pb_l300sx_init, NULL}, + {"[386SX] Samsung SPC-6033P", ROM_SPC6033P, "spc6033p", { {"Intel", cpus_i386SX}, {"AMD", cpus_Am386SX}, {"Cyrix", cpus_486SLC}}, MODEL_GFX_DISABLE_HW|MODEL_AT|MODEL_PS2|MODEL_HAS_IDE, 2, 12, 2, at_scamp_init, NULL}, {"[386DX] AMI 386DX clone", ROM_AMI386DX_OPTI495, "ami386dx", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_opti495_init, NULL}, {"[386DX] Compaq Deskpro 386", ROM_DESKPRO_386, "deskpro386", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_NONE|MODEL_AT, 1, 15, 1, deskpro386_init, NULL}, @@ -210,6 +211,7 @@ MODEL models[] = {"[386DX] IBM PS/2 Model 70 (type 3)", ROM_IBMPS2_M70_TYPE3, "ibmps2_m70_type3", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PS2|MODEL_MCA, 2, 16, 2, ps2_model_70_init, NULL}, {"[386DX] IBM PS/2 Model 80", ROM_IBMPS2_M80, "ibmps2_m80", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_DISABLE_SW|MODEL_AT|MODEL_PS2|MODEL_MCA, 1, 12, 1, ps2_model_80_init, NULL}, {"[386DX] MR 386DX clone", ROM_MR386DX_OPTI495, "mr386dx", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_opti495_init, NULL}, + {"[386DX] Samsung SPC-6000A", ROM_SPC6000A, "spc6000a", { {"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 32, 1, at_cs8230_init, NULL}, {"[486] AMI 486 clone", ROM_AMI486, "ami486", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_ali1429_init, NULL}, {"[486] AMI WinBIOS 486", ROM_WIN486, "win486", { {"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}}, MODEL_GFX_NONE|MODEL_AT|MODEL_HAS_IDE, 1, 256, 1, at_ali1429_init, NULL}, diff --git a/src/nvr.c b/src/nvr.c index 452937d..2d14e08 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -303,6 +303,8 @@ void loadnvr() 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_SPC6000A: f = nvrfopen("spc6000a.nvr", "rb"); nvrmask = 127; break; + case ROM_SPC6033P: f = nvrfopen("spc6033p.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; @@ -408,6 +410,8 @@ void savenvr() 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_SPC6000A: f = nvrfopen("spc6000a.nvr", "wb"); break; + case ROM_SPC6033P: f = nvrfopen("spc6033p.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/vid_ati28800.c b/src/vid_ati28800.c index 8cdd8e8..1d024f4 100644 --- a/src/vid_ati28800.c +++ b/src/vid_ati28800.c @@ -268,7 +268,7 @@ uint8_t ati28800k_in(uint16_t addr, void *p) void ati28800_recalctimings(svga_t *svga) { ati28800_t *ati28800 = (ati28800_t *)svga->p; - pclog("ati28800_recalctimings\n"); + //pclog("ati28800_recalctimings\n"); switch (((ati28800->regs[0xbe] & 0x10) >> 1) | ((ati28800->regs[0xb9] & 2) << 1) | ((svga->miscout & 0x0C) >> 2)) { @@ -299,7 +299,7 @@ void ati28800_recalctimings(svga_t *svga) if (!svga->scrblank && (ati28800->regs[0xb0] & 0x20)) /*Extended 256 colour modes*/ { - pclog("8bpp_highres\n"); + //pclog("8bpp_highres\n"); svga->render = svga_render_8bpp_highres; svga->rowoffset <<= 1; svga->ma <<= 1; @@ -407,6 +407,40 @@ void *ati28800k_spc4620p_init() return ati28800; } +void *ati28800k_spc6033p_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(&ati28800->bios_rom, "spc6033p/phoenix.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + loadfont("spc6033p/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_spc6033p.nvr", 0); + + return ati28800; +} + static int ati28800_available() { return rom_present("bios.bin"); @@ -493,3 +527,15 @@ device_t ati28800k_spc4620p_device = ati28800_force_redraw, ati28800k_add_status_info }; + +device_t ati28800k_spc6033p_device = +{ + "SVB-6120A", + 0, + ati28800k_spc6033p_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 ed30dbb..2d2cd8a 100644 --- a/src/vid_ati28800.h +++ b/src/vid_ati28800.h @@ -1,3 +1,4 @@ extern device_t ati28800_device; extern device_t ati28800k_device; extern device_t ati28800k_spc4620p_device; +extern device_t ati28800k_spc6033p_device; diff --git a/src/video.c b/src/video.c index d0bca3f..fd78a5c 100644 --- a/src/video.c +++ b/src/video.c @@ -217,6 +217,12 @@ device_t *video_card_getdevice(int card, int romset) case ROM_SPC4620P: if (card == GFX_BUILTIN) return &ati28800k_spc4620p_device; + break; + + case ROM_SPC6033P: + if (card == GFX_BUILTIN) + return &ati28800k_spc6033p_device; + break; case ROM_ACER386: return &oti067_acer386_device; @@ -595,6 +601,7 @@ void video_updatetiming() break; case ROM_SPC4620P: + case ROM_SPC6033P: if (gfxcard == GFX_BUILTIN) timing = &timing_spc4620p; break; @@ -800,6 +807,14 @@ void video_init() } break; + case ROM_SPC6033P: + if (gfxcard == GFX_BUILTIN) + { + device_add(&ati28800k_spc6033p_device); + return; + } + break; + case ROM_ACER386: device_add(&oti067_acer386_device); if (gfxcard != GFX_BUILTIN)