Skip to content

Commit eb20003

Browse files
committed
IBM PS/1 Model 2011: Add language ROMs
1 parent c29d51b commit eb20003

File tree

4 files changed

+113
-8
lines changed

4 files changed

+113
-8
lines changed

src/device.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,3 +849,9 @@ machine_get_config_string(char *s)
849849

850850
return NULL;
851851
}
852+
853+
const device_t*
854+
device_context_get_device(void)
855+
{
856+
return device_current.dev;
857+
}

src/include/86box/device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ extern const char *device_get_bios_file(const device_t *dev, const char *interna
202202

203203
extern int device_is_valid(const device_t *, int m);
204204

205+
extern const device_t* device_context_get_device(void);
206+
205207
extern int device_get_config_int(const char *name);
206208
extern int device_get_config_int_ex(const char *s, int dflt_int);
207209
extern int device_get_config_hex16(const char *name);

src/machine/m_ps1.c

Lines changed: 103 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
#include <86box/video.h>
6464
#include <86box/machine.h>
6565
#include <86box/sound.h>
66+
#include <86box/plat_unused.h>
6667

6768
typedef struct {
6869
int model;
@@ -242,6 +243,56 @@ ps1_read(uint16_t port, void *priv)
242243
return ret;
243244
}
244245

246+
static const device_config_t ps1_2011_config[] = {
247+
// clang-format off
248+
{
249+
.name = "bios_language",
250+
.description = "BIOS Language",
251+
.type = CONFIG_BIOS,
252+
.default_string = "english_us",
253+
.default_int = 0,
254+
.file_filter = "",
255+
.spinner = { 0 }, /*W1*/
256+
.bios = {
257+
{ .name = "English (US)", .internal_name = "english_us", .bios_type = BIOS_NORMAL,
258+
.files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ibmps1es/FC0000_US.BIN", "" } },
259+
{ .name = "English (UK)", .internal_name = "english_uk", .bios_type = BIOS_NORMAL,
260+
.files_no = 2, .local = 0, .size = 262144, .files = { "roms/machines/ibmps1es/F80000_UK.BIN", "roms/machines/ibmps1es/FC0000_UK.BIN", "" } },
261+
{ .name = "English (Canada)", .internal_name = "english_ca", .bios_type = BIOS_NORMAL,
262+
.files_no = 2, .local = 0, .size = 262144, .files = { "roms/machines/ibmps1es/F80000_CA.BIN", "roms/machines/ibmps1es/FC0000_CA.BIN", "" } },
263+
{ .name = "Portuguese", .internal_name = "portuguese", .bios_type = BIOS_NORMAL,
264+
.files_no = 2, .local = 0, .size = 262144, .files = { "roms/machines/ibmps1es/F80000_PT.BIN", "roms/machines/ibmps1es/FC0000_PT.BIN", "" } },
265+
{ .name = "German", .internal_name = "german", .bios_type = BIOS_NORMAL,
266+
.files_no = 2, .local = 0, .size = 262144, .files = { "roms/machines/ibmps1es/F80000_DE.BIN", "roms/machines/ibmps1es/FC0000_DE.BIN", "" } },
267+
{ .name = "Swedish", .internal_name = "swedish", .bios_type = BIOS_NORMAL,
268+
.files_no = 2, .local = 0, .size = 262144, .files = { "roms/machines/ibmps1es/F80000_SE.BIN", "roms/machines/ibmps1es/FC0000_SE.BIN", "" } },
269+
{ .name = "French", .internal_name = "french", .bios_type = BIOS_NORMAL,
270+
.files_no = 2, .local = 0, .size = 262144, .files = { "roms/machines/ibmps1es/F80000_FR.BIN", "roms/machines/ibmps1es/FC0000_FR.BIN", "" } },
271+
{ .name = "Italian", .internal_name = "italian", .bios_type = BIOS_NORMAL,
272+
.files_no = 1, .local = 0, .size = 524288, .files = { "roms/machines/ibmps1es/f80000.bin", "" } },
273+
{ .name = "Spanish", .internal_name = "spanish", .bios_type = BIOS_NORMAL,
274+
.files_no = 1, .local = 0, .size = 524288, .files = { "roms/machines/ibmps1es/F80000_ES.bin", "" } },
275+
{ .files_no = 0 }
276+
},
277+
},
278+
{ .name = "", .description = "", .type = CONFIG_END }
279+
// clang-format on
280+
};
281+
282+
const device_t ps1_2011_device = {
283+
.name = "PS/1 2011",
284+
.internal_name = "ps/1_2011",
285+
.flags = 0,
286+
.local = 0,
287+
.init = NULL,
288+
.close = NULL,
289+
.reset = NULL,
290+
{ .available = NULL },
291+
.speed_changed = NULL,
292+
.force_redraw = NULL,
293+
.config = &ps1_2011_config[0]
294+
};
295+
245296
static void
246297
ps1_setup(int model)
247298
{
@@ -273,9 +324,27 @@ ps1_setup(int model)
273324
device_add(&ps_nvr_device);
274325

275326
if (model == 2011) {
276-
rom_init(&ps->high_rom,
277-
"roms/machines/ibmps1es/f80000.bin",
278-
0xf80000, 0x80000, 0x7ffff, 0, MEM_MAPPING_EXTERNAL);
327+
if (!strcmp("english_us", device_get_config_bios("bios_language"))) {
328+
/* US English */
329+
rom_init(&ps->high_rom,
330+
device_get_bios_file(device_context_get_device(), device_get_config_bios("bios_language"), 0),
331+
0xfc0000, 0x40000, 0x3ffff, 0, MEM_MAPPING_EXTERNAL);
332+
333+
} else if ((device_get_bios_file(device_context_get_device(), device_get_config_bios("bios_language"), 1)) == NULL) {
334+
/* Combined ROM. */
335+
rom_init(&ps->high_rom,
336+
device_get_bios_file(device_context_get_device(), device_get_config_bios("bios_language"), 0),
337+
0xf80000, 0x80000, 0x7ffff, 0, MEM_MAPPING_EXTERNAL);
338+
} else {
339+
/* Split ROM. */
340+
rom_init(&ps->mid_rom,
341+
device_get_bios_file(device_context_get_device(), device_get_config_bios("bios_language"), 0),
342+
0xf80000, 0x40000, 0x3ffff, 0, MEM_MAPPING_EXTERNAL);
343+
344+
rom_init(&ps->high_rom,
345+
device_get_bios_file(device_context_get_device(), device_get_config_bios("bios_language"), 1),
346+
0xfc0000, 0x40000, 0x3ffff, 0, MEM_MAPPING_EXTERNAL);
347+
}
279348

280349
lpt2_remove();
281350

@@ -339,16 +408,43 @@ int
339408
machine_ps1_m2011_init(const machine_t *model)
340409
{
341410
int ret;
411+
const char* fn;
412+
uint32_t offset;
342413

343-
ret = bios_load_linear("roms/machines/ibmps1es/f80000.bin",
344-
0x000e0000, 131072, 0x60000);
414+
if (!device_available(model->device)) {
415+
/* No ROMs available. */
416+
return 0;
417+
}
345418

346-
if (bios_only || !ret)
419+
device_context(model->device);
420+
if ((fn = device_get_bios_file(model->device, device_get_config_bios("bios_language"), 1)) == NULL) {
421+
/* Combined ROM or US English. */
422+
fn = device_get_bios_file(model->device, device_get_config_bios("bios_language"), 0);
423+
offset = (!strcmp("english_us", device_get_config_bios("bios_language"))) ? 0x20000 : 0x60000;
424+
} else {
425+
/* Separated ROM. */
426+
offset = 0x20000;
427+
}
428+
429+
if (!fn) {
430+
fn = device_get_bios_file(model->device, "us_english", 0);
431+
offset = 0x20000;
432+
}
433+
434+
ret = bios_load_linear(fn, 0x000e0000, 131072, offset);
435+
device_context_restore();
436+
437+
if (bios_only || !ret) {
347438
return ret;
439+
}
348440

349441
ps1_common_init(model);
350442

351-
ps1_setup(2011);
443+
device_context(model->device);
444+
445+
ps1_setup(2011);
446+
447+
device_context_restore();
352448

353449
return ret;
354450
}

src/machine/machine_table.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ extern const device_t vid_ppc512_device;
5151
extern const device_t vid_device_sl;
5252
extern const device_t t1200_video_device;
5353
extern const device_t compaq_plasma_device;
54+
extern const device_t ps1_2011_device;
5455

5556
const machine_filter_t machine_types[] = {
5657
{ "None", MACHINE_TYPE_NONE },
@@ -2546,7 +2547,7 @@ const machine_t machines[] = {
25462547
.kbc_p1 = 0xff,
25472548
.gpio = 0xffffffff,
25482549
.gpio_acpi = 0xffffffff,
2549-
.device = NULL,
2550+
.device = &ps1_2011_device,
25502551
.fdc_device = NULL,
25512552
.sio_device = NULL,
25522553
.vid_device = NULL,

0 commit comments

Comments
 (0)