2020-12-04 21:45:14 +05:00
|
|
|
/*
|
2022-07-21 21:44:55 -04:00
|
|
|
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
|
|
|
|
* running old operating systems and software designed for IBM
|
|
|
|
|
* PC systems and compatibles from 1981 through fairly recent
|
|
|
|
|
* system designs based on the PCI bus.
|
2017-07-26 00:34:43 +02:00
|
|
|
*
|
2022-07-21 21:44:55 -04:00
|
|
|
* This file is part of the 86Box distribution.
|
2017-07-26 00:34:43 +02:00
|
|
|
*
|
2022-07-21 21:44:55 -04:00
|
|
|
* Configuration file handler.
|
2017-07-26 00:34:43 +02:00
|
|
|
*
|
2020-03-25 00:46:02 +02:00
|
|
|
*
|
2017-07-26 00:34:43 +02:00
|
|
|
*
|
2022-07-21 21:44:55 -04:00
|
|
|
* Authors: Sarah Walker,
|
|
|
|
|
* Miran Grca, <mgrca8@gmail.com>
|
|
|
|
|
* Fred N. van Kempen, <decwiz@yahoo.com>
|
|
|
|
|
* Overdoze,
|
|
|
|
|
* David Hrdlička, <hrdlickadavid@outlook.com>
|
2017-10-08 19:14:46 -04:00
|
|
|
*
|
2022-07-21 21:44:55 -04:00
|
|
|
* Copyright 2008-2019 Sarah Walker.
|
|
|
|
|
* Copyright 2016-2019 Miran Grca.
|
|
|
|
|
* Copyright 2017-2019 Fred N. van Kempen.
|
|
|
|
|
* Copyright 2018,2019 David Hrdlička.
|
2017-05-31 01:22:52 -04:00
|
|
|
*
|
2022-07-21 21:44:55 -04:00
|
|
|
* NOTE: Forcing config files to be in Unicode encoding breaks
|
|
|
|
|
* it on Windows XP, and possibly also Vista. Use the
|
|
|
|
|
* -DANSI_CFG for use on these systems.
|
2017-05-31 01:22:52 -04:00
|
|
|
*/
|
2022-07-21 20:50:05 -04:00
|
|
|
|
2018-05-21 19:04:05 +02:00
|
|
|
#include <inttypes.h>
|
|
|
|
|
#include <stdarg.h>
|
2016-06-26 00:34:39 +02:00
|
|
|
#include <stdio.h>
|
2017-05-08 04:54:17 +02:00
|
|
|
#include <stdint.h>
|
2016-06-26 00:34:39 +02:00
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdlib.h>
|
2017-09-25 04:31:20 -04:00
|
|
|
#include <wchar.h>
|
2018-05-21 19:04:05 +02:00
|
|
|
#define HAVE_STDARG_H
|
2020-03-29 14:24:42 +02:00
|
|
|
#include <86box/86box.h>
|
2020-02-29 19:12:23 +01:00
|
|
|
#include "cpu.h"
|
2020-03-29 14:24:42 +02:00
|
|
|
#include <86box/device.h>
|
|
|
|
|
#include <86box/timer.h>
|
2021-07-27 06:12:09 +02:00
|
|
|
#include <86box/cassette.h>
|
2021-07-29 20:34:55 +02:00
|
|
|
#include <86box/cartridge.h>
|
2020-03-29 14:24:42 +02:00
|
|
|
#include <86box/nvr.h>
|
|
|
|
|
#include <86box/config.h>
|
|
|
|
|
#include <86box/isamem.h>
|
|
|
|
|
#include <86box/isartc.h>
|
|
|
|
|
#include <86box/lpt.h>
|
|
|
|
|
#include <86box/hdd.h>
|
|
|
|
|
#include <86box/hdc.h>
|
|
|
|
|
#include <86box/hdc_ide.h>
|
|
|
|
|
#include <86box/fdd.h>
|
|
|
|
|
#include <86box/fdc.h>
|
2020-06-16 16:41:35 +02:00
|
|
|
#include <86box/fdc_ext.h>
|
2020-03-29 14:24:42 +02:00
|
|
|
#include <86box/gameport.h>
|
|
|
|
|
#include <86box/machine.h>
|
|
|
|
|
#include <86box/mouse.h>
|
|
|
|
|
#include <86box/network.h>
|
|
|
|
|
#include <86box/scsi.h>
|
|
|
|
|
#include <86box/scsi_device.h>
|
|
|
|
|
#include <86box/cdrom.h>
|
|
|
|
|
#include <86box/zip.h>
|
2020-04-01 19:04:53 +02:00
|
|
|
#include <86box/mo.h>
|
2020-03-29 14:24:42 +02:00
|
|
|
#include <86box/sound.h>
|
|
|
|
|
#include <86box/midi.h>
|
|
|
|
|
#include <86box/snd_mpu401.h>
|
|
|
|
|
#include <86box/video.h>
|
2022-04-19 23:06:39 +02:00
|
|
|
#include <86box/path.h>
|
2020-03-29 14:24:42 +02:00
|
|
|
#include <86box/plat.h>
|
2021-04-17 20:17:49 -03:00
|
|
|
#include <86box/plat_dir.h>
|
2020-03-29 14:24:42 +02:00
|
|
|
#include <86box/ui.h>
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-05-11 03:25:23 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
typedef struct _list_ {
|
|
|
|
|
struct _list_ *next;
|
2016-06-26 00:34:39 +02:00
|
|
|
} list_t;
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
typedef struct {
|
2022-07-21 21:44:55 -04:00
|
|
|
list_t list;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
char name[128];
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
list_t entry_head;
|
2016-06-26 00:34:39 +02:00
|
|
|
} section_t;
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
typedef struct {
|
2022-07-21 21:44:55 -04:00
|
|
|
list_t list;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
char name[128];
|
|
|
|
|
char data[512];
|
|
|
|
|
wchar_t wdata[512];
|
2016-06-26 00:34:39 +02:00
|
|
|
} entry_t;
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
#define list_add(new, head) \
|
|
|
|
|
{ \
|
|
|
|
|
list_t *next = head; \
|
|
|
|
|
\
|
|
|
|
|
while (next->next != NULL) \
|
|
|
|
|
next = next->next; \
|
|
|
|
|
\
|
|
|
|
|
(next)->next = new; \
|
|
|
|
|
(new)->next = NULL; \
|
|
|
|
|
}
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
#define list_delete(old, head) \
|
|
|
|
|
{ \
|
|
|
|
|
list_t *next = head; \
|
|
|
|
|
\
|
|
|
|
|
while ((next)->next != old) { \
|
|
|
|
|
next = (next)->next; \
|
|
|
|
|
} \
|
|
|
|
|
\
|
|
|
|
|
(next)->next = (old)->next; \
|
|
|
|
|
if ((next) == (head)) \
|
|
|
|
|
(head)->next = (old)->next; \
|
|
|
|
|
}
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
static list_t config_head;
|
2017-05-18 01:57:16 -04:00
|
|
|
|
2020-07-19 06:07:58 +02:00
|
|
|
/* TODO: Backwards compatibility, get rid of this when enough time has passed. */
|
2022-07-21 21:44:55 -04:00
|
|
|
static int backwards_compat = 0;
|
|
|
|
|
static int backwards_compat2 = 0;
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2018-05-21 19:04:05 +02:00
|
|
|
#ifdef ENABLE_CONFIG_LOG
|
|
|
|
|
int config_do_log = ENABLE_CONFIG_LOG;
|
|
|
|
|
|
|
|
|
|
static void
|
2018-10-17 05:29:48 +02:00
|
|
|
config_log(const char *fmt, ...)
|
2018-05-21 19:04:05 +02:00
|
|
|
{
|
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
|
|
if (config_do_log) {
|
2022-07-21 21:44:55 -04:00
|
|
|
va_start(ap, fmt);
|
|
|
|
|
pclog_ex(fmt, ap);
|
|
|
|
|
va_end(ap);
|
2018-05-21 19:04:05 +02:00
|
|
|
}
|
|
|
|
|
}
|
2018-10-17 05:29:48 +02:00
|
|
|
#else
|
2022-07-21 21:44:55 -04:00
|
|
|
# define config_log(fmt, ...)
|
2018-10-17 05:29:48 +02:00
|
|
|
#endif
|
2018-05-21 19:04:05 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
static section_t *
|
|
|
|
|
find_section(char *name)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *sec;
|
2022-07-21 21:44:55 -04:00
|
|
|
char blank[] = "";
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sec = (section_t *) config_head.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
if (name == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
name = blank;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
while (sec != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!strncmp(sec->name, name, sizeof(sec->name)))
|
|
|
|
|
return (sec);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sec = (section_t *) sec->list.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (NULL);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
2021-07-23 01:20:14 +02:00
|
|
|
void *
|
|
|
|
|
config_find_section(char *name)
|
|
|
|
|
{
|
|
|
|
|
return (void *) find_section(name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
config_rename_section(void *priv, char *name)
|
|
|
|
|
{
|
|
|
|
|
section_t *sec = (section_t *) priv;
|
|
|
|
|
|
|
|
|
|
memset(sec->name, 0x00, sizeof(sec->name));
|
|
|
|
|
memcpy(sec->name, name, MIN(128, strlen(name) + 1));
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
static entry_t *
|
|
|
|
|
find_entry(section_t *section, char *name)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
entry_t *ent;
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = (entry_t *) section->entry_head.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
while (ent != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!strncmp(ent->name, name, sizeof(ent->name)))
|
|
|
|
|
return (ent);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = (entry_t *) ent->list.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (NULL);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
entries_num(section_t *section)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
entry_t *ent;
|
2022-07-21 21:44:55 -04:00
|
|
|
int i = 0;
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = (entry_t *) section->entry_head.next;
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
while (ent != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (strlen(ent->name) > 0)
|
|
|
|
|
i++;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = (entry_t *) ent->list.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (i);
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
static void
|
|
|
|
|
delete_section_if_empty(char *head)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
2022-07-21 21:44:55 -04:00
|
|
|
if (section == NULL)
|
|
|
|
|
return;
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (entries_num(section) == 0) {
|
2022-07-21 21:44:55 -04:00
|
|
|
list_delete(§ion->list, &config_head);
|
|
|
|
|
free(section);
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static section_t *
|
|
|
|
|
create_section(char *name)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *ns = malloc(sizeof(section_t));
|
|
|
|
|
|
|
|
|
|
memset(ns, 0x00, sizeof(section_t));
|
2019-02-06 03:34:39 +01:00
|
|
|
memcpy(ns->name, name, strlen(name) + 1);
|
2017-10-07 00:46:54 -04:00
|
|
|
list_add(&ns->list, &config_head);
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (ns);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static entry_t *
|
|
|
|
|
create_entry(section_t *section, char *name)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
entry_t *ne = malloc(sizeof(entry_t));
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
memset(ne, 0x00, sizeof(entry_t));
|
2019-02-06 03:34:39 +01:00
|
|
|
memcpy(ne->name, name, strlen(name) + 1);
|
2017-10-07 00:46:54 -04:00
|
|
|
list_add(&ne->list, §ion->entry_head);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (ne);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
static void
|
|
|
|
|
config_free(void)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *sec, *ns;
|
|
|
|
|
entry_t *ent;
|
|
|
|
|
|
|
|
|
|
sec = (section_t *)config_head.next;
|
|
|
|
|
while (sec != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
ns = (section_t *)sec->list.next;
|
|
|
|
|
ent = (entry_t *)sec->entry_head.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
while (ent != NULL) {
|
|
|
|
|
entry_t *nent = (entry_t *)ent->list.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
free(ent);
|
|
|
|
|
ent = nent;
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
free(sec);
|
|
|
|
|
sec = ns;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
2017-06-16 06:44:11 +02:00
|
|
|
#endif
|
2016-06-26 00:34:39 +02:00
|
|
|
|
2021-08-24 14:21:23 +06:00
|
|
|
static int
|
|
|
|
|
config_detect_bom(char *fn)
|
|
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
FILE *f;
|
|
|
|
|
unsigned char bom[4] = { 0, 0, 0, 0 };
|
2021-08-24 14:21:23 +06:00
|
|
|
|
|
|
|
|
#if defined(ANSI_CFG) || !defined(_WIN32)
|
|
|
|
|
f = plat_fopen(fn, "rt");
|
|
|
|
|
#else
|
|
|
|
|
f = plat_fopen(fn, "rt, ccs=UTF-8");
|
|
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
if (f == NULL)
|
|
|
|
|
return (0);
|
|
|
|
|
fread(bom, 1, 3, f);
|
|
|
|
|
if (bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF) {
|
|
|
|
|
fclose(f);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
fclose(f);
|
|
|
|
|
return 0;
|
2021-08-24 14:21:23 +06:00
|
|
|
}
|
2017-05-18 01:57:16 -04:00
|
|
|
|
2022-03-11 12:03:54 +06:00
|
|
|
#ifdef __HAIKU__
|
|
|
|
|
/* Local version of fgetws to avoid a crash */
|
2022-07-21 21:44:55 -04:00
|
|
|
static wchar_t *
|
|
|
|
|
config_fgetws(wchar_t *str, int count, FILE *stream)
|
2022-03-11 12:03:54 +06:00
|
|
|
{
|
|
|
|
|
int i = 0;
|
2022-07-21 21:44:55 -04:00
|
|
|
if (feof(stream))
|
|
|
|
|
return NULL;
|
2022-03-11 12:03:54 +06:00
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
|
wint_t curChar = fgetwc(stream);
|
|
|
|
|
if (curChar == WEOF) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (i + 1 < count)
|
|
|
|
|
str[i + 1] = 0;
|
2022-03-11 12:03:54 +06:00
|
|
|
return feof(stream) ? str : NULL;
|
|
|
|
|
}
|
|
|
|
|
str[i] = curChar;
|
2022-07-21 21:44:55 -04:00
|
|
|
if (curChar == '\n')
|
|
|
|
|
break;
|
2022-03-11 12:03:54 +06:00
|
|
|
}
|
2022-07-21 21:44:55 -04:00
|
|
|
if (i + 1 < count)
|
|
|
|
|
str[i + 1] = 0;
|
2022-03-11 12:03:54 +06:00
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Read and parse the configuration file into memory. */
|
|
|
|
|
static int
|
2021-03-14 20:35:01 +01:00
|
|
|
config_read(char *fn)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
char sname[128], ename[128];
|
|
|
|
|
wchar_t buff[1024];
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *sec, *ns;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ne;
|
|
|
|
|
int c, d, bom;
|
|
|
|
|
FILE *f;
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
bom = config_detect_bom(fn);
|
2017-10-29 04:20:20 -05:00
|
|
|
#if defined(ANSI_CFG) || !defined(_WIN32)
|
2021-03-14 20:35:01 +01:00
|
|
|
f = plat_fopen(fn, "rt");
|
2017-05-31 01:22:52 -04:00
|
|
|
#else
|
2021-03-14 20:35:01 +01:00
|
|
|
f = plat_fopen(fn, "rt, ccs=UTF-8");
|
2017-05-31 01:22:52 -04:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
if (f == NULL)
|
|
|
|
|
return (0);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
sec = malloc(sizeof(section_t));
|
|
|
|
|
memset(sec, 0x00, sizeof(section_t));
|
|
|
|
|
memset(&config_head, 0x00, sizeof(list_t));
|
|
|
|
|
list_add(&sec->list, &config_head);
|
2022-07-21 21:44:55 -04:00
|
|
|
if (bom)
|
|
|
|
|
fseek(f, 3, SEEK_SET);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
while (1) {
|
2022-07-21 21:44:55 -04:00
|
|
|
memset(buff, 0x00, sizeof(buff));
|
2022-03-11 12:03:54 +06:00
|
|
|
#ifdef __HAIKU__
|
2022-07-21 21:44:55 -04:00
|
|
|
config_fgetws(buff, sizeof_w(buff), f);
|
2022-03-11 12:03:54 +06:00
|
|
|
#else
|
2022-07-21 21:44:55 -04:00
|
|
|
fgetws(buff, sizeof_w(buff), f);
|
2022-03-11 12:03:54 +06:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
if (feof(f))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* Make sure there are no stray newlines or hard-returns in there. */
|
|
|
|
|
if (wcslen(buff) > 0)
|
|
|
|
|
if (buff[wcslen(buff) - 1] == L'\n')
|
|
|
|
|
buff[wcslen(buff) - 1] = L'\0';
|
|
|
|
|
if (wcslen(buff) > 0)
|
|
|
|
|
if (buff[wcslen(buff) - 1] == L'\r')
|
|
|
|
|
buff[wcslen(buff) - 1] = L'\0';
|
|
|
|
|
|
|
|
|
|
/* Skip any leading whitespace. */
|
|
|
|
|
c = 0;
|
|
|
|
|
while ((buff[c] == L' ') || (buff[c] == L'\t'))
|
|
|
|
|
c++;
|
|
|
|
|
|
|
|
|
|
/* Skip empty lines. */
|
|
|
|
|
if (buff[c] == L'\0')
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Skip lines that (only) have a comment. */
|
|
|
|
|
if ((buff[c] == L'#') || (buff[c] == L';'))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (buff[c] == L'[') { /*Section*/
|
|
|
|
|
c++;
|
|
|
|
|
d = 0;
|
|
|
|
|
while (buff[c] != L']' && buff[c])
|
|
|
|
|
wctomb(&(sname[d++]), buff[c++]);
|
|
|
|
|
sname[d] = L'\0';
|
|
|
|
|
|
|
|
|
|
/* Is the section name properly terminated? */
|
|
|
|
|
if (buff[c] != L']')
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Create a new section and insert it. */
|
|
|
|
|
ns = malloc(sizeof(section_t));
|
|
|
|
|
memset(ns, 0x00, sizeof(section_t));
|
|
|
|
|
memcpy(ns->name, sname, 128);
|
|
|
|
|
list_add(&ns->list, &config_head);
|
|
|
|
|
|
|
|
|
|
/* New section is now the current one. */
|
|
|
|
|
sec = ns;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the variable name. */
|
|
|
|
|
d = 0;
|
|
|
|
|
while ((buff[c] != L'=') && (buff[c] != L' ') && buff[c])
|
|
|
|
|
wctomb(&(ename[d++]), buff[c++]);
|
|
|
|
|
ename[d] = L'\0';
|
|
|
|
|
|
|
|
|
|
/* Skip incomplete lines. */
|
|
|
|
|
if (buff[c] == L'\0')
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Look for =, skip whitespace. */
|
|
|
|
|
while ((buff[c] == L'=' || buff[c] == L' ') && buff[c])
|
|
|
|
|
c++;
|
|
|
|
|
|
|
|
|
|
/* Skip incomplete lines. */
|
|
|
|
|
if (buff[c] == L'\0')
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* This is where the value part starts. */
|
|
|
|
|
d = c;
|
|
|
|
|
|
|
|
|
|
/* Allocate a new variable entry.. */
|
|
|
|
|
ne = malloc(sizeof(entry_t));
|
|
|
|
|
memset(ne, 0x00, sizeof(entry_t));
|
|
|
|
|
memcpy(ne->name, ename, 128);
|
|
|
|
|
wcsncpy(ne->wdata, &buff[d], sizeof_w(ne->wdata) - 1);
|
|
|
|
|
ne->wdata[sizeof_w(ne->wdata) - 1] = L'\0';
|
|
|
|
|
#ifdef _WIN32 /* Make sure the string is converted to UTF-8 rather than a legacy codepage */
|
|
|
|
|
c16stombs(ne->data, ne->wdata, sizeof(ne->data));
|
2021-03-14 20:35:01 +01:00
|
|
|
#else
|
2022-07-21 21:44:55 -04:00
|
|
|
wcstombs(ne->data, ne->wdata, sizeof(ne->data));
|
2021-03-14 20:35:01 +01:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
ne->data[sizeof(ne->data) - 1] = '\0';
|
2017-10-13 18:26:25 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
/* .. and insert it. */
|
|
|
|
|
list_add(&ne->list, &sec->entry_head);
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
(void) fclose(f);
|
2017-10-21 20:29:11 -04:00
|
|
|
|
|
|
|
|
if (do_dump_config)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_dump();
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (1);
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/*
|
|
|
|
|
* Write the in-memory configuration to disk.
|
|
|
|
|
* This is a public function, because the Settings UI
|
|
|
|
|
* want to directly write the configuration after it
|
|
|
|
|
* has changed it.
|
|
|
|
|
*/
|
|
|
|
|
void
|
2021-03-14 20:35:01 +01:00
|
|
|
config_write(char *fn)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
wchar_t wtemp[512];
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *sec;
|
2022-07-21 21:44:55 -04:00
|
|
|
FILE *f;
|
|
|
|
|
int fl = 0;
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-29 04:20:20 -05:00
|
|
|
#if defined(ANSI_CFG) || !defined(_WIN32)
|
2021-03-14 20:35:01 +01:00
|
|
|
f = plat_fopen(fn, "wt");
|
2017-05-31 01:22:52 -04:00
|
|
|
#else
|
2021-03-14 20:35:01 +01:00
|
|
|
f = plat_fopen(fn, "wt, ccs=UTF-8");
|
2017-05-31 01:22:52 -04:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
if (f == NULL)
|
|
|
|
|
return;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sec = (section_t *) config_head.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
while (sec != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
|
|
|
|
|
|
|
|
|
if (sec->name[0]) {
|
|
|
|
|
mbstowcs(wtemp, sec->name, strlen(sec->name) + 1);
|
|
|
|
|
if (fl)
|
|
|
|
|
fwprintf(f, L"\n[%ls]\n", wtemp);
|
|
|
|
|
else
|
|
|
|
|
fwprintf(f, L"[%ls]\n", wtemp);
|
|
|
|
|
fl++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ent = (entry_t *) sec->entry_head.next;
|
|
|
|
|
while (ent != NULL) {
|
|
|
|
|
if (ent->name[0] != '\0') {
|
|
|
|
|
mbstowcs(wtemp, ent->name, 128);
|
|
|
|
|
if (ent->wdata[0] == L'\0')
|
|
|
|
|
fwprintf(f, L"%ls = \n", wtemp);
|
|
|
|
|
else
|
|
|
|
|
fwprintf(f, L"%ls = %ls\n", wtemp, ent->wdata);
|
|
|
|
|
fl++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ent = (entry_t *) ent->list.next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sec = (section_t *) sec->list.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
(void) fclose(f);
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
#if NOT_USED
|
|
|
|
|
static void
|
|
|
|
|
config_new(void)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
# if defined(ANSI_CFG) || !defined(_WIN32)
|
2017-10-07 00:46:54 -04:00
|
|
|
FILE *f = _wfopen(config_file, L"wt");
|
2022-07-21 21:44:55 -04:00
|
|
|
# else
|
2021-03-14 20:35:01 +01:00
|
|
|
FILE *f = _wfopen(config_file, L"wt, ccs=UTF-8");
|
2022-07-21 21:44:55 -04:00
|
|
|
# endif
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (file != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
(void) fclose(f);
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
2017-09-23 21:12:26 -04:00
|
|
|
#endif
|
2017-05-18 01:57:16 -04:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Load "General" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_general(void)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "General";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
2017-10-07 00:46:54 -04:00
|
|
|
char *p;
|
|
|
|
|
|
2021-04-12 05:58:59 +02:00
|
|
|
vid_resize = config_get_int(cat, "vid_resize", 0);
|
|
|
|
|
if (vid_resize & ~3)
|
2022-07-21 21:44:55 -04:00
|
|
|
vid_resize &= 3;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
memset(temp, '\0', sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, "vid_renderer", "default");
|
2017-10-19 04:27:04 -04:00
|
|
|
vid_api = plat_vidapi(p);
|
2017-10-07 00:46:54 -04:00
|
|
|
config_delete_var(cat, "vid_api");
|
|
|
|
|
|
|
|
|
|
video_fullscreen_scale = config_get_int(cat, "video_fullscreen_scale", 0);
|
|
|
|
|
|
2021-09-18 21:33:13 +02:00
|
|
|
video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 1);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2021-05-01 20:49:23 +03:00
|
|
|
video_filter_method = config_get_int(cat, "video_filter_method", 1);
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
force_43 = !!config_get_int(cat, "force_43", 0);
|
2022-07-21 21:44:55 -04:00
|
|
|
scale = config_get_int(cat, "scale", 1);
|
2017-10-07 00:46:54 -04:00
|
|
|
if (scale > 3)
|
2020-09-02 10:56:49 +08:00
|
|
|
scale = 3;
|
|
|
|
|
dpi_scale = config_get_int(cat, "dpi_scale", 1);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
enable_overscan = !!config_get_int(cat, "enable_overscan", 0);
|
2017-10-07 00:46:54 -04:00
|
|
|
vid_cga_contrast = !!config_get_int(cat, "vid_cga_contrast", 0);
|
2022-07-21 21:44:55 -04:00
|
|
|
video_grayscale = config_get_int(cat, "video_grayscale", 0);
|
|
|
|
|
video_graytype = config_get_int(cat, "video_graytype", 0);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2018-02-10 00:01:52 +01:00
|
|
|
rctrl_is_lalt = config_get_int(cat, "rctrl_is_lalt", 0);
|
2022-07-21 21:44:55 -04:00
|
|
|
update_icons = config_get_int(cat, "update_icons", 1);
|
2018-02-10 00:01:52 +01:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
window_remember = config_get_int(cat, "window_remember", 0);
|
2021-09-18 15:24:00 +02:00
|
|
|
if (window_remember || (vid_resize & 2)) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!window_remember)
|
|
|
|
|
config_delete_var(cat, "window_remember");
|
2017-10-07 00:46:54 -04:00
|
|
|
} else {
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "window_remember");
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
window_w = window_h = window_x = window_y = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2021-04-12 05:58:59 +02:00
|
|
|
if (vid_resize & 2) {
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, "window_fixed_res", NULL);
|
|
|
|
|
if (p == NULL)
|
|
|
|
|
p = "120x120";
|
|
|
|
|
sscanf(p, "%ix%i", &fixed_size_x, &fixed_size_y);
|
|
|
|
|
if (fixed_size_x < 120)
|
|
|
|
|
fixed_size_x = 120;
|
|
|
|
|
if (fixed_size_x > 2048)
|
|
|
|
|
fixed_size_x = 2048;
|
|
|
|
|
if (fixed_size_y < 120)
|
|
|
|
|
fixed_size_y = 120;
|
|
|
|
|
if (fixed_size_y > 2048)
|
|
|
|
|
fixed_size_y = 2048;
|
2021-04-12 05:58:59 +02:00
|
|
|
} else {
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "window_fixed_res");
|
2021-04-12 05:58:59 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
fixed_size_x = fixed_size_y = 120;
|
2021-04-12 05:58:59 +02:00
|
|
|
}
|
|
|
|
|
|
2018-02-11 20:51:42 +01:00
|
|
|
sound_gain = config_get_int(cat, "sound_gain", 0);
|
2021-07-30 04:01:46 +02:00
|
|
|
|
2021-07-19 02:27:22 +02:00
|
|
|
kbd_req_capture = config_get_int(cat, "kbd_req_capture", 0);
|
2021-07-30 04:01:46 +02:00
|
|
|
hide_status_bar = config_get_int(cat, "hide_status_bar", 0);
|
2022-07-21 21:44:55 -04:00
|
|
|
hide_tool_bar = config_get_int(cat, "hide_tool_bar", 0);
|
2017-12-10 15:16:24 +01:00
|
|
|
|
2020-07-27 19:55:25 -03:00
|
|
|
confirm_reset = config_get_int(cat, "confirm_reset", 1);
|
2022-07-21 21:44:55 -04:00
|
|
|
confirm_exit = config_get_int(cat, "confirm_exit", 1);
|
|
|
|
|
confirm_save = config_get_int(cat, "confirm_save", 1);
|
2020-07-27 19:55:25 -03:00
|
|
|
|
2022-07-18 02:17:16 +02:00
|
|
|
p = config_get_string(cat, "language", NULL);
|
|
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
lang_id = plat_language_code(p);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2022-06-01 15:31:58 +06:00
|
|
|
mouse_sensitivity = config_get_double(cat, "mouse_sensitivity", 1.0);
|
|
|
|
|
if (mouse_sensitivity < 0.5)
|
2022-07-21 21:44:55 -04:00
|
|
|
mouse_sensitivity = 0.5;
|
2022-06-01 15:31:58 +06:00
|
|
|
else if (mouse_sensitivity > 2.0)
|
2022-07-21 21:44:55 -04:00
|
|
|
mouse_sensitivity = 2.0;
|
2022-06-01 15:31:58 +06:00
|
|
|
|
2022-07-18 02:17:16 +02:00
|
|
|
p = config_get_string(cat, "iconset", NULL);
|
|
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
strcpy(icon_set, p);
|
2022-07-18 02:17:16 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
strcpy(icon_set, "");
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2019-12-04 21:55:35 +01:00
|
|
|
enable_discord = !!config_get_int(cat, "enable_discord", 0);
|
2021-04-23 16:09:45 +03:00
|
|
|
|
|
|
|
|
video_framerate = config_get_int(cat, "video_gl_framerate", -1);
|
2022-07-21 21:44:55 -04:00
|
|
|
video_vsync = config_get_int(cat, "video_gl_vsync", 0);
|
2021-11-29 17:57:21 +01:00
|
|
|
strncpy(video_shader, config_get_string(cat, "video_gl_shader", ""), sizeof(video_shader));
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Load "Machine" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_machine(void)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
char *cat = "Machine";
|
|
|
|
|
char *p, *migrate_from = NULL;
|
|
|
|
|
int c, i, j, speed, legacy_mfg, legacy_cpu;
|
2020-11-18 01:09:17 -03:00
|
|
|
double multi;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
p = config_get_string(cat, "machine", NULL);
|
2020-11-18 01:09:17 -03:00
|
|
|
if (p != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
migrate_from = p;
|
|
|
|
|
if (!strcmp(p, "8500ttc")) /* migrate typo... */
|
|
|
|
|
machine = machine_get_machine_from_internal_name("8600ttc");
|
|
|
|
|
else if (!strcmp(p, "eagle_pcspirit")) /* ...legacy names... */
|
|
|
|
|
machine = machine_get_machine_from_internal_name("pcspirit");
|
|
|
|
|
else if (!strcmp(p, "multitech_pc700"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("pc700");
|
|
|
|
|
else if (!strcmp(p, "ncr_pc4i"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("pc4i");
|
|
|
|
|
else if (!strcmp(p, "olivetti_m19"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("m19");
|
|
|
|
|
else if (!strcmp(p, "open_xt"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("openxt");
|
|
|
|
|
else if (!strcmp(p, "open_at"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("openat");
|
|
|
|
|
else if (!strcmp(p, "philips_p3105"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("p3105");
|
|
|
|
|
else if (!strcmp(p, "philips_p3120"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("p3120");
|
|
|
|
|
else if (!strcmp(p, "olivetti_m24"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("m24");
|
|
|
|
|
else if (!strcmp(p, "olivetti_m240"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("m240");
|
|
|
|
|
else if (!strcmp(p, "ncr_pc8"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("pc8");
|
|
|
|
|
else if (!strcmp(p, "olivetti_m290"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("m290");
|
|
|
|
|
else if (!strcmp(p, "ncr_3302"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("3302");
|
|
|
|
|
else if (!strcmp(p, "ncr_pc916sx"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("pc916sx");
|
|
|
|
|
else if (!strcmp(p, "cbm_sl386sx16"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("cmdsl386sx16");
|
|
|
|
|
else if (!strcmp(p, "cbm_sl386sx25"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("cmdsl386sx25");
|
|
|
|
|
else if (!strcmp(p, "mr586"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("p54tp4xe_mr");
|
|
|
|
|
else if (!strcmp(p, "pcv240"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("pcv90");
|
|
|
|
|
else if (!strcmp(p, "v60n"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("acerv60n");
|
|
|
|
|
else if (!strcmp(p, "tsunamiatx"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("s1846");
|
|
|
|
|
else if (!strcmp(p, "trinity371"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("s1857");
|
|
|
|
|
else if (!strcmp(p, "63a"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("63a1");
|
|
|
|
|
else if (!strcmp(p, "4sa2"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("4saw2");
|
|
|
|
|
else if (!strcmp(p, "award386dx")) /* ...merged machines... */
|
|
|
|
|
machine = machine_get_machine_from_internal_name("award495");
|
|
|
|
|
else if (!strcmp(p, "ami386dx"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("ami495");
|
|
|
|
|
else if (!strcmp(p, "mr386dx"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("mr495");
|
|
|
|
|
else if (!strcmp(p, "award486"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("award495");
|
|
|
|
|
else if (!strcmp(p, "ami486"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("ami495");
|
|
|
|
|
else if (!strcmp(p, "mr486"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("mr495");
|
|
|
|
|
else if (!strcmp(p, "ibmps1_2121_isa"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("ibmps1_2121");
|
|
|
|
|
else if (!strcmp(p, "fw6400gx_s1"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("fw6400gx");
|
|
|
|
|
else if (!strcmp(p, "p54vl"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("p5vl");
|
|
|
|
|
else if (!strcmp(p, "chariot"))
|
|
|
|
|
machine = machine_get_machine_from_internal_name("fmb");
|
|
|
|
|
else if (!strcmp(p, "president")) { /* ...and removed machines */
|
|
|
|
|
machine = machine_get_machine_from_internal_name("mb500n");
|
|
|
|
|
migrate_from = NULL;
|
|
|
|
|
} else if (!strcmp(p, "j656vxd")) {
|
|
|
|
|
machine = machine_get_machine_from_internal_name("p55va");
|
|
|
|
|
migrate_from = NULL;
|
|
|
|
|
} else {
|
|
|
|
|
machine = machine_get_machine_from_internal_name(p);
|
|
|
|
|
migrate_from = NULL;
|
|
|
|
|
}
|
2022-02-20 02:26:27 -05:00
|
|
|
} else
|
2022-07-21 21:44:55 -04:00
|
|
|
machine = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
/* This is for backwards compatibility. */
|
|
|
|
|
p = config_get_string(cat, "model", NULL);
|
|
|
|
|
if (p != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
migrate_from = p;
|
|
|
|
|
if (!strcmp(p, "p55r2p4")) /* migrate typo */
|
|
|
|
|
machine = machine_get_machine_from_internal_name("p55t2p4");
|
|
|
|
|
else {
|
|
|
|
|
machine = machine_get_machine_from_internal_name(p);
|
|
|
|
|
migrate_from = NULL;
|
|
|
|
|
}
|
|
|
|
|
config_delete_var(cat, "model");
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
if (machine >= machine_count())
|
2022-07-21 21:44:55 -04:00
|
|
|
machine = machine_count() - 1;
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2021-04-17 19:07:16 -03:00
|
|
|
/* Copy NVR files when migrating a machine to a new internal name. */
|
|
|
|
|
if (migrate_from) {
|
2022-07-21 21:44:55 -04:00
|
|
|
char old_fn[256];
|
|
|
|
|
strcpy(old_fn, migrate_from);
|
|
|
|
|
strcat(old_fn, ".");
|
|
|
|
|
c = strlen(old_fn);
|
|
|
|
|
char new_fn[256];
|
|
|
|
|
strcpy(new_fn, machines[machine].internal_name);
|
|
|
|
|
strcat(new_fn, ".");
|
|
|
|
|
i = strlen(new_fn);
|
|
|
|
|
|
|
|
|
|
/* Iterate through NVR files. */
|
|
|
|
|
DIR *dirp = opendir(nvr_path("."));
|
|
|
|
|
if (dirp) {
|
|
|
|
|
struct dirent *entry;
|
|
|
|
|
while ((entry = readdir(dirp))) {
|
|
|
|
|
/* Check if this file corresponds to the old name. */
|
|
|
|
|
if (strncmp(entry->d_name, old_fn, c))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Add extension to the new name. */
|
|
|
|
|
strcpy(&new_fn[i], &entry->d_name[c]);
|
|
|
|
|
|
|
|
|
|
/* Only copy if a file with the new name doesn't already exist. */
|
|
|
|
|
FILE *g = nvr_fopen(new_fn, "rb");
|
|
|
|
|
if (!g) {
|
|
|
|
|
FILE *f = nvr_fopen(entry->d_name, "rb");
|
|
|
|
|
g = nvr_fopen(new_fn, "wb");
|
|
|
|
|
|
|
|
|
|
uint8_t buf[4096];
|
|
|
|
|
while ((j = fread(buf, 1, sizeof(buf), f)))
|
|
|
|
|
fwrite(buf, 1, j, g);
|
|
|
|
|
|
|
|
|
|
fclose(f);
|
|
|
|
|
}
|
|
|
|
|
fclose(g);
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-04-17 19:07:16 -03:00
|
|
|
}
|
|
|
|
|
|
2020-12-07 21:06:29 -03:00
|
|
|
cpu_override = config_get_int(cat, "cpu_override", 0);
|
2022-07-21 21:44:55 -04:00
|
|
|
cpu_f = NULL;
|
|
|
|
|
p = config_get_string(cat, "cpu_family", NULL);
|
2020-11-18 15:18:20 -03:00
|
|
|
if (p) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!strcmp(p, "enh_am486dx2")) /* migrate modified names */
|
|
|
|
|
cpu_f = cpu_get_family("am486dx2_slenh");
|
|
|
|
|
else if (!strcmp(p, "enh_am486dx4"))
|
|
|
|
|
cpu_f = cpu_get_family("am486dx4_slenh");
|
|
|
|
|
else
|
|
|
|
|
cpu_f = cpu_get_family(p);
|
|
|
|
|
|
|
|
|
|
if (cpu_f && !cpu_family_is_eligible(cpu_f, machine)) /* only honor eligible families */
|
|
|
|
|
cpu_f = NULL;
|
2020-11-18 15:18:20 -03:00
|
|
|
} else {
|
2022-07-21 21:44:55 -04:00
|
|
|
/* Backwards compatibility with the previous CPU model system. */
|
|
|
|
|
legacy_mfg = config_get_int(cat, "cpu_manufacturer", 0);
|
|
|
|
|
legacy_cpu = config_get_int(cat, "cpu", 0);
|
|
|
|
|
|
|
|
|
|
/* Check if either legacy ID is present, and if they are within bounds. */
|
|
|
|
|
if (((legacy_mfg > 0) || (legacy_cpu > 0)) && (legacy_mfg >= 0) && (legacy_mfg < 4) && (legacy_cpu >= 0)) {
|
|
|
|
|
/* Look for a machine entry on the legacy table. */
|
|
|
|
|
p = machine_get_internal_name();
|
|
|
|
|
c = 0;
|
|
|
|
|
while (cpu_legacy_table[c].machine) {
|
|
|
|
|
if (!strcmp(p, cpu_legacy_table[c].machine))
|
|
|
|
|
break;
|
|
|
|
|
c++;
|
|
|
|
|
}
|
|
|
|
|
if (cpu_legacy_table[c].machine) {
|
|
|
|
|
/* Determine the amount of CPU entries on the table. */
|
|
|
|
|
i = -1;
|
|
|
|
|
while (cpu_legacy_table[c].tables[legacy_mfg][++i].family)
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
/* If the CPU ID is out of bounds, reset to the last known ID. */
|
|
|
|
|
if (legacy_cpu >= i)
|
|
|
|
|
legacy_cpu = i - 1;
|
|
|
|
|
|
|
|
|
|
const cpu_legacy_table_t *legacy_table_entry = &cpu_legacy_table[c].tables[legacy_mfg][legacy_cpu];
|
|
|
|
|
|
|
|
|
|
/* Check if the referenced family exists. */
|
|
|
|
|
cpu_f = cpu_get_family(legacy_table_entry->family);
|
|
|
|
|
if (cpu_f) {
|
|
|
|
|
/* Save the new values. */
|
|
|
|
|
config_set_string(cat, "cpu_family", (char *) legacy_table_entry->family);
|
|
|
|
|
config_set_int(cat, "cpu_speed", legacy_table_entry->rspeed);
|
|
|
|
|
config_set_double(cat, "cpu_multi", legacy_table_entry->multi);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-07-25 12:48:20 -03:00
|
|
|
}
|
|
|
|
|
|
2020-11-18 01:09:17 -03:00
|
|
|
if (cpu_f) {
|
2022-07-21 21:44:55 -04:00
|
|
|
speed = config_get_int(cat, "cpu_speed", 0);
|
|
|
|
|
multi = config_get_double(cat, "cpu_multi", 0);
|
|
|
|
|
|
|
|
|
|
/* Find the configured CPU. */
|
|
|
|
|
cpu = 0;
|
|
|
|
|
c = 0;
|
|
|
|
|
i = 256;
|
|
|
|
|
while (cpu_f->cpus[cpu].cpu_type) {
|
|
|
|
|
if (cpu_is_eligible(cpu_f, cpu, machine)) { /* skip ineligible CPUs */
|
|
|
|
|
if ((cpu_f->cpus[cpu].rspeed == speed) && (cpu_f->cpus[cpu].multi == multi)) /* exact speed/multiplier match */
|
|
|
|
|
break;
|
|
|
|
|
else if ((cpu_f->cpus[cpu].rspeed >= speed) && (i == 256)) /* closest speed match */
|
|
|
|
|
i = cpu;
|
|
|
|
|
c = cpu; /* store fastest eligible CPU */
|
|
|
|
|
}
|
|
|
|
|
cpu++;
|
|
|
|
|
}
|
|
|
|
|
if (!cpu_f->cpus[cpu].cpu_type) /* if no exact match was found, use closest matching faster CPU, or fastest eligible CPU */
|
|
|
|
|
cpu = MIN(i, c);
|
2020-11-18 14:44:27 -03:00
|
|
|
} else { /* default */
|
2022-07-21 21:44:55 -04:00
|
|
|
/* Find first eligible family. */
|
|
|
|
|
c = 0;
|
|
|
|
|
while (!cpu_family_is_eligible(&cpu_families[c], machine)) {
|
|
|
|
|
if (cpu_families[c++].package == 0) { /* end of list */
|
|
|
|
|
fatal("No eligible CPU families for the selected machine\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cpu_f = (cpu_family_t *) &cpu_families[c];
|
|
|
|
|
|
|
|
|
|
/* Find first eligible CPU in that family. */
|
|
|
|
|
cpu = 0;
|
|
|
|
|
while (!cpu_is_eligible(cpu_f, cpu, machine)) {
|
|
|
|
|
if (cpu_f->cpus[cpu++].cpu_type == 0) { /* end of list */
|
|
|
|
|
cpu = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-07-25 12:48:20 -03:00
|
|
|
}
|
2020-11-18 15:18:20 -03:00
|
|
|
cpu_s = (CPU *) &cpu_f->cpus[cpu];
|
2020-07-25 12:48:20 -03:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
cpu_waitstates = config_get_int(cat, "cpu_waitstates", 0);
|
2016-06-26 00:34:39 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
p = (char *) config_get_string(cat, "fpu_type", "none");
|
2020-11-18 01:09:17 -03:00
|
|
|
fpu_type = fpu_get_type(cpu_f, cpu, p);
|
2020-06-15 21:21:26 +02:00
|
|
|
|
2022-02-20 02:26:27 -05:00
|
|
|
mem_size = config_get_int(cat, "mem_size", 64);
|
2018-09-03 14:28:50 +02:00
|
|
|
#if 0
|
2021-12-13 01:23:06 +01:00
|
|
|
if (mem_size < ((machine_has_bus(machine, MACHINE_AT) &&
|
2017-10-07 00:46:54 -04:00
|
|
|
(machines[machine].ram_granularity < 128)) ? machines[machine].min_ram*1024 : machines[machine].min_ram))
|
2022-07-21 21:44:55 -04:00
|
|
|
mem_size = (((machine_has_bus(machine, MACHINE_AT) && (machines[machine].ram_granularity < 128)) ? machines[machine].min_ram*1024 : machines[machine].min_ram);
|
2020-07-25 12:48:20 -03:00
|
|
|
#endif
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2020-06-12 23:29:12 +02:00
|
|
|
if (mem_size > 2097152)
|
2022-07-21 21:44:55 -04:00
|
|
|
mem_size = 2097152;
|
2016-06-26 00:34:39 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
cpu_use_dynarec = !!config_get_int(cat, "cpu_use_dynarec", 0);
|
2017-10-03 16:26:55 -04:00
|
|
|
|
2018-08-01 18:07:52 +02:00
|
|
|
p = config_get_string(cat, "time_sync", NULL);
|
2022-02-20 02:26:27 -05:00
|
|
|
if (p != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!strcmp(p, "disabled"))
|
|
|
|
|
time_sync = TIME_SYNC_DISABLED;
|
|
|
|
|
else if (!strcmp(p, "local"))
|
|
|
|
|
time_sync = TIME_SYNC_ENABLED;
|
|
|
|
|
else if (!strcmp(p, "utc") || !strcmp(p, "gmt"))
|
|
|
|
|
time_sync = TIME_SYNC_ENABLED | TIME_SYNC_UTC;
|
|
|
|
|
else
|
|
|
|
|
time_sync = TIME_SYNC_ENABLED;
|
2018-08-01 18:07:52 +02:00
|
|
|
} else
|
2022-07-21 21:44:55 -04:00
|
|
|
time_sync = !!config_get_int(cat, "enable_sync", 1);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
/* Remove this after a while.. */
|
|
|
|
|
config_delete_var(cat, "nvr_path");
|
2018-08-01 18:07:52 +02:00
|
|
|
config_delete_var(cat, "enable_sync");
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Load "Video" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_video(void)
|
2017-05-05 22:36:10 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Video";
|
|
|
|
|
char *p;
|
2022-07-21 21:44:55 -04:00
|
|
|
int free_p = 0;
|
2017-05-05 22:36:10 +02:00
|
|
|
|
2021-12-13 01:23:06 +01:00
|
|
|
if (machine_has_flags(machine, MACHINE_VIDEO_ONLY)) {
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "gfxcard");
|
|
|
|
|
gfxcard = VID_INTERNAL;
|
2017-11-05 01:57:04 -05:00
|
|
|
} else {
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, "gfxcard", NULL);
|
|
|
|
|
if (p == NULL) {
|
|
|
|
|
if (machine_has_flags(machine, MACHINE_VIDEO)) {
|
|
|
|
|
p = (char *) malloc((strlen("internal") + 1) * sizeof(char));
|
|
|
|
|
strcpy(p, "internal");
|
|
|
|
|
} else {
|
|
|
|
|
p = (char *) malloc((strlen("none") + 1) * sizeof(char));
|
|
|
|
|
strcpy(p, "none");
|
|
|
|
|
}
|
|
|
|
|
free_p = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!strcmp(p, "virge375_vbe20_pci")) /* migrate renamed cards */
|
|
|
|
|
gfxcard = video_get_video_from_internal_name("virge385_pci");
|
|
|
|
|
else
|
|
|
|
|
gfxcard = video_get_video_from_internal_name(p);
|
|
|
|
|
if (free_p)
|
|
|
|
|
free(p);
|
2018-04-25 23:51:13 +02:00
|
|
|
}
|
2017-05-05 22:36:10 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
voodoo_enabled = !!config_get_int(cat, "voodoo", 0);
|
|
|
|
|
ibm8514_enabled = !!config_get_int(cat, "8514a", 0);
|
|
|
|
|
xga_enabled = !!config_get_int(cat, "xga", 0);
|
2022-07-10 11:41:02 +06:00
|
|
|
show_second_monitors = !!config_get_int(cat, "show_second_monitors", 1);
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, "gfxcard_2", NULL);
|
|
|
|
|
if (!p)
|
|
|
|
|
p = "none";
|
2022-07-07 14:34:59 +06:00
|
|
|
gfxcard_2 = video_get_video_from_internal_name(p);
|
2017-05-05 22:36:10 +02:00
|
|
|
}
|
|
|
|
|
|
2022-07-05 01:41:13 +06:00
|
|
|
static void
|
|
|
|
|
load_monitor(int monitor_index)
|
|
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
char monitor_config_name[sizeof("Monitor #") + 12] = { [0] = 0 };
|
|
|
|
|
char *ptr = NULL;
|
2022-07-05 14:09:14 +06:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
if (monitor_index == 0) {
|
|
|
|
|
/* Migrate configs */
|
2022-07-05 16:40:04 +06:00
|
|
|
ptr = config_get_string("General", "window_coordinates", NULL);
|
2022-07-21 21:44:55 -04:00
|
|
|
|
|
|
|
|
config_delete_var("General", "window_coordinates");
|
|
|
|
|
}
|
2022-07-05 16:40:04 +06:00
|
|
|
snprintf(monitor_config_name, sizeof(monitor_config_name), "Monitor #%i", monitor_index + 1);
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!ptr)
|
|
|
|
|
ptr = config_get_string(monitor_config_name, "window_coordinates", "0, 0, 0, 0");
|
|
|
|
|
if (window_remember || (vid_resize & 2))
|
|
|
|
|
sscanf(ptr, "%i, %i, %i, %i",
|
|
|
|
|
&monitor_settings[monitor_index].mon_window_x, &monitor_settings[monitor_index].mon_window_y,
|
|
|
|
|
&monitor_settings[monitor_index].mon_window_w, &monitor_settings[monitor_index].mon_window_h);
|
2022-07-05 01:41:13 +06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
save_monitor(int monitor_index)
|
|
|
|
|
{
|
|
|
|
|
char monitor_config_name[sizeof("Monitor #") + 12] = { [0] = 0 };
|
2022-07-21 21:44:55 -04:00
|
|
|
char saved_coordinates[12 * 4 + 8 + 1] = { [0] = 0 };
|
2022-07-05 01:41:13 +06:00
|
|
|
|
|
|
|
|
snprintf(monitor_config_name, sizeof(monitor_config_name), "Monitor #%i", monitor_index + 1);
|
2022-07-05 14:09:14 +06:00
|
|
|
if (!(monitor_settings[monitor_index].mon_window_x == 0
|
2022-07-21 21:44:55 -04:00
|
|
|
&& monitor_settings[monitor_index].mon_window_y == 0
|
|
|
|
|
&& monitor_settings[monitor_index].mon_window_w == 0
|
|
|
|
|
&& monitor_settings[monitor_index].mon_window_h == 0)
|
|
|
|
|
&& (window_remember || (vid_resize & 2))) {
|
2022-07-05 14:09:14 +06:00
|
|
|
snprintf(saved_coordinates, sizeof(saved_coordinates), "%i, %i, %i, %i", monitor_settings[monitor_index].mon_window_x, monitor_settings[monitor_index].mon_window_y,
|
2022-07-21 21:44:55 -04:00
|
|
|
monitor_settings[monitor_index].mon_window_w, monitor_settings[monitor_index].mon_window_h);
|
2022-07-05 01:41:13 +06:00
|
|
|
|
|
|
|
|
config_set_string(monitor_config_name, "window_coordinates", saved_coordinates);
|
2022-07-21 21:44:55 -04:00
|
|
|
} else
|
|
|
|
|
config_delete_var(monitor_config_name, "window_coordinates");
|
2022-07-05 01:41:13 +06:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Load "Input Devices" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_input_devices(void)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Input devices";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
|
|
|
|
int c, d;
|
2017-10-07 00:46:54 -04:00
|
|
|
char *p;
|
|
|
|
|
|
|
|
|
|
p = config_get_string(cat, "mouse_type", NULL);
|
|
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
mouse_type = mouse_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
mouse_type = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-12-04 21:45:14 +05:00
|
|
|
p = config_get_string(cat, "joystick_type", NULL);
|
|
|
|
|
if (p != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!strcmp(p, "standard_2button")) /* migrate renamed types */
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_2button");
|
|
|
|
|
else if (!strcmp(p, "standard_4button"))
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_4button");
|
|
|
|
|
else if (!strcmp(p, "standard_6button"))
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_6button");
|
|
|
|
|
else if (!strcmp(p, "standard_8button"))
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_8button");
|
|
|
|
|
else if (!strcmp(p, "ch_flighstick_pro")) /* fix typo */
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("ch_flightstick_pro");
|
|
|
|
|
else
|
|
|
|
|
joystick_type = joystick_get_from_internal_name(p);
|
|
|
|
|
|
|
|
|
|
if (!joystick_type) {
|
|
|
|
|
/* Try to read an integer for backwards compatibility with old configs */
|
|
|
|
|
if (!strcmp(p, "0")) /* workaround for config_get_int returning 0 on non-integer data */
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_2button");
|
|
|
|
|
else {
|
|
|
|
|
c = config_get_int(cat, "joystick_type", 8);
|
|
|
|
|
switch (c) {
|
|
|
|
|
case 1:
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_4button");
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_6button");
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("2axis_8button");
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("4axis_4button");
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("ch_flightstick_pro");
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("sidewinder_pad");
|
|
|
|
|
break;
|
|
|
|
|
case 7:
|
|
|
|
|
joystick_type = joystick_get_from_internal_name("thrustmaster_fcs");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
joystick_type = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-12-04 21:45:14 +05:00
|
|
|
} else
|
2022-07-21 21:44:55 -04:00
|
|
|
joystick_type = 0;
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) {
|
|
|
|
|
sprintf(temp, "joystick_%i_nr", c);
|
|
|
|
|
joystick_state[c].plat_joystick_nr = config_get_int(cat, temp, 0);
|
|
|
|
|
|
|
|
|
|
if (joystick_state[c].plat_joystick_nr) {
|
|
|
|
|
for (d = 0; d < joystick_get_axis_count(joystick_type); d++) {
|
|
|
|
|
sprintf(temp, "joystick_%i_axis_%i", c, d);
|
|
|
|
|
joystick_state[c].axis_mapping[d] = config_get_int(cat, temp, d);
|
|
|
|
|
}
|
|
|
|
|
for (d = 0; d < joystick_get_button_count(joystick_type); d++) {
|
|
|
|
|
sprintf(temp, "joystick_%i_button_%i", c, d);
|
|
|
|
|
joystick_state[c].button_mapping[d] = config_get_int(cat, temp, d);
|
|
|
|
|
}
|
|
|
|
|
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) {
|
|
|
|
|
sprintf(temp, "joystick_%i_pov_%i", c, d);
|
|
|
|
|
p = config_get_string(cat, temp, "0, 0");
|
|
|
|
|
joystick_state[c].pov_mapping[d][0] = joystick_state[c].pov_mapping[d][1] = 0;
|
|
|
|
|
sscanf(p, "%i, %i", &joystick_state[c].pov_mapping[d][0], &joystick_state[c].pov_mapping[d][1]);
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Load "Sound" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_sound(void)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Sound";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
2017-10-07 00:46:54 -04:00
|
|
|
char *p;
|
|
|
|
|
|
|
|
|
|
p = config_get_string(cat, "sndcard", NULL);
|
2020-11-16 00:01:21 +01:00
|
|
|
/* FIXME: Hack to not break configs with the Sound Blaster 128 PCI set. */
|
|
|
|
|
if ((p != NULL) && (!strcmp(p, "sbpci128") || !strcmp(p, "sb128pci")))
|
2022-07-21 21:44:55 -04:00
|
|
|
p = "es1371";
|
2017-10-07 00:46:54 -04:00
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
sound_card_current = sound_card_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
sound_card_current = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
p = config_get_string(cat, "midi_device", NULL);
|
|
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
midi_output_device_current = midi_out_device_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
midi_output_device_current = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-01-01 20:20:16 +01:00
|
|
|
p = config_get_string(cat, "midi_in_device", NULL);
|
|
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
midi_input_device_current = midi_in_device_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
midi_input_device_current = 0;
|
2020-01-01 20:20:16 +01:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
mpu401_standalone_enable = !!config_get_int(cat, "mpu401_standalone", 0);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
SSI2001 = !!config_get_int(cat, "ssi2001", 0);
|
2017-10-07 00:46:54 -04:00
|
|
|
GAMEBLASTER = !!config_get_int(cat, "gameblaster", 0);
|
2022-07-21 21:44:55 -04:00
|
|
|
GUS = !!config_get_int(cat, "gus", 0);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
memset(temp, '\0', sizeof(temp));
|
|
|
|
|
p = config_get_string(cat, "sound_type", "float");
|
2021-04-05 23:30:07 +02:00
|
|
|
if (strlen(p) > 511)
|
2022-07-21 21:44:55 -04:00
|
|
|
fatal("load_sound(): strlen(p) > 511\n");
|
2021-04-05 23:30:07 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
strncpy(temp, p, strlen(p) + 1);
|
2017-10-07 00:46:54 -04:00
|
|
|
if (!strcmp(temp, "float") || !strcmp(temp, "1"))
|
2022-07-21 21:44:55 -04:00
|
|
|
sound_is_float = 1;
|
|
|
|
|
else
|
|
|
|
|
sound_is_float = 0;
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Load "Network" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_network(void)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Network";
|
|
|
|
|
char *p;
|
2016-06-26 00:34:39 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
p = config_get_string(cat, "net_type", NULL);
|
|
|
|
|
if (p != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!strcmp(p, "pcap") || !strcmp(p, "1"))
|
|
|
|
|
network_type = NET_TYPE_PCAP;
|
|
|
|
|
else if (!strcmp(p, "slirp") || !strcmp(p, "2"))
|
|
|
|
|
network_type = NET_TYPE_SLIRP;
|
|
|
|
|
else
|
|
|
|
|
network_type = NET_TYPE_NONE;
|
2017-10-07 00:46:54 -04:00
|
|
|
} else
|
2022-07-21 21:44:55 -04:00
|
|
|
network_type = NET_TYPE_NONE;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2018-03-19 01:02:04 +01:00
|
|
|
memset(network_host, '\0', sizeof(network_host));
|
|
|
|
|
p = config_get_string(cat, "net_host_device", NULL);
|
|
|
|
|
if (p == NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, "net_host_device", NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
config_delete_var(cat, "net_host_device");
|
2018-03-19 01:02:04 +01:00
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
if (p != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if ((network_dev_to_id(p) == -1) || (network_ndev == 1)) {
|
|
|
|
|
if ((network_ndev == 1) && strcmp(network_host, "none")) {
|
|
|
|
|
ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2094, (wchar_t *) IDS_2129);
|
|
|
|
|
} else if (network_dev_to_id(p) == -1) {
|
|
|
|
|
ui_msgbox_header(MBX_ERROR, (wchar_t *) IDS_2095, (wchar_t *) IDS_2129);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(network_host, "none");
|
|
|
|
|
} else {
|
|
|
|
|
strncpy(network_host, p, sizeof(network_host) - 1);
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
} else
|
2022-07-21 21:44:55 -04:00
|
|
|
strcpy(network_host, "none");
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
p = config_get_string(cat, "net_card", NULL);
|
|
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
network_card = network_card_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
network_card = 0;
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Load "Ports" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_ports(void)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Ports (COM & LPT)";
|
|
|
|
|
char *p;
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
|
|
|
|
int c, d;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2021-11-13 17:33:43 -05:00
|
|
|
for (c = 0; c < SERIAL_MAX; c++) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "serial%d_enabled", c + 1);
|
|
|
|
|
serial_enabled[c] = !!config_get_int(cat, temp, (c >= 2) ? 0 : 1);
|
2022-01-31 01:43:12 -05:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
/*
|
|
|
|
|
sprintf(temp, "serial%d_device", c + 1);
|
|
|
|
|
p = (char *) config_get_string(cat, temp, "none");
|
|
|
|
|
com_ports[c].device = com_device_get_from_internal_name(p);
|
|
|
|
|
*/
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2021-11-13 17:33:43 -05:00
|
|
|
for (c = 0; c < PARALLEL_MAX; c++) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "lpt%d_enabled", c + 1);
|
|
|
|
|
lpt_ports[c].enabled = !!config_get_int(cat, temp, (c == 0) ? 1 : 0);
|
2018-02-06 19:53:34 +01:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "lpt%d_device", c + 1);
|
|
|
|
|
p = (char *) config_get_string(cat, temp, "none");
|
|
|
|
|
lpt_ports[c].device = lpt_device_get_from_internal_name(p);
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
}
|
2018-02-06 19:53:34 +01:00
|
|
|
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
/* Legacy config compatibility. */
|
|
|
|
|
d = config_get_int(cat, "lpt_enabled", 2);
|
|
|
|
|
if (d < 2) {
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < PARALLEL_MAX; c++)
|
|
|
|
|
lpt_ports[c].enabled = d;
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
}
|
|
|
|
|
config_delete_var(cat, "lpt_enabled");
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
|
|
|
|
|
2020-11-26 18:20:24 +01:00
|
|
|
/* Load "Storage Controllers" section. */
|
2017-09-23 21:12:26 -04:00
|
|
|
static void
|
2020-11-26 18:20:24 +01:00
|
|
|
load_storage_controllers(void)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2020-11-26 18:20:24 +01:00
|
|
|
char *cat = "Storage controllers";
|
2021-07-22 20:13:44 +02:00
|
|
|
char *p, temp[512];
|
2022-07-21 21:44:55 -04:00
|
|
|
int c, min = 0;
|
|
|
|
|
int free_p = 0;
|
2020-11-26 18:20:24 +01:00
|
|
|
|
|
|
|
|
/* TODO: Backwards compatibility, get rid of this when enough time has passed. */
|
|
|
|
|
backwards_compat2 = (find_section(cat) == NULL);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2021-07-22 20:13:44 +02:00
|
|
|
/* TODO: Backwards compatibility, get rid of this when enough time has passed. */
|
2017-10-07 00:46:54 -04:00
|
|
|
p = config_get_string(cat, "scsicard", NULL);
|
2021-07-23 01:20:14 +02:00
|
|
|
if (p != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
scsi_card_current[0] = scsi_card_get_from_internal_name(p);
|
|
|
|
|
min++;
|
2021-07-23 01:20:14 +02:00
|
|
|
}
|
|
|
|
|
config_delete_var(cat, "scsi_card");
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2021-07-23 01:20:14 +02:00
|
|
|
for (c = min; c < SCSI_BUS_MAX; c++) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "scsicard_%d", c + 1);
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, temp, NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
scsi_card_current[c] = scsi_card_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
scsi_card_current[c] = 0;
|
2021-07-22 20:13:44 +02:00
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-06-17 00:32:48 +02:00
|
|
|
p = config_get_string(cat, "fdc", NULL);
|
2020-06-17 14:29:24 +02:00
|
|
|
if (p != NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
fdc_type = fdc_card_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
fdc_type = FDC_INTERNAL;
|
2020-06-16 16:25:23 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
p = config_get_string(cat, "hdc", NULL);
|
|
|
|
|
if (p == NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (machine_has_flags(machine, MACHINE_HDC)) {
|
|
|
|
|
p = (char *) malloc((strlen("internal") + 1) * sizeof(char));
|
|
|
|
|
strcpy(p, "internal");
|
|
|
|
|
} else {
|
|
|
|
|
p = (char *) malloc((strlen("none") + 1) * sizeof(char));
|
|
|
|
|
strcpy(p, "none");
|
|
|
|
|
}
|
|
|
|
|
free_p = 1;
|
2017-10-19 23:55:51 +02:00
|
|
|
}
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
if (!strcmp(p, "mfm_xt"))
|
2022-07-21 21:44:55 -04:00
|
|
|
hdc_current = hdc_get_from_internal_name("st506_xt");
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
else if (!strcmp(p, "mfm_xt_dtc5150x"))
|
2022-07-21 21:44:55 -04:00
|
|
|
hdc_current = hdc_get_from_internal_name("st506_xt_dtc5150x");
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
else if (!strcmp(p, "mfm_at"))
|
2022-07-21 21:44:55 -04:00
|
|
|
hdc_current = hdc_get_from_internal_name("st506_at");
|
2021-05-26 18:13:01 +05:00
|
|
|
else if (!strcmp(p, "vlb_isa"))
|
2022-07-21 21:44:55 -04:00
|
|
|
hdc_current = hdc_get_from_internal_name("ide_vlb");
|
2021-05-26 18:13:01 +05:00
|
|
|
else if (!strcmp(p, "vlb_isa_2ch"))
|
2022-07-21 21:44:55 -04:00
|
|
|
hdc_current = hdc_get_from_internal_name("ide_vlb_2ch");
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
hdc_current = hdc_get_from_internal_name(p);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-01-15 03:04:59 +01:00
|
|
|
if (free_p) {
|
2022-07-21 21:44:55 -04:00
|
|
|
free(p);
|
|
|
|
|
p = NULL;
|
2020-01-15 03:04:59 +01:00
|
|
|
}
|
|
|
|
|
|
2018-04-25 23:51:13 +02:00
|
|
|
ide_ter_enabled = !!config_get_int(cat, "ide_ter", 0);
|
|
|
|
|
ide_qua_enabled = !!config_get_int(cat, "ide_qua", 0);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
2021-12-19 20:00:27 +01:00
|
|
|
/* TODO: Re-enable by default after we actually have a proper machine flag for this. */
|
|
|
|
|
cassette_enable = !!config_get_int(cat, "cassette_enabled", 0);
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, "cassette_file", "");
|
2021-07-27 06:12:09 +02:00
|
|
|
if (strlen(p) > 511)
|
2022-07-21 21:44:55 -04:00
|
|
|
fatal("load_storage_controllers(): strlen(p) > 511\n");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
strncpy(cassette_fname, p, MIN(512, strlen(p) + 1));
|
2021-07-28 00:58:19 +02:00
|
|
|
p = config_get_string(cat, "cassette_mode", "");
|
|
|
|
|
if (strlen(p) > 511)
|
2022-07-21 21:44:55 -04:00
|
|
|
fatal("load_storage_controllers(): strlen(p) > 511\n");
|
2021-07-28 00:58:19 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
strncpy(cassette_mode, p, MIN(512, strlen(p) + 1));
|
|
|
|
|
cassette_pos = config_get_int(cat, "cassette_position", 0);
|
|
|
|
|
cassette_srate = config_get_int(cat, "cassette_srate", 44100);
|
|
|
|
|
cassette_append = !!config_get_int(cat, "cassette_append", 0);
|
|
|
|
|
cassette_pcm = config_get_int(cat, "cassette_pcm", 0);
|
2021-07-28 00:58:19 +02:00
|
|
|
cassette_ui_writeprot = !!config_get_int(cat, "cassette_writeprot", 0);
|
2021-07-29 20:34:55 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < 2; c++) {
|
|
|
|
|
sprintf(temp, "cartridge_%02i_fn", c + 1);
|
|
|
|
|
p = config_get_string(cat, temp, "");
|
2021-07-29 20:34:55 +02:00
|
|
|
|
|
|
|
|
#if 0
|
2022-07-21 21:44:55 -04:00
|
|
|
/*
|
|
|
|
|
* NOTE:
|
|
|
|
|
* Temporary hack to remove the absolute
|
|
|
|
|
* path currently saved in most config
|
|
|
|
|
* files. We should remove this before
|
|
|
|
|
* finalizing this release! --FvK
|
|
|
|
|
*/
|
|
|
|
|
if (! wcsnicmp(wp, usr_path, wcslen(usr_path))) {
|
|
|
|
|
/*
|
|
|
|
|
* Yep, its absolute and prefixed
|
|
|
|
|
* with the EXE path. Just strip
|
|
|
|
|
* that off for now...
|
|
|
|
|
*/
|
|
|
|
|
wcsncpy(floppyfns[c], &wp[wcslen(usr_path)], sizeof_w(cart_fns[c]));
|
|
|
|
|
} else
|
2021-07-29 20:34:55 +02:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
if (strlen(p) > 511)
|
|
|
|
|
fatal("load_storage_controllers(): strlen(p) > 511\n");
|
|
|
|
|
else
|
|
|
|
|
strncpy(cart_fns[c], p, strlen(p) + 1);
|
2021-07-29 20:34:55 +02:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
/* Load "Hard Disks" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_hard_disks(void)
|
2017-09-30 16:56:38 -04:00
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
char *cat = "Hard disks";
|
|
|
|
|
char temp[512], tmp2[512];
|
|
|
|
|
char s[512];
|
|
|
|
|
int c;
|
|
|
|
|
char *p;
|
2018-04-25 23:51:13 +02:00
|
|
|
uint32_t max_spt, max_hpc, max_tracks;
|
|
|
|
|
uint32_t board = 0, dev = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
memset(temp, '\0', sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < HDD_NUM; c++) {
|
|
|
|
|
sprintf(temp, "hdd_%02i_parameters", c + 1);
|
|
|
|
|
p = config_get_string(cat, temp, "0, 0, 0, 0, none");
|
|
|
|
|
sscanf(p, "%u, %u, %u, %i, %s",
|
|
|
|
|
&hdd[c].spt, &hdd[c].hpc, &hdd[c].tracks, (int *) &hdd[c].wp, s);
|
|
|
|
|
|
|
|
|
|
hdd[c].bus = hdd_string_to_bus(s, 0);
|
|
|
|
|
switch (hdd[c].bus) {
|
|
|
|
|
case HDD_BUS_DISABLED:
|
|
|
|
|
default:
|
|
|
|
|
max_spt = max_hpc = max_tracks = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HDD_BUS_MFM:
|
|
|
|
|
max_spt = 26; /* 26 for RLL */
|
|
|
|
|
max_hpc = 15;
|
|
|
|
|
max_tracks = 2047;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HDD_BUS_XTA:
|
|
|
|
|
max_spt = 63;
|
|
|
|
|
max_hpc = 16;
|
|
|
|
|
max_tracks = 1023;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HDD_BUS_ESDI:
|
|
|
|
|
max_spt = 99;
|
|
|
|
|
max_hpc = 16;
|
|
|
|
|
max_tracks = 266305;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HDD_BUS_IDE:
|
|
|
|
|
max_spt = 63;
|
|
|
|
|
max_hpc = 16;
|
|
|
|
|
max_tracks = 266305;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case HDD_BUS_SCSI:
|
|
|
|
|
max_spt = 99;
|
|
|
|
|
max_hpc = 255;
|
|
|
|
|
max_tracks = 266305;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hdd[c].spt > max_spt)
|
|
|
|
|
hdd[c].spt = max_spt;
|
|
|
|
|
if (hdd[c].hpc > max_hpc)
|
|
|
|
|
hdd[c].hpc = max_hpc;
|
|
|
|
|
if (hdd[c].tracks > max_tracks)
|
|
|
|
|
hdd[c].tracks = max_tracks;
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_speed", c + 1);
|
|
|
|
|
switch (hdd[c].bus) {
|
|
|
|
|
case HDD_BUS_IDE:
|
|
|
|
|
sprintf(tmp2, "1997_5400rpm");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
sprintf(tmp2, "ramdisk");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
hdd[c].speed_preset = hdd_preset_get_from_internal_name(p);
|
|
|
|
|
|
|
|
|
|
/* MFM/RLL */
|
|
|
|
|
sprintf(temp, "hdd_%02i_mfm_channel", c + 1);
|
|
|
|
|
if (hdd[c].bus == HDD_BUS_MFM)
|
|
|
|
|
hdd[c].mfm_channel = !!config_get_int(cat, temp, c & 1);
|
|
|
|
|
else
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
/* XTA */
|
|
|
|
|
sprintf(temp, "hdd_%02i_xta_channel", c + 1);
|
|
|
|
|
if (hdd[c].bus == HDD_BUS_XTA)
|
|
|
|
|
hdd[c].xta_channel = !!config_get_int(cat, temp, c & 1);
|
|
|
|
|
else
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
/* ESDI */
|
|
|
|
|
sprintf(temp, "hdd_%02i_esdi_channel", c + 1);
|
|
|
|
|
if (hdd[c].bus == HDD_BUS_ESDI)
|
|
|
|
|
hdd[c].esdi_channel = !!config_get_int(cat, temp, c & 1);
|
|
|
|
|
else
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
/* IDE */
|
|
|
|
|
sprintf(temp, "hdd_%02i_ide_channel", c + 1);
|
|
|
|
|
if (hdd[c].bus == HDD_BUS_IDE) {
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", c >> 1, c & 1);
|
|
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%01u", &board, &dev);
|
|
|
|
|
board &= 3;
|
|
|
|
|
dev &= 1;
|
|
|
|
|
hdd[c].ide_channel = (board << 1) + dev;
|
|
|
|
|
|
|
|
|
|
if (hdd[c].ide_channel > 7)
|
|
|
|
|
hdd[c].ide_channel = 7;
|
|
|
|
|
} else {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* SCSI */
|
|
|
|
|
if (hdd[c].bus == HDD_BUS_SCSI) {
|
|
|
|
|
sprintf(temp, "hdd_%02i_scsi_location", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
|
|
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%02u", &board, &dev);
|
|
|
|
|
if (board >= SCSI_BUS_MAX) {
|
|
|
|
|
/* Invalid bus - check legacy ID */
|
|
|
|
|
sprintf(temp, "hdd_%02i_scsi_id", c + 1);
|
|
|
|
|
hdd[c].scsi_id = config_get_int(cat, temp, c + 2);
|
|
|
|
|
|
|
|
|
|
if (hdd[c].scsi_id > 15)
|
|
|
|
|
hdd[c].scsi_id = 15;
|
|
|
|
|
} else {
|
|
|
|
|
board %= SCSI_BUS_MAX;
|
|
|
|
|
dev &= 15;
|
|
|
|
|
hdd[c].scsi_id = (board << 4) + dev;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(temp, "hdd_%02i_scsi_location", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_scsi_id", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
memset(hdd[c].fn, 0x00, sizeof(hdd[c].fn));
|
|
|
|
|
memset(hdd[c].prev_fn, 0x00, sizeof(hdd[c].prev_fn));
|
|
|
|
|
sprintf(temp, "hdd_%02i_fn", c + 1);
|
|
|
|
|
p = config_get_string(cat, temp, "");
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-09-30 16:56:38 -04:00
|
|
|
#if 0
|
2022-07-21 21:44:55 -04:00
|
|
|
/*
|
|
|
|
|
* NOTE:
|
|
|
|
|
* Temporary hack to remove the absolute
|
|
|
|
|
* path currently saved in most config
|
|
|
|
|
* files. We should remove this before
|
|
|
|
|
* finalizing this release! --FvK
|
|
|
|
|
*/
|
|
|
|
|
/*
|
|
|
|
|
* ANOTHER NOTE:
|
|
|
|
|
* When loading differencing VHDs, the absolute path is required.
|
|
|
|
|
* So we should not convert absolute paths to relative. -sards
|
|
|
|
|
*/
|
|
|
|
|
if (! wcsnicmp(wp, usr_path, wcslen(usr_path))) {
|
|
|
|
|
/*
|
|
|
|
|
* Yep, its absolute and prefixed
|
|
|
|
|
* with the CFG path. Just strip
|
|
|
|
|
* that off for now...
|
|
|
|
|
*/
|
|
|
|
|
wcsncpy(hdd[c].fn, &wp[wcslen(usr_path)], sizeof_w(hdd[c].fn));
|
|
|
|
|
} else
|
2017-09-23 21:12:26 -04:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
if (path_abs(p)) {
|
|
|
|
|
strncpy(hdd[c].fn, p, sizeof(hdd[c].fn) - 1);
|
|
|
|
|
} else {
|
|
|
|
|
path_append_filename(hdd[c].fn, usr_path, p);
|
|
|
|
|
}
|
|
|
|
|
path_normalize(hdd[c].fn);
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
/* If disk is empty or invalid, mark it for deletion. */
|
|
|
|
|
if (!hdd_is_valid(c)) {
|
|
|
|
|
sprintf(temp, "hdd_%02i_parameters", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "hdd_%02i_preide_channels", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "hdd_%02i_ide_channels", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "hdd_%02i_scsi_id", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2018-07-15 01:41:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "hdd_%02i_fn", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "hdd_%02i_mfm_channel", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "hdd_%02i_ide_channel", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
|
|
|
|
|
2020-07-19 06:07:58 +02:00
|
|
|
/* TODO: Backwards compatibility, get rid of this when enough time has passed. */
|
2018-01-26 22:17:09 +01:00
|
|
|
/* Load "Floppy Drives" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_floppy_drives(void)
|
|
|
|
|
{
|
|
|
|
|
char *cat = "Floppy drives";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512], *p;
|
|
|
|
|
int c;
|
2018-01-26 22:17:09 +01:00
|
|
|
|
2020-07-19 06:07:58 +02:00
|
|
|
if (!backwards_compat)
|
2022-07-21 20:50:05 -04:00
|
|
|
return;
|
2020-07-19 06:07:58 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < FDD_NUM; c++) {
|
|
|
|
|
sprintf(temp, "fdd_%02i_type", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, (c < 2) ? "525_2dd" : "none");
|
|
|
|
|
fdd_set_type(c, fdd_get_from_internal_name(p));
|
|
|
|
|
if (fdd_get_type(c) > 13)
|
|
|
|
|
fdd_set_type(c, 13);
|
|
|
|
|
config_delete_var(cat, temp);
|
2020-07-19 06:07:58 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(temp, "fdd_%02i_fn", c + 1);
|
|
|
|
|
p = config_get_string(cat, temp, "");
|
|
|
|
|
config_delete_var(cat, temp);
|
2020-07-19 06:07:58 +02:00
|
|
|
|
|
|
|
|
#if 0
|
2022-07-21 20:50:05 -04:00
|
|
|
/*
|
|
|
|
|
* NOTE:
|
|
|
|
|
* Temporary hack to remove the absolute
|
|
|
|
|
* path currently saved in most config
|
|
|
|
|
* files. We should remove this before
|
|
|
|
|
* finalizing this release! --FvK
|
|
|
|
|
*/
|
|
|
|
|
if (! wcsnicmp(wp, usr_path, wcslen(usr_path))) {
|
|
|
|
|
/*
|
|
|
|
|
* Yep, its absolute and prefixed
|
|
|
|
|
* with the EXE path. Just strip
|
|
|
|
|
* that off for now...
|
|
|
|
|
*/
|
|
|
|
|
wcsncpy(floppyfns[c], &wp[wcslen(usr_path)], sizeof_w(floppyfns[c]));
|
|
|
|
|
} else
|
2020-07-19 06:07:58 +02:00
|
|
|
#endif
|
2022-07-21 20:50:05 -04:00
|
|
|
if (strlen(p) > 511)
|
|
|
|
|
fatal("load_floppy_drives(): strlen(p) > 511\n");
|
|
|
|
|
else
|
|
|
|
|
strncpy(floppyfns[c], p, strlen(p) + 1);
|
|
|
|
|
|
|
|
|
|
/* if (*wp != L'\0')
|
|
|
|
|
config_log("Floppy%d: %ls\n", c, floppyfns[c]); */
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_writeprot", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
ui_writeprot[c] = !!config_get_int(cat, temp, 0);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
sprintf(temp, "fdd_%02i_turbo", c + 1);
|
|
|
|
|
fdd_set_turbo(c, !!config_get_int(cat, temp, 0));
|
|
|
|
|
config_delete_var(cat, temp);
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_check_bpb", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
fdd_set_check_bpb(c, !!config_get_int(cat, temp, 1));
|
|
|
|
|
config_delete_var(cat, temp);
|
2020-07-19 06:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete_section_if_empty(cat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Load "Floppy and CD-ROM Drives" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_floppy_and_cdrom_drives(void)
|
|
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
char *cat = "Floppy and CD-ROM drives";
|
|
|
|
|
char temp[512], tmp2[512], *p;
|
|
|
|
|
char s[512];
|
2020-07-19 06:07:58 +02:00
|
|
|
unsigned int board = 0, dev = 0;
|
2022-07-21 21:44:55 -04:00
|
|
|
int c, d = 0;
|
2020-07-19 06:07:58 +02:00
|
|
|
|
|
|
|
|
/* TODO: Backwards compatibility, get rid of this when enough time has passed. */
|
|
|
|
|
backwards_compat = (find_section(cat) == NULL);
|
|
|
|
|
|
|
|
|
|
memset(temp, 0x00, sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < FDD_NUM; c++) {
|
|
|
|
|
sprintf(temp, "fdd_%02i_type", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, (c < 2) ? "525_2dd" : "none");
|
|
|
|
|
fdd_set_type(c, fdd_get_from_internal_name(p));
|
|
|
|
|
if (fdd_get_type(c) > 13)
|
|
|
|
|
fdd_set_type(c, 13);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(temp, "fdd_%02i_fn", c + 1);
|
|
|
|
|
p = config_get_string(cat, temp, "");
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
#if 0
|
2022-07-21 20:50:05 -04:00
|
|
|
/*
|
|
|
|
|
* NOTE:
|
|
|
|
|
* Temporary hack to remove the absolute
|
|
|
|
|
* path currently saved in most config
|
|
|
|
|
* files. We should remove this before
|
|
|
|
|
* finalizing this release! --FvK
|
|
|
|
|
*/
|
|
|
|
|
if (! wcsnicmp(wp, usr_path, wcslen(usr_path))) {
|
|
|
|
|
/*
|
|
|
|
|
* Yep, its absolute and prefixed
|
|
|
|
|
* with the EXE path. Just strip
|
|
|
|
|
* that off for now...
|
|
|
|
|
*/
|
|
|
|
|
wcsncpy(floppyfns[c], &wp[wcslen(usr_path)], sizeof_w(floppyfns[c]));
|
|
|
|
|
} else
|
2017-09-23 21:12:26 -04:00
|
|
|
#endif
|
2022-07-21 20:50:05 -04:00
|
|
|
if (strlen(p) > 511)
|
|
|
|
|
fatal("load_floppy_and_cdrom_drives(): strlen(p) > 511\n");
|
|
|
|
|
else
|
|
|
|
|
strncpy(floppyfns[c], p, strlen(p) + 1);
|
|
|
|
|
|
|
|
|
|
/* if (*wp != L'\0')
|
|
|
|
|
config_log("Floppy%d: %ls\n", c, floppyfns[c]); */
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_writeprot", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
ui_writeprot[c] = !!config_get_int(cat, temp, 0);
|
|
|
|
|
sprintf(temp, "fdd_%02i_turbo", c + 1);
|
|
|
|
|
fdd_set_turbo(c, !!config_get_int(cat, temp, 0));
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_check_bpb", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
fdd_set_check_bpb(c, !!config_get_int(cat, temp, 1));
|
|
|
|
|
|
|
|
|
|
/* Check whether each value is default, if yes, delete it so that only non-default values will later be saved. */
|
|
|
|
|
if (fdd_get_type(c) == ((c < 2) ? 2 : 0)) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_type", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
if (strlen(floppyfns[c]) == 0) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_fn", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
if (ui_writeprot[c] == 0) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_writeprot", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
if (fdd_get_turbo(c) == 0) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_turbo", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
if (fdd_get_check_bpb(c) == 1) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "fdd_%02i_check_bpb", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset(temp, 0x00, sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < CDROM_NUM; c++) {
|
|
|
|
|
sprintf(temp, "cdrom_%02i_host_drive", c + 1);
|
|
|
|
|
cdrom[c].host_drive = config_get_int(cat, temp, 0);
|
2022-07-21 20:50:05 -04:00
|
|
|
cdrom[c].prev_host_drive = cdrom[c].host_drive;
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_parameters", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
sscanf(p, "%01u, %s", &d, s);
|
|
|
|
|
else if (c == 0)
|
|
|
|
|
/* If this is the first drive, unmute the audio. */
|
|
|
|
|
sscanf("1, none", "%01u, %s", &d, s);
|
|
|
|
|
else
|
|
|
|
|
sscanf("0, none", "%01u, %s", &d, s);
|
|
|
|
|
cdrom[c].sound_on = d;
|
|
|
|
|
cdrom[c].bus_type = hdd_string_to_bus(s, 1);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_speed", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
cdrom[c].speed = config_get_int(cat, temp, 8);
|
|
|
|
|
|
|
|
|
|
/* Default values, needed for proper operation of the Settings dialog. */
|
|
|
|
|
cdrom[c].ide_channel = cdrom[c].scsi_device_id = c + 2;
|
|
|
|
|
|
|
|
|
|
if (cdrom[c].bus_type == CDROM_BUS_ATAPI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_ide_channel", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%01u", &board, &dev);
|
|
|
|
|
board &= 3;
|
|
|
|
|
dev &= 1;
|
2022-07-21 21:44:55 -04:00
|
|
|
cdrom[c].ide_channel = (board << 1) + dev;
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (cdrom[c].ide_channel > 7)
|
|
|
|
|
cdrom[c].ide_channel = 7;
|
|
|
|
|
} else if (cdrom[c].bus_type == CDROM_BUS_SCSI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_scsi_location", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%02u", &board, &dev);
|
|
|
|
|
if (board >= SCSI_BUS_MAX) {
|
|
|
|
|
/* Invalid bus - check legacy ID */
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_scsi_id", c + 1);
|
|
|
|
|
cdrom[c].scsi_device_id = config_get_int(cat, temp, c + 2);
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (cdrom[c].scsi_device_id > 15)
|
|
|
|
|
cdrom[c].scsi_device_id = 15;
|
|
|
|
|
} else {
|
|
|
|
|
board %= SCSI_BUS_MAX;
|
|
|
|
|
dev &= 15;
|
2022-07-21 21:44:55 -04:00
|
|
|
cdrom[c].scsi_device_id = (board << 4) + dev;
|
2022-07-21 20:50:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (cdrom[c].bus_type != CDROM_BUS_ATAPI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_ide_channel", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (cdrom[c].bus_type != CDROM_BUS_SCSI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_scsi_location", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_scsi_id", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_image_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, "");
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
#if 0
|
2022-07-21 20:50:05 -04:00
|
|
|
/*
|
|
|
|
|
* NOTE:
|
|
|
|
|
* Temporary hack to remove the absolute
|
|
|
|
|
* path currently saved in most config
|
|
|
|
|
* files. We should remove this before
|
|
|
|
|
* finalizing this release! --FvK
|
|
|
|
|
*/
|
|
|
|
|
if (! wcsnicmp(wp, usr_path, wcslen(usr_path))) {
|
|
|
|
|
/*
|
|
|
|
|
* Yep, its absolute and prefixed
|
|
|
|
|
* with the EXE path. Just strip
|
|
|
|
|
* that off for now...
|
|
|
|
|
*/
|
|
|
|
|
wcsncpy(cdrom[c].image_path, &wp[wcslen(usr_path)], sizeof_w(cdrom[c].image_path));
|
|
|
|
|
} else
|
2017-09-23 21:12:26 -04:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
strncpy(cdrom[c].image_path, p, sizeof(cdrom[c].image_path) - 1);
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (cdrom[c].host_drive && (cdrom[c].host_drive != 200))
|
|
|
|
|
cdrom[c].host_drive = 0;
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
if ((cdrom[c].host_drive == 0x200) && (strlen(cdrom[c].image_path) == 0))
|
|
|
|
|
cdrom[c].host_drive = 0;
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
/* If the CD-ROM is disabled, delete all its variables. */
|
|
|
|
|
if (cdrom[c].bus_type == CDROM_BUS_DISABLED) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_host_drive", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_parameters", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_ide_channel", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_scsi_id", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2018-07-15 01:41:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_image_path", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
2022-07-21 20:50:05 -04:00
|
|
|
}
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_iso_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2020-07-19 06:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Load "Other Removable Devices" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_other_removable_devices(void)
|
|
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
char *cat = "Other removable devices";
|
|
|
|
|
char temp[512], tmp2[512], *p;
|
|
|
|
|
char s[512];
|
2020-07-19 06:07:58 +02:00
|
|
|
unsigned int board = 0, dev = 0;
|
2022-07-21 21:44:55 -04:00
|
|
|
int c, d = 0;
|
2020-07-19 06:07:58 +02:00
|
|
|
|
|
|
|
|
/* TODO: Backwards compatibility, get rid of this when enough time has passed. */
|
|
|
|
|
if (backwards_compat) {
|
2022-07-21 20:50:05 -04:00
|
|
|
memset(temp, 0x00, sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < CDROM_NUM; c++) {
|
|
|
|
|
sprintf(temp, "cdrom_%02i_host_drive", c + 1);
|
|
|
|
|
cdrom[c].host_drive = config_get_int(cat, temp, 0);
|
2022-07-21 20:50:05 -04:00
|
|
|
cdrom[c].prev_host_drive = cdrom[c].host_drive;
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_parameters", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
sscanf(p, "%01u, %s", &d, s);
|
|
|
|
|
else
|
|
|
|
|
sscanf("0, none", "%01u, %s", &d, s);
|
|
|
|
|
cdrom[c].sound_on = d;
|
|
|
|
|
cdrom[c].bus_type = hdd_string_to_bus(s, 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_speed", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
cdrom[c].speed = config_get_int(cat, temp, 8);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
/* Default values, needed for proper operation of the Settings dialog. */
|
|
|
|
|
cdrom[c].ide_channel = cdrom[c].scsi_device_id = c + 2;
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
if (cdrom[c].bus_type == CDROM_BUS_ATAPI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_ide_channel", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%01u", &board, &dev);
|
|
|
|
|
board &= 3;
|
|
|
|
|
dev &= 1;
|
2022-07-21 21:44:55 -04:00
|
|
|
cdrom[c].ide_channel = (board << 1) + dev;
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (cdrom[c].ide_channel > 7)
|
|
|
|
|
cdrom[c].ide_channel = 7;
|
|
|
|
|
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else if (cdrom[c].bus_type == CDROM_BUS_SCSI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_scsi_id", c + 1);
|
|
|
|
|
cdrom[c].scsi_device_id = config_get_int(cat, temp, c + 2);
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (cdrom[c].scsi_device_id > 15)
|
|
|
|
|
cdrom[c].scsi_device_id = 15;
|
|
|
|
|
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "cdrom_%02i_image_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, "");
|
|
|
|
|
config_delete_var(cat, temp);
|
2020-07-19 06:07:58 +02:00
|
|
|
|
|
|
|
|
#if 0
|
2022-07-21 20:50:05 -04:00
|
|
|
/*
|
|
|
|
|
* NOTE:
|
|
|
|
|
* Temporary hack to remove the absolute
|
|
|
|
|
* path currently saved in most config
|
|
|
|
|
* files. We should remove this before
|
|
|
|
|
* finalizing this release! --FvK
|
|
|
|
|
*/
|
|
|
|
|
if (! wcsnicmp(wp, usr_path, wcslen(usr_path))) {
|
|
|
|
|
/*
|
|
|
|
|
* Yep, its absolute and prefixed
|
|
|
|
|
* with the EXE path. Just strip
|
|
|
|
|
* that off for now...
|
|
|
|
|
*/
|
|
|
|
|
wcsncpy(cdrom[c].image_path, &wp[wcslen(usr_path)], sizeof_w(cdrom[c].image_path));
|
|
|
|
|
} else
|
2020-07-19 06:07:58 +02:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
strncpy(cdrom[c].image_path, p, sizeof(cdrom[c].image_path) - 1);
|
2020-07-19 06:07:58 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (cdrom[c].host_drive && (cdrom[c].host_drive != 200))
|
|
|
|
|
cdrom[c].host_drive = 0;
|
2020-07-19 06:07:58 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
if ((cdrom[c].host_drive == 0x200) && (strlen(cdrom[c].image_path) == 0))
|
2022-07-21 20:50:05 -04:00
|
|
|
cdrom[c].host_drive = 0;
|
|
|
|
|
}
|
2020-07-19 06:07:58 +02:00
|
|
|
}
|
|
|
|
|
backwards_compat = 0;
|
2018-01-26 22:17:09 +01:00
|
|
|
|
|
|
|
|
memset(temp, 0x00, sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < ZIP_NUM; c++) {
|
|
|
|
|
sprintf(temp, "zip_%02i_parameters", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
sscanf(p, "%01u, %s", &zip_drives[c].is_250, s);
|
|
|
|
|
else
|
|
|
|
|
sscanf("0, none", "%01u, %s", &zip_drives[c].is_250, s);
|
|
|
|
|
zip_drives[c].bus_type = hdd_string_to_bus(s, 1);
|
|
|
|
|
|
|
|
|
|
/* Default values, needed for proper operation of the Settings dialog. */
|
|
|
|
|
zip_drives[c].ide_channel = zip_drives[c].scsi_device_id = c + 2;
|
|
|
|
|
|
|
|
|
|
if (zip_drives[c].bus_type == ZIP_BUS_ATAPI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%01u", &board, &dev);
|
|
|
|
|
board &= 3;
|
|
|
|
|
dev &= 1;
|
2022-07-21 21:44:55 -04:00
|
|
|
zip_drives[c].ide_channel = (board << 1) + dev;
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (zip_drives[c].ide_channel > 7)
|
|
|
|
|
zip_drives[c].ide_channel = 7;
|
|
|
|
|
} else if (zip_drives[c].bus_type == ZIP_BUS_SCSI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%02u", &board, &dev);
|
|
|
|
|
if (board >= SCSI_BUS_MAX) {
|
|
|
|
|
/* Invalid bus - check legacy ID */
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_scsi_id", c + 1);
|
|
|
|
|
zip_drives[c].scsi_device_id = config_get_int(cat, temp, c + 2);
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (zip_drives[c].scsi_device_id > 15)
|
|
|
|
|
zip_drives[c].scsi_device_id = 15;
|
|
|
|
|
} else {
|
|
|
|
|
board %= SCSI_BUS_MAX;
|
|
|
|
|
dev &= 15;
|
2022-07-21 21:44:55 -04:00
|
|
|
zip_drives[c].scsi_device_id = (board << 4) + dev;
|
2022-07-21 20:50:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
2018-01-26 22:17:09 +01:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (zip_drives[c].bus_type != ZIP_BUS_ATAPI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (zip_drives[c].bus_type != ZIP_BUS_SCSI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_scsi_id", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_image_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, "");
|
2018-01-26 22:17:09 +01:00
|
|
|
|
|
|
|
|
#if 0
|
2022-07-21 20:50:05 -04:00
|
|
|
/*
|
|
|
|
|
* NOTE:
|
|
|
|
|
* Temporary hack to remove the absolute
|
|
|
|
|
* path currently saved in most config
|
|
|
|
|
* files. We should remove this before
|
|
|
|
|
* finalizing this release! --FvK
|
|
|
|
|
*/
|
|
|
|
|
if (! wcsnicmp(wp, usr_path, wcslen(usr_path))) {
|
|
|
|
|
/*
|
|
|
|
|
* Yep, its absolute and prefixed
|
|
|
|
|
* with the EXE path. Just strip
|
|
|
|
|
* that off for now...
|
|
|
|
|
*/
|
|
|
|
|
wcsncpy(zip_drives[c].image_path, &wp[wcslen(usr_path)], sizeof_w(zip_drives[c].image_path));
|
|
|
|
|
} else
|
2018-01-26 22:17:09 +01:00
|
|
|
#endif
|
2022-07-21 21:44:55 -04:00
|
|
|
strncpy(zip_drives[c].image_path, p, sizeof(zip_drives[c].image_path) - 1);
|
2018-01-26 22:17:09 +01:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
/* If the CD-ROM is disabled, delete all its variables. */
|
|
|
|
|
if (zip_drives[c].bus_type == ZIP_BUS_DISABLED) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_host_drive", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2018-01-26 22:17:09 +01:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_parameters", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2018-01-26 22:17:09 +01:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2018-01-26 22:17:09 +01:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_scsi_id", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2018-07-15 01:41:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_image_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2018-01-26 22:17:09 +01:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "zip_%02i_iso_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2018-01-26 22:17:09 +01:00
|
|
|
}
|
2020-04-01 19:04:53 +02:00
|
|
|
|
|
|
|
|
memset(temp, 0x00, sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < MO_NUM; c++) {
|
|
|
|
|
sprintf(temp, "mo_%02i_parameters", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
sscanf(p, "%u, %s", &mo_drives[c].type, s);
|
|
|
|
|
else
|
|
|
|
|
sscanf("00, none", "%u, %s", &mo_drives[c].type, s);
|
|
|
|
|
mo_drives[c].bus_type = hdd_string_to_bus(s, 1);
|
|
|
|
|
|
|
|
|
|
/* Default values, needed for proper operation of the Settings dialog. */
|
|
|
|
|
mo_drives[c].ide_channel = mo_drives[c].scsi_device_id = c + 2;
|
|
|
|
|
|
|
|
|
|
if (mo_drives[c].bus_type == MO_BUS_ATAPI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_ide_channel", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%01u", &board, &dev);
|
|
|
|
|
board &= 3;
|
|
|
|
|
dev &= 1;
|
2022-07-21 21:44:55 -04:00
|
|
|
mo_drives[c].ide_channel = (board << 1) + dev;
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (mo_drives[c].ide_channel > 7)
|
|
|
|
|
mo_drives[c].ide_channel = 7;
|
|
|
|
|
} else if (mo_drives[c].bus_type == MO_BUS_SCSI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_scsi_location", c + 1);
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, tmp2);
|
|
|
|
|
sscanf(p, "%01u:%02u", &board, &dev);
|
|
|
|
|
if (board >= SCSI_BUS_MAX) {
|
|
|
|
|
/* Invalid bus - check legacy ID */
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_scsi_id", c + 1);
|
|
|
|
|
mo_drives[c].scsi_device_id = config_get_int(cat, temp, c + 2);
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
if (mo_drives[c].scsi_device_id > 15)
|
|
|
|
|
mo_drives[c].scsi_device_id = 15;
|
|
|
|
|
} else {
|
|
|
|
|
board %= SCSI_BUS_MAX;
|
|
|
|
|
dev &= 15;
|
2022-07-21 21:44:55 -04:00
|
|
|
mo_drives[c].scsi_device_id = (board << 4) + dev;
|
2022-07-21 20:50:05 -04:00
|
|
|
}
|
|
|
|
|
}
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (mo_drives[c].bus_type != MO_BUS_ATAPI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_ide_channel", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2020-04-01 19:04:53 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
if (mo_drives[c].bus_type != MO_BUS_SCSI) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_scsi_location", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_scsi_id", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_image_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, temp, "");
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
strncpy(mo_drives[c].image_path, p, sizeof(mo_drives[c].image_path) - 1);
|
2020-04-01 19:04:53 +02:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
/* If the CD-ROM is disabled, delete all its variables. */
|
|
|
|
|
if (mo_drives[c].bus_type == MO_BUS_DISABLED) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_host_drive", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2020-04-01 19:04:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_parameters", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2020-04-01 19:04:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_ide_channel", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2020-04-01 19:04:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_scsi_id", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2020-04-01 19:04:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_image_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
2020-04-01 19:04:53 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "mo_%02i_iso_path", c + 1);
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, temp);
|
2022-02-20 02:26:27 -05:00
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2020-11-26 18:20:24 +01:00
|
|
|
/* Load "Other Peripherals" section. */
|
|
|
|
|
static void
|
|
|
|
|
load_other_peripherals(void)
|
|
|
|
|
{
|
|
|
|
|
char *cat = "Other peripherals";
|
|
|
|
|
char *p;
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
|
|
|
|
int c, free_p = 0;
|
2020-11-26 18:20:24 +01:00
|
|
|
|
2022-02-20 02:26:27 -05:00
|
|
|
if (backwards_compat2) {
|
2022-07-21 20:50:05 -04:00
|
|
|
p = config_get_string(cat, "scsicard", NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
scsi_card_current[0] = scsi_card_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
scsi_card_current[0] = 0;
|
|
|
|
|
config_delete_var(cat, "scsicard");
|
|
|
|
|
|
|
|
|
|
p = config_get_string(cat, "fdc", NULL);
|
|
|
|
|
if (p != NULL)
|
|
|
|
|
fdc_type = fdc_card_get_from_internal_name(p);
|
|
|
|
|
else
|
|
|
|
|
fdc_type = FDC_INTERNAL;
|
|
|
|
|
config_delete_var(cat, "fdc");
|
|
|
|
|
|
|
|
|
|
p = config_get_string(cat, "hdc", NULL);
|
|
|
|
|
if (p == NULL) {
|
|
|
|
|
if (machine_has_flags(machine, MACHINE_HDC)) {
|
2022-07-21 21:44:55 -04:00
|
|
|
p = (char *) malloc((strlen("internal") + 1) * sizeof(char));
|
2022-07-21 20:50:05 -04:00
|
|
|
strcpy(p, "internal");
|
|
|
|
|
} else {
|
2022-07-21 21:44:55 -04:00
|
|
|
p = (char *) malloc((strlen("none") + 1) * sizeof(char));
|
2022-07-21 20:50:05 -04:00
|
|
|
strcpy(p, "none");
|
|
|
|
|
}
|
|
|
|
|
free_p = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!strcmp(p, "mfm_xt"))
|
|
|
|
|
hdc_current = hdc_get_from_internal_name("st506_xt");
|
|
|
|
|
else if (!strcmp(p, "mfm_xt_dtc5150x"))
|
|
|
|
|
hdc_current = hdc_get_from_internal_name("st506_xt_dtc5150x");
|
|
|
|
|
else if (!strcmp(p, "mfm_at"))
|
|
|
|
|
hdc_current = hdc_get_from_internal_name("st506_at");
|
|
|
|
|
else if (!strcmp(p, "vlb_isa"))
|
|
|
|
|
hdc_current = hdc_get_from_internal_name("ide_vlb");
|
|
|
|
|
else if (!strcmp(p, "vlb_isa_2ch"))
|
|
|
|
|
hdc_current = hdc_get_from_internal_name("ide_vlb_2ch");
|
|
|
|
|
else
|
|
|
|
|
hdc_current = hdc_get_from_internal_name(p);
|
|
|
|
|
config_delete_var(cat, "hdc");
|
|
|
|
|
|
|
|
|
|
if (free_p) {
|
|
|
|
|
free(p);
|
|
|
|
|
p = NULL;
|
|
|
|
|
}
|
2020-11-26 18:20:24 +01:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
ide_ter_enabled = !!config_get_int(cat, "ide_ter", 0);
|
|
|
|
|
config_delete_var(cat, "ide_ter");
|
|
|
|
|
ide_qua_enabled = !!config_get_int(cat, "ide_qua", 0);
|
|
|
|
|
config_delete_var(cat, "ide_qua");
|
2020-11-26 18:20:24 +01:00
|
|
|
}
|
|
|
|
|
backwards_compat2 = 0;
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
bugger_enabled = !!config_get_int(cat, "bugger_enabled", 0);
|
2020-11-26 18:20:24 +01:00
|
|
|
postcard_enabled = !!config_get_int(cat, "postcard_enabled", 0);
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < ISAMEM_MAX; c++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(temp, "isamem%d_type", c);
|
2020-11-26 18:20:24 +01:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, temp, "none");
|
2022-07-21 20:50:05 -04:00
|
|
|
isamem_type[c] = isamem_get_from_internal_name(p);
|
2020-11-26 18:20:24 +01:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
p = config_get_string(cat, "isartc_type", "none");
|
2022-02-20 02:26:27 -05:00
|
|
|
isartc_type = isartc_get_from_internal_name(p);
|
2020-11-26 18:20:24 +01:00
|
|
|
}
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
/* Load the specified or a default configuration file. */
|
|
|
|
|
void
|
2017-12-04 11:59:26 -05:00
|
|
|
config_load(void)
|
2017-10-07 00:46:54 -04:00
|
|
|
{
|
2018-04-25 23:51:13 +02:00
|
|
|
int i;
|
|
|
|
|
|
2021-03-14 20:35:01 +01:00
|
|
|
config_log("Loading config file '%s'..\n", cfg_path);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2018-04-25 23:51:13 +02:00
|
|
|
memset(hdd, 0, sizeof(hard_disk_t));
|
2018-10-17 05:29:48 +02:00
|
|
|
memset(cdrom, 0, sizeof(cdrom_t) * CDROM_NUM);
|
2018-04-25 23:51:13 +02:00
|
|
|
#ifdef USE_IOCTL
|
|
|
|
|
memset(cdrom_ioctl, 0, sizeof(cdrom_ioctl_t) * CDROM_NUM);
|
|
|
|
|
#endif
|
|
|
|
|
memset(zip_drives, 0, sizeof(zip_drive_t));
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!config_read(cfg_path)) {
|
2022-07-21 20:50:05 -04:00
|
|
|
config_changed = 1;
|
|
|
|
|
|
|
|
|
|
cpu_f = (cpu_family_t *) &cpu_families[0];
|
2022-07-21 21:44:55 -04:00
|
|
|
cpu = 0;
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
kbd_req_capture = 0;
|
|
|
|
|
hide_status_bar = 0;
|
2022-07-21 21:44:55 -04:00
|
|
|
hide_tool_bar = 0;
|
|
|
|
|
scale = 1;
|
|
|
|
|
machine = machine_get_machine_from_internal_name("ibmpc");
|
|
|
|
|
dpi_scale = 1;
|
|
|
|
|
|
|
|
|
|
fpu_type = fpu_get_type(cpu_f, cpu, "none");
|
|
|
|
|
gfxcard = video_get_video_from_internal_name("cga");
|
|
|
|
|
vid_api = plat_vidapi("default");
|
|
|
|
|
vid_resize = 0;
|
2022-07-21 20:50:05 -04:00
|
|
|
video_fullscreen_first = 1;
|
2022-07-21 21:44:55 -04:00
|
|
|
time_sync = TIME_SYNC_ENABLED;
|
|
|
|
|
hdc_current = hdc_get_from_internal_name("none");
|
2022-07-21 20:50:05 -04:00
|
|
|
|
|
|
|
|
serial_enabled[0] = 1;
|
|
|
|
|
serial_enabled[1] = 1;
|
2022-07-21 21:44:55 -04:00
|
|
|
for (i = 2; i < SERIAL_MAX; i++)
|
2022-07-21 20:50:05 -04:00
|
|
|
serial_enabled[i] = 0;
|
|
|
|
|
|
|
|
|
|
lpt_ports[0].enabled = 1;
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
for (i = 1; i < PARALLEL_MAX; i++)
|
2022-07-21 20:50:05 -04:00
|
|
|
lpt_ports[i].enabled = 0;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < FDD_NUM; i++) {
|
|
|
|
|
if (i < 2)
|
|
|
|
|
fdd_set_type(i, 2);
|
|
|
|
|
else
|
|
|
|
|
fdd_set_type(i, 0);
|
|
|
|
|
|
|
|
|
|
fdd_set_turbo(i, 0);
|
|
|
|
|
fdd_set_check_bpb(i, 1);
|
|
|
|
|
}
|
2020-11-09 04:24:33 +05:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
/* Unmute the CD audio on the first CD-ROM drive. */
|
|
|
|
|
cdrom[0].sound_on = 1;
|
2022-07-21 21:44:55 -04:00
|
|
|
mem_size = 64;
|
|
|
|
|
isartc_type = 0;
|
2022-07-21 20:50:05 -04:00
|
|
|
for (i = 0; i < ISAMEM_MAX; i++)
|
|
|
|
|
isamem_type[i] = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2021-12-19 20:00:27 +01:00
|
|
|
/* TODO: Re-enable by default when we have a proper machine flag for this. */
|
2022-07-21 20:50:05 -04:00
|
|
|
cassette_enable = 0;
|
|
|
|
|
memset(cassette_fname, 0x00, sizeof(cassette_fname));
|
|
|
|
|
memcpy(cassette_mode, "load", strlen("load") + 1);
|
2022-07-21 21:44:55 -04:00
|
|
|
cassette_pos = 0;
|
|
|
|
|
cassette_srate = 44100;
|
|
|
|
|
cassette_append = 0;
|
|
|
|
|
cassette_pcm = 0;
|
2022-07-21 20:50:05 -04:00
|
|
|
cassette_ui_writeprot = 0;
|
|
|
|
|
|
|
|
|
|
config_log("Config file not present or invalid!\n");
|
2021-10-06 02:26:30 +02:00
|
|
|
} else {
|
2022-07-21 21:44:55 -04:00
|
|
|
load_general(); /* General */
|
2022-07-21 20:50:05 -04:00
|
|
|
for (i = 0; i < MONITORS_NUM; i++)
|
|
|
|
|
load_monitor(i);
|
|
|
|
|
load_machine(); /* Machine */
|
|
|
|
|
load_video(); /* Video */
|
|
|
|
|
load_input_devices(); /* Input devices */
|
|
|
|
|
load_sound(); /* Sound */
|
|
|
|
|
load_network(); /* Network */
|
|
|
|
|
load_ports(); /* Ports (COM & LPT) */
|
|
|
|
|
load_storage_controllers(); /* Storage controllers */
|
|
|
|
|
load_hard_disks(); /* Hard disks */
|
|
|
|
|
load_floppy_and_cdrom_drives(); /* Floppy and CD-ROM drives */
|
|
|
|
|
/* TODO: Backwards compatibility, get rid of this when enough time has passed. */
|
|
|
|
|
load_floppy_drives(); /* Floppy drives */
|
|
|
|
|
load_other_removable_devices(); /* Other removable devices */
|
|
|
|
|
load_other_peripherals(); /* Other peripherals */
|
|
|
|
|
|
|
|
|
|
/* Mark the configuration as changed. */
|
|
|
|
|
config_changed = 1;
|
|
|
|
|
|
|
|
|
|
config_log("Config loaded.\n\n");
|
2021-10-06 02:26:30 +02:00
|
|
|
}
|
2017-10-29 04:20:20 -05:00
|
|
|
|
2021-10-06 02:26:30 +02:00
|
|
|
video_copy = (video_grayscale || invert_display) ? video_transform_copy : memcpy;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
/* Save "General" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_general(void)
|
|
|
|
|
{
|
|
|
|
|
char *cat = "General";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512], buffer[512] = { 0 };
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2017-10-25 02:17:27 +02:00
|
|
|
char *va_name;
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
config_set_int(cat, "vid_resize", vid_resize);
|
|
|
|
|
if (vid_resize == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "vid_resize");
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2017-10-24 22:10:21 -04:00
|
|
|
va_name = plat_vidapi_name(vid_api);
|
2022-07-18 02:17:16 +02:00
|
|
|
if (!strcmp(va_name, "default"))
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "vid_renderer");
|
2022-07-18 02:17:16 +02:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_string(cat, "vid_renderer", va_name);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (video_fullscreen_scale == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_fullscreen_scale");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "video_fullscreen_scale", video_fullscreen_scale);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-07-27 19:28:32 -03:00
|
|
|
if (video_fullscreen_first == 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_fullscreen_first");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "video_fullscreen_first", video_fullscreen_first);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2021-05-01 20:49:23 +03:00
|
|
|
if (video_filter_method == 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_filter_method");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "video_filter_method", video_filter_method);
|
2021-05-01 20:49:23 +03:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (force_43 == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "force_43");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "force_43", force_43);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (scale == 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "scale");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "scale", scale);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-09-02 10:56:49 +08:00
|
|
|
if (dpi_scale == 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "dpi_scale");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "dpi_scale", dpi_scale);
|
2020-09-02 10:56:49 +08:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (enable_overscan == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "enable_overscan");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "enable_overscan", enable_overscan);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (vid_cga_contrast == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "vid_cga_contrast");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "vid_cga_contrast", vid_cga_contrast);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (video_grayscale == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_grayscale");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "video_grayscale", video_grayscale);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (video_graytype == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_graytype");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "video_graytype", video_graytype);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2018-02-10 00:01:52 +01:00
|
|
|
if (rctrl_is_lalt == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "rctrl_is_lalt");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "rctrl_is_lalt", rctrl_is_lalt);
|
2018-02-10 00:01:52 +01:00
|
|
|
|
2018-02-11 20:51:42 +01:00
|
|
|
if (update_icons == 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "update_icons");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "update_icons", update_icons);
|
2018-02-11 20:51:42 +01:00
|
|
|
|
2021-09-18 15:24:00 +02:00
|
|
|
if (window_remember || (vid_resize & 2)) {
|
2022-07-21 20:50:05 -04:00
|
|
|
if (window_remember)
|
|
|
|
|
config_set_int(cat, "window_remember", window_remember);
|
|
|
|
|
else
|
|
|
|
|
config_delete_var(cat, "window_remember");
|
2022-07-18 02:17:16 +02:00
|
|
|
} else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "window_remember");
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2021-04-12 05:58:59 +02:00
|
|
|
if (vid_resize & 2) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(temp, "%ix%i", fixed_size_x, fixed_size_y);
|
|
|
|
|
config_set_string(cat, "window_fixed_res", temp);
|
2021-04-12 05:58:59 +02:00
|
|
|
} else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "window_fixed_res");
|
2021-04-12 05:58:59 +02:00
|
|
|
|
2018-02-11 20:51:42 +01:00
|
|
|
if (sound_gain != 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "sound_gain", sound_gain);
|
2017-12-10 15:16:24 +01:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "sound_gain");
|
2017-12-10 15:16:24 +01:00
|
|
|
|
2021-07-19 02:27:22 +02:00
|
|
|
if (kbd_req_capture != 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "kbd_req_capture", kbd_req_capture);
|
2021-07-19 02:27:22 +02:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "kbd_req_capture");
|
2021-07-19 02:27:22 +02:00
|
|
|
|
2021-07-30 04:01:46 +02:00
|
|
|
if (hide_status_bar != 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "hide_status_bar", hide_status_bar);
|
2021-07-30 04:01:46 +02:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "hide_status_bar");
|
2021-07-30 04:01:46 +02:00
|
|
|
|
2022-01-09 16:46:44 +02:00
|
|
|
if (hide_tool_bar != 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "hide_tool_bar", hide_tool_bar);
|
2022-01-09 16:46:44 +02:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "hide_tool_bar");
|
2022-01-09 16:46:44 +02:00
|
|
|
|
2020-07-27 19:55:25 -03:00
|
|
|
if (confirm_reset != 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "confirm_reset", confirm_reset);
|
2020-07-27 19:55:25 -03:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "confirm_reset");
|
2020-07-27 19:55:25 -03:00
|
|
|
|
|
|
|
|
if (confirm_exit != 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "confirm_exit", confirm_exit);
|
2020-07-27 19:55:25 -03:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "confirm_exit");
|
2020-07-27 19:55:25 -03:00
|
|
|
|
2020-11-21 19:17:06 +01:00
|
|
|
if (confirm_save != 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "confirm_save", confirm_save);
|
2020-11-21 19:17:06 +01:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "confirm_save");
|
2020-11-21 19:17:06 +01:00
|
|
|
|
2022-06-01 15:31:58 +06:00
|
|
|
if (mouse_sensitivity != 1.0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_double(cat, "mouse_sensitivity", mouse_sensitivity);
|
2022-06-01 15:31:58 +06:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "mouse_sensitivity");
|
2022-06-01 15:31:58 +06:00
|
|
|
|
2021-11-13 21:37:27 +01:00
|
|
|
if (lang_id == DEFAULT_LANGUAGE)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "language");
|
2022-07-18 02:17:16 +02:00
|
|
|
else {
|
2022-07-21 20:50:05 -04:00
|
|
|
plat_language_code_r(lang_id, buffer, 511);
|
|
|
|
|
config_set_string(cat, "language", buffer);
|
2022-07-18 02:17:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!strcmp(icon_set, ""))
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "iconset");
|
2022-07-18 02:17:16 +02:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_string(cat, "iconset", icon_set);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2019-12-04 21:55:35 +01:00
|
|
|
if (enable_discord)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "enable_discord", enable_discord);
|
2019-12-04 21:55:35 +01:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "enable_discord");
|
2019-12-04 21:55:35 +01:00
|
|
|
|
2021-04-23 16:09:45 +03:00
|
|
|
if (video_framerate != -1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "video_gl_framerate", video_framerate);
|
2021-04-23 16:09:45 +03:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_gl_framerate");
|
2021-04-23 16:09:45 +03:00
|
|
|
if (video_vsync != 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "video_gl_vsync", video_vsync);
|
2021-04-23 16:09:45 +03:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_gl_vsync");
|
2021-04-23 16:09:45 +03:00
|
|
|
if (strlen(video_shader) > 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_string(cat, "video_gl_shader", video_shader);
|
2021-04-23 16:09:45 +03:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "video_gl_shader");
|
2021-04-23 16:09:45 +03:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Save "Machine" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_machine(void)
|
2017-05-29 01:18:32 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Machine";
|
2020-11-18 16:08:22 -03:00
|
|
|
char *p;
|
2022-07-21 21:44:55 -04:00
|
|
|
int c, i = 0, legacy_mfg, legacy_cpu = -1, closest_legacy_cpu = -1;
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2020-11-18 16:08:22 -03:00
|
|
|
p = machine_get_internal_name();
|
|
|
|
|
config_set_string(cat, "machine", p);
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2020-11-18 01:09:17 -03:00
|
|
|
config_set_string(cat, "cpu_family", (char *) cpu_f->internal_name);
|
|
|
|
|
config_set_int(cat, "cpu_speed", cpu_f->cpus[cpu].rspeed);
|
|
|
|
|
config_set_double(cat, "cpu_multi", cpu_f->cpus[cpu].multi);
|
2020-11-23 14:48:32 -03:00
|
|
|
if (cpu_override)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_int(cat, "cpu_override", cpu_override);
|
2020-11-23 14:48:32 -03:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "cpu_override");
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2020-11-18 19:56:22 -03:00
|
|
|
/* Forwards compatibility with the previous CPU model system. */
|
2020-11-18 01:09:17 -03:00
|
|
|
config_delete_var(cat, "cpu_manufacturer");
|
|
|
|
|
config_delete_var(cat, "cpu");
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2020-11-18 16:08:22 -03:00
|
|
|
/* Look for a machine entry on the legacy table. */
|
|
|
|
|
c = 0;
|
|
|
|
|
while (cpu_legacy_table[c].machine) {
|
2022-07-21 20:50:05 -04:00
|
|
|
if (!strcmp(p, cpu_legacy_table[c].machine))
|
|
|
|
|
break;
|
|
|
|
|
c++;
|
2020-11-18 16:08:22 -03:00
|
|
|
}
|
|
|
|
|
if (cpu_legacy_table[c].machine) {
|
2022-07-21 20:50:05 -04:00
|
|
|
/* Look for a corresponding CPU entry. */
|
|
|
|
|
cpu_legacy_table_t *legacy_table_entry;
|
|
|
|
|
for (legacy_mfg = 0; legacy_mfg < 4; legacy_mfg++) {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!cpu_legacy_table[c].tables[legacy_mfg])
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
|
while (cpu_legacy_table[c].tables[legacy_mfg][i].family) {
|
|
|
|
|
legacy_table_entry = (cpu_legacy_table_t *) &cpu_legacy_table[c].tables[legacy_mfg][i];
|
|
|
|
|
|
|
|
|
|
/* Match the family name, speed and multiplier. */
|
|
|
|
|
if (!strcmp(cpu_f->internal_name, legacy_table_entry->family)) {
|
|
|
|
|
if ((legacy_table_entry->rspeed == cpu_f->cpus[cpu].rspeed) && (legacy_table_entry->multi == cpu_f->cpus[cpu].multi)) { /* exact speed/multiplier match */
|
|
|
|
|
legacy_cpu = i;
|
|
|
|
|
break;
|
|
|
|
|
} else if ((legacy_table_entry->rspeed >= cpu_f->cpus[cpu].rspeed) && (closest_legacy_cpu == -1)) { /* closest speed match */
|
|
|
|
|
closest_legacy_cpu = i;
|
|
|
|
|
}
|
2022-07-21 20:50:05 -04:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
i++;
|
|
|
|
|
}
|
2020-11-18 19:56:22 -03:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
/* Use the closest speed match if no exact match was found. */
|
|
|
|
|
if ((legacy_cpu == -1) && (closest_legacy_cpu > -1)) {
|
|
|
|
|
legacy_cpu = closest_legacy_cpu;
|
|
|
|
|
break;
|
|
|
|
|
} else if (legacy_cpu > -1) /* exact match found */
|
|
|
|
|
break;
|
2022-07-21 20:50:05 -04:00
|
|
|
}
|
2020-11-18 19:56:22 -03:00
|
|
|
|
2022-07-21 20:50:05 -04:00
|
|
|
/* Set legacy values if a match was found. */
|
|
|
|
|
if (legacy_cpu > -1) {
|
|
|
|
|
if (legacy_mfg)
|
|
|
|
|
config_set_int(cat, "cpu_manufacturer", legacy_mfg);
|
|
|
|
|
if (legacy_cpu)
|
|
|
|
|
config_set_int(cat, "cpu", legacy_cpu);
|
|
|
|
|
}
|
2020-11-18 16:08:22 -03:00
|
|
|
}
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (cpu_waitstates == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "cpu_waitstates");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "cpu_waitstates", cpu_waitstates);
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2020-06-15 21:21:26 +02:00
|
|
|
if (fpu_type == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "fpu_type");
|
2022-04-12 15:58:57 +05:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_string(cat, "fpu_type", (char *) fpu_get_internal_name(cpu_f, cpu, fpu_type));
|
2020-06-15 21:21:26 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
// Write the mem_size explicitly to the setttings in order to help managers to display it without having the actual machine table
|
2022-04-12 15:58:57 +05:00
|
|
|
config_delete_var(cat, "mem_size");
|
|
|
|
|
config_set_int(cat, "mem_size", mem_size);
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
config_set_int(cat, "cpu_use_dynarec", cpu_use_dynarec);
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2018-08-01 18:07:52 +02:00
|
|
|
if (time_sync & TIME_SYNC_ENABLED)
|
2022-07-21 20:50:05 -04:00
|
|
|
if (time_sync & TIME_SYNC_UTC)
|
|
|
|
|
config_set_string(cat, "time_sync", "utc");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "time_sync", "local");
|
2018-08-01 18:07:52 +02:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_string(cat, "time_sync", "disabled");
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Save "Video" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_video(void)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Video";
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
config_set_string(cat, "gfxcard",
|
2022-07-21 21:44:55 -04:00
|
|
|
video_get_internal_name(gfxcard));
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (voodoo_enabled == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "voodoo");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "voodoo", voodoo_enabled);
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2022-05-14 18:55:00 +02:00
|
|
|
if (ibm8514_enabled == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "8514a");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "8514a", ibm8514_enabled);
|
2022-05-14 18:55:00 +02:00
|
|
|
|
2022-06-17 21:26:26 +02:00
|
|
|
if (xga_enabled == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "xga");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "xga", xga_enabled);
|
2022-06-17 21:26:26 +02:00
|
|
|
|
2022-07-07 14:34:59 +06:00
|
|
|
if (gfxcard_2 == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "gfxcard_2");
|
2022-07-04 01:50:42 +06:00
|
|
|
else
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_string(cat, "gfxcard_2", video_get_internal_name(gfxcard_2));
|
2022-07-04 01:50:42 +06:00
|
|
|
|
2022-07-10 11:41:02 +06:00
|
|
|
if (show_second_monitors == 1)
|
|
|
|
|
config_delete_var(cat, "show_second_monitors");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "show_second_monitors", show_second_monitors);
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Save "Input Devices" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_input_devices(void)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Input devices";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512], tmp2[512];
|
|
|
|
|
int c, d;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
config_set_string(cat, "mouse_type", mouse_get_internal_name(mouse_type));
|
|
|
|
|
|
2020-12-04 22:05:26 +05:00
|
|
|
if (!joystick_type) {
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "joystick_type");
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < 16; c++) {
|
|
|
|
|
sprintf(tmp2, "joystick_%i_nr", c);
|
|
|
|
|
config_delete_var(cat, tmp2);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
for (d = 0; d < 16; d++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(tmp2, "joystick_%i_axis_%i", c, d);
|
|
|
|
|
config_delete_var(cat, tmp2);
|
|
|
|
|
}
|
2022-07-21 21:44:55 -04:00
|
|
|
for (d = 0; d < 16; d++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(tmp2, "joystick_%i_button_%i", c, d);
|
|
|
|
|
config_delete_var(cat, tmp2);
|
|
|
|
|
}
|
2022-07-21 21:44:55 -04:00
|
|
|
for (d = 0; d < 16; d++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(tmp2, "joystick_%i_pov_%i", c, d);
|
|
|
|
|
config_delete_var(cat, tmp2);
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
} else {
|
2022-07-21 20:50:05 -04:00
|
|
|
config_set_string(cat, "joystick_type", joystick_get_internal_name(joystick_type));
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) {
|
|
|
|
|
sprintf(tmp2, "joystick_%i_nr", c);
|
|
|
|
|
config_set_int(cat, tmp2, joystick_state[c].plat_joystick_nr);
|
|
|
|
|
|
|
|
|
|
if (joystick_state[c].plat_joystick_nr) {
|
2022-07-21 21:44:55 -04:00
|
|
|
for (d = 0; d < joystick_get_axis_count(joystick_type); d++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(tmp2, "joystick_%i_axis_%i", c, d);
|
|
|
|
|
config_set_int(cat, tmp2, joystick_state[c].axis_mapping[d]);
|
|
|
|
|
}
|
2022-07-21 21:44:55 -04:00
|
|
|
for (d = 0; d < joystick_get_button_count(joystick_type); d++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(tmp2, "joystick_%i_button_%i", c, d);
|
|
|
|
|
config_set_int(cat, tmp2, joystick_state[c].button_mapping[d]);
|
|
|
|
|
}
|
2022-07-21 21:44:55 -04:00
|
|
|
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(tmp2, "joystick_%i_pov_%i", c, d);
|
|
|
|
|
sprintf(temp, "%i, %i", joystick_state[c].pov_mapping[d][0], joystick_state[c].pov_mapping[d][1]);
|
|
|
|
|
config_set_string(cat, tmp2, temp);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Save "Sound" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_sound(void)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Sound";
|
|
|
|
|
|
|
|
|
|
if (sound_card_current == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "sndcard");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "sndcard", sound_card_get_internal_name(sound_card_current));
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-03-13 09:00:03 -04:00
|
|
|
if (!strcmp(midi_out_device_get_internal_name(midi_output_device_current), "none"))
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "midi_device");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "midi_device", midi_out_device_get_internal_name(midi_output_device_current));
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-01-01 20:20:16 +01:00
|
|
|
if (!strcmp(midi_in_device_get_internal_name(midi_input_device_current), "none"))
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "midi_in_device");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "midi_in_device", midi_in_device_get_internal_name(midi_input_device_current));
|
2020-01-01 20:20:16 +01:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (mpu401_standalone_enable == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "mpu401_standalone");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "mpu401_standalone", mpu401_standalone_enable);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (SSI2001 == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "ssi2001");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "ssi2001", SSI2001);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (GAMEBLASTER == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "gameblaster");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "gameblaster", GAMEBLASTER);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (GUS == 0)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "gus");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "gus", GUS);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
if (sound_is_float == 1)
|
2022-07-21 20:50:05 -04:00
|
|
|
config_delete_var(cat, "sound_type");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "sound_type", (sound_is_float == 1) ? "float" : "int16");
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
delete_section_if_empty(cat);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Save "Network" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_network(void)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Network";
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (network_type == NET_TYPE_NONE)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "net_type");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "net_type",
|
|
|
|
|
(network_type == NET_TYPE_SLIRP) ? "slirp" : "pcap");
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2018-03-19 01:02:04 +01:00
|
|
|
if (network_host[0] != '\0') {
|
2022-07-21 21:44:55 -04:00
|
|
|
if (!strcmp(network_host, "none"))
|
|
|
|
|
config_delete_var(cat, "net_host_device");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "net_host_device", network_host);
|
2017-10-07 00:46:54 -04:00
|
|
|
} else {
|
2022-07-21 21:44:55 -04:00
|
|
|
/* config_set_string(cat, "net_host_device", "none"); */
|
|
|
|
|
config_delete_var(cat, "net_host_device");
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (network_card == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "net_card");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "net_card",
|
|
|
|
|
network_card_get_internal_name(network_card));
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Save "Ports" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_ports(void)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Ports (COM & LPT)";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
|
|
|
|
int c, d;
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2021-11-13 17:33:43 -05:00
|
|
|
for (c = 0; c < SERIAL_MAX; c++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(temp, "serial%d_enabled", c + 1);
|
|
|
|
|
if (((c < 2) && serial_enabled[c]) || ((c >= 2) && !serial_enabled[c]))
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, temp, serial_enabled[c]);
|
2022-01-31 01:43:12 -05:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
/*
|
|
|
|
|
sprintf(temp, "serial%d_type", c + 1);
|
|
|
|
|
if (!serial_enabled[c])
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
// else
|
|
|
|
|
// config_set_string(cat, temp, (char *) serial_type[c])
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "serial%d_device", c + 1);
|
|
|
|
|
if (com_ports[c].device == 0)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp,
|
|
|
|
|
(char *) com_device_get_internal_name(com_ports[c].device));
|
|
|
|
|
*/
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
}
|
2018-02-06 19:53:34 +01:00
|
|
|
|
2021-11-13 17:33:43 -05:00
|
|
|
for (c = 0; c < PARALLEL_MAX; c++) {
|
2022-07-21 20:50:05 -04:00
|
|
|
sprintf(temp, "lpt%d_enabled", c + 1);
|
|
|
|
|
d = (c == 0) ? 1 : 0;
|
|
|
|
|
if (lpt_ports[c].enabled == d)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, temp, lpt_ports[c].enabled);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "lpt%d_device", c + 1);
|
|
|
|
|
if (lpt_ports[c].device == 0)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp,
|
2022-07-21 21:44:55 -04:00
|
|
|
(char *) lpt_device_get_internal_name(lpt_ports[c].device));
|
Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port;
Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX);
Finished the 586MC1;
Added 8087 emulation;
Moved Cyrix 6x86'es to the Dev branch;
Sanitized/cleaned up memregs.c/h and intel.c/h;
Split the chipsets from machines and sanitized Port 92 emulation;
Added support for the 15bpp mode to the Compaq ATI 28800;
Moved the MR 386DX and 486 machines to the Dev branch;
Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00;
Ported the new timer code from PCem;
Cleaned up the CPU table of unused stuff and better optimized its structure;
Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch;
Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem;
Added the AHA-1540A and the BusTek BT-542B;
Moved the Sumo SCSI-AT to the Dev branch;
Minor IDE, FDC, and floppy drive code clean-ups;
Made NCR 5380/53C400-based cards' BIOS address configurable;
Got rid of the legacy romset variable;
Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit;
Added the Amstead PPC512 per PCem patch by John Elliott;
Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages);
Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing;
Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem;
Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit;
Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement;
Amstrad MegaPC does now works correctly with non-internal graphics card;
The SLiRP code no longer casts a packed struct type to a non-packed struct type;
The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present;
The S3 Virge on BeOS is no longer broken (was broken by build #1591);
OS/2 2.0 build 6.167 now sees key presses again;
Xi8088 now work on CGA again;
86F images converted from either the old or new variants of the HxC MFM format now work correctly;
Hardware interrupts with a vector of 0xFF are now handled correctly;
OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct;
Fixed VNC keyboard input bugs;
Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver;
Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly;
Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4;
Compaq Portable now works with all graphics cards;
Fixed various MDSI Genius bugs;
Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly;
Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355;
OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400.
Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391.
Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389.
Fixed a minor IDE timing bug, fixes #388.
Fixed Toshiba T1000 RAM issues, fixes #379.
Fixed EGA/(S)VGA overscan border handling, fixes #378;
Got rid of the now long useless IDE channel 2 auto-removal, fixes #370;
Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366;
Ported the Unicode CD image file name fix from VARCem, fixes #365;
Fixed high density floppy disks on the Xi8088, fixes #359;
Fixed some bugs in the Hercules emulation, fixes #346, fixes #358;
Fixed the SCSI hard disk mode sense pages, fixes #356;
Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349;
Fixed bugs in the serial mouse emulation, fixes #344;
Compiled 86Box binaries now include all the required .DLL's, fixes #341;
Made some combo boxes in the Settings dialog slightly wider, fixes #276.
2019-09-20 14:02:30 +02:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2020-11-26 18:20:24 +01:00
|
|
|
/* Save "Storage Controllers" section. */
|
2017-09-23 21:12:26 -04:00
|
|
|
static void
|
2020-11-26 18:20:24 +01:00
|
|
|
save_storage_controllers(void)
|
2017-09-23 21:12:26 -04:00
|
|
|
{
|
2020-11-26 18:20:24 +01:00
|
|
|
char *cat = "Storage controllers";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
|
|
|
|
int c;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2021-07-26 05:07:13 +02:00
|
|
|
config_delete_var(cat, "scsicard");
|
|
|
|
|
|
2021-07-22 20:13:44 +02:00
|
|
|
for (c = 0; c < SCSI_BUS_MAX; c++) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "scsicard_%d", c + 1);
|
2021-07-22 20:13:44 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
if (scsi_card_current[c] == 0)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp,
|
|
|
|
|
scsi_card_get_internal_name(scsi_card_current[c]));
|
2021-07-22 20:13:44 +02:00
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-06-17 14:29:24 +02:00
|
|
|
if (fdc_type == FDC_INTERNAL)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "fdc");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "fdc",
|
|
|
|
|
fdc_card_get_internal_name(fdc_type));
|
2020-06-16 16:25:23 +02:00
|
|
|
|
2019-02-06 03:34:39 +01:00
|
|
|
config_set_string(cat, "hdc",
|
2022-07-21 21:44:55 -04:00
|
|
|
hdc_get_internal_name(hdc_current));
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2018-04-25 23:51:13 +02:00
|
|
|
if (ide_ter_enabled == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "ide_ter");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "ide_ter", ide_ter_enabled);
|
2018-04-25 23:51:13 +02:00
|
|
|
|
|
|
|
|
if (ide_qua_enabled == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "ide_qua");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "ide_qua", ide_qua_enabled);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-11-26 18:20:24 +01:00
|
|
|
delete_section_if_empty(cat);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
|
|
|
|
if (cassette_enable == 1)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_enabled");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_int(cat, "cassette_enabled", cassette_enable);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
2021-09-02 20:15:46 +02:00
|
|
|
if (strlen(cassette_fname) == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_file");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_string(cat, "cassette_file", cassette_fname);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
2021-09-02 20:15:46 +02:00
|
|
|
if (strlen(cassette_mode) == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_mode");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_string(cat, "cassette_mode", cassette_mode);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
|
|
|
|
if (cassette_pos == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_position");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_int(cat, "cassette_position", cassette_pos);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
|
|
|
|
if (cassette_srate == 44100)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_srate");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_int(cat, "cassette_srate", cassette_srate);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
|
|
|
|
if (cassette_append == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_append");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_int(cat, "cassette_append", cassette_append);
|
2021-07-27 06:12:09 +02:00
|
|
|
|
|
|
|
|
if (cassette_pcm == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_pcm");
|
2021-07-27 06:12:09 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_int(cat, "cassette_pcm", cassette_pcm);
|
2021-07-28 00:58:19 +02:00
|
|
|
|
|
|
|
|
if (cassette_ui_writeprot == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "cassette_writeprot");
|
2021-07-28 00:58:19 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
config_set_int(cat, "cassette_writeprot", cassette_ui_writeprot);
|
2021-07-29 20:34:55 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < 2; c++) {
|
|
|
|
|
sprintf(temp, "cartridge_%02i_fn", c + 1);
|
|
|
|
|
if (strlen(cart_fns[c]) == 0)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp, cart_fns[c]);
|
2021-07-29 20:34:55 +02:00
|
|
|
}
|
2020-11-26 18:20:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Save "Other Peripherals" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_other_peripherals(void)
|
|
|
|
|
{
|
|
|
|
|
char *cat = "Other peripherals";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512];
|
|
|
|
|
int c;
|
2020-11-26 18:20:24 +01:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
if (bugger_enabled == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "bugger_enabled");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "bugger_enabled", bugger_enabled);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2020-03-23 17:03:28 -03:00
|
|
|
if (postcard_enabled == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "postcard_enabled");
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, "postcard_enabled", postcard_enabled);
|
2020-03-23 17:03:28 -03:00
|
|
|
|
2018-09-03 14:28:50 +02:00
|
|
|
for (c = 0; c < ISAMEM_MAX; c++) {
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "isamem%d_type", c);
|
|
|
|
|
if (isamem_type[c] == 0)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp,
|
|
|
|
|
(char *) isamem_get_internal_name(isamem_type[c]));
|
2018-09-03 14:28:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isartc_type == 0)
|
2022-07-21 21:44:55 -04:00
|
|
|
config_delete_var(cat, "isartc_type");
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, "isartc_type",
|
|
|
|
|
isartc_get_internal_name(isartc_type));
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
/* Save "Hard Disks" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_hard_disks(void)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
char *cat = "Hard disks";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[32], tmp2[512];
|
2017-10-07 00:46:54 -04:00
|
|
|
char *p;
|
2022-07-21 21:44:55 -04:00
|
|
|
int c;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
memset(temp, 0x00, sizeof(temp));
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < HDD_NUM; c++) {
|
|
|
|
|
sprintf(temp, "hdd_%02i_parameters", c + 1);
|
|
|
|
|
if (hdd_is_valid(c)) {
|
|
|
|
|
p = hdd_bus_to_string(hdd[c].bus, 0);
|
|
|
|
|
sprintf(tmp2, "%u, %u, %u, %i, %s",
|
|
|
|
|
hdd[c].spt, hdd[c].hpc, hdd[c].tracks, hdd[c].wp, p);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
} else {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_mfm_channel", c + 1);
|
|
|
|
|
if (hdd_is_valid(c) && (hdd[c].bus == HDD_BUS_MFM))
|
|
|
|
|
config_set_int(cat, temp, hdd[c].mfm_channel);
|
|
|
|
|
else
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_xta_channel", c + 1);
|
|
|
|
|
if (hdd_is_valid(c) && (hdd[c].bus == HDD_BUS_XTA))
|
|
|
|
|
config_set_int(cat, temp, hdd[c].xta_channel);
|
|
|
|
|
else
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_esdi_channel", c + 1);
|
|
|
|
|
if (hdd_is_valid(c) && (hdd[c].bus == HDD_BUS_ESDI))
|
|
|
|
|
config_set_int(cat, temp, hdd[c].esdi_channel);
|
|
|
|
|
else
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_ide_channel", c + 1);
|
|
|
|
|
if (!hdd_is_valid(c) || (hdd[c].bus != HDD_BUS_IDE)) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", hdd[c].ide_channel >> 1, hdd[c].ide_channel & 1);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_scsi_id", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_scsi_location", c + 1);
|
|
|
|
|
if (hdd[c].bus != HDD_BUS_SCSI)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else {
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", hdd[c].scsi_id >> 4,
|
|
|
|
|
hdd[c].scsi_id & 15);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
2022-07-19 11:31:06 +02:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sprintf(temp, "hdd_%02i_fn", c + 1);
|
|
|
|
|
if (hdd_is_valid(c) && (strlen(hdd[c].fn) != 0)) {
|
|
|
|
|
path_normalize(hdd[c].fn);
|
|
|
|
|
if (!strnicmp(hdd[c].fn, usr_path, strlen(usr_path)))
|
|
|
|
|
config_set_string(cat, temp, &hdd[c].fn[strlen(usr_path)]);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp, hdd[c].fn);
|
|
|
|
|
} else
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "hdd_%02i_speed", c + 1);
|
|
|
|
|
if (!hdd_is_valid(c) || (hdd[c].bus != HDD_BUS_IDE))
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp, hdd_preset_get_internal_name(hdd[c].speed_preset));
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete_section_if_empty(cat);
|
2017-05-08 04:54:17 +02:00
|
|
|
}
|
|
|
|
|
|
2018-01-26 22:17:09 +01:00
|
|
|
/* Save "Floppy Drives" section. */
|
2017-09-23 21:12:26 -04:00
|
|
|
static void
|
2020-07-19 06:07:58 +02:00
|
|
|
save_floppy_and_cdrom_drives(void)
|
2017-05-08 04:54:17 +02:00
|
|
|
{
|
2020-07-19 06:07:58 +02:00
|
|
|
char *cat = "Floppy and CD-ROM drives";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512], tmp2[512];
|
|
|
|
|
int c;
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < FDD_NUM; c++) {
|
|
|
|
|
sprintf(temp, "fdd_%02i_type", c + 1);
|
|
|
|
|
if (fdd_get_type(c) == ((c < 2) ? 2 : 0))
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_string(cat, temp,
|
|
|
|
|
fdd_get_internal_name(fdd_get_type(c)));
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "fdd_%02i_fn", c + 1);
|
|
|
|
|
if (strlen(floppyfns[c]) == 0) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
ui_writeprot[c] = 0;
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "fdd_%02i_writeprot", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
config_set_string(cat, temp, floppyfns[c]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "fdd_%02i_writeprot", c + 1);
|
|
|
|
|
if (ui_writeprot[c] == 0)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, temp, ui_writeprot[c]);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "fdd_%02i_turbo", c + 1);
|
|
|
|
|
if (fdd_get_turbo(c) == 0)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, temp, fdd_get_turbo(c));
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "fdd_%02i_check_bpb", c + 1);
|
|
|
|
|
if (fdd_get_check_bpb(c) == 1)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else
|
|
|
|
|
config_set_int(cat, temp, fdd_get_check_bpb(c));
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < CDROM_NUM; c++) {
|
|
|
|
|
sprintf(temp, "cdrom_%02i_host_drive", c + 1);
|
|
|
|
|
if ((cdrom[c].bus_type == 0) || (cdrom[c].host_drive != 200)) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
config_set_int(cat, temp, cdrom[c].host_drive);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "cdrom_%02i_speed", c + 1);
|
|
|
|
|
if ((cdrom[c].bus_type == 0) || (cdrom[c].speed == 8)) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
config_set_int(cat, temp, cdrom[c].speed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "cdrom_%02i_parameters", c + 1);
|
|
|
|
|
if (cdrom[c].bus_type == 0) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(tmp2, "%u, %s", cdrom[c].sound_on,
|
|
|
|
|
hdd_bus_to_string(cdrom[c].bus_type, 1));
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "cdrom_%02i_ide_channel", c + 1);
|
|
|
|
|
if (cdrom[c].bus_type != CDROM_BUS_ATAPI)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else {
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", cdrom[c].ide_channel >> 1,
|
|
|
|
|
cdrom[c].ide_channel & 1);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "cdrom_%02i_scsi_id", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "cdrom_%02i_scsi_location", c + 1);
|
|
|
|
|
if (cdrom[c].bus_type != CDROM_BUS_SCSI)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else {
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", cdrom[c].scsi_device_id >> 4,
|
|
|
|
|
cdrom[c].scsi_device_id & 15);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "cdrom_%02i_image_path", c + 1);
|
|
|
|
|
if ((cdrom[c].bus_type == 0) || (strlen(cdrom[c].image_path) == 0)) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
config_set_string(cat, temp, cdrom[c].image_path);
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
|
|
|
|
|
2020-07-19 06:07:58 +02:00
|
|
|
delete_section_if_empty(cat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Save "Other Removable Devices" section. */
|
|
|
|
|
static void
|
|
|
|
|
save_other_removable_devices(void)
|
|
|
|
|
{
|
|
|
|
|
char *cat = "Other removable devices";
|
2022-07-21 21:44:55 -04:00
|
|
|
char temp[512], tmp2[512];
|
|
|
|
|
int c;
|
|
|
|
|
|
|
|
|
|
for (c = 0; c < ZIP_NUM; c++) {
|
|
|
|
|
sprintf(temp, "zip_%02i_parameters", c + 1);
|
|
|
|
|
if (zip_drives[c].bus_type == 0) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(tmp2, "%u, %s", zip_drives[c].is_250,
|
|
|
|
|
hdd_bus_to_string(zip_drives[c].bus_type, 1));
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
|
|
|
|
if (zip_drives[c].bus_type != ZIP_BUS_ATAPI)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else {
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", zip_drives[c].ide_channel >> 1,
|
|
|
|
|
zip_drives[c].ide_channel & 1);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "zip_%02i_scsi_id", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
|
|
|
|
if (zip_drives[c].bus_type != ZIP_BUS_SCSI)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else {
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", zip_drives[c].scsi_device_id >> 4,
|
|
|
|
|
zip_drives[c].scsi_device_id & 15);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "zip_%02i_image_path", c + 1);
|
|
|
|
|
if ((zip_drives[c].bus_type == 0) || (strlen(zip_drives[c].image_path) == 0)) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
config_set_string(cat, temp, zip_drives[c].image_path);
|
|
|
|
|
}
|
2018-01-26 22:17:09 +01:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
for (c = 0; c < MO_NUM; c++) {
|
|
|
|
|
sprintf(temp, "mo_%02i_parameters", c + 1);
|
|
|
|
|
if (mo_drives[c].bus_type == 0) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(tmp2, "%u, %s", mo_drives[c].type,
|
|
|
|
|
hdd_bus_to_string(mo_drives[c].bus_type, 1));
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "mo_%02i_ide_channel", c + 1);
|
|
|
|
|
if (mo_drives[c].bus_type != MO_BUS_ATAPI)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else {
|
|
|
|
|
sprintf(tmp2, "%01u:%01u", mo_drives[c].ide_channel >> 1,
|
|
|
|
|
mo_drives[c].ide_channel & 1);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "mo_%02i_scsi_id", c + 1);
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "mo_%02i_scsi_location", c + 1);
|
|
|
|
|
if (mo_drives[c].bus_type != MO_BUS_SCSI)
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
else {
|
|
|
|
|
sprintf(tmp2, "%01u:%02u", mo_drives[c].scsi_device_id >> 4,
|
|
|
|
|
mo_drives[c].scsi_device_id & 15);
|
|
|
|
|
config_set_string(cat, temp, tmp2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf(temp, "mo_%02i_image_path", c + 1);
|
|
|
|
|
if ((mo_drives[c].bus_type == 0) || (strlen(mo_drives[c].image_path) == 0)) {
|
|
|
|
|
config_delete_var(cat, temp);
|
|
|
|
|
} else {
|
|
|
|
|
config_set_string(cat, temp, mo_drives[c].image_path);
|
|
|
|
|
}
|
2020-04-01 19:04:53 +02:00
|
|
|
}
|
|
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
delete_section_if_empty(cat);
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_save(void)
|
2022-02-20 02:26:27 -05:00
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
save_general(); /* General */
|
|
|
|
|
for (i = 0; i < MONITORS_NUM; i++)
|
|
|
|
|
save_monitor(i);
|
|
|
|
|
save_machine(); /* Machine */
|
|
|
|
|
save_video(); /* Video */
|
|
|
|
|
save_input_devices(); /* Input devices */
|
|
|
|
|
save_sound(); /* Sound */
|
|
|
|
|
save_network(); /* Network */
|
|
|
|
|
save_ports(); /* Ports (COM & LPT) */
|
|
|
|
|
save_storage_controllers(); /* Storage controllers */
|
|
|
|
|
save_hard_disks(); /* Hard disks */
|
|
|
|
|
save_floppy_and_cdrom_drives(); /* Floppy and CD-ROM drives */
|
|
|
|
|
save_other_removable_devices(); /* Other removable devices */
|
|
|
|
|
save_other_peripherals(); /* Other peripherals */
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2017-12-04 11:59:26 -05:00
|
|
|
config_write(cfg_path);
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_dump(void)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *sec;
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sec = (section_t *) config_head.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
while (sec != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
if (sec->name[0])
|
|
|
|
|
config_log("[%s]\n", sec->name);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = (entry_t *) sec->entry_head.next;
|
|
|
|
|
while (ent != NULL) {
|
|
|
|
|
config_log("%s = %s\n", ent->name, ent->data);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = (entry_t *) ent->list.next;
|
|
|
|
|
}
|
2017-10-07 00:46:54 -04:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
sec = (section_t *) sec->list.next;
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_delete_var(char *head, char *name)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *entry;
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
2022-07-21 21:44:55 -04:00
|
|
|
if (section == NULL)
|
|
|
|
|
return;
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry != NULL) {
|
2022-07-21 21:44:55 -04:00
|
|
|
list_delete(&entry->list, §ion->entry_head);
|
|
|
|
|
free(entry);
|
2017-10-07 00:46:54 -04:00
|
|
|
}
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
config_get_int(char *head, char *name, int def)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *entry;
|
|
|
|
|
int value;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
sscanf(entry->data, "%i", &value);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (value);
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
|
|
|
|
|
2020-11-18 01:09:17 -03:00
|
|
|
double
|
|
|
|
|
config_get_double(char *head, char *name, double def)
|
|
|
|
|
{
|
|
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *entry;
|
|
|
|
|
double value;
|
2020-11-18 01:09:17 -03:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2020-11-18 01:09:17 -03:00
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2020-11-18 01:09:17 -03:00
|
|
|
|
|
|
|
|
sscanf(entry->data, "%lg", &value);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (value);
|
2020-11-18 01:09:17 -03:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
int
|
|
|
|
|
config_get_hex16(char *head, char *name, int def)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
section_t *section;
|
|
|
|
|
entry_t *entry;
|
2018-04-25 23:51:13 +02:00
|
|
|
unsigned int value;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
sscanf(entry->data, "%04X", &value);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (value);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-06-19 06:46:08 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
int
|
|
|
|
|
config_get_hex20(char *head, char *name, int def)
|
|
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
section_t *section;
|
|
|
|
|
entry_t *entry;
|
2018-04-25 23:51:13 +02:00
|
|
|
unsigned int value;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
sscanf(entry->data, "%05X", &value);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (value);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
int
|
|
|
|
|
config_get_mac(char *head, char *name, int def)
|
|
|
|
|
{
|
2022-07-21 21:44:55 -04:00
|
|
|
section_t *section;
|
|
|
|
|
entry_t *entry;
|
2018-04-25 23:51:13 +02:00
|
|
|
unsigned int val0 = 0, val1 = 0, val2 = 0;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
sscanf(entry->data, "%02x:%02x:%02x", &val0, &val1, &val2);
|
|
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return ((val0 << 16) + (val1 << 8) + val2);
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
char *
|
|
|
|
|
config_get_string(char *head, char *name, char *def)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *entry;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (entry->data);
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
wchar_t *
|
|
|
|
|
config_get_wstring(char *head, char *name, wchar_t *def)
|
2017-09-02 23:39:26 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *entry;
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2017-10-07 00:46:54 -04:00
|
|
|
|
|
|
|
|
entry = find_entry(section, name);
|
|
|
|
|
if (entry == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
return (def);
|
2022-02-20 02:26:27 -05:00
|
|
|
|
2022-07-21 21:44:55 -04:00
|
|
|
return (entry->wdata);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-09-02 23:39:26 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_set_int(char *head, char *name, int val)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
section = create_section(head);
|
2017-09-23 21:12:26 -04:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
ent = find_entry(section, name);
|
|
|
|
|
if (ent == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = create_entry(section, name);
|
2017-09-02 23:39:26 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
sprintf(ent->data, "%i", val);
|
2020-01-15 05:24:33 +01:00
|
|
|
mbstowcs(ent->wdata, ent->data, 512);
|
2017-09-02 23:39:26 +02:00
|
|
|
}
|
|
|
|
|
|
2020-11-18 01:09:17 -03:00
|
|
|
void
|
|
|
|
|
config_set_double(char *head, char *name, double val)
|
|
|
|
|
{
|
|
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2020-11-18 01:09:17 -03:00
|
|
|
|
|
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
section = create_section(head);
|
2020-11-18 01:09:17 -03:00
|
|
|
|
|
|
|
|
ent = find_entry(section, name);
|
|
|
|
|
if (ent == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = create_entry(section, name);
|
2020-11-18 01:09:17 -03:00
|
|
|
|
|
|
|
|
sprintf(ent->data, "%lg", val);
|
|
|
|
|
mbstowcs(ent->wdata, ent->data, 512);
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_set_hex16(char *head, char *name, int val)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
section = create_section(head);
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
ent = find_entry(section, name);
|
|
|
|
|
if (ent == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = create_entry(section, name);
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
sprintf(ent->data, "%04X", val);
|
2020-01-15 02:15:42 +01:00
|
|
|
mbstowcs(ent->wdata, ent->data, sizeof_w(ent->wdata));
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_set_hex20(char *head, char *name, int val)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
section = create_section(head);
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
ent = find_entry(section, name);
|
|
|
|
|
if (ent == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = create_entry(section, name);
|
2017-05-18 01:57:16 -04:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
sprintf(ent->data, "%05X", val);
|
|
|
|
|
mbstowcs(ent->wdata, ent->data, sizeof_w(ent->wdata));
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_set_mac(char *head, char *name, int val)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
section = create_section(head);
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
ent = find_entry(section, name);
|
|
|
|
|
if (ent == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = create_entry(section, name);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
sprintf(ent->data, "%02x:%02x:%02x",
|
2022-07-21 21:44:55 -04:00
|
|
|
(val >> 16) & 0xff, (val >> 8) & 0xff, val & 0xff);
|
2020-01-15 04:58:28 +01:00
|
|
|
mbstowcs(ent->wdata, ent->data, 512);
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_set_string(char *head, char *name, char *val)
|
|
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
section = create_section(head);
|
2017-05-17 21:56:31 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
ent = find_entry(section, name);
|
|
|
|
|
if (ent == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = create_entry(section, name);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2020-04-10 01:08:52 +02:00
|
|
|
if ((strlen(val) + 1) <= sizeof(ent->data))
|
2022-07-21 21:44:55 -04:00
|
|
|
memcpy(ent->data, val, strlen(val) + 1);
|
2020-04-10 01:08:52 +02:00
|
|
|
else
|
2022-07-21 21:44:55 -04:00
|
|
|
memcpy(ent->data, val, sizeof(ent->data));
|
|
|
|
|
#ifdef _WIN32 /* Make sure the string is converted from UTF-8 rather than a legacy codepage */
|
2021-03-14 20:35:01 +01:00
|
|
|
mbstoc16s(ent->wdata, ent->data, sizeof_w(ent->wdata));
|
|
|
|
|
#else
|
2020-01-15 02:12:29 +01:00
|
|
|
mbstowcs(ent->wdata, ent->data, sizeof_w(ent->wdata));
|
2021-03-14 20:35:01 +01:00
|
|
|
#endif
|
2017-05-17 21:56:31 +02:00
|
|
|
}
|
|
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
void
|
|
|
|
|
config_set_wstring(char *head, char *name, wchar_t *val)
|
2017-05-17 21:56:31 +02:00
|
|
|
{
|
2017-10-07 00:46:54 -04:00
|
|
|
section_t *section;
|
2022-07-21 21:44:55 -04:00
|
|
|
entry_t *ent;
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-07 00:46:54 -04:00
|
|
|
section = find_section(head);
|
|
|
|
|
if (section == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
section = create_section(head);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
ent = find_entry(section, name);
|
|
|
|
|
if (ent == NULL)
|
2022-07-21 21:44:55 -04:00
|
|
|
ent = create_entry(section, name);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-10-13 18:26:25 -04:00
|
|
|
memcpy(ent->wdata, val, sizeof_w(ent->wdata));
|
2022-07-21 21:44:55 -04:00
|
|
|
#ifdef _WIN32 /* Make sure the string is converted to UTF-8 rather than a legacy codepage */
|
2021-03-14 20:35:01 +01:00
|
|
|
c16stombs(ent->data, ent->wdata, sizeof(ent->data));
|
|
|
|
|
#else
|
2017-10-13 18:26:25 -04:00
|
|
|
wcstombs(ent->data, ent->wdata, sizeof(ent->data));
|
2021-03-14 20:35:01 +01:00
|
|
|
#endif
|
2017-09-23 21:12:26 -04:00
|
|
|
}
|