From 31dff3a509b23b691707bbbd49c6d29da68aade6 Mon Sep 17 00:00:00 2001 From: SarahW Date: Sat, 24 Feb 2018 18:08:36 +0000 Subject: [PATCH] Added Xi8088 emulation. Patch from EluanCM. --- src/Makefile.am | 2 +- src/Makefile.linux32-wx-sdl2 | 2 +- src/Makefile.linux64-wx-sdl2 | 2 +- src/Makefile.mingw | 2 +- src/Makefile.mingw-network | 2 +- src/Makefile.mingw-wx-sdl2 | 2 +- src/Makefile.mingw-wx-sdl2-network | 2 +- src/Makefile.mingw64 | 2 +- src/Makefile.osx64-wx-sdl2 | 2 +- src/fdc.c | 5 +++-- src/ibm.h | 1 + src/keyboard_at.c | 20 +++++++++++++++++ src/mem.c | 13 +++++++++-- src/model.c | 17 ++++++++++++++ src/nvr.c | 2 ++ src/xi8088.c | 36 ++++++++++++++++++++++++++++++ src/xi8088.h | 3 +++ 17 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 src/xi8088.c create mode 100644 src/xi8088.h diff --git a/src/Makefile.am b/src/Makefile.am index 2c8e84f..d0cd1a1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -40,7 +40,7 @@ vid_icd2061.c vid_ics2595.c vid_incolor.c vid_mda.c vid_olivetti_m24.c vid_oti03 vid_pc1512.c vid_pc1640.c vid_pcjr.c vid_ps1_svga.c vid_s3.c vid_s3_virge.c vid_sdac_ramdac.c \ vid_stg_ramdac.c vid_svga.c vid_svga_render.c vid_t1000.c vid_t3100e.c vid_tandy.c vid_tandysl.c vid_tgui9440.c \ vid_tkd8001_ramdac.c vid_tvga.c vid_unk_ramdac.c vid_vga.c vid_voodoo.c video.c wd76c10.c vid_wy700.c \ -x86seg.c x87.c xtide.c sound_dbopl.cc sound_resid.cc +x86seg.c x87.c xi8088.c xtide.c sound_dbopl.cc sound_resid.cc # DOSBox pcem_SOURCES += dosbox/cdrom_image.cpp dosbox/dbopl.cpp dosbox/nukedopl.cpp dosbox/vid_cga_comp.c diff --git a/src/Makefile.linux32-wx-sdl2 b/src/Makefile.linux32-wx-sdl2 index 1120166..febf188 100644 --- a/src/Makefile.linux32-wx-sdl2 +++ b/src/Makefile.linux32-wx-sdl2 @@ -20,7 +20,7 @@ vid_icd2061.o vid_ics2595.o vid_incolor.o vid_mda.o vid_olivetti_m24.o vid_oti03 vid_pc1512.o vid_pc1640.o vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_sdac_ramdac.o \ vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o \ -x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ +x86seg.o x87.o xi8088.c xtide.o sound_dbopl.o sound_resid.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o \ wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o wx-createdisc.o diff --git a/src/Makefile.linux64-wx-sdl2 b/src/Makefile.linux64-wx-sdl2 index c0cc80c..2530657 100644 --- a/src/Makefile.linux64-wx-sdl2 +++ b/src/Makefile.linux64-wx-sdl2 @@ -20,7 +20,7 @@ vid_icd2061.o vid_ics2595.o vid_incolor.o vid_mda.o vid_olivetti_m24.o vid_oti03 vid_pc1512.o vid_pc1640.o vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_sdac_ramdac.o \ vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o \ -x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ +x86seg.o x87.o xi8088.c xtide.o sound_dbopl.o sound_resid.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o \ wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o wx-createdisc.o diff --git a/src/Makefile.mingw b/src/Makefile.mingw index 52b12e7..ae8e225 100644 --- a/src/Makefile.mingw +++ b/src/Makefile.mingw @@ -20,7 +20,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acc2036.o acer386sx.o ali1429 vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o \ vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \ win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \ - win-status.o win-video.o x86seg.o x87.o xtide.o pc.res + win-status.o win-video.o x86seg.o x87.o xi8088.c xtide.o pc.res DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.mingw-network b/src/Makefile.mingw-network index 6e830c2..616eb24 100644 --- a/src/Makefile.mingw-network +++ b/src/Makefile.mingw-network @@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acc2036.o acer386sx.o ali1429 vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o \ vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \ win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \ - win-networkconfig.o win-status.o win-video.o x86seg.o x87.o xtide.o pc.res + win-networkconfig.o win-status.o win-video.o x86seg.o x87.o xi8088.c xtide.o pc.res DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o NETOBJ = ne2000.o nethandler.o diff --git a/src/Makefile.mingw-wx-sdl2 b/src/Makefile.mingw-wx-sdl2 index e33a7c2..8b4824f 100644 --- a/src/Makefile.mingw-wx-sdl2 +++ b/src/Makefile.mingw-wx-sdl2 @@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acc2036.o acer386sx.o ali1429 vid_olivetti_m24.o vid_oti037.c vid_oti067.o vid_paradise.o vid_pc1512.o vid_pc1640.o vid_pc200.o \ vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_sdac_ramdac.o vid_stg_ramdac.o vid_svga.o \ vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o \ - vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xtide.o win-midi.o \ + vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xi8088.c xtide.o win-midi.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display-win.o \ wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o wx-createdisc.o wx.res diff --git a/src/Makefile.mingw-wx-sdl2-network b/src/Makefile.mingw-wx-sdl2-network index 584f699..cbc712d 100644 --- a/src/Makefile.mingw-wx-sdl2-network +++ b/src/Makefile.mingw-wx-sdl2-network @@ -21,7 +21,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acc2036.o acer386sx.o ali1429 vid_olivetti_m24.o vid_oti037.c vid_oti067.o vid_paradise.o vid_pc1512.o vid_pc1640.o vid_pc200.o \ vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_sdac_ramdac.o vid_stg_ramdac.o vid_svga.o \ vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o \ - vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xtide.o win-midi.o \ + vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xi8088.c xtide.o win-midi.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-hostconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display-win.o \ wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o wx-createdisc.o wx.res diff --git a/src/Makefile.mingw64 b/src/Makefile.mingw64 index 582f58f..2b6f091 100644 --- a/src/Makefile.mingw64 +++ b/src/Makefile.mingw64 @@ -20,7 +20,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acc2036.o acer386sx.o ali1429 vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o \ vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o win.o win-config.o win-config_sel.o win-d3d.o win-d3d-fs.o win-ddraw.o \ win-ddraw-fs.o win-deviceconfig.o win-hdconf.o win-joystick.o win-joystickconfig.o win-keyboard.o win-midi.o win-mouse.o \ - win-status.o win-video.o x86seg.o x87.o xtide.o pc.res + win-status.o win-video.o x86seg.o x87.o xi8088.c xtide.o pc.res DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o diff --git a/src/Makefile.osx64-wx-sdl2 b/src/Makefile.osx64-wx-sdl2 index 2f679f5..0c5b11c 100644 --- a/src/Makefile.osx64-wx-sdl2 +++ b/src/Makefile.osx64-wx-sdl2 @@ -19,7 +19,7 @@ vid_icd2061.o vid_ics2595.o vid_incolor.o vid_mda.o vid_olivetti_m24.o vid_oti03 vid_pc1512.o vid_pc1640.o vid_pcjr.o vid_ps1_svga.o vid_s3.o vid_s3_virge.o vid_sdac_ramdac.o \ vid_stg_ramdac.o vid_svga.o vid_svga_render.o vid_t1000.o vid_t3100e.o vid_tandy.o vid_tandysl.o vid_tgui9440.o \ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o \ -x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \ +x86seg.o x87.o xi8088.c xtide.o sound_dbopl.o sound_resid.o \ wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \ wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o \ wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o wx-createdisc.o diff --git a/src/fdc.c b/src/fdc.c index 6bc6e52..bec48bc 100644 --- a/src/fdc.c +++ b/src/fdc.c @@ -87,7 +87,7 @@ void fdc_reset() fdc.lock = 0; fdc.head = 0; fdc.abort = 0; - if (!AT) + if (!AT && romset != ROM_XI8088) { fdc.rate = 2; // fdc_update_rate(); @@ -672,7 +672,8 @@ bad_command: } return; case 7: - if (!AT) return; + if (!AT && romset != ROM_XI8088) + return; fdc.rate=val&3; disc_3f7=val; diff --git a/src/ibm.h b/src/ibm.h index 9971d8e..eadd91b 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -453,6 +453,7 @@ enum ROM_ZAPPA, ROM_PB520R, ROM_COMPAQ_PIP, + ROM_XI8088, ROM_MAX }; diff --git a/src/keyboard_at.c b/src/keyboard_at.c index 4726987..4cc899c 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -9,6 +9,7 @@ #include "timer.h" #include "video.h" #include "x86.h" +#include "xi8088.h" #include "keyboard.h" #include "keyboard_at.h" @@ -180,6 +181,8 @@ void keyboard_at_adddata_mouse(uint8_t val) void keyboard_at_write(uint16_t port, uint8_t val, void *priv) { // pclog("keyboard_at : write %04X %02X %i %02X\n", port, val, keyboard_at.key_wantdata, ram[8]); + if (romset == ROM_XI8088 && port == 0x63) + port = 0x61; /* if (ram[8] == 0xc3) { output = 3; @@ -335,6 +338,14 @@ void keyboard_at_write(uint16_t port, uint8_t val, void *priv) if (speaker_enable) was_speaker_enable = 1; pit_set_gate(&pit, 2, val & 1); + + if (romset == ROM_XI8088) + { + if (val & 0x04) + xi8088_turbo_set(1); + else + xi8088_turbo_set(0); + } break; case 0x64: @@ -544,6 +555,8 @@ uint8_t keyboard_at_read(uint16_t port, void *priv) { uint8_t temp = 0xff; // if (port != 0x61) pclog("keyboard_at : read %04X ", port); + if (romset == ROM_XI8088 && port == 0x63) + port = 0x61; switch (port) { case 0x60: @@ -564,6 +577,13 @@ uint8_t keyboard_at_read(uint16_t port, void *priv) else temp &= ~0x10; } + if (romset == ROM_XI8088) + { + if (xi8088_turbo_get()) + temp |= 0x04; + else + temp &= ~0x04; + } break; case 0x64: diff --git a/src/mem.c b/src/mem.c index 87e8715..7b4de06 100644 --- a/src/mem.c +++ b/src/mem.c @@ -866,12 +866,12 @@ int loadbios() f = romfopen("zappa/1006bs0_.bio", "rb"); if (!f) break; fseek(f, 0x80, SEEK_SET); - fread(rom + 0x10000, 0x10000, 1, f); + romfread(rom + 0x10000, 0x10000, 1, f); fclose(f); f = romfopen("zappa/1006bs0_.bi1", "rb"); if (!f) break; fseek(f, 0x80, SEEK_SET); - fread(rom, 0xd000, 1, f); + romfread(rom, 0xd000, 1, f); fclose(f); biosmask = 0x1ffff; return 1; @@ -898,6 +898,15 @@ int loadbios() fclose(f); return 1; + case ROM_XI8088: + f = romfopen("xi8088/bios-xi8088.bin", "rb"); /* use the bios without xt-ide because it's configurable in pcem */ + if (!f) break; + /* high bit is flipped in xi8088 */ + romfread(rom + 0x10000, 0x10000, 1, f); + romfread(rom, 0x10000, 1, f); + fclose(f); + biosmask = 0x1ffff; + return 1; } printf("Failed to load ROM!\n"); if (f) fclose(f); diff --git a/src/model.c b/src/model.c index 3981744..a4b3ca9 100644 --- a/src/model.c +++ b/src/model.c @@ -62,6 +62,7 @@ #include "vid_tandy.h" #include "vid_t1000.h" #include "wd76c10.h" +#include "xi8088.h" void xt_init(); void pcjr_init(); @@ -103,6 +104,7 @@ void at_zappa_init(); void at_pb520r_init(); void at_pb570_init(); void compaq_pip_init(); +void xt_xi8088_init(); int model; int AMSTRAD, AT, PCI, TANDY; @@ -126,6 +128,7 @@ MODEL models[] = {"[8088] Thomson TO16 PC", ROM_TO16_PC, "to16_pc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 512, 640, 128, xt_init, NULL}, {"[8088] Toshiba 1000", ROM_T1000, "t1000", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 1, 0, 512,1280, 768, xt_t1000_init, &t1000_device}, {"[8088] VTech Laser Turbo XT", ROM_LTXT, "ltxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, 0, 64,1152, 64, xt_laserxt_init, NULL}, + {"[8088] Xi8088", ROM_XI8088, "xi8088", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, 0, MODEL_AT|MODEL_PS2, 64,1024, 128, xt_xi8088_init, NULL}, {"[8086] Amstrad PC1512", ROM_PC1512, "pc1512", { {"", cpus_pc1512}, {"", NULL}, {"", NULL}}, 1, MODEL_AMSTRAD, 512, 640, 128, ams_init, NULL}, {"[8086] Amstrad PC1640", ROM_PC1640, "pc1640", { {"", cpus_8086}, {"", NULL}, {"", NULL}}, 1, MODEL_AMSTRAD, 640, 640, 0, ams_init, NULL}, @@ -350,6 +353,20 @@ void xt_laserxt_init() laserxt_init(); } +void xt_xi8088_init() +{ + /* TODO: set UMBs? See if PCem always sets when we have > 640KB ram and avoids conflicts when a peripheral uses the same memory space */ + common_init(); + mem_add_bios(); + keyboard_at_init(); + keyboard_at_init_ps2(); + nmi_init(); + nvr_init(); + pic2_init(); + device_add(&gameport_device); + xi8088_init(); +} + void at_init() { AT = 1; diff --git a/src/nvr.c b/src/nvr.c index 59272be..3a77f2c 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -301,6 +301,7 @@ void loadnvr() case ROM_PB570: f = nvrfopen("pb570.nvr", "rb"); nvrmask = 127; break; case ROM_ZAPPA: f = nvrfopen("zappa.nvr", "rb"); nvrmask = 127; break; case ROM_PB520R: f = nvrfopen("pb520r.nvr", "rb"); nvrmask = 127; break; + case ROM_XI8088: f = nvrfopen("xi8088.nvr", "rb"); nvrmask = 127; break; default: return; } @@ -387,6 +388,7 @@ void savenvr() case ROM_PB570: f = nvrfopen("pb570.nvr", "wb"); break; case ROM_ZAPPA: f = nvrfopen("zappa.nvr", "wb"); break; case ROM_PB520R: f = nvrfopen("pb520r.nvr", "wb"); break; + case ROM_XI8088: f = nvrfopen("xi8088.nvr", "wb"); break; default: return; } diff --git a/src/xi8088.c b/src/xi8088.c new file mode 100644 index 0000000..ad04e7e --- /dev/null +++ b/src/xi8088.c @@ -0,0 +1,36 @@ +#include "ibm.h" +#include "io.h" +#include "cpu.h" +#include "keyboard_at.h" + +#include "xi8088.h" + +static uint8_t xi8088_turbo; + +uint8_t xi8088_turbo_get() +{ + return xi8088_turbo; +} + +void xi8088_turbo_set(uint8_t value) +{ + xi8088_turbo = value; + if (!value) + { + pclog("Xi8088 turbo off\n"); + int c = cpu; + cpu = 0; /* 8088/4.77 */ + cpu_set(); + cpu = c; + } + else + { + pclog("Xi8088 turbo on\n"); + cpu_set(); + } +} + +void xi8088_init() +{ + xi8088_turbo = 1; +} diff --git a/src/xi8088.h b/src/xi8088.h new file mode 100644 index 0000000..ef40e19 --- /dev/null +++ b/src/xi8088.h @@ -0,0 +1,3 @@ +uint8_t xi8088_turbo_get(); +void xi8088_turbo_set(uint8_t value); +void xi8088_init();