Added a new machine: IBM PS/55 model 5551-V0,V1
This commit is contained in:
@@ -418,6 +418,50 @@ ps55_model_50t_read(uint16_t port)
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
ps55_model_50v_read(uint16_t port)
|
||||
{
|
||||
switch (port)
|
||||
{
|
||||
case 0x100:
|
||||
return ps2.planar_id & 0xff;
|
||||
case 0x101:
|
||||
return ps2.planar_id >> 8;
|
||||
case 0x102:
|
||||
return ps2.option[0];
|
||||
case 0x103:
|
||||
uint8_t val = 0xff;
|
||||
/*
|
||||
I/O 103h - Bit 7-4: Reserved
|
||||
Bit 3-0: Memory Card ID (Connector 3 or 1)
|
||||
|
||||
Memory Card ID: 8h = 4 MB Memory Card IV Installed
|
||||
Fh = No Card Installed
|
||||
*/
|
||||
switch (mem_size / 1024)
|
||||
{
|
||||
case 4:
|
||||
if (ps2.option[1] & 0x04) val = 0xff;
|
||||
else val = 0xf8;
|
||||
break;
|
||||
case 8:
|
||||
default:
|
||||
if (ps2.option[1] & 0x04) val = 0xf8;
|
||||
else val = 0xf8;
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
case 0x104:
|
||||
return ps2.option[2];
|
||||
case 0x105:
|
||||
return ps2.option[3];
|
||||
case 0x106:
|
||||
return ps2.subaddr_lo;
|
||||
case 0x107:
|
||||
return ps2.subaddr_hi;
|
||||
}
|
||||
return 0xff;
|
||||
}
|
||||
static void
|
||||
model_50_write(uint16_t port, uint8_t val)
|
||||
{
|
||||
@@ -716,7 +760,7 @@ model_80_write(uint16_t port, uint8_t val)
|
||||
}
|
||||
|
||||
static void
|
||||
ps55_model_50t_write(uint16_t port, uint8_t val)//pcem55
|
||||
ps55_model_50tv_write(uint16_t port, uint8_t val)
|
||||
{
|
||||
ps2_mca_log(" Write SysBrd %04X %02X %04X:%04X\n", port, val, cs >> 4, cpu_state.pc);
|
||||
switch (port)
|
||||
@@ -1382,6 +1426,62 @@ mem_encoding_write_cached(uint16_t addr, uint8_t val, UNUSED(void *priv))
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mem_encoding_write_cached_ps55(uint16_t addr, uint8_t val, UNUSED(void *priv))
|
||||
{
|
||||
uint8_t old;
|
||||
|
||||
switch (addr) {
|
||||
case 0xe0:
|
||||
ps2.mem_regs[0] = val;
|
||||
break;
|
||||
case 0xe1:
|
||||
ps2.mem_regs[1] = val;
|
||||
break;
|
||||
case 0xe2:
|
||||
old = ps2.mem_regs[2];
|
||||
ps2.mem_regs[2] = (ps2.mem_regs[2] & 0x80) | (val & ~0x88);
|
||||
if (val & 2) {
|
||||
ps2_mca_log("Clear latch - %i\n", ps2.pending_cache_miss);
|
||||
if (ps2.pending_cache_miss)
|
||||
ps2.mem_regs[2] |= 0x80;
|
||||
else
|
||||
ps2.mem_regs[2] &= ~0x80;
|
||||
ps2.pending_cache_miss = 0;
|
||||
}
|
||||
|
||||
if ((val & 0x21) == 0x20 && (old & 0x21) != 0x20)
|
||||
ps2.pending_cache_miss = 1;
|
||||
if ((val & 0x21) == 0x01 && (old & 0x21) != 0x01)
|
||||
ps2_cache_clean();
|
||||
#if 1
|
||||
// FIXME: Look into this!!!
|
||||
if (val & 0x01)
|
||||
ram_mid_mapping.flags |= MEM_MAPPING_ROM_WS;
|
||||
else
|
||||
ram_mid_mapping.flags &= ~MEM_MAPPING_ROM_WS;
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ps2_mca_log("mem_encoding_write: addr=%02x val=%02x %04x:%04x %02x %02x\n", addr, val, CS, cpu_state.pc, ps2.mem_regs[1], ps2.mem_regs[2]);
|
||||
mem_encoding_update();
|
||||
if ((ps2.mem_regs[1] & 0x10) && (ps2.mem_regs[2] & 0x21) == 0x20) {
|
||||
mem_mapping_disable(&ram_low_mapping);
|
||||
mem_mapping_enable(&ps2.cache_mapping);
|
||||
flushmmucache();
|
||||
} else {
|
||||
mem_mapping_disable(&ps2.cache_mapping);
|
||||
mem_mapping_enable(&ram_low_mapping);
|
||||
flushmmucache();
|
||||
}
|
||||
if (ps2.option[2] & 1) /* reset memstate for E0000 - E0FFFh hole */
|
||||
{
|
||||
mem_set_mem_state(0xe0000, 0x1000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
|
||||
}
|
||||
}
|
||||
static void
|
||||
ps2_mca_board_model_70_type34_init(int is_type4, int slots)
|
||||
{
|
||||
@@ -1750,7 +1850,7 @@ ps55_mca_board_model_50t_init()
|
||||
device_add(&keyboard_ps2_mca_1_device);
|
||||
|
||||
ps2.planar_read = ps55_model_50t_read;
|
||||
ps2.planar_write = ps55_model_50t_write;
|
||||
ps2.planar_write = ps55_model_50tv_write;
|
||||
|
||||
device_add(&ps2_nvr_device);
|
||||
|
||||
@@ -1790,6 +1890,51 @@ ps55_mca_board_model_50t_init()
|
||||
ps2.mb_vga = (vga_t *)device_add(&ps1vga_mca_device);
|
||||
}
|
||||
|
||||
void
|
||||
ps55_mca_board_model_50v_init()
|
||||
{
|
||||
ps2_mca_board_common_init();
|
||||
|
||||
//mem_remap_top(256);
|
||||
ps2.split_addr = mem_size * 1024;
|
||||
/* The slot 5 is reserved for the Integrated Fixed Disk II (an internal ESDI hard drive). */
|
||||
mca_init(5);
|
||||
device_add(&keyboard_ps2_mca_1_device);
|
||||
|
||||
ps2.planar_read = ps55_model_50v_read;
|
||||
ps2.planar_write = ps55_model_50tv_write;
|
||||
|
||||
device_add(&ps2_nvr_device);
|
||||
|
||||
io_sethandler(0x00e0, 0x0002, mem_encoding_read_cached, NULL, NULL, mem_encoding_write_cached_ps55, NULL, NULL, NULL);
|
||||
|
||||
ps2.mem_regs[1] = 2;
|
||||
ps2.option[2] &= 0xf2; /* Bit 3-2: -Cache IDs, Bit 1: Reserved
|
||||
Bit 0: Disable E0000-E0FFFh (4 KB) */
|
||||
|
||||
mem_mapping_add(&ps2.split_mapping,
|
||||
(mem_size + 256) * 1024,
|
||||
256 * 1024,
|
||||
ps2_read_split_ram,
|
||||
ps2_read_split_ramw,
|
||||
ps2_read_split_raml,
|
||||
ps2_write_split_ram,
|
||||
ps2_write_split_ramw,
|
||||
ps2_write_split_raml,
|
||||
&ram[0xa0000],
|
||||
MEM_MAPPING_INTERNAL,
|
||||
NULL);
|
||||
mem_mapping_disable(&ps2.split_mapping);
|
||||
|
||||
if (mem_size > 8192) {
|
||||
/* Only 8 MB supported on planar, create a memory expansion card for the rest */
|
||||
ps2_mca_mem_fffc_init(8);
|
||||
}
|
||||
|
||||
if (gfxcard[0] == VID_INTERNAL)
|
||||
ps2.mb_vga = (vga_t *)device_add(&ps1vga_mca_device);
|
||||
}
|
||||
|
||||
int
|
||||
machine_ps55_model_50t_init(const machine_t* model)
|
||||
{
|
||||
@@ -1814,3 +1959,28 @@ machine_ps55_model_50t_init(const machine_t* model)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
machine_ps55_model_50v_init(const machine_t* model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bios_load_interleaved("roms/machines/ibmps55_m50v/56F7416.BIN",
|
||||
"roms/machines/ibmps55_m50v/56F7417.BIN",
|
||||
0x000e0000, 131072, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_ps2_common_init(model);
|
||||
|
||||
/*
|
||||
* Planar ID
|
||||
* F1FFh - PS/55 model 5551-V0x, V1x
|
||||
* POST (P/N 38F6933) determination: FBxx -> 5 slots (ok), F1xx -> 5 slots (ok), others -> 8 (error)
|
||||
*/
|
||||
ps2.planar_id = 0xf1ff;
|
||||
ps55_mca_board_model_50v_init();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -5508,6 +5508,46 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has IBM PS/55 5551-V0x, V1x firmware. */
|
||||
{
|
||||
.name = "[MCA] IBM PS/55 model 5550-V0",
|
||||
.internal_name = "ibmps55_m50v",
|
||||
.type = MACHINE_TYPE_386DX,
|
||||
.chipset = MACHINE_CHIPSET_PROPRIETARY,
|
||||
.init = machine_ps55_model_50v_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_386DX | CPU_PKG_486BL,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_MCA,
|
||||
.flags = MACHINE_VIDEO | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 4096,
|
||||
.max = 16384,
|
||||
.step = 4096
|
||||
},
|
||||
.nvrmask = 63,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
|
||||
/* 386DX/486 machines */
|
||||
/* Has AMIKey F KBC firmware. */
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
//#define DA2_DCONFIG_FONT_HANS 2 /* for Code page 936 Simplified Chinese */
|
||||
#define DA2_DCONFIG_FONT_HANT 3 /* for Code page 938 Traditional Chinese */
|
||||
#define DA2_DCONFIG_MONTYPE_COLOR 0x0A
|
||||
#define DA2_DCONFIG_MONTYPE_8515 0x0B
|
||||
#define DA2_DCONFIG_MONTYPE_MONO 0x09
|
||||
|
||||
#define DA2_BLT_CIDLE 0
|
||||
@@ -104,9 +105,7 @@
|
||||
| EFD8h | Display Adapter /J | | | X | X | X |
|
||||
*/
|
||||
/* IO 3E0/3E1:0Ah Hardware Configuration Value L (imported from OS/2 DDK) */
|
||||
//2501
|
||||
//2500 mono
|
||||
#define OldLSI 0x20 /* DA-2 or DA-3,5 */
|
||||
#define OldLSI 0x20 /* 1 = DA-2, 0 = DA-3 */
|
||||
//#define Mon_ID3 0x10
|
||||
#define FontCard 0x08 /* ? */
|
||||
/* Page Number Mask : Memory Size? = (110b and 111b): vram size is 512k (256 color mode is not supported). */
|
||||
@@ -122,8 +121,8 @@
|
||||
/* Monitor ID (imported from OS/2 DDK 1.2) */
|
||||
//#define StarbuckC 0x0A //1 010b IBM 8514, 9518 color 1040x768
|
||||
//#define StarbuckM 0x09 //1 001b IBM 8507, 8604 grayscale
|
||||
//#define Lark_B 0x02 //0 010b IBM 9517 color 1040x768 but 4pp
|
||||
//#define Dallas 0x0B //1 011b IBM 8515, 9515 color 1040x740 B palette
|
||||
//#define Lark_B 0x02 //0 010b IBM 9517 color 1040x768 but 4bpp
|
||||
//#define Dallas 0x0B //1 011b IBM 8515, 9515 color 1040x740 palette B
|
||||
|
||||
/* DA2 Registers (imported from OS/2 DDK) */
|
||||
#define AC_REG 0x3EE
|
||||
@@ -277,8 +276,6 @@ typedef struct da2_t
|
||||
int fctladdr;
|
||||
int crtcaddr;
|
||||
|
||||
uint8_t miscout;
|
||||
|
||||
uint32_t decode_mask;
|
||||
uint32_t vram_max;
|
||||
uint32_t vram_mask;
|
||||
@@ -319,8 +316,6 @@ typedef struct da2_t
|
||||
pc_timer_t timer;
|
||||
uint64_t da2const;
|
||||
|
||||
//uint8_t scrblank;
|
||||
|
||||
int dispon;
|
||||
int hdisp_on;
|
||||
|
||||
@@ -346,7 +341,6 @@ typedef struct da2_t
|
||||
uint8_t *changedvram;
|
||||
/* (vram size - 1) >> 3 = 0x1FFFF */
|
||||
uint32_t vram_display_mask;
|
||||
uint32_t banked_mask;
|
||||
|
||||
//uint32_t write_bank, read_bank;
|
||||
|
||||
@@ -364,16 +358,9 @@ typedef struct da2_t
|
||||
int enable;
|
||||
mem_mapping_t mapping;
|
||||
uint8_t ram[256 * 1024];
|
||||
uint8_t font[DA2_FONTROM_SIZE];
|
||||
uint8_t *font;
|
||||
} mmio;
|
||||
|
||||
//mem_mapping_t linear_mapping;
|
||||
|
||||
//uint32_t bank[2];
|
||||
//uint32_t mask;
|
||||
|
||||
//int type;
|
||||
|
||||
struct {
|
||||
int bitshift_destr;
|
||||
int raster_op;
|
||||
@@ -2295,7 +2282,8 @@ static uint8_t da2_mmio_read(uint32_t addr, void* p)
|
||||
return da2->mmio.ram[addr];
|
||||
break;
|
||||
case 0x10://Font ROM
|
||||
//if (addr >= 0x180000) addr -= 0x40000;
|
||||
if (addr >= 0x1a0000) return DA2_INVALIDACCESS8;
|
||||
if (addr >= 0x180000) addr -= 0x40000;
|
||||
if (addr >= DA2_FONTROM_SIZE) return DA2_INVALIDACCESS8;
|
||||
//da2_log("PS55_MemHnd: Read from mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 72, addr, da2->mmio.font[addr]);
|
||||
return da2->mmio.font[addr];
|
||||
@@ -2975,8 +2963,8 @@ da2_reset(void* priv)
|
||||
da2->pos_regs[0] = DA2_POSID_L; /* Adapter Identification Byte (Low byte) */
|
||||
da2->pos_regs[1] = DA2_POSID_H; /* Adapter Identification Byte (High byte) */
|
||||
da2->pos_regs[2] = 0x40; /* Bit 7-5: 010=Mono, 100=Color, Bit 0 : Card Enable (they are changed by system software) */
|
||||
da2->ioctl[LS_CONFIG1] = OldLSI | Page_Two; /* Configuration 1 : DA - 2, 1024 KB */
|
||||
da2->ioctl[LS_CONFIG1] |= ((da2->monitorid & 0x8 ) << 2); /* Configuration 1 : Monitor ID 3 */
|
||||
da2->ioctl[LS_CONFIG1] = OldLSI | Page_Two; /* Configuration 1 : DA-II, 1024 KB */
|
||||
da2->ioctl[LS_CONFIG1] |= ((da2->monitorid & 0x8 ) << 1); /* Configuration 1 : Monitor ID 3 */
|
||||
da2->ioctl[LS_CONFIG2] = (da2->monitorid & 0x7); /* Configuration 2: Monitor ID 0-2 */
|
||||
da2->fctl[0] = 0x2b; /* 3E3h:0 */
|
||||
da2->fctl[LF_MMIO_MODE] = 0xb0; /* 3E3h:0bh */
|
||||
@@ -3019,7 +3007,8 @@ static void *da2_init()
|
||||
da2->changedvram = malloc(/*(memsize >> 12) << 1*/0x1000000 >> 12);//XX000h
|
||||
da2->monitorid = device_get_config_int("montype"); /* Configuration for Monitor ID (aaaa) -> (xxax xxxx, xxxx xaaa) */
|
||||
|
||||
int fonttype = device_get_config_int("font");
|
||||
int fonttype = device_get_config_int("charset");
|
||||
da2->mmio.font= malloc(DA2_FONTROM_SIZE);
|
||||
switch(fonttype)
|
||||
{
|
||||
case DA2_DCONFIG_FONT_HANT:
|
||||
@@ -3142,6 +3131,7 @@ void da2_close(void *p)
|
||||
free(da2->cram);
|
||||
free(da2->vram);
|
||||
free(da2->changedvram);
|
||||
free(da2->mmio.font);
|
||||
free(da2);
|
||||
}
|
||||
|
||||
@@ -3162,17 +3152,17 @@ void da2_force_redraw(void *p)
|
||||
static const device_config_t da2_configuration[] = {
|
||||
// clang-format off
|
||||
{
|
||||
.name = "font",
|
||||
.name = "charset",
|
||||
.description = "Charset",
|
||||
.type = CONFIG_SELECTION,
|
||||
.default_int = DA2_DCONFIG_FONT_JPAN,
|
||||
.selection = {
|
||||
{
|
||||
.description = "CP932 (Japanese)",
|
||||
.description = "932 (Japanese)",
|
||||
.value = DA2_DCONFIG_FONT_JPAN
|
||||
},
|
||||
{
|
||||
.description = "CP938 (Traditional Chinese)",
|
||||
.description = "938 (Traditional Chinese)",
|
||||
.value = DA2_DCONFIG_FONT_HANT
|
||||
},
|
||||
{ .description = "" }
|
||||
@@ -3188,6 +3178,10 @@ static const device_config_t da2_configuration[] = {
|
||||
.description = "Color",
|
||||
.value = DA2_DCONFIG_MONTYPE_COLOR
|
||||
},
|
||||
{
|
||||
.description = "IBM 8515",
|
||||
.value = DA2_DCONFIG_MONTYPE_8515
|
||||
},
|
||||
{
|
||||
.description = "Grayscale",
|
||||
.value = DA2_DCONFIG_MONTYPE_MONO
|
||||
|
||||
Reference in New Issue
Block a user