diff --git a/deskpro386.nvr b/deskpro386.nvr new file mode 100644 index 0000000..95ab63b Binary files /dev/null and b/deskpro386.nvr differ diff --git a/src/Makefile.mingw b/src/Makefile.mingw index e2bc6c1..2cc5dd0 100644 --- a/src/Makefile.mingw +++ b/src/Makefile.mingw @@ -4,7 +4,7 @@ CC = gcc.exe WINDRES = windres.exe CFLAGS = -O3 -march=i686 -fomit-frame-pointer OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cdrom-ioctl.o \ - codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_pentium.o codegen_x86.o config.o cpu.o dac.o \ + codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_pentium.o codegen_x86.o compaq.o config.o cpu.o dac.o \ device.o disc.o disc_fdi.o disc_img.o dma.o fdc.o fdi2raw.o gameport.o headland.o i430lx.o i430fx.o \ i430vx.o ide.o intel.o intel_flash.o io.o jim.o keyboard.o keyboard_amstrad.o keyboard_at.o \ keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o model.o mouse.o mouse_ps2.o \ diff --git a/src/compaq.c b/src/compaq.c new file mode 100644 index 0000000..5eab707 --- /dev/null +++ b/src/compaq.c @@ -0,0 +1,51 @@ +#include "ibm.h" +#include "mem.h" + +/* Compaq Deskpro 386 remaps RAM from 0xA0000-0xFFFFF to 0xFA0000-0xFFFFFF */ + +static mem_mapping_t compaq_ram_mapping; + +uint8_t compaq_read_ram(uint32_t addr, void *priv) +{ + addr = (addr & 0x7ffff) + 0x80000; + addreadlookup(mem_logical_addr, addr); + return ram[addr]; +} +uint16_t compaq_read_ramw(uint32_t addr, void *priv) +{ + addr = (addr & 0x7ffff) + 0x80000; + addreadlookup(mem_logical_addr, addr); + return *(uint16_t *)&ram[addr]; +} +uint32_t compaq_read_raml(uint32_t addr, void *priv) +{ + addr = (addr & 0x7ffff) + 0x80000; + addreadlookup(mem_logical_addr, addr); + return *(uint32_t *)&ram[addr]; +} +void compaq_write_ram(uint32_t addr, uint8_t val, void *priv) +{ + addr = (addr & 0x7ffff) + 0x80000; + addwritelookup(mem_logical_addr, addr); + mem_write_ramb_page(addr, val, &pages[addr >> 12]); +} +void compaq_write_ramw(uint32_t addr, uint16_t val, void *priv) +{ + addr = (addr & 0x7ffff) + 0x80000; + addwritelookup(mem_logical_addr, addr); + mem_write_ramw_page(addr, val, &pages[addr >> 12]); +} +void compaq_write_raml(uint32_t addr, uint32_t val, void *priv) +{ + addr = (addr & 0x7ffff) + 0x80000; + addwritelookup(mem_logical_addr, addr); + mem_write_raml_page(addr, val, &pages[addr >> 12]); +} + +void compaq_init() +{ + mem_mapping_add(&compaq_ram_mapping, 0xfa0000, 0x60000, + compaq_read_ram, compaq_read_ramw, compaq_read_raml, + compaq_write_ram, compaq_write_ramw, compaq_write_raml, + ram + 0xa0000, MEM_MAPPING_INTERNAL, NULL); +} diff --git a/src/compaq.h b/src/compaq.h new file mode 100644 index 0000000..fbcf4cb --- /dev/null +++ b/src/compaq.h @@ -0,0 +1 @@ +void compaq_init(); diff --git a/src/ibm.h b/src/ibm.h index 245e9d1..4c5cd67 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -322,6 +322,7 @@ enum ROM_ENDEAVOR, ROM_REVENGE, ROM_IBMPS1_2011, + ROM_DESKPRO_386, ROM_MAX }; diff --git a/src/mem.c b/src/mem.c index 5ddec44..0d699ac 100644 --- a/src/mem.c +++ b/src/mem.c @@ -491,6 +491,21 @@ int loadbios() biosmask = 0x1ffff; mem_load_atide115_bios(); return 1; + + case ROM_DESKPRO_386: + f=romfopen("roms/deskpro386/109592-005.U11.bin","rb"); + ff=romfopen("roms/deskpro386/109591-005.U13.bin","rb"); + if (!f || !ff) break; + for (c = 0x0000; c < 0x8000; c += 2) + { + rom[c] = getc(f); + rom[c+1] = getc(ff); + } + fclose(ff); + fclose(f); + biosmask = 0x7fff; + mem_load_atide_bios(); + return 1; } printf("Failed to load ROM!\n"); if (f) fclose(f); @@ -893,7 +908,7 @@ uint8_t *getpccache(uint32_t a) } #define printf pclog -static uint32_t mem_logical_addr; +uint32_t mem_logical_addr; uint8_t readmembl(uint32_t addr) { mem_logical_addr = addr; @@ -1317,7 +1332,7 @@ uint32_t mem_read_raml(uint32_t addr, void *priv) return *(uint32_t *)&ram[addr]; } -static void mem_write_ramb_page(uint32_t addr, uint8_t val, page_t *p) +void mem_write_ramb_page(uint32_t addr, uint8_t val, page_t *p) { #if DYNAREC uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); @@ -1326,7 +1341,7 @@ static void mem_write_ramb_page(uint32_t addr, uint8_t val, page_t *p) #endif p->mem[addr & 0xfff] = val; } -static void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p) +void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p) { #if DYNAREC uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); @@ -1337,7 +1352,7 @@ static void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p) #endif *(uint16_t *)&p->mem[addr & 0xfff] = val; } -static void mem_write_raml_page(uint32_t addr, uint32_t val, page_t *p) +void mem_write_raml_page(uint32_t addr, uint32_t val, page_t *p) { #if DYNAREC uint64_t mask = (uint64_t)1 << ((addr >> PAGE_MASK_SHIFT) & PAGE_MASK_MASK); diff --git a/src/mem.h b/src/mem.h index 8398c06..bfbf987 100644 --- a/src/mem.h +++ b/src/mem.h @@ -136,3 +136,10 @@ static inline get_phys_noabrt(uint32_t addr) } void mem_invalidate_range(uint32_t start_addr, uint32_t end_addr); + +extern uint32_t mem_logical_addr; + +void mem_write_ramb_page(uint32_t addr, uint8_t val, page_t *p); +void mem_write_ramw_page(uint32_t addr, uint16_t val, page_t *p); +void mem_write_raml_page(uint32_t addr, uint32_t val, page_t *p); + diff --git a/src/model.c b/src/model.c index ae9139e..152470c 100644 --- a/src/model.c +++ b/src/model.c @@ -6,6 +6,7 @@ #include "acer386sx.h" #include "ali1429.h" #include "amstrad.h" +#include "compaq.h" #include "device.h" #include "dma.h" #include "fdc.h" @@ -50,6 +51,7 @@ void ams_init(); void europc_init(); void olim24_init(); void at_init(); +void deskpro386_init(); void ps1_init(); void at_neat_init(); void at_acer386sx_init(); @@ -84,6 +86,7 @@ MODEL models[] = {"AMI 286 clone", ROM_AMI286, { "", cpus_286, "", NULL, "", NULL}, 0, at_neat_init}, {"DELL System 200", ROM_DELL200, { "", cpus_286, "", NULL, "", NULL}, 0, at_init}, {"IBM PS/1 model 2011", ROM_IBMPS1_2011, { "", cpus_286, "", NULL, "", NULL}, 1, ps1_init}, + {"Compaq Deskpro 386", ROM_DESKPRO_386, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 0, deskpro386_init}, {"Acer 386SX25/N", ROM_ACER386, { "Intel", cpus_acer, "", NULL, "", NULL}, 1, at_acer386sx_init}, {"Amstrad MegaPC", ROM_MEGAPC, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 1, at_wd76c10_init}, {"AMI 386 clone", ROM_AMI386, { "Intel", cpus_i386, "AMD", cpus_Am386, "Cyrix", cpus_486SDLC}, 0, at_headland_init}, @@ -219,6 +222,13 @@ void at_init() pic2_init(); } +void deskpro386_init() +{ + at_init(); + mouse_serial_init(); + compaq_init(); +} + void ps1_init() { common_init(); diff --git a/src/nvr.c b/src/nvr.c index 54136d3..3d4ffd6 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -141,6 +141,7 @@ void loadnvr() case ROM_AMI286: f = romfopen("ami286.nvr", "rb"); nvrmask = 127; break; case ROM_DELL200: f = romfopen("dell200.nvr", "rb"); nvrmask = 127; break; case ROM_IBMAT386: f = romfopen("at386.nvr", "rb"); nvrmask = 127; break; + case ROM_DESKPRO_386: f = romfopen("deskpro386.nvr", "rb"); break; case ROM_ACER386: f = romfopen("acer386.nvr", "rb"); nvrmask = 127; break; case ROM_MEGAPC: f = romfopen("megapc.nvr", "rb"); nvrmask = 127; break; case ROM_AMI386: f = romfopen("ami386.nvr", "rb"); nvrmask = 127; break; @@ -181,6 +182,7 @@ void savenvr() case ROM_AMI286: f = romfopen("ami286.nvr", "wb"); break; case ROM_DELL200: f = romfopen("dell200.nvr", "wb"); break; case ROM_IBMAT386: f = romfopen("at386.nvr", "wb"); break; + case ROM_DESKPRO_386: f = romfopen("deskpro386.nvr", "wb"); break; case ROM_ACER386: f = romfopen("acer386.nvr", "wb"); break; case ROM_MEGAPC: f = romfopen("megapc.nvr", "wb"); break; case ROM_AMI386: f = romfopen("ami386.nvr", "wb"); break;