Merge branch '86Box:master' into master

This commit is contained in:
starfrost
2025-09-14 01:07:52 +01:00
committed by GitHub
57 changed files with 1911 additions and 944 deletions

View File

@@ -600,8 +600,8 @@ then
cmake_flags_extra="$cmake_flags_extra -D MOLTENVK=ON -D \"MOLTENVK_INCLUDE_DIR=$macports\""
fi
# Enable Libserialport
cmake_flags_extra="$cmake_flags_extra -D \"LIBSERIALPORT_ROOT=$macports\""
# Enable libserialport.
cmake_flags_extra="$cmake_flags_extra -D \"LIBSERIALPORT_ROOT=$macports\""
# Install dependencies only if we're in a new build and/or MacPorts prefix.
if check_buildtag "$(basename "$macports")"

View File

@@ -36,7 +36,7 @@ if(MUNT_EXTERNAL)
endif()
project(86Box
VERSION 5.1
VERSION 6.0
DESCRIPTION "Emulator of x86-based systems"
HOMEPAGE_URL "https://86box.net"
LANGUAGES C CXX)

4
debian/changelog vendored
View File

@@ -1,5 +1,5 @@
86box (5.1) UNRELEASED; urgency=medium
86box (6.0) UNRELEASED; urgency=medium
* Bump release.
-- Jasmine Iwanek <jriwanek@gmail.com> Wed, 27 Aug 2025 19:39:16 +0200
-- Jasmine Iwanek <jriwanek@gmail.com> Sun, 14 Sep 2025 01:57:44 +0200

View File

@@ -230,6 +230,7 @@ int other_scsi_present = 0; /* SCSI contro
int is_pcjr = 0; /* The current machine is PCjr. */
int portable_mode = 0; /* We are running in portable mode
(global dirs = exe path) */
int global_cfg_overridden = 0; /* Global config file was overriden on command line */
int monitor_edid = 0; /* (C) Which EDID to use. 0=default, 1=custom. */
char monitor_edid_path[1024] = { 0 }; /* (C) Path to custom EDID */
@@ -852,6 +853,7 @@ usage:
if ((c + 1) == argc || plat_dir_check(argv[c + 1]))
goto usage;
global_cfg_overridden = 1;
global = argv[++c];
} else if (!strcasecmp(argv[c], "--image") || !strcasecmp(argv[c], "-I")) {
if ((c + 1) == argc)
@@ -1151,11 +1153,13 @@ usage:
start_vmm = 1;
} else {
strncpy(vmm_path, vmm_path_cfg, sizeof(vmm_path) - 1);
vmm_path[sizeof(vmm_path) - 1] = '\0';
}
if (start_vmm) {
pclog("# VM Manager enabled. Path: %s\n", vmm_path);
strncpy(usr_path, vmm_path, sizeof(usr_path) - 1);
usr_path[sizeof(usr_path) - 1] = '\0';
} else
#endif
{
@@ -1864,6 +1868,12 @@ pc_run(void)
if (title_update) {
mouse_msg_idx = ((mouse_type == MOUSE_TYPE_NONE) || (mouse_input_mode >= 1)) ? 2 : !!mouse_capture;
#ifdef SCREENSHOT_MODE
if (force_10ms)
fps = ((fps + 2) / 5) * 5;
else
fps = ((fps + 20) / 50) * 50;
#endif
swprintf(temp, sizeof_w(temp), mouse_msg[mouse_msg_idx], fps / (force_10ms ? 1 : 10), force_10ms ? 0 : (fps % 10));
#ifdef __APPLE__
/* Needed due to modifying the UI on the non-main thread is a big no-no. */

View File

@@ -84,6 +84,10 @@ if(DEBUGREGS486)
add_compile_definitions(USE_DEBUG_REGS_486)
endif()
if(SCREENSHOT_MODE)
add_compile_definitions(SCREENSHOT_MODE)
endif()
if(VNC)
find_package(LibVNCServer)
if(LibVNCServer_FOUND)

View File

@@ -812,7 +812,7 @@ ide_set_signature(ide_t *ide)
ide->tf->sector = 1;
ide->tf->head = 0;
ide->tf->secount = 1;
ide->tf->cylinder = ide_signatures[ide->type & ~IDE_SHADOW];
ide->tf->cylinder = (ide->type == IDE_ATAPI_SHADOW) ? 0x0000 : ide_signatures[ide->type & ~IDE_SHADOW];
if (ide->type == IDE_HDD)
ide->drive = 0;
@@ -1581,7 +1581,7 @@ ide_reset_registers(ide_t *ide)
ide->tf->atastat = DRDY_STAT | DSC_STAT;
ide->tf->error = 1;
ide->tf->secount = 1;
ide->tf->cylinder = ide_signatures[ide->type & ~IDE_SHADOW];
ide->tf->cylinder = (ide->type == IDE_ATAPI_SHADOW) ? 0x0000 : ide_signatures[ide->type & ~IDE_SHADOW];
ide->tf->sector = 1;
ide->tf->head = 0;

View File

@@ -202,6 +202,7 @@ extern char vmm_path[1024]; /* VM Manager path to scan */
extern int start_vmm; /* the current execution will start the manager */
extern int portable_mode; /* we are running in portable mode
(global dirs = exe path) */
extern int global_cfg_overridden; /* global config file was overriden on command line */
extern int monitor_edid; /* (C) Which EDID to use. 0=default, 1=custom. */
extern char monitor_edid_path[1024]; /* (C) Path to custom EDID */

View File

@@ -498,7 +498,7 @@ extern int machine_at_cmdpc_init(const machine_t *);
extern int machine_at_portableii_init(const machine_t *);
extern int machine_at_portableiii_init(const machine_t *);
extern int machine_at_grid1520_init(const machine_t *);
extern int machine_at_mpfpc900_init(const machine_t *);
extern int machine_at_pc900_init(const machine_t *);
extern int machine_at_mr286_init(const machine_t *);
extern int machine_at_pc8_init(const machine_t *);
extern int machine_at_m290_init(const machine_t *);
@@ -516,19 +516,19 @@ extern int machine_at_dells200_init(const machine_t *);
extern int machine_at_super286c_init(const machine_t *);
extern int machine_at_at122_init(const machine_t *);
extern int machine_at_tuliptc7_init(const machine_t *);
/* Wells American A*Star with custom award BIOS. */
extern int machine_at_wellamerastar_init(const machine_t *);
/* GC103 */
extern int machine_at_quadt286_init(const machine_t *);
extern void machine_at_headland_common_init(const machine_t *model, int type);
extern int machine_at_tg286m_init(const machine_t *);
/* Wells American A*Star with custom award BIOS. */
extern int machine_at_wellamerastar_init(const machine_t *);
/* NEAT */
extern int machine_at_px286_init(const machine_t *);
extern int machine_at_ataripc4_init(const machine_t *);
extern int machine_at_neat_ami_init(const machine_t *);
extern int machine_at_3302_init(const machine_t *);
extern int machine_at_px286_init(const machine_t *);
/* SCAMP */
extern int machine_at_pc7286_init(const machine_t *);
@@ -558,8 +558,8 @@ extern const device_t pbl300sx_device;
extern int machine_at_pbl300sx_init(const machine_t *);
/* ALi M1217 */
extern int machine_at_arb1374_init(const machine_t *);
extern int machine_at_sbc350a_init(const machine_t *);
extern int machine_at_arb1374_init(const machine_t *);
extern int machine_at_flytech386_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t c325ax_device;
@@ -609,6 +609,10 @@ extern int machine_at_wd76c10_init(const machine_t *);
extern int machine_at_pja511m_init(const machine_t *);
extern int machine_at_prox1332_init(const machine_t *);
/* m_at_486slc.c */
/* OPTi 283 */
extern int machine_at_rycleopardlx_init(const machine_t *);
/* m_at_386dx.c */
/* ISA */
#ifdef EMU_DEVICE_H
@@ -640,10 +644,6 @@ extern int machine_at_opti495_init(const machine_t *);
extern int machine_at_asus3863364k_init(const machine_t *);
extern int machine_at_asus386_init(const machine_t *);
/* m_at_486slc.c */
/* OPTi 283 */
extern int machine_at_rycleopardlx_init(const machine_t *);
/* m_at_386dx_486.c */
/* ALi M1429G */
extern int machine_at_exp4349_init(const machine_t *);
@@ -1128,12 +1128,18 @@ extern int machine_at_p6i440e2_init(const machine_t *);
/* i440BX */
extern int machine_at_bf6_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t bx6_device;
#endif
extern int machine_at_bx6_init(const machine_t *);
extern int machine_at_ax6bc_init(const machine_t *);
extern int machine_at_p2bls_init(const machine_t *);
extern int machine_at_p3bf_init(const machine_t *);
extern int machine_at_686bx_init(const machine_t *);
extern int machine_at_lgibmx7g_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t ms6119_device;
#endif
extern int machine_at_ms6119_init(const machine_t *);
extern int machine_at_p6sba_init(const machine_t *);
extern int machine_at_s1846_init(const machine_t *);

View File

@@ -32,6 +32,14 @@ enum {
AD1848_TYPE_CS4235 = 6
};
enum {
AD1848_AUX1 = 2,
AD1848_AUX2 = 4,
AD1848_OUT = 6,
AD1848_LINE_IN = 18,
AD1848_MONO = 26
};
typedef struct ad1848_t {
uint8_t type;
uint8_t index;
@@ -47,6 +55,7 @@ typedef struct ad1848_t {
int16_t out_l;
int16_t out_r;
int8_t cd_vol_reg;
double cd_vol_l;
double cd_vol_r;
int fm_vol_l;
@@ -86,8 +95,9 @@ extern void ad1848_write(uint16_t addr, uint8_t val, void *priv);
extern void ad1848_update(ad1848_t *ad1848);
extern void ad1848_speed_changed(ad1848_t *ad1848);
extern void ad1848_set_cd_audio_channel(void *priv, int channel);
extern void ad1848_filter_cd_audio(int channel, double *buffer, void *priv);
extern void ad1848_filter_aux2(void* priv, double* out_l, double* out_r);
extern void ad1848_filter_channel(void* priv, int channel, double* out_l, double* out_r);
extern void ad1848_init(ad1848_t *ad1848, uint8_t type);

View File

@@ -203,9 +203,11 @@ extern const device_t es1373_onboard_device;
extern const device_t ct5880_device;
extern const device_t ct5880_onboard_device;
/* Gravis UltraSound and UltraSound Max */
/* Gravis UltraSound family */
extern const device_t gus_device;
extern const device_t gus_v37_device;
extern const device_t gus_max_device;
extern const device_t gus_ace_device;
/* IBM PS/1 Audio Card */
extern const device_t ps1snd_device;

View File

@@ -305,7 +305,8 @@ machine_at_portableiii_init(const machine_t *model)
}
int
machine_at_grid1520_init(const machine_t *model) {
machine_at_grid1520_init(const machine_t *model)
{
int ret = 0;
ret = bios_load_linear("roms/machines/grid1520/grid1520_891025.rom",
@@ -329,7 +330,8 @@ machine_at_grid1520_init(const machine_t *model) {
}
int
machine_at_mpfpc900_init(const machine_t *model) {
machine_at_pc900_init(const machine_t *model)
{
int ret = 0;
ret = bios_load_linear("roms/machines/pc900/mpf_pc900_v207a.bin",
@@ -734,6 +736,28 @@ machine_at_tg286m_init(const machine_t *model)
return ret;
}
int
machine_at_px286_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/px286/KENITEC.BIN",
0x000f0000, 65536, 0);
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
if (fdc_current[0] == FDC_INTERNAL)
device_add(&fdc_at_device);
device_add(&neat_device);
return ret;
}
// TODO
// Onboard Paradise PVGA1A-JK VGA Graphics
// Data Technology Corporation DTC7187 RLL Controller (Optional)
@@ -814,28 +838,6 @@ machine_at_3302_init(const machine_t *model)
return ret;
}
int
machine_at_px286_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/px286/KENITEC.BIN",
0x000f0000, 65536, 0);
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
if (fdc_current[0] == FDC_INTERNAL)
device_add(&fdc_at_device);
device_add(&neat_device);
return ret;
}
/* SCAMP */
int
machine_at_pc7286_init(const machine_t *model)

View File

@@ -162,28 +162,6 @@ machine_at_pbl300sx_init(const machine_t *model)
}
/* ALi M1217 */
int
machine_at_arb1374_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/arb1374/1374s.rom",
0x000f0000, 65536, 0);
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
device_add(&ali1217_device);
device_add(&ide_isa_device);
device_add_params(&w83877_device, (void *) (W83877F | W83877_3F0 | W83XX7_IDE_PRI));
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
return ret;
}
int
machine_at_sbc350a_init(const machine_t *model)
{
@@ -206,6 +184,28 @@ machine_at_sbc350a_init(const machine_t *model)
return ret;
}
int
machine_at_arb1374_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/arb1374/1374s.rom",
0x000f0000, 65536, 0);
if (bios_only || !ret)
return ret;
machine_at_common_init(model);
device_add(&ali1217_device);
device_add(&ide_isa_device);
device_add_params(&w83877_device, (void *) (W83877F | W83877_3F0 | W83XX7_IDE_PRI));
device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params);
return ret;
}
int
machine_at_flytech386_init(const machine_t *model)
{

View File

@@ -348,17 +348,57 @@ machine_at_bf6_init(const machine_t *model)
return ret;
}
static const device_config_t bx6_config[] = {
// clang-format off
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "bx6",
.default_int = 0,
.file_filter = "",
.spinner = { 0 },
.bios = {
{ .name = "1998/07/28 - BIOS EG", .internal_name = "bx6", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/bx6/BX6_EG.BIN", "" } },
{ .name = "2000/03/10 - BIOS QS", .internal_name = "bx6_qs", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/bx6/BX6_QS.bin", "" } },
{ .files_no = 0 }
},
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};
const device_t bx6_device = {
.name = "ABIT BX6",
.internal_name = "bx6_device",
.flags = 0,
.local = 0,
.init = NULL,
.close = NULL,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = bx6_config
};
int
machine_at_bx6_init(const machine_t *model)
{
int ret;
int ret = 0;
const char* fn;
ret = bios_load_linear("roms/machines/bx6/BX6_EG.BIN",
0x000e0000, 131072, 0);
if (bios_only || !ret)
/* No ROMs available */
if (!device_available(model->device))
return ret;
device_context(model->device);
fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0);
ret = bios_load_linear(fn, 0x000e0000, 131072, 0);
device_context_restore();
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
@@ -519,17 +559,61 @@ machine_at_686bx_init(const machine_t *model)
return ret;
}
static const device_config_t ms6119_config[] = {
// clang-format off
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "ms6119",
.default_int = 0,
.file_filter = "",
.spinner = { 0 },
.bios = {
{ .name = "Award Modular BIOS v4.51PG - Version 3.30b1 (LG IBM Multinet i x7G)", .internal_name = "lgibmx7g", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/ms6119.331", "" } },
{ .name = "Award Modular BIOS v4.51PG - Version 2.12 (Viglen Vig69M)", .internal_name = "vig69m", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/vig69m.212", "" } },
{ .name = "Award Modular BIOS v4.51PG - Version 2.10", .internal_name = "ms6119", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/w6119ims.2a0", "" } },
{ .name = "AMIBIOS 071595 - Version 1.90 (Packard Bell Tacoma)", .internal_name = "tacoma", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/A19P2190.ROM", "" } },
{ .files_no = 0 }
},
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};
const device_t ms6119_device = {
.name = "MSI MS-6119",
.internal_name = "ms6119_device",
.flags = 0,
.local = 0,
.init = NULL,
.close = NULL,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = ms6119_config
};
int
machine_at_lgibmx7g_init(const machine_t *model)
machine_at_ms6119_init(const machine_t *model)
{
int ret;
int ret = 0;
const char* fn;
ret = bios_load_linear("roms/machines/lgibmx7g/ms6119.331",
0x000c0000, 262144, 0);
if (bios_only || !ret)
/* No ROMs available */
if (!device_available(model->device))
return ret;
device_context(model->device);
fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0);
ret = bios_load_linear(fn, 0x000c0000, 262144, 0);
device_context_restore();
machine_at_common_init_ex(model, 2);
pci_init(PCI_CONFIG_TYPE_1);
@@ -545,7 +629,7 @@ machine_at_lgibmx7g_init(const machine_t *model)
device_add_params(&w83977_device, (void *) (W83977TF | W83977_AMI | W83977_NO_NVR));
device_add(&winbond_flash_w29c020_device);
spd_register(SPD_TYPE_SDRAM, 0x7, 256);
return ret;
}

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@ msgstr ""
msgid "&Right CTRL is left ALT"
msgstr ""
msgid "&Hard Reset..."
msgid "&Hard reset"
msgstr ""
msgid "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr ""
msgid "R&emember size && position"
msgstr ""
msgid "Remember size && position"
msgstr ""
msgid "Re&nderer"
msgstr ""
@@ -1074,6 +1077,12 @@ msgstr ""
msgid "Start"
msgstr ""
msgid "&Force shutdown"
msgstr ""
msgid "&Start"
msgstr ""
msgid "Not running"
msgstr ""
@@ -2136,6 +2145,9 @@ msgstr ""
msgid "Enable Game port"
msgstr ""
msgid "Enable Adlib ports"
msgstr ""
msgid "SID Model"
msgstr ""

View File

@@ -15,7 +15,7 @@ msgstr "&Klávesnice vyžaduje záběr myši"
msgid "&Right CTRL is left ALT"
msgstr "&Pravý Ctrl je levý Alt"
msgid "&Hard Reset..."
msgid "&Hard reset"
msgstr "&Resetovat"
msgid "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Měnitelná velikost okna"
msgid "R&emember size && position"
msgstr "&Pamatovat velikost a pozici"
msgid "Remember size && position"
msgstr "Pamatovat velikost a pozici"
msgid "Re&nderer"
msgstr "&Renderer"
@@ -1074,6 +1077,12 @@ msgstr "Vynutit vypnutí"
msgid "Start"
msgstr "Spustit"
msgid "&Force shutdown"
msgstr "&Vynutit vypnutí"
msgid "&Start"
msgstr "&Spustit"
msgid "Not running"
msgstr "Neběží"
@@ -2136,6 +2145,9 @@ msgstr "Nízký DMA kanál"
msgid "Enable Game port"
msgstr "Povolit herní port"
msgid "Enable Adlib ports"
msgstr "Povolit porty Adlib"
msgid "SID Model"
msgstr "Model SID"
@@ -2968,16 +2980,16 @@ msgid "EDID file \"%ls\" is too large."
msgstr "Soubor EDID \"%ls\" je příliš velký."
msgid "OpenGL input scale"
msgstr "Vstupní měřítko OpenGL"
msgstr "Měřítko vstupu OpenGL"
msgid "OpenGL input stretch mode"
msgstr "režim roztažení vstupu OpenGL"
msgstr "Režim roztažení vstupu OpenGL"
msgid "Color scheme"
msgstr "Barevné schéma"
msgid "Light"
msgstr "Světlo"
msgstr "Světlé"
msgid "Dark"
msgstr "Tmavá"
msgstr "Tmavé"

View File

@@ -15,8 +15,8 @@ msgstr "&Tastatur benötigt das Einfangen des Mauszeigers"
msgid "&Right CTRL is left ALT"
msgstr "&Die rechte Strg-Taste ist die linke Alt-Taste"
msgid "&Hard Reset..."
msgstr "&Kaltstart..."
msgid "&Hard reset"
msgstr "&Kaltstart"
msgid "&Ctrl+Alt+Del"
msgstr "&Strg+Alt+Entf"
@@ -51,6 +51,9 @@ msgstr "G&rößenverstellbares Fenster"
msgid "R&emember size && position"
msgstr "Größe && &Position merken"
msgid "Remember size && position"
msgstr "Größe && Position merken"
msgid "Re&nderer"
msgstr "Re&nderer"
@@ -1074,6 +1077,12 @@ msgstr "Abschaltung erzwingen"
msgid "Start"
msgstr "Einschalten"
msgid "&Force shutdown"
msgstr "&Abschaltung erzwingen"
msgid "&Start"
msgstr "&Einschalten"
msgid "Not running"
msgstr "Läuft nicht"
@@ -2136,6 +2145,9 @@ msgstr "Niedrige DMA"
msgid "Enable Game port"
msgstr "Game-Port einschalten"
msgid "Enable Adlib ports"
msgstr "Adlib-Ports einschalten"
msgid "SID Model"
msgstr "SID-Modell"

View File

@@ -15,8 +15,8 @@ msgstr "&Teclado requiere captura"
msgid "&Right CTRL is left ALT"
msgstr "CTRL &derecho es ALT izquierdo"
msgid "&Hard Reset..."
msgstr "&Hard Reset..."
msgid "&Hard reset"
msgstr "&Hard reset"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "Ven&tana redimensionable"
msgid "R&emember size && position"
msgstr "&Recordar tamaño y posición"
msgid "Remember size && position"
msgstr "Recordar tamaño y posición"
msgid "Re&nderer"
msgstr "Re&nderizador"
@@ -1074,6 +1077,12 @@ msgstr "Apagqar forzadamente"
msgid "Start"
msgstr "Iniciar"
msgid "&Force shutdown"
msgstr "&Apagqar forzadamente"
msgid "&Start"
msgstr "&Iniciar"
msgid "Not running"
msgstr "No en ejecución"
@@ -2136,6 +2145,9 @@ msgstr "DMA bajo"
msgid "Enable Game port"
msgstr "Habilitar puerto de juegos"
msgid "Enable Adlib ports"
msgstr "Habilitar puertos Adlib"
msgid "SID Model"
msgstr "Modelo de SID"

View File

@@ -15,8 +15,8 @@ msgstr "&Vaadi näppäimistön kaappaus"
msgid "&Right CTRL is left ALT"
msgstr "&Oikea CTRL on vasen ALT"
msgid "&Hard Reset..."
msgstr "&Uudelleenkäynnistys (kylmä)..."
msgid "&Hard reset"
msgstr "&Uudelleenkäynnistys (kylmä)"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Salli koon muuttaminen"
msgid "R&emember size && position"
msgstr "&Muista koko ja sijainti"
msgid "Remember size && position"
msgstr "Muista koko ja sijainti"
msgid "Re&nderer"
msgstr "&Renderöijä"
@@ -1074,6 +1077,12 @@ msgstr "Pakota sammutus"
msgid "Start"
msgstr "Käynnistä"
msgid "&Force shutdown"
msgstr "&Pakota sammutus"
msgid "&Start"
msgstr "&Käynnistä"
msgid "Not running"
msgstr "Ei käynnissä"
@@ -1318,7 +1327,7 @@ msgid "Found %1"
msgstr "%1 löydetty"
msgid "System"
msgstr "Kone"
msgstr "Järjestelmä"
msgid "Storage"
msgstr "Tallennus"
@@ -2136,6 +2145,9 @@ msgstr "Matala DMA"
msgid "Enable Game port"
msgstr "Peliportti"
msgid "Enable Adlib ports"
msgstr "Adlib-portit"
msgid "SID Model"
msgstr "SID-malli"
@@ -2956,10 +2968,10 @@ msgid "CGA composite settings"
msgstr "CGA:n komposiittiasetukset"
msgid "Monitor EDID"
msgstr "Monitorin EDID"
msgstr "Näytön EDID"
msgid "Export..."
msgstr "Vie..."
msgstr "Vie..."
msgid "Export EDID"
msgstr "Vie EDID"
@@ -2968,16 +2980,16 @@ msgid "EDID file \"%ls\" is too large."
msgstr "EDID-tiedosto \"%ls\" on liian suuri."
msgid "OpenGL input scale"
msgstr "OpenGL:n syöttöasteikko"
msgstr "OpenGL-syötteen skaalaus"
msgid "OpenGL input stretch mode"
msgstr "OpenGL:n syötteen venytystila"
msgstr "OpenGL-syötteen venytystila"
msgid "Color scheme"
msgstr "Värimaailma"
msgstr "Väriteema"
msgid "Light"
msgstr "Valo"
msgstr "Vaalea"
msgid "Dark"
msgstr "Tumma"

View File

@@ -15,8 +15,8 @@ msgstr "C&apturer le clavier"
msgid "&Right CTRL is left ALT"
msgstr "CTRL &Droite devient ALT Gauche"
msgid "&Hard Reset..."
msgstr "&Hard Reset..."
msgid "&Hard reset"
msgstr "&Hard reset"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Suppr"
@@ -51,6 +51,9 @@ msgstr "Fenêtre &redimensionnable"
msgid "R&emember size && position"
msgstr "S&auvegarder taille && position"
msgid "Remember size && position"
msgstr "Sauvegarder taille && position"
msgid "Re&nderer"
msgstr "Moteur de re&ndu vidéo"
@@ -1074,6 +1077,12 @@ msgstr "Arrêt forcé"
msgid "Start"
msgstr "Démarrer"
msgid "&Force shutdown"
msgstr "&Arrêt forcé"
msgid "&Start"
msgstr "&Démarrer"
msgid "Not running"
msgstr "Inactive"
@@ -2136,6 +2145,9 @@ msgstr "DMA bas"
msgid "Enable Game port"
msgstr "Activer le port de jeu"
msgid "Enable Adlib ports"
msgstr "Activer les ports Adlib"
msgid "SID Model"
msgstr "Modèle SID"

View File

@@ -15,8 +15,8 @@ msgstr "&Tipkovnica zahtijeva hvatanje miša"
msgid "&Right CTRL is left ALT"
msgstr "&Desni CTRL je lijevi ALT"
msgid "&Hard Reset..."
msgstr "&Ponovno pokretanje..."
msgid "&Hard reset"
msgstr "&Ponovno pokretanje"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Prozor s promjenjivim veličinama"
msgid "R&emember size && position"
msgstr "&Zapamtite veličinu i položaj"
msgid "Remember size && position"
msgstr "Zapamtite veličinu i položaj"
msgid "Re&nderer"
msgstr "&Renderer"
@@ -1074,6 +1077,12 @@ msgstr "Prisilno isključi"
msgid "Start"
msgstr "Pokreni"
msgid "&Force shutdown"
msgstr "Prisilno &isključi"
msgid "&Start"
msgstr "&Pokreni"
msgid "Not running"
msgstr "Se ne pokreće"
@@ -2136,6 +2145,9 @@ msgstr "Niski DMA"
msgid "Enable Game port"
msgstr "Omogoći vrata za igru"
msgid "Enable Adlib ports"
msgstr "Omogući Adlib portove"
msgid "SID Model"
msgstr "Model SID-a"

View File

@@ -15,8 +15,8 @@ msgstr "&Tastiera richiede la cattura"
msgid "&Right CTRL is left ALT"
msgstr "CTRL &destro è ALT sinistro"
msgid "&Hard Reset..."
msgstr "&Riavvia..."
msgid "&Hard reset"
msgstr "&Riavvia"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Canc"
@@ -51,6 +51,9 @@ msgstr "&Finestra ridimensionabile"
msgid "R&emember size && position"
msgstr "R&icorda dimensioni e posizione"
msgid "Remember size && position"
msgstr "Ricorda dimensioni e posizione"
msgid "Re&nderer"
msgstr "Re&nderizzatore"
@@ -1074,6 +1077,12 @@ msgstr "Forza arresto"
msgid "Start"
msgstr "Avvia"
msgid "&Force shutdown"
msgstr "&Forza arresto"
msgid "&Start"
msgstr "&Avvia"
msgid "Not running"
msgstr "Inattivo"
@@ -2136,6 +2145,9 @@ msgstr "DMA basso"
msgid "Enable Game port"
msgstr "Abilita la porta giochi"
msgid "Enable Adlib ports"
msgstr "Abilita porte Adlib"
msgid "SID Model"
msgstr "Modello SID"

View File

@@ -15,8 +15,8 @@ msgstr "キーボードはキャプチャが必要(&K)"
msgid "&Right CTRL is left ALT"
msgstr "右CTRLを左ALTへ変換(&R)"
msgid "&Hard Reset..."
msgstr "ハード リセット(&H)..."
msgid "&Hard reset"
msgstr "ハード リセット(&H)"
msgid "&Ctrl+Alt+Del"
msgstr "Ctrl+Alt+Del(&C)"
@@ -51,6 +51,9 @@ msgstr "ウィンドウのサイズを変更可能(&R)"
msgid "R&emember size && position"
msgstr "ウィンドウのサイズと位置を保存(&E)"
msgid "Remember size && position"
msgstr "ウィンドウのサイズと位置を保存"
msgid "Re&nderer"
msgstr "レンダラー(&N)"
@@ -1074,6 +1077,12 @@ msgstr "強制終了"
msgid "Start"
msgstr "スタート"
msgid "&Force shutdown"
msgstr "強制終了(&F)"
msgid "&Start"
msgstr "スタート(&S)"
msgid "Not running"
msgstr "停止した"
@@ -2136,6 +2145,9 @@ msgstr "低DMA"
msgid "Enable Game port"
msgstr "ゲームポートを有効にする"
msgid "Enable Adlib ports"
msgstr "Adlibポートを有効にする"
msgid "SID Model"
msgstr "SIDモデル"

View File

@@ -15,8 +15,8 @@ msgstr "키보드는 캡쳐가 필요함(&K)"
msgid "&Right CTRL is left ALT"
msgstr "우측CTRL로 좌측ALT 입력(&R)"
msgid "&Hard Reset..."
msgstr "재시작(&H)..."
msgid "&Hard reset"
msgstr "재시작(&H)"
msgid "&Ctrl+Alt+Del"
msgstr "Ctrl+Alt+Del(&C)"
@@ -51,6 +51,9 @@ msgstr "창 크기 조절 가능하게 하기(&R)"
msgid "R&emember size && position"
msgstr "창 크기와 위치를 기억하기(&E)"
msgid "Remember size && position"
msgstr "창 크기와 위치를 기억하기"
msgid "Re&nderer"
msgstr "렌더러(&N)"
@@ -1074,6 +1077,12 @@ msgstr "강제 종료"
msgid "Start"
msgstr "시작"
msgid "&Force shutdown"
msgstr "강제 종료(&F)"
msgid "&Start"
msgstr "시작(&S)"
msgid "Not running"
msgstr "실행 중이 아닙니다"
@@ -2136,6 +2145,9 @@ msgstr "낮은 DMA"
msgid "Enable Game port"
msgstr "게임 포트 사용"
msgid "Enable Adlib ports"
msgstr "Adlib 포트 활성화"
msgid "SID Model"
msgstr "SID 모델"

View File

@@ -15,8 +15,8 @@ msgstr "&Tastatur krever opptak"
msgid "&Right CTRL is left ALT"
msgstr "&Høyre CTRL er venstre ALT"
msgid "&Hard Reset..."
msgstr "&Hard tilbakestilling..."
msgid "&Hard reset"
msgstr "&Hard tilbakestilling"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Justerbart vindu"
msgid "R&emember size && position"
msgstr "H&usk størrelse &og plassering"
msgid "Remember size && position"
msgstr "Husk størrelse og plassering"
msgid "Re&nderer"
msgstr "Re&nderer"
@@ -1074,6 +1077,12 @@ msgstr "Tvangsavslutt"
msgid "Start"
msgstr "Start"
msgid "&Force shutdown"
msgstr "&Tvangsavslutt"
msgid "&Start"
msgstr "&Start"
msgid "Not running"
msgstr "Ikke kjørende"
@@ -2136,6 +2145,9 @@ msgstr "Lav DMA"
msgid "Enable Game port"
msgstr "Aktiver spillport"
msgid "Enable Adlib ports"
msgstr "Aktiver Adlib-porter"
msgid "SID Model"
msgstr "SID-modell"

View File

@@ -15,8 +15,8 @@ msgstr "&Keyboard vereist vastleggen"
msgid "&Right CTRL is left ALT"
msgstr "&Rechtse CTRL is linkse ALT"
msgid "&Hard Reset..."
msgstr "&Harde Reset..."
msgid "&Hard reset"
msgstr "&Harde reset"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Venster met aanpasbare grootte"
msgid "R&emember size && position"
msgstr "&Onthoud grootte && positie"
msgid "Remember size && position"
msgstr "Onthoud grootte && positie"
msgid "Re&nderer"
msgstr "Re&nderer"
@@ -1074,6 +1077,12 @@ msgstr "Forceer afsluiten"
msgid "Start"
msgstr "Start"
msgid "&Force shutdown"
msgstr "&Forceer afsluiten"
msgid "&Start"
msgstr "&Start"
msgid "Not running"
msgstr "Niet actied"
@@ -2136,6 +2145,9 @@ msgstr "Lage DMA"
msgid "Enable Game port"
msgstr "Game-poort inschakelen"
msgid "Enable Adlib ports"
msgstr "Adlib-poorten inschakelen"
msgid "SID Model"
msgstr "SID-model"

View File

@@ -15,8 +15,8 @@ msgstr "&Klawiatura wymaga przechwytu myszy"
msgid "&Right CTRL is left ALT"
msgstr "Prawy C&TRL to lewy ALT"
msgid "&Hard Reset..."
msgstr "Twardy &reset..."
msgid "&Hard reset"
msgstr "Twardy &reset"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Okno o zmiennym rozmiarze"
msgid "R&emember size && position"
msgstr "P&amiętaj rozmiar i pozycję"
msgid "Remember size && position"
msgstr "Pamiętaj rozmiar i pozycję"
msgid "Re&nderer"
msgstr "Re&nderer"
@@ -1074,6 +1077,12 @@ msgstr "Wymuś zamknięcie"
msgid "Start"
msgstr "Uruchom"
msgid "&Force shutdown"
msgstr "&Wymuś zamknięcie"
msgid "&Start"
msgstr "&Uruchom"
msgid "Not running"
msgstr "Wyłączona"
@@ -2136,6 +2145,9 @@ msgstr "Niski poziom DMA"
msgid "Enable Game port"
msgstr "Włącz port gier"
msgid "Enable Adlib ports"
msgstr "Włącz porty Adlib"
msgid "SID Model"
msgstr "Model SID"

View File

@@ -15,8 +15,8 @@ msgstr "O &teclado requer captura"
msgid "&Right CTRL is left ALT"
msgstr "CTR&L direito é o ALT esquerdo"
msgid "&Hard Reset..."
msgstr "&Reinicialização completa..."
msgid "&Hard reset"
msgstr "&Reinicialização completa"
msgid "&Ctrl+Alt+Del"
msgstr "Ctrl+Alt+&Del"
@@ -51,6 +51,9 @@ msgstr "&Janela redimensionável"
msgid "R&emember size && position"
msgstr "&Lembrar tamanho e posição"
msgid "Remember size && position"
msgstr "Lembrar tamanho e posição"
msgid "Re&nderer"
msgstr "&Renderizador"
@@ -1074,6 +1077,12 @@ msgstr "Forçar desligamento"
msgid "Start"
msgstr "Iniciar"
msgid "&Force shutdown"
msgstr "&Forçar desligamento"
msgid "&Start"
msgstr "&Iniciar"
msgid "Not running"
msgstr "Parado"
@@ -2136,6 +2145,9 @@ msgstr "DMA baixo"
msgid "Enable Game port"
msgstr "Ativar a porta do jogo"
msgid "Enable Adlib ports"
msgstr "Ativar portas Adlib"
msgid "SID Model"
msgstr "Modelo do SID"

View File

@@ -15,8 +15,8 @@ msgstr "&Teclado requere captura"
msgid "&Right CTRL is left ALT"
msgstr "CTRL &direito é ALT esquerdo"
msgid "&Hard Reset..."
msgstr "&Reinicialização completa..."
msgid "&Hard reset"
msgstr "&Reinicialização completa"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Janela redimensionável"
msgid "R&emember size && position"
msgstr "&Lembrar tamanho e posição"
msgid "Remember size && position"
msgstr "Lembrar tamanho e posição"
msgid "Re&nderer"
msgstr "&Renderizador"
@@ -1074,6 +1077,12 @@ msgstr "Desligamento forçado"
msgid "Start"
msgstr "Iniciar"
msgid "&Force shutdown"
msgstr "&Desligamento forçado"
msgid "&Start"
msgstr "&Iniciar"
msgid "Not running"
msgstr "Não em execução"
@@ -2136,6 +2145,9 @@ msgstr "DMA baixo"
msgid "Enable Game port"
msgstr "Ativar a porta de jogos"
msgid "Enable Adlib ports"
msgstr "Ativar portas Adlib"
msgid "SID Model"
msgstr "Modelo do SID"

View File

@@ -15,8 +15,8 @@ msgstr "&Клавиатура требует захвата"
msgid "&Right CTRL is left ALT"
msgstr "&Правый CTRL - это левый ALT"
msgid "&Hard Reset..."
msgstr "&Холодная перезагрузка..."
msgid "&Hard reset"
msgstr "&Холодная перезагрузка"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Изменяемый размер окна"
msgid "R&emember size && position"
msgstr "&Запомнить размер и положение"
msgid "Remember size && position"
msgstr "Запомнить размер и положение"
msgid "Re&nderer"
msgstr "&Рендеринг"
@@ -1074,6 +1077,12 @@ msgstr "Принудительное завершение работы"
msgid "Start"
msgstr "Пуск"
msgid "&Force shutdown"
msgstr "Принудительное &завершение работы"
msgid "&Start"
msgstr "&Пуск"
msgid "Not running"
msgstr "Не работает"
@@ -2136,6 +2145,9 @@ msgstr "Низкий DMA"
msgid "Enable Game port"
msgstr "Включить игровой порт"
msgid "Enable Adlib ports"
msgstr "Включить порты Adlib"
msgid "SID Model"
msgstr "Модель SID"

View File

@@ -15,7 +15,7 @@ msgstr "&Klávesnica vyžaduje záber"
msgid "&Right CTRL is left ALT"
msgstr "&Pravý Ctrl je ľavý Alt"
msgid "&Hard Reset..."
msgid "&Hard reset"
msgstr "&Resetovať"
msgid "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Premenná veľkosť okna"
msgid "R&emember size && position"
msgstr "&Pamätať si veľkosť a polohu"
msgid "Remember size && position"
msgstr "Pamätať si veľkosť a polohu"
msgid "Re&nderer"
msgstr "&Renderer"
@@ -1074,6 +1077,12 @@ msgstr "Vynútiť vypnutie"
msgid "Start"
msgstr "Spustiť"
msgid "&Force shutdown"
msgstr "&Vynútiť vypnutie"
msgid "&Start"
msgstr "&Spustiť"
msgid "Not running"
msgstr "Nebeží"
@@ -2136,6 +2145,9 @@ msgstr "Nízka hodnota DMA"
msgid "Enable Game port"
msgstr "Povolenie herného portu"
msgid "Enable Adlib ports"
msgstr "Povoliť porty Adlib"
msgid "SID Model"
msgstr "Model SID"

View File

@@ -15,8 +15,8 @@ msgstr "&Tipkovnica potrebuje zajem"
msgid "&Right CTRL is left ALT"
msgstr "&Desni CTRL je levi ALT"
msgid "&Hard Reset..."
msgstr "&Ponovni zagon..."
msgid "&Hard reset"
msgstr "&Ponovni zagon"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "S&premenljiva velikost okna"
msgid "R&emember size && position"
msgstr "&Zapomni si velikost in položaj"
msgid "Remember size && position"
msgstr "Zapomni si velikost in položaj"
msgid "Re&nderer"
msgstr "&Upodabljanje"
@@ -1074,6 +1077,12 @@ msgstr "Prisilno prekini"
msgid "Start"
msgstr "Zaženi"
msgid "&Force shutdown"
msgstr "&Prisilno prekini"
msgid "&Start"
msgstr "&Zaženi"
msgid "Not running"
msgstr "Se ne izvaja"
@@ -2136,6 +2145,9 @@ msgstr "Nizki DMA"
msgid "Enable Game port"
msgstr "Omogočanje igralnih vrat"
msgid "Enable Adlib ports"
msgstr "Omogoči vrata Adlib"
msgid "SID Model"
msgstr "Model SID-a"

View File

@@ -15,8 +15,8 @@ msgstr "&Tangentbord behöver uppfångas"
msgid "&Right CTRL is left ALT"
msgstr "&Höger CTRL är vänster ALT"
msgid "&Hard Reset..."
msgstr "&Hård omstart..."
msgid "&Hard reset"
msgstr "&Hård omstart"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Ändringsbar fönsterstorlek"
msgid "R&emember size && position"
msgstr "K&om ihåg storlek && position"
msgid "Remember size && position"
msgstr "Kom ihåg storlek && position"
msgid "Re&nderer"
msgstr "Re&nderare"
@@ -1074,6 +1077,12 @@ msgstr "Tvinga avstängning"
msgid "Start"
msgstr "Starta"
msgid "&Force shutdown"
msgstr "&Tvinga avstängning"
msgid "&Start"
msgstr "&Starta"
msgid "Not running"
msgstr "Körs ej"
@@ -2136,6 +2145,9 @@ msgstr "Låg DMA"
msgid "Enable Game port"
msgstr "Aktivera spelport"
msgid "Enable Adlib ports"
msgstr "Aktivera Adlib-portar"
msgid "SID Model"
msgstr "SID-modell"

View File

@@ -15,8 +15,8 @@ msgstr "&Klavye sadece fare yakalandığında çalışsın"
msgid "&Right CTRL is left ALT"
msgstr "&Sağ CTRL tuşunu sol ALT tuşu olarak ayarla"
msgid "&Hard Reset..."
msgstr "Yeniden başlamaya &zorla..."
msgid "&Hard reset"
msgstr "Yeniden başlamaya &zorla"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Boyutlandırılabilir pencere"
msgid "R&emember size && position"
msgstr "&Pencere boyut ve pozisyonunu kaydet"
msgid "Remember size && position"
msgstr "Pencere boyut ve pozisyonunu kaydet"
msgid "Re&nderer"
msgstr "Derley&ici"
@@ -1074,6 +1077,12 @@ msgstr "Kapatmaya zorla"
msgid "Start"
msgstr "Başlat"
msgid "&Force shutdown"
msgstr "&Kapatmaya zorla"
msgid "&Start"
msgstr "&Başlat"
msgid "Not running"
msgstr "Çalışmıyor"
@@ -2136,6 +2145,9 @@ msgstr "Düşük DMA"
msgid "Enable Game port"
msgstr "Gameport'ı etkinleştir"
msgid "Enable Adlib ports"
msgstr "Adlib bağlantı noktalarını etkinleştir"
msgid "SID Model"
msgstr "SID Modeli"

View File

@@ -15,8 +15,8 @@ msgstr "&Клавіатура потребує захвату"
msgid "&Right CTRL is left ALT"
msgstr "&Правий CTRL - це лівий ALT"
msgid "&Hard Reset..."
msgstr "&Холодне перезавантаження..."
msgid "&Hard reset"
msgstr "&Холодне перезавантаження"
msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "&Змінний розмір вікна"
msgid "R&emember size && position"
msgstr "&Запам'ятати розмір і становище"
msgid "Remember size && position"
msgstr "Запам'ятати розмір і становище"
msgid "Re&nderer"
msgstr "&Рендеринг"
@@ -1074,6 +1077,12 @@ msgstr "Примусове завершення роботи"
msgid "Start"
msgstr "Пуск"
msgid "&Force shutdown"
msgstr "Примусове &завершення роботи"
msgid "&Start"
msgstr "&Пуск"
msgid "Not running"
msgstr "Не працює"
@@ -2136,6 +2145,9 @@ msgstr "Низький рівень DMA"
msgid "Enable Game port"
msgstr "Увімкнути ігровий порт"
msgid "Enable Adlib ports"
msgstr "Увімкнути порти Adlib"
msgid "SID Model"
msgstr "Модель SID"

View File

@@ -15,7 +15,7 @@ msgstr "Bàn phím &hoạt động cần 'bắt' chuột"
msgid "&Right CTRL is left ALT"
msgstr "Gắn ALT trái vào CTRL ph&ải"
msgid "&Hard Reset..."
msgid "&Hard reset"
msgstr "Buộc khởi độn&g lại"
msgid "&Ctrl+Alt+Del"
@@ -51,6 +51,9 @@ msgstr "Tùy chỉnh cỡ cử&a sổ"
msgid "R&emember size && position"
msgstr "Ghi nhớ vị trí và kíc&h thước cửa sổ"
msgid "Remember size && position"
msgstr "Ghi nhớ vị trí và kích thước cửa sổ"
msgid "Re&nderer"
msgstr "Re&nderer"
@@ -1074,6 +1077,12 @@ msgstr "Buộc tắt nguồn máy"
msgid "Start"
msgstr "Khởi động"
msgid "&Force shutdown"
msgstr "&Buộc tắt nguồn máy"
msgid "&Start"
msgstr "&Khởi động"
msgid "Not running"
msgstr "Đang không chạy"
@@ -2136,6 +2145,9 @@ msgstr "DMA thấp"
msgid "Enable Game port"
msgstr "Bật cổng trò chơi"
msgid "Enable Adlib ports"
msgstr "Bật cổng Adlib"
msgid "SID Model"
msgstr "Mẫu SID"

View File

@@ -15,8 +15,8 @@ msgstr "键盘需要捕捉(&K)"
msgid "&Right CTRL is left ALT"
msgstr "将右 CTRL 键映射为左 ALT 键(&R)"
msgid "&Hard Reset..."
msgstr "硬重置(&H)..."
msgid "&Hard reset"
msgstr "硬重置(&H)"
msgid "&Ctrl+Alt+Del"
msgstr "Ctrl+Alt+Del(&C)"
@@ -51,6 +51,9 @@ msgstr "窗口大小可调(&R)"
msgid "R&emember size && position"
msgstr "记住窗口大小和位置(&E)"
msgid "Remember size && position"
msgstr "记住窗口大小和位置"
msgid "Re&nderer"
msgstr "渲染器(&N)"
@@ -1074,6 +1077,12 @@ msgstr "强制关机"
msgid "Start"
msgstr "启动"
msgid "&Force shutdown"
msgstr "强制关机(&F)"
msgid "&Start"
msgstr "启动(&S)"
msgid "Not running"
msgstr "未在运行"
@@ -2136,6 +2145,9 @@ msgstr "低 DMA"
msgid "Enable Game port"
msgstr "启用游戏端口"
msgid "Enable Adlib ports"
msgstr "启用 Adlib 端口"
msgid "SID Model"
msgstr "SID 芯片型号"

View File

@@ -15,8 +15,8 @@ msgstr "鍵盤需要捕捉(&K)"
msgid "&Right CTRL is left ALT"
msgstr "將右 CTRL 鍵映射為左 ALT 鍵(&R)"
msgid "&Hard Reset..."
msgstr "硬重設(&H)..."
msgid "&Hard reset"
msgstr "硬重設(&H)"
msgid "&Ctrl+Alt+Del"
msgstr "Ctrl+Alt+Del(&C)"
@@ -51,6 +51,9 @@ msgstr "視窗大小可調(&R)"
msgid "R&emember size && position"
msgstr "記住視窗大小和位置(&E)"
msgid "Remember size && position"
msgstr "記住視窗大小和位置"
msgid "Re&nderer"
msgstr "渲染器(&N)"
@@ -1074,6 +1077,12 @@ msgstr "強制關機"
msgid "Start"
msgstr "開始"
msgid "&Force shutdown"
msgstr "強制關機(&F)"
msgid "&Start"
msgstr "開始(&S)"
msgid "Not running"
msgstr "未執行"
@@ -2136,6 +2145,9 @@ msgstr "低 DMA"
msgid "Enable Game port"
msgstr "啟用遊戲埠"
msgid "Enable Adlib ports"
msgstr "啟用 Adlib 連接埠"
msgid "SID Model"
msgstr "SID 型號"

View File

@@ -204,7 +204,11 @@ MainWindow::MainWindow(QWidget *parent)
frameRateTimer->setInterval(1000);
frameRateTimer->setSingleShot(false);
connect(frameRateTimer, &QTimer::timeout, [hertz_label] {
hertz_label->setText(tr("%1 Hz").arg(QString::number(monitors[0].mon_actualrenderedframes.load()) + (monitors[0].mon_interlace ? "i" : "")));
auto hz = monitors[0].mon_actualrenderedframes.load();
#ifdef SCREENSHOT_MODE
hz = ((hz + 2) / 5) * 5;
#endif
hertz_label->setText(tr("%1 Hz").arg(QString::number(hz) + (monitors[0].mon_interlace ? "i" : "")));
});
statusBar()->addPermanentWidget(hertz_label);
frameRateTimer->start(1000);

View File

@@ -348,7 +348,7 @@
<normaloff>:/menuicons/qt/icons/hard_reset.ico</normaloff>:/menuicons/qt/icons/hard_reset.ico</iconset>
</property>
<property name="text">
<string>&amp;Hard Reset...</string>
<string>&amp;Hard reset</string>
</property>
<property name="iconVisibleInMenu">
<bool>false</bool>

View File

@@ -161,7 +161,8 @@ VMManagerDetailSection::setupMainLayout()
void
VMManagerDetailSection::setSections()
{
int row = 0;
int row = 0;
bool empty = true;
for (const auto& section : sections) {
QStringList sectionsToAdd = section.value.split(sectionSeparator);
@@ -189,12 +190,13 @@ VMManagerDetailSection::setSections()
const auto hSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
frameGridLayout->addItem(hSpacer, row, 2);
empty = false;
row++;
}
}
collapseButton->setContent(ui->detailFrame);
if (sections.size())
if (!empty)
setVisible(true);
}
void

View File

@@ -109,6 +109,53 @@ VMManagerMain::VMManagerMain(QWidget *parent) :
if (indexAt.isValid()) {
QMenu contextMenu(tr("Context Menu"), ui->listView);
QAction startAction(tr("&Start"));
contextMenu.addAction(&startAction);
connect(&startAction, &QAction::triggered, [this] {
selected_sysconfig->startButtonPressed();
});
startAction.setEnabled(selected_sysconfig->process->state() == QProcess::NotRunning);
startAction.setVisible(selected_sysconfig->process->state() == QProcess::NotRunning);
QAction pauseAction(tr("&Pause"));
contextMenu.addAction(&pauseAction);
connect(&pauseAction, &QAction::triggered, [this] {
selected_sysconfig->pauseButtonPressed();
});
pauseAction.setEnabled(selected_sysconfig->process->state() == QProcess::Running);
pauseAction.setVisible(selected_sysconfig->process->state() == QProcess::Running);
if (selected_sysconfig->getProcessStatus() != VMManagerSystem::ProcessStatus::Running)
pauseAction.setText(tr("Re&sume"));
QAction resetAction(tr("&Hard reset"));
contextMenu.addAction(&resetAction);
connect(&resetAction, &QAction::triggered, [this] {
selected_sysconfig->restartButtonPressed();
});
resetAction.setEnabled(selected_sysconfig->process->state() == QProcess::Running);
QAction forceShutdownAction(tr("&Force shutdown"));
contextMenu.addAction(&forceShutdownAction);
connect(&forceShutdownAction, &QAction::triggered, [this] {
selected_sysconfig->shutdownForceButtonPressed();
});
forceShutdownAction.setEnabled(selected_sysconfig->process->state() == QProcess::Running);
QAction cadAction(tr("&Ctrl+Alt+Del"));
contextMenu.addAction(&cadAction);
connect(&cadAction, &QAction::triggered, [this] {
selected_sysconfig->cadButtonPressed();
});
cadAction.setEnabled(selected_sysconfig->process->state() == QProcess::Running);
contextMenu.addSeparator();
QAction settingsAction(tr("&Settings..."));
contextMenu.addAction(&settingsAction);
connect(&settingsAction, &QAction::triggered, [this] {
selected_sysconfig->launchSettings();
});
QAction nameChangeAction(tr("Change &display name..."));
contextMenu.addAction(&nameChangeAction);
// Use a lambda to call a function so indexAt can be passed
@@ -343,7 +390,7 @@ illegal_chars:
} else {
QMenu contextMenu(tr("Context Menu"), ui->listView);
QAction newMachineAction(tr("New machine..."));
QAction newMachineAction(tr("&New machine..."));
contextMenu.addAction(&newMachineAction);
connect(&newMachineAction, &QAction::triggered, this, &VMManagerMain::newMachineWizard);
@@ -740,6 +787,18 @@ VMManagerMain::machineCountString(QString states) const
return tr("VMs: %1").arg(states);
}
QList<int>
VMManagerMain::getPaneSizes() const
{
return ui->splitter->sizes();
}
void
VMManagerMain::setPaneSizes(const QList<int> &sizes)
{
ui->splitter->setSizes(sizes);
}
void
VMManagerMain::modelDataChange()
{

View File

@@ -87,6 +87,9 @@ public slots:
void onConfigUpdated(const QString &uuid);
int getActiveMachineCount();
QList<int> getPaneSizes() const;
void setPaneSizes(const QList<int> &sizes);
private:
Ui::VMManagerMain *ui;

View File

@@ -135,26 +135,42 @@ VMManagerMainWindow(QWidget *parent)
{
auto config = new VMManagerConfig(VMManagerConfig::ConfigType::General);
this->ui->actionRemember_size_and_position->setChecked(!!config->getStringValue("window_remember").toInt());
if (ui->actionRemember_size_and_position->isChecked()) {
QStringList list = config->getStringValue("window_coordinates").split(',');
for (auto& cur : list) {
cur = cur.trimmed();
}
QRect geom;
geom.setX(list[0].toInt());
geom.setY(list[1].toInt());
geom.setWidth(list[2].toInt());
geom.setHeight(list[3].toInt());
if (!!config->getStringValue("window_remember").toInt()) {
QString coords = config->getStringValue("window_coordinates");
if (!coords.isEmpty()) {
QStringList list = coords.split(',');
for (auto& cur : list) {
cur = cur.trimmed();
}
QRect geom;
geom.setX(list[0].toInt());
geom.setY(list[1].toInt());
geom.setWidth(list[2].toInt());
geom.setHeight(list[3].toInt());
setGeometry(geom);
}
setGeometry(geom);
if (!!config->getStringValue("window_maximized").toInt()) {
setWindowState(windowState() | Qt::WindowMaximized);
}
QString splitter = config->getStringValue("window_splitter");
if (!splitter.isEmpty()) {
QStringList list = splitter.split(',');
for (auto& cur : list) {
cur = cur.trimmed();
}
QList<int> paneSizes;
paneSizes.append(list[0].toInt());
paneSizes.append(list[1].toInt());
vmm->setPaneSizes(paneSizes);
}
} else {
config->setStringValue("window_remember", "");
config->setStringValue("window_coordinates", "");
config->setStringValue("window_maximized", "");
config->setStringValue("window_splitter", "");
}
delete config;
}
@@ -214,14 +230,14 @@ VMManagerMainWindow::saveSettings() const
const auto currentSelection = vmm->getCurrentSelection();
const auto config = new VMManagerConfig(VMManagerConfig::ConfigType::General);
config->setStringValue("last_selection", currentSelection);
config->setStringValue("window_remember", QString::number(ui->actionRemember_size_and_position->isChecked()));
if (ui->actionRemember_size_and_position->isChecked()) {
if (!!config->getStringValue("window_remember").toInt()) {
config->setStringValue("window_coordinates", QString::asprintf("%i, %i, %i, %i", this->geometry().x(), this->geometry().y(), this->geometry().width(), this->geometry().height()));
config->setStringValue("window_maximized", this->isMaximized() ? "1" : "");
config->setStringValue("window_splitter", QString::asprintf("%i, %i", vmm->getPaneSizes()[0], vmm->getPaneSizes()[1]));
} else {
config->setStringValue("window_remember", "");
config->setStringValue("window_coordinates", "");
config->setStringValue("window_maximized", "");
config->setStringValue("window_splitter", "");
}
// Sometimes required to ensure the settings save before the app exits
config->sync();

View File

@@ -28,7 +28,6 @@
<string>&amp;Tools</string>
</property>
<addaction name="actionPreferences"/>
<addaction name="actionRemember_size_and_position"/>
<addaction name="actionCheck_for_updates"/>
</widget>
<widget class="QMenu" name="menuFile">
@@ -99,6 +98,9 @@
<property name="text">
<string>&amp;Start</string>
</property>
<property name="toolTip">
<string>Start</string>
</property>
<property name="iconVisibleInMenu">
<bool>false</bool>
</property>
@@ -109,7 +111,10 @@
<normaloff>:/menuicons/qt/icons/hard_reset.ico</normaloff>:/menuicons/qt/icons/hard_reset.ico</iconset>
</property>
<property name="text">
<string>&amp;Hard Reset...</string>
<string>&amp;Hard reset</string>
</property>
<property name="toolTip">
<string>Hard reset</string>
</property>
<property name="iconVisibleInMenu">
<bool>false</bool>
@@ -168,6 +173,9 @@
<property name="text">
<string>&amp;Settings...</string>
</property>
<property name="toolTip">
<string>Settings...</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
</property>
@@ -187,14 +195,6 @@
<string>New machine...</string>
</property>
</action>
<action name="actionRemember_size_and_position">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>R&amp;emember size &amp;&amp; position</string>
</property>
</action>
<action name="actionPreferences">
<property name="text">
<string>&amp;Preferences...</string>

View File

@@ -70,6 +70,8 @@ VMManagerPreferences(QWidget *parent) : ui(new Ui::VMManagerPreferences)
#endif
const auto useRegexSearch = config->getStringValue("regex_search").toInt();
ui->regexSearchCheckBox->setChecked(useRegexSearch);
const auto rememberSizePosition = config->getStringValue("window_remember").toInt();
ui->rememberSizePositionCheckBox->setChecked(rememberSizePosition);
ui->radioButtonSystem->setChecked(color_scheme == 0);
ui->radioButtonLight->setChecked(color_scheme == 1);
@@ -112,6 +114,7 @@ VMManagerPreferences::accept()
#if EMU_BUILD_NUM != 0
config->setStringValue("update_check", ui->updateCheckBox->isChecked() ? "1" : "0");
#endif
config->setStringValue("window_remember", ui->rememberSizePositionCheckBox->isChecked() ? "1" : "0");
config->setStringValue("regex_search", ui->regexSearchCheckBox->isChecked() ? "1" : "0");
QDialog::accept();
}

View File

@@ -92,6 +92,13 @@
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="rememberSizePositionCheckBox">
<property name="text">
<string>Remember size &amp;&amp; position</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="updateCheckBox">
<property name="text">
@@ -165,6 +172,7 @@
<tabstop>dirSelectButton</tabstop>
<tabstop>comboBoxLanguage</tabstop>
<tabstop>pushButtonLanguage</tabstop>
<tabstop>rememberSizePositionCheckBox</tabstop>
<tabstop>updateCheckBox</tabstop>
<tabstop>regexSearchCheckBox</tabstop>
</tabstops>

View File

@@ -425,6 +425,16 @@ VMManagerSystem::launchMainProcess() {
QStringList args;
args << "--vmpath" << config_dir;
args << "--vmname" << displayName;
if (rom_path[0] != '\0')
args << "--rompath" << QString(rom_path);
if (global_cfg_overridden)
args << "--global" << QString(global_cfg_path);
if (!hook_enabled)
args << "--nohook";
if (start_in_fullscreen)
args << "--fullscreen";
if (!confirm_exit_cmdl)
args << "--noconfirm";
process->setProgram(program);
process->setArguments(args);
qDebug() << Q_FUNC_INFO << " Full Command:" << process->program() << " " << process->arguments();
@@ -481,6 +491,10 @@ VMManagerSystem::launchSettings() {
QStringList open_command_args;
QStringList args;
args << "--vmpath" << config_dir << "--settings";
if (rom_path[0] != '\0')
args << "--rompath" << QString(rom_path);
if (global_cfg_overridden)
args << "--global" << QString(global_cfg_path);
process->setProgram(program);
process->setArguments(args);
qDebug() << Q_FUNC_INFO << " Full Command:" << process->program() << " " << process->arguments();
@@ -711,7 +725,7 @@ VMManagerSystem::setupVars() {
}
static auto floppy_match = QRegularExpression("fdd_\\d\\d_type", QRegularExpression::CaseInsensitiveOption);
static auto cdrom_match = QRegularExpression("cdrom_\\d\\d_type", QRegularExpression::CaseInsensitiveOption);
static auto cdrom_match = QRegularExpression("cdrom_\\d\\d_parameters", QRegularExpression::CaseInsensitiveOption);
for(const auto& key: floppy_cdrom_config.keys()) {
if(key.contains(floppy_match)) {
// auto device_number = key.split("_").at(1);
@@ -727,22 +741,23 @@ VMManagerSystem::setupVars() {
}
if(key.contains(cdrom_match)) {
auto device_number = key.split("_").at(1);
auto cdrom_internal_name = QString(floppy_cdrom_config[key]);
auto cdrom_parameters = QString(floppy_cdrom_config[key]);
auto cdrom_bus = cdrom_parameters.split(",").at(1).trimmed().toUpper();
auto cdrom_type_key = QString("cdrom_%1_type").arg(device_number);
auto cdrom_internal_name = QString(floppy_cdrom_config[cdrom_type_key]);
if (cdrom_internal_name.isEmpty())
cdrom_internal_name = "86cd";
auto cdrom_type = cdrom_get_from_internal_name(cdrom_internal_name.toUtf8().data());
auto cdrom_speed_key = QString("cdrom_%1_speed").arg(device_number);
auto cdrom_parameters_key = QString("cdrom_%1_parameters").arg(device_number);
auto cdrom_speed = QString(floppy_cdrom_config[cdrom_speed_key]);
auto cdrom_parameters = QString(floppy_cdrom_config[cdrom_parameters_key]);
auto cdrom_bus = cdrom_parameters.split(",").at(1).trimmed().toUpper();
if (cdrom_speed.isEmpty())
cdrom_speed = "8";
if(cdrom_type != -1) {
if(!cdrom_speed.isEmpty()) {
cdrom_speed = QString("%1x ").arg(cdrom_speed);
}
if(!cdrom_bus.isEmpty()) {
cdrom_bus = QString(" (%1)").arg(cdrom_bus);
}
if ((cdrom_bus != "NONE") && (cdrom_type != -1)) {
cdrom_speed = QString("%1x ").arg(cdrom_speed);
cdrom_bus = QString(" (%1)").arg(cdrom_bus);
cdromDevices.append(QString("%1%2 %3 %4%5").arg(cdrom_speed, cdrom_drive_types[cdrom_type].vendor, cdrom_drive_types[cdrom_type].model, cdrom_drive_types[cdrom_type].revision, cdrom_bus));
}
}

View File

@@ -501,16 +501,16 @@ readonly_x:
if (updatefreq)
ad1848_updatefreq(ad1848);
temp = (ad1848->type < AD1848_TYPE_CS4231) ? 2 : ((ad1848->type == AD1848_TYPE_CS4231) ? 18 : 4);
if (ad1848->regs[temp] & 0x80)
ad1848->cd_vol_l = 0;
else
ad1848->cd_vol_l = ad1848_vols_5bits_aux_gain[ad1848->regs[temp] & 0x1f];
temp++;
if (ad1848->regs[temp] & 0x80)
ad1848->cd_vol_r = 0;
else
ad1848->cd_vol_r = ad1848_vols_5bits_aux_gain[ad1848->regs[temp] & 0x1f];
if (ad1848->cd_vol_reg > -1) {
if (ad1848->regs[ad1848->cd_vol_reg] & 0x80)
ad1848->cd_vol_l = 0;
else
ad1848->cd_vol_l = ad1848_vols_5bits_aux_gain[ad1848->regs[ad1848->cd_vol_reg] & 0x1f];
if (ad1848->regs[ad1848->cd_vol_reg + 1] & 0x80)
ad1848->cd_vol_r = 0;
else
ad1848->cd_vol_r = ad1848_vols_5bits_aux_gain[ad1848->regs[ad1848->cd_vol_reg + 1] & 0x1f];
}
readonly_i:
ad1848_log("AD1848: write(I%d, %02X)\n", ad1848->index, val);
@@ -746,6 +746,18 @@ ad1848_poll(void *priv)
}
}
void
ad1848_set_cd_audio_channel(void *priv, int channel)
{
ad1848_t *ad1848 = (ad1848_t *) priv;
const int max_channel = (ad1848->type >= AD1848_TYPE_CS4231) ? 31 : 15;
if (channel > max_channel)
channel = max_channel;
ad1848->cd_vol_reg = channel;
}
void
ad1848_filter_cd_audio(int channel, double *buffer, void *priv)
{
@@ -758,20 +770,24 @@ ad1848_filter_cd_audio(int channel, double *buffer, void *priv)
}
void
ad1848_filter_aux2(void *priv, double *out_l, double *out_r)
ad1848_filter_channel(void *priv, int channel, double *out_l, double *out_r)
{
const ad1848_t *ad1848 = (ad1848_t *) priv;
if (ad1848->regs[4] & 0x80) {
const int max_channel = (ad1848->type >= AD1848_TYPE_CS4231) ? 31 : 15;
if (channel > max_channel)
channel = max_channel;
if (ad1848->regs[channel] & 0x80) {
*out_l = 0.0;
} else {
*out_l = ((*out_l) * ad1848_vols_5bits_aux_gain[ad1848->regs[4] & 0x1f]) / 65536.0;
*out_l = ((*out_l) * ad1848_vols_5bits_aux_gain[ad1848->regs[channel] & 0x1f]) / 65536.0;
}
if (ad1848->regs[5] & 0x80) {
if (ad1848->regs[channel + 1] & 0x80) {
*out_r = 0.0;
} else {
*out_r = ((*out_r) * ad1848_vols_5bits_aux_gain[ad1848->regs[5] & 0x1f]) / 65536.0;
*out_r = ((*out_r) * ad1848_vols_5bits_aux_gain[ad1848->regs[channel + 1] & 0x1f]) / 65536.0;
}
}
@@ -837,6 +853,8 @@ ad1848_init(ad1848_t *ad1848, uint8_t type)
ad1848->out_l = ad1848->out_r = 0;
ad1848->fm_vol_l = ad1848->fm_vol_r = 65536;
ad1848->cd_vol_l = ad1848->cd_vol_r = 65536;
ad1848->cd_vol_reg = -1;
ad1848_updatevolmask(ad1848);
if (type >= AD1848_TYPE_CS4235)
ad1848->fmt_mask = 0x50;

View File

@@ -1211,6 +1211,7 @@ azt_init(const device_t *info)
/* wss part */
ad1848_init(&azt2316a->ad1848, device_get_config_int("codec"));
ad1848_set_cd_audio_channel(&azt2316a->ad1848, (device_get_config_int("codec") == AD1848_TYPE_CS4248) ? AD1848_AUX1 : AD1848_LINE_IN);
ad1848_setirq(&azt2316a->ad1848, azt2316a->cur_wss_irq);
ad1848_setdma(&azt2316a->ad1848, azt2316a->cur_wss_dma);

View File

@@ -273,8 +273,10 @@ cs423x_write(uint16_t addr, uint8_t val, void *priv)
}
switch (dev->regs[3] & 0x0f) {
case 0: /* WSS Master Control */
if ((dev->type < CRYSTAL_CS4235) && (val & 0x80))
if ((dev->type < CRYSTAL_CS4235) && (val & 0x80)) {
ad1848_init(&dev->ad1848, dev->ad1848_type);
ad1848_set_cd_audio_channel(&dev->ad1848, AD1848_AUX2);
}
val = 0x00;
break;
@@ -865,6 +867,7 @@ cs423x_reset(void *priv)
/* Reset WSS codec. */
ad1848_init(&dev->ad1848, dev->ad1848_type);
ad1848_set_cd_audio_channel(&dev->ad1848, AD1848_AUX2);
/* Reset PnP resource data, state and logical devices. */
dev->pnp_enable = 1;

View File

@@ -13,6 +13,7 @@
#include <86box/io.h>
#include <86box/midi.h>
#include <86box/nmi.h>
#include <86box/gameport.h>
#include <86box/pic.h>
#include <86box/sound.h>
#include "cpu.h"
@@ -43,10 +44,33 @@ enum {
};
enum {
GUS_CLASSIC = 0,
GUS_MAX = 1,
GUS_CLASSIC = 0,
GUS_CLASSIC_37 = 1,
GUS_MAX = 2,
GUS_ACE = 3
};
enum {
GUS_ICS2101_MIC_IN = 0,
GUS_ICS2101_LINE_IN = 1,
GUS_ICS2101_CD_IN = 2,
GUS_ICS2101_GF1_OUT = 3,
GUS_ICS2101_UNUSED = 4,
GUS_ICS2101_MASTER = 5,
GUS_ICS2101_MAX = 6
};
typedef struct ics2101_chan_t {
uint8_t ctrl[2];
double level[2];
uint8_t pan;
} ics2101_chan_t;
typedef struct ics2101_t {
uint8_t addr;
ics2101_chan_t channels[GUS_ICS2101_MAX];
} ics2101_t;
typedef struct gus_t {
int reset;
@@ -120,7 +144,9 @@ typedef struct gus_t {
uint8_t sb_ctrl;
int sb_nmi;
uint8_t joy_trim;
uint8_t reg_ctrl;
uint8_t jumper;
uint8_t ad_status;
uint8_t ad_data;
@@ -143,9 +169,13 @@ typedef struct gus_t {
uint8_t usrr;
void *gameport;
uint8_t max_ctrl;
ad1848_t ad1848;
ics2101_t ics2101;
} gus_t;
static int gus_gf1_irqs[8] = { -1, 2, 5, 3, 7, 11, 12, 15 };
@@ -159,6 +189,15 @@ int gusfreqs[] = {
double vol16bit[4096];
double ics2101_att[128];
double ics2101_pan[] = { 0.35481, 0.35481, 0.35481, 0.37584, 0.47315, 0.53088, 0.59566, 0.66834,
0.70795,
0.74989, 0.79433, 0.84140, 0.89125, 0.94406, 1.00000, 1.00000, 1.00000 };
void gus_write(uint16_t addr, uint8_t val, void *priv);
uint8_t gus_read(uint16_t addr, void *priv);
void
gus_update_int_status(gus_t *gus)
{
@@ -255,6 +294,10 @@ gus_write(uint16_t addr, uint8_t val, void *priv)
uint16_t port;
uint16_t csioport;
ics2101_t *ics2101 = &gus->ics2101;
uint8_t mixer_ch;
uint8_t mixer_lr;
if ((addr == 0x388) || (addr == 0x389))
port = addr;
else
@@ -537,6 +580,10 @@ gus_write(uint16_t addr, uint8_t val, void *priv)
gus->t2on = 1;
break;
case 0x4B: /*Joystick trim DAC*/
gus->joy_trim = val;
break;
case 0x4c: /*Reset*/
gus->reset = val;
break;
@@ -634,9 +681,25 @@ gus_write(uint16_t addr, uint8_t val, void *priv)
gus->gp2_addr = val;
break;
case 5:
gus->usrr = 0;
if (gus->type > GUS_CLASSIC)
gus->usrr = 0;
break;
case 6:
if (gus->type > GUS_CLASSIC) {
if (gus->type != GUS_ACE) {
if (!(val & 0x2) && (gus->jumper & 0x2))
io_removehandler(0x0100 + gus->base, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
else if ((val & 0x2) && !(gus->jumper & 0x2))
io_sethandler(0x0100 + gus->base, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
if (!(val & 0x4) && (gus->jumper & 0x4))
gameport_remap(gus->gameport, 0x0);
else if ((val & 0x4) && !(gus->jumper & 0x4))
gameport_remap(gus->gameport, 0x201);
}
gus->jumper = val;
}
break;
default:
@@ -672,11 +735,47 @@ gus_write(uint16_t addr, uint8_t val, void *priv)
gus->sb_2xe = val;
break;
case 0x20f:
gus->reg_ctrl = val;
if (gus->type > GUS_CLASSIC)
gus->reg_ctrl = val;
break;
case 0x306:
if (gus->type == GUS_CLASSIC_37) {
mixer_ch = (ics2101->addr >> 3) & 0x7; /* current attenuator */
mixer_lr = ics2101->addr & 1; /* left or right channel */
switch (ics2101->addr & 0x6) {
case 0: /* Set control */
ics2101->channels[mixer_ch].ctrl[mixer_lr] = val & 0xF;
if ((mixer_lr == 0) && (val & 0xC)) /* copy to right channel if not normal mode */
ics2101->channels[mixer_ch].ctrl[1] = val & 0xF;
break;
case 2: /* Set attenuator */
switch (ics2101->channels[mixer_ch].ctrl[mixer_lr] & 0xC) {
case 0: /* Normal mode */
ics2101->channels[mixer_ch].level[mixer_lr] = ics2101_att[val & 0x7F];
break;
case 4: /* Stereo mode */
ics2101->channels[mixer_ch].level[0] = ics2101_att[val & 0x7F];
ics2101->channels[mixer_ch].level[1] = ics2101_att[val & 0x7F];
break;
case 8: /* Balance/Pan mode */
ics2101->channels[mixer_ch].level[0] = ics2101_att[val & 0x7F] * ics2101_pan[ics2101->channels[mixer_ch].pan + 1];
ics2101->channels[mixer_ch].level[1] = ics2101_att[val & 0x7F] * ics2101_pan[16 - ics2101->channels[mixer_ch].pan];
break;
}
break;
case 4: /* Set panning */
ics2101->channels[mixer_ch].pan = val & 0xF;
break;
default:
break;
}
break;
}
fallthrough;
case 0x706:
if (gus->type == GUS_MAX) {
if (gus->type == GUS_CLASSIC_37) {
gus->ics2101.addr = val & 0x3F;
} else if (gus->type == GUS_MAX) {
if (gus->dma >= 4)
val |= 0x10;
if (gus->dma2 >= 4)
@@ -746,10 +845,10 @@ gus_read(uint16_t addr, void *priv)
return val;
case 0x20F:
if (gus->type == GUS_MAX)
val = 0x02;
if (gus->type > GUS_CLASSIC)
val = gus->jumper;
else
val = 0x00;
val = 0xff;
break;
case 0x302:
@@ -842,6 +941,9 @@ gus_read(uint16_t addr, void *priv)
case 0x49: /*Sampling control*/
return 0;
case 0x4B: /*Joystick trim DAC*/
return gus->joy_trim;
case 0x00:
case 0x01:
case 0x02:
@@ -867,10 +969,14 @@ gus_read(uint16_t addr, void *priv)
break;
case 0x306:
case 0x706:
if (gus->type == GUS_MAX)
if (gus->type == GUS_CLASSIC_37)
val = 0x06; /* 3.7x - mixer, no reverse channels bug */
else if (gus->type == GUS_MAX)
val = 0x0a; /* GUS MAX */
else if (gus->type == GUS_ACE)
val = 0x30; /* GUS ACE */
else
val = 0xff; /*Pre 3.7 - no mixer*/
val = 0xff; /* Pre 3.7 - no mixer */
break;
case 0x307: /*DRAM access*/
@@ -884,22 +990,24 @@ gus_read(uint16_t addr, void *priv)
return 0;
case 0x20b:
switch (gus->reg_ctrl & 0x07) {
case 1:
val = gus->gp1;
break;
case 2:
val = gus->gp2;
break;
case 3:
val = gus->gp1_addr;
break;
case 4:
val = gus->gp2_addr;
break;
if (gus->type > GUS_CLASSIC) {
switch (gus->reg_ctrl & 0x07) {
case 1:
val = gus->gp1;
break;
case 2:
val = gus->gp2;
break;
case 3:
val = gus->gp1_addr;
break;
case 4:
val = gus->gp2_addr;
break;
default:
break;
default:
break;
}
}
break;
@@ -911,8 +1019,11 @@ gus_read(uint16_t addr, void *priv)
case 0x20e:
return gus->sb_2xe;
case 0x208:
case 0x388:
if ((gus->type == GUS_ACE) && !device_get_config_int("adlib_ports"))
break;
fallthrough;
case 0x208:
if (gus->tctrl & GUS_TIMER_CTRL_AUTO)
val = gus->sb_2xa;
else {
@@ -927,10 +1038,12 @@ gus_read(uint16_t addr, void *priv)
#ifdef OLD_NMI_BEHAVIOR
nmi = 0;
#endif /* OLD_NMI_BEHAVIOR */
fallthrough;
case 0x389:
val = gus->ad_data;
break;
case 0x389:
if ((gus->type != GUS_ACE) || device_get_config_int("adlib_ports"))
val = gus->ad_data;
break;
case 0x20A:
val = gus->adcommand;
@@ -1164,6 +1277,58 @@ gus_poll_wave(void *priv)
gus_update_int_status(gus);
}
void
gus_ics2101_filter(void *priv, int channel, double *out_l, double *out_r)
{
ics2101_t *ics2101 = (ics2101_t *) priv;
double temp_l = 0.0;
double temp_r = 0.0;
double master_l = 0.0;
double master_r = 0.0;
uint8_t ctrl_l = ics2101->channels[channel].ctrl[0];
uint8_t ctrl_r = ics2101->channels[channel].ctrl[1];
if (!(ctrl_l & 0xC)) { /* Normal mode */
if (ctrl_l & 1)
temp_l += *out_l * ics2101->channels[channel].level[0];
if (ctrl_l & 2)
temp_r += *out_l * ics2101->channels[channel].level[0];
if (ctrl_r & 1)
temp_l += *out_r * ics2101->channels[channel].level[1];
if (ctrl_r & 2)
temp_r += *out_r * ics2101->channels[channel].level[1];
} else { /* Stereo or Balance/Pan mode */
if (ctrl_l & 2) { /* Mono/Pan */
temp_l = (*out_l + *out_r) * 0.5 * ics2101->channels[channel].level[(ctrl_l & 1)];
temp_r = (*out_r + *out_l) * 0.5 * ics2101->channels[channel].level[!(ctrl_l & 1)];
} else { /* Stereo/Balance */
temp_l = ((ctrl_l & 1) ? *out_l : *out_r) * ics2101->channels[channel].level[(ctrl_l & 1)];
temp_r = ((ctrl_l & 1) ? *out_r : *out_l) * ics2101->channels[channel].level[!(ctrl_l & 1)];
}
}
/* Master */
ctrl_l = ics2101->channels[GUS_ICS2101_MASTER].ctrl[0];
ctrl_r = ics2101->channels[GUS_ICS2101_MASTER].ctrl[1];
if (!(ctrl_l & 0xC)) { /* Normal mode */
if (ctrl_l & 1)
master_l += temp_l * ics2101->channels[GUS_ICS2101_MASTER].level[0];
if (ctrl_l & 2)
master_r += temp_l * ics2101->channels[GUS_ICS2101_MASTER].level[0];
if (ctrl_r & 1)
master_l += temp_r * ics2101->channels[GUS_ICS2101_MASTER].level[1];
if (ctrl_r & 2)
master_r += temp_r * ics2101->channels[GUS_ICS2101_MASTER].level[1];
} else { /* Stereo or Balance mode - no mono/pan for master */
master_l = ((ctrl_l & 1) ? temp_l : temp_r) * ics2101->channels[GUS_ICS2101_MASTER].level[(ctrl_l & 1)];
master_r = ((ctrl_l & 1) ? temp_r : temp_l) * ics2101->channels[GUS_ICS2101_MASTER].level[!(ctrl_l & 1)];
}
*out_l = master_l;
*out_r = master_r;
}
static void
gus_get_buffer(int32_t *buffer, int len, void *priv)
{
@@ -1173,11 +1338,26 @@ gus_get_buffer(int32_t *buffer, int len, void *priv)
ad1848_update(&gus->ad1848);
gus_update(gus);
for (int c = 0; c < len * 2; c++) {
if ((gus->type == GUS_MAX) && (gus->max_ctrl))
buffer[c] += (int32_t) (gus->ad1848.buffer[c] / 2);
buffer[c] += (int32_t) gus->buffer[c & 1][c >> 1];
for (int c = 0; c < len * 2; c += 2) {
double temp_l = 0.0;
double temp_r = 0.0;
if ((gus->type == GUS_CLASSIC_37) || (gus->type == GUS_MAX)) {
temp_l = (double) gus->buffer[0][c >> 1];
temp_r = (double) gus->buffer[1][c >> 1];
if (gus->type == GUS_MAX) {
if (gus->max_ctrl) {
buffer[c] += (int32_t) (gus->ad1848.buffer[c] / 2);
buffer[c + 1] += (int32_t) (gus->ad1848.buffer[c + 1] / 2);
}
ad1848_filter_channel(&gus->ad1848, AD1848_AUX1, &temp_l, &temp_r);
} else
gus_ics2101_filter(&gus->ics2101, GUS_ICS2101_GF1_OUT, &temp_l, &temp_r);
buffer[c] += (int32_t) temp_l;
buffer[c + 1] += (int32_t) temp_r;
} else {
buffer[c] += (int32_t) gus->buffer[0][c >> 1];
buffer[c + 1] += (int32_t) gus->buffer[1][c >> 1];
}
}
if ((gus->type == GUS_MAX) && (gus->max_ctrl))
@@ -1186,6 +1366,17 @@ gus_get_buffer(int32_t *buffer, int len, void *priv)
gus->pos = 0;
}
void
gus_filter_cd_audio(int channel, double *buffer, void *priv)
{
const gus_t *gus = (gus_t *) priv;
/* FIXME: No channel remapping possible with the current architecture */
if (gus->ics2101.channels[GUS_ICS2101_CD_IN].ctrl[channel] && gus->ics2101.channels[GUS_ICS2101_MASTER].ctrl[channel])
*buffer *= gus->ics2101.channels[GUS_ICS2101_CD_IN].level[channel] * gus->ics2101.channels[GUS_ICS2101_MASTER].level[channel];
else
*buffer *= 0.0;
}
static void
gus_input_msg(void *priv, uint8_t *msg, uint32_t len)
{
@@ -1292,6 +1483,7 @@ gus_reset(void *priv)
gus->sb_ctrl = 0;
gus->sb_nmi = 0;
gus->joy_trim = 29;
gus->reg_ctrl = 0;
gus->ad_status = 0;
@@ -1320,6 +1512,13 @@ gus_reset(void *priv)
gus->irq_state = 0;
gus->midi_irq_state = 0;
for (int i = 0; i < GUS_ICS2101_MAX; i++) {
gus->ics2101.channels[i].level[0] = gus->ics2101.channels[i].level[1] = 1.0;
gus->ics2101.channels[i].ctrl[0] = 1;
gus->ics2101.channels[i].ctrl[1] = 2;
gus->ics2101.channels[i].pan = 7;
}
gus_update_int_status(gus);
}
@@ -1328,6 +1527,7 @@ gus_init(UNUSED(const device_t *info))
{
int c;
double out = 1.0;
double gain;
uint8_t gus_ram = device_get_config_int("gus_ram");
gus_t *gus = calloc(1, sizeof(gus_t));
@@ -1355,15 +1555,46 @@ gus_init(UNUSED(const device_t *info))
gus->type = info->local;
gus->jumper = 0x06;
for (int i = 0; i < GUS_ICS2101_MAX; i++) {
gus->ics2101.channels[i].level[0] = gus->ics2101.channels[i].level[1] = 1.0;
gus->ics2101.channels[i].ctrl[0] = 1;
gus->ics2101.channels[i].ctrl[1] = 2;
gus->ics2101.channels[i].pan = 7;
}
gus->base = device_get_config_hex16("base");
io_sethandler(gus->base, 0x0010, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
io_sethandler(0x0100 + gus->base, 0x0010, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
if (gus->type != GUS_ACE)
io_sethandler(0x0100 + gus->base, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
io_sethandler(0x0102 + gus->base, 0x000e, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
io_sethandler(0x0506 + gus->base, 0x0001, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
io_sethandler(0x0388, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
if (gus->type == GUS_CLASSIC && device_get_config_int("gameport"))
gus->gameport = gameport_add(&gameport_201_device);
else if (gus->type != GUS_ACE) {
gus->gameport = gameport_add(&gameport_pnp_1io_device);
gameport_remap(gus->gameport, 0x201);
}
if (gus->type == GUS_CLASSIC_37) {
/* Precalculate the attenuation table for ICS2101 */
for (int i = 0; i < 128; i++) {
gain = (127 - i) * -0.5;
if (i < 16)
for (int j = 0; j < (16 - i); j++)
gain += -0.5 - 0.13603 * (j + 1);
ics2101_att[i] = pow(10.0, gain / 20.0);
}
sound_set_cd_audio_filter(gus_filter_cd_audio, gus);
}
if (gus->type == GUS_MAX) {
ad1848_init(&gus->ad1848, AD1848_TYPE_CS4231);
ad1848_set_cd_audio_channel(&gus->ad1848, AD1848_AUX2);
ad1848_setirq(&gus->ad1848, 5);
ad1848_setdma(&gus->ad1848, 3);
io_sethandler(0x10C + gus->base, 4,
@@ -1376,7 +1607,7 @@ gus_init(UNUSED(const device_t *info))
sound_add_handler(gus_get_buffer, gus);
if (device_get_config_int("receive_input"))
if ((gus->type != GUS_ACE) && (device_get_config_int("receive_input")))
midi_in_handler(1, gus_input_msg, gus_input_sysex, gus);
return gus;
@@ -1442,6 +1673,17 @@ static const device_config_t gus_config[] = {
},
.bios = { { 0 } }
},
{
.name = "gameport",
.description = "Enable Game port",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{
.name = "receive_input",
.description = "Receive MIDI input",
@@ -1457,6 +1699,160 @@ static const device_config_t gus_config[] = {
// clang-format off
};
static const device_config_t gus_v37_config[] = {
// clang-format off
{
.name = "base",
.description = "Address",
.type = CONFIG_HEX16,
.default_string = NULL,
.default_int = 0x220,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "210H", .value = 0x210 },
{ .description = "220H", .value = 0x220 },
{ .description = "230H", .value = 0x230 },
{ .description = "240H", .value = 0x240 },
{ .description = "250H", .value = 0x250 },
{ .description = "260H", .value = 0x260 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "gus_ram",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "256 KB", .value = 0 },
{ .description = "512 KB", .value = 1 },
{ .description = "1 MB", .value = 2 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "receive_input",
.description = "Receive MIDI input",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 1,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format off
};
static const device_config_t gus_max_config[] = {
// clang-format off
{
.name = "base",
.description = "Address",
.type = CONFIG_HEX16,
.default_string = NULL,
.default_int = 0x220,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "210H", .value = 0x210 },
{ .description = "220H", .value = 0x220 },
{ .description = "230H", .value = 0x230 },
{ .description = "240H", .value = 0x240 },
{ .description = "250H", .value = 0x250 },
{ .description = "260H", .value = 0x260 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "gus_ram",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 1,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "512 KB", .value = 1 },
{ .description = "1 MB", .value = 2 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "receive_input",
.description = "Receive MIDI input",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 1,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format off
};
static const device_config_t gus_ace_config[] = {
// clang-format off
{
.name = "base",
.description = "Address",
.type = CONFIG_HEX16,
.default_string = NULL,
.default_int = 0x260,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "210H", .value = 0x210 },
{ .description = "220H", .value = 0x220 },
{ .description = "230H", .value = 0x230 },
{ .description = "240H", .value = 0x240 },
{ .description = "250H", .value = 0x250 },
{ .description = "260H", .value = 0x260 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "gus_ram",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 1,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "512 KB", .value = 1 },
{ .description = "1 MB", .value = 2 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "adlib_ports",
.description = "Enable Adlib ports",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format off
};
const device_t gus_device = {
.name = "Gravis UltraSound",
.internal_name = "gus",
@@ -1471,6 +1867,20 @@ const device_t gus_device = {
.config = gus_config
};
const device_t gus_v37_device = {
.name = "Gravis UltraSound (rev 3.7)",
.internal_name = "gusv37",
.flags = DEVICE_ISA16,
.local = GUS_CLASSIC_37,
.init = gus_init,
.close = gus_close,
.reset = gus_reset,
.available = NULL,
.speed_changed = gus_speed_changed,
.force_redraw = NULL,
.config = gus_v37_config
};
const device_t gus_max_device = {
.name = "Gravis UltraSound MAX",
.internal_name = "gusmax",
@@ -1482,5 +1892,19 @@ const device_t gus_max_device = {
.available = NULL,
.speed_changed = gus_speed_changed,
.force_redraw = NULL,
.config = gus_config
.config = gus_max_config
};
const device_t gus_ace_device = {
.name = "Gravis UltraSound ACE",
.internal_name = "gusace",
.flags = DEVICE_ISA16,
.local = GUS_ACE,
.init = gus_init,
.close = gus_close,
.reset = gus_reset,
.available = NULL,
.speed_changed = gus_speed_changed,
.force_redraw = NULL,
.config = gus_ace_config
};

View File

@@ -85,7 +85,7 @@ optimc_filter_opl(void *priv, double *out_l, double *out_r)
if (optimc->cur_wss_enabled) {
*out_l /= optimc->sb->mixer_sbpro.fm_l;
*out_r /= optimc->sb->mixer_sbpro.fm_r;
ad1848_filter_aux2((void *) &optimc->ad1848, out_l, out_r);
ad1848_filter_channel((void *) &optimc->ad1848, AD1848_AUX2, out_l, out_r);
}
}
@@ -380,6 +380,7 @@ optimc_init(const device_t *info)
else
ad1848_init(&optimc->ad1848, AD1848_TYPE_DEFAULT);
ad1848_set_cd_audio_channel(&optimc->ad1848, (info->local & 0x100) ? AD1848_LINE_IN : AD1848_AUX1);
ad1848_setirq(&optimc->ad1848, optimc->cur_wss_irq);
ad1848_setdma(&optimc->ad1848, optimc->cur_wss_dma);

View File

@@ -138,7 +138,9 @@ static const SOUND_CARD sound_cards[] = {
{ &cs4235_device },
{ &cs4236b_device },
{ &gus_device },
{ &gus_v37_device },
{ &gus_max_device },
{ &gus_ace_device },
{ &mirosound_pcm10_device },
{ &pas16_device },
{ &pas16d_device },

View File

@@ -15,7 +15,7 @@
%global romver 4.1
Name: 86Box
Version: 5.1
Version: 6.0
Release: 1%{?dist}
Summary: Classic PC emulator
License: GPLv2+
@@ -121,5 +121,5 @@ popd
%{_datadir}/%{name}/roms
%changelog
* Sat Aug 31 Jasmine Iwanek <jriwanek[AT]gmail.com> 5.1-1
* Sat Aug 31 Jasmine Iwanek <jriwanek[AT]gmail.com> 6.0-1
- Bump release

View File

@@ -11,7 +11,7 @@
</categories>
<launchable type="desktop-id">net.86box.86Box.desktop</launchable>
<releases>
<release version="5.1" date="2025-08-27"/>
<release version="6.0" date="2025-09-14"/>
</releases>
<content_rating type="oars-1.1" />
<description>

View File

@@ -1,6 +1,6 @@
{
"name": "86box",
"version-string": "5.1",
"version-string": "6.0",
"homepage": "https://86box.net/",
"documentation": "https://86box.readthedocs.io/",
"license": "GPL-2.0-or-later",