Added Compaq Deskpro 386 emulation.
This commit is contained in:
parent
b9ad63e2fc
commit
80555e9d2a
9 changed files with 92 additions and 5 deletions
BIN
deskpro386.nvr
Normal file
BIN
deskpro386.nvr
Normal file
Binary file not shown.
|
|
@ -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
51
src/compaq.c
Normal 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
1
src/compaq.h
Normal file
|
|
@ -0,0 +1 @@
|
|||
void compaq_init();
|
||||
|
|
@ -322,6 +322,7 @@ enum
|
|||
ROM_ENDEAVOR,
|
||||
ROM_REVENGE,
|
||||
ROM_IBMPS1_2011,
|
||||
ROM_DESKPRO_386,
|
||||
|
||||
ROM_MAX
|
||||
};
|
||||
|
|
|
|||
23
src/mem.c
23
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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
10
src/model.c
10
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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue