Added Compaq Deskpro 386 emulation.

This commit is contained in:
TomW 2015-06-30 20:17:43 +01:00
commit 80555e9d2a
9 changed files with 92 additions and 5 deletions

BIN
deskpro386.nvr Normal file

Binary file not shown.

View file

@ -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 \

51
src/compaq.c Normal file
View file

@ -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);
}

1
src/compaq.h Normal file
View file

@ -0,0 +1 @@
void compaq_init();

View file

@ -322,6 +322,7 @@ enum
ROM_ENDEAVOR,
ROM_REVENGE,
ROM_IBMPS1_2011,
ROM_DESKPRO_386,
ROM_MAX
};

View file

@ -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);

View file

@ -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);

View file

@ -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();

View file

@ -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;