From 9aad8dbf9c6bffc313a7da8acdec297f1c58f140 Mon Sep 17 00:00:00 2001 From: The Dax Date: Wed, 5 Feb 2025 17:12:40 -0500 Subject: [PATCH 001/118] Add basic support for the Quantum3D Raven. AGP was worked on but found to be unstable (freezing on the first frame whenever entering Direct3D fullscreen), so it was removed. --- src/include/86box/video.h | 1 + src/video/vid_table.c | 1 + src/video/vid_voodoo_banshee.c | 38 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 9ee710592..336d656cc 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -575,6 +575,7 @@ extern const device_t ps1vga_mca_device; extern const device_t voodoo_device; extern const device_t voodoo_banshee_device; extern const device_t creative_voodoo_banshee_device; +extern const device_t quantum3d_raven_device; extern const device_t voodoo_3_1000_device; extern const device_t voodoo_3_1000_agp_device; extern const device_t voodoo_3_2000_device; diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 9ff092161..756515734 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -193,6 +193,7 @@ video_cards[] = { { .device = &tgui9680_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &voodoo_banshee_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &creative_voodoo_banshee_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &quantum3d_raven_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &voodoo_3_1000_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &voodoo_3_2000_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &voodoo_3_3000_device, .flags = VIDEO_FLAG_TYPE_NONE }, diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index ebd92d983..36bda6cbe 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -49,6 +49,7 @@ #define ROM_BANSHEE "roms/video/voodoo/Pci_sg.rom" #define ROM_CREATIVE_BANSHEE "roms/video/voodoo/BlasterPCI.rom" +#define ROM_QUANTUM3D_RAVEN "roms/video/voodoo/RVPD0224.rom" #define ROM_VOODOO3_1000 "roms/video/voodoo/1k11sg.rom" #define ROM_VOODOO3_2000 "roms/video/voodoo/2k11sd.rom" #define ROM_VOODOO3_3000 "roms/video/voodoo/3k12sd.rom" @@ -75,6 +76,7 @@ static uint8_t vb_filter_bx_g[256][256]; enum { TYPE_BANSHEE = 0, + TYPE_QUANTUM3D_RAVEN, TYPE_V3_1000, TYPE_V3_2000, TYPE_V3_3000, @@ -3463,6 +3465,16 @@ banshee_init_common(const device_t *info, char *fn, int has_sgram, int type, int } break; + case TYPE_QUANTUM3D_RAVEN: + /* This case basically exists only to set the subsystem ID correctly for SF: Rush, a vendor-locked game. */ + /* We set the type back to TYPE_BANSHEE so the card behaves as a regular Banshee (no 3D glasses emulation). */ + banshee->pci_regs[0x2c] = 0x9c; + banshee->pci_regs[0x2d] = 0x13; + banshee->pci_regs[0x2e] = banshee->agp ? 0x16 : 0x17; + banshee->pci_regs[0x2f] = 0x00; + banshee->type = TYPE_BANSHEE; + break; + case TYPE_V3_1000: banshee->pci_regs[0x2c] = 0x1a; banshee->pci_regs[0x2d] = 0x12; @@ -3540,6 +3552,12 @@ creative_banshee_init(const device_t *info) return banshee_init_common(info, ROM_CREATIVE_BANSHEE, 0, TYPE_BANSHEE, VOODOO_BANSHEE, 0); } +static void * +quantum3d_raven_init(const device_t *info) +{ + return banshee_init_common(info, ROM_QUANTUM3D_RAVEN, 0, TYPE_QUANTUM3D_RAVEN, VOODOO_BANSHEE, 0); +} + static void * v3_1000_init(const device_t *info) { @@ -3636,6 +3654,12 @@ creative_banshee_available(void) return rom_present(ROM_CREATIVE_BANSHEE); } +static int +quantum3d_raven_available(void) +{ + return rom_present(ROM_QUANTUM3D_RAVEN); +} + static int v3_1000_available(void) { @@ -3757,6 +3781,20 @@ const device_t creative_voodoo_banshee_device = { .config = banshee_sdram_config }; +const device_t quantum3d_raven_device = { + .name = "Quantum3D Raven", + .internal_name = "q3d_raven_pci", + .flags = DEVICE_PCI, + .local = 0, + .init = quantum3d_raven_init, + .close = banshee_close, + .reset = NULL, + .available = quantum3d_raven_available, + .speed_changed = banshee_speed_changed, + .force_redraw = banshee_force_redraw, + .config = banshee_sdram_config +}; + const device_t voodoo_3_1000_device = { .name = "3dfx Voodoo3 1000", .internal_name = "voodoo3_1k_pci", From e821aa1b0a8eed7ebe24959b3fb7d472f350e673 Mon Sep 17 00:00:00 2001 From: pankozaC++ <77279607+pankoza2-pl@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:52:27 +0100 Subject: [PATCH 002/118] Add Packard Bell PB286 (part 1) --- src/include/86box/machine.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 78f4902eb..6d48dbff6 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -438,6 +438,8 @@ extern int machine_at_ibmatquadtel_init(const machine_t *); // IBM AT with Quadt extern int machine_at_ibmxt286_init(const machine_t *); +extern int machine_at_pb286_init(const machine_t *); + extern int machine_at_siemens_init(const machine_t *); // Siemens PCD-2L. N82330 discrete machine. It segfaults in some places extern int machine_at_wellamerastar_init(const machine_t *); // Wells American A*Star with custom award BIOS From e4600291ed0135735021de2984fa73c205d6ff8f Mon Sep 17 00:00:00 2001 From: pankozaC++ <77279607+pankoza2-pl@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:56:09 +0100 Subject: [PATCH 003/118] Add Packard Bell PB286 (part 2) --- src/machine/m_at.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/machine/m_at.c b/src/machine/m_at.c index 3f5e88011..15b828676 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -332,6 +332,22 @@ machine_at_ibmxt286_init(const machine_t *model) return ret; } +machine_at_pb286_init(const machine_t *model) +{ + int ret; + + ret = bios_load_interleaved("roms/machines/pb286/LB_V332P.BIN", + "roms/machines/pb286/HB_V332P.BIN", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_ibm_common_init(model); + + return ret; +} + int machine_at_siemens_init(const machine_t *model) { From e0fda208dfa4d1d788a6b0a82e5211b1916d9661 Mon Sep 17 00:00:00 2001 From: pankozaC++ <77279607+pankoza2-pl@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:03:16 +0100 Subject: [PATCH 004/118] Add Packard Bell PB286 (part 3) --- src/machine/machine_table.c | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 3706126a3..eb0584802 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -3259,6 +3259,47 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has IBM AT KBC firmware. */ + /* To configure the BIOS, use PB_2330a_diag.IMA from MS-DOS 3.30 Packard Bell OEM, GSETUP might work too*/ + { + .name = "[ISA] Packard Bell PB286", + .internal_name = "pb286", + .type = MACHINE_TYPE_286, + .chipset = MACHINE_CHIPSET_DISCRETE, + .init = machine_at_pb286_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_286, + .block = CPU_BLOCK_NONE, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_AT, + .flags = MACHINE_FLAGS_NONE, + .ram = { + .min = 256, + .max = 1024, + .step = 256 + }, + .nvrmask = 63, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* This has a Siemens proprietary KBC which is completely undocumented. */ { .name = "[ISA] Siemens PCD-2L", From e012777244f903fc3ffe9d2dc44229eb12bb6f46 Mon Sep 17 00:00:00 2001 From: pankozaC++ <77279607+pankoza2-pl@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:19:57 +0100 Subject: [PATCH 005/118] Fix compile-breaking mistake (forgot "int") --- src/machine/m_at.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/machine/m_at.c b/src/machine/m_at.c index 15b828676..162006803 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -332,6 +332,7 @@ machine_at_ibmxt286_init(const machine_t *model) return ret; } +int machine_at_pb286_init(const machine_t *model) { int ret; From 48da4f3811898058762be3fb5ab374c8e46918db Mon Sep 17 00:00:00 2001 From: pankozaC++ <77279607+pankoza2-pl@users.noreply.github.com> Date: Sat, 22 Feb 2025 00:27:23 +0100 Subject: [PATCH 006/118] adjust the RAM step, Packard Bell 286s are known to support 640 KB RAM configurations --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index eb0584802..abfdf9d16 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -3286,7 +3286,7 @@ const machine_t machines[] = { .ram = { .min = 256, .max = 1024, - .step = 256 + .step = 128 }, .nvrmask = 63, .kbc_device = NULL, From 94a928978e20fcb2b0b9edd86b430ce818f4255d Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Sat, 29 Mar 2025 20:46:30 +0900 Subject: [PATCH 007/118] PS55DA2: update compatibility table --- src/video/vid_ps55da2.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 98db5f9fa..1f00b7cc5 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -112,17 +112,18 @@ EFD8h * Display Adapter/J [Atlas-SP2] [Japanese DOS and Display Adapter compatibility] - | POS ID | Adapter Name | K3.31 | J4.04 | J4.08 | OS2 J1.3 | Win3 | - |------------|-----------------------------|:-----:|:-----:|:-----:|:--------:|:----:| - | EFFFh | Display Adapter | X | | | | | - | FFEDh | ? [Atlas EVT] | X | | | | | - | FFFDh | ? [LDT EVT] | X | | | | | - | EFFEh | Display Adapter II,III,V,B2 | X | X | X | X | X | - | E013h | ? [LDT] | X | X | X | X | | - | ECCEh | Display Adapter IV | | X | X | X | | - | ECECh | Display Adapter IV,B1 | | X | X | X | X | - | 9000-901Fh | Display Adapter A1,A2 | | X | X | | X | - | EFD8h | Display Adapter /J | | | X | X | X | + | | | K3.31 | J4.04 | J4.08 | OS2J1.3 | Win3.02 | DOSVExt | + | POS ID | Adapter Name | 5605JBK | 5605PAA | 5605PCA | 5605PDE | 5605PAW | 5605PXA | + |------------|-----------------------------|:-------:|:-------:|:-------:|:-------:|:-------:|:-------:| + | EFFFh | Display Adapter | X | | | | | | + | FFEDh | ? [Atlas EVT] | X | | | | | | + | FFFDh | ? [LDT EVT] | X | | | | | | + | EFFEh | Display Adapter II,III,V,B2 | X | X | X | X | X | X | + | E013h | ? [LDT] | X | X | X | X | | X | + | ECCEh | Display Adapter IV | | X | X | X | | X | + | ECECh | Display Adapter IV,B1 | | X | X | X | X | X | + | 9000-901Fh | Display Adapter A1,A2 | | X | X | | X | X | + | EFD8h | Display Adapter /J | | | X | X | X | X | */ /* IO 3E0/3E1:0Ah Hardware Configuration Value L (imported from OS/2 DDK) */ #define OldLSI 0x20 /* 1 = DA-2, 0 = DA-3 */ From 8cc6f215362436aa72be5b1002ab830058a0602f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 29 Mar 2025 18:32:41 +0100 Subject: [PATCH 008/118] PB450: Fix the default BIOS selection, fixes segmentation fault. --- src/machine/m_at_386dx_486.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 19c4b535e..639233e10 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -691,12 +691,12 @@ static const device_config_t pb450_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "pci10a", + .default_string = "pb450a", .default_int = 0, .file_filter = "", .spinner = { 0 }, .bios = { - { .name = "PCI 1.0A", .internal_name = "pb450" /*"pci10a"*/, .bios_type = BIOS_NORMAL, + { .name = "PCI 1.0A", .internal_name = "pb450a" /*"pci10a"*/, .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/pb450/OPTI802.bin", "" } }, { .name = "PNP 1.1A", .internal_name = "pnp11a", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/pb450/PNP11A.bin", "" } }, @@ -732,7 +732,7 @@ machine_at_pb450_init(const machine_t *model) return ret; device_context(model->device); - fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0); + 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(); From 99c81fe03d640f06d16682e67ad84110bcfa9406 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 29 Mar 2025 18:36:33 +0100 Subject: [PATCH 009/118] IBM PC/XT/AT and PB450: Remove "Device" from machine device_t names. --- src/machine/m_at.c | 4 ++-- src/machine/m_at_386dx_486.c | 2 +- src/machine/m_xt.c | 12 ++++++------ src/machine/m_xt_laserxt.c | 11 +++++++---- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/machine/m_at.c b/src/machine/m_at.c index 3f5e88011..8a561630c 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -187,7 +187,7 @@ static const device_config_t ibmat_config[] = { }; const device_t ibmat_device = { - .name = " IBM AT Devices", + .name = "IBM AT", .internal_name = "ibmat_device", .flags = 0, .local = 0, @@ -294,7 +294,7 @@ static const device_config_t ibmxt286_config[] = { }; const device_t ibmxt286_device = { - .name = "IBM XT Model 286 Devices", + .name = "IBM XT Model 286", .internal_name = "ibmxt286_device", .flags = 0, .local = 0, diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 639233e10..0ee353f53 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -708,7 +708,7 @@ static const device_config_t pb450_config[] = { }; const device_t pb450_device = { - .name = "Packard Bell PB450 Devices", + .name = "Packard Bell PB450", .internal_name = "pb450_device", .flags = 0, .local = 0, diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 78d2daa13..13f9c52ca 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -108,7 +108,7 @@ static const device_config_t ibmpc_config[] = { }; const device_t ibmpc_device = { - .name = "IBM PC (1981) Device", + .name = "IBM PC (1981)", .internal_name = "ibmpc_device", .flags = 0, .local = 0, @@ -218,7 +218,7 @@ static const device_config_t ibmpc82_config[] = { }; const device_t ibmpc82_device = { - .name = "IBM PC (1982) Devices", + .name = "IBM PC (1982)", .internal_name = "ibmpc82_device", .flags = 0, .local = 0, @@ -331,7 +331,7 @@ static const device_config_t ibmxt_config[] = { }; const device_t ibmxt_device = { - .name = "IBM XT (1982) Device", + .name = "IBM XT (1982)", .internal_name = "ibmxt_device", .flags = 0, .local = 0, @@ -451,7 +451,7 @@ static const device_config_t ibmxt86_config[] = { }; const device_t ibmxt86_device = { - .name = "IBM XT (1986) Device", + .name = "IBM XT (1986)", .internal_name = "ibmxt86_device", .flags = 0, .local = 0, @@ -624,7 +624,7 @@ static const device_config_t jukopc_config[] = { }; const device_t jukopc_device = { - .name = "Juko ST Devices", + .name = "Juko ST", .internal_name = "jukopc_device", .flags = 0, .local = 0, @@ -949,7 +949,7 @@ static const device_config_t vendex_config[] = { }; const device_t vendex_device = { - .name = "Vendex 888T Devices", + .name = "Vendex 888T", .internal_name = "vendex_device", .flags = 0, .local = 0, diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c index 877d26ff5..595cce1ca 100644 --- a/src/machine/m_xt_laserxt.c +++ b/src/machine/m_xt_laserxt.c @@ -154,6 +154,8 @@ machine_xt_laserxt_common_init(const machine_t *model,int is_lxt3) standalone_gameport_type = &gameport_device; laserxt_init(is_lxt3); + + device_add(&keyboard_xt_lxt3_device); } int @@ -167,8 +169,6 @@ machine_xt_laserxt_init(const machine_t *model) if (bios_only || !ret) return ret; - device_add(&keyboard_xt_device); - machine_xt_laserxt_common_init(model, 0); return ret; @@ -179,14 +179,17 @@ machine_xt_lxt3_init(const machine_t *model) { int ret; +#if 0 ret = bios_load_linear("roms/machines/lxt3/27c64d.bin", 0x000fe000, 8192, 0); +#else + ret = bios_load_linear("roms/machines/lxt3/vtech-laser-xt3-bios-v1-26-27c64-637cfbe96dfa1809192278.bin", + 0x000fe000, 8192, 0); +#endif if (bios_only || !ret) return ret; - device_add(&keyboard_xt_lxt3_device); - machine_xt_laserxt_common_init(model, 1); return ret; From c1ecafaeb55e597e068ad61a8a563d5162e81019 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 29 Mar 2025 18:38:20 +0100 Subject: [PATCH 010/118] IBM PS/1 Model 2011: No need to explicitly refer to the zeroth element of the config array. --- src/machine/m_ps1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 41821a4a8..07128f157 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -290,7 +290,7 @@ const device_t ps1_2011_device = { .available = NULL, .speed_changed = NULL, .force_redraw = NULL, - .config = &ps1_2011_config[0] + .config = &ps1_2011_config }; static void From e48c6c8e8bd631471b45052c69270249e5193baa Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 29 Mar 2025 18:40:27 +0100 Subject: [PATCH 011/118] Laser XT3: No longer use the other BIOS that has not yet been committed. --- src/machine/m_xt_laserxt.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c index 595cce1ca..c0405f99a 100644 --- a/src/machine/m_xt_laserxt.c +++ b/src/machine/m_xt_laserxt.c @@ -179,13 +179,8 @@ machine_xt_lxt3_init(const machine_t *model) { int ret; -#if 0 ret = bios_load_linear("roms/machines/lxt3/27c64d.bin", 0x000fe000, 8192, 0); -#else - ret = bios_load_linear("roms/machines/lxt3/vtech-laser-xt3-bios-v1-26-27c64-637cfbe96dfa1809192278.bin", - 0x000fe000, 8192, 0); -#endif if (bios_only || !ret) return ret; From 8b646ccc49a5d6b4f0e7ce9ccf7042d7d89c14f2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 29 Mar 2025 18:47:21 +0100 Subject: [PATCH 012/118] Fix a compile-breaking mistake in machine/m_ps1.c. --- src/machine/m_ps1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 07128f157..c22463de4 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -290,7 +290,7 @@ const device_t ps1_2011_device = { .available = NULL, .speed_changed = NULL, .force_redraw = NULL, - .config = &ps1_2011_config + .config = ps1_2011_config }; static void From b6b840b67ec8f680d69d0672e49b8a0e6fd851df Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 29 Mar 2025 19:54:48 +0100 Subject: [PATCH 013/118] Recognize 8514/a-type cards as (S)VGA for the purposes of force 4:3 calculations, fixes blurry picture and wrong resolution. --- src/86box.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/86box.c b/src/86box.c index 2b6e1ba9f..ad1cfc519 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1624,6 +1624,8 @@ set_screen_size_monitor(int x, int y, int monitor_index) { int temp_overscan_x = monitors[monitor_index].mon_overscan_x; int temp_overscan_y = monitors[monitor_index].mon_overscan_y; + int is_svga = (video_get_type_monitor(monitor_index) == VIDEO_FLAG_TYPE_SPECIAL) || + (video_get_type_monitor(monitor_index) == VIDEO_FLAG_TYPE_8514); double dx; double dy; double dtx; @@ -1657,19 +1659,19 @@ set_screen_size_monitor(int x, int y, int monitor_index) dty = (double) temp_overscan_y; /* Account for possible overscan. */ - if (video_get_type_monitor(monitor_index) != VIDEO_FLAG_TYPE_SPECIAL && (temp_overscan_y == 16)) { + if (!is_svga && (temp_overscan_y == 16)) { /* CGA */ dy = (((dx - dtx) / 4.0) * 3.0) + dty; - } else if (video_get_type_monitor(monitor_index) != VIDEO_FLAG_TYPE_SPECIAL && (temp_overscan_y < 16)) { + } else if (!is_svga && (temp_overscan_y < 16)) { /* MDA/Hercules */ - dy = (x / 4.0) * 3.0; + dy = (dx / 4.0) * 3.0; } else { if (enable_overscan) { /* EGA/(S)VGA with overscan */ dy = (((dx - dtx) / 4.0) * 3.0) + dty; } else { /* EGA/(S)VGA without overscan */ - dy = (x / 4.0) * 3.0; + dy = (dx / 4.0) * 3.0; } } monitors[monitor_index].mon_unscaled_size_y = (int) dy; From 5a4a939e02cca97d9f35d3cf4581a89ed87bc3ac Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 29 Mar 2025 20:27:20 +0100 Subject: [PATCH 014/118] More fixes to the 8514/A compatible side. 1. Use proper identification to what chips use what. 2. Apply some mode switch fixes to the ATI 8514/A Ultra and make 1024x768 87Hz interlaced the default mode if htotal is 0 and on ati8514_init. 3. Add the undocumented ports to the ATI 8514/A Ultra add-on as well. --- src/include/86box/vid_8514a.h | 5 ++ src/video/vid_8514a.c | 5 +- src/video/vid_ati_mach8.c | 160 ++++++++++++++++++++-------------- src/video/vid_svga.c | 6 +- 4 files changed, 103 insertions(+), 73 deletions(-) diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index 153bface4..a467311ca 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -250,4 +250,9 @@ typedef struct ibm8514_t { } ibm8514_t; +#define IBM_8514A (((dev->local & 0xff) == 0x00) && (dev->extensions == 0x00)) +#define ATI_8514A_ULTRA (((dev->local & 0xff) == 0x00) && (dev->extensions == 0x01)) +#define ATI_GRAPHICS_ULTRA ((dev->local & 0xff) == 0x01) +#define ATI_MACH32 ((dev->local & 0xff) == 0x02) + #endif /*VIDEO_8514A_H*/ diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index efb05a307..df4cd7d9a 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -3846,10 +3846,7 @@ ibm8514_recalctimings(svga_t *svga) else svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0; - if (dev->dispend == 766) - dev->dispend += 2; - - if (dev->dispend == 478) + if ((dev->dispend == 478) || (dev->dispend == 766)) dev->dispend += 2; if (dev->interlace) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 9f1bb99d6..ba32dc129 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2250,7 +2250,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) if (((addr & 0xFFF0) == 0x3D0 || (addr & 0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; - if (((dev->disp_cntl & 0x60) == 0x20) && ((dev->local & 0xff) >= 0x02)) { + if (((dev->disp_cntl & 0x60) == 0x20) && ATI_MACH32) { if ((addr >= 0x3c6) && (addr <= 0x3c9)) { mach_log("VGA DAC write regs=%03x, on=%d, display control=%02x, on1=%x, clocksel=%02x.\n", addr, dev->on, dev->disp_cntl & 0x60, dev->accel.advfunc_cntl & 0x01, mach->accel.clock_sel & 0x01); @@ -2281,7 +2281,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) } break; case 0xad: - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if ((old ^ val) & 0x0c) { mach_log("ATI AD bits 2-3.\n"); svga_recalctimings(svga); @@ -2301,14 +2301,14 @@ mach_out(uint16_t addr, uint8_t val, void *priv) if (mach->regs[0xbe] & 0x08) { /* Read/write bank mode */ mach->bank_r = (((mach->regs[0xb2] & 1) << 3) | ((mach->regs[0xb2] & 0xe0) >> 5)); mach->bank_w = ((mach->regs[0xb2] & 0x1e) >> 1); - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { mach->bank_r |= ((mach->regs[0xae] & 0x0c) << 2); mach->bank_w |= ((mach->regs[0xae] & 3) << 4); } mach_log("Separate B2Bank = %02x, AEbank = %02x.\n", mach->regs[0xb2], mach->regs[0xae]); } else { /* Single bank mode */ mach->bank_w = ((mach->regs[0xb2] & 0x1e) >> 1); - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) mach->bank_w |= ((mach->regs[0xae] & 3) << 4); mach->bank_r = mach->bank_w; @@ -2338,7 +2338,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) } break; case 0xb8: - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if ((old ^ val) & 0x40) { mach_log("ATI B8 bit 6.\n"); svga_recalctimings(svga); @@ -2367,7 +2367,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->accel.ext_ge_config & 0x1000); rs3 = !!(mach->accel.ext_ge_config & 0x2000); mach_log("8514/A RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr); - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->regs[0xb0] & 0x20) { /*ATI extended 8514/A mode.*/ mach_log("Extended 8514/A mode.\n"); dev->vendor_mode = 1; @@ -2394,7 +2394,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->regs[0xa0] & 0x20); rs3 = !!(mach->regs[0xa0] & 0x40); mach_log("VGA RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr); - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (svga->attrregs[0x10] & 0x40) { mach_log("VGA mode.\n"); dev->vendor_mode = 0; @@ -2495,7 +2495,7 @@ mach_in(uint16_t addr, void *priv) case 0xb0: temp = mach->regs[0xb0] | 0x80; temp &= ~0x18; - if ((dev->local & 0xff) >= 0x02) { /*Mach32 VGA 1MB memory*/ + if (ATI_MACH32) { /*Mach32 VGA 1MB memory*/ temp |= 0x08; } else { /*ATI 28800 VGA 512kB memory*/ temp |= 0x10; @@ -2524,7 +2524,7 @@ mach_in(uint16_t addr, void *priv) case 0x2ed: rs2 = !!(mach->accel.ext_ge_config & 0x1000); rs3 = !!(mach->accel.ext_ge_config & 0x2000); - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (dev->on) temp = svga_in(addr, svga); else { @@ -2669,6 +2669,9 @@ mach_set_resolution(mach_t *mach, svga_t *svga) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; dev->hdisp = (dev->hdisped + 1) << 3; + if (!dev->htotal) /*Default to 1024x768 87hz 8514/A htotal timings if it goes to 0.*/ + dev->htotal = 0x9d; + dev->h_total = dev->htotal + 1; dev->vdisp = (dev->v_disp + 1) >> 1; @@ -2693,6 +2696,16 @@ mach_set_resolution(mach_t *mach, svga_t *svga) dev->vdisp = 480; svga_recalctimings(svga); } + } else { + if (ATI_8514A_ULTRA) { + if (dev->accel.advfunc_cntl & 0x04) { + if (dev->hdisp == 640) { + dev->hdisp = 1024; + dev->vdisp = 768; + svga_recalctimings(svga); + } + } + } } } } @@ -2712,7 +2725,7 @@ ati8514_recalctimings(svga_t *svga) dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); mach->accel.ge_offset = dev->accel.ge_offset; - mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", + pclog("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x05, mach->accel.clock_sel & 0x01); dev->h_disp = dev->hdisp; @@ -2756,7 +2769,7 @@ mach_recalctimings(svga_t *svga) clock_sel = ((svga->miscout >> 2) & 3) | ((mach->regs[0xbe] & 0x10) >> 1) | ((mach->regs[0xb9] & 2) << 1); - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->regs[0xad] & 0x04) svga->ma_latch |= 0x40000; @@ -2785,7 +2798,7 @@ mach_recalctimings(svga_t *svga) } else svga->packed_4bpp = 0; - if ((dev->local & 0xff) < 0x02) { + if (!ATI_MACH32) { if ((mach->regs[0xb6] & 0x18) == 0x08) { svga->hdisp <<= 1; svga->htotal <<= 1; @@ -2823,7 +2836,7 @@ mach_recalctimings(svga_t *svga) if (dev->interlace) dev->dispend >>= 1; - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { mach_log("cntl=%d, clksel=%x, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d, vgahdisp=%d.\n", dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0x01, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 3, dev->interlace, svga->hdisp); @@ -2913,7 +2926,7 @@ mach_recalctimings(svga_t *svga) if ((svga->gdcreg[5] & 0x40) || (svga->attrregs[0x10] & 0x40) || (mach->regs[0xb0] & 0x20)) { svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel, svga->clock_gen); mach_log("VGA clock=%02x.\n", mach->regs[0xa7] & 0x80); - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->regs[0xb8] & 0x40) svga->clock *= 2; } else { @@ -2960,7 +2973,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u switch (port) { case 0x2e8: - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) dev->htotal = val; @@ -2969,7 +2982,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xae8: - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) { WRITE8(port, dev->hsync_start, val); } @@ -2978,7 +2991,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xee8: - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) { WRITE8(port, dev->hsync_width, val); } @@ -2995,14 +3008,17 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x6e8: if (len == 2) { mach_log("HDISP and HTOTAL=%04x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01); - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ - if (!(mach->shadow_cntl & 0x08)) { - WRITE8(port, dev->hdisped, val); + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { + if (!(mach->shadow_cntl & 0x08)) { + WRITE8(port, dev->hdisped, val); + } } - if (!(mach->shadow_cntl & 0x04)) - dev->htotal = (val >> 8) & 0xff; - + if (ATI_8514A_ULTRA) { + if (!(mach->shadow_cntl & 0x04)) + dev->htotal = (val >> 8) & 0xff; + } mach_set_resolution(mach, svga); } } else { @@ -3029,7 +3045,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x6e9: if (len == 1) { mach_log("HDISP and HTOTAL+1=%02x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01); - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) { dev->htotal = val; } @@ -3040,7 +3056,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x12e8: if (len == 2) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x10)) { dev->v_total_reg = val; dev->v_total_reg &= 0x1fff; @@ -3048,7 +3064,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_set_resolution(mach, svga); } } else { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x10)) { WRITE8(port, dev->v_total_reg, val); dev->v_total_reg &= 0x1fff; @@ -3061,7 +3077,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x12e9: if (len == 1) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ WRITE8(port, dev->v_total_reg, val); dev->v_total_reg &= 0x1fff; @@ -3109,7 +3125,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x1ae8: if (len == 2) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ dev->v_sync_start = val; dev->v_sync_start &= 0x1fff; @@ -3119,7 +3135,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("ATI 8514/A: V_SYNCSTART write 1AE8 = %d\n", dev->v_syncstart); mach_log("ATI 8514/A: (0x%04x): vsyncstart=0x%02x.\n", port, val); } else { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ WRITE8(port, dev->v_sync_start, val); dev->v_sync_start &= 0x1fff; @@ -3130,7 +3146,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x1ae9: if (len == 1) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ WRITE8(port, dev->v_sync_start, val); dev->v_sync_start &= 0x1fff; @@ -3181,12 +3197,12 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); - if ((dev->local & 0xff) < 0x02) { - dev->ext_crt_pitch = 128; - mach_set_resolution(mach, svga); - } else { + if (ATI_MACH32) { mach_set_resolution(mach, svga); mach32_updatemapping(mach, svga); + } else { + dev->ext_crt_pitch = 128; + mach_set_resolution(mach, svga); } mach_log("Vendor IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); break; @@ -3390,7 +3406,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { if ((dev->accel.multifunc_cntl >> 12) == 5) { - if ((dev->local & 0xff) < 0x02) + if (!ATI_MACH32) dev->ext_crt_pitch = 128; } } @@ -3514,12 +3530,12 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u else dev->ext_crt_pitch <<= 1; } - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { dev->on |= 0x01; dev->vendor_mode = 1; } svga_recalctimings(svga); - if ((dev->local & 0xff) >= 0x01) + if (ATI_GRAPHICS_ULTRA || ATI_MACH32) mach32_updatemapping(mach, svga); mach_log("ATI 8514/A: (0x%04x) CRT Pitch, val=0x%02x, crtpitch=%x, len=%d, extended 8514/A mode=%02x.\n", port, val, dev->ext_crt_pitch, len, mach->regs[0xb0] & 0x20); @@ -3548,17 +3564,17 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u else { WRITE8(port, mach->local_cntl, val); } - if ((dev->local & 0xff) >= 0x01) + if (ATI_GRAPHICS_ULTRA || ATI_MACH32) mach32_updatemapping(mach, svga); break; case 0x36ee: case 0x36ef: if (len == 2) { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) mach->misc = val; } else { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) WRITE8(port, mach->misc, val); } mach->misc &= 0xfff0; @@ -3621,7 +3637,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); svga_recalctimings(svga); - if ((dev->local & 0xff) >= 0x01) + if (ATI_GRAPHICS_ULTRA || ATI_MACH32) mach32_updatemapping(mach, svga); break; @@ -3675,7 +3691,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (!mach->pci_bus) mach->linear_base = (mach->memory_aperture & 0xff00) << 12; - if ((dev->local & 0xff) >= 0x01) + if (ATI_GRAPHICS_ULTRA || ATI_MACH32) mach32_updatemapping(mach, svga); break; @@ -3729,7 +3745,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u else { WRITE8(port, mach->accel.ext_ge_config, val); } - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->accel.crt_pitch & 0xff) dev->ext_crt_pitch = mach->accel.crt_pitch & 0xff; @@ -4407,46 +4423,46 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in case 0xdaee: if (len == 2) { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) temp = mach->accel.src_x; } else { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) temp = mach->accel.src_x & 0xff; } break; case 0xdaef: if (len == 1) { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) temp = mach->accel.src_x >> 8; } break; case 0xdeee: if (len == 2) { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) temp = mach->accel.src_y; } else { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) temp = mach->accel.src_y & 0xff; } break; case 0xdeef: if (len == 1) { - if ((dev->local & 0xff) >= 0x02) + if (ATI_MACH32) temp = mach->accel.src_y >> 8; } break; case 0xfaee: if (len == 2) { - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->pci_bus) temp = 0x0017; else temp = 0x22f7; } } else { - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->pci_bus) temp = 0x17; else @@ -4456,7 +4472,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; case 0xfaef: if (len == 1) { - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->pci_bus) temp = 0x00; else @@ -4604,7 +4620,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x36ee: case 0x36ef: - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { READ8(port, mach->misc); if (!(port & 1)) { temp &= ~0x0c; @@ -5148,7 +5164,7 @@ mach32_write(uint32_t addr, uint8_t val, void *priv) return; } - if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; switch (addr & 0x06) { case 0x00: @@ -5188,7 +5204,7 @@ mach32_writew(uint32_t addr, uint16_t val, void *priv) return; } - if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; if (addr & 0x04) { mach32_write_common(addr - 2, val & 0x0f, 0, mach, svga); @@ -5223,7 +5239,7 @@ mach32_writel(uint32_t addr, uint32_t val, void *priv) return; } - if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; mach32_write_common(addr, val & 0x0f, 0, mach, svga); mach32_write_common(addr + 1, (val >> 4) & 0x0f, 0, mach, svga); @@ -5639,7 +5655,7 @@ mach32_read(uint32_t addr, void *priv) (void) xga_read_test(addr, svga); addr = (addr & svga->banked_mask) + svga->read_bank; - if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; switch (addr & 0x06) { case 0x00: @@ -5676,7 +5692,7 @@ mach32_readw(uint32_t addr, void *priv) (void) xga_read_test(addr, svga); addr = (addr & svga->banked_mask) + svga->read_bank; - if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; if (addr & 0x04) { ret = mach32_read_common(addr - 2, 0, mach, svga) & 0x0f; @@ -5708,7 +5724,7 @@ mach32_readl(uint32_t addr, void *priv) (void) xga_read_test(addr, svga); addr = (addr & svga->banked_mask) + svga->read_bank; - if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; ret = mach32_read_common(addr, 0, mach, svga) & 0x0f; ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 4); @@ -5998,7 +6014,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) case 0xC: /*32k at B8000*/ mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); svga->banked_mask = 0x7fff; - if (((dev->local & 0xff) >= 0x02) && !(dev->accel.advfunc_cntl & 0x01) && !(mach->accel.clock_sel & 0x01)) { + if (ATI_MACH32 && !(dev->accel.advfunc_cntl & 0x01) && !(mach->accel.clock_sel & 0x01)) { if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) { if (svga->attrregs[0x10] & 0x40) { dev->vendor_mode = 0; @@ -6035,7 +6051,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) mem_mapping_disable(&mach->mmio_linear_mapping); } - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (dev->on && dev->vendor_mode) { mach_log("Mach32 banked mapping.\n"); mem_mapping_disable(&svga->mapping); @@ -6216,6 +6232,7 @@ ati8514_io_set(svga_t *svga) io_sethandler(0x7eee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x82ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x86ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); + io_sethandler(0x8aee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x8eee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x92ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x96ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); @@ -6238,6 +6255,7 @@ ati8514_io_set(svga_t *svga) io_sethandler(0xdeee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xe2ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xe6ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); + io_sethandler(0xeaee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xeeee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xf2ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xf6ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); @@ -6331,6 +6349,7 @@ mach_io_remove(mach_t *mach) io_removehandler(0x7eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x82ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x86ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x8aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x8eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x92ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x96ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); @@ -6353,6 +6372,7 @@ mach_io_remove(mach_t *mach) io_removehandler(0xdeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0xe2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0xe6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xeaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0xeeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0xf2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0xf6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); @@ -6817,7 +6837,7 @@ mach8_init(const device_t *info) dev->vram_512k_8514 = dev->vram_amount == 512; dev->accel.cmd_back = 1; - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { if (mach->pci_bus) { if (mach->has_bios) { rom_init(&mach->bios_rom, @@ -6852,7 +6872,7 @@ mach8_init(const device_t *info) 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { svga_init(info, svga, mach, dev->vram_amount << 10, /*default: 2MB for Mach32*/ mach_recalctimings, mach_in, mach_out, @@ -6940,7 +6960,7 @@ mach8_init(const device_t *info) mach_io_set(mach); mach->accel.cmd_type = -2; - if ((dev->local & 0xff) >= 0x02) { + if (ATI_MACH32) { svga->decode_mask = (4 << 20) - 1; mach->cursor_col_1 = 0xff; mach->ext_cur_col_1_r = 0xff; @@ -6985,13 +7005,21 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) mach_t *mach = (mach_t *) ext8514; ibm8514_t *dev = (ibm8514_t *) dev8514; + /*Init as 1024x768 87hz interlaced first, per 8514/A.*/ dev->on = 0; dev->ext_pitch = 1024; dev->ext_crt_pitch = 0x80; dev->accel_bpp = 8; dev->rowoffset = 0x80; - dev->hdisp = 1024; - dev->vdisp = 768; + dev->hdisped = 0x7f; + dev->v_disp = 0x05ff; + dev->htotal = 0x9d; + dev->v_total_reg = 0x0668; + dev->v_sync_start = 0x0600; + dev->disp_cntl = 0x33; + mach->accel.clock_sel = 0x1c; + mach->shadow_set = 0x02; + mach->resolution_crt = 0x02; io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga); ati8514_io_set(svga); diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index a44838d68..8d1535dda 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -904,7 +904,7 @@ svga_recalctimings(svga_t *svga) svga->recalctimings_ex(svga); if (ibm8514_active && (svga->dev8514 != NULL)) { - if ((dev->local & 0xff) == 0x00) + if (IBM_8514A || ATI_8514A_ULTRA) ibm8514_recalctimings(svga); } @@ -1031,8 +1031,8 @@ svga_recalctimings(svga_t *svga) if (ibm8514_active && (svga->dev8514 != NULL)) { if (dev->on) { disptime8514 = dev->h_total; - _dispontime8514 = (dev->hdisped + 1) * 8; - svga_log("HDISPED 8514=%d, htotal=%02x.\n", (dev->hdisped + 1) << 3, dev->h_total); + _dispontime8514 = dev->h_disp; + svga_log("HTOTAL=%d, HDISP=%d.\n", dev->h_total, dev->h_disp); } } From ef588c118a1123161a8ee3ba7790c58686627487 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 29 Mar 2025 20:36:00 +0100 Subject: [PATCH 015/118] Fixed log excess. --- src/video/vid_8514a.c | 4 ++-- src/video/vid_ati_mach8.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index df4cd7d9a..393b90b57 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -357,13 +357,13 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0xae8: WRITE8(port, dev->hsync_start, val); - pclog("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_start=%d.\n", port, val, (val + 1) << 3); + ibm8514_log("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_start=%d.\n", port, val, (val + 1) << 3); svga_recalctimings(svga); break; case 0xee8: WRITE8(port, dev->hsync_width, val); - pclog("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_width=%d, hsyncpol=%02x.\n", port, val & 0x1f, ((val & 0x1f) + 1) << 3, val & 0x20); + ibm8514_log("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_width=%d, hsyncpol=%02x.\n", port, val & 0x1f, ((val & 0x1f) + 1) << 3, val & 0x20); svga_recalctimings(svga); break; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index ba32dc129..c21730497 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2725,7 +2725,7 @@ ati8514_recalctimings(svga_t *svga) dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); mach->accel.ge_offset = dev->accel.ge_offset; - pclog("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", + mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x05, mach->accel.clock_sel & 0x01); dev->h_disp = dev->hdisp; From eeab2fe4090a75999bfdedb6ded9f4c82371ffbc Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 29 Mar 2025 20:56:06 +0100 Subject: [PATCH 016/118] NE2000 Compatibles: Store the UI correctly. --- src/network/net_ne2000.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 71e5c2ca7..e45b55b22 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -1071,7 +1071,7 @@ nic_init(const device_t *info) mac_oui = (((int) dev->maclocal[0]) << 16); mac_oui |= (((int) dev->maclocal[1]) << 8); mac_oui |= ((int) dev->maclocal[2]); - device_set_config_mac("mac", mac); + device_set_config_mac("mac_oui", mac_oui); } else { dev->maclocal[0] = (mac_oui >> 16) & 0xff; dev->maclocal[1] = (mac_oui >> 8) & 0xff; From 90464f7914d9d2ea0e99541f2729f2787e9d6c51 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 30 Mar 2025 03:12:55 +0200 Subject: [PATCH 017/118] OKI IF386AX: Default NVR to 0x00's instead of 0xFF's, in order to default it to CRT instead of LCD. --- src/device/serial.c | 3 +-- src/machine/m_at_286_386sx.c | 10 +++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/device/serial.c b/src/device/serial.c index 8483f7fe3..deb97225a 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -999,8 +999,7 @@ void serial_standalone_init(void) { while (next_inst < SERIAL_MAX) - device_add_inst(!strcmp(machine_get_internal_name(), "if386sx") ? &ns16450_device : - &ns8250_device, next_inst + 1); + device_add_inst(&ns8250_device, next_inst + 1); }; const device_t ns8250_device = { diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 033233955..b084bfbbd 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -653,7 +653,9 @@ machine_at_if386sx_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init(model); + machine_at_common_init_ex(model, 2); + device_add(&amstrad_megapc_nvr_device); /* NVR that is initialized to all 0x00's. */ + device_add(&keyboard_at_phoenix_device); device_add(&neat_sx_device); @@ -663,6 +665,12 @@ machine_at_if386sx_init(const machine_t *model) if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); + /* + One serial port - on the real hardware IF386AX, it is on the VL 16C451, + alognside the bidirectional parallel port. + */ + device_add_inst(&ns16450_device, 1); + return ret; } From 19e01b8ddfb318f892c6f49859d63d19e9d74e2b Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 30 Mar 2025 03:40:08 +0200 Subject: [PATCH 018/118] UI: Optimize several Settings pages to reduce the amount of iterations and repeated calls to functions where multiple there are multiple instances of the same device type, should further speed up te opening of the Settings dialog. --- src/qt/qt_settingsnetwork.cpp | 78 +++++++++++++----------- src/qt/qt_settingsotherperipherals.cpp | 56 ++++++++++------- src/qt/qt_settingsports.cpp | 59 +++++++++++------- src/qt/qt_settingssound.cpp | 63 ++++++++++--------- src/qt/qt_settingsstoragecontrollers.cpp | 55 ++++++++++------- 5 files changed, 184 insertions(+), 127 deletions(-) diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index a0acd7a3f..9a53411d5 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -137,54 +137,63 @@ SettingsNetwork::onCurrentMachineChanged(int machineId) { this->machineId = machineId; - int c = 0; - int selectedRow = 0; + int c = 0; + int selectedRow = 0; - for (int i = 0; i < NET_CARD_MAX; ++i) { - auto *cbox = findChild(QString("comboBoxNIC%1").arg(i + 1)); - auto *model = cbox->model(); - auto removeRows = model->rowCount(); - c = 0; - selectedRow = 0; + // Network Card + QComboBox * cbox_[NET_CARD_MAX] = { 0 }; + QAbstractItemModel *models[NET_CARD_MAX] = { 0 }; + int removeRows_[NET_CARD_MAX] = { 0 }; + int selectedRows[NET_CARD_MAX] = { 0 }; + int m_has_net = machine_has_flags(machineId, MACHINE_NIC); - while (true) { - /* Skip "internal" if machine doesn't have it or this is not the primary card. */ - if ((c == 1) && ((i > 0) || (machine_has_flags(machineId, MACHINE_NIC) == 0))) { - c++; - continue; - } + for (uint8_t i = 0; i < NET_CARD_MAX; ++i) { + cbox_[i] = findChild(QString("comboBoxNIC%1").arg(i + 1)); + models[i] = cbox_[i]->model(); + removeRows_[i] = models[i]->rowCount(); + } - auto name = DeviceConfig::DeviceName(network_card_getdevice(c), network_card_get_internal_name(c), 1); - if (name.isEmpty()) { - break; - } + c = 0; + while (true) { + const QString name = DeviceConfig::DeviceName(network_card_getdevice(c), + network_card_get_internal_name(c), 1); - if (network_card_available(c) && device_is_valid(network_card_getdevice(c), machineId)) { - int row = Models::AddEntry(model, name, c); - if (c == net_cards_conf[i].device_num) { - selectedRow = row - removeRows; + if (name.isEmpty()) + break; + + if (network_card_available(c)) { + if (device_is_valid(network_card_getdevice(c), machineId)) { + for (uint8_t i = 0; i < NET_CARD_MAX; ++i) { + if ((c != 1) || ((i == 0) && m_has_net)) { + int row = Models::AddEntry(models[i], name, c); + + if (c == net_cards_conf[i].device_num) + selectedRows[i] = row - removeRows_[i]; + } } } - c++; } - model->removeRows(0, removeRows); - cbox->setEnabled(model->rowCount() > 0); - cbox->setCurrentIndex(-1); - cbox->setCurrentIndex(selectedRow); + c++; + } - cbox = findChild(QString("comboBoxNet%1").arg(i + 1)); - model = cbox->model(); - removeRows = model->rowCount(); + for (uint8_t i = 0; i < NET_CARD_MAX; ++i) { + models[i]->removeRows(0, removeRows_[i]); + cbox_[i]->setEnabled(models[i]->rowCount() > 1); + cbox_[i]->setCurrentIndex(-1); + cbox_[i]->setCurrentIndex(selectedRows[i]); + + auto cbox = findChild(QString("comboBoxNet%1").arg(i + 1)); + auto model = cbox->model(); + auto removeRows = model->rowCount(); Models::AddEntry(model, tr("Null Driver"), NET_TYPE_NONE); Models::AddEntry(model, "SLiRP", NET_TYPE_SLIRP); - if (network_ndev > 1) { + if (network_ndev > 1) Models::AddEntry(model, "PCap", NET_TYPE_PCAP); - } - if (network_devmap.has_vde) { + + if (network_devmap.has_vde) Models::AddEntry(model, "VDE", NET_TYPE_VDE); - } model->removeRows(0, removeRows); cbox->setCurrentIndex(cbox->findData(net_cards_conf[i].net_type)); @@ -205,6 +214,7 @@ SettingsNetwork::onCurrentMachineChanged(int machineId) model->removeRows(0, removeRows); cbox->setCurrentIndex(selectedRow); } + if (net_cards_conf[i].net_type == NET_TYPE_VDE) { QString currentVdeSocket = net_cards_conf[i].host_dev_name; auto editline = findChild(QString("socketVDENIC%1").arg(i+1)); diff --git a/src/qt/qt_settingsotherperipherals.cpp b/src/qt/qt_settingsotherperipherals.cpp index a7db551ad..b780dc1a6 100644 --- a/src/qt/qt_settingsotherperipherals.cpp +++ b/src/qt/qt_settingsotherperipherals.cpp @@ -83,31 +83,45 @@ SettingsOtherPeripherals::onCurrentMachineChanged(int machineId) ui->comboBoxRTC->setCurrentIndex(selectedRow); ui->pushButtonConfigureRTC->setEnabled((isartc_type != 0) && isartc_has_config(isartc_type) && machineHasIsa); - for (int c = 0; c < ISAMEM_MAX; c++) { - auto *cbox = findChild(QString("comboBoxCard%1").arg(c + 1)); - model = cbox->model(); - d = 0; - selectedRow = 0; - while (true) { - QString name = DeviceConfig::DeviceName(isamem_get_device(d), isamem_get_internal_name(d), 0); - if (name.isEmpty()) { - break; - } + // ISA Memory Expansion Card + QComboBox * cbox[ISAMEM_MAX] = { 0 }; + QAbstractItemModel *models[ISAMEM_MAX] = { 0 }; + int removeRows_[ISAMEM_MAX] = { 0 }; + int selectedRows[ISAMEM_MAX] = { 0 }; - if (!device_is_valid(isamem_get_device(d), machineId)) { - break; - } + for (uint8_t c = 0; c < ISAMEM_MAX; ++c) { + cbox[c] = findChild(QString("comboBoxCard%1").arg(c + 1)); + models[c] = cbox[c]->model(); + removeRows_[c] = models[c]->rowCount(); + } - int row = Models::AddEntry(model, name, d); - if (d == isamem_type[c]) { - selectedRow = row; + d = 0; + while (true) { + const QString name = DeviceConfig::DeviceName(isamem_get_device(d), + isamem_get_internal_name(d), 0); + + if (name.isEmpty()) + break; + + if (device_is_valid(isamem_get_device(d), machineId)) { + for (uint8_t c = 0; c < ISAMEM_MAX; ++c) { + int row = Models::AddEntry(models[c], name, d); + + if (d == isamem_type[c]) + selectedRows[c] = row - removeRows_[c]; } - ++d; } - cbox->setCurrentIndex(-1); - cbox->setCurrentIndex(selectedRow); - cbox->setEnabled(machineHasIsa); - findChild(QString("pushButtonConfigureCard%1").arg(c + 1))->setEnabled((isamem_type[c] != 0) && isamem_has_config(isamem_type[c]) && machineHasIsa); + + d++; + } + + for (uint8_t c = 0; c < ISAMEM_MAX; ++c) { + models[c]->removeRows(0, removeRows_[c]); + cbox[c]->setEnabled(models[c]->rowCount() > 1); + cbox[c]->setCurrentIndex(-1); + cbox[c]->setCurrentIndex(selectedRows[c]); + findChild(QString("pushButtonConfigureCard%1").arg(c + 1))->setEnabled((isamem_type[c] != 0) && + isamem_has_config(isamem_type[c]) && machineHasIsa); } } diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index cb1ab794a..f68106dc9 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -73,34 +73,49 @@ SettingsPorts::onCurrentMachineChanged(int machineId) { this->machineId = machineId; - for (int i = 0; i < PARALLEL_MAX; i++) { - auto *cbox = findChild(QString("comboBoxLpt%1").arg(i + 1)); - auto *model = cbox->model(); - const auto removeRows = model->rowCount(); - int c = 0; - int selectedRow = 0; - while (true) { - const char *lptName = lpt_device_get_name(c); - if (lptName == nullptr) { - break; - } + int c = 0; - int row = Models::AddEntry(model, tr(lptName), c); - if (c == lpt_ports[i].device) { - selectedRow = row - removeRows; - } - c++; + // LPT Device + QComboBox * cbox[PARALLEL_MAX] = { 0 }; + QAbstractItemModel *models[PARALLEL_MAX] = { 0 }; + int removeRows_[PARALLEL_MAX] = { 0 }; + int selectedRows[PARALLEL_MAX] = { 0 }; + + for (uint8_t i = 0; i < PARALLEL_MAX; ++i) { + cbox[i] = findChild(QString("comboBoxLpt%1").arg(i + 1)); + models[i] = cbox[i]->model(); + removeRows_[i] = models[i]->rowCount(); + } + + while (true) { + const char *lptName = lpt_device_get_name(c); + + if (lptName == nullptr) + break; + + const QString name = tr(lptName); + + for (uint8_t i = 0; i < PARALLEL_MAX; ++i) { + int row = Models::AddEntry(models[i], name, c); + + if (c == lpt_ports[i].device) + selectedRows[i] = row - removeRows_[i]; } - model->removeRows(0, removeRows); - cbox->setEnabled(model->rowCount() > 0); - cbox->setCurrentIndex(-1); - cbox->setCurrentIndex(selectedRow); + + c++; + } + + for (uint8_t i = 0; i < PARALLEL_MAX; ++i) { + models[i]->removeRows(0, removeRows_[i]); + cbox[i]->setEnabled(models[i]->rowCount() > 1); + cbox[i]->setCurrentIndex(-1); + cbox[i]->setCurrentIndex(selectedRows[i]); auto *checkBox = findChild(QString("checkBoxParallel%1").arg(i + 1)); if (checkBox != NULL) checkBox->setChecked(lpt_ports[i].enabled > 0); - if (cbox != NULL) - cbox->setEnabled(lpt_ports[i].enabled > 0); + if (cbox[i] != NULL) + cbox[i]->setEnabled(lpt_ports[i].enabled > 0); } for (int i = 0; i < SERIAL_MAX; i++) { diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index cca903076..3e1240888 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -73,46 +73,51 @@ SettingsSound::onCurrentMachineChanged(const int machineId) { this->machineId = machineId; - int c; - int selectedRow; + int c; + int selectedRow; // Sound Card + QComboBox * cbox[SOUND_CARD_MAX] = { 0 }; + QAbstractItemModel *models[SOUND_CARD_MAX] = { 0 }; + int removeRows_[SOUND_CARD_MAX] = { 0 }; + int selectedRows[SOUND_CARD_MAX] = { 0 }; + int m_has_snd = machine_has_flags(machineId, MACHINE_SOUND); + for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) { - QComboBox *cbox = findChild(QString("comboBoxSoundCard%1").arg(i + 1)); - c = 0; - auto model = cbox->model(); - auto removeRows = model->rowCount(); - selectedRow = 0; + cbox[i] = findChild(QString("comboBoxSoundCard%1").arg(i + 1)); + models[i] = cbox[i]->model(); + removeRows_[i] = models[i]->rowCount(); + } - while (true) { - /* Skip "internal" if machine doesn't have it or this is not the primary card. */ - if ((c == 1) && ((i > 0) || (machine_has_flags(machineId, MACHINE_SOUND) == 0))) { - c++; - continue; - } + c = 0; + while (true) { + const QString name = DeviceConfig::DeviceName(sound_card_getdevice(c), + sound_card_get_internal_name(c), 1); - const QString name = DeviceConfig::DeviceName(sound_card_getdevice(c), sound_card_get_internal_name(c), 1); - if (name.isEmpty()) { - break; - } + if (name.isEmpty()) + break; - if (sound_card_available(c)) { - const device_t *sound_dev = sound_card_getdevice(c); - if (device_is_valid(sound_dev, machineId)) { - int row = Models::AddEntry(model, name, c); - if (c == sound_card_current[i]) { - selectedRow = row - removeRows; + if (sound_card_available(c)) { + if (device_is_valid(sound_card_getdevice(c), machineId)) { + for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) { + if ((c != 1) || ((i == 0) && m_has_snd)) { + int row = Models::AddEntry(models[i], name, c); + + if (c == sound_card_current[i]) + selectedRows[i] = row - removeRows_[i]; } } } - - c++; } - model->removeRows(0, removeRows); - cbox->setEnabled(model->rowCount() > 0); - cbox->setCurrentIndex(-1); - cbox->setCurrentIndex(selectedRow); + c++; + } + + for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) { + models[i]->removeRows(0, removeRows_[i]); + cbox[i]->setEnabled(models[i]->rowCount() > 1); + cbox[i]->setCurrentIndex(-1); + cbox[i]->setCurrentIndex(selectedRows[i]); } // Midi Out diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 4adfe1546..eebed79e2 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -171,35 +171,48 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) ui->comboBoxCDInterface->setCurrentIndex(-1); ui->comboBoxCDInterface->setCurrentIndex(selectedRow); + // SCSI Card + QComboBox * cbox[SCSI_CARD_MAX] = { 0 }; + QAbstractItemModel *models[SCSI_CARD_MAX] = { 0 }; + int removeRows_[SCSI_CARD_MAX] = { 0 }; + int selectedRows[SCSI_CARD_MAX] = { 0 }; + int m_has_scsi = machine_has_flags(machineId, MACHINE_SCSI); + for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) { - QComboBox *cbox = findChild(QString("comboBoxSCSI%1").arg(i + 1)); - c = 0; - model = cbox->model(); - removeRows = model->rowCount(); - selectedRow = 0; + cbox[i] = findChild(QString("comboBoxSCSI%1").arg(i + 1)); + models[i] = cbox[i]->model(); + removeRows_[i] = models[i]->rowCount(); + } - while (true) { - QString name = DeviceConfig::DeviceName(scsi_card_getdevice(c), scsi_card_get_internal_name(c), 1); - if (name.isEmpty()) { - break; - } + c = 0; + while (true) { + const QString name = DeviceConfig::DeviceName(scsi_card_getdevice(c), + scsi_card_get_internal_name(c), 1); - if (scsi_card_available(c)) { - const device_t *scsi_dev = scsi_card_getdevice(c); - if (device_is_valid(scsi_dev, machineId)) { - int row = Models::AddEntry(model, name, c); - if (c == scsi_card_current[i]) { - selectedRow = row - removeRows; + if (name.isEmpty()) + break; + + if (scsi_card_available(c)) { + if (device_is_valid(scsi_card_getdevice(c), machineId)) { + for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) { + if ((c != 1) || ((i == 0) && m_has_scsi)) { + int row = Models::AddEntry(models[i], name, c); + + if (c == scsi_card_current[i]) + selectedRows[i] = row - removeRows_[i]; } } } - c++; } - model->removeRows(0, removeRows); - cbox->setEnabled(model->rowCount() > 0); - cbox->setCurrentIndex(-1); - cbox->setCurrentIndex(selectedRow); + c++; + } + + for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) { + models[i]->removeRows(0, removeRows_[i]); + cbox[i]->setEnabled(models[i]->rowCount() > 1); + cbox[i]->setCurrentIndex(-1); + cbox[i]->setCurrentIndex(selectedRows[i]); } int is_at = IS_AT(machineId); From 3fc6d29462a2f3bf6e5c7ecf79ca423e9f5ebb33 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 30 Mar 2025 04:53:48 +0200 Subject: [PATCH 019/118] JEGA/JVGA: Only update renderer override on master, do not update CRTC cursor location unless it's either master or slave, and only override the text mode renderer - fixes AX Windows 3.0 386 enhanced mode returning from DOS box to full screen. --- src/video/vid_ega.c | 5 +---- src/video/vid_ega_render.c | 5 +++++ src/video/vid_jega.c | 39 +++++++++++++++++++++++++++---------- src/video/vid_svga.c | 6 ++---- src/video/vid_svga_render.c | 10 ++++++++++ 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index f002ef999..5b5427b9e 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -783,10 +783,7 @@ ega_poll(void *priv) ega->y_add *= ega->vres + 1; for (y = 0; y <= ega->vres; y++) { /* Render scanline */ - if (ega->render_override) - ega->render_override(ega->priv_parent); - else - ega->render(ega); + ega->render(ega); /* Render overscan */ ega->x_add = (overscan_x >> 1); diff --git a/src/video/vid_ega_render.c b/src/video/vid_ega_render.c index 10667084a..8a73ffbbb 100644 --- a/src/video/vid_ega_render.c +++ b/src/video/vid_ega_render.c @@ -107,6 +107,11 @@ ega_render_overscan_right(ega_t *ega) void ega_render_text(ega_t *ega) { + if (ega->render_override) { + ega->render_override(ega->priv_parent); + return; + } + if ((ega->displine + ega->y_add) < 0) return; diff --git a/src/video/vid_jega.c b/src/video/vid_jega.c index 11c9cbf8d..a238fbff9 100644 --- a/src/video/vid_jega.c +++ b/src/video/vid_jega.c @@ -464,21 +464,40 @@ jega_out(uint16_t addr, uint8_t val, void *priv) case 0x3d5: /* Data */ if (jega->regs_index != RINVALID_INDEX) { + if ((jega->regs_index < 7) && (jega->regs[0x11] & 0x80)) + return; + if ((jega->regs_index == 7) && (jega->regs[0x11] & 0x80)) + val = (jega->regs[7] & ~0x10) | (val & 0x10); + /* + Do not allow cursor updates if neither master nor slave is + active - the AX Windows 3.0 386 Enhanced Mode DOS grabber + relies on this for the cursor position to behave correctly. + */ + if ((jega->regs_index >= 0x0e) && (jega->regs_index <= 0x0f) && !(jega->regs[RMOD1] & 0x0c)) + return; jega->regs[jega->regs_index] = val; jega_log("JEGA Out %04X(%02X) %02Xh(%d) %04X:%04X\n", addr, jega->regs_index, val, val, cs >> 4, cpu_state.pc); switch (jega->regs_index) { case RMOD1: /* if the value is changed */ - if (jega->is_vga) { - if (val & 0x40) - jega->vga.svga.render_override = NULL; - else - jega->vga.svga.render_override = jega_render_text; - } else { - if (val & 0x40) - jega->ega.render_override = NULL; - else - jega->ega.render_override = jega_render_text; + /* + Do not allow override toggling unless it's on master and + only override the text renderer - the AX Windows 3.0 386 + Enhanced Mode DOS grabber relies on this for the grabbing + to behave correctly. + */ + if (val & 0x08) { + if (jega->is_vga) { + if (val & 0x40) + jega->vga.svga.render_override = NULL; + else + jega->vga.svga.render_override = jega_render_text; + } else { + if (val & 0x40) + jega->ega.render_override = NULL; + else + jega->ega.render_override = jega_render_text; + } } break; case RDAGS: diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 8d1535dda..b4abc18e5 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -1176,10 +1176,7 @@ svga_do_render(svga_t *svga) } if (!svga->override) { - if (svga->render_override) - svga->render_override(svga->priv_parent); - else - svga->render(svga); + svga->render(svga); svga->x_add = (svga->monitor->mon_overscan_x >> 1); svga_render_overscan_left(svga); @@ -2019,6 +2016,7 @@ svga_doblit(int wx, int wy, svga_t *svga) /* Block resolution changes while in DPMS mode to avoid getting a bogus screen width (320). We're already rendering a blank screen anyway. */ + pclog("%i + %i, %i + %i\n", svga->monitor->mon_xsize, x_add, svga->monitor->mon_ysize, y_add); if (!svga->dpms) set_screen_size_monitor(svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index); diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index c05d308fa..fbd667a1b 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -147,6 +147,11 @@ svga_render_text_40(svga_t *svga) int bg; uint32_t addr = 0; + if (svga->render_override) { + svga->render_override(svga->priv_parent); + return; + } + if ((svga->displine + svga->y_add) < 0) return; @@ -225,6 +230,11 @@ svga_render_text_80(svga_t *svga) int bg; uint32_t addr = 0; + if (svga->render_override) { + svga->render_override(svga->priv_parent); + return; + } + if ((svga->displine + svga->y_add) < 0) return; From e4877a57c52e81cace94e7e025352a9d1a0dca03 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 30 Mar 2025 07:28:20 +0200 Subject: [PATCH 020/118] EGA/JEGA: More fixes and implemented more C&T SuperEGA behavior. --- src/video/vid_ega.c | 97 ++++++++++++++++++++++++++++++++------------ src/video/vid_jega.c | 3 +- 2 files changed, 72 insertions(+), 28 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 5b5427b9e..82c88d827 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -61,14 +61,38 @@ int update_overscan = 0; uint8_t ega_in(uint16_t addr, void *priv); +static int +ega_get_type(ega_t *ega) +{ + int ret = ega_type; + + if (ega->actual_type == EGA_SUPEREGA) + ret = (ega->crtc[0x17] & 0x10) ? EGA_TYPE_OTHER : EGA_TYPE_IBM; + + return ret; +} + +static int +ega_get_actual_type(ega_t *ega) +{ + int ret = ega->actual_type; + + if (ega->actual_type == EGA_SUPEREGA) + ret = (ega->crtc[0x17] & 0x10) ? EGA_SUPEREGA : EGA_IBM; + + return ret; +} + void ega_out(uint16_t addr, uint8_t val, void *priv) { ega_t *ega = (ega_t *) priv; uint8_t o; uint8_t old; - uint8_t gdcmask = (ega->actual_type == EGA_SUPEREGA) ? 0xff : 0x0f; - uint8_t crtcmask = (ega->actual_type == EGA_SUPEREGA) ? 0xff : 0x1f; + int type = ega_get_type(ega); + int atype = ega_get_actual_type(ega); + uint8_t gdcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x0f; + uint8_t crtcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x1f; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1)) addr ^= 0x60; @@ -94,7 +118,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) case 0x3c0: case 0x3c1: - if (ega->actual_type == EGA_SUPEREGA) + if (atype == EGA_SUPEREGA) val &= 0x7f; /* Bit 7 indicates the flipflop status (read only) */ if (!ega->attrff) { ega->attraddr = val & 31; @@ -110,7 +134,8 @@ ega_out(uint16_t addr, uint8_t val, void *priv) ega->attrregs[ega->attraddr & 31] = val; if (ega->attraddr < 16) ega->fullchange = changeframecount; - if (ega->attraddr == 0x10 || ega->attraddr == 0x14 || ega->attraddr < 0x10) { + int is_attr14 = ega->chipset && (ega->attraddr == 0x14); + if ((ega->attraddr == 0x10) || is_attr14 || (ega->attraddr < 0x10)) { for (uint8_t c = 0; c < 16; c++) { if (ega->chipset) { if (ega->attrregs[0x10] & 0x80) @@ -148,7 +173,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) if (!(val & 1)) io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega); ega_recalctimings(ega); - if ((ega_type == EGA_TYPE_COMPAQ) && !(val & 0x02)) + if ((type == EGA_TYPE_COMPAQ) && !(val & 0x02)) mem_mapping_disable(&ega->mapping); else switch (ega->gdcreg[6] & 0xc) { case 0x0: /*128k at A0000*/ @@ -198,7 +223,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) } break; case 0x3c6: - if (ega_type == EGA_TYPE_COMPAQ) + if (type == EGA_TYPE_COMPAQ) ega->ctl_mode = val; break; case 0x3ce: @@ -219,7 +244,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) ega->chain2_read = val & 0x10; break; case 6: - if ((ega_type == EGA_TYPE_COMPAQ) && !(ega->miscout & 0x02)) + if ((type == EGA_TYPE_COMPAQ) && !(ega->miscout & 0x02)) mem_mapping_disable(&ega->mapping); else switch (val & 0xc) { case 0x0: /*128k at A0000*/ @@ -306,6 +331,8 @@ ega_in(uint16_t addr, void *priv) ega_t *ega = (ega_t *) priv; uint8_t gdcmask = (ega->actual_type == EGA_SUPEREGA) ? 0xff : 0x0f; uint8_t ret = 0xff; + int type = ega_get_type(ega); + int atype = ega_get_actual_type(ega); if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1)) addr ^= 0x60; @@ -329,48 +356,58 @@ ega_in(uint16_t addr, void *priv) break; case 0x3c0: - if (ega_type == EGA_TYPE_OTHER) - ret = ega->attraddr | ega->attr_palette_enable; - if (ega->actual_type == EGA_SUPEREGA && ega->attrff) - ret |= 0x80; /* Bit 7 indicates the flipflop status (read only) */ - break; case 0x3c1: - if (ega_type == EGA_TYPE_OTHER) - ret = ega->attrregs[ega->attraddr]; + if (type == EGA_TYPE_OTHER) { + int data = (atype == EGA_SUPEREGA) ? (ega->attrff & 1) : (addr & 1); + if (data) + ret = ega->attrregs[ega->attraddr]; + else + ret = ega->attraddr | ega->attr_palette_enable; + if (atype == EGA_SUPEREGA) + /* Bit 7 indicates the flipflop status (read only) */ + ret = (ret & 0x3f) | (ega->attrff ? 0x80 : 0x00); + } break; case 0x3c2: ret = (egaswitches & (8 >> egaswitchread)) ? 0x10 : 0x00; break; case 0x3c4: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) ret = ega->seqaddr; break; case 0x3c5: - if (ega_type == EGA_TYPE_OTHER) - ret = ega->seqregs[ega->seqaddr & 0xf]; + if (type == EGA_TYPE_OTHER) { + if ((ega->seqaddr & 0x0f) > 0x04) + ret = ega->chipset ? ega->seqregs[ega->seqaddr & 0xf] : 0xff; + else + ret = ega->seqregs[ega->seqaddr & 0xf]; + } break; case 0x3c6: - if (ega_type == EGA_TYPE_COMPAQ) + if (type == EGA_TYPE_COMPAQ) ret = ega->ctl_mode; break; case 0x3c8: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) ret = 2; break; case 0x3cc: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) ret = ega->miscout; break; case 0x3ce: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) ret = ega->gdcaddr; break; case 0x3cf: - if (ega_type == EGA_TYPE_OTHER) { + if (type == EGA_TYPE_OTHER) { switch (ega->gdcaddr & gdcmask) { default: ret = ega->gdcreg[ega->gdcaddr & gdcmask]; break; + case 0x09 ... 0xf7: + ret = ega->chipset ? ega->gdcreg[ega->gdcaddr & gdcmask] : 0xff; + break; case 0xf8: ret = ega->la; break; @@ -388,8 +425,14 @@ ega_in(uint16_t addr, void *priv) break; case 0x3d0: case 0x3d4: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) { ret = ega->crtcreg; + if (atype == EGA_SUPEREGA) { + ret = (ret & 0x1f) | 0xc0; + if ((ega->crtcreg & 0xc0) == 0xc0) + ret |= 0x20; + } + } break; case 0x3d1: case 0x3d5: @@ -402,28 +445,28 @@ ega_in(uint16_t addr, void *priv) break; case 0x10: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) ret = ega->crtc[ega->crtcreg]; else ret = ega->light_pen >> 8; break; case 0x11: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) ret = ega->crtc[ega->crtcreg]; else ret = ega->light_pen & 0xff; break; default: - if (ega_type == EGA_TYPE_OTHER) + if (type == EGA_TYPE_OTHER) ret = ega->crtc[ega->crtcreg]; break; } break; case 0x3da: ega->attrff = 0; - if (ega_type == EGA_TYPE_COMPAQ) { + if (type == EGA_TYPE_COMPAQ) { ret = ega->stat & 0xcf; switch ((ega->attrregs[0x12] >> 4) & 0x03) { case 0x00: diff --git a/src/video/vid_jega.c b/src/video/vid_jega.c index a238fbff9..4240f5e98 100644 --- a/src/video/vid_jega.c +++ b/src/video/vid_jega.c @@ -428,7 +428,8 @@ jega_out(uint16_t addr, uint8_t val, void *priv) } } else { jega->attrregs[jega->attraddr & 31] = val; - if (jega->attraddr < 0x10) { + int is_attr14 = jega->is_vga ? (jega->attraddr == 0x14) : 0; + if (is_attr14 || (jega->attraddr < 0x10)) { for (uint8_t c = 0; c < 16; c++) { if (jega->is_vga) { if (jega->attrregs[0x10] & 0x80) From d2afb44412e414b0357c3f318c0fb5f5fbf41237 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 30 Mar 2025 07:32:46 +0200 Subject: [PATCH 021/118] SVGA: Remove some excess logging. --- src/video/vid_svga.c | 1 - src/video/vid_svga_render.c | 9 --------- 2 files changed, 10 deletions(-) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index b4abc18e5..d0189e0f7 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -2016,7 +2016,6 @@ svga_doblit(int wx, int wy, svga_t *svga) /* Block resolution changes while in DPMS mode to avoid getting a bogus screen width (320). We're already rendering a blank screen anyway. */ - pclog("%i + %i, %i + %i\n", svga->monitor->mon_xsize, x_add, svga->monitor->mon_ysize, y_add); if (!svga->dpms) set_screen_size_monitor(svga->monitor->mon_xsize + x_add, svga->monitor->mon_ysize + y_add, svga->monitor_index); diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index fbd667a1b..d47697a7e 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -85,18 +85,9 @@ svga_render_blank(svga_t *svga) break; } -#if 0 - pclog("svga->displine = %i, svga->y_add = %i, svga->x_add = %i\n", svga->displine, svga->y_add, svga->x_add); -#endif uint32_t *line_ptr = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; -#if 0 - pclog("svga->hdisp = %i, svga->scrollcache = %i, char_width = %i, sizeof(uint32_t) = %i\n", svga->hdisp, svga->scrollcache, char_width, sizeof(uint32_t)); -#endif uint32_t line_width = (uint32_t) (svga->hdisp + svga->scrollcache) * char_width * sizeof(uint32_t); -#if 0 - pclog("line_width = %i\n", line_width); -#endif if ((svga->hdisp + svga->scrollcache) > 0) memset(line_ptr, 0, line_width); } From 5569fa6f5dfbe2bed794236515307fcedcf17b91 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 30 Mar 2025 08:22:14 +0200 Subject: [PATCH 022/118] C&T SuperEGA: More fixes, the BIOS no longer freezes on attempting to boot from anything. --- src/video/vid_ega.c | 90 +++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 82c88d827..03121751d 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -61,37 +61,15 @@ int update_overscan = 0; uint8_t ega_in(uint16_t addr, void *priv); -static int -ega_get_type(ega_t *ega) -{ - int ret = ega_type; - - if (ega->actual_type == EGA_SUPEREGA) - ret = (ega->crtc[0x17] & 0x10) ? EGA_TYPE_OTHER : EGA_TYPE_IBM; - - return ret; -} - -static int -ega_get_actual_type(ega_t *ega) -{ - int ret = ega->actual_type; - - if (ega->actual_type == EGA_SUPEREGA) - ret = (ega->crtc[0x17] & 0x10) ? EGA_SUPEREGA : EGA_IBM; - - return ret; -} - void ega_out(uint16_t addr, uint8_t val, void *priv) { ega_t *ega = (ega_t *) priv; uint8_t o; uint8_t old; - int type = ega_get_type(ega); - int atype = ega_get_actual_type(ega); - uint8_t gdcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x0f; + int type = ega_type; + int atype = ega->actual_type; + uint8_t gdcmask = (ega_type == EGA_SUPEREGA) ? 0xff : 0x0f; uint8_t crtcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x1f; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1)) @@ -168,7 +146,8 @@ ega_out(uint16_t addr, uint8_t val, void *priv) ega->pallook = ega->vres ? pallook16 : pallook64; ega->vidclock = val & 4; ega->miscout = val; - ega->overscan_color = ega->vres ? pallook16[ega->attrregs[0x11] & 0x0f] : pallook64[ega->attrregs[0x11] & 0x3f]; + ega->overscan_color = ega->vres ? pallook16[ega->attrregs[0x11] & 0x0f] : + pallook64[ega->attrregs[0x11] & 0x3f]; io_removehandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega); if (!(val & 1)) io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega); @@ -290,28 +269,34 @@ ega_out(uint16_t addr, uint8_t val, void *priv) if (ega->chipset) ega->crtcreg = val & 0x3f; else - ega->crtcreg = val & crtcmask; + ega->crtcreg = val; return; case 0x3d1: case 0x3d5: + int idx = ega->crtcreg; + if (ega->chipset) { if ((ega->crtcreg < 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80)) return; if ((ega->crtcreg == 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80)) val = (ega->crtc[7] & ~0x10) | (val & 0x10); } else { - if ((ega->crtcreg < 7) && (ega->crtc[0x11] & 0x80)) + idx &= crtcmask; + if ((idx >= 0x19) & (idx <= 0xf6)) return; - if ((ega->crtcreg == 7) && (ega->crtc[0x11] & 0x80)) + if ((idx < 7) && (ega->crtc[0x11] & 0x80)) + return; + if ((idx == 7) && (ega->crtc[0x11] & 0x80)) val = (ega->crtc[7] & ~0x10) | (val & 0x10); } - old = ega->crtc[ega->crtcreg]; - ega->crtc[ega->crtcreg] = val; + old = ega->crtc[idx]; + ega->crtc[idx] = val; if (old != val) { - if (ega->crtcreg < 0xe || ega->crtcreg > 0x10) { - if ((ega->crtcreg == 0xc) || (ega->crtcreg == 0xd)) { + if ((idx < 0xe) || (idx > 0x10)) { + if ((idx == 0xc) || (idx == 0xd)) { ega->fullchange = 3; - ega->ma_latch = ((ega->crtc[0xc] << 8) | ega->crtc[0xd]) + ((ega->crtc[8] & 0x60) >> 5); + ega->ma_latch = ((ega->crtc[0xc] << 8) | ega->crtc[0xd]) + + ((ega->crtc[8] & 0x60) >> 5); } else { ega->fullchange = changeframecount; ega_recalctimings(ega); @@ -329,10 +314,11 @@ uint8_t ega_in(uint16_t addr, void *priv) { ega_t *ega = (ega_t *) priv; - uint8_t gdcmask = (ega->actual_type == EGA_SUPEREGA) ? 0xff : 0x0f; - uint8_t ret = 0xff; - int type = ega_get_type(ega); - int atype = ega_get_actual_type(ega); + uint8_t ret = 0xff; + int type = ega_type; + int atype = ega->actual_type; + uint8_t gdcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x0f; + uint8_t crtcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x1f; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1)) addr ^= 0x60; @@ -372,8 +358,12 @@ ega_in(uint16_t addr, void *priv) ret = (egaswitches & (8 >> egaswitchread)) ? 0x10 : 0x00; break; case 0x3c4: - if (type == EGA_TYPE_OTHER) - ret = ega->seqaddr; + if (type == EGA_TYPE_OTHER) { + if (atype == EGA_SUPEREGA) + ret = 0x1f | ((ega->miscout & 0x01) << 5); + else + ret = ega->seqaddr; + } break; case 0x3c5: if (type == EGA_TYPE_OTHER) { @@ -396,8 +386,14 @@ ega_in(uint16_t addr, void *priv) ret = ega->miscout; break; case 0x3ce: - if (type == EGA_TYPE_OTHER) + if (ega_type == EGA_TYPE_OTHER) { ret = ega->gdcaddr; + if (atype == EGA_SUPEREGA) { + ret = (ret & 0x0f) | 0xe0; + if ((ega->gdcaddr & 0xe0) == 0xe0) + ret |= 0x10; + } + } break; case 0x3cf: if (type == EGA_TYPE_OTHER) { @@ -425,7 +421,7 @@ ega_in(uint16_t addr, void *priv) break; case 0x3d0: case 0x3d4: - if (type == EGA_TYPE_OTHER) { + if (ega_type == EGA_TYPE_OTHER) { ret = ega->crtcreg; if (atype == EGA_SUPEREGA) { ret = (ret & 0x1f) | 0xc0; @@ -436,7 +432,7 @@ ega_in(uint16_t addr, void *priv) break; case 0x3d1: case 0x3d5: - switch (ega->crtcreg) { + switch (ega->crtcreg & crtcmask) { case 0xc: case 0xd: case 0xe: @@ -458,6 +454,11 @@ ega_in(uint16_t addr, void *priv) ret = ega->light_pen & 0xff; break; + case 0x19 ... 0xf6: + if (type == EGA_TYPE_OTHER) + ret = ega->chipset ? ega->crtc[ega->crtcreg] : 0xff; + break; + default: if (type == EGA_TYPE_OTHER) ret = ega->crtc[ega->crtcreg]; @@ -672,7 +673,8 @@ ega_recalctimings(ega_t *ega) disptime = (double) (ega->crtc[0] + 2); _dispontime = (double) (ega->crtc[1] + 1); } - if ((ega->actual_type == EGA_SUPEREGA) && (ega->crtc[0xf9] & 0x01)) { + if ((ega->actual_type == EGA_SUPEREGA) && (ega->crtc[0x17] & 0x10) && + (ega->crtc[0xf9] & 0x01)) { disptime *= 2.0; _dispontime *= 2.0; } From 512154e4a837c76405f446c0691e321817c526c2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 30 Mar 2025 09:00:39 +0200 Subject: [PATCH 023/118] EGA: Add braces around a case block to make clang happy. --- src/video/vid_ega.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 03121751d..8333e522e 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -272,7 +272,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) ega->crtcreg = val; return; case 0x3d1: - case 0x3d5: + case 0x3d5: { int idx = ega->crtcreg; if (ega->chipset) { @@ -305,7 +305,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) } break; - default: + } default: break; } } From 8f94ccec8045afda48b88990d07b9ae966b91da7 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 30 Mar 2025 21:03:46 +0600 Subject: [PATCH 024/118] Qt: Fix HiDPI scaling on non-software renderers --- src/qt/qt_hardwarerenderer.cpp | 7 +++++-- src/qt/qt_openglrenderer.cpp | 29 ++++++++++++++++------------- src/qt/qt_renderercommon.cpp | 3 +++ src/qt/qt_renderercommon.hpp | 2 ++ src/qt/qt_vulkanrenderer.cpp | 16 +++++----------- src/qt/qt_vulkanwindowrenderer.cpp | 5 ++++- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/qt/qt_hardwarerenderer.cpp b/src/qt/qt_hardwarerenderer.cpp index ee2ec07df..d5aa86b79 100644 --- a/src/qt/qt_hardwarerenderer.cpp +++ b/src/qt/qt_hardwarerenderer.cpp @@ -37,7 +37,7 @@ void HardwareRenderer::resizeGL(int w, int h) { m_context->makeCurrent(this); - glViewport(0, 0, qRound(w * devicePixelRatio()), qRound(h * devicePixelRatio())); + glViewport(0, 0, qRound(w * devicePixelRatioF()), qRound(h * devicePixelRatioF())); } #define PROGRAM_VERTEX_ATTRIBUTE 0 @@ -220,14 +220,17 @@ HardwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) #endif buf_usage[buf_idx].clear(); source.setRect(x, y, w, h); - if (origSource != source) + if (origSource != source) { + this->pixelRatio = devicePixelRatioF(); onResize(this->width(), this->height()); + } update(); } void HardwareRenderer::resizeEvent(QResizeEvent *event) { + this->pixelRatio = devicePixelRatioF(); onResize(width(), height()); QOpenGLWindow::resizeEvent(event); diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index b465bfddd..cc48ca06e 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -1154,14 +1154,15 @@ OpenGLRenderer::onBlit(int buf_idx, int x, int y, int w, int h) buf_usage[buf_idx].clear(); source.setRect(x, y, w, h); + this->pixelRatio = devicePixelRatio(); onResize(this->width(), this->height()); #ifdef Q_OS_MACOS glw.glViewport( - destination.x() * devicePixelRatio(), - destination.y() * devicePixelRatio(), - destination.width() * devicePixelRatio(), - destination.height() * devicePixelRatio()); + destination.x(), + destination.y(), + destination.width(), + destination.height()); #endif if (video_framerate == -1) @@ -1187,6 +1188,7 @@ OpenGLRenderer::exposeEvent(QExposeEvent *event) if (!isInitialized) initialize(); + this->pixelRatio = devicePixelRatio(); onResize(size().width(), size().height()); } @@ -1195,6 +1197,7 @@ OpenGLRenderer::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); + this->pixelRatio = devicePixelRatio(); onResize(event->size().width(), event->size().height()); if (notReady()) @@ -1203,10 +1206,10 @@ OpenGLRenderer::resizeEvent(QResizeEvent *event) context->makeCurrent(this); glw.glViewport( - destination.x() * devicePixelRatio(), - destination.y() * devicePixelRatio(), - destination.width() * devicePixelRatio(), - destination.height() * devicePixelRatio()); + destination.x(), + destination.y(), + destination.width(), + destination.height()); } void @@ -1386,10 +1389,10 @@ OpenGLRenderer::render() uint32_t x, y, w, h; } window_rect; - window_rect.x = destination.x() * devicePixelRatio(); - window_rect.y = destination.y() * devicePixelRatio(); - window_rect.w = destination.width() * devicePixelRatio(); - window_rect.h = destination.height() * devicePixelRatio(); + window_rect.x = destination.x(); + window_rect.y = destination.y(); + window_rect.w = destination.width(); + window_rect.h = destination.height(); glw.glBindTexture(GL_TEXTURE_2D, scene_texture.id); scene_texture.min_filter = scene_texture.mag_filter = video_filter_method ? GL_LINEAR : GL_NEAREST; @@ -1652,7 +1655,7 @@ OpenGLRenderer::render() } if (monitors[r_monitor_index].mon_screenshots) { - int width = destination.width() * devicePixelRatio(), height = destination.height() * devicePixelRatio(); + int width = destination.width(), height = destination.height(); char path[1024]; char fn[256]; diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp index 2a20ff63c..3a34452e6 100644 --- a/src/qt/qt_renderercommon.cpp +++ b/src/qt/qt_renderercommon.cpp @@ -59,6 +59,9 @@ RendererCommon::onResize(int width, int height) bool main_max = main_window->isMaximized(); bool main_is_max = (main_is_ancestor && main_max == false); + width = round(pixelRatio * width); + height = round(pixelRatio * height); + if (is_fs && (video_fullscreen_scale_maximized ? (parent_max && main_is_max) : 1)) destination.setRect(0, 0, width, height); else { diff --git a/src/qt/qt_renderercommon.hpp b/src/qt/qt_renderercommon.hpp index bbda9516b..333b9df0a 100644 --- a/src/qt/qt_renderercommon.hpp +++ b/src/qt/qt_renderercommon.hpp @@ -49,5 +49,7 @@ protected: QRect destination; QWidget *parentWidget { nullptr }; + double pixelRatio = 1.0; + std::vector buf_usage; }; diff --git a/src/qt/qt_vulkanrenderer.cpp b/src/qt/qt_vulkanrenderer.cpp index 39830569c..2306661ec 100644 --- a/src/qt/qt_vulkanrenderer.cpp +++ b/src/qt/qt_vulkanrenderer.cpp @@ -970,17 +970,11 @@ VulkanRenderer2::startNextFrame() m_devFuncs->vkCmdBindVertexBuffers(cb, 0, 1, &m_buf, &vbOffset); VkViewport viewport; - if (dpi_scale) { - viewport.x = destination.x() * m_window->devicePixelRatio(); - viewport.y = destination.y() * m_window->devicePixelRatio(); - viewport.width = destination.width() * m_window->devicePixelRatio(); - viewport.height = destination.height() * m_window->devicePixelRatio(); - } else { - viewport.x = destination.x(); - viewport.y = destination.y(); - viewport.width = destination.width(); - viewport.height = destination.height(); - } + viewport.x = destination.x(); + viewport.y = destination.y(); + viewport.width = destination.width(); + viewport.height = destination.height(); + viewport.minDepth = 0; viewport.maxDepth = 1; m_devFuncs->vkCmdSetViewport(cb, 0, 1, &viewport); diff --git a/src/qt/qt_vulkanwindowrenderer.cpp b/src/qt/qt_vulkanwindowrenderer.cpp index ab46b5961..d0fbb39a3 100644 --- a/src/qt/qt_vulkanwindowrenderer.cpp +++ b/src/qt/qt_vulkanwindowrenderer.cpp @@ -846,6 +846,7 @@ VulkanWindowRenderer::createRenderer() void VulkanWindowRenderer::resizeEvent(QResizeEvent *event) { + this->pixelRatio = devicePixelRatio(); onResize(width(), height()); QVulkanWindow::resizeEvent(event); @@ -868,8 +869,10 @@ VulkanWindowRenderer::onBlit(int buf_idx, int x, int y, int w, int h) if (isExposed()) requestUpdate(); buf_usage[0].clear(); - if (origSource != source) + if (origSource != source) { + this->pixelRatio = devicePixelRatio(); onResize(this->width(), this->height()); + } } uint32_t From 5ae5e99e41010861ab185012f47504fed40304dc Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 30 Mar 2025 22:06:16 +0200 Subject: [PATCH 025/118] Major changes on the 8514/A side again (March 30th, 2025) 1. The DX/DY coordinates for BitBLT are now signed again, fixes 8514/A cursor issues. 2. Made the busy/data available processor statuses more like the ATI one for more stability and no stalls, fixes Windows 3.x and IBM OS/2 1.x (possibly later ones too) that use the built-in 8514/A driver. 3. Made the mode switching clearer (through a note) regarding the shadow sets, this should make every program happy, I hope. 4. In the Mach32 series only, a first load of the CRT sets also initializes the GE offsets if the corresponding bit is set, fixes Mach8/32 mode tests in their eeprom and demoai with hdiload from ATI/IBM. --- src/include/86box/vid_8514a.h | 4 +- src/include/86box/vid_ati_mach8.h | 3 +- src/video/vid_8514a.c | 199 +++++++++++++++------------ src/video/vid_ati_mach8.c | 215 +++++++++++++++++++----------- 4 files changed, 256 insertions(+), 165 deletions(-) diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index a467311ca..7694a028a 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -92,8 +92,8 @@ typedef struct ibm8514_t { uint16_t advfunc_cntl; uint16_t cur_y; uint16_t cur_x; - uint16_t destx; - uint16_t desty; + int16_t destx; + int16_t desty; int16_t desty_axstp; int16_t destx_distp; int16_t err_term; diff --git a/src/include/86box/vid_ati_mach8.h b/src/include/86box/vid_ati_mach8.h index 4a5d3deb5..8ed1dbc74 100644 --- a/src/include/86box/vid_ati_mach8.h +++ b/src/include/86box/vid_ati_mach8.h @@ -77,7 +77,8 @@ typedef struct mach_t { uint8_t overscan_g_col_24; uint8_t overscan_r_col_24; uint16_t fifo_test_data[17]; - int resolution_crt; + int port_len; + int crt_resolution; struct { uint8_t line_idx; diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 393b90b57..7c0bf9702 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -834,10 +834,25 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) if (dev->force_busy) temp |= 0x0200; /*Hardware busy*/ - dev->force_busy = 0; + + if (dev->accel.cmd_back) + dev->force_busy = 0; + if (dev->data_available) { temp |= 0x0100; /*Read Data available*/ - dev->data_available = 0; + switch (dev->accel.cmd >> 13) { + case 2: + case 3: + case 4: + case 6: + if (dev->accel.sy < 0) + dev->data_available = 0; + break; + default: + if (!dev->accel.sy) + dev->data_available = 0; + break; + } } } break; @@ -850,9 +865,22 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) temp |= 0x02; /*Hardware busy*/ dev->force_busy2 = 0; + if (dev->data_available2) { temp |= 0x01; /*Read Data available*/ - dev->data_available2 = 0; + switch (dev->accel.cmd >> 13) { + case 2: + case 3: + case 4: + case 6: + if (dev->accel.sy < 0) + dev->data_available2 = 0; + break; + default: + if (!dev->accel.sy) + dev->data_available2 = 0; + break; + } } } break; @@ -931,10 +959,10 @@ ibm8514_accel_in(uint16_t port, svga_t *svga) if (cmd == 6) { if ((dev->subsys_cntl & INT_GE_BSY) && !(dev->subsys_stat & INT_GE_BSY) && - (dev->accel.dx_ibm >= clip_l) && - (dev->accel.dx_ibm <= clip_r_ibm) && - (dev->accel.dy_ibm >= clip_t) && - (dev->accel.dy_ibm <= clip_b_ibm)) + (dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r_ibm) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b_ibm)) temp |= INT_GE_BSY; } else { if ((dev->subsys_cntl & INT_GE_BSY) && @@ -2796,8 +2824,13 @@ skip_nibble_rect_write: { dev->accel.x_count = 0; - dev->accel.dx_ibm = dev->accel.destx; - dev->accel.dy_ibm = dev->accel.desty; + dev->accel.dx = dev->accel.destx; + if (dev->accel.destx >= 0x600) + dev->accel.dx |= ~0x5ff; + + dev->accel.dy = dev->accel.desty; + if (dev->accel.desty >= 0x600) + dev->accel.dy |= ~0x5ff; dev->accel.cx = dev->accel.cur_x; if (dev->accel.cur_x >= 0x600) @@ -2812,13 +2845,13 @@ skip_nibble_rect_write: if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } else if (dev->bpp) { dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); } else { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } dev->accel.fill_state = 0; @@ -2844,15 +2877,15 @@ skip_nibble_rect_write: dev->data_available2 = 1; return; /*Wait for data from CPU*/ } else - ibm8514_log("BitBLT normal: Parameters: DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, dstheight=%d, clipl=%d, clipr=%d, clipt=%d, clipb=%d.\n", dev->accel.dx_ibm, dev->accel.dy_ibm, dev->accel.cx, dev->accel.cy, dev->accel.sx, dev->accel.sy, clip_l, clip_r, clip_t, clip_b); + ibm8514_log("BitBLT normal: Parameters: DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, dstheight=%d, clipl=%d, clipr=%d, clipt=%d, clipb=%d.\n", dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, dev->accel.sx, dev->accel.sy, clip_l, clip_r, clip_t, clip_b); } if (cpu_input) { while (count-- && (dev->accel.sy >= 0)) { - if ((dev->accel.dx_ibm >= clip_l) && - (dev->accel.dx_ibm <= clip_r) && - (dev->accel.dy_ibm >= clip_t) && - (dev->accel.dy_ibm <= clip_b)) { + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b)) { if (pixcntl == 3) { if (!(dev->accel.cmd & 0x10) && ((frgd_mix != 3) || (bkgd_mix != 3))) { READ(dev->accel.src + dev->accel.cx, mix_dat); @@ -2916,7 +2949,7 @@ skip_nibble_rect_write: } } - READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + READ(dev->accel.dest + dev->accel.dx, dest_dat); if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || @@ -2932,20 +2965,20 @@ skip_nibble_rect_write: goto skip_nibble_bitblt_write; dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } else { MIX(mix_dat & mix_mask, dest_dat, src_dat); dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } } if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm++; + dev->accel.dx++; dev->accel.cx++; } else { - dev->accel.dx_ibm--; + dev->accel.dx--; dev->accel.cx--; } @@ -2972,30 +3005,30 @@ skip_nibble_bitblt_write: dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm -= (dev->accel.sx + 1); + dev->accel.dx -= (dev->accel.sx + 1); dev->accel.cx -= (dev->accel.sx + 1); } else { - dev->accel.dx_ibm += (dev->accel.sx + 1); + dev->accel.dx += (dev->accel.sx + 1); dev->accel.cx += (dev->accel.sx + 1); } if (dev->accel.cmd & 0x80) { - dev->accel.dy_ibm++; + dev->accel.dy++; dev->accel.cy++; } else { - dev->accel.dy_ibm--; + dev->accel.dy--; dev->accel.cy--; } if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } else if (dev->bpp) { dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); } else { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } dev->accel.sy--; @@ -3018,10 +3051,10 @@ skip_nibble_bitblt_write: mix_dat >>= 8; dev->accel.temp_cnt = 8; } - if ((dev->accel.dx_ibm >= clip_l) && - (dev->accel.dx_ibm <= clip_r) && - (dev->accel.dy_ibm >= clip_t) && - (dev->accel.dy_ibm <= clip_b)) { + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -3040,7 +3073,7 @@ skip_nibble_bitblt_write: break; } - READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + READ(dev->accel.dest + dev->accel.dx, dest_dat); if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || @@ -3052,7 +3085,7 @@ skip_nibble_bitblt_write: old_dest_dat = dest_dat; MIX(mix_dat & mix_mask, dest_dat, src_dat); dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } @@ -3063,10 +3096,10 @@ skip_nibble_bitblt_write: } if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm++; + dev->accel.dx++; dev->accel.cx++; } else { - dev->accel.dx_ibm--; + dev->accel.dx--; dev->accel.cx--; } @@ -3075,30 +3108,30 @@ skip_nibble_bitblt_write: dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm -= (dev->accel.sx + 1); + dev->accel.dx -= (dev->accel.sx + 1); dev->accel.cx -= (dev->accel.sx + 1); } else { - dev->accel.dx_ibm += (dev->accel.sx + 1); + dev->accel.dx += (dev->accel.sx + 1); dev->accel.cx += (dev->accel.sx + 1); } if (dev->accel.cmd & 0x80) { - dev->accel.dy_ibm++; + dev->accel.dy++; dev->accel.cy++; } else { - dev->accel.dy_ibm--; + dev->accel.dy--; dev->accel.cy--; } if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } else if (dev->bpp) { dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); } else { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } dev->accel.sy--; @@ -3117,10 +3150,10 @@ skip_nibble_bitblt_write: dev->accel.temp_cnt = 8; mix_dat = old_mix_dat; } - if ((dev->accel.dx_ibm >= clip_l) && - (dev->accel.dx_ibm <= clip_r) && - (dev->accel.dy_ibm >= clip_t) && - (dev->accel.dy_ibm <= clip_b)) { + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b)) { switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -3139,7 +3172,7 @@ skip_nibble_bitblt_write: break; } - READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + READ(dev->accel.dest + dev->accel.dx, dest_dat); if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || @@ -3151,7 +3184,7 @@ skip_nibble_bitblt_write: old_dest_dat = dest_dat; MIX(mix_dat & 0x01, dest_dat, src_dat); dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } @@ -3159,10 +3192,10 @@ skip_nibble_bitblt_write: mix_dat >>= 1; if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm++; + dev->accel.dx++; dev->accel.cx++; } else { - dev->accel.dx_ibm--; + dev->accel.dx--; dev->accel.cx--; } @@ -3171,36 +3204,36 @@ skip_nibble_bitblt_write: dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm -= (dev->accel.sx + 1); + dev->accel.dx -= (dev->accel.sx + 1); dev->accel.cx -= (dev->accel.sx + 1); } else { - dev->accel.dx_ibm += (dev->accel.sx + 1); + dev->accel.dx += (dev->accel.sx + 1); dev->accel.cx += (dev->accel.sx + 1); } if (dev->accel.cmd & 0x80) { - dev->accel.dy_ibm++; + dev->accel.dy++; dev->accel.cy++; } else { - dev->accel.dy_ibm--; + dev->accel.dy--; dev->accel.cy--; } if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } else if (dev->bpp) { dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); } else { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } dev->accel.sy--; if (dev->accel.sy < 0) { - dev->accel.destx = dev->accel.dx_ibm; - dev->accel.desty = dev->accel.dy_ibm; + dev->accel.destx = dev->accel.dx; + dev->accel.desty = dev->accel.dy; dev->accel.cmd_back = 1; dev->fifo_idx = 0; return; @@ -3214,13 +3247,13 @@ skip_nibble_bitblt_write: int64_t dx; cx = (int64_t) dev->accel.cx; - dx = (int64_t) dev->accel.dx_ibm; + dx = (int64_t) dev->accel.dx; while (1) { if ((dx >= (((int64_t)clip_l) * 3)) && (dx <= (((uint64_t)clip_r) * 3)) && - (dev->accel.dy_ibm >= (clip_t << 1)) && - (dev->accel.dy_ibm <= (clip_b << 1))) { + (dev->accel.dy >= (clip_t << 1)) && + (dev->accel.dy <= (clip_b << 1))) { READ(dev->accel.src + cx, src_dat); READ(dev->accel.dest + dx, dest_dat); dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); @@ -3239,10 +3272,10 @@ skip_nibble_bitblt_write: } } else { while (count-- && dev->accel.sy >= 0) { - if ((dev->accel.dx_ibm >= clip_l) && - (dev->accel.dx_ibm <= clip_r) && - (dev->accel.dy_ibm >= clip_t) && - (dev->accel.dy_ibm <= clip_b)) { + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b)) { if (pixcntl == 3) { if (!(dev->accel.cmd & 0x10) && ((frgd_mix != 3) || (bkgd_mix != 3))) { READ(dev->accel.src + dev->accel.cx, mix_dat); @@ -3276,7 +3309,7 @@ skip_nibble_bitblt_write: break; } - READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + READ(dev->accel.dest + dev->accel.dx, dest_dat); if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || @@ -3291,11 +3324,11 @@ skip_nibble_bitblt_write: if (dev->accel.cmd & 0x04) { if (dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat); + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } else { - WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat); - ibm8514_log("BitBLT DX=%d, DY=%d, data=%02x, old=%02x, src=%02x, frmix=%02x, bkmix=%02x, pixcntl=%d.\n", dev->accel.dx_ibm, dev->accel.dy_ibm, dest_dat, old_dest_dat, src_dat, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, pixcntl); + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); + ibm8514_log("BitBLT DX=%d, DY=%d, data=%02x, old=%02x, src=%02x, frmix=%02x, bkmix=%02x, pixcntl=%d.\n", dev->accel.dx, dev->accel.dy, dest_dat, old_dest_dat, src_dat, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, pixcntl); } } } @@ -3304,10 +3337,10 @@ skip_nibble_bitblt_write: mix_dat |= 1; if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm++; + dev->accel.dx++; dev->accel.cx++; } else { - dev->accel.dx_ibm--; + dev->accel.dx--; dev->accel.cx--; } @@ -3317,36 +3350,36 @@ skip_nibble_bitblt_write: dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) { - dev->accel.dx_ibm -= (dev->accel.sx + 1); + dev->accel.dx -= (dev->accel.sx + 1); dev->accel.cx -= (dev->accel.sx + 1); } else { - dev->accel.dx_ibm += (dev->accel.sx + 1); + dev->accel.dx += (dev->accel.sx + 1); dev->accel.cx += (dev->accel.sx + 1); } if (dev->accel.cmd & 0x80) { - dev->accel.dy_ibm++; + dev->accel.dy++; dev->accel.cy++; } else { - dev->accel.dy_ibm--; + dev->accel.dy--; dev->accel.cy--; } if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } else if (dev->bpp) { dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); } else { dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch); + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); } dev->accel.sy--; if (dev->accel.sy < 0) { - dev->accel.destx = dev->accel.dx_ibm; - dev->accel.desty = dev->accel.dy_ibm; + dev->accel.destx = dev->accel.dx; + dev->accel.desty = dev->accel.dy; dev->accel.cmd_back = 1; dev->fifo_idx = 0; return; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index c21730497..474ae5660 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -344,7 +344,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.rd_mask, mach->accel.dp_config, clip_l, clip_r, clip_t, clip_b, mach->accel.linedraw_opt, dev->accel_bpp, cmd_type, mach->accel.ge_offset, count, cpu_input, mono_src, frgd_sel, dev->accel.cur_x, dev->accel.cur_y, mach->accel.dest_x_end, dev->ext_pitch, dev->ext_crt_pitch, mach->accel.dp_config & 1, mach->accel.mono_pattern_enable); - mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i.\n", cmd_type, frgd_sel, bkgd_sel, mono_src); + mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i, dpconfig = %04x.\n", cmd_type, frgd_sel, bkgd_sel, mono_src, mach->accel.dp_config); switch (cmd_type) { case 1: /*Extended Raw Linedraw from bres_count register (0x96ee)*/ @@ -900,14 +900,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } dev->accel.sy = 0; - if (mach->accel.dp_config & 0x02) - dev->accel.dest = (dev->accel.dy * dev->pitch); - else { - if (dev->bpp) - dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - else - dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } + if (dev->bpp) + dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); + else + dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); mach->accel.src_stepx = 0; /*Source Width*/ @@ -2221,7 +2217,7 @@ mach_accel_out_pixtrans(svga_t *svga, mach_t *mach, ibm8514_t *dev, uint16_t val case 0x200: /*16-bit size*/ if (mono_src == 2) { if ((frgd_sel != 2) && (bkgd_sel != 2)) { - if (((mach->accel.dp_config & 0x1000) && !swap) || swap) { + if (((mach->accel.dp_config & 0x1000) && !swap) || (!(mach->accel.dp_config & 0x1000) && swap)) { mach_log("16-bit bus size swap.\n"); val = (val >> 8) | (val << 8); } @@ -2663,17 +2659,22 @@ ati_render_32bpp(svga_t *svga) } } +/*The situation is the following: + When ATI mode is selected, allow complete auto-detection. + But when 8514/A mode is selected, allow detection based on the shadow register sets. +*/ + static void mach_set_resolution(mach_t *mach, svga_t *svga) { ibm8514_t *dev = (ibm8514_t *) svga->dev8514; dev->hdisp = (dev->hdisped + 1) << 3; - if (!dev->htotal) /*Default to 1024x768 87hz 8514/A htotal timings if it goes to 0.*/ - dev->htotal = 0x9d; - dev->h_total = dev->htotal + 1; + if (dev->h_total == 1) /*Default to 1024x768 87hz 8514/A htotal timings if it goes to 0.*/ + dev->h_total = 0x9e; + dev->vdisp = (dev->v_disp + 1) >> 1; if ((dev->vdisp == 478) || (dev->vdisp == 598) || (dev->vdisp == 766) || (dev->vdisp == 1022)) dev->vdisp += 2; @@ -2686,26 +2687,72 @@ mach_set_resolution(mach_t *mach, svga_t *svga) if (dev->interlace) dev->v_syncstart >>= 1; - mach_log("Shadow set ATI=%x, shadow set 8514/A=%x, resolution h=%d, v=%d.\n", mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); + mach_log("Shadow set ATI=%x, shadow set 8514/A=%x, resolution h=%d, v=%d, vtotal=%d, vsyncstart=%d.\n", mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, dev->v_total, dev->v_syncstart); if ((mach->accel.clock_sel & 0x01) || dev->bpp || ((mach->accel.ext_ge_config & 0x30) == 0x30)) /*ATI and 15bpp+ mode*/ svga_recalctimings(svga); else { /*8514/A mode*/ - if (mach->resolution_crt == 0x02) { - if (!(dev->accel.advfunc_cntl & 0x04)) { - dev->hdisp = 640; - dev->vdisp = 480; - svga_recalctimings(svga); - } - } else { - if (ATI_8514A_ULTRA) { - if (dev->accel.advfunc_cntl & 0x04) { - if (dev->hdisp == 640) { - dev->hdisp = 1024; - dev->vdisp = 768; + switch (mach->shadow_set & 0x03) { + case 0x00: /*Primary CRT Register set*/ + if (dev->on) { + if (mach->crt_resolution == 0x01) { + if (ATI_8514A_ULTRA) { + if (dev->accel.advfunc_cntl & 0x04) { + if (dev->hdisp == 640) { + dev->hdisp = 1024; + dev->vdisp = 768; + svga_recalctimings(svga); + } + } else { + if (dev->hdisp == 1024) { + dev->hdisp = 640; + dev->vdisp = 480; + svga_recalctimings(svga); + } + } + } else + svga_recalctimings(svga); + } else if (mach->crt_resolution == 0x02) { + if (dev->accel.advfunc_cntl & 0x04) { + if (dev->hdisp == 640) { + dev->hdisp = 1024; + dev->vdisp = 768; + svga_recalctimings(svga); + } + } else { + if (dev->hdisp == 1024) { + dev->hdisp = 640; + dev->vdisp = 480; + svga_recalctimings(svga); + } + } + } else svga_recalctimings(svga); - } } - } + break; + case 0x01: /*Shadow 640x480 CRT register set*/ + if (dev->on) { + if (!(dev->accel.advfunc_cntl & 0x04)) { + if (dev->hdisp == 1024) { + dev->hdisp = 640; + dev->vdisp = 480; + } + } + svga_recalctimings(svga); + } + break; + case 0x02: /*Shadow 1024x768 CRT register set*/ + if (dev->on) { + if (dev->accel.advfunc_cntl & 0x04) { + if (dev->hdisp == 640) { + dev->hdisp = 1024; + dev->vdisp = 768; + } + } + svga_recalctimings(svga); + } + break; + default: + break; } } } @@ -2739,6 +2786,7 @@ ati8514_recalctimings(svga_t *svga) if (dev->interlace) dev->dispend >>= 1; + mach->crt_resolution = 0x00; mach_log("cntl=%d, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d.\n", dev->accel.advfunc_cntl & 0x04, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 3, dev->interlace); @@ -2752,7 +2800,6 @@ ati8514_recalctimings(svga_t *svga) } } dev->accel_bpp = 8; - mach->resolution_crt = 0; svga->render8514 = ibm8514_render_8bpp; } } @@ -2808,15 +2855,15 @@ mach_recalctimings(svga_t *svga) svga->ati_4color = 0; } - mach_log("ON?=%d, override=%d.\n", dev->on, svga->override); + mach_log("ON?=%d, override=%d, gelo=%04x, gehi=%04x, vgahdisp=%d.\n", dev->on, svga->override, mach->accel.ge_offset_lo, mach->accel.ge_offset_hi, svga->hdisp); if (dev->on) { - mach_log("8514/A ON, extpitch=%d, devma=%x, vgamalatch=%x.\n", dev->ext_pitch, dev->ma, svga->ma_latch); - dev->ma_latch = (mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2; + dev->ma_latch = 0; /*(mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2;*/ dev->pitch = dev->ext_pitch; dev->rowoffset = dev->ext_crt_pitch; dev->rowcount = !!(dev->disp_cntl & 0x08); dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); mach->accel.ge_offset = dev->accel.ge_offset; + mach_log("8514/A ON, extpitch=%d, geoffset=%x, 8514malatch=%x, vgamalatch=%x.\n", dev->ext_pitch, mach->accel.ge_offset, dev->ma_latch, svga->ma_latch); mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x, interlace=%x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, @@ -2836,6 +2883,7 @@ mach_recalctimings(svga_t *svga) if (dev->interlace) dev->dispend >>= 1; + mach->crt_resolution = 0x00; if (ATI_MACH32) { mach_log("cntl=%d, clksel=%x, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d, vgahdisp=%d.\n", dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0x01, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, @@ -2877,7 +2925,6 @@ mach_recalctimings(svga_t *svga) dev->h_disp, dev->dispend, dev->pitch, dev->ext_crt_pitch, mach->accel.ext_ge_config & 0xcec0, dev->accel_bpp, mach->shadow_set & 3, svga->hdisp); - mach->resolution_crt = 0; switch (dev->accel_bpp) { case 8: svga->render8514 = ibm8514_render_8bpp; @@ -2915,7 +2962,6 @@ mach_recalctimings(svga_t *svga) } } dev->accel_bpp = 8; - mach->resolution_crt = 0; svga->render8514 = ibm8514_render_8bpp; } } else { @@ -2973,7 +3019,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u switch (port) { case 0x2e8: - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) dev->htotal = val; @@ -2982,44 +3028,44 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xae8: - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) { WRITE8(port, dev->hsync_start, val); } - svga_recalctimings(svga); + mach_set_resolution(mach, svga); } break; case 0xee8: - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) { WRITE8(port, dev->hsync_width, val); } - svga_recalctimings(svga); + mach_set_resolution(mach, svga); } break; case 0x1ee8: case 0x1ee9: if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) /*For 8514/A mode, take the shadow sets into account.*/ - svga_recalctimings(svga); + mach_set_resolution(mach, svga); break; case 0x6e8: if (len == 2) { mach_log("HDISP and HTOTAL=%04x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01); - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { - if (!(mach->shadow_cntl & 0x08)) { + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x04)) + dev->htotal = (val >> 8) & 0xff; + + if (!(mach->shadow_cntl & 0x08)) { + if (dev->htotal || (mach->accel.clock_sel & 0x01)) { WRITE8(port, dev->hdisped, val); } } - if (ATI_8514A_ULTRA) { - if (!(mach->shadow_cntl & 0x04)) - dev->htotal = (val >> 8) & 0xff; - } - mach_set_resolution(mach, svga); + if (dev->htotal || (mach->accel.clock_sel & 0x01)) + mach_set_resolution(mach, svga); } } else { mach_log("HDISP and HTOTAL=%02x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01); @@ -3032,9 +3078,6 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (!(mach->shadow_cntl & 0x08)) { WRITE8(port, dev->hdisped, val); } - if (mach->resolution_crt == 0x00) - mach->resolution_crt = 0x02; - mach_set_resolution(mach, svga); } } @@ -3045,10 +3088,10 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x6e9: if (len == 1) { mach_log("HDISP and HTOTAL+1=%02x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01); - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ - if (!(mach->shadow_cntl & 0x04)) { + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x04)) dev->htotal = val; - } + mach_set_resolution(mach, svga); } } @@ -3056,7 +3099,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x12e8: if (len == 2) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x10)) { dev->v_total_reg = val; dev->v_total_reg &= 0x1fff; @@ -3064,7 +3107,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_set_resolution(mach, svga); } } else { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x10)) { WRITE8(port, dev->v_total_reg, val); dev->v_total_reg &= 0x1fff; @@ -3077,7 +3120,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x12e9: if (len == 1) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ WRITE8(port, dev->v_total_reg, val); dev->v_total_reg &= 0x1fff; @@ -3090,8 +3133,14 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x16e8: if (len == 2) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { - if (!(mach->shadow_cntl & 0x20)) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x20)) { + dev->v_disp = val; + dev->v_disp &= 0x1fff; + } + mach_set_resolution(mach, svga); + } else if (!(mach->accel.clock_sel & 0x01) && ((mach->shadow_set & 0x03) == 0x00) && dev->on) { /*Still write the parameter even after going to 8514/A mode if needed*/ + if (!(mach->shadow_cntl & 0x20)) { dev->v_disp = val; dev->v_disp &= 0x1fff; } @@ -3100,8 +3149,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("ATI 8514/A: V_DISP write 16E8=%d, vdisp2=%d.\n", dev->v_disp, dev->v_disp2); mach_log("ATI 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val); } else { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { - if (!(mach->shadow_cntl & 0x20)) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x20)) { WRITE8(port, dev->v_disp, val); dev->v_disp &= 0x1fff; } @@ -3111,8 +3160,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x16e9: if (len == 1) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { - if (!(mach->shadow_cntl & 0x20)) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x20)) { WRITE8(port, dev->v_disp, val); dev->v_disp &= 0x1fff; } @@ -3125,8 +3174,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x1ae8: if (len == 2) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { - if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x10)) { dev->v_sync_start = val; dev->v_sync_start &= 0x1fff; } @@ -3135,8 +3184,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("ATI 8514/A: V_SYNCSTART write 1AE8 = %d\n", dev->v_syncstart); mach_log("ATI 8514/A: (0x%04x): vsyncstart=0x%02x.\n", port, val); } else { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { - if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x10)) { WRITE8(port, dev->v_sync_start, val); dev->v_sync_start &= 0x1fff; } @@ -3146,8 +3195,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x1ae9: if (len == 1) { - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03)) || ATI_8514A_ULTRA) { - if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ + if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ + if (!(mach->shadow_cntl & 0x10)) { WRITE8(port, dev->v_sync_start, val); dev->v_sync_start &= 0x1fff; } @@ -3168,7 +3217,6 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u svga_recalctimings(svga); break; - case 0x42e8: case 0x42e9: mach_log("VBLANK stat=%02x, val=%02x.\n", dev->subsys_stat, val); @@ -3672,11 +3720,19 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if ((mach->shadow_set & 0x03) == 0x00) mach_log("Primary CRT register set.\n"); else if ((mach->shadow_set & 0x03) == 0x01) { + mach->crt_resolution = 0x01; mach_log("CRT Shadow Set 1: 640x480.\n"); - mach->resolution_crt = 0x01; } else if ((mach->shadow_set & 0x03) == 0x02) { + mach->crt_resolution = 0x02; mach_log("CRT Shadow Set 2: 1024x768.\n"); - mach->resolution_crt = 0x02; + } + + if (ATI_MACH32) { + if ((mach->shadow_set & 0x300) == 0x000) { + mach_log("Load both SRC/DST GE Offset/Pitch.\n"); + mach->accel.ge_offset_lo = 0; + mach->accel.ge_offset_hi = 0; + } } break; @@ -4182,11 +4238,11 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in case 4: case 6: if (dev->accel.sy < 0) - dev->data_available = 0; + dev->data_available2 = 0; break; default: if (!dev->accel.sy) - dev->data_available = 0; + dev->data_available2 = 0; break; } } @@ -4525,10 +4581,10 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) if (cmd == 6) { if ((dev->subsys_cntl & INT_GE_BSY) && !(dev->subsys_stat & INT_GE_BSY) && - (dev->accel.dx_ibm >= clip_l) && - (dev->accel.dx_ibm <= clip_r_ibm) && - (dev->accel.dy_ibm >= clip_t) && - (dev->accel.dy_ibm <= clip_b_ibm)) + (dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r_ibm) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b_ibm)) temp |= INT_GE_BSY; } else { if ((dev->subsys_cntl & INT_GE_BSY) && @@ -4678,6 +4734,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) temp = 0x0000; } } else { + mach_log("ScratchPad0=%x.\n", mach->accel.scratch0); if (mach->accel.scratch0 == 0x1234) temp = 0x0000; } @@ -7019,7 +7076,7 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) dev->disp_cntl = 0x33; mach->accel.clock_sel = 0x1c; mach->shadow_set = 0x02; - mach->resolution_crt = 0x02; + mach->crt_resolution = 0x02; io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga); ati8514_io_set(svga); From 8ff30ab2e63c55a03190b70040bc37bdac703d8d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 30 Mar 2025 23:17:58 +0200 Subject: [PATCH 026/118] Mach64 ISA/VLB LFB update of the day (March 30th, 2025) The LFB can now be enabled properly on the ISA/VLB variants of the Mach64GX. --- src/video/vid_ati_mach64.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 24935e3a2..4ec9afff8 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -3768,6 +3768,9 @@ mach64_ext_outb(uint16_t port, uint8_t val, void *priv) case 0x6aee: case 0x6aef: WRITE8(port, mach64->config_cntl, val); + if (!mach64->pci) + mach64->linear_base = (mach64->config_cntl & 0x3ff0) << 18; + mach64_updatemapping(mach64); break; From 3f0138a58c117c96fec7e74326ca0a31fa48e537 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 31 Mar 2025 04:35:17 +0200 Subject: [PATCH 027/118] VIA On-board AC'97 Audio: Fix PCI registers, implement PCI Power Manager capability registers, properly separate the modem SGD from the audio SGD, and fix 5-bit volume attenuation, this also fixes audio playback in NT 4.0. --- src/chipset/via_pipc.c | 149 +++++++++++++++++------- src/sound/snd_ac97_codec.c | 5 +- src/sound/snd_ac97_via.c | 224 ++++++++++++++++++++----------------- 3 files changed, 233 insertions(+), 145 deletions(-) diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index 6b855f5aa..248664983 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -493,14 +493,28 @@ pipc_reset_hard(void *priv) } dev->ac97_regs[i][0x1c] = 0x01; + if (i == 0) { + dev->ac97_regs[i][0x34] = 0xc0; + + dev->ac97_regs[i][0xc0] = 0x01; + dev->ac97_regs[i][0xc1] = 0x00; + dev->ac97_regs[i][0xc2] = 0x03; + dev->ac97_regs[i][0xc3] = 0x00; + + dev->ac97_regs[i][0xc4] = 0x00; + dev->ac97_regs[i][0xc5] = 0x00; + dev->ac97_regs[i][0xc6] = 0x00; + dev->ac97_regs[i][0xc7] = 0x00; + } + dev->ac97_regs[i][0x3d] = 0x03; - if (i == 0) + if (i == 0) { dev->ac97_regs[i][0x40] = 0x01; - - dev->ac97_regs[i][0x43] = 0x1c; - dev->ac97_regs[i][0x48] = 0x01; - dev->ac97_regs[i][0x4b] = 0x02; + dev->ac97_regs[i][0x43] = 0x1c; + dev->ac97_regs[i][0x48] = 0x01; + dev->ac97_regs[i][0x4b] = 0x00; + } pipc_sgd_handlers(dev, i); pipc_codec_handlers(dev, i); @@ -742,10 +756,12 @@ pipc_codec_handlers(pipc_t *dev, uint8_t modem) if (!dev->ac97) return; + uint32_t base = (dev->ac97_regs[modem][0x1d] << 8); + if (modem) - ac97_via_remap_modem_codec(dev->ac97, dev->ac97_regs[1][0x1d] << 8, dev->ac97_regs[1][0x04] & PCI_COMMAND_IO); + ac97_via_remap_modem_codec(dev->ac97, base, dev->ac97_regs[1][0x04] & PCI_COMMAND_IO); else - ac97_via_remap_audio_codec(dev->ac97, dev->ac97_regs[0][0x1d] << 8, dev->ac97_regs[0][0x04] & PCI_COMMAND_IO); + ac97_via_remap_audio_codec(dev->ac97, base, dev->ac97_regs[0][0x04] & PCI_COMMAND_IO); } static uint8_t @@ -1204,7 +1220,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv) case 0x77: if ((dev->local >= VIA_PIPC_686A) && (val & 0x10)) - pclog("PIPC: Warning: Internal I/O APIC enabled.\n"); + warning("PIPC: Warning: Internal I/O APIC enabled.\n"); nvr_via_wp_set(!!(val & 0x04), 0x32, dev->nvr); nvr_via_wp_set(!!(val & 0x02), 0x0d, dev->nvr); break; @@ -1488,36 +1504,39 @@ pipc_write(int func, int addr, uint8_t val, void *priv) break; } } else if (func <= pm_func + 2) { /* AC97 / MC97 */ - /* Read-only addresses. */ - if ((addr < 0x4) || ((addr >= 0x6) && (addr < 0x9)) || ((addr >= 0xc) && (addr < 0x11)) || (addr == 0x16) || (addr == 0x17) || (addr == 0x1a) || (addr == 0x1b) || ((addr >= 0x1e) && (addr < 0x2c)) || ((addr >= 0x30) && (addr < 0x34)) || ((addr >= 0x35) && (addr < 0x3c)) || ((addr >= 0x3d) && (addr < 0x41)) || ((addr >= 0x45) && (addr < 0x4a)) || (addr >= 0x4c)) - return; - /* Small shortcut. */ func = func - pm_func - 1; - /* Check disable bits and specific read-only addresses for both controllers. */ - if ((func == 0) && (((addr >= 0x09) && (addr < 0xc)) || (addr == 0x44) || (dev->pci_isa_regs[0x85] & 0x04))) + /* Check disable bits. */ + if ((func == 0) && (dev->pci_isa_regs[0x85] & 0x04)) return; - if ((func == 1) && ((addr == 0x14) || (addr == 0x15) || (addr == 0x18) || (addr == 0x19) || (addr == 0x42) || (addr == 0x43) || (addr == 0x48) || (addr == 0x4a) || (addr == 0x4b) || (dev->pci_isa_regs[0x85] & 0x08))) + if ((func == 1) && (dev->pci_isa_regs[0x85] & 0x08)) return; switch (addr) { case 0x04: - dev->ac97_regs[func][addr] = val; + dev->ac97_regs[func][addr] = val & 0x01; pipc_sgd_handlers(dev, func); + if (func == 0) { + pipc_fmnmi_handlers(dev, func); + pipc_sb_handlers(dev, func); + } pipc_codec_handlers(dev, func); - pipc_fmnmi_handlers(dev, func); break; case 0x09: case 0x0a: case 0x0b: - if (dev->ac97_regs[func][0x44] & 0x20) + /* Not writable on audio, only on modem. */ + if ((func == 1) && (dev->ac97_regs[func][0x44] & 0x20)) dev->ac97_regs[func][addr] = val; break; - case 0x10: + /* + The lowest 10 bytes are always 0x01, indicating + a 256-byte I/O space. + */ case 0x11: dev->ac97_regs[func][addr] = val; pipc_sgd_handlers(dev, func); @@ -1525,21 +1544,26 @@ pipc_write(int func, int addr, uint8_t val, void *priv) case 0x14: case 0x15: - if (addr == 0x14) - val = (val & 0xfc) | 1; - dev->ac97_regs[func][addr] = val; - pipc_fmnmi_handlers(dev, func); + /* Not present on modem. */ + if (func == 0) { + if (addr == 0x14) + val = (val & 0xfc) | 1; + dev->ac97_regs[func][addr] = val; + pipc_fmnmi_handlers(dev, func); + } break; case 0x18: case 0x19: - if (addr == 0x18) - val = (val & 0xfc) | 1; - dev->ac97_regs[func][addr] = val; - pipc_sb_handlers(dev, func); + /* Not present on modem. */ + if (func == 0) { + if (addr == 0x18) + val = (val & 0xfc) | 1; + dev->ac97_regs[func][addr] = val; + pipc_sb_handlers(dev, func); + } break; - case 0x1c: case 0x1d: dev->ac97_regs[func][addr] = val; pipc_codec_handlers(dev, func); @@ -1549,39 +1573,84 @@ pipc_write(int func, int addr, uint8_t val, void *priv) case 0x2d: case 0x2e: case 0x2f: - if ((func == 0) && (dev->ac97_regs[func][0x42] & 0x20)) + if (((func == 0) && (dev->ac97_regs[func][0x42] & 0x20)) || + ((func == 1) && (dev->ac97_regs[func][0x44] & 0x10))) dev->ac97_regs[func][addr] = val; break; + case 0x3c: + dev->ac97_regs[func][addr] = val & 0x0f; + break; + case 0x41: dev->ac97_regs[func][addr] = val; ac97_via_write_control(dev->ac97, func, val); break; case 0x42: - case 0x4a: - case 0x4b: - dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val; - gameport_remap(dev->gameport, (dev->ac97_regs[0][0x42] & 0x08) ? ((dev->ac97_regs[0][0x4b] << 8) | (dev->ac97_regs[0][0x4a] & 0xf8)) : 0); - if (addr == 0x42) - pipc_sb_handlers(dev, func); + case 0x4a ... 0x4b: + if (func == 0) { + dev->ac97_regs[func][addr] = val; + gameport_remap(dev->gameport, (dev->ac97_regs[func][0x42] & 0x08) ? + ((dev->ac97_regs[func][0x4b] << 8) | + (dev->ac97_regs[func][0x4a] & 0xf8)) : 0); + + if (addr == 0x42) + pipc_sb_handlers(dev, func); + } break; case 0x43: - dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val; + if (func == 0) + dev->ac97_regs[func][addr] = val; break; case 0x44: - dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val & 0xf0; + if (func == 1) + dev->ac97_regs[func][addr] = val & 0xf0; break; - case 0x45: case 0x48: - dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val & 0x0f; + if (func == 0) + dev->ac97_regs[func][addr] = val & 0x0f; + break; + + case 0x80: + case 0x81: + case 0x82: + dev->ac97_regs[func][addr] = val; + break; + case 0x83: + dev->ac97_regs[func][addr] = ((dev->ac97_regs[func][addr] & 0x01) | + (val & 0xc0)) & ~(val & 0x0a); + break; + + case 0x88: + case 0x89: + dev->ac97_regs[func][addr] = val; + break; + case 0x8a: + case 0x8b: + dev->ac97_regs[func][addr] &= ~val; + break; + + case 0x8e: + case 0x8f: + dev->ac97_regs[func][addr] = val; + break; + + case 0xc4: + if (func == 0) + dev->ac97_regs[func][addr] = (dev->ac97_regs[func][addr] & 0x0c) | + (val & 0x03); + break; + case 0xc5: + if (func == 0) + dev->ac97_regs[func][addr] = (dev->ac97_regs[func][addr] & 0x60) | + (val & 0x9f); break; default: - dev->ac97_regs[func][addr] = val; break; } } diff --git a/src/sound/snd_ac97_codec.c b/src/sound/snd_ac97_codec.c index e92830f67..7a9951289 100644 --- a/src/sound/snd_ac97_codec.c +++ b/src/sound/snd_ac97_codec.c @@ -539,8 +539,9 @@ ac97_codec_getattn(void *priv, uint8_t reg, int *l, int *r) *l = codec_attn[0x3f - (l_val & 0x3f)]; *r = codec_attn[0x3f - (r_val & 0x3f)]; } else { /* 5-bit gain */ - *l = codec_attn[0x47 - (l_val & 0x1f)]; - *r = codec_attn[0x47 - (r_val & 0x1f)]; + /* Yes, 0x3f is correct, the 0x47 was most likely a decimal-hex mix-up. */ + *l = codec_attn[0x3f - (l_val & 0x1f)]; + *r = codec_attn[0x3f - (r_val & 0x1f)]; } /* Apply per-channel mute and center/LFE powerdowns where applicable. */ diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index 8c1e45c40..68ef5fe5d 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -24,6 +24,7 @@ #include <86box/86box.h> #include <86box/device.h> #include <86box/io.h> +#include <86box/dma.h> #include <86box/mem.h> #include <86box/pci.h> #include <86box/pic.h> @@ -31,10 +32,13 @@ #include <86box/sound.h> #include <86box/timer.h> #include <86box/plat_unused.h> +#include "cpu.h" typedef struct ac97_via_sgd_t { uint8_t id; uint8_t always_run; + uint8_t modem; + uint8_t pad; struct _ac97_via_ *dev; uint32_t entry_ptr; @@ -63,7 +67,7 @@ typedef struct _ac97_via_ { uint16_t audio_codec_base; uint16_t modem_sgd_base; uint16_t modem_codec_base; - uint8_t sgd_regs[256]; + uint8_t sgd_regs[2][256]; uint8_t pcm_enabled : 1; uint8_t fm_enabled : 1; uint8_t vsr_enabled : 1; @@ -78,7 +82,7 @@ typedef struct _ac97_via_ { int irq_pin; ac97_codec_t *codec[2][2]; - ac97_via_sgd_t sgd[6]; + ac97_via_sgd_t sgd[2][6]; int master_vol_l; int master_vol_r; @@ -105,7 +109,7 @@ ac97_via_log(const char *fmt, ...) #endif static void ac97_via_sgd_process(void *priv); -static void ac97_via_update_codec(ac97_via_t *dev); +static void ac97_via_update_codec(ac97_via_t *dev, int modem); static void ac97_via_speed_changed(void *priv); static void ac97_via_filter_cd_audio(int channel, double *buffer, void *priv); @@ -160,29 +164,29 @@ ac97_via_write_control(void *priv, uint8_t modem, uint8_t val) /* Start or stop PCM playback. */ i = (val & 0xf4) == 0xc4; if (i && !dev->pcm_enabled) - timer_advance_u64(&dev->sgd[0].poll_timer, dev->sgd[0].timer_latch); + timer_advance_u64(&dev->sgd[0][0].poll_timer, dev->sgd[0][0].timer_latch); dev->pcm_enabled = i; /* Start or stop FM playback. */ i = (val & 0xf2) == 0xc2; if (i && !dev->fm_enabled) - timer_advance_u64(&dev->sgd[2].poll_timer, dev->sgd[2].timer_latch); + timer_advance_u64(&dev->sgd[0][2].poll_timer, dev->sgd[0][2].timer_latch); dev->fm_enabled = i; /* Update primary audio codec state. */ if (dev->codec[0][0]) - ac97_via_update_codec(dev); + ac97_via_update_codec(dev, 0); } } static void -ac97_via_update_irqs(ac97_via_t *dev) +ac97_via_update_irqs(ac97_via_t *dev, int modem) { /* Check interrupt flags in all SGDs. */ for (uint8_t i = 0x00; i < ((sizeof(dev->sgd) / sizeof(dev->sgd[0])) << 4); i += 0x10) { /* Stop immediately if any flag is set. Doing it this way optimizes rising edges for the playback SGD (0 - first to be checked). */ - if (dev->sgd_regs[i] & (dev->sgd_regs[i | 0x2] & 0x03)) { + if (dev->sgd_regs[modem][i] & (dev->sgd_regs[modem][i | 0x2] & 0x03)) { pci_set_irq(dev->pci_slot, dev->irq_pin, &dev->irq_state); return; } @@ -192,15 +196,15 @@ ac97_via_update_irqs(ac97_via_t *dev) } static void -ac97_via_update_codec(ac97_via_t *dev) +ac97_via_update_codec(ac97_via_t *dev, int modem) { /* Get primary audio codec. */ - ac97_codec_t *codec = dev->codec[0][0]; + ac97_codec_t *codec = dev->codec[modem][0]; /* Update volumes according to codec registers. */ ac97_codec_getattn(codec, 0x02, &dev->master_vol_l, &dev->master_vol_r); - ac97_codec_getattn(codec, 0x18, &dev->sgd[0].vol_l, &dev->sgd[0].vol_r); - ac97_codec_getattn(codec, 0x18, &dev->sgd[2].vol_l, &dev->sgd[2].vol_r); /* VIAFMTSR sets Master, CD and PCM volumes to 0 dB */ + ac97_codec_getattn(codec, 0x18, &dev->sgd[modem][0].vol_l, &dev->sgd[modem][0].vol_r); + ac97_codec_getattn(codec, 0x18, &dev->sgd[modem][2].vol_l, &dev->sgd[modem][2].vol_r); /* VIAFMTSR sets Master, CD and PCM volumes to 0 dB */ ac97_codec_getattn(codec, 0x12, &dev->cd_vol_l, &dev->cd_vol_r); /* Update sample rate according to codec registers and the variable sample rate flag. */ @@ -211,9 +215,9 @@ uint8_t ac97_via_sgd_read(uint16_t addr, void *priv) { const ac97_via_t *dev = (ac97_via_t *) priv; -#ifdef ENABLE_AC97_VIA_LOG +// #ifdef ENABLE_AC97_VIA_LOG uint8_t modem = (addr & 0xff00) == dev->modem_sgd_base; -#endif +// #endif addr &= 0xff; uint8_t ret; @@ -221,83 +225,83 @@ ac97_via_sgd_read(uint16_t addr, void *priv) /* Process SGD channel registers. */ switch (addr & 0xf) { case 0x4: - ret = dev->sgd[addr >> 4].entry_ptr; + ret = dev->sgd[modem][addr >> 4].entry_ptr; break; case 0x5: - ret = dev->sgd[addr >> 4].entry_ptr >> 8; + ret = dev->sgd[modem][addr >> 4].entry_ptr >> 8; break; case 0x6: - ret = dev->sgd[addr >> 4].entry_ptr >> 16; + ret = dev->sgd[modem][addr >> 4].entry_ptr >> 16; break; case 0x7: - ret = dev->sgd[addr >> 4].entry_ptr >> 24; + ret = dev->sgd[modem][addr >> 4].entry_ptr >> 24; break; case 0xc: - ret = dev->sgd[addr >> 4].sample_count; + ret = dev->sgd[modem][addr >> 4].sample_count; break; case 0xd: - ret = dev->sgd[addr >> 4].sample_count >> 8; + ret = dev->sgd[modem][addr >> 4].sample_count >> 8; break; case 0xe: - ret = dev->sgd[addr >> 4].sample_count >> 16; + ret = dev->sgd[modem][addr >> 4].sample_count >> 16; break; default: - ret = dev->sgd_regs[addr]; + ret = dev->sgd_regs[modem][addr]; break; } } else { /* Process regular registers. */ switch (addr) { case 0x84: - ret = (dev->sgd_regs[0x00] & 0x01); - ret |= (dev->sgd_regs[0x10] & 0x01) << 1; - ret |= (dev->sgd_regs[0x20] & 0x01) << 2; + ret = (dev->sgd_regs[modem][0x00] & 0x01); + ret |= (dev->sgd_regs[modem][0x10] & 0x01) << 1; + ret |= (dev->sgd_regs[modem][0x20] & 0x01) << 2; - ret |= (dev->sgd_regs[0x00] & 0x02) << 3; - ret |= (dev->sgd_regs[0x10] & 0x02) << 4; - ret |= (dev->sgd_regs[0x20] & 0x02) << 5; + ret |= (dev->sgd_regs[modem][0x00] & 0x02) << 3; + ret |= (dev->sgd_regs[modem][0x10] & 0x02) << 4; + ret |= (dev->sgd_regs[modem][0x20] & 0x02) << 5; break; case 0x85: - ret = (dev->sgd_regs[0x00] & 0x04) >> 2; - ret |= (dev->sgd_regs[0x10] & 0x04) >> 1; - ret |= (dev->sgd_regs[0x20] & 0x04); + ret = (dev->sgd_regs[modem][0x00] & 0x04) >> 2; + ret |= (dev->sgd_regs[modem][0x10] & 0x04) >> 1; + ret |= (dev->sgd_regs[modem][0x20] & 0x04); - ret |= (dev->sgd_regs[0x00] & 0x80) >> 3; - ret |= (dev->sgd_regs[0x10] & 0x80) >> 2; - ret |= (dev->sgd_regs[0x20] & 0x80) >> 1; + ret |= (dev->sgd_regs[modem][0x00] & 0x80) >> 3; + ret |= (dev->sgd_regs[modem][0x10] & 0x80) >> 2; + ret |= (dev->sgd_regs[modem][0x20] & 0x80) >> 1; break; case 0x86: - ret = (dev->sgd_regs[0x40] & 0x01); - ret |= (dev->sgd_regs[0x50] & 0x01) << 1; + ret = (dev->sgd_regs[modem][0x40] & 0x01); + ret |= (dev->sgd_regs[modem][0x50] & 0x01) << 1; - ret |= (dev->sgd_regs[0x40] & 0x02) << 3; - ret |= (dev->sgd_regs[0x50] & 0x02) << 4; + ret |= (dev->sgd_regs[modem][0x40] & 0x02) << 3; + ret |= (dev->sgd_regs[modem][0x50] & 0x02) << 4; break; case 0x87: - ret = (dev->sgd_regs[0x40] & 0x04) >> 2; - ret |= (dev->sgd_regs[0x50] & 0x04) >> 1; + ret = (dev->sgd_regs[modem][0x40] & 0x04) >> 2; + ret |= (dev->sgd_regs[modem][0x50] & 0x04) >> 1; - ret |= (dev->sgd_regs[0x40] & 0x80) >> 3; - ret |= (dev->sgd_regs[0x50] & 0x80) >> 2; + ret |= (dev->sgd_regs[modem][0x40] & 0x80) >> 3; + ret |= (dev->sgd_regs[modem][0x50] & 0x80) >> 2; break; default: - ret = dev->sgd_regs[addr]; + ret = dev->sgd_regs[modem][addr]; break; } } - ac97_via_log("AC97 VIA %d: sgd_read(%02X) = %02X\n", modem, addr, ret); + ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: sgd_read(%02X) = %02X\n", CS, cpu_state.pc, msw & 1, modem, addr, ret); return ret; } @@ -311,7 +315,9 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) ac97_codec_t *codec; addr &= 0xff; - ac97_via_log("AC97 VIA %d: sgd_write(%02X, %02X)\n", modem, addr, val); + ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: sgd_write(%02X, %02X)\n", CS, cpu_state.pc, msw & 1, modem, addr, val); + + // if ((CS == 0x10000) && (cpu_state.pc == 0x000073d1)) /* Check function-specific read only registers. */ if ((addr >= (modem ? 0x00 : 0x40)) && (addr < (modem ? 0x40 : 0x60))) @@ -324,42 +330,42 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) switch (addr & 0xf) { case 0x0: /* Clear RWC status bits. */ - dev->sgd_regs[addr] &= ~(val & 0x07); + dev->sgd_regs[modem][addr] &= ~(val & 0x07); /* Update status interrupts. */ - ac97_via_update_irqs(dev); + ac97_via_update_irqs(dev, modem); return; case 0x1: /* Start SGD if requested. */ if (val & 0x80) { - if (dev->sgd_regs[addr & 0xf0] & 0x80) { + if (dev->sgd_regs[modem][addr & 0xf0] & 0x80) { /* Queue SGD trigger if already running. */ - dev->sgd_regs[addr & 0xf0] |= 0x08; + dev->sgd_regs[modem][addr & 0xf0] |= 0x08; } else { /* Start SGD immediately. */ - dev->sgd_regs[addr & 0xf0] = (dev->sgd_regs[addr & 0xf0] & ~0x47) | 0x80; + dev->sgd_regs[modem][addr & 0xf0] = (dev->sgd_regs[modem][addr & 0xf0] & ~0x47) | 0x80; /* Start at the specified entry pointer. */ - dev->sgd[addr >> 4].entry_ptr = *((uint32_t *) &dev->sgd_regs[(addr & 0xf0) | 0x4]) & 0xfffffffe; - dev->sgd[addr >> 4].restart = 2; + dev->sgd[modem][addr >> 4].entry_ptr = *((uint32_t *) &dev->sgd_regs[modem][(addr & 0xf0) | 0x4]) & 0xfffffffe; + dev->sgd[modem][addr >> 4].restart = 2; /* Start the actual SGD process. */ - ac97_via_sgd_process(&dev->sgd[addr >> 4]); + ac97_via_sgd_process(&dev->sgd[modem][addr >> 4]); } } /* Stop SGD if requested. */ if (val & 0x40) - dev->sgd_regs[addr & 0xf0] &= ~0x88; + dev->sgd_regs[modem][addr & 0xf0] &= ~0x88; val &= 0x08; /* (Un)pause SGD if requested. */ if (val & 0x08) - dev->sgd_regs[addr & 0xf0] |= 0x40; + dev->sgd_regs[modem][addr & 0xf0] |= 0x40; else - dev->sgd_regs[addr & 0xf0] &= ~0x40; + dev->sgd_regs[modem][addr & 0xf0] &= ~0x40; break; @@ -387,7 +393,7 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) case 0x82: /* Determine the selected codec. */ - i = !!(dev->sgd_regs[0x83] & 0x40); + i = !!(dev->sgd_regs[modem][0x83] & 0x40); codec = dev->codec[modem][i]; /* Keep value in register if this codec is not present. */ @@ -395,20 +401,20 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) /* Read from or write to codec. */ if (val & 0x80) { if (val & 1) { /* return 0x0000 on unaligned reads (real 686B behavior) */ - dev->sgd_regs[0x80] = dev->sgd_regs[0x81] = 0x00; + dev->sgd_regs[modem][0x80] = dev->sgd_regs[modem][0x81] = 0x00; } else { - *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[0x80]) = ac97_codec_readw(codec, val); + *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[modem][0x80]) = ac97_codec_readw(codec, val); } /* Flag data/status/index for this codec as valid. */ - dev->sgd_regs[0x83] |= 0x02 << (i << 1); + dev->sgd_regs[modem][0x83] |= 0x02 << (i << 1); } else if (!(val & 1)) { /* do nothing on unaligned writes */ ac97_codec_writew(codec, val, - *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[0x80])); + *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[modem][0x80])); /* Update primary audio codec state if that codec was written to. */ if (!modem && !i) { - ac97_via_update_codec(dev); + ac97_via_update_codec(dev, 0); /* Set up CD audio filter if CD volume was written to. Setting it up at init prevents CD audio from working on other cards, but @@ -424,9 +430,9 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) case 0x83: /* Clear RWC status bits. */ #if 0 /* race condition with Linux accessing a register and clearing status bits on the same dword write */ - val = (dev->sgd_regs[addr] & ~(val & 0x0a)) | (val & 0xc0); + val = ((dev->sgd_regs[modem][addr] & 0x3f) & ~(val & 0x0a)) | (val & 0xc0); #else - val = dev->sgd_regs[addr] | (val & 0xc0); + val = (dev->sgd_regs[modem][addr] & 0x3f) | (val & 0xc0); #endif break; @@ -435,7 +441,7 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) } } - dev->sgd_regs[addr] = val; + dev->sgd_regs[modem][addr] = val; } void @@ -479,6 +485,8 @@ ac97_via_codec_read(uint16_t addr, void *priv) ac97_via_log("AC97 VIA %d: codec_read(%02X) = %02X\n", modem, addr, ret); + ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: codec_read(%02X) = %02X\n", CS, cpu_state.pc, msw & 1, modem, addr, ret); + return ret; } @@ -489,6 +497,8 @@ ac97_via_codec_write(uint16_t addr, uint8_t val, void *priv) uint8_t modem = (addr & 0xff00) == dev->modem_codec_base; addr &= 0xff; + ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: codec_write(%02X, %02X)\n", CS, cpu_state.pc, msw & 1, modem, addr, val); + ac97_via_log("AC97 VIA %d: codec_write(%02X, %02X)\n", modem, addr, val); /* Unknown behavior, maybe it does write to the shadow registers? */ @@ -501,12 +511,12 @@ ac97_via_remap_audio_codec(void *priv, uint16_t new_io_base, uint8_t enable) ac97_via_t *dev = (ac97_via_t *) priv; if (dev->audio_codec_base) - io_removehandler(dev->audio_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); + io_removehandler(dev->audio_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); dev->audio_codec_base = new_io_base; if (dev->audio_codec_base && enable) - io_sethandler(dev->audio_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); + io_sethandler(dev->audio_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); } void @@ -515,12 +525,12 @@ ac97_via_remap_modem_codec(void *priv, uint16_t new_io_base, uint8_t enable) ac97_via_t *dev = (ac97_via_t *) priv; if (dev->modem_codec_base) - io_removehandler(dev->modem_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); + io_removehandler(dev->modem_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); dev->modem_codec_base = new_io_base; if (dev->modem_codec_base && enable) - io_sethandler(dev->modem_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); + io_sethandler(dev->modem_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev); } static void @@ -551,12 +561,12 @@ ac97_via_sgd_process(void *priv) ac97_via_t *dev = sgd->dev; /* Stop if this SGD is not active. */ - uint8_t sgd_status = dev->sgd_regs[sgd->id] & 0xc4; + uint8_t sgd_status = dev->sgd_regs[sgd->modem][sgd->id] & 0xc4; if (!(sgd_status & 0x80)) return; /* Schedule next run. */ - timer_on_auto(&sgd->dma_timer, 10.0); + timer_on_auto(&sgd->dma_timer, 1.0); /* Process SGD if it's active, and the FIFO has room or is disabled. */ if (((sgd_status & 0xc7) == 0x80) && (sgd->always_run || ((sgd->fifo_end - sgd->fifo_pos) <= (sizeof(sgd->fifo) - 4)))) { @@ -564,13 +574,15 @@ ac97_via_sgd_process(void *priv) if (sgd->restart) { /* (Re)load entry pointer if required. */ if (sgd->restart & 2) - sgd->entry_ptr = *((uint32_t *) &dev->sgd_regs[sgd->id | 0x4]) & 0xfffffffe; /* TODO: probe real hardware - does "even addr" actually mean dword aligned? */ + sgd->entry_ptr = *((uint32_t *) &dev->sgd_regs[sgd->modem][sgd->id | 0x4]) & 0xfffffffe; /* TODO: probe real hardware - does "even addr" actually mean dword aligned? */ sgd->restart = 0; /* Read entry. */ - sgd->sample_ptr = mem_readl_phys(sgd->entry_ptr); + // sgd->sample_ptr = mem_readl_phys(sgd->entry_ptr); + dma_bm_read(sgd->entry_ptr, (uint8_t *) &sgd->sample_ptr, 4, 4); sgd->entry_ptr += 4; - sgd->sample_count = mem_readl_phys(sgd->entry_ptr); + // sgd->sample_count = mem_readl_phys(sgd->entry_ptr); + dma_bm_read(sgd->entry_ptr, (uint8_t *) &sgd->sample_count, 4, 4); sgd->entry_ptr += 4; #ifdef ENABLE_AC97_VIA_LOG if (((sgd->sample_ptr == 0xffffffff) && (sgd->sample_count == 0xffffffff)) || ((sgd->sample_ptr == 0x00000000) && (sgd->sample_count == 0x00000000))) @@ -588,10 +600,12 @@ ac97_via_sgd_process(void *priv) if (sgd->id & 0x10) { /* Write channel: read data from FIFO. */ - mem_writel_phys(sgd->sample_ptr, *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)])); + // mem_writel_phys(sgd->sample_ptr, *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)])); + dma_bm_write(sgd->sample_ptr, &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)], 4, 4); } else { /* Read channel: write data to FIFO. */ - *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]) = mem_readl_phys(sgd->sample_ptr); + // *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]) = mem_readl_phys(sgd->sample_ptr); + dma_bm_read(sgd->sample_ptr, &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)], 4, 4); } sgd->fifo_end += 4; sgd->sample_ptr += 4; @@ -608,17 +622,17 @@ ac97_via_sgd_process(void *priv) ac97_via_log(" with STOP"); /* Raise STOP to pause SGD. */ - dev->sgd_regs[sgd->id] |= 0x04; + dev->sgd_regs[sgd->modem][sgd->id] |= 0x04; } if (sgd->entry_flags & 0x40) { ac97_via_log(" with FLAG"); /* Raise FLAG to pause SGD. */ - dev->sgd_regs[sgd->id] |= 0x01; + dev->sgd_regs[sgd->modem][sgd->id] |= 0x01; #ifdef ENABLE_AC97_VIA_LOG - if (dev->sgd_regs[sgd->id | 0x2] & 0x01) + if (dev->sgd_regs[sgd->modem][sgd->id | 0x2] & 0x01) ac97_via_log(" interrupt"); #endif } @@ -627,19 +641,19 @@ ac97_via_sgd_process(void *priv) ac97_via_log(" with EOL"); /* Raise EOL. */ - dev->sgd_regs[sgd->id] |= 0x02; + dev->sgd_regs[sgd->modem][sgd->id] |= 0x02; #ifdef ENABLE_AC97_VIA_LOG - if (dev->sgd_regs[sgd->id | 0x2] & 0x02) + if (dev->sgd_regs[sgd->modem][sgd->id | 0x2] & 0x02) ac97_via_log(" interrupt"); #endif /* Restart SGD if a trigger is queued or auto-start is enabled. */ - if ((dev->sgd_regs[sgd->id] & 0x08) || (dev->sgd_regs[sgd->id | 0x2] & 0x80)) { + if ((dev->sgd_regs[sgd->modem][sgd->id] & 0x08) || (dev->sgd_regs[sgd->modem][sgd->id | 0x2] & 0x80)) { ac97_via_log(" restart"); /* Un-queue trigger. */ - dev->sgd_regs[sgd->id] &= ~0x08; + dev->sgd_regs[sgd->modem][sgd->id] &= ~0x08; /* Go back to the starting block on the next run. */ sgd->restart = 2; @@ -647,13 +661,13 @@ ac97_via_sgd_process(void *priv) ac97_via_log(" finish"); /* Terminate SGD. */ - dev->sgd_regs[sgd->id] &= ~0x80; + dev->sgd_regs[sgd->modem][sgd->id] &= ~0x80; } } ac97_via_log("\n"); /* Fire any requested status interrupts. */ - ac97_via_update_irqs(dev); + ac97_via_update_irqs(dev, sgd->modem); } } } @@ -662,7 +676,7 @@ static void ac97_via_poll_stereo(void *priv) { ac97_via_t *dev = (ac97_via_t *) priv; - ac97_via_sgd_t *sgd = &dev->sgd[0]; /* Audio Read */ + ac97_via_sgd_t *sgd = &dev->sgd[0][0]; /* Audio Read */ /* Schedule next run if PCM playback is enabled. */ if (dev->pcm_enabled) @@ -672,7 +686,7 @@ ac97_via_poll_stereo(void *priv) ac97_via_update_stereo(dev, sgd); /* Feed next sample from the FIFO. */ - switch (dev->sgd_regs[sgd->id | 0x2] & 0x30) { + switch (dev->sgd_regs[0][sgd->id | 0x2] & 0x30) { case 0x00: /* Mono, 8-bit PCM */ if ((sgd->fifo_end - sgd->fifo_pos) >= 1) { sgd->out_l = sgd->out_r = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8; @@ -718,7 +732,7 @@ static void ac97_via_poll_fm(void *priv) { ac97_via_t *dev = (ac97_via_t *) priv; - ac97_via_sgd_t *sgd = &dev->sgd[2]; /* FM Read */ + ac97_via_sgd_t *sgd = &dev->sgd[0][2]; /* FM Read */ /* Schedule next run if FM playback is enabled. */ if (dev->fm_enabled) @@ -746,15 +760,15 @@ ac97_via_get_buffer(int32_t *buffer, int len, void *priv) { ac97_via_t *dev = (ac97_via_t *) priv; - ac97_via_update_stereo(dev, &dev->sgd[0]); - ac97_via_update_stereo(dev, &dev->sgd[2]); + ac97_via_update_stereo(dev, &dev->sgd[0][0]); + ac97_via_update_stereo(dev, &dev->sgd[0][2]); for (int c = 0; c < len * 2; c++) { - buffer[c] += dev->sgd[0].buffer[c] / 2; - buffer[c] += dev->sgd[2].buffer[c] / 2; + buffer[c] += dev->sgd[0][0].buffer[c] / 2; + buffer[c] += dev->sgd[0][2].buffer[c] / 2; } - dev->sgd[0].pos = dev->sgd[2].pos = 0; + dev->sgd[0][0].pos = dev->sgd[0][2].pos = 0; } static void @@ -780,8 +794,8 @@ ac97_via_speed_changed(void *priv) else freq = (double) SOUND_FREQ; - dev->sgd[0].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / freq)); - dev->sgd[2].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 24000.0)); /* FM operates at a fixed 24 KHz */ + dev->sgd[0][0].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / freq)); + dev->sgd[0][2].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 24000.0)); /* FM operates at a fixed 24 KHz */ } static void * @@ -799,19 +813,23 @@ ac97_via_init(UNUSED(const device_t *info)) /* Set up SGD channels. */ for (uint8_t i = 0; i < (sizeof(dev->sgd) / sizeof(dev->sgd[0])); i++) { - dev->sgd[i].id = i << 4; - dev->sgd[i].dev = dev; + for (uint8_t j = 0; j < 2; j++) { + dev->sgd[j][i].id = i << 4; + dev->sgd[j][i].dev = dev; - /* Disable the FIFO on SGDs we don't care about. */ - if ((i != 0) && (i != 2)) - dev->sgd[i].always_run = 1; + dev->sgd[j][i].modem = j; - timer_add(&dev->sgd[i].dma_timer, ac97_via_sgd_process, &dev->sgd[i], 0); + /* Disable the FIFO on SGDs we don't care about. */ + if ((i != 0) && (i != 2)) + dev->sgd[j][i].always_run = 1; + + timer_add(&dev->sgd[j][i].dma_timer, ac97_via_sgd_process, &dev->sgd[j][i], 0); + } } /* Set up playback pollers. */ - timer_add(&dev->sgd[0].poll_timer, ac97_via_poll_stereo, dev, 0); - timer_add(&dev->sgd[2].poll_timer, ac97_via_poll_fm, dev, 0); + timer_add(&dev->sgd[0][0].poll_timer, ac97_via_poll_stereo, dev, 0); + timer_add(&dev->sgd[0][2].poll_timer, ac97_via_poll_fm, dev, 0); ac97_via_speed_changed(dev); /* Set up playback handler. */ From afd910931b75019590f2fd1c87148fd10aa60ea0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 31 Mar 2025 04:36:37 +0200 Subject: [PATCH 028/118] Fix an accidental CPU mess-up. --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index fa383139b..e421e5637 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1713,7 +1713,7 @@ const machine_t machines[] = { { .name = "[8088] VTech Laser Turbo XT", .internal_name = "ltxt", - .type = MACHINE_TYPE_8088, + .type = MACHINE_TYPE_8088_VTECH, .chipset = MACHINE_CHIPSET_DISCRETE, .init = machine_xt_laserxt_init, .p1_handler = NULL, @@ -1762,7 +1762,7 @@ const machine_t machines[] = { .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { - .package = CPU_PKG_8088_VTECH, + .package = CPU_PKG_8088, .block = CPU_BLOCK_NONE, .min_bus = 0, .max_bus = 0, From a00f4e2e7f006f41aacd0d67b0e35403ddef05f8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 31 Mar 2025 06:12:56 +0200 Subject: [PATCH 029/118] The _VTECH suffix is supposed to be on the CPU package, not on the machine type. --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index e421e5637..142571d9d 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1713,7 +1713,7 @@ const machine_t machines[] = { { .name = "[8088] VTech Laser Turbo XT", .internal_name = "ltxt", - .type = MACHINE_TYPE_8088_VTECH, + .type = MACHINE_TYPE_8088, .chipset = MACHINE_CHIPSET_DISCRETE, .init = machine_xt_laserxt_init, .p1_handler = NULL, @@ -1721,7 +1721,7 @@ const machine_t machines[] = { .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { - .package = CPU_PKG_8088, + .package = CPU_PKG_8088_VTECH, .block = CPU_BLOCK_NONE, .min_bus = 0, .max_bus = 0, From 73dfb3fea9e825618055eb992ade9b6a703da4cb Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 31 Mar 2025 22:48:46 +0600 Subject: [PATCH 030/118] Hardware Renderer: Make sure to account for devicePixelRatio when setting up the matrix --- src/qt/qt_hardwarerenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_hardwarerenderer.cpp b/src/qt/qt_hardwarerenderer.cpp index d5aa86b79..fb84606b0 100644 --- a/src/qt/qt_hardwarerenderer.cpp +++ b/src/qt/qt_hardwarerenderer.cpp @@ -145,7 +145,7 @@ HardwareRenderer::paintGL() QVector texcoords; QMatrix4x4 mat; mat.setToIdentity(); - mat.ortho(QRectF(0, 0, (qreal) width(), (qreal) height())); + mat.ortho(QRectF(0, 0, (qreal) width() * (qreal) devicePixelRatioF(), (qreal) height() * (qreal) devicePixelRatioF())); verts.push_back(QVector2D((float) destination.x(), (float) destination.y())); verts.push_back(QVector2D((float) destination.x(), (float) destination.y() + (float) destination.height())); verts.push_back(QVector2D((float) destination.x() + (float) destination.width(), (float) destination.y() + (float) destination.height())); From 04247b3c25401039ea1d4aa1df150691de921c5b Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 1 Apr 2025 06:36:16 +0200 Subject: [PATCH 031/118] Both recompilers: Temporarily disable recompilation of exactly four memory versions in 32-bit address move of opcode C6h (8-bit MOV immediate) because they currently break NT 3.x NTVDM, fixes #5038. --- src/codegen/codegen_ops_mov.h | 8 +++++++- src/codegen_new/codegen_ops_mov.c | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/codegen/codegen_ops_mov.h b/src/codegen/codegen_ops_mov.h index 039489035..6a5054b81 100644 --- a/src/codegen/codegen_ops_mov.h +++ b/src/codegen/codegen_ops_mov.h @@ -152,7 +152,13 @@ ropMOV_b_imm(UNUSED(uint8_t opcode), uint32_t fetchdat, uint32_t op_32, uint32_t { if ((fetchdat & 0xc0) == 0xc0) { STORE_IMM_REG_B(fetchdat & 7, (fetchdat >> 8) & 0xff); - } else { + } +/* TODO: Fix the recompilation of that specific case so it no longer breaks NT 3.x NTVDM. */ +#ifndef RECOMPILE_MOVB_IMM_MEM_ALWAYS + else if (((fetchdat & 0xfc) == 0x80) && (op_32 & 0x200)) + return 0; +#endif + else { x86seg *target_seg = FETCH_EA(op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32); uint32_t imm = fastreadb(cs + op_pc + 1); int host_reg = LOAD_REG_IMM(imm); diff --git a/src/codegen_new/codegen_ops_mov.c b/src/codegen_new/codegen_ops_mov.c index 031d2ea05..f79a959a7 100644 --- a/src/codegen_new/codegen_ops_mov.c +++ b/src/codegen_new/codegen_ops_mov.c @@ -296,7 +296,13 @@ ropMOV_b_imm(codeblock_t *block, ir_data_t *ir, UNUSED(uint8_t opcode), uint32_t imm = fastreadb(cs + op_pc + 1); uop_MOV_IMM(ir, IREG_8(dest_reg), imm); - } else { + } +/* TODO: Fix the recompilation of that specific case so it no longer breaks NT 3.x NTVDM. */ +#ifndef RECOMPILE_MOVB_IMM_MEM_ALWAYS + else if (((fetchdat & 0xfc) == 0x80) && (op_32 & 0x200)) + return 0; +#endif + else { uop_MOV_IMM(ir, IREG_oldpc, cpu_state.oldpc); target_seg = codegen_generate_ea(ir, op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32, 0); codegen_check_seg_write(block, ir, target_seg); From 4c0f0ddd24c0e0ef0df2d035d9fcc337f7164082 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 1 Apr 2025 06:42:14 +0200 Subject: [PATCH 032/118] VIA AC'97: Restore the 0x47 back (turns out it was *NOT* a mix-up), but divide by 208925 instead of by 32767, in order to keep the maximum in the -32768 to 32767 range even at +12 dB gain. --- src/sound/snd_ac97_codec.c | 2 +- src/sound/snd_ac97_via.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sound/snd_ac97_codec.c b/src/sound/snd_ac97_codec.c index 7a9951289..ad535591f 100644 --- a/src/sound/snd_ac97_codec.c +++ b/src/sound/snd_ac97_codec.c @@ -537,7 +537,7 @@ ac97_codec_getattn(void *priv, uint8_t reg, int *l, int *r) uint8_t r_val = val; if (reg <= 0x06) { /* 6-bit level */ *l = codec_attn[0x3f - (l_val & 0x3f)]; - *r = codec_attn[0x3f - (r_val & 0x3f)]; + *r = codec_attn[0x47 - (r_val & 0x3f)]; } else { /* 5-bit gain */ /* Yes, 0x3f is correct, the 0x47 was most likely a decimal-hex mix-up. */ *l = codec_attn[0x3f - (l_val & 0x1f)]; diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index 68ef5fe5d..2d994b08f 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -536,8 +536,13 @@ ac97_via_remap_modem_codec(void *priv, uint16_t new_io_base, uint8_t enable) static void ac97_via_update_stereo(ac97_via_t *dev, ac97_via_sgd_t *sgd) { +#ifdef OLD_CODE int32_t l = (((sgd->out_l * sgd->vol_l) >> 15) * dev->master_vol_l) >> 15; int32_t r = (((sgd->out_r * sgd->vol_r) >> 15) * dev->master_vol_r) >> 15; +#else + int32_t l = (((sgd->out_l * sgd->vol_l) / 208925) * dev->master_vol_l) >> 15; + int32_t r = (((sgd->out_r * sgd->vol_r) / 208925) * dev->master_vol_r) >> 15; +#endif if (l < -32768) l = -32768; From 5ea48b20277374e23a1cf3208cfdd2153f7fc25a Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 1 Apr 2025 06:42:51 +0200 Subject: [PATCH 033/118] Correct the fix. --- src/sound/snd_ac97_codec.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sound/snd_ac97_codec.c b/src/sound/snd_ac97_codec.c index ad535591f..e92830f67 100644 --- a/src/sound/snd_ac97_codec.c +++ b/src/sound/snd_ac97_codec.c @@ -537,11 +537,10 @@ ac97_codec_getattn(void *priv, uint8_t reg, int *l, int *r) uint8_t r_val = val; if (reg <= 0x06) { /* 6-bit level */ *l = codec_attn[0x3f - (l_val & 0x3f)]; - *r = codec_attn[0x47 - (r_val & 0x3f)]; + *r = codec_attn[0x3f - (r_val & 0x3f)]; } else { /* 5-bit gain */ - /* Yes, 0x3f is correct, the 0x47 was most likely a decimal-hex mix-up. */ - *l = codec_attn[0x3f - (l_val & 0x1f)]; - *r = codec_attn[0x3f - (r_val & 0x1f)]; + *l = codec_attn[0x47 - (l_val & 0x1f)]; + *r = codec_attn[0x47 - (r_val & 0x1f)]; } /* Apply per-channel mute and center/LFE powerdowns where applicable. */ From 1783da99a4b2becec060134c0ffcec57cdcccd6f Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 1 Apr 2025 08:48:01 +0200 Subject: [PATCH 034/118] 86F internal handler: make the common handlers function initialize the floppy density hole return function, fixes 3-mode (dual-RPM) 3.5" drives. --- src/floppy/fdd_86f.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index f5626e35b..0a7120b16 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -3452,6 +3452,7 @@ d86f_common_handlers(int drive) drives[drive].poll = d86f_poll; drives[drive].format = d86f_proxy_format; drives[drive].stop = d86f_stop; + drives[drive].hole = d86f_hole; } int From 3e7f8a18de884e4ffe7ed9962b34442a4960017a Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 1 Apr 2025 09:18:12 +0200 Subject: [PATCH 035/118] FDC: Initialize DRVRATE to 1 on the OKI IF386AX so that 1.25 MB floppies can be read on a 3.5" 3-mode drive. --- src/floppy/fdc.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 51c3aa24a..6ffa47f29 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -2268,10 +2268,21 @@ fdc_reset(void *priv) fdc_update_rwc(fdc, 1, default_rwc); fdc_update_rwc(fdc, 2, default_rwc); fdc_update_rwc(fdc, 3, default_rwc); - fdc_update_drvrate(fdc, 0, 0); - fdc_update_drvrate(fdc, 1, 0); - fdc_update_drvrate(fdc, 2, 0); - fdc_update_drvrate(fdc, 3, 0); + /* + The OKI IF386SX natively supports the Japanese 1.25 MB floppy format, + since it can read such images just fine, it also attempts to use data + rate 01 on a 3.5" MB drive (which is the only kind it can physically + take, anyway), and rate 01 on a 3.5" MB drive is usually used by 3-mode + drives to switch to 360 RPM. Hence why I'm switching DRVDEN to 1, so + rate 01 becomes 500 kbps, so on a 3-mode 3.5" drive, 1.25 MB floppies + can be read. The side effect is that to read 5.25" 360k drives, you + need to use a dual-RPM 5.25" drive - but hey, that finally gets those + drives some usage as well. + */ + fdc_update_drvrate(fdc, 0, !strcmp(machine_get_internal_name(), "if386sx")); + fdc_update_drvrate(fdc, 1, !strcmp(machine_get_internal_name(), "if386sx")); + fdc_update_drvrate(fdc, 2, !strcmp(machine_get_internal_name(), "if386sx")); + fdc_update_drvrate(fdc, 3, !strcmp(machine_get_internal_name(), "if386sx")); fdc_update_drv2en(fdc, 1); fdc_update_rates(fdc); From fd618440618e3d6e426d60e59921fd8495531b09 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 1 Apr 2025 15:44:37 +0600 Subject: [PATCH 036/118] Switch to SAASound for CMS --- src/include/86box/snd_cms.h | 23 +- src/sound/CMakeLists.txt | 3 + src/sound/saasound/CMakeLists.txt | 16 + src/sound/saasound/SAAAmp.cpp | 203 +++++++++ src/sound/saasound/SAAAmp.h | 44 ++ src/sound/saasound/SAAConfig.h | 41 ++ src/sound/saasound/SAADevice.cpp | 392 +++++++++++++++++ src/sound/saasound/SAADevice.h | 69 +++ src/sound/saasound/SAAEnv.cpp | 380 ++++++++++++++++ src/sound/saasound/SAAEnv.h | 54 +++ src/sound/saasound/SAAFreq.cpp | 280 ++++++++++++ src/sound/saasound/SAAFreq.dat | 141 ++++++ src/sound/saasound/SAAFreq.h | 72 +++ src/sound/saasound/SAAImpl.cpp | 487 +++++++++++++++++++++ src/sound/saasound/SAAImpl.h | 75 ++++ src/sound/saasound/SAANoise.cpp | 180 ++++++++ src/sound/saasound/SAANoise.h | 54 +++ src/sound/saasound/SAASndC.cpp | 100 +++++ src/sound/saasound/SAASndC.h | 102 +++++ src/sound/saasound/SAASound.cpp | 13 + src/sound/saasound/SAASound.h | 130 ++++++ src/sound/saasound/defns.h | 59 +++ src/sound/saasound/resource.h | 15 + src/sound/saasound/saasound_cmake_config.h | 14 + src/sound/saasound/types.h | 34 ++ src/sound/snd_cms.c | 138 ++---- 26 files changed, 3006 insertions(+), 113 deletions(-) create mode 100644 src/sound/saasound/CMakeLists.txt create mode 100755 src/sound/saasound/SAAAmp.cpp create mode 100755 src/sound/saasound/SAAAmp.h create mode 100644 src/sound/saasound/SAAConfig.h create mode 100644 src/sound/saasound/SAADevice.cpp create mode 100644 src/sound/saasound/SAADevice.h create mode 100755 src/sound/saasound/SAAEnv.cpp create mode 100755 src/sound/saasound/SAAEnv.h create mode 100755 src/sound/saasound/SAAFreq.cpp create mode 100755 src/sound/saasound/SAAFreq.dat create mode 100755 src/sound/saasound/SAAFreq.h create mode 100644 src/sound/saasound/SAAImpl.cpp create mode 100755 src/sound/saasound/SAAImpl.h create mode 100755 src/sound/saasound/SAANoise.cpp create mode 100755 src/sound/saasound/SAANoise.h create mode 100755 src/sound/saasound/SAASndC.cpp create mode 100644 src/sound/saasound/SAASndC.h create mode 100755 src/sound/saasound/SAASound.cpp create mode 100644 src/sound/saasound/SAASound.h create mode 100644 src/sound/saasound/defns.h create mode 100755 src/sound/saasound/resource.h create mode 100644 src/sound/saasound/saasound_cmake_config.h create mode 100755 src/sound/saasound/types.h diff --git a/src/include/86box/snd_cms.h b/src/include/86box/snd_cms.h index 8eec22935..8201fe32c 100644 --- a/src/include/86box/snd_cms.h +++ b/src/include/86box/snd_cms.h @@ -7,23 +7,20 @@ #define MASTER_CLOCK 7159090 typedef struct cms_t { - int addrs[2]; - uint8_t regs[2][32]; - uint16_t latch[2][6]; - int freq[2][6]; - float count[2][6]; - int vol[2][6][2]; - int stat[2][6]; - uint16_t noise[2][2]; - uint16_t noisefreq[2][2]; - int noisecount[2][2]; - int noisetype[2][2]; +#ifdef SAASOUND_H_INCLUDED + SAASND saasound; + SAASND saasound2; +#else + void* saasound; + void* saasound2; +#endif uint8_t latched_data; - int16_t buffer[SOUNDBUFLEN * 2]; + int16_t buffer[WTBUFLEN * 2]; + int16_t buffer2[WTBUFLEN * 2]; - int pos; + int pos, pos2; } cms_t; extern void cms_update(cms_t *cms); diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 0a04b0ff1..d575717a0 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -180,6 +180,9 @@ endif() add_subdirectory(ymfm) target_link_libraries(86Box ymfm) +add_subdirectory(saasound) +target_link_libraries(86Box saasound) + if(GUSMAX) target_compile_definitions(snd PRIVATE USE_GUSMAX) endif() diff --git a/src/sound/saasound/CMakeLists.txt b/src/sound/saasound/CMakeLists.txt new file mode 100644 index 000000000..2db75493e --- /dev/null +++ b/src/sound/saasound/CMakeLists.txt @@ -0,0 +1,16 @@ +add_library(saasound OBJECT + SAAAmp.cpp + SAAAmp.h + SAADevice.cpp + SAADevice.h + SAAEnv.cpp + SAAEnv.h + SAAFreq.cpp + SAAFreq.h + SAAImpl.cpp + SAAImpl.h + SAANoise.cpp + SAANoise.h + SAASndC.cpp + SAASndC.h + SAASound.cpp) \ No newline at end of file diff --git a/src/sound/saasound/SAAAmp.cpp b/src/sound/saasound/SAAAmp.cpp new file mode 100755 index 000000000..8f2473fb1 --- /dev/null +++ b/src/sound/saasound/SAAAmp.cpp @@ -0,0 +1,203 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAAAmp.cpp: implementation of the CSAAAmp class. +// This class handles Tone/Noise mixing, Envelope application and +// amplification. +// +////////////////////////////////////////////////////////////////////// + +#include "SAASound.h" +#include "types.h" +#include "SAANoise.h" +#include "SAAEnv.h" +#include "SAAFreq.h" +#include "SAAAmp.h" +#include "defns.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CSAAAmp::CSAAAmp(CSAAFreq * const ToneGenerator, const CSAANoise * const NoiseGenerator, const CSAAEnv * const EnvGenerator) +: +m_pcConnectedToneGenerator(ToneGenerator), +m_pcConnectedNoiseGenerator(NoiseGenerator), +m_pcConnectedEnvGenerator(EnvGenerator), +m_bUseEnvelope(EnvGenerator != NULL) +{ + leftlevel = 0; + leftlevela0x0e = 0; + rightlevel = 0; + rightlevela0x0e = 0; + m_nMixMode = 0; + m_bMute=true; + m_bSync = false; + m_nOutputIntermediate=0; + last_level_byte=0; + SetAmpLevel(0x00); + +} + +CSAAAmp::~CSAAAmp() +{ + // Nothing to do +} + +void CSAAAmp::SetAmpLevel(BYTE level_byte) +{ + // if level unchanged since last call then do nothing + if (level_byte != last_level_byte) + { + last_level_byte = level_byte; + leftlevel = level_byte & 0x0f; + leftlevela0x0e = leftlevel & 0x0e; + + rightlevel = (level_byte >> 4) & 0x0f; + rightlevela0x0e = rightlevel & 0x0e; + } + +} + +void CSAAAmp::SetToneMixer(BYTE bEnabled) +{ + if (bEnabled == 0) + { + // clear mixer bit + m_nMixMode &= ~(0x01); + } + else + { + // set mixer bit + m_nMixMode |= 0x01; + } +} + +void CSAAAmp::SetNoiseMixer(BYTE bEnabled) +{ + if (bEnabled == 0) + { + m_nMixMode &= ~(0x02); + } + else + { + m_nMixMode |= 0x02; + } +} + +void CSAAAmp::Mute(bool bMute) +{ + // m_bMute refers to the GLOBAL mute setting (register 28 bit 0) + // NOT the per-channel mixer settings !! + m_bMute = bMute; +} + +void CSAAAmp::Sync(bool bSync) +{ + // m_bSync refers to the GLOBAL sync setting (register 28 bit 1) + m_bSync = bSync; +} + +void CSAAAmp::Tick(void) +{ + // updates m_nOutputIntermediate to 0, 1 or 2 + // + + // connected oscillator always ticks (this isn't really connected to the amp) + int level = m_pcConnectedToneGenerator->Tick(); + + switch (m_nMixMode) + { + case 0: + // no tone or noise for this channel + m_nOutputIntermediate = 0; + break; + case 1: + // tone only for this channel + m_nOutputIntermediate = level * 2; + // NOTE: ConnectedToneGenerator returns either 0 or 1 + break; + case 2: + // noise only for this channel + m_nOutputIntermediate = m_pcConnectedNoiseGenerator->Level() * 2; + // NOTE: ConnectedNoiseGenerator()->Level() returns either 0 or 1 + break; + case 3: + // tone+noise for this channel ... mixing algorithm : + // tone noise output + // 0 0 0 + // 1 0 2 + // 0 1 0 + // 1 1 1 + // = 2 * tone - 1 * (tone & noise) + // = tone * (2 - noise) + m_nOutputIntermediate = level * (2 - m_pcConnectedNoiseGenerator->Level()); + break; + } + // intermediate is between 0 and 2 +} + +inline int CSAAAmp::EffectiveAmplitude(int amp, int env) const +{ + // Return the effective amplitude of the low-pass-filtered result of the logical + // AND of the amplitude PDM and envelope PDM patterns. This is a more accurate + // evaluation of the SAA than simply returning amp * env , based on how the SAA + // implements pulse-density modulation. + static const int pdm[16][16] = { + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,2,2,2,2,2,2,2,2,4,4,4,4}, + {0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8}, + {0,1,1,2,4,5,5,6,6,7,7,8,10,11,11,12}, + {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, + {0,1,2,3,6,7,8,9,10,11,12,13,16,17,18,19}, + {0,2,3,5,6,8,9,11,12,14,15,17,18,20,21,23}, + {0,2,3,5,8,10,11,13,14,16,17,19,22,24,25,27}, + {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30}, + {0,2,4,6,10,12,14,16,18,20,22,24,28,30,32,34}, + {0,3,5,8,10,13,15,18,20,23,25,28,30,33,35,38}, + {0,3,5,8,12,15,17,20,22,25,27,30,34,37,39,42}, + {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45}, + {0,3,6,9,14,17,20,23,26,29,32,35,40,43,46,49}, + {0,4,7,11,14,18,21,25,28,32,35,39,42,46,49,53}, + {0,4,7,11,16,20,23,27,30,34,37,41,46,50,53,57} + }; + + return(pdm[amp][env] * 4); +} + +void CSAAAmp::TickAndOutputStereo(unsigned int & left, unsigned int & right) +{ + // This returns a value between 0 and 480 inclusive. + // This represents the full dynamic range of one output mixer (tone, or noise+tone, at full volume, + // without envelopes enabled). Note that, with envelopes enabled, the actual dynamic range + // is reduced on-chip to just over 88% of this (424), so the "loudest" output requires disabling envs. + // NB for 6 channels at full volume, with simple additive mixing, you would see a combined + // output of 2880, and a multiplier of 11 (=31680) fits comfortably within 16-bit signed output range. + + if (m_bSync) + { + // TODO check this + left = right = 0; + return; + } + + // first, do the Tick: + Tick(); + + // now calculate the returned amplitude for this sample: + //////////////////////////////////////////////////////// + + if (m_bMute) + { + left = right = 0; + } + else if (m_bUseEnvelope && m_pcConnectedEnvGenerator->IsActive()) + { + left = EffectiveAmplitude(m_pcConnectedEnvGenerator->LeftLevel(), leftlevela0x0e) * (2 - m_nOutputIntermediate); + right = EffectiveAmplitude(m_pcConnectedEnvGenerator->RightLevel(), rightlevela0x0e) * (2 - m_nOutputIntermediate); + } + else + { + left = leftlevel * m_nOutputIntermediate * 16; + right = rightlevel * m_nOutputIntermediate * 16; + } +} diff --git a/src/sound/saasound/SAAAmp.h b/src/sound/saasound/SAAAmp.h new file mode 100755 index 000000000..4a6761f21 --- /dev/null +++ b/src/sound/saasound/SAAAmp.h @@ -0,0 +1,44 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAAAmp.h: interface for the CSAAAmp class. +// This class handles Tone/Noise mixing, Envelope application and +// amplification. +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAAAMP_H_INCLUDED +#define SAAAMP_H_INCLUDED + +class CSAAAmp +{ +private: + int leftlevel; + int leftlevela0x0e; + int rightlevel; + int rightlevela0x0e; + int m_nOutputIntermediate; + unsigned int m_nMixMode; + CSAAFreq * const m_pcConnectedToneGenerator; // not const because amp calls ->Tick() + const CSAANoise * const m_pcConnectedNoiseGenerator; + const CSAAEnv * const m_pcConnectedEnvGenerator; + const bool m_bUseEnvelope; + mutable bool m_bMute; + mutable bool m_bSync; + mutable BYTE last_level_byte; + int EffectiveAmplitude(int amp, int env) const; + +public: + CSAAAmp(CSAAFreq * const ToneGenerator, const CSAANoise * const NoiseGenerator, const CSAAEnv * const EnvGenerator); + ~CSAAAmp(); + + void SetAmpLevel(BYTE level_byte); // really just a BYTE + void SetToneMixer(BYTE bEnabled); + void SetNoiseMixer(BYTE bEnabled); + void Mute(bool bMute); + void Sync(bool bSync); + void Tick(void); + void TickAndOutputStereo(unsigned int & left, unsigned int & right); + +}; + +#endif // SAAAMP_H_INCLUDED diff --git a/src/sound/saasound/SAAConfig.h b/src/sound/saasound/SAAConfig.h new file mode 100644 index 000000000..a655ec59f --- /dev/null +++ b/src/sound/saasound/SAAConfig.h @@ -0,0 +1,41 @@ +// Part of SAASound copyright 2020 Dave Hooper +// +// SAAConfig.h: configuration file handler class +// +////////////////////////////////////////////////////////////////////// + +#include "defns.h" +#ifdef USE_CONFIG_FILE + +#ifndef SAA_CONFIG_H_INCLUDED +#define SAA_CONFIG_H_INCLUDED + +#define INI_READONLY +#define INI_ANSIONLY /*nb not really 'ANSI', this just forces all read/write to use 8-bit char*/ +#include "minIni/minIni.h" + +class SAAConfig +{ +private: + minIni m_minIni; + bool m_bHasReadConfig; + +public: + bool m_bGenerateRegisterLogs; + bool m_bGeneratePcmLogs; + bool m_bGeneratePcmSeparateChannels; + t_string m_strRegisterLogPath; + t_string m_strPcmOutputPath; + unsigned int m_nOversample; + bool m_bHighpass; + double m_nBoost; + + SAAConfig(); + void ReadConfig(); + + t_string getChannelPcmOutputPath(int); +}; + +#endif // SAA_CONFIG_H_INCLUDED + +#endif // USE_CONFIG_FILE \ No newline at end of file diff --git a/src/sound/saasound/SAADevice.cpp b/src/sound/saasound/SAADevice.cpp new file mode 100644 index 000000000..306aa477a --- /dev/null +++ b/src/sound/saasound/SAADevice.cpp @@ -0,0 +1,392 @@ +// Part of SAASound copyright 2020 Dave Hooper +// +// SAADevice.cpp: connecting the subcomponents of the SAA1099 together. +// This class handles device inputs and outputs (clocking, data and +// address bus, and simulated output) +// +////////////////////////////////////////////////////////////////////// + +#include "SAASound.h" +#include "types.h" +#include "SAAEnv.h" +#include "SAANoise.h" +#include "SAAFreq.h" +#include "SAAAmp.h" +#include "SAASound.h" +#include "SAAImpl.h" +#include "defns.h" + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CSAADevice::CSAADevice() + : + m_nCurrentSaaReg(0), + m_bOutputEnabled(false), + m_bSync(false), + m_bHighpass(true), + m_nOversample(0), + m_Noise0(0xffffffff), + m_Noise1(0xffffffff), + m_Env0(), + m_Env1(), + m_Osc0(&m_Noise0, NULL), + m_Osc1(NULL, &m_Env0), + m_Osc2(NULL, NULL), + m_Osc3(&m_Noise1, NULL), + m_Osc4(NULL, &m_Env1), + m_Osc5(NULL, NULL), + m_Amp0(&m_Osc0, &m_Noise0, NULL), + m_Amp1(&m_Osc1, &m_Noise0, NULL), + m_Amp2(&m_Osc2, &m_Noise0, &m_Env0), + m_Amp3(&m_Osc3, &m_Noise1, NULL), + m_Amp4(&m_Osc4, &m_Noise1, NULL), + m_Amp5(&m_Osc5, &m_Noise1, &m_Env1) +{ + // Create and link up the objects that make up the emulator + Noise[0] = &m_Noise0; + Noise[1] = &m_Noise1; + Env[0] = &m_Env0; + Env[1] = &m_Env1; + + // Create oscillators (tone generators) and link to noise generators and + // envelope controllers + Osc[0] = &m_Osc0; + Osc[1] = &m_Osc1; + Osc[2] = &m_Osc2; + Osc[3] = &m_Osc3; + Osc[4] = &m_Osc4; + Osc[5] = &m_Osc5; + + // Create amplification/mixing stages and link to appropriate oscillators, + // noise generators and envelope controllers + Amp[0] = &m_Amp0; + Amp[1] = &m_Amp1; + Amp[2] = &m_Amp2; + Amp[3] = &m_Amp3; + Amp[4] = &m_Amp4; + Amp[5] = &m_Amp5; + + _SetClockRate(EXTERNAL_CLK_HZ); + _SetOversample(DEFAULT_OVERSAMPLE); +} + +CSAADevice::~CSAADevice() +{ +} + +////////////////////////////////////////////////////////////////////// +// CSAASound members +////////////////////////////////////////////////////////////////////// + +void CSAADevice::_SetClockRate(unsigned int nClockRate) +{ + m_Osc0._SetClockRate(nClockRate); + m_Osc1._SetClockRate(nClockRate); + m_Osc2._SetClockRate(nClockRate); + m_Osc3._SetClockRate(nClockRate); + m_Osc4._SetClockRate(nClockRate); + m_Osc5._SetClockRate(nClockRate); + m_Noise0._SetClockRate(nClockRate); + m_Noise1._SetClockRate(nClockRate); +} + +void CSAADevice::_SetSampleRate(unsigned int nSampleRate) +{ + m_Osc0._SetSampleRate(nSampleRate); + m_Osc1._SetSampleRate(nSampleRate); + m_Osc2._SetSampleRate(nSampleRate); + m_Osc3._SetSampleRate(nSampleRate); + m_Osc4._SetSampleRate(nSampleRate); + m_Osc5._SetSampleRate(nSampleRate); + m_Noise0._SetSampleRate(nSampleRate); + m_Noise1._SetSampleRate(nSampleRate); +} + +void CSAADevice::_SetOversample(unsigned int nOversample) +{ + if (nOversample != m_nOversample) + { + m_nOversample = nOversample; + m_Osc0._SetOversample(nOversample); + m_Osc1._SetOversample(nOversample); + m_Osc2._SetOversample(nOversample); + m_Osc3._SetOversample(nOversample); + m_Osc4._SetOversample(nOversample); + m_Osc5._SetOversample(nOversample); + m_Noise0._SetOversample(nOversample); + m_Noise1._SetOversample(nOversample); + } +} + +void CSAADevice::_WriteData(BYTE nData) +{ +#if defined(DEBUG) || defined(DEBUGSAA) + m_Reg[m_nCurrentSaaReg] = nData; +#endif + + // route nData to the appropriate place + switch (m_nCurrentSaaReg) + { + // Amplitude data (==> Amp) + case 0: + m_Amp0.SetAmpLevel(nData); + break; + case 1: + m_Amp1.SetAmpLevel(nData); + break; + case 2: + m_Amp2.SetAmpLevel(nData); + break; + case 3: + m_Amp3.SetAmpLevel(nData); + break; + case 4: + m_Amp4.SetAmpLevel(nData); + break; + case 5: + m_Amp5.SetAmpLevel(nData); + break; + + // Freq data (==> Osc) + case 8: + m_Osc0.SetFreqOffset(nData); + break; + case 9: + m_Osc1.SetFreqOffset(nData); + break; + case 10: + m_Osc2.SetFreqOffset(nData); + break; + case 11: + m_Osc3.SetFreqOffset(nData); + break; + case 12: + m_Osc4.SetFreqOffset(nData); + break; + case 13: + m_Osc5.SetFreqOffset(nData); + break; + + // Freq octave data (==> Osc) for channels 0,1 + case 16: + m_Osc0.SetFreqOctave(nData & 0x07); + m_Osc1.SetFreqOctave((nData >> 4) & 0x07); + break; + + // Freq octave data (==> Osc) for channels 2,3 + case 17: + m_Osc2.SetFreqOctave(nData & 0x07); + m_Osc3.SetFreqOctave((nData >> 4) & 0x07); + break; + + // Freq octave data (==> Osc) for channels 4,5 + case 18: + m_Osc4.SetFreqOctave(nData & 0x07); + m_Osc5.SetFreqOctave((nData >> 4) & 0x07); + break; + + // Tone mixer control (==> Amp) + case 20: + m_Amp0.SetToneMixer(nData & 0x01); + m_Amp1.SetToneMixer(nData & 0x02); + m_Amp2.SetToneMixer(nData & 0x04); + m_Amp3.SetToneMixer(nData & 0x08); + m_Amp4.SetToneMixer(nData & 0x10); + m_Amp5.SetToneMixer(nData & 0x20); + break; + + // Noise mixer control (==> Amp) + case 21: + m_Amp0.SetNoiseMixer(nData & 0x01); + m_Amp1.SetNoiseMixer(nData & 0x02); + m_Amp2.SetNoiseMixer(nData & 0x04); + m_Amp3.SetNoiseMixer(nData & 0x08); + m_Amp4.SetNoiseMixer(nData & 0x10); + m_Amp5.SetNoiseMixer(nData & 0x20); + break; + + // Noise frequency/source control (==> Noise) + case 22: + m_Noise0.SetSource(nData & 0x03); + m_Noise1.SetSource((nData >> 4) & 0x03); + break; + + // Envelope control data (==> Env) for envelope controller #0 + case 24: + m_Env0.SetEnvControl(nData); + break; + + // Envelope control data (==> Env) for envelope controller #1 + case 25: + m_Env1.SetEnvControl(nData); + break; + + // Global enable and reset (sync) controls + case 28: + { + // Reset (sync) bit + bool bSync = bool(nData & 0x02); + if (bSync != m_bSync) + { + // Sync all devices + // This amounts to telling them all to reset to a + // known state, which is also a state that doesn't change + // (i.e. no audio output, although there are some exceptions) + // bSync=true => all devices are sync (aka reset); + // bSync=false => all devices are allowed to run and generate changing output + m_Osc0.Sync(bSync); + m_Osc1.Sync(bSync); + m_Osc2.Sync(bSync); + m_Osc3.Sync(bSync); + m_Osc4.Sync(bSync); + m_Osc5.Sync(bSync); + m_Noise0.Sync(bSync); + m_Noise1.Sync(bSync); + m_Amp0.Sync(bSync); + m_Amp1.Sync(bSync); + m_Amp2.Sync(bSync); + m_Amp3.Sync(bSync); + m_Amp4.Sync(bSync); + m_Amp5.Sync(bSync); + m_bSync = bSync; + } + + // Global mute bit + bool bOutputEnabled = bool(nData & 0x01); + if (bOutputEnabled != m_bOutputEnabled) + { + // unmute all amps - sound 'enabled' + m_Amp0.Mute(!bOutputEnabled); + m_Amp1.Mute(!bOutputEnabled); + m_Amp2.Mute(!bOutputEnabled); + m_Amp3.Mute(!bOutputEnabled); + m_Amp4.Mute(!bOutputEnabled); + m_Amp5.Mute(!bOutputEnabled); + m_bOutputEnabled = bOutputEnabled; + } + } + break; + + default: + // anything else means data is being written to a register + // that is not used within the SAA-1099 architecture + // hence, we ignore it. + {} + } +} + +void CSAADevice::_WriteAddress(BYTE nReg) +{ + m_nCurrentSaaReg = nReg & 31; + if (m_nCurrentSaaReg == 24) + { + m_Env0.ExternalClock(); + } + else if (m_nCurrentSaaReg == 25) + { + m_Env1.ExternalClock(); + } +} + +#if 1 +BYTE CSAADevice::_ReadAddress(void) +{ + // Not a real hardware function of the SAA-1099, which is write-only + // However, this is used by SAAImpl to generate debug logs (if enabled) + return(m_nCurrentSaaReg); +} +#endif +#if defined(DEBUG) +BYTE CSAADevice::_ReadData(void) +{ + // Not a real hardware function of the SAA-1099, which is write-only + // This is only compiled for Debug builds + return(m_Reg[m_nCurrentSaaReg]); +} +#endif + +void CSAADevice::_TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed) +{ + unsigned int temp_left, temp_right; + unsigned int accum_left = 0, accum_right = 0; + for (int i = 1 << m_nOversample; i > 0; i--) + { + m_Noise0.Tick(); + m_Noise1.Tick(); + m_Amp0.TickAndOutputStereo(temp_left, temp_right); + accum_left += temp_left; + accum_right += temp_right; + m_Amp1.TickAndOutputStereo(temp_left, temp_right); + accum_left += temp_left; + accum_right += temp_right; + m_Amp2.TickAndOutputStereo(temp_left, temp_right); + accum_left += temp_left; + accum_right += temp_right; + m_Amp3.TickAndOutputStereo(temp_left, temp_right); + accum_left += temp_left; + accum_right += temp_right; + m_Amp4.TickAndOutputStereo(temp_left, temp_right); + accum_left += temp_left; + accum_right += temp_right; + m_Amp5.TickAndOutputStereo(temp_left, temp_right); + accum_left += temp_left; + accum_right += temp_right; + } + left_mixed = accum_left; + right_mixed = accum_right; +} + +void CSAADevice::_TickAndOutputSeparate(unsigned int& left_mixed, unsigned int& right_mixed, + unsigned int& left0, unsigned int& right0, + unsigned int& left1, unsigned int& right1, + unsigned int& left2, unsigned int& right2, + unsigned int& left3, unsigned int& right3, + unsigned int& left4, unsigned int& right4, + unsigned int& left5, unsigned int& right5 +) +{ + unsigned int temp_left, temp_right; + unsigned int accum_left = 0, accum_right = 0; + left0 = left1 = left2 = left3 = left4 = left5 = 0; + right0 = right1 = right2 = right3 = right4 = right5 = 0; + for (int i = 1 << m_nOversample; i > 0; i--) + { + m_Noise0.Tick(); + m_Noise1.Tick(); + m_Amp0.TickAndOutputStereo(temp_left, temp_right); + left0 += temp_left; + right0 += temp_right; + accum_left += temp_left; + accum_right += temp_right; + m_Amp1.TickAndOutputStereo(temp_left, temp_right); + left1 += temp_left; + right1 += temp_right; + accum_left += temp_left; + accum_right += temp_right; + m_Amp2.TickAndOutputStereo(temp_left, temp_right); + left2 += temp_left; + right2 += temp_right; + accum_left += temp_left; + accum_right += temp_right; + m_Amp3.TickAndOutputStereo(temp_left, temp_right); + left3 += temp_left; + right3 += temp_right; + accum_left += temp_left; + accum_right += temp_right; + m_Amp4.TickAndOutputStereo(temp_left, temp_right); + left4 += temp_left; + right4 += temp_right; + accum_left += temp_left; + accum_right += temp_right; + m_Amp5.TickAndOutputStereo(temp_left, temp_right); + left5 += temp_left; + right5 += temp_right; + accum_left += temp_left; + accum_right += temp_right; + } + left_mixed = accum_left; + right_mixed = accum_right; +} \ No newline at end of file diff --git a/src/sound/saasound/SAADevice.h b/src/sound/saasound/SAADevice.h new file mode 100644 index 000000000..7b697821f --- /dev/null +++ b/src/sound/saasound/SAADevice.h @@ -0,0 +1,69 @@ +// Part of SAASound copyright 2020 Dave Hooper +// +// SAADevice.h: connecting the subcomponents of the SAA1099 together. +// This class handles device inputs and outputs (clocking, data and +// address bus, and simulated output) +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAADEVICE_H_INCLUDED +#define SAADEVICE_H_INCLUDED + +#include "SAASound.h" +#include "SAANoise.h" +#include "SAAEnv.h" +#include "SAAFreq.h" +#include "SAAAmp.h" + +class CSAADevice +{ +private: + int m_nCurrentSaaReg; + bool m_bOutputEnabled; + bool m_bSync; + bool m_bHighpass; + int m_nOversample; + + CSAANoise m_Noise0, m_Noise1; + CSAAEnv m_Env0, m_Env1; + CSAAFreq m_Osc0, m_Osc1, m_Osc2, m_Osc3, m_Osc4, m_Osc5; + CSAAAmp m_Amp0, m_Amp1, m_Amp2, m_Amp3, m_Amp4, m_Amp5; + + CSAANoise* Noise[2]; + CSAAEnv* Env[2]; + CSAAFreq* Osc[6]; + CSAAAmp* Amp[6]; + +#if defined(DEBUG) || defined(DEBUGSAA) + BYTE m_Reg[32]; +#endif + +public: + CSAADevice(); + ~CSAADevice(); + + void _WriteAddress(BYTE nReg); + void _WriteData(BYTE nData); +#if 1 + BYTE _ReadAddress(void); +#endif +#if defined(DEBUG) + BYTE _ReadData(void); +#endif + + void _SetClockRate(unsigned int nClockRate); + void _SetSampleRate(unsigned int nSampleRate); + void _SetOversample(unsigned int nOversample); + void _TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed); + void _TickAndOutputSeparate(unsigned int& left_mixed, unsigned int& right_mixed, + unsigned int& left0, unsigned int& right0, + unsigned int& left1, unsigned int& right1, + unsigned int& left2, unsigned int& right2, + unsigned int& left3, unsigned int& right3, + unsigned int& left4, unsigned int& right4, + unsigned int& left5, unsigned int& right5 + ); + +}; + +#endif // SAADEVICE_H_INCLUDED \ No newline at end of file diff --git a/src/sound/saasound/SAAEnv.cpp b/src/sound/saasound/SAAEnv.cpp new file mode 100755 index 000000000..ae8191112 --- /dev/null +++ b/src/sound/saasound/SAAEnv.cpp @@ -0,0 +1,380 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAAEnv.cpp: implementation of the CSAAEnv class. +// +////////////////////////////////////////////////////////////////////// + +#include "SAASound.h" +#include "types.h" +#include "SAAEnv.h" + + +////////////////////////////////////////////////////////////////////// +// Static member initialisation +////////////////////////////////////////////////////////////////////// + +const ENVDATA CSAAEnv::cs_EnvData[8] = +{ + {1,false, { {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}, + {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}, + {1,true, { {{15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15},{15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}}, + {{14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14},{14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14}}}}, + {1,false, { {{15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}, + {{14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}, + {1,true, { {{15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}, + {{14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}, + {2,false, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}}, + {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}}}}, + {2,true, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}}, + {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}}}}, + {1,false, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}, + {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}, + {1,true, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}, + {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}} +}; + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CSAAEnv::CSAAEnv() +: +m_bEnabled(false), +m_bNewData(false), +m_nNextData(0), +m_bEnvelopeEnded(true), +m_nPhase(0), +m_nPhasePosition(0), +m_nResolution(1) +{ + // initialise itself with the value 'zero' + SetEnvControl(0); +} + +CSAAEnv::~CSAAEnv() +{ + // Nothing to do +} + +void CSAAEnv::InternalClock(void) +{ + // will only do something if envelope clock mode is set to internal + // and the env control is enabled + if (m_bEnabled && (!m_bClockExternally)) Tick(); +} + +void CSAAEnv::ExternalClock(void) +{ + // will only do something if envelope clock mode is set to external + // and the env control is enabled + if (m_bClockExternally && m_bEnabled) Tick(); +} + +void CSAAEnv::SetEnvControl(int nData) +{ + // process immediate stuff first: + // start with the Enabled flag. if env is disabled, + // there's not much to do + bool bEnabled = ((nData & 0x80)==0x80); + if (!bEnabled && !m_bEnabled) + return; + m_bEnabled = bEnabled; + if (!m_bEnabled) + { + // env control was enabled, and now disabled + // Any subsequent env control changes are immediate. + m_bEnvelopeEnded = true; + return; + } + + // Resolution (3bit/4bit) is also immediately processed + int new_resolution = ((nData & 0x10) == 0x10) ? 2 : 1; + // NOTE: undocumented behaviour when changing resolution mid-waveform + // Empirically, the following matches observations: + // * When ticking the env generator with 4-bit resolution, the position += 1 + // * When ticking the env generator with 3-bit resolution, the position += 2 + // * When changing between 4-bit resolution and 3-bit resolution + // without ticking the env generator, the position is unchanged + // (although, effectively, the LSB is ignored. Purely as an implementation + // detail, I'm implementing this as clearing the LSB ie LSB=0; see next point) + // * When changing between 3-bit resolution and 4-bit resolution + // without ticking the env generator, the position LSB is set to 1 + // See test case: envext_34b + // + if (m_nResolution == 1 && new_resolution == 2) + { + // change from 4-bit to 3-bit + m_nPhasePosition &= 0xe; + } + else if (m_nResolution == 2 && new_resolution == 1) + { + // change from 3-bit to 4-bit + m_nPhasePosition |= 0x1; + } + m_nResolution = new_resolution; + + // now buffered stuff: but only if it's ok to, and only if the + // envgenerator is not disabled. otherwise it just stays buffered until + // the Tick() function sets m_bEnvelopeEnded to true and realises there is + // already some new data waiting + if (m_bEnvelopeEnded) + { + SetNewEnvData(nData); // also does the SetLevels() call for us. + m_bNewData=false; + } + else + { + // since the 'next resolution' changes arrive unbuffered, we + // may need to change the current level because of this: + SetLevels(); + + // store current new data, and set the newdata flag: + m_bNewData = true; + m_nNextData = nData; + } + +} + +int CSAAEnv::LeftLevel(void) const +{ + return m_nLeftLevel; +} + +int CSAAEnv::RightLevel(void) const +{ + return m_nRightLevel; +} + +inline void CSAAEnv::Tick(void) +{ + // if disabled, do nothing + if (!m_bEnabled) // m_bEnabled is set directly, not buffered, so this is ok + { + // for sanity, reset stuff: + m_bEnvelopeEnded = true; + m_nPhase = 0; + m_nPhasePosition = 0; + return; + } + + // else : m_bEnabled + + + if (m_bEnvelopeEnded) + { + // do nothing + // (specifically, don't change the values of m_bEnvelopeEnded, + // m_nPhase and m_nPhasePosition, as these will still be needed + // by SetLevels() should it be called again) + + return; + } + + + // else : !m_bEnvelopeEnded + // Continue playing the same envelope ... + // increments the phaseposition within an envelope. + // also handles looping and resolution appropriately. + // Changes the level of the envelope accordingly + // through calling SetLevels() . This must be called after making + // any changes that will affect the output levels of the env controller!! + // SetLevels also handles left-right channel inverting + + // increment phase position + m_nPhasePosition += m_nResolution; + + // if this means we've gone past 16 (the end of a phase) + // then change phase, and if necessary, loop + // Refer to datasheet for meanings of (3) and (4) in following text + // w.r.t SAA1099 envelopes + + // Note that we will always reach position (3) or (4), even if we keep toggling + // resolution from 4-bit to 3-bit and back, because the counter will always wrap to 0. + // In fact it's quite elegant: + // No matter how you increment and toggle and increment and toggle, the counter + // will at some point be either 0xe (either 4-bit mode or 3-bit mode) or 0xf (4-bit mode only). + // Depending on the mode, even if you change the mode, the next increment, + // or the one after it, will then take it to 0. + // 0xe + 2 (3bit mode) => 0x0 + // 0xe + 1 (4bit mode) => 0xf + // 0xf + 1 (4bit mode) => 0x0 + // 0xe -> (toggle 3bit mode to 4bit mode) => 0xf + // 0xe -> (toggle 4bit mode to 3bit mode) => 0xe + // 0xf -> (toggle 4bit mode to 3bit mode) => 0xe + // + // but there is a subtlety (of course), which is that any changes at point (3) + // can take place immediately you hit point (3), but changes at point (4) are actually + // only acted upon when the counter transitions from 0xe (or 0xf) to 0x0 (which also + // means that, for these looping envelopes, which are the ones that have a point(4), + // immediately after the counter wrapping to 0x0, a write to the env data register will + // NOT set the waveform and will NOT reset the phase/phaseposition (even though it + // will still let you toggle the 4bit/3bit mode, which will change the phaseposition LSB!) + // See test case: envext_34c + + bool bProcessNewDataIfAvailable = false; + if (m_nPhasePosition >= 16) + { + m_nPhase++; + + // if we should loop, then do so - and we've reached position (4) + // otherwise, if we shouldn't loop, + // then we've reached position (3) and so we say that + // we're ok for new data. + if (m_nPhase == m_nNumberOfPhases) + { + // at position (3) or (4) + if (!m_bLooping) + { + // position (3) only + // note that it seems that the sustain level is ALWAYS zero + // in the case of non-looping waveforms + m_bEnvelopeEnded = true; + bProcessNewDataIfAvailable = true; + } + else + { + // position (4) only + // note that any data already latched is ONLY acted upon + // at THIS point. If (after this Tick has completed) any new + // env data is written, it will NOT be acted upon, until + // we get back to position (4) again. + // this is why m_bEnvelopeEnded (which affects the behaviour + // of the SetEnvControl method) is FALSE here. + // See test case: envext_34c (as noted earlier) + m_bEnvelopeEnded = false; + // set phase pointer to start of envelope for loop + // and reset m_nPhasePosition + m_nPhase=0; + m_nPhasePosition -= 16; + bProcessNewDataIfAvailable = true; + } + } + else // (m_nPhase < m_nNumberOfPhases) + { + // not at position (3) or (4) ... + // (i.e., we're in the middle of an envelope with + // more than one phase. Specifically, we're in + // the middle of envelope 4 or 5 - the + // triangle envelopes - but that's not important) + + // any commands sent to this envelope controller + // will be buffered. Set the flag to indicate this. + m_bEnvelopeEnded = false; + m_nPhasePosition -= 16; + } + } + else // (m_nPhasePosition < 16) + { + // still within the same phase; + // but, importantly, we are no longer at the start of the phase ... + // so new data cannot be acted on immediately, and must + // be buffered + m_bEnvelopeEnded = false; + // Phase and PhasePosition have already been updated. + // SetLevels() will need to be called to actually calculate + // the output 'level' of this envelope controller + } + + + // if we have new (buffered) data, now is the time to act on it + if (m_bNewData && bProcessNewDataIfAvailable) + { + m_bNewData = false; + SetNewEnvData(m_nNextData); + } + else + { + // ok, we didn't have any new buffered date to act on, + // so we just call SetLevels() to calculate the output level + // for whatever the current envelope is + SetLevels(); + } + +} + +inline void CSAAEnv::SetLevels(void) +{ + // sets m_nLeftLevel + // Also sets m_nRightLevel in terms of m_nLeftLevel + // and m_bInvertRightChannel + + // m_nResolution: 1 means 4-bit resolution; 2 means 3-bit resolution. Resolution of envelope waveform. + + // Note that this is handled 'immediately', and doesn't wait for synchronisation of + // the envelope waveform (this is important, see test case EnvExt_imm) + // It is therefore possible to switch between 4-bit and 3-bit resolution in the middle of + // an envelope waveform. if you are at an 'odd' phase position, you would be able to hear + // the difference. if you are at an 'even' phase position, the volume level for 4-bit + // and 3-bit would be the same. + // NOTE: additional test cases are required. + + switch (m_nResolution) + { + case 1: // 4 bit res waveforms + default: + { + // special case: if envelope is not a looping one, and we're at the end + // then our level should be zero (all of the non-looping waveforms have + // a sustain level of zero): + if (m_bEnvelopeEnded && !m_bLooping) + m_nLeftLevel = 0; + else + m_nLeftLevel = m_pEnvData->nLevels[0][m_nPhase][m_nPhasePosition]; + + if (m_bInvertRightChannel) + m_nRightLevel = 15-m_nLeftLevel; + else + m_nRightLevel = m_nLeftLevel; + break; + } + case 2: // 3 bit res waveforms + { + // special case: if envelope is not a looping one, and we're at the end + // then our level should be zero (all of the non-looping waveforms have + // a sustain level of zero): + if (m_bEnvelopeEnded && !m_bLooping) + m_nLeftLevel = 0; + else + m_nLeftLevel = m_pEnvData->nLevels[1][m_nPhase][m_nPhasePosition]; + if (m_bInvertRightChannel) + m_nRightLevel = 14-m_nLeftLevel; + else + m_nRightLevel = m_nLeftLevel; + break; + } + } +} + + +inline void CSAAEnv::SetNewEnvData(int nData) +{ + // loads envgenerator's registers according to the bits set + // in nData + + m_nPhase = 0; + m_nPhasePosition = 0; + m_pEnvData = &(cs_EnvData[(nData >> 1) & 0x07]); + m_bInvertRightChannel = ((nData & 0x01) == 0x01); + m_bClockExternally = ((nData & 0x20) == 0x20); + m_nNumberOfPhases = m_pEnvData->nNumberOfPhases; + m_bLooping = m_pEnvData->bLooping; + m_nResolution = (((nData & 0x10)==0x10) ? 2 : 1); + m_bEnabled = ((nData & 0x80) == 0x80); + if (m_bEnabled) + { + m_bEnvelopeEnded = false; + // is this right? + // YES. See test case EnvExt_34c (setting data multiple times + // when at a point (3) resets the waveform so you're no longer + // at a point (3). + } + else + { + // DISABLED - so set stuff accordingly + m_bEnvelopeEnded = true; + m_nPhase = 0; + m_nPhasePosition = 0; + } + + SetLevels(); +} diff --git a/src/sound/saasound/SAAEnv.h b/src/sound/saasound/SAAEnv.h new file mode 100755 index 000000000..131659c06 --- /dev/null +++ b/src/sound/saasound/SAAEnv.h @@ -0,0 +1,54 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAAEnv.h: interface for the CSAAEnv class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAAENV_H_INCLUDED +#define SAAENV_H_INCLUDED + +class CSAAEnv +{ +private: + int m_nLeftLevel, m_nRightLevel; + ENVDATA const * m_pEnvData; + + bool m_bEnabled; + bool m_bInvertRightChannel; + BYTE m_nPhase; + BYTE m_nPhasePosition; + bool m_bEnvelopeEnded; + char m_nPhaseAdd[2]; + char m_nCurrentPhaseAdd; + bool m_bLooping; + char m_nNumberOfPhases; + char m_nResolution; + char m_nInitialLevel; + bool m_bNewData; + BYTE m_nNextData; + bool m_bClockExternally; + static const ENVDATA cs_EnvData[8]; + + void Tick(void); + void SetLevels(void); + void SetNewEnvData(int nData); + +public: + CSAAEnv(); + ~CSAAEnv(); + + void InternalClock(void); + void ExternalClock(void); + void SetEnvControl(int nData); // really just a BYTE + int LeftLevel(void) const; + int RightLevel(void) const; + bool IsActive(void) const; + +}; + +inline bool CSAAEnv::IsActive(void) const +{ + return m_bEnabled; +} + +#endif // SAAENV_H_INCLUDED diff --git a/src/sound/saasound/SAAFreq.cpp b/src/sound/saasound/SAAFreq.cpp new file mode 100755 index 000000000..52cbc7a3d --- /dev/null +++ b/src/sound/saasound/SAAFreq.cpp @@ -0,0 +1,280 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAAFreq.cpp: implementation of the CSAAFreq class. +// only 7-bit fractional accuracy on oscillator periods. I may consider fixing that. +// +////////////////////////////////////////////////////////////////////// + +#include "SAASound.h" +#include "types.h" +#include "SAANoise.h" +#include "SAAEnv.h" +#include "SAAFreq.h" +#include "defns.h" + +#ifdef SAAFREQ_FIXED_CLOCKRATE +// 'load in' the data for the static frequency lookup table +// precomputed for a fixed clockrate +// See: tools/freqdat.py +const unsigned long CSAAFreq::m_FreqTable[2048] = { +#include "SAAFreq.dat" +}; +#else +unsigned long CSAAFreq::m_FreqTable[2048]; +unsigned long CSAAFreq::m_nClockRate = 0; +#endif // SAAFREQ_FIXED_CLOCKRATE + +const int INITIAL_LEVEL = 1; + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CSAAFreq::CSAAFreq(CSAANoise * const NoiseGenerator, CSAAEnv * const EnvGenerator) +: +m_nCounter(0), m_nCounter_low(0), m_nAdd(0), +m_nLevel(INITIAL_LEVEL), +m_nOversample(0), m_nCounterLimit_low(1), +m_nCurrentOffset(0), m_nCurrentOctave(0), m_nNextOffset(0), m_nNextOctave(0), +m_bIgnoreOffsetData(false), m_bNewData(false), +m_bSync(false), +m_nSampleRate(SAMPLE_RATE_HZ), +m_pcConnectedNoiseGenerator(NoiseGenerator), +m_pcConnectedEnvGenerator(EnvGenerator), +m_nConnectedMode((NoiseGenerator == NULL) ? ((EnvGenerator == NULL) ? 0 : 1) : 2) +{ + _SetClockRate(EXTERNAL_CLK_HZ); + SetAdd(); // current octave, current offset +} + +CSAAFreq::~CSAAFreq() +{ + // Nothing to do +} + +void CSAAFreq::SetFreqOffset(BYTE nOffset) +{ + // nOffset between 0 and 255 + + if (!m_bSync) + { + m_nNextOffset = nOffset; + m_bNewData=true; + if (m_nNextOctave==m_nCurrentOctave) + { + // According to Philips, if you send the SAA-1099 + // new Octave data and then new Offset data in that + // order, on the next half-cycle of the current frequency + // generator, ONLY the octave data is acted upon. + // The offset data will be acted upon next time. + + // ?? TEST CASE : if you set the octave and then the offset + // but the octave you set it to is the same one it already was. + // Will this ignore the offset data? + // Do you get the same behaviour if you set offset THEN octave + // even if you set octave to the same value it was before? + + m_bIgnoreOffsetData=true; + } + } + else + { + // updates straightaway if m_bSync + m_bNewData=false; + m_bIgnoreOffsetData = false; + m_nCurrentOffset = nOffset; + m_nNextOffset = nOffset; + m_nCurrentOctave = m_nNextOctave; + SetAdd(); + } + +} + +void CSAAFreq::SetFreqOctave(BYTE nOctave) +{ + // nOctave between 0 and 7 + + if (!m_bSync) + { + m_nNextOctave = nOctave; + m_bNewData=true; + m_bIgnoreOffsetData = false; + } + else + { + // updates straightaway if m_bSync + m_bNewData=false; + m_bIgnoreOffsetData = false; + m_nCurrentOctave = nOctave; + m_nNextOctave = nOctave; + m_nCurrentOffset = m_nNextOffset; + SetAdd(); + } +} + +void CSAAFreq::UpdateOctaveOffsetData(void) +{ + // loads the buffered new octave and new offset data into the current registers + // and sets up the new frequency for this frequency generator (i.e. sets up m_nAdd) + // - called during Sync, and called when waveform half-cycle completes + + // How the SAA-1099 really treats new data: + // if only new octave data is present, + // then set new period based on just the octave data + // Otherwise, if only new offset data is present, + // then set new period based on just the offset data + // Otherwise, if new octave data is present, and new offset data is present, + // and the offset data was set BEFORE the octave data, + // then set new period based on both the octave and offset data + // Else, if the offset data came AFTER the new octave data + // then set new period based on JUST THE OCTAVE DATA, and continue + // signalling the offset data as 'new', so it will be acted upon + // next half-cycle + // + // Weird, I know. But that's how it works. Philips even documented as much. + + if (!m_bNewData) + { + // optimise for the most common case! No new data! + return; + } + + m_nCurrentOctave=m_nNextOctave; + if (!m_bIgnoreOffsetData) + { + m_nCurrentOffset=m_nNextOffset; + m_bNewData=false; + } + m_bIgnoreOffsetData=false; + + SetAdd(); +} + +void CSAAFreq::_SetSampleRate(unsigned int nSampleRate) +{ + m_nSampleRate = nSampleRate; +} + +void CSAAFreq::_SetOversample(unsigned int oversample) +{ + // oversample is a power of 2 i.e. + // if oversample == 2 then 4x oversample + // if oversample == 6 then 64x oversample + if (oversample < m_nOversample) + { + m_nCounter_low <<= (m_nOversample - oversample); + } + else + { + m_nCounter_low >>= (oversample - m_nOversample); + } + + m_nCounterLimit_low = 1<= (m_nSampleRate<<12)) + { + m_nCounter -= (m_nSampleRate<<12); + m_nCounter_low++; + if (m_nCounter_low >= m_nCounterLimit_low) + { + // period elapsed for (at least) one half-cycle of + // current frequency + m_nCounter_low = 0; + // flip state - from 0 to 1 or vice versa + m_nLevel = 1 - m_nLevel; + + // trigger any connected devices + switch (m_nConnectedMode) + { + case 1: + // env trigger + m_pcConnectedEnvGenerator->InternalClock(); + break; + + case 2: + // noise trigger + m_pcConnectedNoiseGenerator->Trigger(); + break; + + default: + // do nothing + break; + } + + // get new frequency (set period length m_nAdd) if new data is waiting: + UpdateOctaveOffsetData(); + } + } + + return m_nLevel; +} + +void CSAAFreq::SetAdd(void) +{ + // nOctave between 0 and 7; nOffset between 0 and 255 + + // Used to be: + // m_nAdd = (15625 << nOctave) / (511 - nOffset); + // Now just table lookup: + m_nAdd = m_FreqTable[m_nCurrentOctave<<8 | m_nCurrentOffset]; +} + +void CSAAFreq::Sync(bool bSync) +{ + m_bSync = bSync; + + // update straightaway if m_bSync + if (m_bSync) + { + m_nCounter = 0; + m_nCounter_low = 0; + + // this seems to need to be required to make the Fred59 SPACE DEMO audio work correctly + m_nLevel = INITIAL_LEVEL; + + m_nCurrentOctave=m_nNextOctave; + m_nCurrentOffset=m_nNextOffset; + SetAdd(); + } +} diff --git a/src/sound/saasound/SAAFreq.dat b/src/sound/saasound/SAAFreq.dat new file mode 100755 index 000000000..04fb9081a --- /dev/null +++ b/src/sound/saasound/SAAFreq.dat @@ -0,0 +1,141 @@ +/* +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// Precalculated oscillator frequency period steps +// Higher scaling for better accuracy. +// +// After construction, it's important to SetSampleRate before +// trying to use the generator. +// (Just because the CSAANoise object has a default samplerate +// doesn't mean you should rely on it) +// +////////////////////////////////////////////////////////////////////// +*/ + 250489 , 250980 , 251473 , 251969 , 252465 , 252964 , 253465 , 253968 , 254473 , 254980 , 255489 , 256000 , 256513 , 257028 , 257545 , 258065 , + 258586 , 259109 , 259635 , 260163 , 260692 , 261224 , 261759 , 262295 , 262834 , 263374 , 263918 , 264463 , 265010 , 265560 , 266112 , 266667 , + 267223 , 267782 , 268344 , 268908 , 269474 , 270042 , 270613 , 271186 , 271762 , 272340 , 272921 , 273504 , 274090 , 274678 , 275269 , 275862 , + 276458 , 277056 , 277657 , 278261 , 278867 , 279476 , 280088 , 280702 , 281319 , 281938 , 282561 , 283186 , 283814 , 284444 , 285078 , 285714 , + 286353 , 286996 , 287640 , 288288 , 288939 , 289593 , 290249 , 290909 , 291572 , 292237 , 292906 , 293578 , 294253 , 294931 , 295612 , 296296 , + 296984 , 297674 , 298368 , 299065 , 299766 , 300469 , 301176 , 301887 , 302600 , 303318 , 304038 , 304762 , 305489 , 306220 , 306954 , 307692 , + 308434 , 309179 , 309927 , 310680 , 311436 , 312195 , 312958 , 313725 , 314496 , 315271 , 316049 , 316832 , 317618 , 318408 , 319202 , 320000 , + 320802 , 321608 , 322418 , 323232 , 324051 , 324873 , 325700 , 326531 , 327366 , 328205 , 329049 , 329897 , 330749 , 331606 , 332468 , 333333 , + 334204 , 335079 , 335958 , 336842 , 337731 , 338624 , 339523 , 340426 , 341333 , 342246 , 343164 , 344086 , 345013 , 345946 , 346883 , 347826 , + 348774 , 349727 , 350685 , 351648 , 352617 , 353591 , 354571 , 355556 , 356546 , 357542 , 358543 , 359551 , 360563 , 361582 , 362606 , 363636 , + 364672 , 365714 , 366762 , 367816 , 368876 , 369942 , 371014 , 372093 , 373178 , 374269 , 375367 , 376471 , 377581 , 378698 , 379822 , 380952 , + 382090 , 383234 , 384384 , 385542 , 386707 , 387879 , 389058 , 390244 , 391437 , 392638 , 393846 , 395062 , 396285 , 397516 , 398754 , 400000 , + 401254 , 402516 , 403785 , 405063 , 406349 , 407643 , 408946 , 410256 , 411576 , 412903 , 414239 , 415584 , 416938 , 418301 , 419672 , 421053 , + 422442 , 423841 , 425249 , 426667 , 428094 , 429530 , 430976 , 432432 , 433898 , 435374 , 436860 , 438356 , 439863 , 441379 , 442907 , 444444 , + 445993 , 447552 , 449123 , 450704 , 452297 , 453901 , 455516 , 457143 , 458781 , 460432 , 462094 , 463768 , 465455 , 467153 , 468864 , 470588 , + 472325 , 474074 , 475836 , 477612 , 479401 , 481203 , 483019 , 484848 , 486692 , 488550 , 490421 , 492308 , 494208 , 496124 , 498054 , 500000 , + 500978 , 501961 , 502947 , 503937 , 504931 , 505929 , 506931 , 507937 , 508946 , 509960 , 510978 , 512000 , 513026 , 514056 , 515091 , 516129 , + 517172 , 518219 , 519270 , 520325 , 521385 , 522449 , 523517 , 524590 , 525667 , 526749 , 527835 , 528926 , 530021 , 531120 , 532225 , 533333 , + 534447 , 535565 , 536688 , 537815 , 538947 , 540084 , 541226 , 542373 , 543524 , 544681 , 545842 , 547009 , 548180 , 549356 , 550538 , 551724 , + 552916 , 554113 , 555315 , 556522 , 557734 , 558952 , 560175 , 561404 , 562637 , 563877 , 565121 , 566372 , 567627 , 568889 , 570156 , 571429 , + 572707 , 573991 , 575281 , 576577 , 577878 , 579186 , 580499 , 581818 , 583144 , 584475 , 585812 , 587156 , 588506 , 589862 , 591224 , 592593 , + 593968 , 595349 , 596737 , 598131 , 599532 , 600939 , 602353 , 603774 , 605201 , 606635 , 608076 , 609524 , 610979 , 612440 , 613909 , 615385 , + 616867 , 618357 , 619855 , 621359 , 622871 , 624390 , 625917 , 627451 , 628993 , 630542 , 632099 , 633663 , 635236 , 636816 , 638404 , 640000 , + 641604 , 643216 , 644836 , 646465 , 648101 , 649746 , 651399 , 653061 , 654731 , 656410 , 658098 , 659794 , 661499 , 663212 , 664935 , 666667 , + 668407 , 670157 , 671916 , 673684 , 675462 , 677249 , 679045 , 680851 , 682667 , 684492 , 686327 , 688172 , 690027 , 691892 , 693767 , 695652 , + 697548 , 699454 , 701370 , 703297 , 705234 , 707182 , 709141 , 711111 , 713092 , 715084 , 717087 , 719101 , 721127 , 723164 , 725212 , 727273 , + 729345 , 731429 , 733524 , 735632 , 737752 , 739884 , 742029 , 744186 , 746356 , 748538 , 750733 , 752941 , 755162 , 757396 , 759644 , 761905 , + 764179 , 766467 , 768769 , 771084 , 773414 , 775758 , 778116 , 780488 , 782875 , 785276 , 787692 , 790123 , 792570 , 795031 , 797508 , 800000 , + 802508 , 805031 , 807571 , 810127 , 812698 , 815287 , 817891 , 820513 , 823151 , 825806 , 828479 , 831169 , 833876 , 836601 , 839344 , 842105 , + 844884 , 847682 , 850498 , 853333 , 856187 , 859060 , 861953 , 864865 , 867797 , 870748 , 873720 , 876712 , 879725 , 882759 , 885813 , 888889 , + 891986 , 895105 , 898246 , 901408 , 904594 , 907801 , 911032 , 914286 , 917563 , 920863 , 924188 , 927536 , 930909 , 934307 , 937729 , 941176 , + 944649 , 948148 , 951673 , 955224 , 958801 , 962406 , 966038 , 969697 , 973384 , 977099 , 980843 , 984615 , 988417 , 992248 , 996109 , 1000000 , + 1001957 , 1003922 , 1005894 , 1007874 , 1009862 , 1011858 , 1013861 , 1015873 , 1017893 , 1019920 , 1021956 , 1024000 , 1026052 , 1028112 , 1030181 , 1032258 , + 1034343 , 1036437 , 1038540 , 1040650 , 1042770 , 1044898 , 1047035 , 1049180 , 1051335 , 1053498 , 1055670 , 1057851 , 1060041 , 1062241 , 1064449 , 1066667 , + 1068894 , 1071130 , 1073375 , 1075630 , 1077895 , 1080169 , 1082452 , 1084746 , 1087049 , 1089362 , 1091684 , 1094017 , 1096360 , 1098712 , 1101075 , 1103448 , + 1105832 , 1108225 , 1110629 , 1113043 , 1115468 , 1117904 , 1120350 , 1122807 , 1125275 , 1127753 , 1130243 , 1132743 , 1135255 , 1137778 , 1140312 , 1142857 , + 1145414 , 1147982 , 1150562 , 1153153 , 1155756 , 1158371 , 1160998 , 1163636 , 1166287 , 1168950 , 1171625 , 1174312 , 1177011 , 1179724 , 1182448 , 1185185 , + 1187935 , 1190698 , 1193473 , 1196262 , 1199063 , 1201878 , 1204706 , 1207547 , 1210402 , 1213270 , 1216152 , 1219048 , 1221957 , 1224880 , 1227818 , 1230769 , + 1233735 , 1236715 , 1239709 , 1242718 , 1245742 , 1248780 , 1251834 , 1254902 , 1257985 , 1261084 , 1264198 , 1267327 , 1270471 , 1273632 , 1276808 , 1280000 , + 1283208 , 1286432 , 1289673 , 1292929 , 1296203 , 1299492 , 1302799 , 1306122 , 1309463 , 1312821 , 1316195 , 1319588 , 1322997 , 1326425 , 1329870 , 1333333 , + 1336815 , 1340314 , 1343832 , 1347368 , 1350923 , 1354497 , 1358090 , 1361702 , 1365333 , 1368984 , 1372654 , 1376344 , 1380054 , 1383784 , 1387534 , 1391304 , + 1395095 , 1398907 , 1402740 , 1406593 , 1410468 , 1414365 , 1418283 , 1422222 , 1426184 , 1430168 , 1434174 , 1438202 , 1442254 , 1446328 , 1450425 , 1454545 , + 1458689 , 1462857 , 1467049 , 1471264 , 1475504 , 1479769 , 1484058 , 1488372 , 1492711 , 1497076 , 1501466 , 1505882 , 1510324 , 1514793 , 1519288 , 1523810 , + 1528358 , 1532934 , 1537538 , 1542169 , 1546828 , 1551515 , 1556231 , 1560976 , 1565749 , 1570552 , 1575385 , 1580247 , 1585139 , 1590062 , 1595016 , 1600000 , + 1605016 , 1610063 , 1615142 , 1620253 , 1625397 , 1630573 , 1635783 , 1641026 , 1646302 , 1651613 , 1656958 , 1662338 , 1667752 , 1673203 , 1678689 , 1684211 , + 1689769 , 1695364 , 1700997 , 1706667 , 1712375 , 1718121 , 1723906 , 1729730 , 1735593 , 1741497 , 1747440 , 1753425 , 1759450 , 1765517 , 1771626 , 1777778 , + 1783972 , 1790210 , 1796491 , 1802817 , 1809187 , 1815603 , 1822064 , 1828571 , 1835125 , 1841727 , 1848375 , 1855072 , 1861818 , 1868613 , 1875458 , 1882353 , + 1889299 , 1896296 , 1903346 , 1910448 , 1917603 , 1924812 , 1932075 , 1939394 , 1946768 , 1954198 , 1961686 , 1969231 , 1976834 , 1984496 , 1992218 , 2000000 , + 2003914 , 2007843 , 2011788 , 2015748 , 2019724 , 2023715 , 2027723 , 2031746 , 2035785 , 2039841 , 2043912 , 2048000 , 2052104 , 2056225 , 2060362 , 2064516 , + 2068687 , 2072874 , 2077079 , 2081301 , 2085540 , 2089796 , 2094070 , 2098361 , 2102669 , 2106996 , 2111340 , 2115702 , 2120083 , 2124481 , 2128898 , 2133333 , + 2137787 , 2142259 , 2146751 , 2151261 , 2155789 , 2160338 , 2164905 , 2169492 , 2174098 , 2178723 , 2183369 , 2188034 , 2192719 , 2197425 , 2202151 , 2206897 , + 2211663 , 2216450 , 2221258 , 2226087 , 2230937 , 2235808 , 2240700 , 2245614 , 2250549 , 2255507 , 2260486 , 2265487 , 2270510 , 2275556 , 2280624 , 2285714 , + 2290828 , 2295964 , 2301124 , 2306306 , 2311512 , 2316742 , 2321995 , 2327273 , 2332574 , 2337900 , 2343249 , 2348624 , 2354023 , 2359447 , 2364896 , 2370370 , + 2375870 , 2381395 , 2386946 , 2392523 , 2398126 , 2403756 , 2409412 , 2415094 , 2420804 , 2426540 , 2432304 , 2438095 , 2443914 , 2449761 , 2455635 , 2461538 , + 2467470 , 2473430 , 2479419 , 2485437 , 2491484 , 2497561 , 2503667 , 2509804 , 2515971 , 2522167 , 2528395 , 2534653 , 2540943 , 2547264 , 2553616 , 2560000 , + 2566416 , 2572864 , 2579345 , 2585859 , 2592405 , 2598985 , 2605598 , 2612245 , 2618926 , 2625641 , 2632391 , 2639175 , 2645995 , 2652850 , 2659740 , 2666667 , + 2673629 , 2680628 , 2687664 , 2694737 , 2701847 , 2708995 , 2716180 , 2723404 , 2730667 , 2737968 , 2745308 , 2752688 , 2760108 , 2767568 , 2775068 , 2782609 , + 2790191 , 2797814 , 2805479 , 2813187 , 2820937 , 2828729 , 2836565 , 2844444 , 2852368 , 2860335 , 2868347 , 2876404 , 2884507 , 2892655 , 2900850 , 2909091 , + 2917379 , 2925714 , 2934097 , 2942529 , 2951009 , 2959538 , 2968116 , 2976744 , 2985423 , 2994152 , 3002933 , 3011765 , 3020649 , 3029586 , 3038576 , 3047619 , + 3056716 , 3065868 , 3075075 , 3084337 , 3093656 , 3103030 , 3112462 , 3121951 , 3131498 , 3141104 , 3150769 , 3160494 , 3170279 , 3180124 , 3190031 , 3200000 , + 3210031 , 3220126 , 3230284 , 3240506 , 3250794 , 3261146 , 3271565 , 3282051 , 3292605 , 3303226 , 3313916 , 3324675 , 3335505 , 3346405 , 3357377 , 3368421 , + 3379538 , 3390728 , 3401993 , 3413333 , 3424749 , 3436242 , 3447811 , 3459459 , 3471186 , 3482993 , 3494881 , 3506849 , 3518900 , 3531034 , 3543253 , 3555556 , + 3567944 , 3580420 , 3592982 , 3605634 , 3618375 , 3631206 , 3644128 , 3657143 , 3670251 , 3683453 , 3696751 , 3710145 , 3723636 , 3737226 , 3750916 , 3764706 , + 3778598 , 3792593 , 3806691 , 3820896 , 3835206 , 3849624 , 3864151 , 3878788 , 3893536 , 3908397 , 3923372 , 3938462 , 3953668 , 3968992 , 3984436 , 4000000 , + 4007828 , 4015686 , 4023576 , 4031496 , 4039448 , 4047431 , 4055446 , 4063492 , 4071571 , 4079681 , 4087824 , 4096000 , 4104208 , 4112450 , 4120724 , 4129032 , + 4137374 , 4145749 , 4154158 , 4162602 , 4171079 , 4179592 , 4188139 , 4196721 , 4205339 , 4213992 , 4222680 , 4231405 , 4240166 , 4248963 , 4257796 , 4266667 , + 4275574 , 4284519 , 4293501 , 4302521 , 4311579 , 4320675 , 4329810 , 4338983 , 4348195 , 4357447 , 4366738 , 4376068 , 4385439 , 4394850 , 4404301 , 4413793 , + 4423326 , 4432900 , 4442516 , 4452174 , 4461874 , 4471616 , 4481400 , 4491228 , 4501099 , 4511013 , 4520971 , 4530973 , 4541020 , 4551111 , 4561247 , 4571429 , + 4581655 , 4591928 , 4602247 , 4612613 , 4623025 , 4633484 , 4643991 , 4654545 , 4665148 , 4675799 , 4686499 , 4697248 , 4708046 , 4718894 , 4729792 , 4740741 , + 4751740 , 4762791 , 4773893 , 4785047 , 4796253 , 4807512 , 4818824 , 4830189 , 4841608 , 4853081 , 4864608 , 4876190 , 4887828 , 4899522 , 4911271 , 4923077 , + 4934940 , 4946860 , 4958838 , 4970874 , 4982968 , 4995122 , 5007335 , 5019608 , 5031941 , 5044335 , 5056790 , 5069307 , 5081886 , 5094527 , 5107232 , 5120000 , + 5132832 , 5145729 , 5158690 , 5171717 , 5184810 , 5197970 , 5211196 , 5224490 , 5237852 , 5251282 , 5264781 , 5278351 , 5291990 , 5305699 , 5319481 , 5333333 , + 5347258 , 5361257 , 5375328 , 5389474 , 5403694 , 5417989 , 5432361 , 5446809 , 5461333 , 5475936 , 5490617 , 5505376 , 5520216 , 5535135 , 5550136 , 5565217 , + 5580381 , 5595628 , 5610959 , 5626374 , 5641873 , 5657459 , 5673130 , 5688889 , 5704735 , 5720670 , 5736695 , 5752809 , 5769014 , 5785311 , 5801700 , 5818182 , + 5834758 , 5851429 , 5868195 , 5885057 , 5902017 , 5919075 , 5936232 , 5953488 , 5970845 , 5988304 , 6005865 , 6023529 , 6041298 , 6059172 , 6077151 , 6095238 , + 6113433 , 6131737 , 6150150 , 6168675 , 6187311 , 6206061 , 6224924 , 6243902 , 6262997 , 6282209 , 6301538 , 6320988 , 6340557 , 6360248 , 6380062 , 6400000 , + 6420063 , 6440252 , 6460568 , 6481013 , 6501587 , 6522293 , 6543131 , 6564103 , 6585209 , 6606452 , 6627832 , 6649351 , 6671010 , 6692810 , 6714754 , 6736842 , + 6759076 , 6781457 , 6803987 , 6826667 , 6849498 , 6872483 , 6895623 , 6918919 , 6942373 , 6965986 , 6989761 , 7013699 , 7037801 , 7062069 , 7086505 , 7111111 , + 7135889 , 7160839 , 7185965 , 7211268 , 7236749 , 7262411 , 7288256 , 7314286 , 7340502 , 7366906 , 7393502 , 7420290 , 7447273 , 7474453 , 7501832 , 7529412 , + 7557196 , 7585185 , 7613383 , 7641791 , 7670412 , 7699248 , 7728302 , 7757576 , 7787072 , 7816794 , 7846743 , 7876923 , 7907336 , 7937984 , 7968872 , 8000000 , + 8015656 , 8031373 , 8047151 , 8062992 , 8078895 , 8094862 , 8110891 , 8126984 , 8143141 , 8159363 , 8175649 , 8192000 , 8208417 , 8224900 , 8241449 , 8258065 , + 8274747 , 8291498 , 8308316 , 8325203 , 8342159 , 8359184 , 8376278 , 8393443 , 8410678 , 8427984 , 8445361 , 8462810 , 8480331 , 8497925 , 8515593 , 8533333 , + 8551148 , 8569038 , 8587002 , 8605042 , 8623158 , 8641350 , 8659619 , 8677966 , 8696391 , 8714894 , 8733475 , 8752137 , 8770878 , 8789700 , 8808602 , 8827586 , + 8846652 , 8865801 , 8885033 , 8904348 , 8923747 , 8943231 , 8962801 , 8982456 , 9002198 , 9022026 , 9041943 , 9061947 , 9082040 , 9102222 , 9122494 , 9142857 , + 9163311 , 9183857 , 9204494 , 9225225 , 9246050 , 9266968 , 9287982 , 9309091 , 9330296 , 9351598 , 9372998 , 9394495 , 9416092 , 9437788 , 9459584 , 9481481 , + 9503480 , 9525581 , 9547786 , 9570093 , 9592506 , 9615023 , 9637647 , 9660377 , 9683215 , 9706161 , 9729216 , 9752381 , 9775656 , 9799043 , 9822542 , 9846154 , + 9869880 , 9893720 , 9917676 , 9941748 , 9965937 , 9990244 , 10014670 , 10039216 , 10063882 , 10088670 , 10113580 , 10138614 , 10163772 , 10189055 , 10214464 , 10240000 , + 10265664 , 10291457 , 10317380 , 10343434 , 10369620 , 10395939 , 10422392 , 10448980 , 10475703 , 10502564 , 10529563 , 10556701 , 10583979 , 10611399 , 10638961 , 10666667 , + 10694517 , 10722513 , 10750656 , 10778947 , 10807388 , 10835979 , 10864721 , 10893617 , 10922667 , 10951872 , 10981233 , 11010753 , 11040431 , 11070270 , 11100271 , 11130435 , + 11160763 , 11191257 , 11221918 , 11252747 , 11283747 , 11314917 , 11346260 , 11377778 , 11409471 , 11441341 , 11473389 , 11505618 , 11538028 , 11570621 , 11603399 , 11636364 , + 11669516 , 11702857 , 11736390 , 11770115 , 11804035 , 11838150 , 11872464 , 11906977 , 11941691 , 11976608 , 12011730 , 12047059 , 12082596 , 12118343 , 12154303 , 12190476 , + 12226866 , 12263473 , 12300300 , 12337349 , 12374622 , 12412121 , 12449848 , 12487805 , 12525994 , 12564417 , 12603077 , 12641975 , 12681115 , 12720497 , 12760125 , 12800000 , + 12840125 , 12880503 , 12921136 , 12962025 , 13003175 , 13044586 , 13086262 , 13128205 , 13170418 , 13212903 , 13255663 , 13298701 , 13342020 , 13385621 , 13429508 , 13473684 , + 13518152 , 13562914 , 13607973 , 13653333 , 13698997 , 13744966 , 13791246 , 13837838 , 13884746 , 13931973 , 13979522 , 14027397 , 14075601 , 14124138 , 14173010 , 14222222 , + 14271777 , 14321678 , 14371930 , 14422535 , 14473498 , 14524823 , 14576512 , 14628571 , 14681004 , 14733813 , 14787004 , 14840580 , 14894545 , 14948905 , 15003663 , 15058824 , + 15114391 , 15170370 , 15226766 , 15283582 , 15340824 , 15398496 , 15456604 , 15515152 , 15574144 , 15633588 , 15693487 , 15753846 , 15814672 , 15875969 , 15937743 , 16000000 , + 16031311 , 16062745 , 16094303 , 16125984 , 16157791 , 16189723 , 16221782 , 16253968 , 16286282 , 16318725 , 16351297 , 16384000 , 16416834 , 16449799 , 16482897 , 16516129 , + 16549495 , 16582996 , 16616633 , 16650407 , 16684318 , 16718367 , 16752556 , 16786885 , 16821355 , 16855967 , 16890722 , 16925620 , 16960663 , 16995851 , 17031185 , 17066667 , + 17102296 , 17138075 , 17174004 , 17210084 , 17246316 , 17282700 , 17319239 , 17355932 , 17392781 , 17429787 , 17466951 , 17504274 , 17541756 , 17579399 , 17617204 , 17655172 , + 17693305 , 17731602 , 17770065 , 17808696 , 17847495 , 17886463 , 17925602 , 17964912 , 18004396 , 18044053 , 18083885 , 18123894 , 18164080 , 18204444 , 18244989 , 18285714 , + 18326622 , 18367713 , 18408989 , 18450450 , 18492099 , 18533937 , 18575964 , 18618182 , 18660592 , 18703196 , 18745995 , 18788991 , 18832184 , 18875576 , 18919169 , 18962963 , + 19006961 , 19051163 , 19095571 , 19140187 , 19185012 , 19230047 , 19275294 , 19320755 , 19366430 , 19412322 , 19458432 , 19504762 , 19551313 , 19598086 , 19645084 , 19692308 , + 19739759 , 19787440 , 19835351 , 19883495 , 19931873 , 19980488 , 20029340 , 20078431 , 20127764 , 20177340 , 20227160 , 20277228 , 20327543 , 20378109 , 20428928 , 20480000 , + 20531328 , 20582915 , 20634761 , 20686869 , 20739241 , 20791878 , 20844784 , 20897959 , 20951407 , 21005128 , 21059126 , 21113402 , 21167959 , 21222798 , 21277922 , 21333333 , + 21389034 , 21445026 , 21501312 , 21557895 , 21614776 , 21671958 , 21729443 , 21787234 , 21845333 , 21903743 , 21962466 , 22021505 , 22080863 , 22140541 , 22200542 , 22260870 , + 22321526 , 22382514 , 22443836 , 22505495 , 22567493 , 22629834 , 22692521 , 22755556 , 22818942 , 22882682 , 22946779 , 23011236 , 23076056 , 23141243 , 23206799 , 23272727 , + 23339031 , 23405714 , 23472779 , 23540230 , 23608069 , 23676301 , 23744928 , 23813953 , 23883382 , 23953216 , 24023460 , 24094118 , 24165192 , 24236686 , 24308605 , 24380952 , + 24453731 , 24526946 , 24600601 , 24674699 , 24749245 , 24824242 , 24899696 , 24975610 , 25051988 , 25128834 , 25206154 , 25283951 , 25362229 , 25440994 , 25520249 , 25600000 , + 25680251 , 25761006 , 25842271 , 25924051 , 26006349 , 26089172 , 26172524 , 26256410 , 26340836 , 26425806 , 26511327 , 26597403 , 26684039 , 26771242 , 26859016 , 26947368 , + 27036304 , 27125828 , 27215947 , 27306667 , 27397993 , 27489933 , 27582492 , 27675676 , 27769492 , 27863946 , 27959044 , 28054795 , 28151203 , 28248276 , 28346021 , 28444444 , + 28543554 , 28643357 , 28743860 , 28845070 , 28946996 , 29049645 , 29153025 , 29257143 , 29362007 , 29467626 , 29574007 , 29681159 , 29789091 , 29897810 , 30007326 , 30117647 , + 30228782 , 30340741 , 30453532 , 30567164 , 30681648 , 30796992 , 30913208 , 31030303 , 31148289 , 31267176 , 31386973 , 31507692 , 31629344 , 31751938 , 31875486 , 32000000 , + 32062622 , 32125490 , 32188605 , 32251969 , 32315582 , 32379447 , 32443564 , 32507937 , 32572565 , 32637450 , 32702595 , 32768000 , 32833667 , 32899598 , 32965795 , 33032258 , + 33098990 , 33165992 , 33233266 , 33300813 , 33368635 , 33436735 , 33505112 , 33573770 , 33642710 , 33711934 , 33781443 , 33851240 , 33921325 , 33991701 , 34062370 , 34133333 , + 34204593 , 34276151 , 34348008 , 34420168 , 34492632 , 34565401 , 34638478 , 34711864 , 34785563 , 34859574 , 34933902 , 35008547 , 35083512 , 35158798 , 35234409 , 35310345 , + 35386609 , 35463203 , 35540130 , 35617391 , 35694989 , 35772926 , 35851204 , 35929825 , 36008791 , 36088106 , 36167770 , 36247788 , 36328160 , 36408889 , 36489978 , 36571429 , + 36653244 , 36735426 , 36817978 , 36900901 , 36984199 , 37067873 , 37151927 , 37236364 , 37321185 , 37406393 , 37491991 , 37577982 , 37664368 , 37751152 , 37838337 , 37925926 , + 38013921 , 38102326 , 38191142 , 38280374 , 38370023 , 38460094 , 38550588 , 38641509 , 38732861 , 38824645 , 38916865 , 39009524 , 39102625 , 39196172 , 39290168 , 39384615 , + 39479518 , 39574879 , 39670702 , 39766990 , 39863747 , 39960976 , 40058680 , 40156863 , 40255528 , 40354680 , 40454321 , 40554455 , 40655087 , 40756219 , 40857855 , 40960000 , + 41062657 , 41165829 , 41269521 , 41373737 , 41478481 , 41583756 , 41689567 , 41795918 , 41902813 , 42010256 , 42118252 , 42226804 , 42335917 , 42445596 , 42555844 , 42666667 , + 42778068 , 42890052 , 43002625 , 43115789 , 43229551 , 43343915 , 43458886 , 43574468 , 43690667 , 43807487 , 43924933 , 44043011 , 44161725 , 44281081 , 44401084 , 44521739 , + 44643052 , 44765027 , 44887671 , 45010989 , 45134986 , 45259669 , 45385042 , 45511111 , 45637883 , 45765363 , 45893557 , 46022472 , 46152113 , 46282486 , 46413598 , 46545455 , + 46678063 , 46811429 , 46945559 , 47080460 , 47216138 , 47352601 , 47489855 , 47627907 , 47766764 , 47906433 , 48046921 , 48188235 , 48330383 , 48473373 , 48617211 , 48761905 , + 48907463 , 49053892 , 49201201 , 49349398 , 49498489 , 49648485 , 49799392 , 49951220 , 50103976 , 50257669 , 50412308 , 50567901 , 50724458 , 50881988 , 51040498 , 51200000 , + 51360502 , 51522013 , 51684543 , 51848101 , 52012698 , 52178344 , 52345048 , 52512821 , 52681672 , 52851613 , 53022654 , 53194805 , 53368078 , 53542484 , 53718033 , 53894737 , + 54072607 , 54251656 , 54431894 , 54613333 , 54795987 , 54979866 , 55164983 , 55351351 , 55538983 , 55727891 , 55918089 , 56109589 , 56302405 , 56496552 , 56692042 , 56888889 , + 57087108 , 57286713 , 57487719 , 57690141 , 57893993 , 58099291 , 58306050 , 58514286 , 58724014 , 58935252 , 59148014 , 59362319 , 59578182 , 59795620 , 60014652 , 60235294 , + 60457565 , 60681481 , 60907063 , 61134328 , 61363296 , 61593985 , 61826415 , 62060606 , 62296578 , 62534351 , 62773946 , 63015385 , 63258687 , 63503876 , 63750973 , 64000000 diff --git a/src/sound/saasound/SAAFreq.h b/src/sound/saasound/SAAFreq.h new file mode 100755 index 000000000..478754621 --- /dev/null +++ b/src/sound/saasound/SAAFreq.h @@ -0,0 +1,72 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAAFreq.h: interface for the CSAAFreq class. +// Note about Samplerates: 0=44100, 1=22050; 2=11025 +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAAFREQ_H_INCLUDE +#define SAAFREQ_H_INCLUDE + +#include "defns.h" + +class CSAAFreq +{ +private: +#ifdef SAAFREQ_FIXED_CLOCKRATE + // 'load in' the data for the static frequency lookup table + // precomputed for a fixed clockrate + // See: tools/freqdat.py + const static unsigned long m_FreqTable[2048]; +#else + // we'll calculate the frequency lookup table at runtime. + static unsigned long m_FreqTable[2048]; + static unsigned long m_nClockRate; +#endif + + unsigned long m_nCounter; + unsigned long m_nAdd; + unsigned long m_nCounter_low; + unsigned int m_nOversample; + unsigned long m_nCounterLimit_low; + int m_nLevel; + + int m_nCurrentOffset; + int m_nCurrentOctave; + int m_nNextOffset; + int m_nNextOctave; + bool m_bIgnoreOffsetData; + bool m_bNewData; + bool m_bSync; + + unsigned long m_nSampleRate; + CSAANoise * const m_pcConnectedNoiseGenerator; + CSAAEnv * const m_pcConnectedEnvGenerator; + const int m_nConnectedMode; // 0 = nothing; 1 = envgenerator; 2 = noisegenerator + + void UpdateOctaveOffsetData(void); + void SetAdd(void); + +public: + CSAAFreq(CSAANoise * const pcNoiseGenerator, CSAAEnv * const pcEnvGenerator); + ~CSAAFreq(); + void SetFreqOffset(BYTE nOffset); + void SetFreqOctave(BYTE nOctave); + void _SetSampleRate(unsigned int nSampleRate); + void _SetOversample(unsigned int oversample); + void _SetClockRate(int nClockRate); + void Sync(bool bSync); + int Tick(void); + int Level(void) const; + +}; + +inline int CSAAFreq::Level(void) const +{ + if (m_bSync) + return 1; + + return m_nLevel; +} + +#endif // SAAFREQ_H_INCLUDE diff --git a/src/sound/saasound/SAAImpl.cpp b/src/sound/saasound/SAAImpl.cpp new file mode 100644 index 000000000..8545d3849 --- /dev/null +++ b/src/sound/saasound/SAAImpl.cpp @@ -0,0 +1,487 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAAImpl.cpp: implementation of the CSAASound class. +// the bones of the 'virtual SAA-1099' emulation +// +// the actual sound generation is carried out in the other classes; +// this class provides the output stage and the external interface only +// +////////////////////////////////////////////////////////////////////// + +#include "SAASound.h" + +#include "types.h" +#include "SAAImpl.h" +#include "defns.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CSAASoundInternal::CSAASoundInternal() + : +m_nClockRate(EXTERNAL_CLK_HZ), +m_bHighpass(false), +m_nSampleRate(SAMPLE_RATE_HZ), +m_nOversample(DEFAULT_OVERSAMPLE), +m_uParam(0), +m_uParamRate(0), +#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) +m_nDebugSample(0), +#endif +m_chip() +{ +#ifdef USE_CONFIG_FILE + m_Config.ReadConfig(); +#endif + +#if defined(DEBUGSAA) + m_dbgfile.open(_T(DEBUG_SAA_REGISTER_LOG), std::ios_base::out); + m_pcmfile.open(_T(DEBUG_SAA_PCM_LOG), std::ios_base::out | std::ios_base::binary); +#elif defined(USE_CONFIG_FILE) + if (m_Config.m_bGenerateRegisterLogs) + m_dbgfile.open(m_Config.m_strRegisterLogPath, std::ios_base::out); + if (m_Config.m_bGeneratePcmLogs) + m_pcmfile.open(m_Config.m_strPcmOutputPath, std::ios_base::out | std::ios_base::binary); + + if (m_Config.m_bGeneratePcmLogs && m_Config.m_bGeneratePcmSeparateChannels) + { + for (int i = 0; i < 6; i++) + { + m_channel_pcmfile[i].open(m_Config.getChannelPcmOutputPath(i), std::ios_base::out | std::ios_base::binary); + } + } + + +#endif + // set parameters + // TODO support defaults and overrides from config file + // m_chip.SetSoundParameters(SAAP_FILTER | SAAP_11025 | SAAP_8BIT | SAAP_MONO); + // reset the virtual SAA + // m_chip.Clear(); + + m_chip._SetClockRate(m_nClockRate); + m_chip._SetOversample(m_nOversample); +} + +CSAASoundInternal::~CSAASoundInternal() +{ + // +} + +////////////////////////////////////////////////////////////////////// +// CSAASound members +////////////////////////////////////////////////////////////////////// + +void CSAASoundInternal::SetClockRate(unsigned int nClockRate) +{ + m_nClockRate = nClockRate; + m_chip._SetClockRate(m_nClockRate); +} + +void CSAASoundInternal::Clear(void) +{ + // reinitialises virtual SAA: + // sets reg 28 to 0x02; - sync and disabled + // sets regs 00-31 (except 28) to 0x00; + // sets reg 28 to 0x00; + // sets current reg to 0 + WriteAddressData(28,2); + for (int i=31; i>=0; i--) + { + if (i!=28) WriteAddressData(i,0); + } + WriteAddressData(28,0); + WriteAddress(0); +} + +void CSAASoundInternal::WriteData(BYTE nData) +{ + // originated from an OUT 255,d call + m_chip._WriteData(nData); +#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) +#ifdef USE_CONFIG_FILE + if (m_Config.m_bGenerateRegisterLogs) + { +#endif + m_dbgfile << m_nDebugSample << " " << (int)m_chip._ReadAddress() << ":" << (int)nData << std::endl; +#ifdef USE_CONFIG_FILE + } +#endif +#endif +} + +void CSAASoundInternal::WriteAddress(BYTE nReg) +{ + // originated from an OUT 511,r call + m_chip._WriteAddress(nReg); +#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) +#ifdef USE_CONFIG_FILE + if (m_Config.m_bGenerateRegisterLogs) + { +#endif + m_dbgfile << m_nDebugSample << " " << (int)nReg << ":"; + if (nReg==24) + { + m_dbgfile << ""; + } + else if (nReg==25) + { + m_dbgfile << ""; + } + m_dbgfile << std::endl; +#ifdef USE_CONFIG_FILE + } +#endif +#endif +} + +void CSAASoundInternal::WriteAddressData(BYTE nReg, BYTE nData) +{ + // performs WriteAddress(nReg) followed by WriteData(nData) + m_chip._WriteAddress(nReg); + m_chip._WriteData(nData); +} + +#if 1 +BYTE CSAASoundInternal::ReadAddress(void) +{ + // Not a real hardware function of the SAA-1099, which is write-only + return(m_chip._ReadAddress()); +} +#else +BYTE CSAASoundInternal::ReadAddress(void) +{ + // Not a real hardware function of the SAA-1099, which is write-only + return(0); +} +#endif + +void CSAASoundInternal::SetSoundParameters(SAAPARAM uParam) +{ + // set samplerate properties from uParam (deprecated but still supported) + unsigned int nSampleRate = m_nSampleRate; + switch (uParam & SAAP_MASK_SAMPLERATE) + { + case SAAP_44100: + nSampleRate = 44100; + m_uParamRate = (m_uParamRate & ~SAAP_MASK_SAMPLERATE) | SAAP_44100; + break; + case SAAP_22050: + nSampleRate = 22050; + m_uParamRate = (m_uParamRate & ~SAAP_MASK_SAMPLERATE) | SAAP_22050; + break; + case SAAP_11025: + nSampleRate = 11025; + m_uParamRate = (m_uParamRate & ~SAAP_MASK_SAMPLERATE) | SAAP_11025; + break; + case 0:// change nothing! + default: + break; + } + + if (nSampleRate != m_nSampleRate) + { + m_nSampleRate = nSampleRate; + m_chip._SetSampleRate(m_nSampleRate); + } + + // set filter properties from uParam + m_uParam = (m_uParam & ~SAAP_MASK_FILTER) | (uParam & SAAP_MASK_FILTER); + + m_bHighpass=true; +} + +void CSAASoundInternal::SetSampleRate(unsigned int nSampleRate) +{ + if (nSampleRate != m_nSampleRate) + { + m_nSampleRate = nSampleRate; + m_chip._SetSampleRate(m_nSampleRate); + } +} + +void CSAASoundInternal::SetOversample(unsigned int nOversample) +{ + if (nOversample != m_nOversample) + { + m_nOversample = nOversample; + m_chip._SetOversample(m_nOversample); + } +} + +SAAPARAM CSAASoundInternal::GetCurrentSoundParameters(void) +{ + return m_uParam | m_uParamRate; +} + +unsigned short CSAASoundInternal::GetCurrentBytesPerSample(void) +{ + // 16 bit stereo => 4 bytes per sample + return 4; +} + +/*static*/ unsigned short CSAASound::GetBytesPerSample(SAAPARAM uParam) +{ + // 16 bit stereo => 4 bytes per sample + switch (uParam & (SAAP_MASK_CHANNELS | SAAP_MASK_BITDEPTH)) + { + case SAAP_STEREO | SAAP_16BIT: + return 4; + default: + return 0; + } +} + +unsigned long CSAASoundInternal::GetCurrentSampleRate(void) +{ + return CSAASound::GetSampleRate(m_uParamRate); +} + +/*static*/ unsigned long CSAASound::GetSampleRate(SAAPARAM uParam) // static member function +{ + switch (uParam & SAAP_MASK_SAMPLERATE) + { + case SAAP_11025: + return 11025; + case SAAP_22050: + return 22050; + case SAAP_44100: + return 44100; + default: + return 0; + } +} + +#if defined(USE_CONFIG_FILE) || (defined(DEFAULT_BOOST) && DEFAULT_BOOST>1) +#define DO_BOOST +#endif + +void scale_for_output(unsigned int left_input, unsigned int right_input, + double oversample_scalar, bool highpass, double boost, + double& filterout_z1_left, double& filterout_z1_right, + BYTE* &pBuffer) +{ + double float_left = (double)left_input; + double float_right = (double)right_input; + float_left /= oversample_scalar; + float_right /= oversample_scalar; + + // scale output into good range + float_left *= DEFAULT_UNBOOSTED_MULTIPLIER; + float_right *= DEFAULT_UNBOOSTED_MULTIPLIER; + + if (highpass) + { + /* cutoff = 5 Hz (say) + const double b1 = exp(-2.0 * M_PI * (Fc/Fs)) + const double a0 = 1.0 - b1; + */ + const double b1 = 0.99928787; + const double a0 = 1.0 - b1; + + filterout_z1_left = float_left * a0 + filterout_z1_left * b1; + filterout_z1_right = float_right * a0 + filterout_z1_right * b1; + float_left -= filterout_z1_left; + float_right -= filterout_z1_right; + } + + // multiply by boost, if defined +#if defined(DO_BOOST) + float_left *= boost; + float_right *= boost; +#endif + // convert to 16-bit signed range with hard clipping + signed short left_output = (signed short)(float_left > 32767 ? 32767 : float_left < -32768 ? -32768 : float_left); + signed short right_output = (signed short)(float_right > 32767 ? 32767 : float_right < -32768 ? -32768 : float_right); + + *pBuffer++ = left_output & 0x00ff; + *pBuffer++ = (left_output >> 8) & 0x00ff; + *pBuffer++ = right_output & 0x00ff; + *pBuffer++ = (right_output >> 8) & 0x00ff; +} + +void CSAASoundInternal::GenerateMany(BYTE* pBuffer, unsigned long nSamples) +{ + unsigned int left_mixed, right_mixed; + static double filterout_z1_left_mixed = 0, filterout_z1_right_mixed = 0; + +#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) + BYTE* pBufferStart = pBuffer; + unsigned long nTotalSamples = nSamples; +#endif + +#if defined(DO_BOOST) +#if defined(USE_CONFIG_FILE) + double nBoost = m_Config.m_nBoost; +#else + double nBoost = DEFAULT_BOOST; +#endif +#else + double nBoost = 1.0; +#endif + + double oversample = double(1 << m_nOversample); + +#if defined(USE_CONFIG_FILE) + static double filterout_z1_left_0 = 0, filterout_z1_right_0 = 0; + static double filterout_z1_left_1 = 0, filterout_z1_right_1 = 0; + static double filterout_z1_left_2 = 0, filterout_z1_right_2 = 0; + static double filterout_z1_left_3 = 0, filterout_z1_right_3 = 0; + static double filterout_z1_left_4 = 0, filterout_z1_right_4 = 0; + static double filterout_z1_left_5 = 0, filterout_z1_right_5 = 0; + + if (m_Config.m_bGeneratePcmLogs && m_Config.m_bGeneratePcmSeparateChannels) + { + unsigned int left0, right0, left1, right1, left2, right2, left3, right3, left4, right4, left5, right5; + BYTE* pChannelBufferPtr[6] = { m_pChannelBuffer[0], m_pChannelBuffer[1], m_pChannelBuffer[2], m_pChannelBuffer[3], m_pChannelBuffer[4], m_pChannelBuffer[5] }; + + while (nSamples--) + { + m_chip._TickAndOutputSeparate(left_mixed, right_mixed, + left0, right0, + left1, right1, + left2, right2, + left3, right3, + left4, right4, + left5, right5); + scale_for_output(left_mixed, right_mixed, oversample, m_bHighpass, nBoost, filterout_z1_left_mixed, filterout_z1_right_mixed, pBuffer); + + // and the separate channels + scale_for_output(left0, right0, oversample, m_bHighpass, nBoost, filterout_z1_left_0, filterout_z1_right_0, pChannelBufferPtr[0]); + scale_for_output(left1, right1, oversample, m_bHighpass, nBoost, filterout_z1_left_1, filterout_z1_right_1, pChannelBufferPtr[1]); + scale_for_output(left2, right2, oversample, m_bHighpass, nBoost, filterout_z1_left_2, filterout_z1_right_2, pChannelBufferPtr[2]); + scale_for_output(left3, right3, oversample, m_bHighpass, nBoost, filterout_z1_left_3, filterout_z1_right_3, pChannelBufferPtr[3]); + scale_for_output(left4, right4, oversample, m_bHighpass, nBoost, filterout_z1_left_4, filterout_z1_right_4, pChannelBufferPtr[4]); + scale_for_output(left5, right5, oversample, m_bHighpass, nBoost, filterout_z1_left_5, filterout_z1_right_5, pChannelBufferPtr[5]); + + // flush channel output PCM buffers when full + if (pChannelBufferPtr[0] >= m_pChannelBuffer[0] + CHANNEL_BUFFER_SIZE) + { + for (int i = 0; i < 6; i++) + { + m_channel_pcmfile[i].write((const char*)m_pChannelBuffer[i], CHANNEL_BUFFER_SIZE); + pChannelBufferPtr[i] = m_pChannelBuffer[i]; + } + } + } + // flush remaining channel PCM output data + if (pChannelBufferPtr[0] >= m_pChannelBuffer[0]) + { + for (int i = 0; i < 6; i++) + { + m_channel_pcmfile[i].write((const char*)m_pChannelBuffer[i], pChannelBufferPtr[i]-m_pChannelBuffer[i]); + } + } + } + else + { +#endif + while (nSamples--) + { + m_chip._TickAndOutputStereo(left_mixed, right_mixed); + scale_for_output(left_mixed, right_mixed, oversample, m_bHighpass, nBoost, filterout_z1_left_mixed, filterout_z1_right_mixed, pBuffer); + } + +#if defined(USE_CONFIG_FILE) + } +#endif + +#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) +#ifdef USE_CONFIG_FILE + if (m_Config.m_bGeneratePcmLogs) + { +#endif + m_pcmfile.write((const char *)pBufferStart, nTotalSamples * (unsigned long)GetCurrentBytesPerSample()); + m_nDebugSample += nTotalSamples; +#ifdef USE_CONFIG_FILE + } +#endif + +#endif +} + +/////////////////////////////////////////////////////// + +LPCSAASOUND SAAAPI CreateCSAASound(void) +{ + return (new CSAASoundInternal); +} + +void SAAAPI DestroyCSAASound(LPCSAASOUND object) +{ + delete (object); +} + + +/* thoughts on lowpass filtering as part of oversampling. +I tried this and really it didn't seem to make a lot of (audible) difference. + +// lowpass oversample filter adds complexity and not particularly audibly better than simple averaging. +// use_lowpass_oversample_filter_average_output adds an additional averaging step to the output of the oversample +// filter. this seems critical, because without this, the raw output of the lowpass filter is full of aliases +// If use_lowpass_oversample_filter is False, then the _average_output flag is ignored. +// Default, use_lowpass_oversample_filter is False, it sounds just fine really. + +//#define USE_LOWPASS_OVERSAMPLE_FILTER +#undef USE_LOWPASS_OVERSAMPLE_FILTER +//#define USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT +#undef USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT + +#ifdef USE_LOWPASS_OVERSAMPLE_FILTER +static double oversample_lp_filterout_z1_left_stages[10] = { 0,0,0,0,0,0,0,0,0,0 }; +static double oversample_lp_filterout_z1_right_stages[10] = { 0,0,0,0,0,0,0,0,0,0 }; +double averaged_filterout_left = 0.0, averaged_filterout_right = 0.0; +const int nStages = 10; +for (int i = 0; i < 1 << m_nOversample; i++) +{ + Noise[0]->Tick(); + Noise[1]->Tick(); + f_left = f_right = 0; + for (int c = 0; c < 6; c++) + { + Amp[c]->TickAndOutputStereo(temp_left, temp_right); + f_left += (double)temp_left; + f_right += (double)temp_right; + } + // apply lowpass here. + // HACK: ASSUME m_nOversample is 64 (I was experimenting only using the 64x oversample anyway) + // therefore Fs = 44100*64 + // let's set Fc = 10kHz + // so Fc/Fs = 0.00354308390022675736961451247166 + // const double b1 = exp(-2.0 * M_PI * (Fc/Fs)) + // const double a0 = 1.0 - b1; + // const double b1 = 0.9779841137335348363722276130195; + const double b1 = 0.977; + const double a0 = 1.0 - b1; + + oversample_lp_filterout_z1_left_stages[0] = f_left * a0 + oversample_lp_filterout_z1_left_stages[0] * b1; + for (int stage = 1; stage < nStages; stage++) + oversample_lp_filterout_z1_left_stages[stage] = oversample_lp_filterout_z1_left_stages[stage - 1] * a0 + oversample_lp_filterout_z1_left_stages[stage] * b1; + oversample_lp_filterout_z1_right_stages[0] = f_right * a0 + oversample_lp_filterout_z1_right_stages[0] * b1; + for (int stage = 1; stage < nStages; stage++) + oversample_lp_filterout_z1_right_stages[stage] = oversample_lp_filterout_z1_right_stages[stage - 1] * a0 + oversample_lp_filterout_z1_right_stages[stage] * b1; + +#ifdef USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT + averaged_filterout_left += oversample_lp_filterout_4z1_left; + averaged_filterout_right += oversample_lp_filterout_4z1_right; +#endif +} + +// by the end of this loop we will have computed the oversample lowpass filter m_nOversample times +// and yielded exactly ONE sample output. +#ifdef USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT +f_left = averaged_filterout_left / (1 << m_nOversample); +f_right = averaged_filterout_right / (1 << m_nOversample); +#else +f_left = oversample_lp_filterout_z1_left_stages[nStages - 1]; +f_right = oversample_lp_filterout_z1_right_stages[nStages - 1]; +#endif + +#else + // do the simple 1/N averaging which is easier and sounds good enough + +#endif + +*/ + diff --git a/src/sound/saasound/SAAImpl.h b/src/sound/saasound/SAAImpl.h new file mode 100755 index 000000000..61fa79c58 --- /dev/null +++ b/src/sound/saasound/SAAImpl.h @@ -0,0 +1,75 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// This is the internal implementation (header file) of the SAASound object. +// This is done so that the external interface to the object always stays the same +// (SAASound.h) even though the internal object can change +// .. Meaning future releases don't require relinking everyone elses code against +// the updated saasound stuff +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAAIMPL_H_INCLUDED +#define SAAIMPL_H_INCLUDED + +#include "SAASound.h" +#include "SAADevice.h" +#ifdef USE_CONFIG_FILE +#include "SAAConfig.h" +#endif + +#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) +#include +#include +#include + +#if defined(USE_CONFIG_FILE) +const int CHANNEL_BUFFER_SIZE=1024; +#endif +#endif + +class CSAASoundInternal : public CSAASound +{ +private: + CSAADevice m_chip; + int m_uParam, m_uParamRate; + unsigned int m_nClockRate; + unsigned int m_nSampleRate; + unsigned int m_nOversample; + bool m_bHighpass; +#ifdef USE_CONFIG_FILE + SAAConfig m_Config; +#endif +#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) + unsigned long m_nDebugSample; + std::ofstream m_dbgfile, m_pcmfile; +#if defined(USE_CONFIG_FILE) + std::ofstream m_channel_pcmfile[6]; + BYTE m_pChannelBuffer[6][CHANNEL_BUFFER_SIZE]; +#endif +#endif + +public: + CSAASoundInternal(); + ~CSAASoundInternal(); + + void SetClockRate(unsigned int nClockRate); + void SetSampleRate(unsigned int nClockRate); + void SetOversample(unsigned int nOversample); + void SetSoundParameters(SAAPARAM uParam); + void WriteAddress(BYTE nReg); + void WriteData(BYTE nData); + void WriteAddressData(BYTE nReg, BYTE nData); + BYTE ReadAddress(void); + void Clear(void); + + SAAPARAM GetCurrentSoundParameters(void); + unsigned long GetCurrentSampleRate(void); + static unsigned long GetSampleRate(SAAPARAM uParam); + unsigned short GetCurrentBytesPerSample(void); + static unsigned short GetBytesPerSample(SAAPARAM uParam); + + void GenerateMany(BYTE * pBuffer, unsigned long nSamples); + +}; + +#endif // SAAIMPL_H_INCLUDED diff --git a/src/sound/saasound/SAANoise.cpp b/src/sound/saasound/SAANoise.cpp new file mode 100755 index 000000000..895a5a103 --- /dev/null +++ b/src/sound/saasound/SAANoise.cpp @@ -0,0 +1,180 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAANoise.cpp: implementation of the CSAANoise class. +// One noise generator +// +// After construction, it's important to SetSampleRate before +// trying to use the generator. +// (Just because the CSAANoise object has a default samplerate +// doesn't mean you should rely on it) +// +////////////////////////////////////////////////////////////////////// + +#include "SAASound.h" + +#include "types.h" +#include "SAANoise.h" +#include "defns.h" + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CSAANoise::CSAANoise() +: +m_nCounter(0), +m_nCounter_low(0), +m_nCounterLimit_low(1), +m_nOversample(0), +m_bSync(false), +m_nSampleRate(SAMPLE_RATE_HZ), +m_nSourceMode(0), +m_nRand(1) +{ + _SetClockRate(EXTERNAL_CLK_HZ); + m_nAdd = m_nAddBase; +} + +CSAANoise::CSAANoise(unsigned long seed) +: +m_nCounter(0), +m_nCounter_low(0), +m_nCounterLimit_low(1), +m_nOversample(0), +m_bSync(false), +m_nSampleRate(SAMPLE_RATE_HZ), +m_nSourceMode(0), +m_nRand(seed) +{ + _SetClockRate(EXTERNAL_CLK_HZ); + m_nAdd = m_nAddBase; +} + +CSAANoise::~CSAANoise() +{ + // Nothing to do +} + +void CSAANoise::_SetClockRate(int nClockRate) +{ + // at 8MHz the clock rate is 31.250kHZ + // This is simply the clock rate divided by 256 i.e. 2^8 + // We then shift this by 2^12 (like the Freq) for better + // period accuracy. So that's the same as shifting by (12-8) + m_nAddBase = nClockRate << (12 - 8); +} + +void CSAANoise::Seed(unsigned long seed) +{ + m_nRand = seed; +} + +void CSAANoise::SetSource(int nSource) +{ + m_nSourceMode = nSource; + m_nAdd = m_nAddBase >> m_nSourceMode; +} + +void CSAANoise::Trigger(void) +{ + // Trigger only does anything useful when we're + // clocking from the frequency generator - i.e + // if bUseFreqGen = true (i.e. SourceMode = 3) + + // So if we're clocking from the noise generator + // clock (ie, SourceMode = 0, 1 or 2) then do nothing + +// No point actually checking m_bSync here ... because if sync is true, +// then frequency generators won't actually be generating Trigger pulses +// so we wouldn't even get here! + // EXCEPT - cool edge case: if sync is set, then actually the Noise Generator + // is triggered on EVERY CLOCK PULSE (i.e. 8MHz noise). So indeed it is correct + // to not check for sync here. NEEDS TEST CASE. + + if (m_nSourceMode == 3) + { + ChangeLevel(); + } +} + +void CSAANoise::Tick(void) +{ + // Tick only does anything useful when we're + // clocking from the noise generator clock + // (ie, SourceMode = 0, 1 or 2) + + // So, if SourceMode = 3 (ie, we're clocking from a + // frequency generator ==> bUseFreqGen = true) + // then do nothing + if ( (!m_bSync) && (m_nSourceMode!=3) ) + { + m_nCounter += m_nAdd; + while (m_nCounter >= (m_nSampleRate<<12)) + { + m_nCounter -= (m_nSampleRate<<12); + m_nCounter_low++; + if (m_nCounter_low >= m_nCounterLimit_low) + { + m_nCounter_low = 0; + ChangeLevel(); + } + } + } +} + +void CSAANoise::Sync(bool bSync) +{ + if (bSync) + { + m_nCounter = 0; + m_nCounter_low = 0; + } + m_bSync = bSync; +} + + +void CSAANoise::_SetSampleRate(int nSampleRate) +{ + m_nSampleRate = nSampleRate; +} + + +void CSAANoise::_SetOversample(unsigned int oversample) +{ + // oversample is a power of 2 i.e. + // if oversample == 2 then 4x oversample + // if oversample == 6 then 64x oversample + if (oversample < m_nOversample) + { + m_nCounter_low <<= (m_nOversample - oversample); + } + else + { + m_nCounter_low >>= (oversample - m_nOversample); + } + + m_nCounterLimit_low = 1<> 1) ^ 0x20400; + } + else + { + m_nRand >>= 1; + } +} diff --git a/src/sound/saasound/SAANoise.h b/src/sound/saasound/SAANoise.h new file mode 100755 index 000000000..61a65dee8 --- /dev/null +++ b/src/sound/saasound/SAANoise.h @@ -0,0 +1,54 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAANoise.h: interface for the CSAANoise class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAANOISE_H_INCLUDED +#define SAANOISE_H_INCLUDED + +class CSAANoise +{ +private: + unsigned long m_nCounter; + unsigned long m_nAdd; + unsigned long m_nCounter_low; + unsigned int m_nOversample; + unsigned long m_nCounterLimit_low; + bool m_bSync; // see description of "SYNC" bit of register 28 + unsigned long m_nSampleRate; // = 44100 when RateMode=0, for example + int m_nSourceMode; + unsigned long m_nAddBase; // nAdd for 31.25 kHz noise at 44.1 kHz samplerate + + // pseudo-random number generator + unsigned long m_nRand; + + void ChangeLevel(void); + + +public: + CSAANoise(); + CSAANoise(unsigned long seed); + ~CSAANoise(); + + void SetSource(int nSource); + void Trigger(void); + void _SetSampleRate(int nSampleRate); + void _SetOversample(unsigned int oversample); + void _SetClockRate(int nClockRate); + void Seed(unsigned long seed); + + void Tick(void); + int Level(void) const; + void Sync(bool bSync); + +}; + +inline int CSAANoise::Level(void) const +{ + // returns 0 or 1 + return (m_nRand & 0x00000001); +} + + +#endif // SAANOISE_H_INCLUDED diff --git a/src/sound/saasound/SAASndC.cpp b/src/sound/saasound/SAASndC.cpp new file mode 100755 index 000000000..9af0d76e7 --- /dev/null +++ b/src/sound/saasound/SAASndC.cpp @@ -0,0 +1,100 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// Thanks to this file (and associated header file) you can now +// use CSAASound from within a standard 'C' program +// +////////////////////////////////////////////////////////////////////// + +#include "SAASound.h" +#include "types.h" +#include "SAAEnv.h" +#include "SAANoise.h" +#include "SAAFreq.h" +#include "SAAAmp.h" +#include "SAASound.h" +#include "SAAImpl.h" + +SAASND SAAAPI newSAASND(void) +{ + return (SAASND)(new CSAASoundInternal()); +} + +void SAAAPI deleteSAASND(SAASND object) +{ + delete (LPCSAASOUND)(object); +} + +void SAAAPI SAASNDSetClockRate(SAASND object, unsigned int nClockRate) +{ + ((LPCSAASOUND)(object))->SetClockRate(nClockRate); +} + +void SAAAPI SAASNDSetSoundParameters(SAASND object, SAAPARAM uParam) +{ + ((LPCSAASOUND)(object))->SetSoundParameters(uParam); +} + +void SAAAPI SAASNDWriteAddress(SAASND object, BYTE nReg) +{ + ((LPCSAASOUND)(object))->WriteAddress(nReg); +} + +void SAAAPI SAASNDWriteData(SAASND object, BYTE nData) +{ + ((LPCSAASOUND)(object))->WriteData(nData); +} + +void SAAAPI SAASNDWriteAddressData(SAASND object, BYTE nReg, BYTE nData) +{ + ((LPCSAASOUND)(object))->WriteAddressData(nReg, nData); +} + +void SAAAPI SAASNDClear(SAASND object) +{ + ((LPCSAASOUND)(object))->Clear(); +} + +SAAPARAM SAAAPI SAASNDGetCurrentSoundParameters(SAASND object) +{ + return ((LPCSAASOUND)(object))->GetCurrentSoundParameters(); +} + +unsigned short SAAAPI SAASNDGetCurrentBytesPerSample(SAASND object) +{ + return ((LPCSAASOUND)(object))->GetCurrentBytesPerSample(); +} + +unsigned short SAAAPI SAASNDGetBytesPerSample(SAAPARAM uParam) +{ + return CSAASound::GetBytesPerSample(uParam); +} + +unsigned long SAAAPI SAASNDGetCurrentSampleRate(SAASND object) +{ + return ((LPCSAASOUND)(object))->GetCurrentSampleRate(); +} + +unsigned long SAAAPI SAASNDGetSampleRate(SAAPARAM uParam) +{ + return CSAASound::GetSampleRate(uParam); +} + +void SAAAPI SAASNDGenerateMany(SAASND object, BYTE * pBuffer, unsigned long nSamples) +{ + ((LPCSAASOUND)(object))->GenerateMany(pBuffer, nSamples); +} + +void SAAAPI SAASNDSetSampleRate(SAASND object, unsigned int nSampleRate) +{ + return ((LPCSAASOUND)(object))->SetSampleRate(nSampleRate); +} + +void SAAAPI SAASNDSetOversample(SAASND object, unsigned int nOversample) +{ + return ((LPCSAASOUND)(object))->SetOversample(nOversample); +} + +BYTE SAAAPI SAASNDReadAddress(SAASND object) +{ + return ((LPCSAASOUND)(object))->ReadAddress(); +} diff --git a/src/sound/saasound/SAASndC.h b/src/sound/saasound/SAASndC.h new file mode 100644 index 000000000..c6fd65765 --- /dev/null +++ b/src/sound/saasound/SAASndC.h @@ -0,0 +1,102 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// ********** +// * PUBLIC * +// ********** +// +// SAASndC.h: "C-style" interface for the CSAASound class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAASNDC_H_INCLUDED +#define SAASNDC_H_INCLUDED + +#ifdef _MSC_VER +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 +#endif + +#ifndef SAASOUND_H_INCLUDED + +// Parameters for use with SetSoundParameters, for example, +// SetSoundParameters(SAAP_NOFILTER | SAAP_44100 | SAAP_16BIT | SAAP_STEREO); +#define SAAP_FILTER_HIGHPASS_SIMPLE 0x00000400 +#define SAAP_FILTER_OVERSAMPLE64x 0x00000300 +#define SAAP_FILTER_OVERSAMPLE2x 0x00000200 +#define SAAP_FILTER SAAP_FILTER_OVERSAMPLE2x +#define SAAP_NOFILTER 0x00000100 +#define SAAP_44100 0x00000030 +#define SAAP_22050 0x00000020 +#define SAAP_11025 0x00000010 +#define SAAP_16BIT 0x0000000c +#define SAAP_8BIT 0x00000004 +#define SAAP_STEREO 0x00000003 +#define SAAP_MONO 0x00000001 + +// Bitmasks for use with GetCurrentSoundParameters, for example, +// unsigned long CurrentSampleRateParameter = GetCurrentSoundParameters() +#define SAAP_MASK_FILTER 0x00000f00 +#define SAAP_MASK_FILTER_HIGHPASS 0x00000c00 +#define SAAP_MASK_FILTER_OVERSAMPLE 0x00000300 +#define SAAP_MASK_SAMPLERATE 0x000000030 +#define SAAP_MASK_BITDEPTH 0x0000000c +#define SAAP_MASK_CHANNELS 0x00000003 + +typedef unsigned long SAAPARAM; + + +#ifndef BYTE +#define BYTE unsigned char +#endif + +#ifdef WIN32 +#ifndef WINAPI +#define WINAPI __stdcall +#endif +#define EXTAPI __declspec(dllexport) WINAPI +#else // Win32 +#ifndef WINAPI +#define WINAPI /**/ +#endif +#define EXTAPI /**/ +#endif // Win32 + +#endif // SAASOUND_H_INCLUDED + +typedef void * SAASND; + +// the following are implemented as calls, etc, to a class. + +#ifdef __cplusplus +extern "C" { +#endif + +SAASND EXTAPI newSAASND(void); +void EXTAPI deleteSAASND(SAASND object); + +void EXTAPI SAASNDSetSoundParameters(SAASND object, SAAPARAM uParam); +void EXTAPI SAASNDWriteAddress(SAASND object, BYTE nReg); +void EXTAPI SAASNDWriteData(SAASND object, BYTE nData); +void EXTAPI SAASNDWriteAddressData(SAASND object, BYTE nReg, BYTE nData); +void EXTAPI SAASNDClear(SAASND object); +BYTE EXTAPI SAASNDReadAddress(SAASND object); + +SAAPARAM EXTAPI SAASNDGetCurrentSoundParameters(SAASND object); +unsigned short EXTAPI SAASNDGetCurrentBytesPerSample(SAASND object); +unsigned short EXTAPI SAASNDGetBytesPerSample(SAAPARAM uParam); +unsigned long EXTAPI SAASNDGetCurrentSampleRate(SAASND object); +unsigned long EXTAPI SAASNDGetSampleRate(SAAPARAM uParam); + +void EXTAPI SAASNDGenerateMany(SAASND object, BYTE * pBuffer, unsigned long nSamples); + +void EXTAPI SAASNDSetClockRate(SAASND object, unsigned int nClockRate); +void EXTAPI SAASNDSetSampleRate(SAASND object, unsigned int nSampleRate); +void EXTAPI SAASNDSetOversample(SAASND object, unsigned int nOversample); + + +#ifdef __cplusplus +}; // extern "C" +#endif + +#endif // SAASNDC_H_INCLUDED diff --git a/src/sound/saasound/SAASound.cpp b/src/sound/saasound/SAASound.cpp new file mode 100755 index 000000000..c5e33d862 --- /dev/null +++ b/src/sound/saasound/SAASound.cpp @@ -0,0 +1,13 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAASound.cpp - dummy function +// +////////////////////////////////////////////////////////////////////// + +#include + +// Provide something so the compiler doesn't optimise us out of existance +int SomeFunction () +{ + return 42; +} diff --git a/src/sound/saasound/SAASound.h b/src/sound/saasound/SAASound.h new file mode 100644 index 000000000..a5e9265ac --- /dev/null +++ b/src/sound/saasound/SAASound.h @@ -0,0 +1,130 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// SAASound.h: interface for the CSAASound class. +// +// This corresponds to the public (exported) DLL interface, so all +// APIs and client factory methods belong here. +// +// Compatibility notes : the intention is for this to be fully backwards +// compatible across minor and patch versions. Any backwards breaking changes +// should be reflected as a major version increment. New functionality can be added +// in minor versions so long as backwards compatiblity is maintained +// +// Version 3.3.0 (4th Dec 2018) +// +////////////////////////////////////////////////////////////////////// + +#ifndef SAASOUND_H_INCLUDED +#define SAASOUND_H_INCLUDED + +// define this if you want to output diagnostic text and PCM files +//#define DEBUGSAA + +// Parameters for use with SetSoundParameters, for example, +// SetSoundParameters(SAAP_NOFILTER | SAAP_44100 | SAA_16BIT | SAA_STEREO); +// SAAP_FILTER_HIGHPASS_SIMPLE can be ORd with SAAP_FILTER_OVERSAMPLE64x/2x +#define SAAP_FILTER_HIGHPASS_SIMPLE 0x00000400 +#define SAAP_FILTER_OVERSAMPLE64x 0x00000300 +#define SAAP_FILTER_OVERSAMPLE2x 0x00000200 +#define SAAP_FILTER SAAP_FILTER_OVERSAMPLE2x +#define SAAP_NOFILTER 0x00000100 +#define SAAP_44100 0x00000030 +#define SAAP_22050 0x00000020 +#define SAAP_11025 0x00000010 +#define SAAP_16BIT 0x0000000c +#define SAAP_8BIT 0x00000004 +#define SAAP_STEREO 0x00000003 +#define SAAP_MONO 0x00000001 + +// Bitmasks for use with GetCurrentSoundParameters, for example, +// unsigned long CurrentSampleRateParameter = GetCurrentSoundParameters() +#define SAAP_MASK_FILTER 0x00000f00 +#define SAAP_MASK_FILTER_HIGHPASS 0x00000c00 +#define SAAP_MASK_FILTER_OVERSAMPLE 0x00000300 +#define SAAP_MASK_SAMPLERATE 0x000000030 +#define SAAP_MASK_BITDEPTH 0x0000000c +#define SAAP_MASK_CHANNELS 0x00000003 + +typedef unsigned long SAAPARAM; + + +#ifndef BYTE +#define BYTE unsigned char +#endif + +#ifdef _WIN32 +#define SAAAPI _stdcall +#else +#define SAAAPI +#endif + + +#ifdef __cplusplus + +class CSAASound +{ +public: + virtual ~CSAASound() { } + + virtual void SetSoundParameters (SAAPARAM uParam) = 0; + virtual void WriteAddress (BYTE nReg) = 0; + virtual void WriteData (BYTE nData) = 0; + virtual void WriteAddressData (BYTE nReg, BYTE nData) = 0; + virtual void Clear () = 0; + virtual BYTE ReadAddress () = 0; + + virtual SAAPARAM GetCurrentSoundParameters () = 0; + virtual unsigned long GetCurrentSampleRate () = 0; + static unsigned long GetSampleRate (SAAPARAM uParam); + virtual unsigned short GetCurrentBytesPerSample () = 0; + static unsigned short GetBytesPerSample (SAAPARAM uParam); + + virtual void GenerateMany (BYTE * pBuffer, unsigned long nSamples) = 0; + + virtual void SetClockRate(unsigned int nClockRate) = 0; + virtual void SetSampleRate(unsigned int nSampleRate) = 0; + virtual void SetOversample(unsigned int nOversample) = 0; +}; + +typedef class CSAASound * LPCSAASOUND; + +LPCSAASOUND SAAAPI CreateCSAASound(void); +void SAAAPI DestroyCSAASound(LPCSAASOUND object); + +#endif // __cplusplus + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void * SAASND; + +// "C-style" interface for the CSAASound class +SAASND SAAAPI newSAASND(void); +void SAAAPI deleteSAASND(SAASND object); + +void SAAAPI SAASNDSetSoundParameters(SAASND object, SAAPARAM uParam); +void SAAAPI SAASNDWriteAddress(SAASND object, BYTE nReg); +void SAAAPI SAASNDWriteData(SAASND object, BYTE nData); +void SAAAPI SAASNDWriteAddressData(SAASND object, BYTE nReg, BYTE nData); +void SAAAPI SAASNDClear(SAASND object); + +SAAPARAM SAAAPI SAASNDGetCurrentSoundParameters(SAASND object); +unsigned short SAAAPI SAASNDGetCurrentBytesPerSample(SAASND object); +unsigned short SAAAPI SAASNDGetBytesPerSample(SAAPARAM uParam); +unsigned long SAAAPI SAASNDGetCurrentSampleRate(SAASND object); +unsigned long SAAAPI SAASNDGetSampleRate(SAAPARAM uParam); + +void SAAAPI SAASNDGenerateMany(SAASND object, BYTE * pBuffer, unsigned long nSamples); +void SAAAPI SAASNDSetClockRate(SAASND object, unsigned int nClockRate); +void SAAAPI SAASNDSetSampleRate(SAASND object, unsigned int nSampleRate); +void SAAAPI SAASNDSetOversample(SAASND object, unsigned int nOversample); + +BYTE SAAAPI SAASNDReadAddress(SAASND object); + +#ifdef __cplusplus +}; // extern "C" +#endif + +#endif // SAASOUND_H_INCLUDED diff --git a/src/sound/saasound/defns.h b/src/sound/saasound/defns.h new file mode 100644 index 000000000..e81d1c819 --- /dev/null +++ b/src/sound/saasound/defns.h @@ -0,0 +1,59 @@ +// Part of SAASound copyright 2020 Dave Hooper +// +// defns.h: compile-time configuration parameters +// +////////////////////////////////////////////////////////////////////// + +#ifndef DEFNS_H_INCLUDED +#define DEFNS_H_INCLUDED + +#define HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H +// using CMAKE +#include "saasound_cmake_config.h" +#else + +// initial default SAA1099 crystal clock rate in HZ (can be changed subsequently by calling SetClockRate) +#define EXTERNAL_CLK_HZ 8000000 + +// define SAAFREQ_FIXED_CLOCKRATE if the above external clock rate is the only supported clock rate +// i.e. only support a single compile-time clock rate (=> this also prevents using the SetClockRate method) +#undef SAAFREQ_FIXED_CLOCKRATE +// #define SAAFREQ_FIXED_CLOCKRATE + +// initial default sample rate (audio samplerate) +#define SAMPLE_RATE_HZ 44100 + +// initial default oversample (audio quality) recommend 0<=oversample<=6 +#define DEFAULT_OVERSAMPLE 6 + +// Whether to dump out a log of all register and value changes and raw output pcm +//#define DEBUGSAA +#undef DEBUGSAA + +// the (default) names of the register output and pcm output log files. +// If you're using a config file, you can change these (or, if you enable +// debugging via the config file settings, but leave the filenames unspecified, +// it will use these defaults) +#define DEBUG_SAA_REGISTER_LOG "debugsaa.txt" +#define DEBUG_SAA_PCM_LOG "debugsaa.pcm" +// Whether to include support for these debug logs via config file (only making +// sense if USE_CONFIG_FILE is also defined) + +// Whether to support a startup configuration file that is parsed at load time +// #undef USE_CONFIG_FILE +#define USE_CONFIG_FILE + +// and if so, what is its location +#ifdef USE_CONFIG_FILE +#define CONFIG_FILE_PATH "SAASound.cfg" +#endif // USE_CONFIG_FILE + +#define DEFAULT_UNBOOSTED_MULTIPLIER 11.35 + +#define DEFAULT_BOOST 1 + + +#endif // HAVE_CONFIG_H + +#endif // DEFNS_H_INCLUDED diff --git a/src/sound/saasound/resource.h b/src/sound/saasound/resource.h new file mode 100755 index 000000000..0b893bf3a --- /dev/null +++ b/src/sound/saasound/resource.h @@ -0,0 +1,15 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by SAASound.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/sound/saasound/saasound_cmake_config.h b/src/sound/saasound/saasound_cmake_config.h new file mode 100644 index 000000000..da914a71b --- /dev/null +++ b/src/sound/saasound/saasound_cmake_config.h @@ -0,0 +1,14 @@ +#pragma once + +#define EXTERNAL_CLK_HZ 7159090 +/* #undef SAAFREQ_FIXED_CLOCKRATE */ +#define SAMPLE_RATE_HZ 44100 +#define DEFAULT_OVERSAMPLE 6 +#define DEFAULT_UNBOOSTED_MULTIPLIER 11.3 +#define DEFAULT_BOOST 1 +/* #undef DEBUGSAA */ +#define DEBUG_SAA_REGISTER_LOG "debugsaa.txt" +#define DEBUG_SAA_PCM_LOG "debugsaa.pcm" + +/* #undef USE_CONFIG_FILE */ +#define CONFIG_FILE_PATH "SAASound.cfg" diff --git a/src/sound/saasound/types.h b/src/sound/saasound/types.h new file mode 100755 index 000000000..4eb62f485 --- /dev/null +++ b/src/sound/saasound/types.h @@ -0,0 +1,34 @@ +// Part of SAASound copyright 1998-2018 Dave Hooper +// +// handy typedefs +// +////////////////////////////////////////////////////////////////////// + +#ifndef TYPES_H_INCLUDED +#define TYPES_H_INCLUDED + +#if defined(__i386__) || defined(WIN32) || \ + (defined(__alpha__) || defined(__alpha)) || \ + defined(__arm__) || \ + (defined(__mips__) && defined(__MIPSEL__)) +#else +#define __BIG_ENDIAN +#endif + + +#ifndef NULL +#define NULL 0 +#endif + +typedef struct +{ + int nNumberOfPhases; + bool bLooping; + int nLevels[2][2][16]; // [Resolution][Phase][Withinphase] +} ENVDATA; + +#ifdef WIN32 +extern "C" void _stdcall OutputDebugStringA (char*); +#endif + +#endif diff --git a/src/sound/snd_cms.c b/src/sound/snd_cms.c index 66dff80f3..60165365d 100644 --- a/src/sound/snd_cms.c +++ b/src/sound/snd_cms.c @@ -8,6 +8,7 @@ #include <86box/86box.h> #include <86box/device.h> #include <86box/io.h> +#include "saasound/SAASound.h" #include <86box/snd_cms.h> #include <86box/sound.h> #include <86box/plat_unused.h> @@ -15,62 +16,13 @@ void cms_update(cms_t *cms) { - for (; cms->pos < sound_pos_global; cms->pos++) { - int16_t out_l = 0; - int16_t out_r = 0; - - for (uint8_t c = 0; c < 4; c++) { - switch (cms->noisetype[c >> 1][c & 1]) { - case 0: - cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK / 256; - break; - case 1: - cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK / 512; - break; - case 2: - cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK / 1024; - break; - case 3: - cms->noisefreq[c >> 1][c & 1] = cms->freq[c >> 1][(c & 1) * 3]; - break; - - default: - break; - } - } - for (uint8_t c = 0; c < 2; c++) { - if (cms->regs[c][0x1C] & 1) { - for (uint8_t d = 0; d < 6; d++) { - if (cms->regs[c][0x14] & (1 << d)) { - if (cms->stat[c][d]) - out_l += (cms->vol[c][d][0] * 90); - if (cms->stat[c][d]) - out_r += (cms->vol[c][d][1] * 90); - cms->count[c][d] += cms->freq[c][d]; - if (cms->count[c][d] >= 24000) { - cms->count[c][d] -= 24000; - cms->stat[c][d] ^= 1; - } - } else if (cms->regs[c][0x15] & (1 << d)) { - if (cms->noise[c][d / 3] & 1) - out_l += (cms->vol[c][d][0] * 90); - if (cms->noise[c][d / 3] & 1) - out_r += (cms->vol[c][d][0] * 90); - } - } - for (uint8_t d = 0; d < 2; d++) { - cms->noisecount[c][d] += cms->noisefreq[c][d]; - while (cms->noisecount[c][d] >= 24000) { - cms->noisecount[c][d] -= 24000; - cms->noise[c][d] <<= 1; - if (!(((cms->noise[c][d] & 0x4000) >> 8) ^ (cms->noise[c][d] & 0x40))) - cms->noise[c][d] |= 1; - } - } - } - } - cms->buffer[cms->pos << 1] = out_l; - cms->buffer[(cms->pos << 1) + 1] = out_r; + if (cms->pos < wavetable_pos_global) { + SAASNDGenerateMany(cms->saasound, (unsigned char*)&cms->buffer[cms->pos], wavetable_pos_global - cms->pos); + cms->pos = wavetable_pos_global; + } + if (cms->pos2 < wavetable_pos_global) { + SAASNDGenerateMany(cms->saasound2, (unsigned char*)&cms->buffer2[cms->pos2], wavetable_pos_global - cms->pos2); + cms->pos2 = wavetable_pos_global; } } @@ -87,6 +39,19 @@ cms_get_buffer(int32_t *buffer, int len, void *priv) cms->pos = 0; } +void +cms_get_buffer_2(int32_t *buffer, int len, void *priv) +{ + cms_t *cms = (cms_t *) priv; + + cms_update(cms); + + for (int c = 0; c < len * 2; c++) + buffer[c] += cms->buffer2[c]; + + cms->pos2 = 0; +} + void cms_write(uint16_t addr, uint8_t val, void *priv) { @@ -96,54 +61,19 @@ cms_write(uint16_t addr, uint8_t val, void *priv) switch (addr & 0xf) { case 0x1: /* SAA #1 Register Select Port */ - cms->addrs[0] = val & 31; + SAASNDWriteAddress(cms->saasound, val & 31); break; case 0x3: /* SAA #2 Register Select Port */ - cms->addrs[1] = val & 31; + SAASNDWriteAddress(cms->saasound2, val & 31); break; case 0x0: /* SAA #1 Data Port */ + cms_update(cms); + SAASNDWriteData(cms->saasound, val); + break; case 0x2: /* SAA #2 Data Port */ cms_update(cms); - cms->regs[chip][cms->addrs[chip] & 31] = val; - switch (cms->addrs[chip] & 31) { - case 0x00: - case 0x01: - case 0x02: /*Volume*/ - case 0x03: - case 0x04: - case 0x05: - voice = cms->addrs[chip] & 7; - cms->vol[chip][voice][0] = val & 0xf; - cms->vol[chip][voice][1] = val >> 4; - break; - case 0x08: - case 0x09: - case 0x0A: /*Frequency*/ - case 0x0B: - case 0x0C: - case 0x0D: - voice = cms->addrs[chip] & 7; - cms->latch[chip][voice] = (cms->latch[chip][voice] & 0x700) | val; - cms->freq[chip][voice] = (MASTER_CLOCK / 512 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255)); - break; - case 0x10: - case 0x11: - case 0x12: /*Octave*/ - voice = (cms->addrs[chip] & 3) << 1; - cms->latch[chip][voice] = (cms->latch[chip][voice] & 0xFF) | ((val & 7) << 8); - cms->latch[chip][voice + 1] = (cms->latch[chip][voice + 1] & 0xFF) | ((val & 0x70) << 4); - cms->freq[chip][voice] = (MASTER_CLOCK / 512 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255)); - cms->freq[chip][voice + 1] = (MASTER_CLOCK / 512 << (cms->latch[chip][voice + 1] >> 8)) / (511 - (cms->latch[chip][voice + 1] & 255)); - break; - case 0x16: /*Noise*/ - cms->noisetype[chip][0] = val & 3; - cms->noisetype[chip][1] = (val >> 4) & 3; - break; - - default: - break; - } + SAASNDWriteData(cms->saasound2, val); break; case 0x6: /* GameBlaster Write Port */ @@ -163,9 +93,9 @@ cms_read(uint16_t addr, void *priv) switch (addr & 0xf) { case 0x1: /* SAA #1 Register Select Port */ - return cms->addrs[0]; + return SAASNDReadAddress(cms->saasound); case 0x3: /* SAA #2 Register Select Port */ - return cms->addrs[1]; + return SAASNDReadAddress(cms->saasound2); case 0x4: /* GameBlaster Read port (Always returns 0x7F) */ return 0x7f; case 0xa: /* GameBlaster Read Port */ @@ -185,7 +115,12 @@ cms_init(UNUSED(const device_t *info)) uint16_t addr = device_get_config_hex16("base"); io_sethandler(addr, 0x0010, cms_read, NULL, NULL, cms_write, NULL, NULL, cms); - sound_add_handler(cms_get_buffer, cms); + cms->saasound = newSAASND(); + SAASNDSetSoundParameters(cms->saasound, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO); + cms->saasound2 = newSAASND(); + SAASNDSetSoundParameters(cms->saasound2, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO); + wavetable_add_handler(cms_get_buffer, cms); + wavetable_add_handler(cms_get_buffer_2, cms); return cms; } @@ -194,6 +129,9 @@ cms_close(void *priv) { cms_t *cms = (cms_t *) priv; + deleteSAASND(cms->saasound); + deleteSAASND(cms->saasound2); + free(cms); } From b644016d1e0a7a917637c2fadcf8d8056d09b4ab Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 1 Apr 2025 23:11:09 +0600 Subject: [PATCH 037/118] Port Sound Blaster 1.x/2.x SAA1099 emulation to SAASound --- src/sound/snd_sb.c | 65 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index e89946486..4a17fe20b 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -41,6 +41,7 @@ #include <86box/sound.h> #include "cpu.h" #include <86box/timer.h> +#include "saasound/SAASound.h" #include <86box/snd_sb.h> #include <86box/plat_unused.h> @@ -145,6 +146,42 @@ sb_log(const char *fmt, ...) # define sb_log(fmt, ...) #endif +void +sb_cms_get_buffer(int32_t *buffer, int len, void *priv) +{ + sb_t *sb = (sb_t *) priv; + + cms_update(&sb->cms); + + for (int c = 0; c < len * 2; c++) { + if (sb->mixer_enabled) { + buffer[c] += sb->cms.buffer[c] * sb->mixer_sb2.fm; + } + else + buffer[c] += sb->cms.buffer[c]; + } + + sb->cms.pos = 0; +} + +void +sb_cms_get_buffer_2(int32_t *buffer, int len, void *priv) +{ + sb_t *sb = (sb_t *) priv; + + cms_update(&sb->cms); + + for (int c = 0; c < len * 2; c++) { + if (sb->mixer_enabled) { + buffer[c] += sb->cms.buffer2[c] * sb->mixer_sb2.fm; + } + else + buffer[c] += sb->cms.buffer2[c]; + } + + sb->cms.pos2 = 0; +} + /* SB 1, 1.5, MCV, and 2 do not have a mixer, so signal is hardwired. */ static void sb_get_buffer_sb2(int32_t *buffer, int len, void *priv) @@ -155,23 +192,10 @@ sb_get_buffer_sb2(int32_t *buffer, int len, void *priv) sb_dsp_update(&sb->dsp); - if (sb->cms_enabled) - cms_update(&sb->cms); - for (int c = 0; c < len * 2; c += 2) { double out_l = 0.0; double out_r = 0.0; - if (sb->cms_enabled) { - out_l += sb->cms.buffer[c]; - out_r += sb->cms.buffer[c + 1]; - } - - if (sb->cms_enabled && sb->mixer_enabled) { - out_l *= mixer->fm; - out_r *= mixer->fm; - } - /* TODO: Recording: I assume it has direct mic and line in like SB2. It is unclear from the docs if it has a filter, but it probably does. */ /* TODO: Recording: Mic and line In with AGC. */ @@ -192,9 +216,6 @@ sb_get_buffer_sb2(int32_t *buffer, int len, void *priv) } sb->dsp.pos = 0; - - if (sb->cms_enabled) - sb->cms.pos = 0; } static void @@ -2890,6 +2911,13 @@ sb_init(UNUSED(const device_t *info)) cms_read, NULL, NULL, cms_write, NULL, NULL, &sb->cms); + + sb->cms.saasound = newSAASND(); + SAASNDSetSoundParameters(sb->cms.saasound, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO); + sb->cms.saasound2 = newSAASND(); + SAASNDSetSoundParameters(sb->cms.saasound2, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO); + wavetable_add_handler(sb_cms_get_buffer, sb); + wavetable_add_handler(sb_cms_get_buffer_2, sb); } if (mixer_addr > 0x000) { @@ -4044,6 +4072,11 @@ sb_close(void *priv) sb_t *sb = (sb_t *) priv; sb_dsp_close(&sb->dsp); + if (sb->cms_enabled) { + deleteSAASND(sb->cms.saasound); + deleteSAASND(sb->cms.saasound2); + } + free(sb); } From ee71952e02a272422cfe39cd00265c2cfc7d23f2 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 2 Apr 2025 00:33:24 +0600 Subject: [PATCH 038/118] Don't attempt altering window position if fullscreen --- src/qt/qt_mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index b3d0d9fa9..4c04ce76e 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -803,7 +803,7 @@ MainWindow::resizeEvent(QResizeEvent *event) { //qDebug() << pos().x() + event->size().width(); //qDebug() << pos().y() + event->size().height(); - if (vid_resize == 1) + if (vid_resize == 1 || video_fullscreen) return; int newX = pos().x(); From 3956032b94e20d47175b940c19c2830228f55357 Mon Sep 17 00:00:00 2001 From: Emlyn Corrin Date: Tue, 1 Apr 2025 20:05:08 +0100 Subject: [PATCH 039/118] Display ISABugger status in monospace font with colour for the LED bits --- src/device/bugger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/bugger.c b/src/device/bugger.c index b56937a43..6b9ed43cc 100644 --- a/src/device/bugger.c +++ b/src/device/bugger.c @@ -84,7 +84,7 @@ static uint8_t bug_spcfg; /* serial port configuration */ #define FIFO_LEN 256 static uint8_t bug_buff[FIFO_LEN]; /* serial port data buffer */ static uint8_t *bug_bptr; -#define UISTR_LEN 24 +#define UISTR_LEN 91 static char bug_str[UISTR_LEN]; /* UI output string */ extern void ui_sb_bugui(char *__str); @@ -112,7 +112,7 @@ static void bug_setui(void) { /* Format all current info in a string. */ - sprintf(bug_str, "%02X:%02X %c%c%c%c%c%c%c%c-%c%c%c%c%c%c%c%c", + sprintf(bug_str, "%02X:%02X %c%c%c%c%c%c%c%c-%c%c%c%c%c%c%c%c", bug_seg2, bug_seg1, (bug_ledg & 0x80) ? 'G' : 'g', (bug_ledg & 0x40) ? 'G' : 'g', (bug_ledg & 0x20) ? 'G' : 'g', (bug_ledg & 0x10) ? 'G' : 'g', From 5e61b78b782dfaf8b4139c598deecc40ad412cd8 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 2 Apr 2025 01:10:21 +0600 Subject: [PATCH 040/118] Make sure that floppy icons and options do not appear if there's no floppy controller available --- src/floppy/fdc.c | 6 ++++++ src/qt/qt_machinestatus.cpp | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 51c3aa24a..e656e639c 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -79,6 +79,8 @@ int floppyrate[4]; int fdc_current[FDC_MAX] = { 0, 0 }; +volatile int fdcinited = 0; + #ifdef ENABLE_FDC_LOG int fdc_do_log = ENABLE_FDC_LOG; @@ -2337,6 +2339,8 @@ fdc_close(void *priv) fifo_close(fdc->fifo_p); + fdcinited = 0; + free(fdc); } @@ -2382,6 +2386,8 @@ fdc_init(const device_t *info) fdc_reset(fdc); + fdcinited = 1; + return fdc; } diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index d555be360..aba7fc1d4 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -40,6 +40,8 @@ extern "C" { #include <86box/ui.h> #include <86box/machine_status.h> #include <86box/config.h> + +extern volatile int fdcinited; }; #include @@ -303,6 +305,9 @@ MachineStatus::hasSCSI() void MachineStatus::iterateFDD(const std::function &cb) { + if (!fdcinited) + return; + for (int i = 0; i < FDD_NUM; ++i) { if (fdd_get_type(i) != 0) { cb(i); From dd5a25aad39830c9c674b26b5c3beaba8a405f11 Mon Sep 17 00:00:00 2001 From: Emlyn Corrin Date: Tue, 1 Apr 2025 21:56:41 +0100 Subject: [PATCH 041/118] Only set LED colour when it is lit --- src/device/bugger.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/device/bugger.c b/src/device/bugger.c index 6b9ed43cc..6a30df7be 100644 --- a/src/device/bugger.c +++ b/src/device/bugger.c @@ -84,7 +84,10 @@ static uint8_t bug_spcfg; /* serial port configuration */ #define FIFO_LEN 256 static uint8_t bug_buff[FIFO_LEN]; /* serial port data buffer */ static uint8_t *bug_bptr; -#define UISTR_LEN 91 + +static char LED_R[] = "R"; +static char LED_G[] = "G"; +#define UISTR_LEN (17 + 8 * sizeof(LED_G) + 8 * sizeof(LED_R)) static char bug_str[UISTR_LEN]; /* UI output string */ extern void ui_sb_bugui(char *__str); @@ -112,16 +115,16 @@ static void bug_setui(void) { /* Format all current info in a string. */ - sprintf(bug_str, "%02X:%02X %c%c%c%c%c%c%c%c-%c%c%c%c%c%c%c%c", + sprintf(bug_str, "%02X:%02X %s%s%s%s%s%s%s%s-%s%s%s%s%s%s%s%s", bug_seg2, bug_seg1, - (bug_ledg & 0x80) ? 'G' : 'g', (bug_ledg & 0x40) ? 'G' : 'g', - (bug_ledg & 0x20) ? 'G' : 'g', (bug_ledg & 0x10) ? 'G' : 'g', - (bug_ledg & 0x08) ? 'G' : 'g', (bug_ledg & 0x04) ? 'G' : 'g', - (bug_ledg & 0x02) ? 'G' : 'g', (bug_ledg & 0x01) ? 'G' : 'g', - (bug_ledr & 0x80) ? 'R' : 'r', (bug_ledr & 0x40) ? 'R' : 'r', - (bug_ledr & 0x20) ? 'R' : 'r', (bug_ledr & 0x10) ? 'R' : 'r', - (bug_ledr & 0x08) ? 'R' : 'r', (bug_ledr & 0x04) ? 'R' : 'r', - (bug_ledr & 0x02) ? 'R' : 'r', (bug_ledr & 0x01) ? 'R' : 'r'); + (bug_ledg & 0x80) ? LED_G : "g", (bug_ledg & 0x40) ? LED_G : "g", + (bug_ledg & 0x20) ? LED_G : "g", (bug_ledg & 0x10) ? LED_G : "g", + (bug_ledg & 0x08) ? LED_G : "g", (bug_ledg & 0x04) ? LED_G : "g", + (bug_ledg & 0x02) ? LED_G : "g", (bug_ledg & 0x01) ? LED_G : "g", + (bug_ledr & 0x80) ? LED_R : "r", (bug_ledr & 0x40) ? LED_R : "r", + (bug_ledr & 0x20) ? LED_R : "r", (bug_ledr & 0x10) ? LED_R : "r", + (bug_ledr & 0x08) ? LED_R : "r", (bug_ledr & 0x04) ? LED_R : "r", + (bug_ledr & 0x02) ? LED_R : "r", (bug_ledr & 0x01) ? LED_R : "r"); /* Send formatted string to the UI. */ ui_sb_bugui(bug_str); From 2a8e4d5a68cfc04debdfad855df2331a1d61d15a Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 2 Apr 2025 08:34:34 +0200 Subject: [PATCH 042/118] PCI and ACPI - when resetting all devices, also reset (ie. zero) all of the emulated RAM as well, fixes Windows 2000 after soft reset on later machines such as the ASUS P2B-LS. --- src/acpi.c | 4 +++- src/include/86box/mem.h | 1 + src/mem/mem.c | 13 +++++++++++++ src/pci.c | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/acpi.c b/src/acpi.c index ccd51ebca..963f26ae6 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -1025,8 +1025,10 @@ acpi_reg_write_common_regs(UNUSED(int size), uint16_t addr, uint8_t val, void *p nvr_reg_write(0x000f, 0xff, dev->nvr); } - if (sus_typ & SUS_RESET_PCI) + if (sus_typ & SUS_RESET_PCI) { device_reset_all(DEVICE_PCI); + mem_zero(); + } if (sus_typ & SUS_RESET_CPU) cpu_alt_reset = 0; diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index 81b46b2fa..f8d0f659a 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -459,6 +459,7 @@ extern void mem_a20_recalc(void); extern void mem_init(void); extern void mem_close(void); +extern void mem_zero(void); extern void mem_reset(void); extern void mem_remap_top_ex(int kb, uint32_t start); extern void mem_remap_top_ex_nomid(int kb, uint32_t start); diff --git a/src/mem/mem.c b/src/mem/mem.c index 074b44bda..c4d11300b 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -2792,6 +2792,17 @@ mem_init_ram_mapping(mem_mapping_t *mapping, uint32_t base, uint32_t size) mem_add_ram_mapping(mapping, base, size); } +void +mem_zero(void) +{ +#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)) + if (mem_size > 1048576) + memset(ram2, 0x00, ram2_size + 16); +#endif + + memset(ram, 0x00, ram_size + 16); +} + /* Reset the memory state. */ void mem_reset(void) @@ -2867,8 +2878,10 @@ mem_reset(void) return; } memset(ram, 0x00, ram_size + 16); +#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)) if (mem_size > 1048576) ram2 = &(ram[1 << 30]); +#endif } /* diff --git a/src/pci.c b/src/pci.c index ab585c456..c2e4ca237 100644 --- a/src/pci.c +++ b/src/pci.c @@ -419,6 +419,8 @@ pci_trc_reset(uint8_t val) mem_a20_recalc(); flushmmucache(); + + mem_zero(); } #ifdef USE_DYNAREC From de04870db26175dfd065a5708d85a337ca07aad4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 2 Apr 2025 08:58:16 +0200 Subject: [PATCH 043/118] CMS/SAA: Fix warnings. --- src/sound/saasound/SAADevice.cpp | 2 +- src/sound/saasound/SAAEnv.cpp | 8 ++++---- src/sound/saasound/SAAFreq.cpp | 17 ++++++++++++----- src/sound/saasound/SAAImpl.cpp | 14 ++++++++------ src/sound/saasound/SAANoise.cpp | 4 ++-- src/sound/snd_cms.c | 2 -- 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/sound/saasound/SAADevice.cpp b/src/sound/saasound/SAADevice.cpp index 306aa477a..718b05a95 100644 --- a/src/sound/saasound/SAADevice.cpp +++ b/src/sound/saasound/SAADevice.cpp @@ -107,7 +107,7 @@ void CSAADevice::_SetSampleRate(unsigned int nSampleRate) void CSAADevice::_SetOversample(unsigned int nOversample) { - if (nOversample != m_nOversample) + if (((int) nOversample) != m_nOversample) { m_nOversample = nOversample; m_Osc0._SetOversample(nOversample); diff --git a/src/sound/saasound/SAAEnv.cpp b/src/sound/saasound/SAAEnv.cpp index ae8191112..049f51f96 100755 --- a/src/sound/saasound/SAAEnv.cpp +++ b/src/sound/saasound/SAAEnv.cpp @@ -40,12 +40,12 @@ const ENVDATA CSAAEnv::cs_EnvData[8] = CSAAEnv::CSAAEnv() : m_bEnabled(false), -m_bNewData(false), -m_nNextData(0), -m_bEnvelopeEnded(true), m_nPhase(0), m_nPhasePosition(0), -m_nResolution(1) +m_bEnvelopeEnded(true), +m_nResolution(1), +m_bNewData(false), +m_nNextData(0) { // initialise itself with the value 'zero' SetEnvControl(0); diff --git a/src/sound/saasound/SAAFreq.cpp b/src/sound/saasound/SAAFreq.cpp index 52cbc7a3d..61a04f6ad 100755 --- a/src/sound/saasound/SAAFreq.cpp +++ b/src/sound/saasound/SAAFreq.cpp @@ -32,11 +32,18 @@ const int INITIAL_LEVEL = 1; CSAAFreq::CSAAFreq(CSAANoise * const NoiseGenerator, CSAAEnv * const EnvGenerator) : -m_nCounter(0), m_nCounter_low(0), m_nAdd(0), +m_nCounter(0), +m_nAdd(0), +m_nCounter_low(0), +m_nOversample(0), +m_nCounterLimit_low(1), m_nLevel(INITIAL_LEVEL), -m_nOversample(0), m_nCounterLimit_low(1), -m_nCurrentOffset(0), m_nCurrentOctave(0), m_nNextOffset(0), m_nNextOctave(0), -m_bIgnoreOffsetData(false), m_bNewData(false), +m_nCurrentOffset(0), +m_nCurrentOctave(0), +m_nNextOffset(0), +m_nNextOctave(0), +m_bIgnoreOffsetData(false), +m_bNewData(false), m_bSync(false), m_nSampleRate(SAMPLE_RATE_HZ), m_pcConnectedNoiseGenerator(NoiseGenerator), @@ -194,7 +201,7 @@ void CSAAFreq::_SetClockRate(int nClockRate) // Finally, note that the standard formula corresponds to a 8MHz base clock // so we rescale the final result by the ratio nClockRate/8000000 - if (nClockRate != m_nClockRate) + if (((unsigned long) nClockRate) != m_nClockRate) { m_nClockRate = nClockRate; int ix = 0; diff --git a/src/sound/saasound/SAAImpl.cpp b/src/sound/saasound/SAAImpl.cpp index 8545d3849..f136eefc6 100644 --- a/src/sound/saasound/SAAImpl.cpp +++ b/src/sound/saasound/SAAImpl.cpp @@ -20,16 +20,18 @@ CSAASoundInternal::CSAASoundInternal() : -m_nClockRate(EXTERNAL_CLK_HZ), -m_bHighpass(false), -m_nSampleRate(SAMPLE_RATE_HZ), -m_nOversample(DEFAULT_OVERSAMPLE), +m_chip(), m_uParam(0), m_uParamRate(0), +m_nClockRate(EXTERNAL_CLK_HZ), +m_nSampleRate(SAMPLE_RATE_HZ), +m_nOversample(DEFAULT_OVERSAMPLE), #if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) -m_nDebugSample(0), +m_bHighpass(false), +m_nDebugSample(0) +#else +m_bHighpass(false) #endif -m_chip() { #ifdef USE_CONFIG_FILE m_Config.ReadConfig(); diff --git a/src/sound/saasound/SAANoise.cpp b/src/sound/saasound/SAANoise.cpp index 895a5a103..1cf3458dd 100755 --- a/src/sound/saasound/SAANoise.cpp +++ b/src/sound/saasound/SAANoise.cpp @@ -25,8 +25,8 @@ CSAANoise::CSAANoise() : m_nCounter(0), m_nCounter_low(0), -m_nCounterLimit_low(1), m_nOversample(0), +m_nCounterLimit_low(1), m_bSync(false), m_nSampleRate(SAMPLE_RATE_HZ), m_nSourceMode(0), @@ -40,8 +40,8 @@ CSAANoise::CSAANoise(unsigned long seed) : m_nCounter(0), m_nCounter_low(0), -m_nCounterLimit_low(1), m_nOversample(0), +m_nCounterLimit_low(1), m_bSync(false), m_nSampleRate(SAMPLE_RATE_HZ), m_nSourceMode(0), diff --git a/src/sound/snd_cms.c b/src/sound/snd_cms.c index 60165365d..c6591b1fc 100644 --- a/src/sound/snd_cms.c +++ b/src/sound/snd_cms.c @@ -56,8 +56,6 @@ void cms_write(uint16_t addr, uint8_t val, void *priv) { cms_t *cms = (cms_t *) priv; - int voice; - int chip = (addr & 2) >> 1; switch (addr & 0xf) { case 0x1: /* SAA #1 Register Select Port */ From 420a08ee2c8755dc1ba6785cbd5e31247aac1c1f Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 2 Apr 2025 17:18:44 +0200 Subject: [PATCH 044/118] mem.c: Do not initialize the > 1 GB mapping on 64-bit binaries where it is not necessary. --- src/mem/mem.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mem/mem.c b/src/mem/mem.c index c4d11300b..8c2cfd6cc 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -2976,6 +2976,7 @@ mem_reset(void) else if (cpu_16bitbus && is6117 && mem_size > 65408) mem_init_ram_mapping(&ram_high_mapping, 0x100000, (65408 - 1024) * 1024); else { +#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)) if (mem_size > 1048576) { mem_init_ram_mapping(&ram_high_mapping, 0x100000, (1048576 - 1024) * 1024); @@ -2988,6 +2989,9 @@ mem_reset(void) ram2, MEM_MAPPING_INTERNAL, NULL); } else mem_init_ram_mapping(&ram_high_mapping, 0x100000, (mem_size - 1024) * 1024); +#else + mem_init_ram_mapping(&ram_high_mapping, 0x100000, (mem_size - 1024) * 1024); +#endif } } From 98efd05ddaa32823028c2130ffeb26ea40bbc6a2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 2 Apr 2025 18:45:27 +0200 Subject: [PATCH 045/118] Alfredo, Batman's Renvenge, and Plato: Pre-initialize NVR to 0x00 instead of 0xFF and give them the correct Phoenix keyboard controller, fixes hang after the first soft reset. --- src/machine/m_at_386dx_486.c | 4 +++- src/machine/m_at_socket4.c | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 0ee353f53..572cebc2e 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -1249,6 +1249,8 @@ machine_at_alfredo_init(const machine_t *model) return ret; machine_at_common_init(model); + + device_add(&amstrad_megapc_nvr_device); device_add(&ide_pci_device); pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); @@ -1258,7 +1260,7 @@ machine_at_alfredo_init(const machine_t *model) pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&keyboard_ps2_pci_device); + device_add(&keyboard_ps2_phoenix_device); device_add(&sio_device); device_add(&fdc37c663_device); device_add(&intel_flash_bxt_ami_device); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 78df5b0cb..072d52e01 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -44,7 +44,9 @@ void machine_at_premiere_common_init(const machine_t *model, int pci_switch) { - machine_at_common_init(model); + machine_at_common_init_ex(model); + + device_add(&amstrad_megapc_nvr_device); device_add(&ide_pci_device); pci_init(PCI_CONFIG_TYPE_2 | pci_switch); @@ -54,7 +56,7 @@ machine_at_premiere_common_init(const machine_t *model, int pci_switch) pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&keyboard_ps2_intel_ami_pci_device); + device_add(&keyboard_ps2_phoenix_device); device_add(&sio_zb_device); device_add(&fdc37c665_device); device_add(&intel_flash_bxt_ami_device); From babac318944a5aa80daedd99d76f3abaf651f915 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 2 Apr 2025 18:46:35 +0200 Subject: [PATCH 046/118] Fixed a compile-breaking mistake. --- src/machine/m_at_386dx_486.c | 2 +- src/machine/m_at_socket4.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 572cebc2e..7f285af65 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -1248,7 +1248,7 @@ machine_at_alfredo_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init(model); + machine_at_common_init_ex(model, 2); device_add(&amstrad_megapc_nvr_device); device_add(&ide_pci_device); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 072d52e01..0d78c6de3 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -44,7 +44,7 @@ void machine_at_premiere_common_init(const machine_t *model, int pci_switch) { - machine_at_common_init_ex(model); + machine_at_common_init_ex(model, 2); device_add(&amstrad_megapc_nvr_device); device_add(&ide_pci_device); From 57851e7606d02ed15fb470641158d2b1dfb98c66 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 2 Apr 2025 16:21:50 -0300 Subject: [PATCH 047/118] AD1848: Logging and clean-ups I forgot to commit --- src/sound/snd_ad1848.c | 78 +++++++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 20 deletions(-) diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index 87755a96c..202fd891a 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -19,11 +19,12 @@ * Copyright 2021-2025 RichardG. */ #include +#include #include #include #include #include - +#define HAVE_STDARG_H #include <86box/86box.h> #include <86box/dma.h> #include <86box/pic.h> @@ -36,6 +37,24 @@ #define CS4232 0x02 #define CS4236 0x03 +#ifdef ENABLE_AD1848_LOG +int ad1848_do_log = ENABLE_AD1848_LOG; + +static void +ad1848_log(const char *fmt, ...) +{ + va_list ap; + + if (ad1848_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +# define ad1848_log(fmt, ...) +#endif + static int ad1848_vols_7bits[128]; static double ad1848_vols_5bits_aux_gain[32]; @@ -46,12 +65,14 @@ extern uint8_t adjustMap4[64]; void ad1848_setirq(ad1848_t *ad1848, int irq) { + ad1848_log("AD1848: setirq(%d)\n", irq); ad1848->irq = irq; } void ad1848_setdma(ad1848_t *ad1848, int newdma) { + ad1848_log("AD1848: setdma(%d)\n", newdma); ad1848->dma = newdma; } @@ -62,6 +83,7 @@ ad1848_updatevolmask(ad1848_t *ad1848) ad1848->wave_vol_mask = 0x7f; else ad1848->wave_vol_mask = 0x3f; + ad1848_log("AD1848: updatevolmask(%02X)\n", ad1848->wave_vol_mask); } static double @@ -99,6 +121,8 @@ ad1848_get_default_freq(ad1848_t *ad1848) break; } + ad1848_log("AD1848: Frequency %f through default path\n", freq); + return freq; } @@ -136,6 +160,8 @@ ad1848_updatefreq(ad1848_t *ad1848) freq /= 2558.0; break; } + + ad1848_log("AD1848: Frequency %f through CS4236B+ path\n", freq); } else if (ad1848->regs[22] & 0x80) { const uint8_t set = (ad1848->regs[22] >> 1) & 0x3f; freq = (ad1848->regs[22] & 1) ? 33868800.0 : 49152000.0; @@ -153,6 +179,8 @@ ad1848_updatefreq(ad1848_t *ad1848) freq /= 256 * set; break; } + + ad1848_log("AD1848: Frequency %f through CS4232+ path\n", freq); } else freq = ad1848_get_default_freq(ad1848); } else @@ -182,18 +210,16 @@ ad1848_read(uint16_t addr, void *priv) ad1848->regs[ad1848->index] = ret; break; - case 18: - case 19: + case 18 ... 19: if (ad1848->type >= AD1848_TYPE_CS4236B) { if ((ad1848->xregs[4] & 0x14) == 0x14) /* FM remapping */ - ret = ad1848->xregs[ad1848->index - 12]; /* real FM volume on registers 6 and 7 */ + ret = ad1848->xregs[6 | (ad1848->index & 1)]; /* real FM volume on registers 6 and 7 */ else if (ad1848->wten && !(ad1848->xregs[4] & 0x08)) /* wavetable remapping */ - ret = ad1848->xregs[ad1848->index - 2]; /* real wavetable volume on registers 16 and 17 */ + ret = ad1848->xregs[16 | (ad1848->index & 1)]; /* real wavetable volume on registers 16 and 17 */ } break; - case 20: - case 21: + case 20 ... 21: /* Backdoor to the Control/RAM registers on CS4235+. */ if ((ad1848->type >= AD1848_TYPE_CS4235) && (ad1848->xregs[18] & 0x80)) ret = ad1848->cram_read(ad1848->index - 15, ad1848->cram_priv); @@ -229,13 +255,16 @@ ad1848_read(uint16_t addr, void *priv) default: break; } + ad1848_log("AD1848: read(X%d) = %02X\n", ad1848->xindex, ret); + return ret; } break; default: break; } - break; + ad1848_log("AD1848: read(I%d) = %02X\n", ad1848->index, ret); + return ret; case 2: ret = ad1848->status; @@ -245,6 +274,8 @@ ad1848_read(uint16_t addr, void *priv) break; } + ad1848_log("AD1848: read(%04X) = %02X\n", addr, ret); + return ret; } @@ -295,7 +326,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) break; case 11: - return; + goto readonly_i; case 12: if (ad1848->type >= AD1848_TYPE_CS4248) { @@ -307,19 +338,19 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) ad1848->fmt_mask &= ~0x80; } } - return; + goto readonly_i; case 14: ad1848->count = ad1848->regs[15] | (val << 8); break; - case 18: - case 19: + case 18 ... 19: if (ad1848->type >= AD1848_TYPE_CS4236B) { if (ad1848->type >= AD1848_TYPE_CS4235) { if (ad1848->xregs[18] & 0x20) /* AUX1 remapping */ ad1848->regs[ad1848->index & 3] = val; /* also controls AUX1 on registers 2 and 3 */ } else { + temp = 0; if ((ad1848->xregs[4] & 0x14) == 0x14) { /* FM remapping */ ad1848->xregs[6 | (ad1848->index & 1)] = val; /* real FM volume on extended registers 6 and 7 */ temp = 1; @@ -343,7 +374,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) /* Stop here if any remapping is enabled. */ if (temp) - return; + goto readonly_i; } /* HACK: the Windows 9x driver's "Synth" control writes to this @@ -362,8 +393,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) } break; - case 20: - case 21: + case 20 ... 21: /* Backdoor to the Control/RAM registers on CS4235+. */ if ((ad1848->type >= AD1848_TYPE_CS4235) && (ad1848->xregs[18] & 0x80)) { ad1848->cram_write(ad1848->index - 15, val, ad1848->cram_priv); @@ -421,7 +451,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) break; case 25: - return; + goto readonly_x; case 26 ... 28: case 30: @@ -438,6 +468,8 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) if (updatefreq) ad1848_updatefreq(ad1848); +readonly_x: + ad1848_log("AD1848: write(X%d, %02X)\n", ad1848->xindex, val); return; } break; @@ -451,14 +483,14 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) break; case 25: - return; + goto readonly_i; case 27: if ((ad1848->type != AD1848_TYPE_CS4232) && (ad1848->type != AD1848_TYPE_CS4236)) - return; + goto readonly_i; break; case 29: if ((ad1848->type != AD1848_TYPE_CS4232) && (ad1848->type != AD1848_TYPE_CS4236)) - return; + goto readonly_i; break; default: @@ -480,7 +512,9 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) else ad1848->cd_vol_r = ad1848_vols_5bits_aux_gain[ad1848->regs[temp] & 0x1f]; - break; +readonly_i: + ad1848_log("AD1848: write(I%d, %02X)\n", ad1848->index, val); + return; case 2: ad1848->status &= 0xfe; @@ -490,6 +524,8 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) default: break; } + + ad1848_log("AD1848: write(%04X, %02X)\n", addr, val); } void @@ -743,6 +779,8 @@ ad1848_init(ad1848_t *ad1848, uint8_t type) uint8_t c; double attenuation; + ad1848_log("AD1848: init(%02X)\n", type); + ad1848->status = 0xcc; ad1848->index = ad1848->trd = 0; ad1848->mce = 0x40; From f56f636248aea56ce4dafabbf0a18597d167ce02 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 2 Apr 2025 16:27:10 -0300 Subject: [PATCH 048/118] Report 4 GB cacheable memory on Deschutes CPUs, fixes modern Linux limiting itself to 512 MB on some machines --- src/cpu/cpu.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 910d40765..61bd8bf36 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -2649,6 +2649,11 @@ cpu_ven_reset(void) case CPU_PENTIUM2: case CPU_PENTIUM2D: msr.mtrr_cap = 0x00000508ULL; + + /* 4 GB cacheable space on Deschutes 651h and later (including the 1632h + Overdrive) according to the Pentium II Processor Specification Update. */ + if (cpu_s->cpuid_model >= 0x651) + msr.bbl_cr_ctl3 |= 0x00300000; break; case CPU_CYRIX3S: @@ -4103,7 +4108,7 @@ pentium_invalid_wrmsr: break; /* BBL_CR_CTL3 - L2 Cache Control Register 3 */ case 0x11e: - msr.bbl_cr_ctl3 = EAX | ((uint64_t) EDX << 32); + msr.bbl_cr_ctl3 = (msr.bbl_cr_ctl3 & 0x02f00000) | (EAX & ~0x02f00000) | ((uint64_t) EDX << 32); break; /* Unknown */ case 0x131: From 5432c1dd1382331b94985283b5034daafef4c37d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 2 Apr 2025 21:33:26 +0200 Subject: [PATCH 049/118] 8514/A compatible changes of the day (April 2nd, 2025) 1. Aliases are aliases, period. 2. Actually make the ports using bit 15 of their range use the command FIFO. 3. Improved the special ATI command 0xc2b5 in the IBM bitblt side, fixes cursor issues in 24bpp mode using OS/2. 4. When the FIFO is empty, clear the busy and available flags. 5. Also reapply a workaround for 24bpp foreground color patterns in ATI command Scan To X command, fixes patterns in OS/2 and possibly elsewhere. 6. Accelerated HiColor mode, in the IBM passthrough mode, should always be enabled, for now, as well as the Extended ATI Mach32 8bpp mode when prompted, fixes OS/2 booting into the GUI in HiColor mode. 7. Dummy data path configuration values on direct linedraw should not trigger a pixtrans read when it's not needed, fixes possible hang ups in IBM/ATI mode when the busy flag remains enabled. --- src/video/vid_8514a.c | 171 +++++++++------ src/video/vid_ati_mach8.c | 438 +++++++++++++++++++++++--------------- 2 files changed, 375 insertions(+), 234 deletions(-) diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 7c0bf9702..8925f01da 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -334,6 +334,13 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) { ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + if (port & 0x8000) { + if ((port != 0xe2e8) && (port != 0xe2e9) && (port != 0xe6e8) && (port != 0xe6e9)) { + if (port & 0x4000) + port &= ~0x4000; + } + } + switch (port) { case 0x2e8: WRITE8(port, dev->htotal, val); @@ -499,19 +506,16 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0x82e8: - case 0xc2e8: if (len == 2) dev->accel.cur_y = val & 0x7ff; break; case 0x86e8: - case 0xc6e8: if (len == 2) dev->accel.cur_x = val & 0x7ff; break; case 0x8ae8: - case 0xcae8: if (len == 2) { dev->accel.desty = val & 0x7ff; dev->accel.desty_axstp = val & 0x3fff; @@ -521,7 +525,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0x8ee8: - case 0xcee8: if (len == 2) { dev->accel.destx = val & 0x7ff; dev->accel.destx_distp = val & 0x3fff; @@ -531,12 +534,8 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0x92e8: - if (len == 2) - dev->test = val; - fallthrough; - - case 0xd2e8: if (len == 2) { + dev->test = val; dev->accel.err_term = val & 0x3fff; if (val & 0x2000) dev->accel.err_term |= ~0x1fff; @@ -544,7 +543,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0x96e8: - case 0xd6e8: if (len == 2) { dev->accel.maj_axis_pcnt = val & 0x7ff; dev->accel.maj_axis_pcnt_no_limit = val; @@ -552,7 +550,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0x9ae8: - case 0xdae8: dev->accel.ssv_state = 0; if (len == 2) { dev->data_available = 0; @@ -562,13 +559,12 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) if (dev->accel.cmd & 0x100) dev->accel.cmd_back = 0; - ibm8514_log("8514/A CMD=%04x, back=%d, frgd color=%04x, frgdmix=%02x, pixcntl=%02x.\n", dev->accel.cmd, dev->accel.cmd_back, dev->accel.frgd_color, dev->accel.frgd_mix, dev->accel.multifunc[0x0a]); + ibm8514_log("8514/A CMD=%04x, frgd color=%04x, frgdmix=%02x, pixcntl=%02x.\n", dev->accel.cmd, dev->accel.frgd_color, dev->accel.frgd_mix, dev->accel.multifunc[0x0a]); ibm8514_accel_start(-1, 0, -1, 0, svga, len); } break; case 0x9ee8: - case 0xdee8: dev->accel.ssv_state = 1; if (len == 2) { dev->accel.short_stroke = val; @@ -628,35 +624,29 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0xaae8: - case 0xeae8: if (len == 2) dev->accel.wrt_mask = val; break; case 0xaee8: - case 0xeee8: if (len == 2) dev->accel.rd_mask = val; break; case 0xb2e8: - case 0xf2e8: if (len == 2) dev->accel.color_cmp = val; break; case 0xb6e8: - case 0xf6e8: dev->accel.bkgd_mix = val & 0xff; break; case 0xbae8: - case 0xfae8: dev->accel.frgd_mix = val & 0xff; break; case 0xbee8: - case 0xfee8: if (len == 2) { dev->accel.multifunc_cntl = val; dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; @@ -765,10 +755,12 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) { ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - if (dev->accel.cmd_back) { - dev->fifo_idx++; - if (dev->fifo_idx > 8) - dev->fifo_idx = 8; + if (port & 0x8000) { + if (dev->accel.cmd_back) { + dev->fifo_idx++; + if (dev->fifo_idx > 8) + dev->fifo_idx = 8; + } } ibm8514_accel_out_fifo(svga, port, val, len); @@ -799,13 +791,11 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) switch (port) { case 0x82e8: - case 0xc2e8: if (len == 2) temp = dev->accel.cur_y; break; case 0x86e8: - case 0xc6e8: if (len == 2) temp = dev->accel.cur_x; break; @@ -821,7 +811,6 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) break; case 0x9ae8: - case 0xdae8: if (len == 2) { if (dev->fifo_idx <= 8) { for (int i = 1; i <= dev->fifo_idx; i++) @@ -835,9 +824,6 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) if (dev->force_busy) temp |= 0x0200; /*Hardware busy*/ - if (dev->accel.cmd_back) - dev->force_busy = 0; - if (dev->data_available) { temp |= 0x0100; /*Read Data available*/ switch (dev->accel.cmd >> 13) { @@ -857,7 +843,6 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) } break; case 0x9ae9: - case 0xdae9: if (len == 1) { dev->fifo_idx = 0; @@ -974,7 +959,7 @@ ibm8514_accel_in(uint16_t port, svga_t *svga) temp |= INT_GE_BSY; } - if (dev->accel.cmd_back) { + if (!dev->fifo_idx) { dev->force_busy = 0; dev->force_busy2 = 0; dev->data_available = 0; @@ -1033,6 +1018,8 @@ ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t dev->accel.ssv_len_back = dev->accel.ssv_len; if (ibm8514_cpu_src(svga)) { + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 0; dev->data_available2 = 0; return; /*Wait for data from CPU*/ @@ -1079,11 +1066,6 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat rd_mask_polygon &= 0xff; } - if (!dev->accel.cmd_back) { - dev->force_busy = 1; - dev->force_busy2 = 1; - } - frgd_mix = (dev->accel.frgd_mix >> 5) & 3; bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3; @@ -1251,8 +1233,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat cpu_dat >>= 8; if (!dev->accel.ssv_len) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -1348,8 +1334,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat cpu_dat >>= 8; if (!dev->accel.ssv_len) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -1413,10 +1403,14 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat dev->accel.output = 1; } } + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 0; dev->data_available2 = 0; return; /*Wait for data from CPU*/ } else if (ibm8514_cpu_dest(svga)) { + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 1; dev->data_available2 = 1; return; @@ -1524,8 +1518,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } if (!dev->accel.sy) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; if (!cpu_input) { dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; @@ -1645,8 +1643,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat cpu_dat >>= 8; if (!dev->accel.sy) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -1749,8 +1751,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat cpu_dat >>= 8; if (!dev->accel.sy) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; if (!cpu_input) { dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; @@ -1855,6 +1861,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } } } + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 0; dev->data_available2 = 0; return; /*Wait for data from CPU*/ @@ -1872,6 +1880,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } } ibm8514_log("INPUT=%d.\n", dev->accel.input); + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 1; dev->data_available2 = 1; return; /*Wait for data from CPU*/ @@ -2031,8 +2041,10 @@ skip_vector_rect_write: dev->accel.x_count = 0; if (dev->accel.sy < 0) { - dev->accel.cmd_back = 1; + dev->force_busy = 0; + dev->force_busy2 = 0; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; } return; } @@ -2043,6 +2055,7 @@ skip_vector_rect_write: ibm8514_log("Vectored Rectangle with normal processing (TODO).\n"); } else { /*Normal Rectangle*/ if (cpu_input) { + ibm8514_log("Normal Pixel Rectangle Fill Transfer SY=%d.\n", dev->accel.sy); while (count-- && (dev->accel.sy >= 0)) { if ((dev->accel.cx >= clip_l) && (dev->accel.cx <= clip_r) && @@ -2192,9 +2205,11 @@ skip_nibble_rect_write: dev->accel.x_count = 0; if (dev->accel.sy < 0) { - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; } + dev->force_busy = 0; + dev->force_busy2 = 0; return; } } @@ -2280,8 +2295,8 @@ skip_nibble_rect_write: dev->accel.sy--; if (dev->accel.sy < 0) { - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; } return; } @@ -2366,8 +2381,8 @@ skip_nibble_rect_write: dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; } - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } } @@ -2478,10 +2493,10 @@ skip_nibble_rect_write: if (dev->accel.sy < 0) { ibm8514_log(".\n"); - dev->accel.cmd_back = 1; dev->fifo_idx = 0; dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; + dev->accel.cmd_back = 1; return; } } @@ -2568,8 +2583,8 @@ skip_nibble_rect_write: dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; } - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } } @@ -2599,10 +2614,14 @@ skip_nibble_rect_write: ibm8514_log("Polygon Boundary activated=%04x, len=%d, cur(%d,%d), frgdmix=%02x, err=%d, clipping: l=%d, r=%d, t=%d, b=%d, pixcntl=%02x.\n", dev->accel.cmd, dev->accel.sy, dev->accel.cx, dev->accel.cy, dev->accel.frgd_mix & 0x1f, dev->accel.err_term, clip_l, clip_r, clip_t, clip_b, dev->accel.multifunc[0x0a]); if (ibm8514_cpu_src(svga)) { + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 0; dev->data_available2 = 0; return; /*Wait for data from CPU*/ } else if (ibm8514_cpu_dest(svga)) { + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 1; dev->data_available2 = 1; return; @@ -2671,8 +2690,12 @@ skip_nibble_rect_write: cpu_dat >>= 8; if (!dev->accel.sy) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -2776,8 +2799,12 @@ skip_nibble_rect_write: cpu_dat >>= 8; if (!dev->accel.sy) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -2869,10 +2896,14 @@ skip_nibble_rect_write: } } } + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 0; dev->data_available2 = 0; return; /*Wait for data from CPU*/ } else if (ibm8514_cpu_dest(svga)) { + dev->force_busy = 1; + dev->force_busy2 = 1; dev->data_available = 1; dev->data_available2 = 1; return; /*Wait for data from CPU*/ @@ -3036,6 +3067,8 @@ skip_nibble_bitblt_write: if (dev->accel.sy < 0) { dev->accel.cmd_back = 1; + dev->force_busy = 0; + dev->force_busy2 = 0; dev->fifo_idx = 0; } return; @@ -3234,8 +3267,8 @@ skip_nibble_bitblt_write: if (dev->accel.sy < 0) { dev->accel.destx = dev->accel.dx; dev->accel.desty = dev->accel.dy; - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } } @@ -3254,9 +3287,29 @@ skip_nibble_bitblt_write: (dx <= (((uint64_t)clip_r) * 3)) && (dev->accel.dy >= (clip_t << 1)) && (dev->accel.dy <= (clip_b << 1))) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = 0; + break; + case 3: + READ(dev->accel.src + cx, src_dat); + break; + + default: + break; + } + READ(dev->accel.src + cx, src_dat); READ(dev->accel.dest + dx, dest_dat); - dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); + old_dest_dat = dest_dat; + MIX(mix_dat & mix_mask, dest_dat, src_dat); + dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); WRITE(dev->accel.dest + dx, dest_dat); } @@ -3265,8 +3318,8 @@ skip_nibble_bitblt_write: dev->accel.sx--; if (dev->accel.sx < 0) { - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } } @@ -3321,15 +3374,8 @@ skip_nibble_bitblt_write: old_dest_dat = dest_dat; MIX(mix_dat & mix_mask, dest_dat, src_dat); dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - - if (dev->accel.cmd & 0x04) { - if (dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.dx, dest_dat); - } - } else { - WRITE(dev->accel.dest + dev->accel.dx, dest_dat); - ibm8514_log("BitBLT DX=%d, DY=%d, data=%02x, old=%02x, src=%02x, frmix=%02x, bkmix=%02x, pixcntl=%d.\n", dev->accel.dx, dev->accel.dy, dest_dat, old_dest_dat, src_dat, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, pixcntl); - } + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); + ibm8514_log("BitBLT DX=%d, DY=%d, data=%02x, old=%02x, src=%02x, frmix=%02x, bkmix=%02x, pixcntl=%d.\n", dev->accel.dx, dev->accel.dy, dest_dat, old_dest_dat, src_dat, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, pixcntl); } } @@ -3380,8 +3426,8 @@ skip_nibble_bitblt_write: if (dev->accel.sy < 0) { dev->accel.destx = dev->accel.dx; dev->accel.desty = dev->accel.dy; - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } } @@ -4020,6 +4066,7 @@ ibm8514_init(const device_t *info) default: dev->extensions = 0; ibm8514_io_set(svga); + dev->accel.cmd_back = 1; if (dev->type & DEVICE_MCA) { dev->pos_regs[0] = 0x7f; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 474ae5660..9f92ebde1 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -69,6 +69,7 @@ static uint8_t ati8514_accel_inb(uint16_t port, void *priv); static uint16_t ati8514_accel_inw(uint16_t port, void *priv); static uint32_t ati8514_accel_inl(uint16_t port, void *priv); +static void mach_set_resolution(mach_t *mach, svga_t *svga); static void mach32_updatemapping(mach_t *mach, svga_t *svga); static __inline void mach32_writew_linear(uint32_t addr, uint16_t val, mach_t *mach); static __inline void mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t *svga); @@ -326,12 +327,6 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 bkgd_sel = (mach->accel.dp_config >> 7) & 3; mono_src = (mach->accel.dp_config >> 5) & 3; - if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) { - mach->force_busy = 1; - dev->force_busy = 1; - dev->force_busy2 = 1; - } - if (cpu_input) { if (dev->bpp) { if ((mach->accel.dp_config & 0x200) && (count == 2)) @@ -339,12 +334,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } - if ((dev->accel_bpp == 8) || (dev->accel_bpp == 15) || (dev->accel_bpp == 16) || (dev->accel_bpp == 24)) - mach_log("RdMask=%04x, DPCONFIG=%04x, Clipping: l=%d, r=%d, t=%d, b=%d, LineDrawOpt=%04x, BPP=%d, CMDType = %d, offs=%08x, cnt = %d, input = %d, mono_src = %d, frgdsel = %d, d(%d,%d), dstxend = %d, pitch = %d, extcrt = %d, rw = %x, monopattern = %x.\n", - dev->accel.rd_mask, mach->accel.dp_config, clip_l, clip_r, clip_t, clip_b, mach->accel.linedraw_opt, dev->accel_bpp, cmd_type, mach->accel.ge_offset, count, cpu_input, mono_src, frgd_sel, dev->accel.cur_x, dev->accel.cur_y, - mach->accel.dest_x_end, dev->ext_pitch, dev->ext_crt_pitch, mach->accel.dp_config & 1, mach->accel.mono_pattern_enable); - - mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i, dpconfig = %04x.\n", cmd_type, frgd_sel, bkgd_sel, mono_src, mach->accel.dp_config); + mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i, dpconfig = %04x, cur_x = %d, cur_y = %d.\n", cmd_type, frgd_sel, bkgd_sel, mono_src, mach->accel.dp_config, dev->accel.cur_x, dev->accel.cur_y); switch (cmd_type) { case 1: /*Extended Raw Linedraw from bres_count register (0x96ee)*/ @@ -376,12 +366,18 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.linedraw_opt, mach->accel.dp_config, mach->accel.max_waitstates & 0x100); - if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) { + if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 0; dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 1; dev->data_available2 = 1; return; @@ -550,12 +546,22 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } if ((mono_src == 1) && !count) { - dev->accel.cmd_back = 1; + if (cpu_input) { + mach->force_busy = 0; + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) { - dev->accel.cmd_back = 1; + if (cpu_input) { + mach->force_busy = 0; + dev->force_busy = 0; + dev->force_busy2 = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -777,12 +783,22 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } if ((mono_src == 1) && !count) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -976,12 +992,18 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } - if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) { + if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 0; dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 1; dev->data_available2 = 1; return; @@ -1000,16 +1022,26 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach->accel.dy_end == mach->accel.dy_start) { mach_log("No DEST.\n"); - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } if ((mono_src == 3) || (bkgd_sel == 3) || (frgd_sel == 3)) { if (mach->accel.sx_end == mach->accel.sx_start) { + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } mach_log("No SRC.\n"); - dev->accel.cmd_back = 1; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } } @@ -1020,8 +1052,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mono_src, frgd_sel, bkgd_sel, dev->pitch); if (dev->accel.sy == mach->accel.height) { mach_log("No Blit on DPCONFIG=3251.\n"); - dev->accel.cmd_back = 1; + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; dev->fifo_idx = 0; + dev->accel.cmd_back = 1; return; } } @@ -1238,8 +1273,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } if (dev->accel.sy >= mach->accel.height) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; if ((mono_src == 2) || (mono_src == 3) || (frgd_sel == 3) || (bkgd_sel == 3) || (mach->accel.dp_config & 0x02)) return; if ((mono_src == 1) && (frgd_sel == 5) && (dev->accel_bpp == 24)) @@ -1279,14 +1319,20 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.cur_x, dev->accel.cur_y, dev->accel.dx, dev->accel.dy, mach->accel.cx_end_line, mach->accel.cy_end_line, mach->accel.bleft, mach->accel.bright, mach->accel.btop, mach->accel.bbottom); - if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) { + if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { mach_log("Write PIXTRANS.\n"); + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 0; dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { mach_log("Read PIXTRANS.\n"); + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 1; dev->data_available2 = 1; return; @@ -1398,8 +1444,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); if (!count) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -1569,8 +1620,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); if (dev->accel.sx >= mach->accel.width) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -1694,8 +1750,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); if (!count) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -1853,8 +1914,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); if (dev->accel.sx >= mach->accel.width) { - dev->accel.cmd_back = 1; + if (cpu_input) { + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + } dev->fifo_idx = 0; + dev->accel.cmd_back = 1; break; } @@ -1986,14 +2052,38 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); - mach_log("ScanToX: Parameters=%04x: DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, srcwidth=%d, height=%d, clipl=%d, clipr=%d, clipt=%d, clipb=%d, frmix=%02x.\n", mach->accel.dp_config, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.src_width, dev->accel.sy, clip_l, clip_r, clip_t, clip_b, dev->accel.frgd_mix & 0x1f); + if ((dev->accel_bpp >= 24) && (frgd_sel == 5)) { + if (mach->accel.patt_len == 0x17) + mach->accel.color_pattern_idx = 0; - if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) { + dev->accel.x1 = dev->accel.dx + mach->accel.width; + if (dev->accel.x1 == dev->pitch) + dev->accel.x2 = mach->accel.width & 1; + else if ((dev->accel.x1 == mach->accel.width) && (dev->accel.dy & 1) && !dev->accel.y1 && dev->accel.x2) { + if (mach->accel.patt_len == 0x17) + mach->accel.color_pattern_idx = 3; + + dev->accel.x3 = 1; + } else + dev->accel.x3 = 0; + } + dev->accel.y1 = 0; + + mach_log("ScanToX: Parameters=%04x: xbit=%d, ybit=%d, widthbit=%d, DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, srcwidth=%d, height=%d, frmix=%02x.\n", + mach->accel.dp_config, dev->accel.dx & 1, dev->accel.dy & 1, mach->accel.width & 1, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.src_width, dev->accel.sy, dev->accel.frgd_mix & 0x1f); + + if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 0; dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { + dev->force_busy = 1; + dev->force_busy2 = 1; + mach->force_busy = 1; dev->data_available = 1; dev->data_available2 = 1; return; @@ -2132,10 +2222,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.sx++; if (mach->accel.sx >= mach->accel.src_width) { mach->accel.sx = 0; - if (mach->accel.src_stepx == -1) { + if (mach->accel.src_stepx == -1) dev->accel.cx += mach->accel.src_width; - } else + else dev->accel.cx -= mach->accel.src_width; + dev->accel.cy += (mach->accel.src_y_dir ? 1 : -1); if (dev->bpp) dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * (dev->pitch)); @@ -2143,13 +2234,24 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); } + mach_log("ColorIdx=%d, data=%02x, DestX=%d, DestY=%d.\n", mach->accel.color_pattern_idx, mach->accel.color_pattern[mach->accel.color_pattern_idx], dev->accel.dx, dev->accel.dy & 1); if (dev->bpp) mach->accel.color_pattern_idx += 2; else mach->accel.color_pattern_idx++; - if (mach->accel.color_pattern_idx > mach->accel.patt_len) - mach->accel.color_pattern_idx = 0; + if ((dev->accel_bpp >= 24) && (frgd_sel == 5) && (mach->accel.patt_len == 0x17)) { + if (dev->accel.x3) { + if (mach->accel.color_pattern_idx == 9) + mach->accel.color_pattern_idx = 3; + } else { + if (mach->accel.color_pattern_idx == 6) + mach->accel.color_pattern_idx = 0; + } + } else { + if (mach->accel.color_pattern_idx > mach->accel.patt_len) + mach->accel.color_pattern_idx = 0; + } dev->accel.dx += mach->accel.stepx; dev->accel.sx++; @@ -2167,11 +2269,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (dev->accel.sy >= 0) dev->accel.sy--; - dev->accel.cmd_back = 1; dev->fifo_idx = 0; dev->force_busy = 0; dev->force_busy2 = 0; mach->force_busy = 0; + dev->accel.cmd_back = 1; return; } } @@ -2368,7 +2470,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) mach_log("Extended 8514/A mode.\n"); dev->vendor_mode = 1; dev->on |= 0x01; - svga_recalctimings(svga); + mach_set_resolution(mach, svga); mach32_updatemapping(mach, svga); } if (dev->on) @@ -2395,7 +2497,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) mach_log("VGA mode.\n"); dev->vendor_mode = 0; dev->on &= ~0x01; - svga_recalctimings(svga); + mach_set_resolution(mach, svga); mach32_updatemapping(mach, svga); } if (dev->on) @@ -2688,30 +2790,11 @@ mach_set_resolution(mach_t *mach, svga_t *svga) dev->v_syncstart >>= 1; mach_log("Shadow set ATI=%x, shadow set 8514/A=%x, resolution h=%d, v=%d, vtotal=%d, vsyncstart=%d.\n", mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, dev->v_total, dev->v_syncstart); - if ((mach->accel.clock_sel & 0x01) || dev->bpp || ((mach->accel.ext_ge_config & 0x30) == 0x30)) /*ATI and 15bpp+ mode*/ - svga_recalctimings(svga); - else { /*8514/A mode*/ - switch (mach->shadow_set & 0x03) { - case 0x00: /*Primary CRT Register set*/ - if (dev->on) { - if (mach->crt_resolution == 0x01) { - if (ATI_8514A_ULTRA) { - if (dev->accel.advfunc_cntl & 0x04) { - if (dev->hdisp == 640) { - dev->hdisp = 1024; - dev->vdisp = 768; - svga_recalctimings(svga); - } - } else { - if (dev->hdisp == 1024) { - dev->hdisp = 640; - dev->vdisp = 480; - svga_recalctimings(svga); - } - } - } else - svga_recalctimings(svga); - } else if (mach->crt_resolution == 0x02) { + switch (mach->shadow_set & 0x03) { + case 0x00: /*Primary CRT Register set*/ + if (dev->on) { + if (mach->crt_resolution == 0x01) { + if (ATI_8514A_ULTRA) { if (dev->accel.advfunc_cntl & 0x04) { if (dev->hdisp == 640) { dev->hdisp = 1024; @@ -2727,33 +2810,48 @@ mach_set_resolution(mach_t *mach, svga_t *svga) } } else svga_recalctimings(svga); - } - break; - case 0x01: /*Shadow 640x480 CRT register set*/ - if (dev->on) { - if (!(dev->accel.advfunc_cntl & 0x04)) { - if (dev->hdisp == 1024) { - dev->hdisp = 640; - dev->vdisp = 480; - } - } - svga_recalctimings(svga); - } - break; - case 0x02: /*Shadow 1024x768 CRT register set*/ - if (dev->on) { + } else if (mach->crt_resolution == 0x02) { if (dev->accel.advfunc_cntl & 0x04) { if (dev->hdisp == 640) { dev->hdisp = 1024; dev->vdisp = 768; + svga_recalctimings(svga); + } + } else { + if (dev->hdisp == 1024) { + dev->hdisp = 640; + dev->vdisp = 480; + svga_recalctimings(svga); } } + } else svga_recalctimings(svga); + } + break; + case 0x01: /*Shadow 640x480 CRT register set*/ + if (dev->on) { + if (!(dev->accel.advfunc_cntl & 0x04)) { + if (dev->hdisp == 1024) { + dev->hdisp = 640; + dev->vdisp = 480; + } } - break; - default: - break; - } + svga_recalctimings(svga); + } + break; + case 0x02: /*Shadow 1024x768 CRT register set*/ + if (dev->on) { + if (dev->accel.advfunc_cntl & 0x04) { + if (dev->hdisp == 640) { + dev->hdisp = 1024; + dev->vdisp = 768; + } + } + svga_recalctimings(svga); + } + break; + default: + break; } } @@ -2855,7 +2953,7 @@ mach_recalctimings(svga_t *svga) svga->ati_4color = 0; } - mach_log("ON?=%d, override=%d, gelo=%04x, gehi=%04x, vgahdisp=%d.\n", dev->on, svga->override, mach->accel.ge_offset_lo, mach->accel.ge_offset_hi, svga->hdisp); + mach_log("ON=%d, override=%d, gelo=%04x, gehi=%04x, vgahdisp=%d.\n", dev->on, svga->override, mach->accel.ge_offset_lo, mach->accel.ge_offset_hi, svga->hdisp); if (dev->on) { dev->ma_latch = 0; /*(mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2;*/ dev->pitch = dev->ext_pitch; @@ -3015,6 +3113,15 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u int bkgd_sel; int mono_src; + if (port & 0x8000) { + if ((port & 0x06) != 0x06) { + if ((port != 0xe2e8) && (port != 0xe2e9) && (port != 0xe6e8) && (port != 0xe6e9)) { + if (port & 0x4000) + port &= ~0x4000; + } + } + } + mach_log("[%04X:%08X]: Port FIFO OUT=%04x, val=%04x, len=%d.\n", CS, cpu_state.pc, port, val, len); switch (port) { @@ -3240,12 +3347,16 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x4ae8: dev->accel.advfunc_cntl = val; - dev->on = dev->accel.advfunc_cntl & 0x01; + dev->on = val & 0x01; dev->vendor_mode = 0; - mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", - CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); + mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d, extmode=%02x.\n", + CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, mach->regs[0xb0] & 0x20); if (ATI_MACH32) { + if ((mach->regs[0xb0] & 0x20) || (dev->accel_bpp >= 15)) { /*Account for the extended ATI 8514/A mode here too*/ + dev->on |= 0x01; + dev->vendor_mode = 1; + } mach_set_resolution(mach, svga); mach32_updatemapping(mach, svga); } else { @@ -3257,14 +3368,10 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x82e8: case 0x86e8: - case 0xc2e8: - case 0xc6e8: - case 0xf6ee: ibm8514_accel_out_fifo(svga, port, val, len); break; case 0x8ae8: - case 0xcae8: ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { mach_log("SRCY=%d.\n", val & 0x07ff); @@ -3273,7 +3380,6 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x8ee8: - case 0xcee8: ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { mach_log("SRCX=%d.\n", val & 0x07ff); @@ -3282,64 +3388,55 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x92e8: - case 0xd2e8: ibm8514_accel_out_fifo(svga, port, val, len); break; case 0x96e8: - case 0xd6e8: ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) mach->accel.test = val & 0x1fff; break; case 0x9ae8: - case 0xdae8: mach->accel.cmd_type = -1; ibm8514_accel_out_fifo(svga, port, val, len); break; case 0x9ee8: - case 0xdee8: ibm8514_accel_out_fifo(svga, port, val, len); break; case 0xa2e8: case 0xe2e8: if (port == 0xe2e8) { + mach_log("%04X: Background Color=%04x.\n", port, val); if (len == 2) { - if (dev->accel.cmd_back) { - if (mach->accel.cmd_type == 5) { - if (dev->accel.sy >= 0) { - if (mach_pixel_read(mach)) - break; - - mach_accel_out_pixtrans(svga, mach, dev, val); - } else - dev->accel.bkgd_color = val; - } else - dev->accel.bkgd_color = val; - - mach_log("%04X: CMDBack BKGDCOLOR, sy=%d, height=%d, val=%04x.\n", port, dev->accel.sy, mach->accel.height, val); - } else { + if (!dev->accel.cmd_back) { if (mach->accel.cmd_type >= 0) { if (mach_pixel_read(mach)) break; + mach_log("ATI transfer.\n"); mach_accel_out_pixtrans(svga, mach, dev, val); } else { if (ibm8514_cpu_dest(svga)) break; + mach_log("IBM transfer.\n"); ibm8514_accel_out_pixtrans(svga, port, val, len); } + } else { + dev->accel.bkgd_color = val; + mach_log("%04X: CMDBack BKGDCOLOR, sy=%d, height=%d, cmdtype=%d, val=%04x.\n", port, dev->accel.sy, mach->accel.height, mach->accel.cmd_type, val); } } else { - if (mach->accel.cmd_type >= 0) { - if (mach_pixel_read(mach)) - break; + if (dev->accel.cmd & 0x100) { + if (mach->accel.cmd_type >= 0) { + if (mach_pixel_read(mach)) + break; - mach->accel.pix_trans[1] = val; + mach->accel.pix_trans[1] = val; + } } } } else { @@ -3353,42 +3450,39 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xa6e8: case 0xe6e8: if (port == 0xe6e8) { + mach_log("%04X: Foreground Color=%04x.\n", port, val); if (len == 2) { - if (dev->accel.cmd_back) { - if (mach->accel.cmd_type == 5) { - if (dev->accel.sy >= 0) { - if (mach_pixel_read(mach)) - break; - - mach_accel_out_pixtrans(svga, mach, dev, val); - } else - dev->accel.frgd_color = val; - } else - dev->accel.frgd_color = val; - } else { + if (!dev->accel.cmd_back) { if (mach->accel.cmd_type >= 0) { if (mach_pixel_read(mach)) break; + mach_log("ATI transfer.\n"); mach_accel_out_pixtrans(svga, mach, dev, val); } else { if (ibm8514_cpu_dest(svga)) break; + mach_log("IBM transfer.\n"); ibm8514_accel_out_pixtrans(svga, port, val, len); } - } + } else + dev->accel.frgd_color = val; } else { - if (mach->accel.cmd_type >= 0) { - if (mach_pixel_read(mach)) - break; + if (!dev->accel.cmd_back) { + if (mach->accel.cmd_type >= 0) { + if (mach_pixel_read(mach)) + break; - mach->accel.pix_trans[1] = val; + mach->accel.pix_trans[1] = val; + } } } } else { if (len == 2) dev->accel.frgd_color = val; + + mach_log("%04X: Foreground Color=%04x.\n", port, val); } break; @@ -3396,40 +3490,42 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xe6e9: mach_log("Write PORT=%04x, 8514/A=%x, val=%04x, len=%d.\n", port, dev->accel.cmd_back, val, len); if (len == 1) { - if (mach->accel.cmd_type >= 0) { - if (mach_pixel_read(mach)) - break; + if (!dev->accel.cmd_back) { + if (mach->accel.cmd_type >= 0) { + if (mach_pixel_read(mach)) + break; - mach->accel.pix_trans[0] = val; - frgd_sel = (mach->accel.dp_config >> 13) & 7; - bkgd_sel = (mach->accel.dp_config >> 7) & 3; - mono_src = (mach->accel.dp_config >> 5) & 3; + mach->accel.pix_trans[0] = val; + frgd_sel = (mach->accel.dp_config >> 13) & 7; + bkgd_sel = (mach->accel.dp_config >> 7) & 3; + mono_src = (mach->accel.dp_config >> 5) & 3; - switch (mach->accel.dp_config & 0x200) { - case 0x000: /*8-bit size*/ - if (mono_src == 2) { - if ((frgd_sel != 2) && (bkgd_sel != 2)) { - mach_accel_start(mach->accel.cmd_type, 1, 8, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev); + switch (mach->accel.dp_config & 0x200) { + case 0x000: /*8-bit size*/ + if (mono_src == 2) { + if ((frgd_sel != 2) && (bkgd_sel != 2)) { + mach_accel_start(mach->accel.cmd_type, 1, 8, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev); + } else + mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev); } else mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev); - break; - case 0x200: /*16-bit size*/ - if (mono_src == 2) { - if ((frgd_sel != 2) && (bkgd_sel != 2)) { - if (mach->accel.dp_config & 0x1000) - mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[1] | (mach->accel.pix_trans[0] << 8), 0, svga, mach, dev); - else - mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev); + break; + case 0x200: /*16-bit size*/ + if (mono_src == 2) { + if ((frgd_sel != 2) && (bkgd_sel != 2)) { + if (mach->accel.dp_config & 0x1000) + mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[1] | (mach->accel.pix_trans[0] << 8), 0, svga, mach, dev); + else + mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev); + } else + mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev); } else mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev); - break; + break; - default: - break; + default: + break; + } } } } @@ -3441,16 +3537,10 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xb2e8: case 0xb6e8: case 0xbae8: - case 0xeae8: - case 0xeee8: - case 0xf2e8: - case 0xf6e8: - case 0xfae8: ibm8514_accel_out_fifo(svga, port, val, len); break; case 0xbee8: - case 0xfee8: ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { if ((dev->accel.multifunc_cntl >> 12) == 5) { @@ -3728,10 +3818,10 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u } if (ATI_MACH32) { + mach_log("Load both SRC/DST GE Offset/Pitch=%03x, offset=%08x.\n", mach->shadow_set & 0x300, dev->accel.ge_offset); if ((mach->shadow_set & 0x300) == 0x000) { - mach_log("Load both SRC/DST GE Offset/Pitch.\n"); - mach->accel.ge_offset_lo = 0; - mach->accel.ge_offset_hi = 0; + mach->accel.ge_offset_lo = 0x0000; + mach->accel.ge_offset_hi = 0x0000; } } break; @@ -3856,10 +3946,14 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x8eee: if (len == 2) { + frgd_sel = (mach->accel.dp_config >> 13) & 7; + if (mach->accel.patt_data_idx_reg < 0x10) { mach->accel.color_pattern[mach->accel.patt_data_idx] = val & 0xff; mach->accel.color_pattern[mach->accel.patt_data_idx + 1] = (val >> 8) & 0xff; mach_log("Write Port 8eee: Color Pattern Word Data[%d]=%04x.\n", mach->accel.patt_data_idx, val); + if ((dev->accel_bpp >= 24) && (frgd_sel == 5) && (mach->accel.patt_len == 0x17)) + dev->accel.y1 = 1; } else { mach->accel.mono_pattern_normal[mach->accel.patt_data_idx - 0x10] = val & 0xff; mach->accel.mono_pattern_normal[(mach->accel.patt_data_idx + 1) - 0x10] = (val >> 8) & 0xff; @@ -4103,6 +4197,9 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) dev->accel.cmd_back = 0; + if ((mach->accel.cmd_type == 3) && !dev->accel.cmd_back && (mach->accel.dp_config == 0x0000)) /*Avoid a hang with a dummy command.*/ + dev->accel.cmd_back = 1; + mach_log("LineDraw type=%x, dpconfig=%04x.\n", mach->accel.cmd_type, mach->accel.dp_config); mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, svga, mach, dev); mach->accel.line_idx = (mach->accel.line_idx == 5) ? 4 : 2; @@ -4165,9 +4262,6 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in if (dev->force_busy) temp |= 0x0200; /*Hardware busy*/ - if (dev->accel.cmd_back) - dev->force_busy = 0; - if (dev->data_available) { temp |= 0x0100; /*Read Data available*/ if (mach->accel.cmd_type >= 0) { @@ -4623,7 +4717,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) } } - if (dev->accel.cmd_back) { + if (!dev->fifo_idx) { dev->force_busy = 0; dev->force_busy2 = 0; mach->force_busy = 0; @@ -4661,7 +4755,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) mach_log("FIFO Test IDX=%d, Data=%04x.\n", mach->fifo_test_idx, mach->fifo_test_data[mach->fifo_test_idx]); READ8(port, mach->fifo_test_data[mach->fifo_test_idx]); if (!mach->fifo_test_idx && ((mach->accel.dp_config == 0xaaaa) || (mach->accel.dp_config == 0x5555))) - mach->accel.dp_config = 0x2211; + mach->accel.dp_config = 0x2011; break; case 0x22ee: @@ -4761,7 +4855,6 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) if (mach->force_busy) temp |= 0x20; - mach->force_busy = 0; if (ati_eeprom_read(&mach->eeprom)) temp |= 0x40; @@ -6076,7 +6169,8 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) if (svga->attrregs[0x10] & 0x40) { dev->vendor_mode = 0; dev->on &= ~0x01; - svga_recalctimings(svga); + mach_log("No 8514/A mode on b8000.\n"); + mach_set_resolution(mach, svga); } } } @@ -6892,7 +6986,6 @@ mach8_init(const device_t *info) mach->ramdac_type = mach->pci_bus ? device_get_config_int("ramdac") : 1; dev->vram_amount = device_get_config_int("memory"); dev->vram_512k_8514 = dev->vram_amount == 512; - dev->accel.cmd_back = 1; if (ATI_MACH32) { if (mach->pci_bus) { @@ -7016,6 +7109,7 @@ mach8_init(const device_t *info) io_sethandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); mach_io_set(mach); mach->accel.cmd_type = -2; + dev->accel.cmd_back = 1; if (ATI_MACH32) { svga->decode_mask = (4 << 20) - 1; @@ -7077,12 +7171,12 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) mach->accel.clock_sel = 0x1c; mach->shadow_set = 0x02; mach->crt_resolution = 0x02; + dev->accel.cmd_back = 1; io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga); ati8514_io_set(svga); mach->accel.cmd_type = -2; mach->mca_bus = !!(dev->type & DEVICE_MCA); - dev->accel.cmd_back = 1; mach->config1 = 0x08 | 0x80; From 9c8c1a6f406aec432756ca19fdb4b8451bcd7260 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 2 Apr 2025 21:47:32 +0200 Subject: [PATCH 050/118] Trantor SCSI changes of the day (April 2nd, 2025) 1. The PAS SCSI controller driver mamv1.sys dislikes having bits 0-6 set when a transfer has completed, take account from this, fixes mamv1.sys incomplete CD transfers (bits 0-6 get re-enabled when the transfer is ongoing). 2. I now understand why the T128 doesn't have a block count register, it does the block count manually from the SCSI layer directly, this fixes Pseudo-DMA transfers when using, e.g.: CD transfers using a sector size of 2340 bytes. --- src/include/86box/scsi_device.h | 3 ++- src/include/86box/scsi_t128.h | 3 ++- src/scsi/scsi_t128.c | 29 +++++++++++------------------ src/sound/snd_pas16.c | 9 ++++++++- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index 62da8b7dc..289201b04 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -467,9 +467,10 @@ typedef struct scsi_bus_t { int msgout_pos; int is_msgout; int state; - int dma_on_pio_enabled; uint32_t bus_phase; + uint32_t total_len; + uint32_t data_repeat; double period; double speed; diff --git a/src/include/86box/scsi_t128.h b/src/include/86box/scsi_t128.h index 65148a5d1..a3bc79335 100644 --- a/src/include/86box/scsi_t128.h +++ b/src/include/86box/scsi_t128.h @@ -30,7 +30,7 @@ typedef struct t128_t { uint8_t status; uint8_t buffer[512]; uint8_t ext_ram[0x80]; - uint8_t block_count; + uint32_t block_count; int block_loaded; int pos, host_pos; @@ -39,6 +39,7 @@ typedef struct t128_t { int bios_enabled; uint8_t pos_regs[8]; + int type; pc_timer_t timer; } t128_t; diff --git a/src/scsi/scsi_t128.c b/src/scsi/scsi_t128.c index 3f273d1bb..94166054c 100644 --- a/src/scsi/scsi_t128.c +++ b/src/scsi/scsi_t128.c @@ -130,12 +130,12 @@ t128_read(uint32_t addr, void *priv) (t128->host_pos < MIN(512, dev->buffer_length))) { ret = t128->buffer[t128->host_pos++]; - t128_log("T128 Read transfer: pos=%i, addr=%x.\n", - t128->host_pos, addr & 0x1ff); + t128_log("T128 Read transfer: pos=%i, addr=%x, enabled timer=%d.\n", + t128->host_pos, addr & 0x1ff, timer_is_enabled(&t128->timer)); if (t128->host_pos == MIN(512, dev->buffer_length)) { - t128_log("T128 Transfer busy read, status=%02x, period=%lf, enabled=%d.\n", - t128->status, scsi_bus->period, timer_is_enabled(&t128->timer)); + t128_log("T128 Transfer busy read, status=%02x, period=%lf, enabled=%d, block=%d.\n", + t128->status, scsi_bus->period, timer_is_enabled(&t128->timer), scsi_bus->data_pos); t128->status &= ~0x04; if (!t128->block_loaded) { @@ -192,10 +192,6 @@ t128_dma_send_ext(void *priv, void *ext_priv) t128_log("T128 DMA OUT, len=%d.\n", dev->buffer_length); memset(t128->buffer, 0, MIN(512, dev->buffer_length)); t128->host_pos = 0; - t128->block_count = dev->buffer_length >> 9; - - if (dev->buffer_length < 512) - t128->block_count = 1; t128->block_loaded = 1; t128->status |= 0x04; @@ -215,10 +211,6 @@ t128_dma_initiator_receive_ext(void *priv, void *ext_priv) t128_log("T128 DMA IN, len=%d.\n", dev->buffer_length); memset(t128->buffer, 0, MIN(512, dev->buffer_length)); t128->host_pos = MIN(512, dev->buffer_length); - t128->block_count = dev->buffer_length >> 9; - - if (dev->buffer_length < 512) - t128->block_count = 1; t128->block_loaded = 1; t128->status &= ~0x04; @@ -295,9 +287,9 @@ t128_callback(void *priv) t128->status &= ~0x02; t128->pos = 0; t128->host_pos = 0; - t128->block_count = (t128->block_count - 1) & 0xff; + scsi_bus->data_repeat = 0; t128_log("T128 Remaining blocks to be written=%d\n", t128->block_count); - if (!t128->block_count) { + if (scsi_bus->data_pos >= dev->buffer_length) { t128->block_loaded = 0; ncr->tcr |= TCR_LAST_BYTE_SENT; ncr->isr |= STATUS_END_OF_DMA; @@ -344,11 +336,11 @@ t128_callback(void *priv) t128->status &= ~0x02; t128->pos = 0; t128->host_pos = 0; - t128->block_count = (t128->block_count - 1) & 0xff; - t128_log("T128 Remaining blocks to be read=%d\n", t128->block_count); - if (!t128->block_count) { - t128->block_loaded = 0; + scsi_bus->data_repeat = 0; + t128_log("T128 blocks read=%d, total len=%d\n", scsi_bus->data_pos, dev->buffer_length); + if (scsi_bus->data_pos >= dev->buffer_length) { scsi_bus->bus_out |= BUS_REQ; + t128->block_loaded = 0; timer_on_auto(&t128->timer, 10.0); t128_log("IO End of read transfer\n"); } @@ -472,6 +464,7 @@ t128_init(const device_t *info) ncr->bus = scsi_get_bus(); scsi_bus = &ncr->scsibus; + t128->type = info->local; if (info->flags & DEVICE_MCA) { rom_init(&t128->bios_rom, T128_ROM, diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c index 675582367..dd95eac4c 100644 --- a/src/sound/snd_pas16.c +++ b/src/sound/snd_pas16.c @@ -792,7 +792,14 @@ pas16_in(uint16_t port, void *priv) if ((scsi_bus->tx_mode == PIO_TX_BUS) && !(ret & 0x80)) ret |= 0x80; - pas16_log("5C01 read ret=%02x, status=%02x, txmode=%x.\n", ret, pas16->scsi->status & 0x06, scsi_bus->tx_mode); + if (ret & 0x80) { + if (scsi_bus->data_repeat < MIN(511, scsi_bus->total_len)) + scsi_bus->data_repeat++; + } else { + if (scsi_bus->data_repeat == MIN(511, scsi_bus->total_len)) + ret = 0x00; + } + pas16_log("%04X:%08X: Port %04x read ret=%02x, status=%02x, txmode=%x, repeat=%d.\n", CS, cpu_state.pc, port + pas16->base, ret, pas16->scsi->status & 0x06, scsi_bus->tx_mode, scsi_bus->data_repeat); } break; case 0x5c03: From 4bd374a7dfcceebac5249fb01409c7395762bb6d Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 2 Apr 2025 16:55:57 -0300 Subject: [PATCH 051/118] Don't apply the Deschutes cacheability fix to Covington --- src/cpu/cpu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 61bd8bf36..ffe582604 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -2651,8 +2651,9 @@ cpu_ven_reset(void) msr.mtrr_cap = 0x00000508ULL; /* 4 GB cacheable space on Deschutes 651h and later (including the 1632h - Overdrive) according to the Pentium II Processor Specification Update. */ - if (cpu_s->cpuid_model >= 0x651) + Overdrive) according to the Pentium II Processor Specification Update. + Covington 651h (no L2 cache) reports the same 512 MB value as Klamath. */ + if (CPUID >= (!strncmp(cpu_f->internal_name, "celeron", 7) ? 0x660 : 0x651)) msr.bbl_cr_ctl3 |= 0x00300000; break; From cfc8e0dc4e6780bbdbbfb81ef6ac267730e21fb9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 3 Apr 2025 06:17:27 +0200 Subject: [PATCH 052/118] Settings Storage Devices: No longer cut off the second SCSI controller. --- src/qt/qt_settingsstoragecontrollers.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index eebed79e2..002b9e1d3 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -195,12 +195,10 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) if (scsi_card_available(c)) { if (device_is_valid(scsi_card_getdevice(c), machineId)) { for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) { - if ((c != 1) || ((i == 0) && m_has_scsi)) { - int row = Models::AddEntry(models[i], name, c); + int row = Models::AddEntry(models[i], name, c); - if (c == scsi_card_current[i]) - selectedRows[i] = row - removeRows_[i]; - } + if (c == scsi_card_current[i]) + selectedRows[i] = row - removeRows_[i]; } } } From df7acc618bccd33d504e8a5fa5d1a0e53e72ee0b Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 3 Apr 2025 06:19:36 +0200 Subject: [PATCH 053/118] Remove the now unused variable m_has_scsi. --- src/qt/qt_settingsstoragecontrollers.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 002b9e1d3..9bd1bda6f 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -176,7 +176,6 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) QAbstractItemModel *models[SCSI_CARD_MAX] = { 0 }; int removeRows_[SCSI_CARD_MAX] = { 0 }; int selectedRows[SCSI_CARD_MAX] = { 0 }; - int m_has_scsi = machine_has_flags(machineId, MACHINE_SCSI); for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) { cbox[i] = findChild(QString("comboBoxSCSI%1").arg(i + 1)); From c63d900a9383b74fbd8a5fa7209a0b2a6364a913 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 3 Apr 2025 06:35:53 +0200 Subject: [PATCH 054/118] CMS: Divide SAA samples by 2 so that the sum remains within the -32767 to 32768 range and avoids clipping. --- src/sound/snd_cms.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sound/snd_cms.c b/src/sound/snd_cms.c index c6591b1fc..9491e3076 100644 --- a/src/sound/snd_cms.c +++ b/src/sound/snd_cms.c @@ -34,7 +34,7 @@ cms_get_buffer(int32_t *buffer, int len, void *priv) cms_update(cms); for (int c = 0; c < len * 2; c++) - buffer[c] += cms->buffer[c]; + buffer[c] += (cms->buffer[c] / 2); cms->pos = 0; } @@ -47,7 +47,7 @@ cms_get_buffer_2(int32_t *buffer, int len, void *priv) cms_update(cms); for (int c = 0; c < len * 2; c++) - buffer[c] += cms->buffer2[c]; + buffer[c] += (cms->buffer2[c] / 2); cms->pos2 = 0; } From fc06d3de89dfd58eb497f1e6b8d09cb0dbbfaa13 Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Thu, 3 Apr 2025 15:16:58 +0900 Subject: [PATCH 055/118] PS55DA2: add char drawing func in BitBlt This build is still in work. * Added character drawing function to support for DOS/V Extension DSPXDA2 driver. * Implement CRTC regs: start address, end address, line compare to support line compare scrolling in DOS/V Extension. * Enable updating CRTC regs when output is disabled. --- src/video/vid_ps55da2.c | 424 +++++++++++++++++++++++++++------------- 1 file changed, 290 insertions(+), 134 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 1f00b7cc5..1875726b5 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -66,7 +66,7 @@ #define DA2_MASK_VRAM 0xfffff /* 0xFFFFF */ #define DA2_MASK_VRAMPLANE 0x1ffff /* 0x1FFFF */ #define DA2_PIXELCLOCK 29000000.0 /* 58 MHz interlaced */ -#define DA2_BLT_MEMSIZE 0x100 +#define DA2_BLT_MEMSIZE 0x1000 #define DA2_BLT_REGSIZE 0x40 #define DA2_DEBUG_BLTLOG_SIZE (DA2_BLT_REGSIZE + 1) #define DA2_DEBUG_BLTLOG_MAX (256 * 1024) @@ -112,8 +112,8 @@ EFD8h * Display Adapter/J [Atlas-SP2] [Japanese DOS and Display Adapter compatibility] - | | | K3.31 | J4.04 | J4.08 | OS2J1.3 | Win3.02 | DOSVExt | - | POS ID | Adapter Name | 5605JBK | 5605PAA | 5605PCA | 5605PDE | 5605PAW | 5605PXA | + | | | 5605JBK | 5605PAA | 5605PCA | 5605PDE | 5605PAW | 5605PXB | + | POS ID | Adapter Name | K3.31 | J4.05 | J4.08 | J1.33 | 3.02 | 2.0 | |------------|-----------------------------|:-------:|:-------:|:-------:|:-------:|:-------:|:-------:| | EFFFh | Display Adapter | X | | | | | | | FFEDh | ? [Atlas EVT] | X | | | | | | @@ -124,7 +124,14 @@ | ECECh | Display Adapter IV,B1 | | X | X | X | X | X | | 9000-901Fh | Display Adapter A1,A2 | | X | X | | X | X | | EFD8h | Display Adapter /J | | | X | X | X | X | -*/ + + - 5605JBK : Japanese DOS K3.3, K3.4 (for PS/55 model 55xx-S, T, V, Z) + - 5605PAA : DOS J4.0 + - 5605PCA : DOS J4.0 (with MKK) + - 5605PDE : OS/2 Extended Edition J1.3 + - 5605PAW : Japanese Microsoft Windows 3.0 (IBMJ OEM) + - 5605PXB : DOS/V Extension V2.0 + */ /* IO 3E0/3E1:0Ah Hardware Configuration Value L (imported from OS/2 DDK) */ #define OldLSI 0x20 /* 1 = DA-2, 0 = DA-3 */ // #define Mon_ID3 0x10 @@ -163,8 +170,10 @@ #define LF_INDEX 0x3e2 #define LF_DATA 0x3e3 #define LF_MMIO_SEL 0x08 /* added */ +#define LF_MMIO_09 0x09 /* added */ #define LF_MMIO_ADDR 0x0A /* added */ #define LF_MMIO_MODE 0x0B /* added */ +#define LF_PD_RESET 0x18 /* added */ #define LC_INDEX 0x3E4 #define LC_DATA 0x3E5 #define LC_HORIZONTAL_TOTAL 0x00 @@ -251,12 +260,12 @@ #define LG_SET_RESET_2 0x10 #ifndef RELEASE_BUILD -// #define ENABLE_DA2_LOG 1 +#define ENABLE_DA2_LOG 1 #endif #ifdef ENABLE_DA2_LOG // # define ENABLE_DA2_DEBUGIO 1 -// # define ENABLE_DA2_DEBUGBLT 1 +# define ENABLE_DA2_DEBUGBLT 1 // # define ENABLE_DA2_DEBUGVRAM 1 // # define ENABLE_DA2_DEBUGFULLSCREEN 1 // # define ENABLE_DA2_DEBUGMONWAIT 1 @@ -328,7 +337,7 @@ typedef struct da2_t { int vtotal, dispend, vsyncstart, split, vblankstart; int hdisp, htotal, hdisp_time, rowoffset; - int lowres, interlace; + int lowres; int rowcount; double clock; uint32_t ma_latch, ca_adj; @@ -343,7 +352,7 @@ typedef struct da2_t { uint32_t ma, maback, ca; int vc; int sc; - int linepos, vslines, linecountff, oddeven; + int linepos, vslines, linecountff; int con, cursoron, blink, blinkconf; int scrollcache; int char_width; @@ -457,6 +466,53 @@ DA2_vram_w(uint32_t addr, uint8_t val, da2_t *da2) da2->vram[addr] = val; return; } +/* get font data for bitblt operation */ +static uint32_t +getFontIBMJ(int32_t code, int line, int x, void *p) +{ + da2_t *da2 = (da2_t *) p; + uint32_t font = 0; + int fline = line - 2; /* Start line of drawing character (line >= 1 AND line < 24 + 1 ) */ + if (code < 0x100) { /* SBCS 13x29 */ + code *= 0x40; + code += DA2_GAIJIRAM_SBCS + (line * 2) + x; + font = da2->mmio.ram[code]; + font <<= 8; + font |= da2->mmio.ram[code + 1]; + font <<= 16; + return font; + } + if ((code >= 0x8000) && (code <= 0x8183)) + code -= 0x6000; /* shift for IBM extended characters */ + if ((code < (DA2_FONTROM_SIZE / 72)) && (fline >= 0) && (fline < 24)) { /* DBCS 24x24 */ + code = (code * 72) + (fline * 3) + x; + // font = da2->mmio.font[code]; /* 0000 0000 0000 0000 0000 0000 1111 1111 */ + // font <<= 8; /* 0000 0000 0000 0000 1111 1111 0000 0000 */ + // font |= da2->mmio.font[code + 1] & 0xf0; /* 0000 0000 0000 0000 1111 1111 2222 0000 */ + // font <<= 3; /* 0000 0000 0000 0111 1111 1222 2000 0000 */ + // font |= da2->mmio.font[code + 1] & 0x0f; /* 0000 0000 0000 0111 1111 1222 2000 2222 */ + // font <<= 8; /* 0000 0111 1111 1222 2000 2222 0000 0000 */ + // font |= da2->mmio.font[code + 2]; /* 0000 0111 1111 1222 2000 2222 3333 3333 */ + // font <<= 4; /* 0111 1111 1222 2000 2222 3333 3333 0000 */ + } else if ((code >= 0xb000) && (code <= 0xb75f)) { /* DBCS 26x29 */ + /* convert code->address in gaiji memory */ + code -= 0xb000; + code = (code * 0x80) + (line * 4) + x; + font = da2->mmio.ram[code]; + font <<= 8; + font |= da2->mmio.ram[code + 1]; + font <<= 8; + font |= da2->mmio.ram[code + 2]; + font <<= 8; + font |= da2->mmio.ram[code + 3]; + // font <<= 16; + } else if (code > (DA2_FONTROM_SIZE / 72)) + font = 0xffffffffu; + else + font = 0; + return font; +} + /* write pixel data with rop (Note: bitmask must be in big endian) */ static void DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *srcpx, da2_t *da2) @@ -482,6 +538,11 @@ DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *s for (int i = 0; i < 8; i++) { if (da2->bitblt.bitshift_destr > 0) srcpx->p8[i] <<= 16 - da2->bitblt.bitshift_destr; +// #ifdef ENABLE_DA2_DEBUGBLT +// if (i == 0) { +// pclog("writeplane: src %08X mask %08X dest %08X\n", srcpx->p8[i], mask32.d, writepx[i]); +// } +// #endif if (da2->bitblt.raster_op & 0x2010) /* NOT Src or NOT Pattern */ srcpx->p8[i] = ~srcpx->p8[i] & mask32.d; if (da2->bitblt.raster_op & 0x20) /* Dest NOT */ @@ -560,24 +621,68 @@ DA2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2); } +/* Reverse the bit order of attribute code IBGR to IRGB(used in Mode 3 and Cursor Color) */ +static int8_t +IBGRtoIRGB(uint8_t attr) +{ + attr = ((attr & 0x01) << 6) | ((attr & 0x02) << 4) | ((attr & 0x04) << 2) | ((attr & 0x08) << 4); + return attr >>= 4; +} static void -DA2_PutcharWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2) +DA2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, uint32_t destaddr, uint16_t maskl, uint16_t maskr, da2_t *da2) { pixel32 srcpx; - if (srcaddr >= DA2_FONTROM_SIZE) { - da2_log("DA2 Putchar Addr Error %x\n", srcaddr); - return; + // if (codeIBMJ >= DA2_FONTROM_SIZE / 72) { + // da2_log("DA2 Putchar Addr Error %x\n", srcaddr); + // return; + // } + uint8_t color = (~attr >> 8) & 0x0f; + // color = IBGRtoIRGB(color); + uint8_t bg = (~attr >> 12) & 0x0f; + // bg = 0x00; + // bg = IBGRtoIRGB(bg); + uint32_t font = getFontIBMJ(codeIBMJ, line, 0, da2); + uint32_t fontinv; + if (width == 1) { + fontinv = ~font; + for (int i = 0; i < 8; i++) { + srcpx.p8[i] = (color & (1 << i)) ? font >> 16 : 0; + srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; + } + pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); + DA2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); + for (int i = 0; i < 8; i++) { + srcpx.p8[i] = (color & (1 << i)) ? font : 0; + srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; + } + pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); + DA2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); + } else { + font = (font & 0xfff80000) | ((font & 0x0000ffff) << 3); + fontinv = ~font; + pclog("putchar: ft %08X shftr %X\n", font, da2->bitblt.bitshift_destr); + for (int i = 0; i < 8; i++) { + srcpx.p8[i] = (color & (1 << i)) ? font >> 16 : 0; + srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; + } + // pclog("putchar: %08X mask %04X\n", srcpx.p8[3], maskl); + DA2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); + for (int i = 0; i < 8; i++) { + srcpx.p8[i] = (color & (1 << i)) ? font : 0; + srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; + } + // pclog("putchar: %08X mask %04X\n", srcpx.p8[3], maskr); + DA2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2); + for (int i = 0; i < 8; i++) { + srcpx.p8[i] = (color & (1 << i)) ? font << 16 : 0; + srcpx.p8[i] |= (bg & (1 << i)) ? fontinv << 16 : 0; + } + // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[3], maskl, maskr); + DA2_WritePlaneDataWithBitmask(destaddr + 4, maskr, &srcpx, da2); } - for (int i = 0; i < 8; i++) - srcpx.p8[i] = ((uint32_t) da2->mmio.font[srcaddr] << 24) - | ((uint32_t) da2->mmio.font[srcaddr + 1] << 16) - | ((uint32_t) da2->mmio.font[srcaddr + 2] << 8) - | ((uint32_t) da2->mmio.font[srcaddr + 3] << 0); - - DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2); } #ifdef ENABLE_DA2_DEBUGBLT -uint8_t +static uint8_t pixel1tohex(uint32_t addr, int index, da2_t *da2) { uint8_t pixeldata = 0; @@ -587,14 +692,14 @@ pixel1tohex(uint32_t addr, int index, da2_t *da2) } return pixeldata; } -void +static void print_pixelbyte(uint32_t addr, da2_t *da2) { for (int i = 0; i < 8; i++) { pclog("%X", pixel1tohex(addr, i, da2)); } } -void +static void print_bytetobin(uint8_t b) { for (int i = 0; i < 8; i++) { @@ -606,17 +711,17 @@ print_bytetobin(uint8_t b) } } /* Convert internal char code to Shift JIS code */ -inline int +static int isKanji1(uint8_t chr) { return (chr >= 0x81 && chr <= 0x9f) || (chr >= 0xe0 && chr <= 0xfc); } -inline int +static int isKanji2(uint8_t chr) { return (chr >= 0x40 && chr <= 0x7e) || (chr >= 0x80 && chr <= 0xfc); } -uint16_t +static uint16_t IBMJtoSJIS(uint16_t knj) { if (knj < 0x100) @@ -710,6 +815,27 @@ da2_bitblt_load(da2_t *da2) // da2->gdcreg[da2->bitblt.payload[i + 1]] = value64; i += 7; break; + case 0xa1: + value64 = da2->bitblt.payload[i + 9]; + value64 <<= 8; + value64 |= da2->bitblt.payload[i + 8]; + value64 <<= 8; + value64 |= da2->bitblt.payload[i + 7]; + value64 <<= 8; + value64 |= da2->bitblt.payload[i + 6]; + value64 <<= 8; + value64 |= da2->bitblt.payload[i + 5]; + value64 <<= 8; + value64 |= da2->bitblt.payload[i + 4]; + value64 <<= 8; + value64 |= da2->bitblt.payload[i + 3]; + value64 <<= 8; + value64 |= da2->bitblt.payload[i + 2]; + da2_bltlog("[%02x] %02x: %02x %02x %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], da2->bitblt.payload[i + 2], da2->bitblt.payload[i + 3], + da2->bitblt.payload[i + 4], da2->bitblt.payload[i + 5], da2->bitblt.payload[i + 6], da2->bitblt.payload[i + 7], da2->bitblt.payload[i + 8], da2->bitblt.payload[i + 9]); + da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value64; + i += 9; + break; case 0x00: break; default: @@ -734,14 +860,15 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.debug_reg_ip = 0; da2->bitblt.debug_exesteps = 0; #endif - da2_log("bltload_exec: %x, rop: %x CS:PC=%4x:%4x\n", da2->bitblt.reg[0x5], da2->bitblt.reg[0x0b], CS, cpu_state.pc); - da2->bitblt.bitshift_destr = ((da2->bitblt.reg[0x3] >> 4) & 0x0f); /* set bit shift */ + da2_log("bltload_exec: %x, rop: %x CS:PC=%4x:%4x\n", da2->bitblt.reg[0x5], da2->bitblt.reg[0xb], CS, cpu_state.pc); + da2->bitblt.bitshift_destr = ((da2->bitblt.reg[0x03] >> 4) & 0x0f); /* set bit shift */ da2->bitblt.raster_op = da2->bitblt.reg[0x0b]; da2->bitblt.destaddr = da2->bitblt.reg[0x29]; da2->bitblt.size_x = da2->bitblt.reg[0x33]; da2->bitblt.size_y = da2->bitblt.reg[0x35]; da2->bitblt.destpitch = da2->bitblt.reg[0x21]; da2->bitblt.srcpitch = da2->bitblt.reg[0x22]; + /* 80h = 128d = 10000000b, 90h = 144d = 10010000b, B0h = 176d = 10110000 */ if (da2->bitblt.reg[0x2F] == 0x90) /* destaddr -= 2, length += 1; */ { da2->bitblt.destaddr -= 2; @@ -757,7 +884,7 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.exec = DA2_BLT_CDONE; /* Put DBCS char used by OS/2 (i'm not sure what the condition is) */ - if (da2->bitblt.reg[0x10] == 0xbc04) { + if (!(da2->bitblt.reg[0xb] & 0x08)) { da2->bitblt.exec = DA2_BLT_CPUTCHAR; /* Todo: addressing */ // if (da2->bitblt.reg[0x2F] == 0x90) /* destaddr -= 2, length += 1; */ @@ -767,29 +894,22 @@ da2_bitblt_load(da2_t *da2) // da2->bitblt.destpitch += 2; // da2->bitblt.srcpitch += 2; // } - da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + 2; + da2->bitblt.fcolor = da2->bitblt.reg[0x1]; + da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; da2->bitblt.destaddr += 2; da2->bitblt.srcpitch = 0; - da2->bitblt.bitshift_destr += 1; #ifdef ENABLE_DA2_DEBUGBLT - uint32_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8; - uint32_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff; - da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d, c=%c%c\n", - da2->bitblt.srcaddr, da2->bitblt.destaddr, - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y, sjis_h, sjis_l); -#endif - } - /* Put SBCS char used by OS/2 */ - else if (da2->bitblt.reg[0x10] == 0x0004 || da2->bitblt.reg[0x10] == 0x0E04) { - da2->bitblt.exec = DA2_BLT_CPUTCHAR; - da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 64 + 2 + DA2_FONTROM_BASESBCS; - da2->bitblt.destaddr += 2; - da2->bitblt.srcpitch = 0; - da2->bitblt.bitshift_destr += 1; -#ifdef ENABLE_DA2_DEBUGBLT - uint32_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8; - uint32_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff; + uint8_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8; + uint8_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff; + if (da2->bitblt.reg[0x12] < 0x100) { + sjis_h = 0x20; + sjis_l = da2->bitblt.reg[0x12]; + } else { + if (!(isKanji1(sjis_h))) + sjis_h = 0x3f; + if (!(isKanji2(sjis_l))) + sjis_l = 0x3f; + } da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d, c=%c%c\n", da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), @@ -1040,49 +1160,35 @@ da2_bitblt_exec(void *p) da2->bitblt.srcaddr -= 2; break; case DA2_BLT_CPUTCHAR: /* used in OS/2 J1.3 wo ROM patch. TODO: still not work */ - // da2->bitblt.y += 2; - da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.x * 2 + da2->bitblt.y * 130 + 0 + 260; - // pclog("scr %x dest %x :", da2->bitblt.srcaddr, da2->bitblt.destaddr); + da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.y * 130; // da2->bitblt.srcaddr += 2; - if (da2->bitblt.reg[0x12] < 0x100) - da2->bitblt.srcaddr = DA2_FONTROM_BASESBCS + da2->bitblt.reg[0x12] * 64 + (da2->bitblt.x * 2) + (da2->bitblt.y * 2) - 2; - else - da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2) + (da2->bitblt.y * 3) - 2; - // print_bytetobin(da2->mmio.font[da2->bitblt.srcaddr + 2]); - // print_bytetobin(da2->mmio.font[da2->bitblt.srcaddr + 3]); - // pclog("\n"); - if (da2->bitblt.x >= da2->bitblt.size_x - 1) { - // if (1) { - DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2); - if (da2->bitblt.y >= da2->bitblt.size_y - 3) { - da2->bitblt.exec = DA2_BLT_CDONE; - } - da2->bitblt.x = 0; + // if (da2->bitblt.reg[0x12] < 0x100) + // da2->bitblt.srcaddr = DA2_FONTROM_BASESBCS + da2->bitblt.reg[0x12] * 64 + (da2->bitblt.x * 2) + (da2->bitblt.y * 2) - 2; + // else + // da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2) + (da2->bitblt.y * 3) - 2; + da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; + da2->bitblt.size_x = da2->bitblt.reg[0x33]; + pclog("scr %x dest %x x %x y %x\n", da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y); + if (da2->bitblt.y >= da2->bitblt.size_y) { + da2->bitblt.exec = DA2_BLT_CDONE; + } else { + DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.size_x, da2->bitblt.fcolor, da2->bitblt.y, da2->bitblt.destaddr, da2->bitblt.maskl, da2->bitblt.maskr, da2); + } da2->bitblt.y++; da2->bitblt.destaddr += 130; - // da2->bitblt.destaddr += da2->bitblt.destpitch + 2; - // da2->bitblt.srcaddr += -1; - } else if (da2->bitblt.x == 0) { - DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2); - da2->bitblt.x++; - // da2->bitblt.x++; - } else { - DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2); - da2->bitblt.x++; - // da2->bitblt.x++; - } + // } // da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.x + da2->bitblt.y * 130 + 2; ////da2->bitblt.srcaddr += 2; // da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2 ) + (da2->bitblt.y * 3) + 2; break; case DA2_BLT_CDONE: - if (!(da2->bitblt.reg[0x20] & 0x20)) { - /* initialize regs and set magic value for debug dump */ - for (int i = 0; i < DA2_BLT_REGSIZE; i++) { - if (da2->bitblt.reg[i] != DA2_DEBUG_BLT_NEVERUSED) - da2->bitblt.reg[i] = DA2_DEBUG_BLT_USEDRESET; - } - } else /* without init regs */ + // if (!(da2->bitblt.reg[0x20] & 0x20)) { + // /* initialize regs and set magic value for debug dump */ + // for (int i = 0; i < DA2_BLT_REGSIZE; i++) { + // if (da2->bitblt.reg[i] != DA2_DEBUG_BLT_NEVERUSED) + // da2->bitblt.reg[i] = DA2_DEBUG_BLT_USEDRESET; + // } + // } else /* without init regs */ da2->bitblt.reg[0x20] = 0; /* need to stop execution */ if (da2->bitblt.indata) da2->bitblt.exec = DA2_BLT_CLOAD; @@ -1193,6 +1299,10 @@ da2_out(uint16_t addr, uint16_t val, void *p) da2->fctl[da2->fctladdr] = val; if (da2->fctladdr == 0 && oldval != val) { da2_iolog("DA2 Out FCTL addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->fctladdr, val, cs >> 4, cpu_state.pc); + } else if ((da2->fctladdr == LF_PD_RESET) && ((val & 0x7) == 7)) { + /* Reset Bitblt busy */ + da2->bitblt.indata = 0; + da2->bitblt.exec = DA2_BLT_CIDLE; } break; case LC_INDEX: @@ -1214,10 +1324,12 @@ da2_out(uint16_t addr, uint16_t val, void *p) val = 0; break; case LC_START_ADDRESS_HIGH: + // if (val == 0xff) /* adjust (need to confirm) */ + // val = 0; case LC_START_ADDRESS_LOW: /* The DOS J4.0 MODE 4 command and OS/2 driver write 0xFF00. OS/2 DOS MODE 1 setup reads this to set the base line, but it causes the screen glitch. */ - val = 0; + // val = 0; break; case LC_VERTICAL_TOTALJ: /* Vertical Total */ case LC_VERTICAL_SYNC_START: /* Vertical Retrace Start Register */ @@ -1227,25 +1339,21 @@ da2_out(uint16_t addr, uint16_t val, void *p) val = 0x400; /* for debugging bitblt in Win 3.x */ #endif break; - case LC_VIEWPORT_SELECT: /* ViewPort Select? */ - // return; - break; - case LC_VIEWPORT_NUMBER: /* Compatibility? */ - break; } da2->crtc[da2->crtcaddr] = val; switch (da2->crtcaddr) { case LC_H_DISPLAY_ENABLE_END: case LC_VERTICAL_TOTALJ: case LC_MAXIMUM_SCAN_LINE: - // case LC_START_ADDRESS_HIGH: - // case LC_START_ADDRESS_LOW: + case LC_START_ADDRESS_HIGH: + case LC_START_ADDRESS_LOW: case LC_VERTICAL_SYNC_START: case LC_V_DISPLAY_ENABLE_END: case LC_START_VERTICAL_BLANK: case LC_START_H_DISPLAY_ENAB: case LC_START_V_DISPLAY_ENAB: case LC_VIEWPORT_PRIORITY: + case LC_LINE_COMPAREJ: da2->fullchange = changeframecount; da2_recalctimings(da2); break; @@ -1432,7 +1540,7 @@ da2_in(uint16_t addr, void *p) // timer_advance_u64(&da2->bitblt.timer, da2->bitblt.timerspeed); // } } - if (da2->bitblt.indata) temp |= 0x08; + // if (da2->bitblt.indata) temp |= 0x08; #ifdef ENABLE_DA2_DEBUGMONWAIT da2_iolog("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->ioctladdr, temp, cs >> 4, cpu_state.pc); #endif @@ -1464,6 +1572,10 @@ da2_in(uint16_t addr, void *p) da2->cgastat &= ~0x30; else da2->cgastat ^= 0x30; /* toggle */ + if (da2->cgastat & 0x08) + da2->cgastat &= ~0x08; + else + da2->cgastat ^= 0x08; /* toggle */ temp = da2->cgastat; } else temp = da2->attrc[da2->attraddr]; @@ -1496,7 +1608,7 @@ static void da2_outb(uint16_t addr, uint8_t val, void *p) { da2_t *da2 = (da2_t *) p; - // da2_iolog("DA2 Outb addr %03X val %02X %04X:%04X es:di=%x:%x ds:si=%x:%x\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI); + da2_iolog("DA2 Outb addr %03X val %02X %04X:%04X es:di=%x:%x ds:si=%x:%x\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI); da2->inflipflop = 0; switch (addr) { case LS_DATA: @@ -2195,17 +2307,18 @@ da2_recalctimings(da2_t *da2) double crtcconst; double _dispontime, _dispofftime, disptime; - /* if output disabled or VGA passthrough */ - if (da2->ioctl[LS_MODE] & 0x02 || !(da2->attrc[LV_COMPATIBILITY] & 0x08)) { - da2->render = da2_render_blank; - return; - } + // /* if output disabled or VGA passthrough */ + // if (da2->ioctl[LS_MODE] & 0x02 || !(da2->attrc[LV_COMPATIBILITY] & 0x08)) { + // da2->render = da2_render_blank; + // return; + // } da2->vtotal = da2->crtc[LC_VERTICAL_TOTALJ] & 0xfff; da2->dispend = da2->crtc[LC_V_DISPLAY_ENABLE_END] & 0xfff; da2->vsyncstart = da2->crtc[LC_VERTICAL_SYNC_START] & 0xfff; da2->split = da2->crtc[LC_LINE_COMPAREJ] & 0xfff; - da2->split = 0xfff; + da2->split -= 1; + // da2->split = 0xfff; da2->vblankstart = da2->crtc[LC_START_VERTICAL_BLANK] & 0xfff; da2->hdisp = da2->crtc[LC_H_DISPLAY_ENABLE_END]; @@ -2225,17 +2338,23 @@ da2_recalctimings(da2_t *da2) // da2->interlace = 0; - // da2->ma_latch = ((da2->crtc[LC_START_ADDRESS_HIGH] & 0x3ff) << 8) | da2->crtc[LC_START_ADDRESS_LOW];//w + b + if (da2->crtc[LC_VIEWPORT_SELECT] & 0x80 || da2->split == 0) + da2->ma_latch = 0; + else + da2->ma_latch = ((da2->crtc[LC_START_ADDRESS_HIGH] & 0x3ff) << 8) | da2->crtc[LC_START_ADDRESS_LOW]; // w + b + da2->ca_adj = 0; - da2->rowcount = da2->crtc[LC_MAXIMUM_SCAN_LINE]; - da2->hdisp_time = da2->hdisp; da2->render = da2_render_blank; /* determine display mode */ // if (da2->attr_palette_enable && (da2->attrc[0x1f] & 0x08)) + /* if output disabled or VGA passthrough */ + if (da2->ioctl[LS_MODE] & 0x02 || !(da2->attrc[LV_COMPATIBILITY] & 0x08)) { + da2->render = da2_render_blank; + // return; /* 16 color graphics mode */ - if (!(da2->ioctl[LS_MODE] & 0x01)) { + } else if (!(da2->ioctl[LS_MODE] & 0x01)) { da2->hdisp *= 16; da2->char_width = 13; if (da2->crtc[LC_VIEWPORT_PRIORITY] & 0x80) { @@ -2294,7 +2413,7 @@ da2_recalctimings(da2_t *da2) da2_log("da2 horiz total %i display end %i vidclock %f\n", da2->crtc[0], da2->crtc[1], da2->clock); da2_log("da2 vert total %i display end %i max row %i vsync %i\n",da2->vtotal,da2->dispend,(da2->crtc[9]&31)+1,da2->vsyncstart); da2_log("da2 dispon %lu dispoff %lu on(us) %f off(us) %f\n",da2->dispontime, da2->dispofftime, (double)da2->dispontime / (double)cpuclock / (double) (1ULL << 32) * 1000000.0, (double)da2->dispofftime / (double)cpuclock / (double) (1ULL << 32) * 1000000.0); - // da2_log("da2->render %08X\n", da2->render); + da2_log("da2 linecompare %d\n", da2->split); } static void @@ -2452,7 +2571,7 @@ da2_mmio_read(uint32_t addr, void *p) uint32_t index = da2->fctl[LF_MMIO_MODE] & 0x0f; index <<= 8; index |= da2->fctl[LF_MMIO_ADDR]; - addr += index * 0x40; + addr += index * 0x80; } // da2_log("PS55_MemHnd: Read from mem %x, bank %x, addr %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr); switch (da2->fctl[LF_MMIO_MODE] & 0xf0) { @@ -2475,6 +2594,7 @@ da2_mmio_read(uint32_t addr, void *p) return da2->mmio.font[addr]; break; default: + da2_log("PS55_MemHnd: Invalid read mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 72, addr, da2->mmio.font[addr]); return DA2_INVALIDACCESS8; /* invalid memory access */ break; } @@ -2549,35 +2669,56 @@ da2_mmio_readw(uint32_t addr, void *p) return (uint16_t) da2_mmio_read(addr, da2) | (uint16_t) (da2_mmio_read(addr + 1, da2) << 8); } } - +static void +da2_bitblt_addpayload(uint8_t val, void *p) +{ + da2_t *da2 = (da2_t *) p; + da2->bitblt.indata = 1; + if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE) + da2_log("da2_mmio_write payload overflow! addr %x, val %x\n", da2->bitblt.payload_addr, val); + else { + da2->bitblt.payload[da2->bitblt.payload_addr] = val; + da2->bitblt.payload_addr++; + } +} static void da2_mmio_write(uint32_t addr, uint8_t val, void *p) { da2_t *da2 = (da2_t *) p; + uint32_t index = 0; // da2_log("da2_mmio_write %x %x\n", addr, val); // if ((addr & ~DA2_MASK_MMIO) != 0xA0000) // return; addr &= DA2_MASK_MMIO; - if (da2->ioctl[LS_MMIO] & 0x10) { + if (da2->ioctl[LS_MMIO] == 0x1f) {/* write bitblt fifo data */ + da2_bitblt_addpayload(val, da2); + } + else if (da2->ioctl[LS_MMIO] & 0x10) { /* access to gaiji ram */ // if(da2->ioctl[LS_MMIO] == 0x1f) da2_log("mw mem %x, addr %x, val %x, ESDI %x:%x DSSI %x:%x\n", da2->fctl[LF_MMIO_MODE], addr, val, ES, DI, DS, SI); /* Gaiji RAM */ if (da2->fctl[LF_MMIO_SEL] == 0x80) addr |= ((uint32_t) da2->fctl[LF_MMIO_ADDR] << 17); /* xxxy yyyy yyyy yyyy yyyy */ - else { - uint32_t index = da2->fctl[LF_MMIO_MODE] & 0x0f; + else { + index = da2->fctl[LF_MMIO_MODE] & 0x0f; index <<= 8; index |= da2->fctl[LF_MMIO_ADDR]; - addr += index * 0x40; + // addr += index * 0x40; + // addr += index * 0x80; + // da2_log("da2_mmio_w io %x, sl %x, 09 %x, ad %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO],da2->fctl[LF_MMIO_SEL], + // da2->fctl[LF_MMIO_09],da2->fctl[LF_MMIO_ADDR], da2->fctl[LF_MMIO_MODE], addr, val); } - switch (da2->fctl[LF_MMIO_MODE]) { - case 0xb0: /* Gaiji RAM 1011 0000 */ + switch (da2->fctl[LF_MMIO_MODE] & 0xf0) { + case 0xb0: /* Gaiji RAM 1011 0000 */ + addr += index * 0x80; da2->mmio.ram[addr & DA2_MASK_GAIJIRAM] = val; break; case 0x10: /* Font ROM 0001 0000 */ /* Read-Only */ break; - case 0x00: + case 0x00: /* SBCS in Gaiji RAM (used by DOS/V Extension DSPXDA2 driver) */ + addr += index * 0x40; + da2->mmio.ram[(DA2_GAIJIRAM_SBCS + addr) & DA2_MASK_GAIJIRAM] = val; // da2_log("da2_mmio_write %x %x %04X:%04X\n", addr, val, CS, cpu_state.pc); // addr &= 0x7f;/* OS/2 write addr 1cf80-1cfc3, val xx */ // if (addr >= DA2_BLT_MEMSIZE) @@ -2585,16 +2726,9 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p) // da2_log("da2_mmio_write failed mem %x, addr %x, val %x\n", da2->fctl[LF_MMIO_MODE], addr, val); // return; // } - da2->bitblt.indata = 1; - if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE) - da2_log("da2_mmio_write payload overflow! mem %x, addr %x, val %x\n", da2->fctl[LF_MMIO_MODE], addr, val); - else { - da2->bitblt.payload[da2->bitblt.payload_addr] = val; - da2->bitblt.payload_addr++; - } break; default: - da2_log("da2_mmio_write failed mem %x, addr %x, val %x\n", da2->fctl[LF_MMIO_MODE], addr, val); + da2_log("da2_mmio_write failed io %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO] ,da2->fctl[LF_MMIO_MODE], addr, val); break; } } else if (!(da2->ioctl[LS_MODE] & 1)) { /* 16 color or 256 color mode */ @@ -2802,15 +2936,21 @@ da2_mmio_writew(uint32_t addr, uint16_t val, void *p) // return; // if ((addr & ~0x1ffff) != 0xA0000) return; if (da2->ioctl[LS_MMIO] & 0x10) { - // da2_log("da2_mmio_writeW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val); +#ifdef ENABLE_DA2_DEBUGVRAM + da2_log("da2_mmio_writeW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val); +#endif da2_mmio_write(addr, val & 0xff, da2); da2_mmio_write(addr + 1, val >> 8, da2); } else if (!(da2->ioctl[LS_MODE] & 1)) { /* 16 color or 256 color mode */ - // da2_log("da2_mmio_writeGW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val); +#ifdef ENABLE_DA2_DEBUGVRAM + da2_log("da2_mmio_writeGW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val); +#endif da2_mmio_gc_writeW(addr, val, da2); } else { /* mode 3h text */ +#ifdef ENABLE_DA2_DEBUGVRAM // if (addr & 0xff00 == 0) da2_log("da2_mmio_write %x %x %04X:%04X\n", addr, val, CS, cpu_state.pc); - // da2_log("da2_mmio_writeGW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val); + da2_log("da2_mmio_write3W %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val); +#endif da2_mmio_write(addr, val & 0xff, da2); da2_mmio_write(addr + 1, val >> 8, da2); } @@ -2836,7 +2976,7 @@ da2_code_writeb(uint32_t addr, uint8_t val, void *p) static void da2_code_writew(uint32_t addr, uint16_t val, void *p) { - // da2_log("DA2_code_writew: Write to %x, val %x\n", addr, val); + // da2_log("DA2_code_writ ew: Write to %x, val %x\n", addr, val); da2_t *da2 = (da2_t *) p; cycles -= video_timing_write_w; da2_code_write(addr, val & 0xff, da2); @@ -2945,8 +3085,6 @@ da2_poll(void *priv) da2->sc = 0; da2->maback += (da2->rowoffset << 1); /* color = 0x50(80), mono = 0x40(64) */ - if (da2->interlace) - da2->maback += (da2->rowoffset << 1); da2->maback &= da2->vram_display_mask; da2->ma = da2->maback; } else { @@ -2959,6 +3097,13 @@ da2_poll(void *priv) da2->vc++; da2->vc &= 2047; + if (da2->vc == da2->split) { + // da2->ma = da2->maback = da2->hblank_sub; + da2->ma = da2->maback = 0; + da2->sc = 0; + // da2->displine = 0; + } + if (da2->vc == da2->dispend) { da2->dispon = 0; // if (da2->crtc[10] & 0x20) da2->cursoron = 0; @@ -3002,13 +3147,11 @@ da2_poll(void *priv) da2->firstline_draw = 2000; da2->lastline_draw = 0; - da2->oddeven ^= 1; - - changeframecount = da2->interlace ? 3 : 2; + changeframecount = 2; da2->vslines = 0; da2->ma - = da2->maback = da2->ma_latch; + = da2->maback = da2->ma_latch << 1; da2->ca = ((da2->crtc[LC_CURSOR_LOC_HIGH] << 8) | da2->crtc[LC_CURSOR_LOC_LOWJ]) + da2->ca_adj; da2->ca <<= 1; @@ -3020,7 +3163,7 @@ da2_poll(void *priv) da2->vc = 0; da2->sc = da2->crtc[LC_PRESET_ROW_SCANJ] & 0x1f; da2->dispon = 1; - da2->displine = (da2->interlace && da2->oddeven) ? 1 : 0; + da2->displine = 0; da2->scrollcache = da2->attrc[LV_PANNING] & 7; } if (da2->sc == (da2->crtc[LC_CURSOR_ROW_START] & 31)) @@ -3111,7 +3254,6 @@ da2_reset(void *priv) da2->crtc[LC_HORIZONTAL_TOTAL] = 63; /* Horizontal Total */ da2->crtc[LC_VERTICAL_TOTALJ] = 255; /* Vertical Total (These two must be set before the timer starts.) */ da2->ma_latch = 0; - da2->interlace = 0; da2->attrc[LV_CURSOR_CONTROL] = 0x13; /* cursor options */ da2->attr_palette_enable = 0; /* disable attribute generator */ @@ -3245,6 +3387,12 @@ da2_close(void *p) fprintf(f, "3ee(?) %02X: %4X\n", i, da2->reg3ee[i]); fclose(f); } + f = fopen("ram_low.dmp", "wb"); + if (f != NULL) { + fwrite(&ram[0x0], 0x100000, 1, f); + fclose(f); + } + pclog("closed %04X:%04X DS %04X\n", cs >> 4, cpu_state.pc, DS); #endif #ifdef ENABLE_DA2_DEBUGBLT f = fopen("da2_bltdump.csv", "w"); @@ -3262,8 +3410,16 @@ da2_close(void *p) ; else if (da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y] == DA2_DEBUG_BLT_USEDRESET) fprintf(f, "\"\"\t"); - else + else { fprintf(f, "\"%X\"\t", da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y]); + if (y == 0x12) { + int chr = da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + 0x12]; + if ((chr >= 0x20) && (chr < 0x7f)) + fprintf(f, "\"%c\"\t", chr); + else + fprintf(f, "\"\"\t"); + } + } } fprintf(f, "\n"); } From 837f86a291e5bf696cd327b01a6d544901e052f4 Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Thu, 3 Apr 2025 22:17:24 +0900 Subject: [PATCH 056/118] PS55DA2: Parse Bitblt data sequential --- src/video/vid_ps55da2.c | 212 +++++++++++++++++++++++----------------- 1 file changed, 124 insertions(+), 88 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 1875726b5..613eb5888 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -66,7 +66,7 @@ #define DA2_MASK_VRAM 0xfffff /* 0xFFFFF */ #define DA2_MASK_VRAMPLANE 0x1ffff /* 0x1FFFF */ #define DA2_PIXELCLOCK 29000000.0 /* 58 MHz interlaced */ -#define DA2_BLT_MEMSIZE 0x1000 +#define DA2_BLT_MEMSIZE 0x10 #define DA2_BLT_REGSIZE 0x40 #define DA2_DEBUG_BLTLOG_SIZE (DA2_BLT_REGSIZE + 1) #define DA2_DEBUG_BLTLOG_MAX (256 * 1024) @@ -264,7 +264,7 @@ #endif #ifdef ENABLE_DA2_LOG -// # define ENABLE_DA2_DEBUGIO 1 +# define ENABLE_DA2_DEBUGIO 1 # define ENABLE_DA2_DEBUGBLT 1 // # define ENABLE_DA2_DEBUGVRAM 1 // # define ENABLE_DA2_DEBUGFULLSCREEN 1 @@ -292,6 +292,12 @@ da2_log(const char *fmt, ...) #endif #ifdef ENABLE_DA2_DEBUGBLT # define da2_bltlog da2_log +# define ENABLE_DA2_DEBUGBLT_DETAIL 1 +# ifdef ENABLE_DA2_DEBUGBLT_DETAIL +# define da2_bltreglog da2_log +# else +# define da2_bltreglog(fmt, ...) +# endif #else # define da2_bltlog(fmt, ...) #endif @@ -390,6 +396,7 @@ typedef struct da2_t { int raster_op; uint8_t payload[DA2_BLT_MEMSIZE]; int payload_addr; + int payload_opsize; int32_t reg[DA2_BLT_REGSIZE]; // must be signed int #ifdef ENABLE_DA2_DEBUGBLT int32_t *debug_reg; // for debug @@ -643,24 +650,24 @@ DA2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, ui // bg = IBGRtoIRGB(bg); uint32_t font = getFontIBMJ(codeIBMJ, line, 0, da2); uint32_t fontinv; - if (width == 1) { + if (width <= 2) { fontinv = ~font; for (int i = 0; i < 8; i++) { srcpx.p8[i] = (color & (1 << i)) ? font >> 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; } - pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); + // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); DA2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); for (int i = 0; i < 8; i++) { srcpx.p8[i] = (color & (1 << i)) ? font : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; } - pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); + // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); DA2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); } else { font = (font & 0xfff80000) | ((font & 0x0000ffff) << 3); fontinv = ~font; - pclog("putchar: ft %08X shftr %X\n", font, da2->bitblt.bitshift_destr); + // pclog("putchar: ft %08X shftr %X\n", font, da2->bitblt.bitshift_destr); for (int i = 0; i < 8; i++) { srcpx.p8[i] = (color & (1 << i)) ? font >> 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; @@ -752,106 +759,103 @@ IBMJtoSJIS(uint16_t knj) return knj; } #endif + static void -da2_bitblt_load(da2_t *da2) +da2_bitblt_parse(da2_t *da2) { uint32_t value32; uint64_t value64; #ifdef ENABLE_DA2_DEBUGBLT - da2_log("bltload: loading params\n"); - da2_log("BitBlt memory:\n"); - if (da2->bitblt.payload[0] != 0) - for (int j = 0; j < DA2_BLT_MEMSIZE / 8; j++) - { - int i = j * 8; - da2_log("%02x %02x %02x %02x %02x %02x %02x %02x \n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], da2->bitblt.payload[i + 2], da2->bitblt.payload[i + 3], - da2->bitblt.payload[i + 4], da2->bitblt.payload[i + 5], da2->bitblt.payload[i + 6], da2->bitblt.payload[i + 7]); - } + // da2_log("bltload: loading params\n"); + // da2_log("BitBlt memory:\n"); + // if (da2->bitblt.payload[0] != 0) + // for (int j = 0; j < DA2_BLT_MEMSIZE / 8; j++) { + // int i = j * 8; + // da2_log("%02x %02x %02x %02x %02x %02x %02x %02x \n", da2->bitblt.payload[i], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], + // da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7]); + // } #endif - int i = 0; - while (i < da2->bitblt.payload_addr) { - if (da2->bitblt.reg[0x20] & 0x1) - break; - switch (da2->bitblt.payload[i]) { + switch (da2->bitblt.payload[0]) { case 0x88: case 0x89: case 0x95: - value32 = da2->bitblt.payload[i + 3]; + value32 = da2->bitblt.payload[3]; value32 <<= 8; - value32 |= da2->bitblt.payload[i + 2]; - da2_bltlog("[%02x] %02x: %04x (%d)\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], value32, value32); - da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value32; - // da2->gdcreg[da2->bitblt.payload[i + 1]] = value32; - i += 3; + value32 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %04x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32); + da2->bitblt.reg[da2->bitblt.payload[1]] = value32; break; case 0x91: - value32 = da2->bitblt.payload[i + 5]; + value32 = da2->bitblt.payload[5]; value32 <<= 8; - value32 |= da2->bitblt.payload[i + 4]; + value32 |= da2->bitblt.payload[4]; value32 <<= 8; - value32 |= da2->bitblt.payload[i + 3]; + value32 |= da2->bitblt.payload[3]; value32 <<= 8; - value32 |= da2->bitblt.payload[i + 2]; - da2_bltlog("[%02x] %02x: %08x (%d)\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], value32, value32); - da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value32; - // da2->gdcreg[da2->bitblt.payload[i + 1]] = value32; - i += 5; + value32 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %08x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32); + da2->bitblt.reg[da2->bitblt.payload[1]] = value32; break; case 0x99: - value64 = da2->bitblt.payload[i + 7]; + value64 = da2->bitblt.payload[7]; value64 <<= 8; - value64 = da2->bitblt.payload[i + 6]; + value64 = da2->bitblt.payload[6]; value64 <<= 8; - value64 = da2->bitblt.payload[i + 5]; + value64 = da2->bitblt.payload[5]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 4]; + value64 |= da2->bitblt.payload[4]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 3]; + value64 |= da2->bitblt.payload[3]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 2]; - da2_bltlog("[%02x] %02x: %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], da2->bitblt.payload[i + 2], da2->bitblt.payload[i + 3], - da2->bitblt.payload[i + 4], da2->bitblt.payload[i + 5], da2->bitblt.payload[i + 6], da2->bitblt.payload[i + 7]); - da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value64; - // da2->gdcreg[da2->bitblt.payload[i + 1]] = value64; - i += 7; + value64 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], + da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7]); + da2->bitblt.reg[da2->bitblt.payload[1]] = value64; break; case 0xa1: - value64 = da2->bitblt.payload[i + 9]; + value64 = da2->bitblt.payload[9]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 8]; + value64 |= da2->bitblt.payload[8]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 7]; + value64 |= da2->bitblt.payload[7]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 6]; + value64 |= da2->bitblt.payload[6]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 5]; + value64 |= da2->bitblt.payload[5]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 4]; + value64 |= da2->bitblt.payload[4]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 3]; + value64 |= da2->bitblt.payload[3]; value64 <<= 8; - value64 |= da2->bitblt.payload[i + 2]; - da2_bltlog("[%02x] %02x: %02x %02x %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], da2->bitblt.payload[i + 2], da2->bitblt.payload[i + 3], - da2->bitblt.payload[i + 4], da2->bitblt.payload[i + 5], da2->bitblt.payload[i + 6], da2->bitblt.payload[i + 7], da2->bitblt.payload[i + 8], da2->bitblt.payload[i + 9]); - da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value64; - i += 9; + value64 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], + da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7], da2->bitblt.payload[8], da2->bitblt.payload[9]); + da2->bitblt.reg[da2->bitblt.payload[1]] = value64; break; - case 0x00: + case 0x00: /* Win 3.0 Clock writes invalid zero data. */ break; default: da2_log("bltload: Unknown PreOP!\n"); break; } - i++; + if (da2->bitblt.reg[0x20] & 0x01) { /* Execute Bitblt immediately (for OS/2 J1.3) */ + da2->bitblt.exec = DA2_BLT_CLOAD; + da2_bitblt_exec(da2); } - da2->bitblt.exec = DA2_BLT_CIDLE; /* clear payload memory */ memset(da2->bitblt.payload, 0x00, DA2_BLT_MEMSIZE); da2->bitblt.payload_addr = 0; + da2->bitblt.indata = 0; +} + +static void +da2_bitblt_load(da2_t *da2) +{ /* [89] 20: 0001 (1) then execute payload */ - if (da2->bitblt.reg[0x20] & 0x1) { + // if (da2->bitblt.reg[0x20] & 0x1) { + da2->bitblt.reg[0x20] = 0; /* need to stop execution */ #ifdef ENABLE_DA2_DEBUGBLT - for (i = 0; i < DA2_DEBUG_BLTLOG_SIZE; i++) { + for (int i = 0; i < DA2_DEBUG_BLTLOG_SIZE; i++) { da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip + i] = da2->bitblt.reg[i]; } da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * (da2->bitblt.debug_reg_ip + 1) - 1] = 0; @@ -860,7 +864,6 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.debug_reg_ip = 0; da2->bitblt.debug_exesteps = 0; #endif - da2_log("bltload_exec: %x, rop: %x CS:PC=%4x:%4x\n", da2->bitblt.reg[0x5], da2->bitblt.reg[0xb], CS, cpu_state.pc); da2->bitblt.bitshift_destr = ((da2->bitblt.reg[0x03] >> 4) & 0x0f); /* set bit shift */ da2->bitblt.raster_op = da2->bitblt.reg[0x0b]; da2->bitblt.destaddr = da2->bitblt.reg[0x29]; @@ -869,7 +872,11 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.destpitch = da2->bitblt.reg[0x21]; da2->bitblt.srcpitch = da2->bitblt.reg[0x22]; /* 80h = 128d = 10000000b, 90h = 144d = 10010000b, B0h = 176d = 10110000 */ - if (da2->bitblt.reg[0x2F] == 0x90) /* destaddr -= 2, length += 1; */ + /* + DOS/V Extension 1040x725 some DBCS uses 0xB0 others 0x90 + B0: BitShift is 1-6 + */ + if (da2->bitblt.reg[0x2F] & 0x10) /* destaddr -= 2, length += 1; */ { da2->bitblt.destaddr -= 2; da2->bitblt.size_x += 1; @@ -897,7 +904,7 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.fcolor = da2->bitblt.reg[0x1]; da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; da2->bitblt.destaddr += 2; - da2->bitblt.srcpitch = 0; + // da2->bitblt.srcpitch = 0; #ifdef ENABLE_DA2_DEBUGBLT uint8_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8; uint8_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff; @@ -914,6 +921,11 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), da2->bitblt.size_x, da2->bitblt.size_y, sjis_h, sjis_l); +#else +da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d\n", + da2->bitblt.srcaddr, da2->bitblt.destaddr, + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y); #endif } /* Draw a line */ @@ -1002,17 +1014,19 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.size_x, da2->bitblt.size_y); // da2_log(" mask8=%x, mask9=%x\n", da2->bitblt.reg[0x8], da2->bitblt.reg[0x9]); } - } + // } } static void da2_bitblt_exec(void *p) { da2_t *da2 = (da2_t *) p; // timer_set_delay_u64(&da2->bitblt.timer, da2->bitblt.timerspeed); -#ifdef ENABLE_DA2_DEBUGBLT +#ifdef ENABLE_DA2_DEBUGBLT_DETAIL if(!(da2->bitblt.debug_exesteps & 0xff)) da2_log("bitblt_exec: %d %d\n", da2->bitblt.exec, da2->bitblt.debug_exesteps); da2->bitblt.debug_exesteps++; +#else + da2_log("bltload_exec: %x, CS:PC=%4x:%4x\n", da2->bitblt.exec, CS, cpu_state.pc); #endif switch (da2->bitblt.exec) { case DA2_BLT_CIDLE: @@ -1020,7 +1034,7 @@ da2_bitblt_exec(void *p) break; case DA2_BLT_CLOAD: da2_bitblt_load(da2); - da2->bitblt.indata = 0; + // da2->bitblt.indata = 0; break; case DA2_BLT_CLINE: /* Draw a dot */ @@ -1160,22 +1174,22 @@ da2_bitblt_exec(void *p) da2->bitblt.srcaddr -= 2; break; case DA2_BLT_CPUTCHAR: /* used in OS/2 J1.3 wo ROM patch. TODO: still not work */ - da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.y * 130; + // da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.y * 130; // da2->bitblt.srcaddr += 2; // if (da2->bitblt.reg[0x12] < 0x100) // da2->bitblt.srcaddr = DA2_FONTROM_BASESBCS + da2->bitblt.reg[0x12] * 64 + (da2->bitblt.x * 2) + (da2->bitblt.y * 2) - 2; // else // da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2) + (da2->bitblt.y * 3) - 2; - da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; - da2->bitblt.size_x = da2->bitblt.reg[0x33]; - pclog("scr %x dest %x x %x y %x\n", da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y); + // da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; + // da2->bitblt.size_x = da2->bitblt.reg[0x33]; + // pclog("scr %x dest %x x %x y %x\n", da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y); if (da2->bitblt.y >= da2->bitblt.size_y) { da2->bitblt.exec = DA2_BLT_CDONE; } else { DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.size_x, da2->bitblt.fcolor, da2->bitblt.y, da2->bitblt.destaddr, da2->bitblt.maskl, da2->bitblt.maskr, da2); } da2->bitblt.y++; - da2->bitblt.destaddr += 130; + da2->bitblt.destaddr += da2->bitblt.size_x * 2 + da2->bitblt.destpitch + 2; // } // da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.x + da2->bitblt.y * 130 + 2; ////da2->bitblt.srcaddr += 2; @@ -1189,10 +1203,9 @@ da2_bitblt_exec(void *p) // da2->bitblt.reg[i] = DA2_DEBUG_BLT_USEDRESET; // } // } else /* without init regs */ - da2->bitblt.reg[0x20] = 0; /* need to stop execution */ - if (da2->bitblt.indata) - da2->bitblt.exec = DA2_BLT_CLOAD; - else + // if (da2->bitblt.indata) + // da2->bitblt.exec = DA2_BLT_CLOAD; + // else da2->bitblt.exec = DA2_BLT_CIDLE; break; } @@ -1206,7 +1219,7 @@ da2_bitblt_dopayload(void *priv) if (da2->bitblt.exec != DA2_BLT_CIDLE) { while (da2->bitblt.exec != DA2_BLT_CIDLE) /* this disables async operation */ da2_bitblt_exec(da2); - } else if (da2->bitblt.indata && !(da2->ioctl[LS_MMIO] & 0x10) && (da2->bitblt.exec == DA2_BLT_CIDLE)) { + } else if ((da2->bitblt.reg[0x20] & 0x01) && (da2->bitblt.exec == DA2_BLT_CIDLE)) { da2->bitblt.exec = DA2_BLT_CLOAD; da2_bitblt_exec(da2); } else { @@ -1532,13 +1545,7 @@ da2_in(uint16_t addr, void *p) // if (da2->bitblt.indata) /* for OS/2 J1.3 command prompt scrolling */ // da2_bitblt_dopayload(da2); if (da2->bitblt.exec != DA2_BLT_CIDLE) { - // da2_iolog("exec:%x\n", da2->bitblt.exec); - temp |= 0x01; /* wait (bit 3 + bit 0) ? need verify */ - // if (!da2->bitblt.timer.enabled) - //{ - // da2_iolog("bitblt timer restarted!! %04X:%04X\n", cs >> 4, cpu_state.pc); - // timer_advance_u64(&da2->bitblt.timer, da2->bitblt.timerspeed); - // } + temp |= 0x09; /* wait (bit 3 + bit 0) ? need verify */ } // if (da2->bitblt.indata) temp |= 0x08; #ifdef ENABLE_DA2_DEBUGMONWAIT @@ -2677,8 +2684,37 @@ da2_bitblt_addpayload(uint8_t val, void *p) if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE) da2_log("da2_mmio_write payload overflow! addr %x, val %x\n", da2->bitblt.payload_addr, val); else { - da2->bitblt.payload[da2->bitblt.payload_addr] = val; - da2->bitblt.payload_addr++; + if (da2->bitblt.payload_addr == 0) { + da2->bitblt.payload[da2->bitblt.payload_addr] = val; + da2->bitblt.payload_addr++; + switch (val) { + case 0x88: + case 0x89: + case 0x95: + da2->bitblt.payload_opsize = 3; + break; + case 0x91: + da2->bitblt.payload_opsize = 5; + break; + case 0x99: + da2->bitblt.payload_opsize = 7; + break; + case 0xa1: + da2->bitblt.payload_opsize = 9; + break; + default: + da2_log("addpayload: Unknown PreOP! %x\n", val); + da2->bitblt.payload_addr = 0; /* ignore input */ + break; + } + } else if (da2->bitblt.payload_addr < da2->bitblt.payload_opsize) { + da2->bitblt.payload[da2->bitblt.payload_addr] = val; + da2->bitblt.payload_addr++; + } else if (da2->bitblt.payload_addr == da2->bitblt.payload_opsize) { + da2->bitblt.payload[da2->bitblt.payload_addr] = val; + da2->bitblt.payload_opsize = 0; /* reset */ + da2_bitblt_parse(da2); + } } } static void From b4f3e06c1ed4aa9d57768e548a6ce4c3d96acb7a Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Fri, 4 Apr 2025 08:23:32 +0900 Subject: [PATCH 057/118] PS55DA2: Fix some issues in DSPX and OS/2 dosbox --- src/video/vid_ps55da2.c | 96 +++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 23 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 613eb5888..52eccc575 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -307,7 +307,9 @@ typedef struct da2_t { uint8_t ioctl[16]; uint8_t fctl[32]; - uint16_t crtc[128]; + uint16_t crtc[32]; + uint16_t crtc_vpreg[128]; + uint8_t crtc_vpsel; uint8_t gdcreg[64]; uint8_t reg3ee[16]; int gdcaddr; @@ -420,6 +422,7 @@ typedef struct da2_t { int32_t maskl, maskr; int32_t count; int32_t d; + int8_t destoption; int octdir; int x, y, wx1, wx2, wy1, wy2; } bitblt; @@ -679,13 +682,17 @@ DA2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, ui srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; } // pclog("putchar: %08X mask %04X\n", srcpx.p8[3], maskr); - DA2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2); - for (int i = 0; i < 8; i++) { - srcpx.p8[i] = (color & (1 << i)) ? font << 16 : 0; - srcpx.p8[i] |= (bg & (1 << i)) ? fontinv << 16 : 0; + if (da2->bitblt.destoption & 0x20) { + DA2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); + } else { + DA2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2); + for (int i = 0; i < 8; i++) { + srcpx.p8[i] = (color & (1 << i)) ? font << 16 : 0; + srcpx.p8[i] |= (bg & (1 << i)) ? fontinv << 16 : 0; + } + // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[3], maskl, maskr); + DA2_WritePlaneDataWithBitmask(destaddr + 4, maskr, &srcpx, da2); } - // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[3], maskl, maskr); - DA2_WritePlaneDataWithBitmask(destaddr + 4, maskr, &srcpx, da2); } } #ifdef ENABLE_DA2_DEBUGBLT @@ -876,7 +883,8 @@ da2_bitblt_load(da2_t *da2) DOS/V Extension 1040x725 some DBCS uses 0xB0 others 0x90 B0: BitShift is 1-6 */ - if (da2->bitblt.reg[0x2F] & 0x10) /* destaddr -= 2, length += 1; */ + da2->bitblt.destoption = da2->bitblt.reg[0x2F]; + if (da2->bitblt.destoption & 0x10) /* destaddr -= 2, length += 1; */ { da2->bitblt.destaddr -= 2; da2->bitblt.size_x += 1; @@ -1336,14 +1344,6 @@ da2_out(uint16_t addr, uint16_t val, void *p) if (!(da2->ioctl[LS_MODE] & 0x01)) /* 16 or 256 color graphics mode */ val = 0; break; - case LC_START_ADDRESS_HIGH: - // if (val == 0xff) /* adjust (need to confirm) */ - // val = 0; - case LC_START_ADDRESS_LOW: - /* The DOS J4.0 MODE 4 command and OS/2 driver write 0xFF00. - OS/2 DOS MODE 1 setup reads this to set the base line, but it causes the screen glitch. */ - // val = 0; - break; case LC_VERTICAL_TOTALJ: /* Vertical Total */ case LC_VERTICAL_SYNC_START: /* Vertical Retrace Start Register */ case LC_V_DISPLAY_ENABLE_END: /* Vertical Display End Register */ @@ -1352,8 +1352,36 @@ da2_out(uint16_t addr, uint16_t val, void *p) val = 0x400; /* for debugging bitblt in Win 3.x */ #endif break; + // case LC_START_ADDRESS_HIGH: + // if (val == 0xff) /* adjust (need to confirm) */ + // val = 0; + // case LC_START_ADDRESS_LOW: + // val = 0; + // break; } da2->crtc[da2->crtcaddr] = val; + switch (da2->crtcaddr) { + case LC_START_ADDRESS_HIGH: + case LC_START_ADDRESS_LOW: + /* The DOS J4.0 MODE 4 command and OS/2 driver write 0xFF00. + OS/2 DOS MODE 1 setup reads this to set the base line, but it causes the screen glitch. */ + outb(0x680, da2->crtc[LC_START_ADDRESS_LOW]); + outb(0x680, da2->crtc[LC_START_ADDRESS_HIGH]); + break; + case LC_VIEWPORT_SELECT: + /* backup some current crtc regs */ + for (int i = LC_START_ADDRESS_HIGH; i <= LC_START_ADDRESS_LOW; i++) { + da2->crtc_vpreg[(da2->crtc_vpsel * 0x20) + i] = da2->crtc[i]; + } + da2->crtc_vpsel = (val >> 6) & 3; + /* restore crtc regs */ + for (int i = LC_START_ADDRESS_HIGH; i <= LC_START_ADDRESS_LOW; i++) { + da2->crtc[i] = da2->crtc_vpreg[(da2->crtc_vpsel * 0x20) + i]; + } + break; + default: + break; + } switch (da2->crtcaddr) { case LC_H_DISPLAY_ENABLE_END: case LC_VERTICAL_TOTALJ: @@ -1363,10 +1391,11 @@ da2_out(uint16_t addr, uint16_t val, void *p) case LC_VERTICAL_SYNC_START: case LC_V_DISPLAY_ENABLE_END: case LC_START_VERTICAL_BLANK: + case LC_LINE_COMPAREJ: case LC_START_H_DISPLAY_ENAB: case LC_START_V_DISPLAY_ENAB: + case LC_VIEWPORT_SELECT: case LC_VIEWPORT_PRIORITY: - case LC_LINE_COMPAREJ: da2->fullchange = changeframecount; da2_recalctimings(da2); break; @@ -1567,7 +1596,11 @@ da2_in(uint16_t addr, void *p) case LC_DATA: if (da2->crtcaddr > 0x1f) return DA2_INVALIDACCESS16; - temp = da2->crtc[da2->crtcaddr]; + // if ((da2->crtcaddr == LC_START_ADDRESS_HIGH || da2->crtcaddr == LC_START_ADDRESS_LOW) + // & (da2->crtc[LC_VIEWPORT_SELECT] & 0x80)) + // temp = 0; + // else + temp = da2->crtc[da2->crtcaddr]; break; case LV_PORT: temp = da2->attraddr | da2->attr_palette_enable; @@ -2345,7 +2378,14 @@ da2_recalctimings(da2_t *da2) // da2->interlace = 0; - if (da2->crtc[LC_VIEWPORT_SELECT] & 0x80 || da2->split == 0) + // if (da2->crtc[LC_VIEWPORT_SELECT] & 0x80 || da2->split == 0) + if (da2->vtotal == 0) + da2->vtotal = da2->vsyncstart = da2->vblankstart = 256; + if (da2->htotal == 0) + da2->htotal = da2->dispend = da2->hdisp = 64; + if (da2->rowoffset == 0) + da2->rowoffset = 64 * 2; /* To avoid causing a DBZ error */ + if (da2->split == 0) da2->ma_latch = 0; else da2->ma_latch = ((da2->crtc[LC_START_ADDRESS_HIGH] & 0x3ff) << 8) | da2->crtc[LC_START_ADDRESS_LOW]; // w + b @@ -2568,6 +2608,7 @@ static uint8_t da2_mmio_read(uint32_t addr, void *p) { da2_t *da2 = (da2_t *) p; + uint32_t index = 0; addr &= DA2_MASK_MMIO; if (da2->ioctl[LS_MMIO] & 0x10) { if (da2->fctl[LF_MMIO_SEL] == 0x80) @@ -2575,14 +2616,14 @@ da2_mmio_read(uint32_t addr, void *p) addr |= ((uint32_t) da2->fctl[LF_MMIO_ADDR] << 17); else { /* 64k bank switch access */ - uint32_t index = da2->fctl[LF_MMIO_MODE] & 0x0f; + index = da2->fctl[LF_MMIO_MODE] & 0x0f; index <<= 8; index |= da2->fctl[LF_MMIO_ADDR]; - addr += index * 0x80; } // da2_log("PS55_MemHnd: Read from mem %x, bank %x, addr %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr); switch (da2->fctl[LF_MMIO_MODE] & 0xf0) { case 0xb0: /* Gaiji RAM */ + addr += index * 0x80; addr &= DA2_MASK_GAIJIRAM; /* safety access */ // da2_log("PS55_MemHnd_G: Read from mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 128, addr, da2->mmio.font[addr]); return da2->mmio.ram[addr]; @@ -2600,6 +2641,11 @@ da2_mmio_read(uint32_t addr, void *p) // da2_log("PS55_MemHnd: Read from mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 72, addr, da2->mmio.font[addr]); return da2->mmio.font[addr]; break; + case 0x00: /* SBCS in Gaiji RAM (used in the downward writing mode of DOS/V Extension) */ + addr += DA2_GAIJIRAM_SBCS + index * 0x40; + addr &= DA2_MASK_GAIJIRAM; + return da2->mmio.ram[addr]; + break; default: da2_log("PS55_MemHnd: Invalid read mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 72, addr, da2->mmio.font[addr]); return DA2_INVALIDACCESS8; /* invalid memory access */ @@ -2741,8 +2787,8 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p) index |= da2->fctl[LF_MMIO_ADDR]; // addr += index * 0x40; // addr += index * 0x80; - // da2_log("da2_mmio_w io %x, sl %x, 09 %x, ad %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO],da2->fctl[LF_MMIO_SEL], - // da2->fctl[LF_MMIO_09],da2->fctl[LF_MMIO_ADDR], da2->fctl[LF_MMIO_MODE], addr, val); + da2_log("da2_mmio_w io %x, sl %x, 09 %x, ad %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO],da2->fctl[LF_MMIO_SEL], + da2->fctl[LF_MMIO_09],da2->fctl[LF_MMIO_ADDR], da2->fctl[LF_MMIO_MODE], addr, val); } switch (da2->fctl[LF_MMIO_MODE] & 0xf0) { case 0xb0: /* Gaiji RAM 1011 0000 */ @@ -3421,6 +3467,10 @@ da2_close(void *p) fprintf(f, "3eb(gcr) %02X: %4X\n", i, da2->gdcreg[i]); for (int i = 0; i < 0x10; i++) fprintf(f, "3ee(?) %02X: %4X\n", i, da2->reg3ee[i]); + for (int i = 0; i < 0x20; i++) { + fprintf(f, "vp %02X: %4X %4X %4X %4X\n", i, + da2->crtc_vpreg[0 + i], da2->crtc_vpreg[0x20 + i], da2->crtc_vpreg[0x40 + i], da2->crtc_vpreg[0x60 + i]); + } fclose(f); } f = fopen("ram_low.dmp", "wb"); From beb417cc85b8e4e1d42f040a58351a6ab4824fcd Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Fri, 4 Apr 2025 08:55:14 +0900 Subject: [PATCH 058/118] PS55DA2: cleanup, remove unused code --- src/video/vid_ps55da2.c | 162 +++++++--------------------------------- 1 file changed, 26 insertions(+), 136 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 52eccc575..09e3471a5 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -490,20 +490,6 @@ getFontIBMJ(int32_t code, int line, int x, void *p) font <<= 8; font |= da2->mmio.ram[code + 1]; font <<= 16; - return font; - } - if ((code >= 0x8000) && (code <= 0x8183)) - code -= 0x6000; /* shift for IBM extended characters */ - if ((code < (DA2_FONTROM_SIZE / 72)) && (fline >= 0) && (fline < 24)) { /* DBCS 24x24 */ - code = (code * 72) + (fline * 3) + x; - // font = da2->mmio.font[code]; /* 0000 0000 0000 0000 0000 0000 1111 1111 */ - // font <<= 8; /* 0000 0000 0000 0000 1111 1111 0000 0000 */ - // font |= da2->mmio.font[code + 1] & 0xf0; /* 0000 0000 0000 0000 1111 1111 2222 0000 */ - // font <<= 3; /* 0000 0000 0000 0111 1111 1222 2000 0000 */ - // font |= da2->mmio.font[code + 1] & 0x0f; /* 0000 0000 0000 0111 1111 1222 2000 2222 */ - // font <<= 8; /* 0000 0111 1111 1222 2000 2222 0000 0000 */ - // font |= da2->mmio.font[code + 2]; /* 0000 0111 1111 1222 2000 2222 3333 3333 */ - // font <<= 4; /* 0111 1111 1222 2000 2222 3333 3333 0000 */ } else if ((code >= 0xb000) && (code <= 0xb75f)) { /* DBCS 26x29 */ /* convert code->address in gaiji memory */ code -= 0xb000; @@ -515,9 +501,7 @@ getFontIBMJ(int32_t code, int line, int x, void *p) font |= da2->mmio.ram[code + 2]; font <<= 8; font |= da2->mmio.ram[code + 3]; - // font <<= 16; - } else if (code > (DA2_FONTROM_SIZE / 72)) - font = 0xffffffffu; + } else font = 0; return font; @@ -594,7 +578,7 @@ Param Desc 01 Color 03 Bit Shift 04 Select plane? -05 Dir(1000h or 1100h) + Command?(40 or 48) +05 Direction (1000h or 1100h) + Command? (40 or 48) 08 Mask Left 09 Mask Right 0A Plane Mask? @@ -607,15 +591,19 @@ Param Desc 0-3 Bit op (0 None, 1 AND, 2 OR, 3 XOR) 0D 20 Exec (1) or Exec without reset regs? (21h) -21 ? -22 ? +21 Dest Pitch +22 Src Pitch 23 Tile W 28 Tile H 29 Dest Addr 2A Src Addr 2B Tile Addr -33 Size W -35 Size H +2D Octant for line drawing +2F Dest Write Option +32 wx1, Dest X +33 wx2, Size W +34 wy1, Dest Y +35 wy2, Size H */ static void DA2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2) @@ -642,55 +630,42 @@ static void DA2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, uint32_t destaddr, uint16_t maskl, uint16_t maskr, da2_t *da2) { pixel32 srcpx; - // if (codeIBMJ >= DA2_FONTROM_SIZE / 72) { - // da2_log("DA2 Putchar Addr Error %x\n", srcaddr); - // return; - // } - uint8_t color = (~attr >> 8) & 0x0f; - // color = IBGRtoIRGB(color); + uint8_t fg = (~attr >> 8) & 0x0f; uint8_t bg = (~attr >> 12) & 0x0f; - // bg = 0x00; - // bg = IBGRtoIRGB(bg); uint32_t font = getFontIBMJ(codeIBMJ, line, 0, da2); uint32_t fontinv; if (width <= 2) { fontinv = ~font; for (int i = 0; i < 8; i++) { - srcpx.p8[i] = (color & (1 << i)) ? font >> 16 : 0; + srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; } - // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); DA2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); for (int i = 0; i < 8; i++) { - srcpx.p8[i] = (color & (1 << i)) ? font : 0; + srcpx.p8[i] = (fg & (1 << i)) ? font : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; } - // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[0], maskl, maskr); DA2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); } else { font = (font & 0xfff80000) | ((font & 0x0000ffff) << 3); fontinv = ~font; - // pclog("putchar: ft %08X shftr %X\n", font, da2->bitblt.bitshift_destr); for (int i = 0; i < 8; i++) { - srcpx.p8[i] = (color & (1 << i)) ? font >> 16 : 0; + srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; } - // pclog("putchar: %08X mask %04X\n", srcpx.p8[3], maskl); DA2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); for (int i = 0; i < 8; i++) { - srcpx.p8[i] = (color & (1 << i)) ? font : 0; + srcpx.p8[i] = (fg & (1 << i)) ? font : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; } - // pclog("putchar: %08X mask %04X\n", srcpx.p8[3], maskr); if (da2->bitblt.destoption & 0x20) { DA2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); } else { DA2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2); for (int i = 0; i < 8; i++) { - srcpx.p8[i] = (color & (1 << i)) ? font << 16 : 0; + srcpx.p8[i] = (fg & (1 << i)) ? font << 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv << 16 : 0; } - // pclog("putchar: %08X mask %04X %04X\n", srcpx.p8[3], maskl, maskr); DA2_WritePlaneDataWithBitmask(destaddr + 4, maskr, &srcpx, da2); } } @@ -772,16 +747,6 @@ da2_bitblt_parse(da2_t *da2) { uint32_t value32; uint64_t value64; -#ifdef ENABLE_DA2_DEBUGBLT - // da2_log("bltload: loading params\n"); - // da2_log("BitBlt memory:\n"); - // if (da2->bitblt.payload[0] != 0) - // for (int j = 0; j < DA2_BLT_MEMSIZE / 8; j++) { - // int i = j * 8; - // da2_log("%02x %02x %02x %02x %02x %02x %02x %02x \n", da2->bitblt.payload[i], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], - // da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7]); - // } -#endif switch (da2->bitblt.payload[0]) { case 0x88: case 0x89: @@ -858,8 +823,6 @@ da2_bitblt_parse(da2_t *da2) static void da2_bitblt_load(da2_t *da2) { - /* [89] 20: 0001 (1) then execute payload */ - // if (da2->bitblt.reg[0x20] & 0x1) { da2->bitblt.reg[0x20] = 0; /* need to stop execution */ #ifdef ENABLE_DA2_DEBUGBLT for (int i = 0; i < DA2_DEBUG_BLTLOG_SIZE; i++) { @@ -878,10 +841,8 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.size_y = da2->bitblt.reg[0x35]; da2->bitblt.destpitch = da2->bitblt.reg[0x21]; da2->bitblt.srcpitch = da2->bitblt.reg[0x22]; - /* 80h = 128d = 10000000b, 90h = 144d = 10010000b, B0h = 176d = 10110000 */ /* DOS/V Extension 1040x725 some DBCS uses 0xB0 others 0x90 - B0: BitShift is 1-6 */ da2->bitblt.destoption = da2->bitblt.reg[0x2F]; if (da2->bitblt.destoption & 0x10) /* destaddr -= 2, length += 1; */ @@ -898,21 +859,12 @@ da2_bitblt_load(da2_t *da2) da2->bitblt.y = 0; da2->bitblt.exec = DA2_BLT_CDONE; - /* Put DBCS char used by OS/2 (i'm not sure what the condition is) */ + /* Put DBCS char used by OS/2 and DOS/V Extension */ if (!(da2->bitblt.reg[0xb] & 0x08)) { da2->bitblt.exec = DA2_BLT_CPUTCHAR; - /* Todo: addressing */ - // if (da2->bitblt.reg[0x2F] == 0x90) /* destaddr -= 2, length += 1; */ - //{ - // da2->bitblt.destaddr += 2; - // da2->bitblt.size_x -= 1; - // da2->bitblt.destpitch += 2; - // da2->bitblt.srcpitch += 2; - // } da2->bitblt.fcolor = da2->bitblt.reg[0x1]; da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; da2->bitblt.destaddr += 2; - // da2->bitblt.srcpitch = 0; #ifdef ENABLE_DA2_DEBUGBLT uint8_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8; uint8_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff; @@ -1020,9 +972,7 @@ da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d\n", da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2), da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), da2->bitblt.size_x, da2->bitblt.size_y); - // da2_log(" mask8=%x, mask9=%x\n", da2->bitblt.reg[0x8], da2->bitblt.reg[0x9]); } - // } } static void da2_bitblt_exec(void *p) @@ -1046,7 +996,6 @@ da2_bitblt_exec(void *p) break; case DA2_BLT_CLINE: /* Draw a dot */ - // outb(0x680, da2->bitblt.octdir); da2_bltlog("point: %d %d %d %d %d\n", da2->bitblt.x, da2->bitblt.y, da2->bitblt.d, da2->bitblt.x, da2->bitblt.y); int destaddr = da2->bitblt.y * (da2->rowoffset * 2) + da2->bitblt.x / 8; int pixelmask = da2->bitblt.x % 16; @@ -1061,7 +1010,6 @@ da2_bitblt_exec(void *p) ; else DA2_DrawColorWithBitmask(destaddr, da2->bitblt.fcolor, pixelmask, da2); - // da2_log("draw: %x %x %x\n", destaddr, da2->bitblt.fcolor, pixelmask); da2->bitblt.count++; /* calculate the next position with Bresenham's line algorithm */ @@ -1182,26 +1130,14 @@ da2_bitblt_exec(void *p) da2->bitblt.srcaddr -= 2; break; case DA2_BLT_CPUTCHAR: /* used in OS/2 J1.3 wo ROM patch. TODO: still not work */ - // da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.y * 130; - // da2->bitblt.srcaddr += 2; - // if (da2->bitblt.reg[0x12] < 0x100) - // da2->bitblt.srcaddr = DA2_FONTROM_BASESBCS + da2->bitblt.reg[0x12] * 64 + (da2->bitblt.x * 2) + (da2->bitblt.y * 2) - 2; - // else - // da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2) + (da2->bitblt.y * 3) - 2; - // da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; - // da2->bitblt.size_x = da2->bitblt.reg[0x33]; // pclog("scr %x dest %x x %x y %x\n", da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y); if (da2->bitblt.y >= da2->bitblt.size_y) { da2->bitblt.exec = DA2_BLT_CDONE; } else { - DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.size_x, da2->bitblt.fcolor, da2->bitblt.y, da2->bitblt.destaddr, da2->bitblt.maskl, da2->bitblt.maskr, da2); + DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.size_x, da2->bitblt.fcolor, da2->bitblt.y, da2->bitblt.destaddr, da2->bitblt.maskl, da2->bitblt.maskr, da2); } - da2->bitblt.y++; - da2->bitblt.destaddr += da2->bitblt.size_x * 2 + da2->bitblt.destpitch + 2; - // } - // da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.x + da2->bitblt.y * 130 + 2; - ////da2->bitblt.srcaddr += 2; - // da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2 ) + (da2->bitblt.y * 3) + 2; + da2->bitblt.y++; + da2->bitblt.destaddr += da2->bitblt.size_x * 2 + da2->bitblt.destpitch + 2; break; case DA2_BLT_CDONE: // if (!(da2->bitblt.reg[0x20] & 0x20)) { @@ -1352,12 +1288,6 @@ da2_out(uint16_t addr, uint16_t val, void *p) val = 0x400; /* for debugging bitblt in Win 3.x */ #endif break; - // case LC_START_ADDRESS_HIGH: - // if (val == 0xff) /* adjust (need to confirm) */ - // val = 0; - // case LC_START_ADDRESS_LOW: - // val = 0; - // break; } da2->crtc[da2->crtcaddr] = val; switch (da2->crtcaddr) { @@ -1406,7 +1336,6 @@ da2_out(uint16_t addr, uint16_t val, void *p) case LV_PORT: // da2_iolog("DA2 Out addr %03X val %02X ff %d %04X:%04X\n", addr, val, da2->attrff,cs >> 4, cpu_state.pc); if (!da2->attrff) { - // da2->attraddr = val & 31; da2->attraddr = val & 0x3f; if ((val & 0x20) != (da2->attr_palette_enable & 0x20)) { da2->fullchange = 3; @@ -1596,11 +1525,7 @@ da2_in(uint16_t addr, void *p) case LC_DATA: if (da2->crtcaddr > 0x1f) return DA2_INVALIDACCESS16; - // if ((da2->crtcaddr == LC_START_ADDRESS_HIGH || da2->crtcaddr == LC_START_ADDRESS_LOW) - // & (da2->crtc[LC_VIEWPORT_SELECT] & 0x80)) - // temp = 0; - // else - temp = da2->crtc[da2->crtcaddr]; + temp = da2->crtc[da2->crtcaddr]; break; case LV_PORT: temp = da2->attraddr | da2->attr_palette_enable; @@ -1699,9 +1624,6 @@ da2_outw(uint16_t addr, uint16_t val, void *p) break; case 0x3EC: // da2_iolog("DA2 Outw addr %03X val %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc); - da2_iolog(" "); - // val = rightRotate(val, 8); - // da2_out(LG_DATA, val, da2); da2_out(LG_DATA, val >> 8, da2); /* reset masks for compatibility with Win 3.1 solitaire */ if (da2->gdcaddr == LG_MODE) { @@ -2347,18 +2269,11 @@ da2_recalctimings(da2_t *da2) double crtcconst; double _dispontime, _dispofftime, disptime; - // /* if output disabled or VGA passthrough */ - // if (da2->ioctl[LS_MODE] & 0x02 || !(da2->attrc[LV_COMPATIBILITY] & 0x08)) { - // da2->render = da2_render_blank; - // return; - // } - da2->vtotal = da2->crtc[LC_VERTICAL_TOTALJ] & 0xfff; da2->dispend = da2->crtc[LC_V_DISPLAY_ENABLE_END] & 0xfff; da2->vsyncstart = da2->crtc[LC_VERTICAL_SYNC_START] & 0xfff; da2->split = da2->crtc[LC_LINE_COMPAREJ] & 0xfff; da2->split -= 1; - // da2->split = 0xfff; da2->vblankstart = da2->crtc[LC_START_VERTICAL_BLANK] & 0xfff; da2->hdisp = da2->crtc[LC_H_DISPLAY_ENABLE_END]; @@ -2374,21 +2289,16 @@ da2_recalctimings(da2_t *da2) da2->clock = da2->da2const; - // da2->lowres = da2->attrc[LV_MODE_CONTROL] & 0x40; - - // da2->interlace = 0; - - // if (da2->crtc[LC_VIEWPORT_SELECT] & 0x80 || da2->split == 0) if (da2->vtotal == 0) da2->vtotal = da2->vsyncstart = da2->vblankstart = 256; if (da2->htotal == 0) da2->htotal = da2->dispend = da2->hdisp = 64; if (da2->rowoffset == 0) da2->rowoffset = 64 * 2; /* To avoid causing a DBZ error */ - if (da2->split == 0) + if (da2->split == 0) /* To avoid a glitch in MODE 1 of OS/2 J1.3 DOSBox. */ da2->ma_latch = 0; else - da2->ma_latch = ((da2->crtc[LC_START_ADDRESS_HIGH] & 0x3ff) << 8) | da2->crtc[LC_START_ADDRESS_LOW]; // w + b + da2->ma_latch = ((da2->crtc[LC_START_ADDRESS_HIGH] & 0x3ff) << 8) | da2->crtc[LC_START_ADDRESS_LOW]; da2->ca_adj = 0; da2->rowcount = da2->crtc[LC_MAXIMUM_SCAN_LINE]; @@ -2427,15 +2337,6 @@ da2_recalctimings(da2_t *da2) da2->hdisp *= 13; da2->char_width = 13; } - // if (!da2->scrblank && da2->attr_palette_enable) - //{ - // da2->render = da2_draw_text; - //} - - // da2_log("da2_render %08X : %08X %08X %08X %08X %08X %i %i %02X %i %i\n", da2_render, da2_render_text_40, da2_render_text_80, da2_render_8bpp_lowres, da2_render_8bpp_highres, da2_render_blank, scrblank,gdcreg[6]&1,gdcreg[5]&0x60,bpp,seqregs[1]&8); - - // if (da2->recalctimings_ex) - // da2->recalctimings_ex(da2); if (da2->vblankstart < da2->dispend) da2->dispend = da2->vblankstart; @@ -2446,7 +2347,7 @@ da2_recalctimings(da2_t *da2) _dispontime = da2->hdisp_time; da2_log("Disptime %f dispontime %f hdisp %i\n", disptime, _dispontime, da2->hdisp); - // if (da2->seqregs[1] & 8) { disptime *= 2; _dispontime *= 2; } + _dispofftime = disptime - _dispontime; _dispontime *= crtcconst; _dispofftime *= crtcconst; @@ -2785,10 +2686,8 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p) index = da2->fctl[LF_MMIO_MODE] & 0x0f; index <<= 8; index |= da2->fctl[LF_MMIO_ADDR]; - // addr += index * 0x40; - // addr += index * 0x80; - da2_log("da2_mmio_w io %x, sl %x, 09 %x, ad %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO],da2->fctl[LF_MMIO_SEL], - da2->fctl[LF_MMIO_09],da2->fctl[LF_MMIO_ADDR], da2->fctl[LF_MMIO_MODE], addr, val); + // da2_log("da2_mmio_w io %x, sl %x, 09 %x, ad %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO],da2->fctl[LF_MMIO_SEL], + // da2->fctl[LF_MMIO_09],da2->fctl[LF_MMIO_ADDR], da2->fctl[LF_MMIO_MODE], addr, val); } switch (da2->fctl[LF_MMIO_MODE] & 0xf0) { case 0xb0: /* Gaiji RAM 1011 0000 */ @@ -2802,12 +2701,6 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p) addr += index * 0x40; da2->mmio.ram[(DA2_GAIJIRAM_SBCS + addr) & DA2_MASK_GAIJIRAM] = val; // da2_log("da2_mmio_write %x %x %04X:%04X\n", addr, val, CS, cpu_state.pc); - // addr &= 0x7f;/* OS/2 write addr 1cf80-1cfc3, val xx */ - // if (addr >= DA2_BLT_MEMSIZE) - //{ - // da2_log("da2_mmio_write failed mem %x, addr %x, val %x\n", da2->fctl[LF_MMIO_MODE], addr, val); - // return; - // } break; default: da2_log("da2_mmio_write failed io %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO] ,da2->fctl[LF_MMIO_MODE], addr, val); @@ -3138,8 +3031,6 @@ da2_poll(void *priv) // da2_log("%03i %06X %06X\n", da2->displine, da2->ma,da2->vram_display_mask); da2->displine++; - // if (da2->interlace) - // da2->displine++; if ((da2->cgastat & 8) && ((da2->displine & 0xf) == (da2->crtc[LC_VERTICAL_SYNC_END] & 0xf)) && da2->vslines) { // da2_log("Vsync off at line %i\n",displine); da2->cgastat &= ~8; @@ -3153,7 +3044,6 @@ da2_poll(void *priv) // da2_log("VC %i ma %05X\n", da2->vc, da2->ma); timer_advance_u64(&da2->timer, da2->dispontime); - // if (output) printf("Display on %f\n",vidtime); if (da2->dispon) da2->cgastat &= ~1; da2->hdisp_on = 0; From 392e3156bb47fbf2f5857a248c093a04e7b22e4e Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Fri, 4 Apr 2025 09:10:49 +0900 Subject: [PATCH 059/118] disable debug code --- src/video/vid_ps55da2.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 09e3471a5..ec25db7c7 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -260,7 +260,7 @@ #define LG_SET_RESET_2 0x10 #ifndef RELEASE_BUILD -#define ENABLE_DA2_LOG 1 +// #define ENABLE_DA2_LOG 1 #endif #ifdef ENABLE_DA2_LOG @@ -300,6 +300,7 @@ da2_log(const char *fmt, ...) # endif #else # define da2_bltlog(fmt, ...) +# define da2_bltreglog(fmt, ...) #endif typedef struct da2_t { @@ -1291,13 +1292,13 @@ da2_out(uint16_t addr, uint16_t val, void *p) } da2->crtc[da2->crtcaddr] = val; switch (da2->crtcaddr) { - case LC_START_ADDRESS_HIGH: - case LC_START_ADDRESS_LOW: + // case LC_START_ADDRESS_HIGH: + // case LC_START_ADDRESS_LOW: /* The DOS J4.0 MODE 4 command and OS/2 driver write 0xFF00. OS/2 DOS MODE 1 setup reads this to set the base line, but it causes the screen glitch. */ - outb(0x680, da2->crtc[LC_START_ADDRESS_LOW]); - outb(0x680, da2->crtc[LC_START_ADDRESS_HIGH]); - break; + // outb(0x680, da2->crtc[LC_START_ADDRESS_LOW]); + // outb(0x680, da2->crtc[LC_START_ADDRESS_HIGH]); + // break; case LC_VIEWPORT_SELECT: /* backup some current crtc regs */ for (int i = LC_START_ADDRESS_HIGH; i <= LC_START_ADDRESS_LOW; i++) { From 4a4a7a342a89e963046a3f4ddd40994995560736 Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Fri, 4 Apr 2025 09:42:22 +0900 Subject: [PATCH 060/118] PS55DA2: formatting, sorting --- src/video/vid_ps55da2.c | 852 ++++++++++++++++++++-------------------- 1 file changed, 427 insertions(+), 425 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index ec25db7c7..39adc3607 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -449,12 +449,12 @@ static void da2_bitblt_exec(void *p); static void da2_updatevidselector(da2_t *da2); static void da2_reset_ioctl(da2_t *da2); static void da2_reset(void *priv); -static uint16_t rightRotate(uint16_t data, uint8_t count); +static uint16_t da2_rightrotate(uint16_t data, uint8_t count); typedef union { uint32_t d; uint8_t b[4]; -} DA2_VidSeq32; +} vidseq32; typedef struct { uint32_t p8[8]; @@ -462,7 +462,7 @@ typedef struct { /* safety read for internal functions */ static uint32_t -DA2_vram_r(uint32_t addr, da2_t *da2) +da2_vram_r(uint32_t addr, da2_t *da2) { if (addr & ~DA2_MASK_VRAM) return DA2_INVALIDACCESS32; @@ -470,110 +470,14 @@ DA2_vram_r(uint32_t addr, da2_t *da2) } /* safety write for internal functions */ static void -DA2_vram_w(uint32_t addr, uint8_t val, da2_t *da2) +da2_vram_w(uint32_t addr, uint8_t val, da2_t *da2) { if (addr & ~DA2_MASK_VRAM) return; da2->vram[addr] = val; return; } -/* get font data for bitblt operation */ -static uint32_t -getFontIBMJ(int32_t code, int line, int x, void *p) -{ - da2_t *da2 = (da2_t *) p; - uint32_t font = 0; - int fline = line - 2; /* Start line of drawing character (line >= 1 AND line < 24 + 1 ) */ - if (code < 0x100) { /* SBCS 13x29 */ - code *= 0x40; - code += DA2_GAIJIRAM_SBCS + (line * 2) + x; - font = da2->mmio.ram[code]; - font <<= 8; - font |= da2->mmio.ram[code + 1]; - font <<= 16; - } else if ((code >= 0xb000) && (code <= 0xb75f)) { /* DBCS 26x29 */ - /* convert code->address in gaiji memory */ - code -= 0xb000; - code = (code * 0x80) + (line * 4) + x; - font = da2->mmio.ram[code]; - font <<= 8; - font |= da2->mmio.ram[code + 1]; - font <<= 8; - font |= da2->mmio.ram[code + 2]; - font <<= 8; - font |= da2->mmio.ram[code + 3]; - } - else - font = 0; - return font; -} -/* write pixel data with rop (Note: bitmask must be in big endian) */ -static void -DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *srcpx, da2_t *da2) -{ - uint32_t writepx[8]; - destaddr &= 0xfffffffe; /* align to word address to work bit shift correctly */ - // da2_log("DA2_WPDWB addr %x mask %x rop %x shift %d\n", destaddr, mask, da2->bitblt.raster_op, da2->bitblt.bitshift_destr); - da2->changedvram[(DA2_MASK_VRAMPLANE & destaddr) >> 9] = changeframecount; - destaddr <<= 3; - /* read destination data with big endian order */ - for (int i = 0; i < 8; i++) - writepx[i] = DA2_vram_r((destaddr + 24) | i, da2) - | (DA2_vram_r((destaddr + 16) | i, da2) << 8) - | (DA2_vram_r((destaddr + 8) | i, da2) << 16) - | (DA2_vram_r((destaddr + 0) | i, da2) << 24); - - DA2_VidSeq32 mask32in; - mask32in.d = (uint32_t) mask; - DA2_VidSeq32 mask32; - mask32.b[3] = mask32in.b[0]; - mask32.b[2] = mask32in.b[1]; - mask32.d &= 0xffff0000; - for (int i = 0; i < 8; i++) { - if (da2->bitblt.bitshift_destr > 0) - srcpx->p8[i] <<= 16 - da2->bitblt.bitshift_destr; -// #ifdef ENABLE_DA2_DEBUGBLT -// if (i == 0) { -// pclog("writeplane: src %08X mask %08X dest %08X\n", srcpx->p8[i], mask32.d, writepx[i]); -// } -// #endif - if (da2->bitblt.raster_op & 0x2010) /* NOT Src or NOT Pattern */ - srcpx->p8[i] = ~srcpx->p8[i] & mask32.d; - if (da2->bitblt.raster_op & 0x20) /* Dest NOT */ - writepx[i] = (~writepx[i] & mask32.d) | (writepx[i] & ~mask32.d); - switch (da2->bitblt.raster_op & 0x03) { - case 0x00: /* None */ - writepx[i] &= ~mask32.d; - writepx[i] |= srcpx->p8[i] & mask32.d; - break; - case 0x01: /* AND */ - writepx[i] &= srcpx->p8[i] | ~mask32.d; - break; - case 0x02: /* OR */ - writepx[i] |= srcpx->p8[i] & mask32.d; - break; - case 0x03: /* XOR */ - writepx[i] ^= srcpx->p8[i] & mask32.d; - break; - } - } - for (int i = 0; i < 8; i++) { - DA2_vram_w(destaddr | i, (writepx[i] >> 24) & 0xff, da2); - DA2_vram_w((destaddr + 8) | i, (writepx[i] >> 16) & 0xff, da2); - } -} - -static void -DA2_DrawColorWithBitmask(uint32_t destaddr, uint8_t color, uint16_t mask, da2_t *da2) -{ - pixel32 srcpx; - /* fill data with input color */ - for (int i = 0; i < 8; i++) - srcpx.p8[i] = (color & (1 << i)) ? 0xffffffff : 0; /* read in word */ - - DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2); -} /* Param Desc 01 Color @@ -606,19 +510,115 @@ Param Desc 34 wy1, Dest Y 35 wy2, Size H */ +/* write pixel data with rop (Note: bitmask must be in big endian) */ static void -DA2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2) +da2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *srcpx, da2_t *da2) +{ + uint32_t writepx[8]; + destaddr &= 0xfffffffe; /* align to word address to work bit shift correctly */ + // da2_log("DA2_WPDWB addr %x mask %x rop %x shift %d\n", destaddr, mask, da2->bitblt.raster_op, da2->bitblt.bitshift_destr); + da2->changedvram[(DA2_MASK_VRAMPLANE & destaddr) >> 9] = changeframecount; + destaddr <<= 3; + /* read destination data with big endian order */ + for (int i = 0; i < 8; i++) + writepx[i] = da2_vram_r((destaddr + 24) | i, da2) + | (da2_vram_r((destaddr + 16) | i, da2) << 8) + | (da2_vram_r((destaddr + 8) | i, da2) << 16) + | (da2_vram_r((destaddr + 0) | i, da2) << 24); + + vidseq32 mask32in; + mask32in.d = (uint32_t) mask; + vidseq32 mask32; + mask32.b[3] = mask32in.b[0]; + mask32.b[2] = mask32in.b[1]; + mask32.d &= 0xffff0000; + for (int i = 0; i < 8; i++) { + if (da2->bitblt.bitshift_destr > 0) + srcpx->p8[i] <<= 16 - da2->bitblt.bitshift_destr; +// #ifdef ENABLE_DA2_DEBUGBLT +// if (i == 0) { +// pclog("writeplane: src %08X mask %08X dest %08X\n", srcpx->p8[i], mask32.d, writepx[i]); +// } +// #endif + if (da2->bitblt.raster_op & 0x2010) /* NOT Src or NOT Pattern */ + srcpx->p8[i] = ~srcpx->p8[i] & mask32.d; + if (da2->bitblt.raster_op & 0x20) /* Dest NOT */ + writepx[i] = (~writepx[i] & mask32.d) | (writepx[i] & ~mask32.d); + switch (da2->bitblt.raster_op & 0x03) { + case 0x00: /* None */ + writepx[i] &= ~mask32.d; + writepx[i] |= srcpx->p8[i] & mask32.d; + break; + case 0x01: /* AND */ + writepx[i] &= srcpx->p8[i] | ~mask32.d; + break; + case 0x02: /* OR */ + writepx[i] |= srcpx->p8[i] & mask32.d; + break; + case 0x03: /* XOR */ + writepx[i] ^= srcpx->p8[i] & mask32.d; + break; + } + } + for (int i = 0; i < 8; i++) { + da2_vram_w(destaddr | i, (writepx[i] >> 24) & 0xff, da2); + da2_vram_w((destaddr + 8) | i, (writepx[i] >> 16) & 0xff, da2); + } +} + +static void +da2_DrawColorWithBitmask(uint32_t destaddr, uint8_t color, uint16_t mask, da2_t *da2) +{ + pixel32 srcpx; + /* fill data with input color */ + for (int i = 0; i < 8; i++) + srcpx.p8[i] = (color & (1 << i)) ? 0xffffffff : 0; /* read in word */ + + da2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2); +} +static void +da2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2) { pixel32 srcpx; srcaddr &= 0xfffffffe; srcaddr <<= 3; for (int i = 0; i < 8; i++) - srcpx.p8[i] = DA2_vram_r((srcaddr + 24) | i, da2) - | (DA2_vram_r((srcaddr + 16) | i, da2) << 8) - | (DA2_vram_r((srcaddr + 8) | i, da2) << 16) - | (DA2_vram_r((srcaddr + 0) | i, da2) << 24); + srcpx.p8[i] = da2_vram_r((srcaddr + 24) | i, da2) + | (da2_vram_r((srcaddr + 16) | i, da2) << 8) + | (da2_vram_r((srcaddr + 8) | i, da2) << 16) + | (da2_vram_r((srcaddr + 0) | i, da2) << 24); - DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2); + da2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2); +} +/* get font data for bitblt operation */ +static uint32_t +getRAMFont(int32_t code, int line, int x, void *p) +{ + da2_t *da2 = (da2_t *) p; + uint32_t font = 0; + int fline = line - 2; /* Start line of drawing character (line >= 1 AND line < 24 + 1 ) */ + if (code < 0x100) { /* SBCS 13x29 */ + code *= 0x40; + code += DA2_GAIJIRAM_SBCS + (line * 2) + x; + font = da2->mmio.ram[code]; + font <<= 8; + font |= da2->mmio.ram[code + 1]; + font <<= 16; + } else if ((code >= 0xb000) && (code <= 0xb75f)) { /* DBCS 26x29 */ + /* convert code->address in gaiji memory */ + code -= 0xb000; + code = (code * 0x80) + (line * 4) + x; + font = da2->mmio.ram[code]; + font <<= 8; + font |= da2->mmio.ram[code + 1]; + font <<= 8; + font |= da2->mmio.ram[code + 2]; + font <<= 8; + font |= da2->mmio.ram[code + 3]; + } + else + font = 0; + return font; } /* Reverse the bit order of attribute code IBGR to IRGB(used in Mode 3 and Cursor Color) */ static int8_t @@ -628,12 +628,12 @@ IBGRtoIRGB(uint8_t attr) return attr >>= 4; } static void -DA2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, uint32_t destaddr, uint16_t maskl, uint16_t maskr, da2_t *da2) +da2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, uint32_t destaddr, uint16_t maskl, uint16_t maskr, da2_t *da2) { pixel32 srcpx; uint8_t fg = (~attr >> 8) & 0x0f; uint8_t bg = (~attr >> 12) & 0x0f; - uint32_t font = getFontIBMJ(codeIBMJ, line, 0, da2); + uint32_t font = getRAMFont(codeIBMJ, line, 0, da2); uint32_t fontinv; if (width <= 2) { fontinv = ~font; @@ -641,12 +641,12 @@ DA2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, ui srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; } - DA2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); + da2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); for (int i = 0; i < 8; i++) { srcpx.p8[i] = (fg & (1 << i)) ? font : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; } - DA2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); + da2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); } else { font = (font & 0xfff80000) | ((font & 0x0000ffff) << 3); fontinv = ~font; @@ -654,20 +654,20 @@ DA2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, ui srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0; } - DA2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); + da2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2); for (int i = 0; i < 8; i++) { srcpx.p8[i] = (fg & (1 << i)) ? font : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0; } if (da2->bitblt.destoption & 0x20) { - DA2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); + da2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2); } else { - DA2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2); + da2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2); for (int i = 0; i < 8; i++) { srcpx.p8[i] = (fg & (1 << i)) ? font << 16 : 0; srcpx.p8[i] |= (bg & (1 << i)) ? fontinv << 16 : 0; } - DA2_WritePlaneDataWithBitmask(destaddr + 4, maskr, &srcpx, da2); + da2_WritePlaneDataWithBitmask(destaddr + 4, maskr, &srcpx, da2); } } } @@ -677,7 +677,7 @@ pixel1tohex(uint32_t addr, int index, da2_t *da2) { uint8_t pixeldata = 0; for (int j = 0; j < 8; j++) { - if (DA2_vram_r(((addr << 3) | j) & (1 << (7 - index)), da2)) + if (da2_vram_r(((addr << 3) | j) & (1 << (7 - index)), da2)) pixeldata++; } return pixeldata; @@ -748,69 +748,69 @@ da2_bitblt_parse(da2_t *da2) { uint32_t value32; uint64_t value64; - switch (da2->bitblt.payload[0]) { - case 0x88: - case 0x89: - case 0x95: - value32 = da2->bitblt.payload[3]; - value32 <<= 8; - value32 |= da2->bitblt.payload[2]; - da2_bltreglog("[%02x] %02x: %04x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32); - da2->bitblt.reg[da2->bitblt.payload[1]] = value32; - break; - case 0x91: - value32 = da2->bitblt.payload[5]; - value32 <<= 8; - value32 |= da2->bitblt.payload[4]; - value32 <<= 8; - value32 |= da2->bitblt.payload[3]; - value32 <<= 8; - value32 |= da2->bitblt.payload[2]; - da2_bltreglog("[%02x] %02x: %08x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32); - da2->bitblt.reg[da2->bitblt.payload[1]] = value32; - break; - case 0x99: - value64 = da2->bitblt.payload[7]; - value64 <<= 8; - value64 = da2->bitblt.payload[6]; - value64 <<= 8; - value64 = da2->bitblt.payload[5]; - value64 <<= 8; - value64 |= da2->bitblt.payload[4]; - value64 <<= 8; - value64 |= da2->bitblt.payload[3]; - value64 <<= 8; - value64 |= da2->bitblt.payload[2]; - da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], - da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7]); - da2->bitblt.reg[da2->bitblt.payload[1]] = value64; - break; - case 0xa1: - value64 = da2->bitblt.payload[9]; - value64 <<= 8; - value64 |= da2->bitblt.payload[8]; - value64 <<= 8; - value64 |= da2->bitblt.payload[7]; - value64 <<= 8; - value64 |= da2->bitblt.payload[6]; - value64 <<= 8; - value64 |= da2->bitblt.payload[5]; - value64 <<= 8; - value64 |= da2->bitblt.payload[4]; - value64 <<= 8; - value64 |= da2->bitblt.payload[3]; - value64 <<= 8; - value64 |= da2->bitblt.payload[2]; - da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], - da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7], da2->bitblt.payload[8], da2->bitblt.payload[9]); - da2->bitblt.reg[da2->bitblt.payload[1]] = value64; - break; - case 0x00: /* Win 3.0 Clock writes invalid zero data. */ - break; - default: - da2_log("bltload: Unknown PreOP!\n"); - break; - } + switch (da2->bitblt.payload[0]) { + case 0x88: + case 0x89: + case 0x95: + value32 = da2->bitblt.payload[3]; + value32 <<= 8; + value32 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %04x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32); + da2->bitblt.reg[da2->bitblt.payload[1]] = value32; + break; + case 0x91: + value32 = da2->bitblt.payload[5]; + value32 <<= 8; + value32 |= da2->bitblt.payload[4]; + value32 <<= 8; + value32 |= da2->bitblt.payload[3]; + value32 <<= 8; + value32 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %08x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32); + da2->bitblt.reg[da2->bitblt.payload[1]] = value32; + break; + case 0x99: + value64 = da2->bitblt.payload[7]; + value64 <<= 8; + value64 = da2->bitblt.payload[6]; + value64 <<= 8; + value64 = da2->bitblt.payload[5]; + value64 <<= 8; + value64 |= da2->bitblt.payload[4]; + value64 <<= 8; + value64 |= da2->bitblt.payload[3]; + value64 <<= 8; + value64 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], + da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7]); + da2->bitblt.reg[da2->bitblt.payload[1]] = value64; + break; + case 0xa1: + value64 = da2->bitblt.payload[9]; + value64 <<= 8; + value64 |= da2->bitblt.payload[8]; + value64 <<= 8; + value64 |= da2->bitblt.payload[7]; + value64 <<= 8; + value64 |= da2->bitblt.payload[6]; + value64 <<= 8; + value64 |= da2->bitblt.payload[5]; + value64 <<= 8; + value64 |= da2->bitblt.payload[4]; + value64 <<= 8; + value64 |= da2->bitblt.payload[3]; + value64 <<= 8; + value64 |= da2->bitblt.payload[2]; + da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3], + da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7], da2->bitblt.payload[8], da2->bitblt.payload[9]); + da2->bitblt.reg[da2->bitblt.payload[1]] = value64; + break; + case 0x00: /* Win 3.0 Clock writes invalid zero data. */ + break; + default: + da2_log("bltload: Unknown PreOP!\n"); + break; + } if (da2->bitblt.reg[0x20] & 0x01) { /* Execute Bitblt immediately (for OS/2 J1.3) */ da2->bitblt.exec = DA2_BLT_CLOAD; da2_bitblt_exec(da2); @@ -818,162 +818,162 @@ da2_bitblt_parse(da2_t *da2) /* clear payload memory */ memset(da2->bitblt.payload, 0x00, DA2_BLT_MEMSIZE); da2->bitblt.payload_addr = 0; - da2->bitblt.indata = 0; + da2->bitblt.indata = 0; } static void da2_bitblt_load(da2_t *da2) { - da2->bitblt.reg[0x20] = 0; /* need to stop execution */ + da2->bitblt.reg[0x20] = 0; /* need to stop execution */ #ifdef ENABLE_DA2_DEBUGBLT - for (int i = 0; i < DA2_DEBUG_BLTLOG_SIZE; i++) { - da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip + i] = da2->bitblt.reg[i]; - } - da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * (da2->bitblt.debug_reg_ip + 1) - 1] = 0; - da2->bitblt.debug_reg_ip++; - if ((DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip) >= DA2_DEBUG_BLTLOG_MAX) - da2->bitblt.debug_reg_ip = 0; - da2->bitblt.debug_exesteps = 0; + for (int i = 0; i < DA2_DEBUG_BLTLOG_SIZE; i++) { + da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip + i] = da2->bitblt.reg[i]; + } + da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * (da2->bitblt.debug_reg_ip + 1) - 1] = 0; + da2->bitblt.debug_reg_ip++; + if ((DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip) >= DA2_DEBUG_BLTLOG_MAX) + da2->bitblt.debug_reg_ip = 0; + da2->bitblt.debug_exesteps = 0; #endif - da2->bitblt.bitshift_destr = ((da2->bitblt.reg[0x03] >> 4) & 0x0f); /* set bit shift */ - da2->bitblt.raster_op = da2->bitblt.reg[0x0b]; - da2->bitblt.destaddr = da2->bitblt.reg[0x29]; - da2->bitblt.size_x = da2->bitblt.reg[0x33]; - da2->bitblt.size_y = da2->bitblt.reg[0x35]; - da2->bitblt.destpitch = da2->bitblt.reg[0x21]; - da2->bitblt.srcpitch = da2->bitblt.reg[0x22]; - /* - DOS/V Extension 1040x725 some DBCS uses 0xB0 others 0x90 - */ - da2->bitblt.destoption = da2->bitblt.reg[0x2F]; - if (da2->bitblt.destoption & 0x10) /* destaddr -= 2, length += 1; */ - { - da2->bitblt.destaddr -= 2; - da2->bitblt.size_x += 1; - da2->bitblt.destpitch -= 2; - da2->bitblt.srcpitch -= 2; - } - da2->bitblt.fcolor = da2->bitblt.reg[0x0]; - da2->bitblt.maskl = da2->bitblt.reg[0x8]; - da2->bitblt.maskr = da2->bitblt.reg[0x9]; - da2->bitblt.x = 0; - da2->bitblt.y = 0; - da2->bitblt.exec = DA2_BLT_CDONE; + da2->bitblt.bitshift_destr = ((da2->bitblt.reg[0x03] >> 4) & 0x0f); /* set bit shift */ + da2->bitblt.raster_op = da2->bitblt.reg[0x0b]; + da2->bitblt.destaddr = da2->bitblt.reg[0x29]; + da2->bitblt.size_x = da2->bitblt.reg[0x33]; + da2->bitblt.size_y = da2->bitblt.reg[0x35]; + da2->bitblt.destpitch = da2->bitblt.reg[0x21]; + da2->bitblt.srcpitch = da2->bitblt.reg[0x22]; + /* + DOS/V Extension 1040x725 some DBCS uses 0xB0 others 0x90 + */ + da2->bitblt.destoption = da2->bitblt.reg[0x2F]; + if (da2->bitblt.destoption & 0x10) /* destaddr -= 2, length += 1; */ + { + da2->bitblt.destaddr -= 2; + da2->bitblt.size_x += 1; + da2->bitblt.destpitch -= 2; + da2->bitblt.srcpitch -= 2; + } + da2->bitblt.fcolor = da2->bitblt.reg[0x0]; + da2->bitblt.maskl = da2->bitblt.reg[0x8]; + da2->bitblt.maskr = da2->bitblt.reg[0x9]; + da2->bitblt.x = 0; + da2->bitblt.y = 0; + da2->bitblt.exec = DA2_BLT_CDONE; - /* Put DBCS char used by OS/2 and DOS/V Extension */ - if (!(da2->bitblt.reg[0xb] & 0x08)) { - da2->bitblt.exec = DA2_BLT_CPUTCHAR; - da2->bitblt.fcolor = da2->bitblt.reg[0x1]; - da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; - da2->bitblt.destaddr += 2; + /* Put DBCS char used by OS/2 and DOS/V Extension */ + if (!(da2->bitblt.reg[0xb] & 0x08)) { + da2->bitblt.exec = DA2_BLT_CPUTCHAR; + da2->bitblt.fcolor = da2->bitblt.reg[0x1]; + da2->bitblt.srcaddr = da2->bitblt.reg[0x12]; + da2->bitblt.destaddr += 2; #ifdef ENABLE_DA2_DEBUGBLT - uint8_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8; - uint8_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff; - if (da2->bitblt.reg[0x12] < 0x100) { - sjis_h = 0x20; - sjis_l = da2->bitblt.reg[0x12]; - } else { - if (!(isKanji1(sjis_h))) - sjis_h = 0x3f; - if (!(isKanji2(sjis_l))) - sjis_l = 0x3f; - } - da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d, c=%c%c\n", - da2->bitblt.srcaddr, da2->bitblt.destaddr, - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y, sjis_h, sjis_l); + uint8_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8; + uint8_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff; + if (da2->bitblt.reg[0x12] < 0x100) { + sjis_h = 0x20; + sjis_l = da2->bitblt.reg[0x12]; + } else { + if (!(isKanji1(sjis_h))) + sjis_h = 0x3f; + if (!(isKanji2(sjis_l))) + sjis_l = 0x3f; + } + da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d, c=%c%c\n", + da2->bitblt.srcaddr, da2->bitblt.destaddr, + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y, sjis_h, sjis_l); #else -da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d\n", - da2->bitblt.srcaddr, da2->bitblt.destaddr, - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y); + da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d\n", + da2->bitblt.srcaddr, da2->bitblt.destaddr, + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y); #endif - } - /* Draw a line */ - else if (da2->bitblt.reg[0x5] == 0x43) { - da2->bitblt.exec = DA2_BLT_CLINE; - da2->bitblt.dest_x = (da2->bitblt.reg[0x32] & 0xffff); - da2->bitblt.dest_y = (da2->bitblt.reg[0x34] & 0xffff); - da2->bitblt.wx1 = (da2->bitblt.reg[0x32]) >> 16; - da2->bitblt.wx2 = (da2->bitblt.reg[0x33]) >> 16; - da2->bitblt.wy1 = (da2->bitblt.reg[0x34]) >> 16; - da2->bitblt.wy2 = (da2->bitblt.reg[0x35]) >> 16; - da2->bitblt.size_x = abs((int16_t)(da2->bitblt.reg[0x33] & 0xffff) - da2->bitblt.dest_x); - da2->bitblt.size_y = abs((int16_t)(da2->bitblt.reg[0x35] & 0xffff) - da2->bitblt.dest_y); - da2->bitblt.count = 0; - da2->bitblt.octdir = da2->bitblt.reg[0x2D]; - da2->bitblt.bitshift_destr = 0; - if (da2->bitblt.octdir & 0x04) /* dX > dY */ - da2->bitblt.d = 2 * da2->bitblt.size_y - da2->bitblt.size_x; - else - da2->bitblt.d = 2 * da2->bitblt.size_x - da2->bitblt.size_y; - da2->bitblt.x = da2->bitblt.dest_x; - da2->bitblt.y = da2->bitblt.dest_y; - da2_log("drawline x=%d, y=%d, dx=%d, dy=%d, oct=%dn", - da2->bitblt.dest_x, da2->bitblt.dest_y, - da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.octdir); - da2_log(" x1=%d, x2=%d, y1=%d, y2=%d\n", - da2->bitblt.reg[0x32] & 0x7ff, da2->bitblt.reg[0x33] & 0x7ff, - da2->bitblt.reg[0x34] & 0x7ff, da2->bitblt.reg[0x35] & 0x7ff); - da2_log(" ux1=%d,ux2=%d,uy1=%d,uy2=%d\n", - (da2->bitblt.reg[0x32] >> 16) & 0x7ff, (da2->bitblt.reg[0x33] >> 16) & 0x7ff, - (da2->bitblt.reg[0x34] >> 16) & 0x7ff, (da2->bitblt.reg[0x35] >> 16) & 0x7ff); - } - /* Fill a rectangle (or draw a horizontal / vertical line) */ - else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x40 && da2->bitblt.reg[0x3D] == 0) { - da2_log("fillrect x=%d, y=%d, w=%d, h=%d, c=%d, 2f=%x, rowcount=%x\n", - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.reg[0x0], da2->bitblt.reg[0x2F], da2->rowoffset * 2); - da2->bitblt.exec = DA2_BLT_CFILLRECT; - da2->bitblt.destaddr += 2; - } - /* Tiling a rectangle ??(transfer tile data multiple times) os/2 only */ - else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x0040 && da2->bitblt.reg[0x3D] == 0x40) { - da2->bitblt.exec = DA2_BLT_CFILLTILE; - da2->bitblt.destaddr += 2; - da2->bitblt.srcaddr = da2->bitblt.reg[0x2B]; - da2->bitblt.tile_w = da2->bitblt.reg[0x28]; - da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", - da2->bitblt.srcaddr, da2->bitblt.destaddr, - da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2), - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y); - } - /* Tiling a rectangle (transfer tile data multiple times) */ - else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x40) { - da2->bitblt.exec = DA2_BLT_CFILLTILE; - da2->bitblt.destaddr += 2; - da2->bitblt.srcaddr = da2->bitblt.reg[0x2B]; - da2->bitblt.tile_w = da2->bitblt.reg[0x28]; - da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", - da2->bitblt.srcaddr, da2->bitblt.destaddr, - da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2), - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y); - } - /* Block copy */ - else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x00) { - da2->bitblt.exec = DA2_BLT_CCOPYF; - da2->bitblt.srcaddr = da2->bitblt.reg[0x2A]; - da2->bitblt.destaddr += 2; - da2_log("copy block src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", - da2->bitblt.srcaddr, da2->bitblt.destaddr, - da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2), - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y); - } - /* Block copy but reversed direction */ - else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1140 && da2->bitblt.reg[0x3D] == 0x00) { - da2->bitblt.exec = DA2_BLT_CCOPYR; - da2->bitblt.srcaddr = da2->bitblt.reg[0x2A]; - da2->bitblt.destaddr -= 2; - da2->bitblt.srcaddr -= 2; - da2_log("copy blockR src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", - da2->bitblt.srcaddr, da2->bitblt.destaddr, - da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2), - da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), - da2->bitblt.size_x, da2->bitblt.size_y); - } + } + /* Draw a line */ + else if (da2->bitblt.reg[0x5] == 0x43) { + da2->bitblt.exec = DA2_BLT_CLINE; + da2->bitblt.dest_x = (da2->bitblt.reg[0x32] & 0xffff); + da2->bitblt.dest_y = (da2->bitblt.reg[0x34] & 0xffff); + da2->bitblt.wx1 = (da2->bitblt.reg[0x32]) >> 16; + da2->bitblt.wx2 = (da2->bitblt.reg[0x33]) >> 16; + da2->bitblt.wy1 = (da2->bitblt.reg[0x34]) >> 16; + da2->bitblt.wy2 = (da2->bitblt.reg[0x35]) >> 16; + da2->bitblt.size_x = abs((int16_t) (da2->bitblt.reg[0x33] & 0xffff) - da2->bitblt.dest_x); + da2->bitblt.size_y = abs((int16_t) (da2->bitblt.reg[0x35] & 0xffff) - da2->bitblt.dest_y); + da2->bitblt.count = 0; + da2->bitblt.octdir = da2->bitblt.reg[0x2D]; + da2->bitblt.bitshift_destr = 0; + if (da2->bitblt.octdir & 0x04) /* dX > dY */ + da2->bitblt.d = 2 * da2->bitblt.size_y - da2->bitblt.size_x; + else + da2->bitblt.d = 2 * da2->bitblt.size_x - da2->bitblt.size_y; + da2->bitblt.x = da2->bitblt.dest_x; + da2->bitblt.y = da2->bitblt.dest_y; + da2_log("drawline x=%d, y=%d, dx=%d, dy=%d, oct=%dn", + da2->bitblt.dest_x, da2->bitblt.dest_y, + da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.octdir); + da2_log(" x1=%d, x2=%d, y1=%d, y2=%d\n", + da2->bitblt.reg[0x32] & 0x7ff, da2->bitblt.reg[0x33] & 0x7ff, + da2->bitblt.reg[0x34] & 0x7ff, da2->bitblt.reg[0x35] & 0x7ff); + da2_log(" ux1=%d,ux2=%d,uy1=%d,uy2=%d\n", + (da2->bitblt.reg[0x32] >> 16) & 0x7ff, (da2->bitblt.reg[0x33] >> 16) & 0x7ff, + (da2->bitblt.reg[0x34] >> 16) & 0x7ff, (da2->bitblt.reg[0x35] >> 16) & 0x7ff); + } + /* Fill a rectangle (or draw a horizontal / vertical line) */ + else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x40 && da2->bitblt.reg[0x3D] == 0) { + da2_log("fillrect x=%d, y=%d, w=%d, h=%d, c=%d, 2f=%x, rowcount=%x\n", + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.reg[0x0], da2->bitblt.reg[0x2F], da2->rowoffset * 2); + da2->bitblt.exec = DA2_BLT_CFILLRECT; + da2->bitblt.destaddr += 2; + } + /* Tiling a rectangle ??(transfer tile data multiple times) os/2 only */ + else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x0040 && da2->bitblt.reg[0x3D] == 0x40) { + da2->bitblt.exec = DA2_BLT_CFILLTILE; + da2->bitblt.destaddr += 2; + da2->bitblt.srcaddr = da2->bitblt.reg[0x2B]; + da2->bitblt.tile_w = da2->bitblt.reg[0x28]; + da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", + da2->bitblt.srcaddr, da2->bitblt.destaddr, + da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2), + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y); + } + /* Tiling a rectangle (transfer tile data multiple times) */ + else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x40) { + da2->bitblt.exec = DA2_BLT_CFILLTILE; + da2->bitblt.destaddr += 2; + da2->bitblt.srcaddr = da2->bitblt.reg[0x2B]; + da2->bitblt.tile_w = da2->bitblt.reg[0x28]; + da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", + da2->bitblt.srcaddr, da2->bitblt.destaddr, + da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2), + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y); + } + /* Block copy */ + else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x00) { + da2->bitblt.exec = DA2_BLT_CCOPYF; + da2->bitblt.srcaddr = da2->bitblt.reg[0x2A]; + da2->bitblt.destaddr += 2; + da2_log("copy block src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", + da2->bitblt.srcaddr, da2->bitblt.destaddr, + da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2), + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y); + } + /* Block copy but reversed direction */ + else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1140 && da2->bitblt.reg[0x3D] == 0x00) { + da2->bitblt.exec = DA2_BLT_CCOPYR; + da2->bitblt.srcaddr = da2->bitblt.reg[0x2A]; + da2->bitblt.destaddr -= 2; + da2->bitblt.srcaddr -= 2; + da2_log("copy blockR src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n", + da2->bitblt.srcaddr, da2->bitblt.destaddr, + da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2), + da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2), + da2->bitblt.size_x, da2->bitblt.size_y); + } } static void da2_bitblt_exec(void *p) @@ -981,7 +981,7 @@ da2_bitblt_exec(void *p) da2_t *da2 = (da2_t *) p; // timer_set_delay_u64(&da2->bitblt.timer, da2->bitblt.timerspeed); #ifdef ENABLE_DA2_DEBUGBLT_DETAIL - if(!(da2->bitblt.debug_exesteps & 0xff)) + if (!(da2->bitblt.debug_exesteps & 0xff)) da2_log("bitblt_exec: %d %d\n", da2->bitblt.exec, da2->bitblt.debug_exesteps); da2->bitblt.debug_exesteps++; #else @@ -998,19 +998,19 @@ da2_bitblt_exec(void *p) case DA2_BLT_CLINE: /* Draw a dot */ da2_bltlog("point: %d %d %d %d %d\n", da2->bitblt.x, da2->bitblt.y, da2->bitblt.d, da2->bitblt.x, da2->bitblt.y); - int destaddr = da2->bitblt.y * (da2->rowoffset * 2) + da2->bitblt.x / 8; + int destaddr = da2->bitblt.y * (da2->rowoffset * 2) + da2->bitblt.x / 8; int pixelmask = da2->bitblt.x % 16; if (pixelmask >= 8) pixelmask = (0x8000 >> (pixelmask - 8)); else pixelmask = (0x80 >> pixelmask); - + /* check the current position is inside the window */ if (da2->bitblt.x < da2->bitblt.wx1 || da2->bitblt.x > da2->bitblt.wx2 || da2->bitblt.y < da2->bitblt.wy1 || da2->bitblt.y > da2->bitblt.wy2) ; else - DA2_DrawColorWithBitmask(destaddr, da2->bitblt.fcolor, pixelmask, da2); + da2_DrawColorWithBitmask(destaddr, da2->bitblt.fcolor, pixelmask, da2); da2->bitblt.count++; /* calculate the next position with Bresenham's line algorithm */ @@ -1053,7 +1053,7 @@ da2_bitblt_exec(void *p) case DA2_BLT_CFILLRECT: // da2_log("%x %x %x\n", da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y); if (da2->bitblt.x >= da2->bitblt.size_x - 1) { - DA2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskr, da2); + da2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskr, da2); if (da2->bitblt.y >= da2->bitblt.size_y - 1) { da2->bitblt.exec = DA2_BLT_CDONE; } @@ -1061,36 +1061,38 @@ da2_bitblt_exec(void *p) da2->bitblt.y++; da2->bitblt.destaddr += da2->bitblt.destpitch + 2; } else if (da2->bitblt.x == 0) { - DA2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskl, da2); + da2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskl, da2); da2->bitblt.x++; } else { - DA2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, 0xffff, da2); + da2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, 0xffff, da2); da2->bitblt.x++; } da2->bitblt.destaddr += 2; break; - case DA2_BLT_CFILLTILE: { - int32_t tileaddr = da2->bitblt.srcaddr + (da2->bitblt.y % da2->bitblt.tile_w) * 2; - if (da2->bitblt.x >= da2->bitblt.size_x - 1) { - DA2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2); - if (da2->bitblt.y >= da2->bitblt.size_y - 1) { - da2->bitblt.exec = DA2_BLT_CDONE; + case DA2_BLT_CFILLTILE: + { + int32_t tileaddr = da2->bitblt.srcaddr + (da2->bitblt.y % da2->bitblt.tile_w) * 2; + if (da2->bitblt.x >= da2->bitblt.size_x - 1) { + da2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2); + if (da2->bitblt.y >= da2->bitblt.size_y - 1) { + da2->bitblt.exec = DA2_BLT_CDONE; + } + da2->bitblt.x = 0; + da2->bitblt.y++; + da2->bitblt.destaddr += da2->bitblt.destpitch + 2; + } else if (da2->bitblt.x == 0) { + da2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2); + da2->bitblt.x++; + } else { + da2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, 0xffff, da2); + da2->bitblt.x++; } - da2->bitblt.x = 0; - da2->bitblt.y++; - da2->bitblt.destaddr += da2->bitblt.destpitch + 2; - } else if (da2->bitblt.x == 0) { - DA2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2); - da2->bitblt.x++; - } else { - DA2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, 0xffff, da2); - da2->bitblt.x++; + da2->bitblt.destaddr += 2; + break; } - da2->bitblt.destaddr += 2; - break; - } case DA2_BLT_CCOPYF: + case DA2_BLT_CCOPYF: if (da2->bitblt.x >= da2->bitblt.size_x - 1) { - DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2); + da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2); if (da2->bitblt.y >= da2->bitblt.size_y - 1) { da2->bitblt.exec = DA2_BLT_CDONE; } @@ -1099,10 +1101,10 @@ da2_bitblt_exec(void *p) da2->bitblt.destaddr += da2->bitblt.destpitch + 2; da2->bitblt.srcaddr += da2->bitblt.srcpitch + 2; } else if (da2->bitblt.x == 0) { - DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2); + da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2); da2->bitblt.x++; } else { - DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2); + da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2); da2->bitblt.x++; } da2->bitblt.destaddr += 2; @@ -1110,7 +1112,7 @@ da2_bitblt_exec(void *p) break; case DA2_BLT_CCOPYR: if (da2->bitblt.x >= da2->bitblt.size_x - 1) { - DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2); + da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2); if (da2->bitblt.y >= da2->bitblt.size_y - 1) { da2->bitblt.exec = DA2_BLT_CDONE; } @@ -1121,10 +1123,10 @@ da2_bitblt_exec(void *p) da2->bitblt.destaddr -= 2; da2->bitblt.srcaddr -= 2; } else if (da2->bitblt.x == 0) { - DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2); + da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2); da2->bitblt.x++; } else { - DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2); + da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2); da2->bitblt.x++; } da2->bitblt.destaddr -= 2; @@ -1135,7 +1137,7 @@ da2_bitblt_exec(void *p) if (da2->bitblt.y >= da2->bitblt.size_y) { da2->bitblt.exec = DA2_BLT_CDONE; } else { - DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.size_x, da2->bitblt.fcolor, da2->bitblt.y, da2->bitblt.destaddr, da2->bitblt.maskl, da2->bitblt.maskr, da2); + da2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.size_x, da2->bitblt.fcolor, da2->bitblt.y, da2->bitblt.destaddr, da2->bitblt.maskl, da2->bitblt.maskr, da2); } da2->bitblt.y++; da2->bitblt.destaddr += da2->bitblt.size_x * 2 + da2->bitblt.destpitch + 2; @@ -1151,7 +1153,7 @@ da2_bitblt_exec(void *p) // if (da2->bitblt.indata) // da2->bitblt.exec = DA2_BLT_CLOAD; // else - da2->bitblt.exec = DA2_BLT_CIDLE; + da2->bitblt.exec = DA2_BLT_CIDLE; break; } } @@ -1171,6 +1173,47 @@ da2_bitblt_dopayload(void *priv) // timer_disable(&da2->bitblt.timer); } } +static void +da2_bitblt_addpayload(uint8_t val, void *p) +{ + da2_t *da2 = (da2_t *) p; + da2->bitblt.indata = 1; + if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE) + da2_log("da2_mmio_write payload overflow! addr %x, val %x\n", da2->bitblt.payload_addr, val); + else { + if (da2->bitblt.payload_addr == 0) { + da2->bitblt.payload[da2->bitblt.payload_addr] = val; + da2->bitblt.payload_addr++; + switch (val) { + case 0x88: + case 0x89: + case 0x95: + da2->bitblt.payload_opsize = 3; + break; + case 0x91: + da2->bitblt.payload_opsize = 5; + break; + case 0x99: + da2->bitblt.payload_opsize = 7; + break; + case 0xa1: + da2->bitblt.payload_opsize = 9; + break; + default: + da2_log("addpayload: Unknown PreOP! %x\n", val); + da2->bitblt.payload_addr = 0; /* ignore input */ + break; + } + } else if (da2->bitblt.payload_addr < da2->bitblt.payload_opsize) { + da2->bitblt.payload[da2->bitblt.payload_addr] = val; + da2->bitblt.payload_addr++; + } else if (da2->bitblt.payload_addr == da2->bitblt.payload_opsize) { + da2->bitblt.payload[da2->bitblt.payload_addr] = val; + da2->bitblt.payload_opsize = 0; /* reset */ + da2_bitblt_parse(da2); + } + } +} static void da2_out(uint16_t addr, uint16_t val, void *p) @@ -2052,9 +2095,9 @@ da2_render_textm3(da2_t *da2) int chr_wide = 0; // da2_log("\nda2ma: %x, da2sc: %x\n", da2->ma, da2->sc); for (x = 0; x < da2->hdisp; x += 13) { - chr = DA2_vram_r(DA2_VM03_BASECHR + da2->ma, da2); - attr = DA2_vram_r(DA2_VM03_BASECHR + da2->ma + 1, da2); - extattr = DA2_vram_r(DA2_VM03_BASEEXATTR + da2->ma + 1, da2); + chr = da2_vram_r(DA2_VM03_BASECHR + da2->ma, da2); + attr = da2_vram_r(DA2_VM03_BASECHR + da2->ma + 1, da2); + extattr = da2_vram_r(DA2_VM03_BASEEXATTR + da2->ma + 1, da2); // if(chr!=0x20) da2_log("addr: %x, chr: %x, attr: %x ", (DA2_VM03_BASECHR + da2->ma << 1) & da2->vram_mask, chr, attr); bg = attr >> 4; // if (da2->blink) bg &= ~0x8; @@ -2072,7 +2115,7 @@ da2_render_textm3(da2_t *da2) /* Stay drawing if the char code is DBCS and not at last column. */ if (chr_wide) { /* Get high DBCS code from the next video address */ - chr_dbcs = DA2_vram_r(DA2_VM03_BASECHR + da2->ma + 2, da2); + chr_dbcs = da2_vram_r(DA2_VM03_BASECHR + da2->ma + 2, da2); chr_dbcs <<= 8; chr_dbcs |= chr; /* Get the font pattern */ @@ -2443,19 +2486,19 @@ da2_gdcropB(uint32_t addr,uint8_t bitmask, da2_t *da2) case 0: /*Set*/ // da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) | (da2->gdcsrc[i] & ~bitmask); // da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) | (da2->vram[addr | i] & ~bitmask); - DA2_vram_w(addr | i, (da2->gdcinput[i] & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); + da2_vram_w(addr | i, (da2->gdcinput[i] & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); break; case 1: /*AND*/ // da2->vram[addr | i] = (da2->gdcinput[i] | ~bitmask) & da2->gdcsrc[i]; - DA2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); + da2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); break; case 2: /*OR*/ // da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) | da2->gdcsrc[i]; - DA2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); + da2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); break; case 3: /*XOR*/ // da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) ^ da2->gdcsrc[i]; - DA2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); + da2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2); break; } } @@ -2465,8 +2508,8 @@ da2_gdcropB(uint32_t addr,uint8_t bitmask, da2_t *da2) static void da2_gdcropW(uint32_t addr, uint16_t bitmask, da2_t *da2) { - if((addr & 8) && !(da2->gdcreg[LG_COMMAND] & 0x08)) bitmask = rightRotate(bitmask, 8); - // if((addr & 8)) bitmask = rightRotate(bitmask, 8); + if((addr & 8) && !(da2->gdcreg[LG_COMMAND] & 0x08)) bitmask = da2_rightrotate(bitmask, 8); + // if((addr & 8)) bitmask = da2_rightrotate(bitmask, 8); uint8_t bitmask_l = bitmask & 0xff; uint8_t bitmask_h = bitmask >> 8; for (int i = 0; i < 8; i++) { @@ -2476,29 +2519,29 @@ da2_gdcropW(uint32_t addr, uint16_t bitmask, da2_t *da2) case 0: /*Set*/ // da2->vram[addr | i] = (da2->gdcinput[i] & bitmask_l) | (da2->gdcsrc[i] & ~bitmask_l); // da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) & bitmask_h) | ((da2->gdcsrc[i] >> 8) & ~bitmask_h); - DA2_vram_w(addr | i, (da2->gdcinput[i] & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); - DA2_vram_w((addr + 8) | i, ((da2->gdcinput[i] >> 8) & bitmask_h) + da2_vram_w(addr | i, (da2->gdcinput[i] & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); + da2_vram_w((addr + 8) | i, ((da2->gdcinput[i] >> 8) & bitmask_h) | (da2->vram[(addr + 8) | i] & ~bitmask_h), da2); break; case 1: /*AND*/ // da2->vram[addr | i] = (da2->gdcinput[i] | ~bitmask_l) & da2->gdcsrc[i]; // da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) | ~bitmask_h) & (da2->gdcsrc[i] >> 8); - DA2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); - DA2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) & (da2->gdcsrc[i] >> 8)) & bitmask_h) + da2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); + da2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) & (da2->gdcsrc[i] >> 8)) & bitmask_h) | (da2->vram[(addr + 8) | i] & ~bitmask_h), da2); break; case 2: /*OR*/ // da2->vram[addr | i] = (da2->gdcinput[i] & bitmask_l) | da2->gdcsrc[i]; // da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) & bitmask_h) | (da2->gdcsrc[i] >> 8); - DA2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); - DA2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) | (da2->gdcsrc[i] >> 8)) & bitmask_h) + da2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); + da2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) | (da2->gdcsrc[i] >> 8)) & bitmask_h) | (da2->vram[(addr + 8) | i] & ~bitmask_h), da2); break; case 3: /*XOR*/ // da2->vram[addr | i] = (da2->gdcinput[i] & bitmask_l) ^ da2->gdcsrc[i]; // da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) & bitmask_h) ^ (da2->gdcsrc[i] >> 8); - DA2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); - DA2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) ^ (da2->gdcsrc[i] >> 8)) & bitmask_h) + da2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2); + da2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) ^ (da2->gdcsrc[i] >> 8)) & bitmask_h) | (da2->vram[(addr + 8) | i] & ~bitmask_h), da2); break; } @@ -2625,47 +2668,6 @@ da2_mmio_readw(uint32_t addr, void *p) } } static void -da2_bitblt_addpayload(uint8_t val, void *p) -{ - da2_t *da2 = (da2_t *) p; - da2->bitblt.indata = 1; - if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE) - da2_log("da2_mmio_write payload overflow! addr %x, val %x\n", da2->bitblt.payload_addr, val); - else { - if (da2->bitblt.payload_addr == 0) { - da2->bitblt.payload[da2->bitblt.payload_addr] = val; - da2->bitblt.payload_addr++; - switch (val) { - case 0x88: - case 0x89: - case 0x95: - da2->bitblt.payload_opsize = 3; - break; - case 0x91: - da2->bitblt.payload_opsize = 5; - break; - case 0x99: - da2->bitblt.payload_opsize = 7; - break; - case 0xa1: - da2->bitblt.payload_opsize = 9; - break; - default: - da2_log("addpayload: Unknown PreOP! %x\n", val); - da2->bitblt.payload_addr = 0; /* ignore input */ - break; - } - } else if (da2->bitblt.payload_addr < da2->bitblt.payload_opsize) { - da2->bitblt.payload[da2->bitblt.payload_addr] = val; - da2->bitblt.payload_addr++; - } else if (da2->bitblt.payload_addr == da2->bitblt.payload_opsize) { - da2->bitblt.payload[da2->bitblt.payload_addr] = val; - da2->bitblt.payload_opsize = 0; /* reset */ - da2_bitblt_parse(da2); - } - } -} -static void da2_mmio_write(uint32_t addr, uint8_t val, void *p) { da2_t *da2 = (da2_t *) p; @@ -2765,7 +2767,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p) case 2: /* equiv to vga write mode 1 */ for (int i = 0; i < 8; i++) if (da2->planemask & (1 << i)) - DA2_vram_w(addr | i, da2->gdcsrc[i], da2); + da2_vram_w(addr | i, da2->gdcsrc[i], da2); break; case 0:/* equiv to vga write mode 0 */ if (da2->gdcreg[LG_DATA_ROTATION] & 7) @@ -2773,7 +2775,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p) if (bitmask == 0xff && !(da2->gdcreg[LG_COMMAND] & 0x03) && (!da2->gdcreg[LG_ENABLE_SRJ])) { for (int i = 0; i < 8; i++) if (da2->planemask & (1 << i)) - DA2_vram_w(addr | i, val, da2); + da2_vram_w(addr | i, val, da2); } else { for (int i = 0; i < 8; i++) if (da2->gdcreg[LG_ENABLE_SRJ] & (1 << i)) @@ -2800,12 +2802,12 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p) } } else { /* mode 3h text */ cycles -= video_timing_write_b; - DA2_vram_w(addr, val, da2); + da2_vram_w(addr, val, da2); da2->fullchange = 2; } } static uint16_t -rightRotate(uint16_t data, uint8_t count) +da2_rightrotate(uint16_t data, uint8_t count) { return (data >> count) | (data << (sizeof(data) * 8 - count)); } @@ -2863,18 +2865,18 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p) case 2: for (int i = 0; i < 8; i++) if (da2->planemask & (1 << i)) { - DA2_vram_w(addr | i, da2->gdcsrc[i] & 0xff, da2); - DA2_vram_w((addr + 8) | i, da2->gdcsrc[i] >> 8, da2); + da2_vram_w(addr | i, da2->gdcsrc[i] & 0xff, da2); + da2_vram_w((addr + 8) | i, da2->gdcsrc[i] >> 8, da2); } break; case 0: if (da2->gdcreg[LG_DATA_ROTATION] & 15) - val = rightRotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15); + val = da2_rightrotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15); if (bitmask == 0xffff && !(da2->gdcreg[LG_COMMAND] & 0x03) && (!da2->gdcreg[LG_ENABLE_SRJ])) { for (int i = 0; i < 8; i++) if (da2->planemask & (1 << i)) { - DA2_vram_w(addr | i, val & 0xff, da2); - DA2_vram_w((addr + 8) | i, val >> 8, da2); + da2_vram_w(addr | i, val & 0xff, da2); + da2_vram_w((addr + 8) | i, val >> 8, da2); } } else { for (int i = 0; i < 8; i++) @@ -2893,7 +2895,7 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p) break; case 3: if (da2->gdcreg[LG_DATA_ROTATION] & 15) - val = rightRotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15); + val = da2_rightrotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15); bitmask &= val; for (int i = 0; i < 8; i++) From b484bf1b45fd8c3c177a4d6cdaa5eccd7e182784 Mon Sep 17 00:00:00 2001 From: Akamaki <97360908+akmed772@users.noreply.github.com> Date: Fri, 4 Apr 2025 10:04:43 +0900 Subject: [PATCH 061/118] PS55DA2: Add a bracket to avoid compile warning --- src/video/vid_ps55da2.c | 92 +++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 39adc3607..7abdae157 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -996,60 +996,62 @@ da2_bitblt_exec(void *p) // da2->bitblt.indata = 0; break; case DA2_BLT_CLINE: - /* Draw a dot */ - da2_bltlog("point: %d %d %d %d %d\n", da2->bitblt.x, da2->bitblt.y, da2->bitblt.d, da2->bitblt.x, da2->bitblt.y); - int destaddr = da2->bitblt.y * (da2->rowoffset * 2) + da2->bitblt.x / 8; - int pixelmask = da2->bitblt.x % 16; - if (pixelmask >= 8) - pixelmask = (0x8000 >> (pixelmask - 8)); - else - pixelmask = (0x80 >> pixelmask); + { + /* Draw a dot */ + da2_bltlog("point: %d %d %d %d %d\n", da2->bitblt.x, da2->bitblt.y, da2->bitblt.d, da2->bitblt.x, da2->bitblt.y); + int destaddr = da2->bitblt.y * (da2->rowoffset * 2) + da2->bitblt.x / 8; + int pixelmask = da2->bitblt.x % 16; + if (pixelmask >= 8) + pixelmask = (0x8000 >> (pixelmask - 8)); + else + pixelmask = (0x80 >> pixelmask); - /* check the current position is inside the window */ - if (da2->bitblt.x < da2->bitblt.wx1 || da2->bitblt.x > da2->bitblt.wx2 - || da2->bitblt.y < da2->bitblt.wy1 || da2->bitblt.y > da2->bitblt.wy2) - ; - else - da2_DrawColorWithBitmask(destaddr, da2->bitblt.fcolor, pixelmask, da2); - da2->bitblt.count++; + /* check the current position is inside the window */ + if (da2->bitblt.x < da2->bitblt.wx1 || da2->bitblt.x > da2->bitblt.wx2 + || da2->bitblt.y < da2->bitblt.wy1 || da2->bitblt.y > da2->bitblt.wy2) + ; + else + da2_DrawColorWithBitmask(destaddr, da2->bitblt.fcolor, pixelmask, da2); + da2->bitblt.count++; - /* calculate the next position with Bresenham's line algorithm */ - if (da2->bitblt.octdir & 0x04) { /* dX > dY */ - if (da2->bitblt.octdir & 0x02) { - da2->bitblt.x++; - } else { - da2->bitblt.x--; - } - if (da2->bitblt.d >= 0) { - da2->bitblt.d -= (2 * da2->bitblt.size_x); - if (da2->bitblt.octdir & 0x01) { - da2->bitblt.y++; - } else { - da2->bitblt.y--; - } - } - da2->bitblt.d += (2 * da2->bitblt.size_y); - if (da2->bitblt.count >= da2->bitblt.size_x) - da2->bitblt.exec = DA2_BLT_CDONE; - } else { - if (da2->bitblt.octdir & 0x01) { - da2->bitblt.y++; - } else { - da2->bitblt.y--; - } - if (da2->bitblt.d >= 0) { - da2->bitblt.d -= (2 * da2->bitblt.size_y); + /* calculate the next position with Bresenham's line algorithm */ + if (da2->bitblt.octdir & 0x04) { /* dX > dY */ if (da2->bitblt.octdir & 0x02) { da2->bitblt.x++; } else { da2->bitblt.x--; } + if (da2->bitblt.d >= 0) { + da2->bitblt.d -= (2 * da2->bitblt.size_x); + if (da2->bitblt.octdir & 0x01) { + da2->bitblt.y++; + } else { + da2->bitblt.y--; + } + } + da2->bitblt.d += (2 * da2->bitblt.size_y); + if (da2->bitblt.count >= da2->bitblt.size_x) + da2->bitblt.exec = DA2_BLT_CDONE; + } else { + if (da2->bitblt.octdir & 0x01) { + da2->bitblt.y++; + } else { + da2->bitblt.y--; + } + if (da2->bitblt.d >= 0) { + da2->bitblt.d -= (2 * da2->bitblt.size_y); + if (da2->bitblt.octdir & 0x02) { + da2->bitblt.x++; + } else { + da2->bitblt.x--; + } + } + da2->bitblt.d += (2 * da2->bitblt.size_x); + if (da2->bitblt.count >= da2->bitblt.size_y) + da2->bitblt.exec = DA2_BLT_CDONE; } - da2->bitblt.d += (2 * da2->bitblt.size_x); - if (da2->bitblt.count >= da2->bitblt.size_y) - da2->bitblt.exec = DA2_BLT_CDONE; + break; } - break; case DA2_BLT_CFILLRECT: // da2_log("%x %x %x\n", da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y); if (da2->bitblt.x >= da2->bitblt.size_x - 1) { From d3d5d3e7805d8c01b80d714057089b6deead4614 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 4 Apr 2025 18:19:28 +0200 Subject: [PATCH 062/118] Fix the calculation of the number of sectors per packet and stop the transfer when the total sector count has reached zero, fixes #5432. --- src/scsi/scsi_cdrom.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 9ae65be74..e5689dd76 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1055,7 +1055,7 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int ret = -1; } else { ret = 1; - for (int i = 0; (i < num) && (ret > 0); i++) { + for (int i = 0; (i < num) && (ret > 0) && (dev->sector_len > 0); i++) { ret = cdrom_readsector_raw(dev->drv, dev->buffer + dev->buffer_pos, dev->sector_pos, msf, type, flags, &temp_len, vendor_type); @@ -1070,7 +1070,11 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int if ((dev->drv->bus_type != CDROM_BUS_SCSI) && (scsi_cdrom_current_mode(dev) != 2)) { - num = (dev->packet_len / dev->block_len); + num = (dev->tf->request_length < dev->block_len) ? + dev->block_len : dev->tf->request_length; + num = (num / dev->block_len) * dev->block_len; + if (num > dev->sector_len) + num = dev->sector_len; } } From 1c38e059c4b9074ad17729a2dfe981e90d1a000c Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 4 Apr 2025 18:29:28 +0200 Subject: [PATCH 063/118] PS/55 DA2: Fix warnings. --- src/video/vid_ps55da2.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 7abdae157..9a95e6ce6 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -596,7 +596,9 @@ getRAMFont(int32_t code, int line, int x, void *p) { da2_t *da2 = (da2_t *) p; uint32_t font = 0; +#ifdef RESERVED_FOR_FUTURE_USE int fline = line - 2; /* Start line of drawing character (line >= 1 AND line < 24 + 1 ) */ +#endif if (code < 0x100) { /* SBCS 13x29 */ code *= 0x40; code += DA2_GAIJIRAM_SBCS + (line * 2) + x; @@ -620,6 +622,7 @@ getRAMFont(int32_t code, int line, int x, void *p) font = 0; return font; } +#ifdef RESERVED_FOR_FUTURE_USE /* Reverse the bit order of attribute code IBGR to IRGB(used in Mode 3 and Cursor Color) */ static int8_t IBGRtoIRGB(uint8_t attr) @@ -627,6 +630,7 @@ IBGRtoIRGB(uint8_t attr) attr = ((attr & 0x01) << 6) | ((attr & 0x02) << 4) | ((attr & 0x04) << 2) | ((attr & 0x08) << 4); return attr >>= 4; } +#endif static void da2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, uint32_t destaddr, uint16_t maskl, uint16_t maskr, da2_t *da2) { From fd2214f54471c02bea2c99deda54ac138f5d4f43 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 4 Apr 2025 18:55:22 +0200 Subject: [PATCH 064/118] Intel Classic/PCI: Return input port (P1) bit 4 clear, fixes #5435. --- src/device/kbc_at.c | 59 +++++++++++++++++++++++++++++++----- src/machine/m_at_386dx_486.c | 5 +-- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index abb10d108..f8fd33e62 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -1070,10 +1070,14 @@ write64_generic(void *priv, uint8_t val) fixed_bits |= 8; /* (B0 or F0) | (0x04 or 0x0c) */ kbc_delay_to_ob(dev, dev->p1 | fixed_bits, 0, 0x00); - } else if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_GREEN)) + } else if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_GREEN)) { /* (B0 or F0) | (0x08 or 0x0c) */ - kbc_delay_to_ob(dev, ((dev->p1 | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00); - else if (kbc_ven == KBC_VEN_COMPAQ) + uint8_t p1_out = ((dev->p1 | fixed_bits) & 0xf0) | + (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c); + if (!strcmp(machine_get_internal_name(), "alfredo")) + p1_out &= 0xef; + kbc_delay_to_ob(dev, p1_out, 0, 0x00); + } else if (kbc_ven == KBC_VEN_COMPAQ) kbc_delay_to_ob(dev, dev->p1 | (hasfpu ? 0x00 : 0x04), 0, 0x00); else /* (B0 or F0) | (0x04 or 0x44) */ @@ -1578,8 +1582,13 @@ write64_phoenix(void *priv, uint8_t val) case 0xd5: /* Read MultiKey code revision level */ kbc_at_log("ATkbc: Phoenix - Read MultiKey code revision level\n"); if (dev->misc_flags & FLAG_PS2) { - kbc_at_queue_add(dev, 0x04); - kbc_at_queue_add(dev, 0x16); + if (dev->flags & DEVICE_PCI) { + kbc_at_queue_add(dev, 0x04); + kbc_at_queue_add(dev, 0x16); + } else { + kbc_at_queue_add(dev, 0x01); + kbc_at_queue_add(dev, 0x38); + } } else { kbc_at_queue_add(dev, 0x01); kbc_at_queue_add(dev, 0x29); @@ -1598,9 +1607,15 @@ write64_phoenix(void *priv, uint8_t val) case 0xd7: /* Read MultiKey model numbers */ kbc_at_log("ATkbc: Phoenix - Read MultiKey model numbers\n"); if (dev->misc_flags & FLAG_PS2) { - kbc_at_queue_add(dev, 0x02); - kbc_at_queue_add(dev, 0x87); - kbc_at_queue_add(dev, 0x02); + if (dev->flags & DEVICE_PCI) { + kbc_at_queue_add(dev, 0x02); + kbc_at_queue_add(dev, 0x87); + kbc_at_queue_add(dev, 0x02); + } else { + kbc_at_queue_add(dev, 0x99); + kbc_at_queue_add(dev, 0x75); + kbc_at_queue_add(dev, 0x01); + } } else { kbc_at_queue_add(dev, 0x90); kbc_at_queue_add(dev, 0x88); @@ -2608,6 +2623,20 @@ const device_t keyboard_ps2_ami_device = { .config = NULL }; +const device_t keyboard_ps2_compaq_device = { + .name = "PS/2 Keyboard (Compaq)", + .internal_name = "keyboard_at_compaq", + .flags = DEVICE_KBC, + .local = KBC_TYPE_PS2_1 | KBC_VEN_COMPAQ, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t keyboard_ps2_holtek_device = { .name = "PS/2 Keyboard (Holtek)", .internal_name = "keyboard_ps2_holtek", @@ -2775,3 +2804,17 @@ const device_t keyboard_ps2_acer_pci_device = { .force_redraw = NULL, .config = NULL }; + +const device_t keyboard_ps2_phoenix_pci_device = { + .name = "PS/2 Keyboard (Phoenix)", + .internal_name = "keyboard_ps2_acer_pci", + .flags = DEVICE_KBC | DEVICE_PCI, + .local = KBC_TYPE_PS2_1 | KBC_VEN_PHOENIX, + .init = kbc_at_init, + .close = kbc_at_close, + .reset = kbc_at_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 7f285af65..4e659dd77 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -1281,14 +1281,15 @@ machine_at_ninja_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init(model); + machine_at_common_init_ex(model, 2); + device_add(&amstrad_megapc_nvr_device); pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x05, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 1, 2); pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 2, 1); pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 1, 2, 1); - device_add(&keyboard_ps2_intel_ami_pci_device); + device_add(&keyboard_ps2_phoenix_device); device_add(&intel_flash_bxt_ami_device); device_add(&i420ex_device); From 6d2128ab0573cfdc0cf5d31a4437d051de91123c Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 5 Apr 2025 23:59:49 +0600 Subject: [PATCH 065/118] Make Qt shortcuts actually work in fullscreen Also removes hacks related to fullscreen. --- src/qt/qt_main.cpp | 4 --- src/qt/qt_mainwindow.cpp | 59 +++++++++++++++++++--------------------- src/qt/qt_mainwindow.hpp | 1 - 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 2ef797bd1..1f1dd6b49 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -194,8 +194,6 @@ win_keyboard_handle(uint32_t scancode, int up, int e0, int e1) it's not an invalid scan code. */ if (scancode != 0xFFFF) keyboard_input(!up, scancode); - - main_window->checkFullscreenHotkey(); } } @@ -370,8 +368,6 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) else if ((lpKdhs->scanCode == 0x3e) && (lpKdhs->flags & LLKHF_ALTDOWN) && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) ret = TRUE; - else if ((lpKdhs->scanCode == 0x49) && bCtrlDown && !(lpKdhs->flags & LLKHF_UP)) - ret = TRUE; else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED)) ret = TRUE; else if (inhibit_multimedia_keys diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 4c04ce76e..806e8e0e6 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -674,6 +674,13 @@ MainWindow::MainWindow(QWidget *parent) /* Remove default Shift+F10 handler, which unfocuses keyboard input even with no context menu. */ connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_F10), this), &QShortcut::activated, this, [](){}); + auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_PageDown), this); + windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut); + connect(windowedShortcut, &QShortcut::activated, this, [this] () { + if (video_fullscreen) + ui->actionFullscreen->trigger(); + }); + connect(this, &MainWindow::initRendererMonitor, this, &MainWindow::initRendererMonitorSlot); connect(this, &MainWindow::initRendererMonitorForNonQtThread, this, &MainWindow::initRendererMonitorSlot, Qt::BlockingQueuedConnection); connect(this, &MainWindow::destroyRendererMonitor, this, &MainWindow::destroyRendererMonitorSlot); @@ -696,6 +703,22 @@ MainWindow::MainWindow(QWidget *parent) }); #endif + QTimer::singleShot(0, this, [this]() { + for (auto curObj : this->menuBar()->children()) { + if (qobject_cast(curObj)) { + auto menu = qobject_cast(curObj); + for (auto curObj2 : menu->children()) { + if (qobject_cast(curObj2)) { + auto action = qobject_cast(curObj2); + if (!action->shortcut().isEmpty()) { + this->insertAction(nullptr, action); + } + } + } + } + } + }); + actGroup = new QActionGroup(this); actGroup->addAction(ui->actionCursor_Puck); actGroup->addAction(ui->actionPen); @@ -833,6 +856,11 @@ MainWindow::initRendererMonitorSlot(int monitor_index) }); secondaryRenderer->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); secondaryRenderer->setWindowTitle(QObject::tr("86Box Monitor #") + QString::number(monitor_index + 1)); + secondaryRenderer->setContextMenuPolicy(Qt::PreventContextMenu); + + for (int i = 0; i < this->actions().size(); i++) { + secondaryRenderer->addAction(this->actions()[i]); + } if (vid_resize == 2) secondaryRenderer->setFixedSize(fixed_size_x, fixed_size_y); @@ -1360,18 +1388,9 @@ MainWindow::keyPressEvent(QKeyEvent *event) #endif } - checkFullscreenHotkey(); - if (keyboard_ismsexit()) plat_mouse_capture(0); - if ((video_fullscreen > 0) && (keyboard_recv_ui(0x1D) || keyboard_recv_ui(0x11D))) { - if (keyboard_recv_ui(0x57)) - ui->actionTake_screenshot->trigger(); - else if (keyboard_recv_ui(0x58)) - pc_send_cad(); - } - event->accept(); } @@ -1403,28 +1422,6 @@ MainWindow::keyReleaseEvent(QKeyEvent *event) processKeyboardInput(false, event->nativeScanCode()); #endif } - - checkFullscreenHotkey(); -} - -void -MainWindow::checkFullscreenHotkey() -{ - if (!fs_off_signal && video_fullscreen && keyboard_isfsexit()) { - /* Signal "exit fullscreen mode". */ - fs_off_signal = true; - } else if (fs_off_signal && video_fullscreen && keyboard_isfsexit_up()) { - ui->actionFullscreen->trigger(); - fs_off_signal = false; - } - - if (!fs_on_signal && !video_fullscreen && keyboard_isfsenter()) { - /* Signal "enter fullscreen mode". */ - fs_on_signal = true; - } else if (fs_on_signal && !video_fullscreen && keyboard_isfsenter_up()) { - ui->actionFullscreen->trigger(); - fs_on_signal = false; - } } QSize diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index f1c6cadf6..5c8bd388b 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -31,7 +31,6 @@ public: void blitToWidget(int x, int y, int w, int h, int monitor_index); QSize getRenderWidgetSize(); void setSendKeyboardInput(bool enabled); - void checkFullscreenHotkey(); void reloadAllRenderers(); std::array, 8> renderers; From 375590b93b0939154513e248d46d281bf0a3f0c9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 6 Apr 2025 01:05:12 +0200 Subject: [PATCH 066/118] Bochs SVGA: Add some sanity check to avoid the LFB and BIOS being mapped to either at the very bottom or top of the memory space. --- src/video/vid_bochs_vbe.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/video/vid_bochs_vbe.c b/src/video/vid_bochs_vbe.c index 84fb110c6..ac7bc00cb 100644 --- a/src/video/vid_bochs_vbe.c +++ b/src/video/vid_bochs_vbe.c @@ -686,7 +686,7 @@ bochs_vbe_pci_read(const int func, const int addr, void *priv) ret = dev->pci_rom_enable & 0x01; break; case 0x32: - ret = dev->rom_addr & 0xff; + ret = dev->rom_addr & 0xfc; break; case 0x33: ret = (dev->rom_addr & 0xff00) >> 8; @@ -743,6 +743,7 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri mem_mapping_disable(&dev->linear_mapping_2); mem_mapping_disable(&dev->linear_mapping); mem_mapping_disable(&dev->svga.mapping); + mem_mapping_disable(&dev->bios_rom.mapping); if (dev->pci_conf_status & PCI_COMMAND_IO) { io_sethandler(0x03c0, 0x0020, bochs_vbe_in, NULL, NULL, bochs_vbe_out, NULL, NULL, dev); @@ -751,11 +752,13 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri } if (dev->pci_conf_status & PCI_COMMAND_MEM) { mem_mapping_enable(&dev->svga.mapping); - if (dev->pci_regs[0x13] != 0x00) { + if ((dev->pci_regs[0x13] != 0x00) && (dev->pci_regs[0x13] != 0xff)) { mem_mapping_enable(&dev->linear_mapping); if (dev->pci_regs[0x13] != 0xe0) mem_mapping_enable(&dev->linear_mapping_2); } + if (dev->pci_rom_enable && (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) + mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000); } break; case 0x13: @@ -764,7 +767,7 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri mem_mapping_disable(&dev->linear_mapping_2); mem_mapping_disable(&dev->linear_mapping); - if ((dev->pci_conf_status & PCI_COMMAND_MEM) && (val != 0x00)) { + if ((dev->pci_conf_status & PCI_COMMAND_MEM) && (val != 0x00) && (val != 0xff)) { mem_mapping_set_addr(&dev->linear_mapping, val << 24, 0x01000000); if (val != 0xe0) mem_mapping_set_addr(&dev->linear_mapping_2, 0xe0000000, 0x01000000); @@ -776,18 +779,26 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri case 0x30: dev->pci_rom_enable = val & 0x01; mem_mapping_disable(&dev->bios_rom.mapping); - if (dev->pci_rom_enable) + if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) && + (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) { mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000); + } break; case 0x32: dev->rom_addr = (dev->rom_addr & 0xff00) | (val & 0xfc); - if (dev->pci_rom_enable) + mem_mapping_disable(&dev->bios_rom.mapping); + if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) && + (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) { mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000); + } break; case 0x33: dev->rom_addr = (dev->rom_addr & 0x00ff) | (val << 8); - if (dev->pci_rom_enable) + mem_mapping_disable(&dev->bios_rom.mapping); + if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) && + (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) { mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000); + } break; } } From 06bacb6912be8688cb3f617a4e4edb02195ae3f0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 7 Apr 2025 01:01:26 +0600 Subject: [PATCH 067/118] Bochs SVGA: Buffer window switching now works properly --- src/video/vid_bochs_vbe.c | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/src/video/vid_bochs_vbe.c b/src/video/vid_bochs_vbe.c index ac7bc00cb..6dc015fb0 100644 --- a/src/video/vid_bochs_vbe.c +++ b/src/video/vid_bochs_vbe.c @@ -338,20 +338,13 @@ bochs_vbe_recalctimings(svga_t* svga) svga->rowoffset = (dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] / 2) >> 3; svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) + (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] >> 3); + + svga->fullchange = 3; } else { svga->rowoffset = dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)); svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) + - (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8))); - } - if (svga->ma_latch != dev->ma_latch_old) { - if (svga->bpp == 4) { - svga->maback = (svga->maback - (dev->ma_latch_old << 2)) + - (svga->ma_latch << 2); - } else { - svga->maback = (svga->maback - (dev->ma_latch_old)) + - (svga->ma_latch); - dev->ma_latch_old = svga->ma_latch; - } + (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8))); + svga->fullchange = 3; } if (svga->bpp == 4) @@ -482,18 +475,10 @@ bochs_vbe_outw(const uint16_t addr, const uint16_t val, void *priv) } else { svga->rowoffset = dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)); svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) + - (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8))); - } - if (svga->ma_latch != dev->ma_latch_old) { - if (svga->bpp == 4) { - svga->maback = (svga->maback - (dev->ma_latch_old << 2)) + - (svga->ma_latch << 2); - } else { - svga->maback = (svga->maback - (dev->ma_latch_old)) + - (svga->ma_latch); - dev->ma_latch_old = svga->ma_latch; - } + (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8))); } + + svga->fullchange = 3; } else svga_recalctimings(&dev->svga); From 449c224ff7dd4640088321c3befa65c4a13ab5f7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 6 Apr 2025 21:23:53 +0200 Subject: [PATCH 068/118] SiS 471: Fix array out of bounds writes. --- src/chipset/sis_85c4xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index 6e26a4751..537675a85 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -375,7 +375,7 @@ sis_85c4xx_init(const device_t *info) dev->reg_base = info->local & 0xff; if (dev->is_471) { - dev->reg_last = dev->reg_base + 0x76; + dev->reg_last = 0x76; dev->smram = smram_add(); From e48d64de4572e8a42217f51e2c69327f0d1fec64 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 7 Apr 2025 01:44:12 +0200 Subject: [PATCH 069/118] SCSI CD-ROM/Disk/MO/ZIP: Treat data commands with request length 0 in ATAPI PIO mode as non-data commands, also allow WIN_SRST to go through BSY, fixes the regressions introduced in build 6731 reported by JVERNET. --- src/disk/hdc_ide.c | 51 +++++++++++++++++++++++++++++++------------ src/disk/mo.c | 5 ++++- src/disk/zip.c | 5 ++++- src/scsi/scsi_cdrom.c | 20 ++++++++++++----- src/scsi/scsi_disk.c | 5 ++++- 5 files changed, 64 insertions(+), 22 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 01690cd70..04e580e72 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1208,7 +1208,9 @@ ide_atapi_pio_request(ide_t *ide, uint8_t out) ide->tf->atastat = BSY_STAT; if (ide->tf->pos >= dev->packet_len) { - ide_log("%i bytes %s, command done\n", ide->tf->pos, out ? "written" : "read"); + // ide_log("%i bytes %s, command done\n", ide->tf->pos, out ? "written" : "read"); + ide_log("%i bytes %s, command done, %i sectors left\n", ide->tf->pos, out ? "written" : "read", + dev->sector_len); ide->tf->pos = dev->request_pos = 0; @@ -1262,13 +1264,12 @@ ide_atapi_pio_request(ide_t *ide, uint8_t out) ide_atapi_callback(ide); ide_set_callback(ide, 0.0); } else { - ide->sc->packet_status = PHASE_COMPLETE; - ide->sc->callback = 0.0; - if (ide->phase_data_out != NULL) (void) ide->phase_data_out(dev); - ide_atapi_callback(ide); + if ((ide->sc->packet_status == PHASE_COMPLETE) && + (ide->sc->callback == 0.0)) + ide_atapi_callback(ide); } } } else { @@ -1280,10 +1281,9 @@ ide_atapi_pio_request(ide_t *ide, uint8_t out) if (ide->command_stop != NULL) ide->command_stop(dev); - ide->sc->packet_status = PHASE_COMPLETE; - ide->sc->callback = 0.0; - - ide_atapi_callback(ide); + if ((ide->sc->packet_status == PHASE_COMPLETE) && + (ide->sc->callback == 0.0)) + ide_atapi_callback(ide); } } else if (ide->read != NULL) ide->read(dev); @@ -1299,8 +1299,8 @@ ide_atapi_packet_read(ide_t *ide) uint16_t ret = 0; if (dev && dev->temp_buffer && (dev->packet_status == PHASE_DATA_IN)) { - ide_log("PHASE_DATA_IN read: %i, %i, %i, %i\n", - dev->request_pos, dev->max_transfer_len, ide->tf->pos, dev->packet_len); + /* ide_log("PHASE_DATA_IN read: %i, %i, %i, %i\n", + dev->request_pos, dev->max_transfer_len, ide->tf->pos, dev->packet_len); */ bufferw = (uint16_t *) dev->temp_buffer; @@ -1722,7 +1722,8 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv) break; case 0x7: /* Command register */ - if (ide->tf->atastat & (BSY_STAT | DRQ_STAT)) + if ((ide->tf->atastat & (BSY_STAT | DRQ_STAT)) && + ((val != WIN_SRST) || (ide->type != IDE_ATAPI))) break; if ((ide->type == IDE_NONE) || ((ide->type & IDE_SHADOW) && (val != WIN_DRIVE_DIAGNOSTICS))) @@ -2158,7 +2159,8 @@ ide_read_alt_status(UNUSED(const uint16_t addr), void *priv) if (!(addr & 0x0001)) ret = ide_status(ide, ide_drives[ch ^ 1], ch); - ide_log("[%04X:%08X] ide_read_alt_status(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret); + // ide_log("[%04X:%08X] ide_read_alt_status(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret); + // ide_log("ide_read_alt_status(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret); return ret; } @@ -3159,6 +3161,13 @@ ide_init(const device_t *info) ide_board_init(1, HDC_SECONDARY_IRQ, HDC_SECONDARY_BASE, HDC_SECONDARY_SIDE, info->local, info->flags); break; + case 8 ... 0x0d: + ide_board_init(2, -1, 0, 0, info->local, info->flags); + + if (info->local & 1) + ide_board_init(3, -1, 0, 0, info->local, info->flags); + break; + default: break; } @@ -3540,7 +3549,7 @@ const device_t mcide_device = { .name = "MCA McIDE Controller", .internal_name = "ide_mcide", .flags = DEVICE_MCA, - .local = 3, + .local = 1, .init = mcide_init, .close = mcide_close, .reset = mcide_reset, @@ -3661,3 +3670,17 @@ const device_t ide_qua_pnp_device = { .force_redraw = NULL, .config = NULL }; + +const device_t ide_pci_ter_qua_2ch_device = { + .name = "PCI IDE Controller (Dual-Channel Tertiary/Quaternary)", + .internal_name = "ide_pci_ter_qua_2ch", + .flags = DEVICE_PCI, + .local = 0x0d, + .init = ide_init, + .close = ide_close, + .reset = ide_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/disk/mo.c b/src/disk/mo.c index f1cd3b983..a20333404 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -584,7 +584,10 @@ mo_data_command_finish(mo_t *dev, int len, const int block_len, mo_command_write_dma(dev); } else { mo_update_request_length(dev, len, block_len); - if (direction == 0) + if ((dev->drv->bus_type != MO_BUS_SCSI) && + (dev->tf->request_length == 0)) + mo_command_complete(dev); + else if (direction == 0) mo_command_read(dev); else mo_command_write(dev); diff --git a/src/disk/zip.c b/src/disk/zip.c index eecafb802..7a407c5fe 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -665,7 +665,10 @@ zip_data_command_finish(zip_t *dev, int len, const int block_len, zip_command_write_dma(dev); } else { zip_update_request_length(dev, len, block_len); - if (direction == 0) + if ((dev->drv->bus_type != ZIP_BUS_SCSI) && + (dev->tf->request_length == 0)) + zip_command_complete(dev); + else if (direction == 0) zip_command_read(dev); else zip_command_write(dev); diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index e5689dd76..2b37eeaca 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -15,6 +15,7 @@ */ #include #include +#define ENABLE_SCSI_CDROM_LOG 2 #ifdef ENABLE_SCSI_CDROM_LOG #include #endif @@ -689,6 +690,7 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev) bytes_per_second *= (double) dev->drv->cur_speed; } else { bytes_per_second = scsi_cdrom_bus_speed(dev); + pclog("%lf bytes per second\n", bytes_per_second); if (bytes_per_second == 0.0) { dev->callback = -1; /* Speed depends on SCSI controller */ return; @@ -698,19 +700,24 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev) period = 1000000.0 / bytes_per_second; scsi_cdrom_log(dev->log, "Byte transfer period: %" PRIu64 " us\n", (uint64_t) period); + pclog("Byte transfer period: %lf us (%i bytes)\n", period, dev->packet_len); if (dev->was_cached == -1) period *= (double) dev->packet_len; else { + int atapi_num = (dev->tf->request_length < dev->block_len) ? + dev->block_len : dev->tf->request_length; + atapi_num = (atapi_num / dev->block_len) * dev->block_len; + if (atapi_num > dev->sector_len) + atapi_num = dev->sector_len; const int num = ((dev->drv->bus_type == CDROM_BUS_SCSI) || - (dev->block_len == 0)) ? - dev->requested_blocks : - ((scsi_cdrom_current_mode(dev) == 2) ? 1 : - (dev->packet_len / dev->block_len)); + (dev->block_len == 0)) ? dev->requested_blocks : + ((scsi_cdrom_current_mode(dev) == 2) ? 1 : atapi_num); period *= ((double) num) * 2352.0; } scsi_cdrom_log(dev->log, "Sector transfer period: %" PRIu64 " us\n", (uint64_t) period); + pclog("Data transfer period: %lf us\n", period); dev->callback += period; } scsi_cdrom_set_callback(dev); @@ -800,7 +807,10 @@ scsi_cdrom_data_command_finish(scsi_cdrom_t *dev, int len, int block_len, int al scsi_cdrom_command_write_dma(dev); } else { scsi_cdrom_update_request_length(dev, len, block_len); - if (direction == 0) + if ((dev->drv->bus_type != CDROM_BUS_SCSI) && + (dev->tf->request_length == 0)) + scsi_cdrom_command_complete(dev); + else if (direction == 0) scsi_cdrom_command_read(dev); else scsi_cdrom_command_write(dev); diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index 8528db1fb..0a035a23d 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -570,7 +570,10 @@ scsi_disk_data_command_finish(scsi_disk_t *dev, int len, const int block_len, scsi_disk_command_write_dma(dev); } else { scsi_disk_update_request_length(dev, len, block_len); - if (direction == 0) + if ((dev->drv->bus_type != HDD_BUS_SCSI) && + (dev->tf->request_length == 0)) + scsi_disk_command_complete(dev); + else if (direction == 0) scsi_disk_command_read(dev); else scsi_disk_command_write(dev); From b93af353efc0f9a93690d4011ad0e4b456ae7412 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 7 Apr 2025 01:46:09 +0200 Subject: [PATCH 070/118] SCSI CD-ROM: Remove leftover excess logging. --- src/scsi/scsi_cdrom.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 2b37eeaca..306eed884 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -15,7 +15,6 @@ */ #include #include -#define ENABLE_SCSI_CDROM_LOG 2 #ifdef ENABLE_SCSI_CDROM_LOG #include #endif @@ -681,8 +680,7 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev) /* Seek time is in us. */ period = cdrom_seek_time(dev->drv); - scsi_cdrom_log(dev->log, "Seek period: %" PRIu64 " us\n", - (uint64_t) period); + scsi_cdrom_log(dev->log, "Seek period: %lf us\n", period); dev->callback += period; /* 44100 * 16 bits * 2 channels = 176400 bytes per second */ @@ -690,7 +688,6 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev) bytes_per_second *= (double) dev->drv->cur_speed; } else { bytes_per_second = scsi_cdrom_bus_speed(dev); - pclog("%lf bytes per second\n", bytes_per_second); if (bytes_per_second == 0.0) { dev->callback = -1; /* Speed depends on SCSI controller */ return; @@ -698,9 +695,7 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev) } period = 1000000.0 / bytes_per_second; - scsi_cdrom_log(dev->log, "Byte transfer period: %" PRIu64 " us\n", - (uint64_t) period); - pclog("Byte transfer period: %lf us (%i bytes)\n", period, dev->packet_len); + scsi_cdrom_log(dev->log, "Byte transfer period: %lf us\n", period); if (dev->was_cached == -1) period *= (double) dev->packet_len; else { @@ -715,9 +710,7 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev) period *= ((double) num) * 2352.0; } - scsi_cdrom_log(dev->log, "Sector transfer period: %" PRIu64 " us\n", - (uint64_t) period); - pclog("Data transfer period: %lf us\n", period); + scsi_cdrom_log(dev->log, "Sector transfer period: %lf us\n", period); dev->callback += period; } scsi_cdrom_set_callback(dev); From 018ff46253293e39dc6c7aa9140c3425b6609825 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 7 Apr 2025 05:42:41 +0200 Subject: [PATCH 071/118] CD-ROM: Actually remember and use the correct number of sectors for the period, fixes... well, any kind of data reading. --- src/include/86box/scsi_cdrom.h | 1 + src/scsi/scsi_cdrom.c | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/include/86box/scsi_cdrom.h b/src/include/86box/scsi_cdrom.h index 7bb39d9db..c01f347a8 100644 --- a/src/include/86box/scsi_cdrom.h +++ b/src/include/86box/scsi_cdrom.h @@ -70,6 +70,7 @@ typedef struct scsi_cdrom_t { int was_cached; int toc_cached; int media_access; + int sectors_num; uint8_t vendor_type; uint8_t ven_cmd_is_data[256]; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 306eed884..246f185e8 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -699,14 +699,9 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev) if (dev->was_cached == -1) period *= (double) dev->packet_len; else { - int atapi_num = (dev->tf->request_length < dev->block_len) ? - dev->block_len : dev->tf->request_length; - atapi_num = (atapi_num / dev->block_len) * dev->block_len; - if (atapi_num > dev->sector_len) - atapi_num = dev->sector_len; const int num = ((dev->drv->bus_type == CDROM_BUS_SCSI) || - (dev->block_len == 0)) ? dev->requested_blocks : - ((scsi_cdrom_current_mode(dev) == 2) ? 1 : atapi_num); + (dev->block_len == 0)) ? dev->sectors_num : + ((scsi_cdrom_current_mode(dev) == 2) ? 1 : dev->sectors_num); period *= ((double) num) * 2352.0; } @@ -1051,6 +1046,8 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int int num = (dev->drv->bus_type == CDROM_BUS_SCSI) ? dev->requested_blocks : 1; + dev->sectors_num = 0; + if (dev->drv->cd_status == CD_STATUS_EMPTY) scsi_cdrom_not_ready(dev); else if (dev->sector_pos > dev->drv->cdrom_capacity) { @@ -1085,6 +1082,7 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int dev->drv->seek_pos = dev->sector_pos; dev->sector_len--; + dev->sectors_num++; dev->buffer_pos += temp_len; } @@ -2423,6 +2421,7 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb) int32_t *BufLen; dev->was_cached = -1; + dev->sectors_num = 1; if (dev->drv->bus_type == CDROM_BUS_SCSI) { BufLen = &scsi_devices[scsi_bus][scsi_id].buffer_length; From 3b5966eb465830b4fdb367d89cd44a930cb098ea Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 7 Apr 2025 06:03:19 +0200 Subject: [PATCH 072/118] LDS/LES/LFS/LGS/LSS: Fix segment wraparounds in 16-bit address mode. --- src/codegen/codegen_ops_x86-64.h | 7 ++++ src/codegen/codegen_ops_x86.h | 7 ++++ src/codegen_new/codegen_backend_arm64_uops.c | 2 + src/codegen_new/codegen_backend_arm_uops.c | 2 + src/codegen_new/codegen_backend_x86-64_uops.c | 9 +++- src/codegen_new/codegen_backend_x86_uops.c | 9 +++- src/codegen_new/codegen_ir_defs.h | 10 ++++- src/codegen_new/codegen_ops_misc.c | 8 ++-- src/codegen_new/codegen_reg.c | 2 + src/codegen_new/codegen_reg.h | 4 +- src/cpu/386_common.h | 26 ++++++++++++ src/cpu/cpu.h | 5 ++- src/cpu/x86_ops_mov_seg.h | 41 +++++++++++-------- src/cpu/x86_ops_ret.h | 2 +- src/cpu/x86_ops_ret_2386.h | 2 +- 15 files changed, 105 insertions(+), 31 deletions(-) diff --git a/src/codegen/codegen_ops_x86-64.h b/src/codegen/codegen_ops_x86-64.h index e46f55a05..1be5dfdce 100644 --- a/src/codegen/codegen_ops_x86-64.h +++ b/src/codegen/codegen_ops_x86-64.h @@ -1054,6 +1054,13 @@ MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset) addbyte(0x83); /*ADD EAX, offset*/ addbyte(0xc0); addbyte(offset); + if (!(op_32 & 0x200)) { + addbyte(0x25) /* AND EAX, ffffh */ + addbyte(0xff); + addbyte(0xff); + addbyte(0x00); + addbyte(0x00); + } MEM_LOAD_ADDR_EA_W(seg); } static __inline void diff --git a/src/codegen/codegen_ops_x86.h b/src/codegen/codegen_ops_x86.h index c48324c2a..7a56b5fe1 100644 --- a/src/codegen/codegen_ops_x86.h +++ b/src/codegen/codegen_ops_x86.h @@ -802,6 +802,13 @@ MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset) addbyte(0x83); /*ADD EAX, offset*/ addbyte(0xc0); addbyte(offset); + if (!(op_32 & 0x200)) { + addbyte(0x25) /* AND EAX, ffffh */ + addbyte(0xff); + addbyte(0xff); + addbyte(0x00); + addbyte(0x00); + } addbyte(0xe8); /*CALL mem_load_addr_ea_w*/ addlong(mem_load_addr_ea_w - (uint32_t) (&codeblock[block_current].data[block_pos + 4])); diff --git a/src/codegen_new/codegen_backend_arm64_uops.c b/src/codegen_new/codegen_backend_arm64_uops.c index deaf53c20..82cc79cfd 100644 --- a/src/codegen_new/codegen_backend_arm64_uops.c +++ b/src/codegen_new/codegen_backend_arm64_uops.c @@ -931,6 +931,8 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop) host_arm64_ADD_REG(block, REG_X0, seg_reg, addr_reg, 0); if (uop->imm_data) host_arm64_ADD_IMM(block, REG_X0, REG_X0, uop->imm_data); + if (uop->is_a16) + host_arm64_AND_IMM(block, REG_X0, REG_X0, 0xffff); if (REG_IS_B(dest_size) || REG_IS_BH(dest_size)) { host_arm64_call(block, codegen_mem_load_byte); } else if (REG_IS_W(dest_size)) { diff --git a/src/codegen_new/codegen_backend_arm_uops.c b/src/codegen_new/codegen_backend_arm_uops.c index d8c223884..b6963562c 100644 --- a/src/codegen_new/codegen_backend_arm_uops.c +++ b/src/codegen_new/codegen_backend_arm_uops.c @@ -995,6 +995,8 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop) host_arm_ADD_REG(block, REG_R0, seg_reg, addr_reg); if (uop->imm_data) host_arm_ADD_IMM(block, REG_R0, REG_R0, uop->imm_data); + if (uop->is_a16) + host_arm_AND_IMM(block, REG_R0, REG_R0, 0xffff); if (REG_IS_B(dest_size) || REG_IS_BH(dest_size)) { host_arm_BL(block, (uintptr_t) codegen_mem_load_byte); } else if (REG_IS_W(dest_size)) { diff --git a/src/codegen_new/codegen_backend_x86-64_uops.c b/src/codegen_new/codegen_backend_x86-64_uops.c index 46af68e75..0233a4636 100644 --- a/src/codegen_new/codegen_backend_x86-64_uops.c +++ b/src/codegen_new/codegen_backend_x86-64_uops.c @@ -997,8 +997,13 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop) int dest_size = IREG_GET_SIZE(uop->dest_reg_a_real); host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); - if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); + if (uop->imm_data) { + if (uop->is_a16) { + host_x86_ADD16_REG_IMM(block, REG_SI, uop->imm_data); + } else { + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); + } + } if (REG_IS_B(dest_size)) { host_x86_CALL(block, codegen_mem_load_byte); } else if (REG_IS_W(dest_size)) { diff --git a/src/codegen_new/codegen_backend_x86_uops.c b/src/codegen_new/codegen_backend_x86_uops.c index cd79b9b47..beaf85c17 100644 --- a/src/codegen_new/codegen_backend_x86_uops.c +++ b/src/codegen_new/codegen_backend_x86_uops.c @@ -981,8 +981,13 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop) int dest_size = IREG_GET_SIZE(uop->dest_reg_a_real); host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); - if (uop->imm_data) - host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); + if (uop->imm_data) { + if (uop->is_a16) { + host_x86_ADD16_REG_IMM(block, REG_SI, uop->imm_data); + } else { + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); + } + } if (REG_IS_B(dest_size)) { host_x86_CALL(block, codegen_mem_load_byte); } else if (REG_IS_W(dest_size)) { diff --git a/src/codegen_new/codegen_ir_defs.h b/src/codegen_new/codegen_ir_defs.h index 9bd2f9afe..ff84c7ccd 100644 --- a/src/codegen_new/codegen_ir_defs.h +++ b/src/codegen_new/codegen_ir_defs.h @@ -340,6 +340,7 @@ typedef struct uop_t { void *p; ir_host_reg_t dest_reg_a_real; ir_host_reg_t src_reg_a_real, src_reg_b_real, src_reg_c_real; + int is_a16; int jump_dest_uop; int jump_list_next; void *jump_dest; @@ -364,6 +365,8 @@ uop_alloc(ir_data_t *ir, uint32_t uop_type) uop = &ir->uops[ir->wr_pos++]; + uop->is_a16 = 0; + uop->dest_reg_a = invalid_ir_reg; uop->src_reg_a = invalid_ir_reg; uop->src_reg_b = invalid_ir_reg; @@ -489,7 +492,12 @@ uop_gen_reg_dst_src2_imm(uint32_t uop_type, ir_data_t *ir, int dest_reg, int src uop->type = uop_type; uop->src_reg_a = codegen_reg_read(src_reg_a); - uop->src_reg_b = codegen_reg_read(src_reg_b); + uop->is_a16 = 0; + if (src_reg_b == IREG_eaa16) { + uop->src_reg_b = codegen_reg_read(IREG_eaaddr); + uop->is_a16 = 1; + } else + uop->src_reg_b = codegen_reg_read(src_reg_b); uop->dest_reg_a = codegen_reg_write(dest_reg, ir->wr_pos - 1); uop->imm_data = imm; } diff --git a/src/codegen_new/codegen_ops_misc.c b/src/codegen_new/codegen_ops_misc.c index 91e0f5d63..33e01d951 100644 --- a/src/codegen_new/codegen_ops_misc.c +++ b/src/codegen_new/codegen_ops_misc.c @@ -533,8 +533,8 @@ ropCWDE(UNUSED(codeblock_t *block), ir_data_t *ir, UNUSED(uint8_t opcode), UNUSE uop_MOV_IMM(ir, IREG_oldpc, cpu_state.oldpc); \ target_seg = codegen_generate_ea(ir, op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32, 0); \ codegen_check_seg_read(block, ir, target_seg); \ - uop_MEM_LOAD_REG(ir, IREG_temp0_W, ireg_seg_base(target_seg), IREG_eaaddr); \ - uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), IREG_eaaddr, 2); \ + uop_MEM_LOAD_REG(ir, IREG_temp0_W, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16); \ + uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16, 2); \ uop_LOAD_SEG(ir, seg, IREG_temp1_W); \ uop_MOV(ir, IREG_16(dest_reg), IREG_temp0_W); \ \ @@ -556,8 +556,8 @@ ropCWDE(UNUSED(codeblock_t *block), ir_data_t *ir, UNUSED(uint8_t opcode), UNUSE uop_MOV_IMM(ir, IREG_oldpc, cpu_state.oldpc); \ target_seg = codegen_generate_ea(ir, op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32, 0); \ codegen_check_seg_read(block, ir, target_seg); \ - uop_MEM_LOAD_REG(ir, IREG_temp0, ireg_seg_base(target_seg), IREG_eaaddr); \ - uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), IREG_eaaddr, 4); \ + uop_MEM_LOAD_REG(ir, IREG_temp0, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16); \ + uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16, 4); \ uop_LOAD_SEG(ir, seg, IREG_temp1_W); \ uop_MOV(ir, IREG_32(dest_reg), IREG_temp0); \ \ diff --git a/src/codegen_new/codegen_reg.c b/src/codegen_new/codegen_reg.c index a3f000826..de67fde5a 100644 --- a/src/codegen_new/codegen_reg.c +++ b/src/codegen_new/codegen_reg.c @@ -169,6 +169,8 @@ struct [IREG_GS_limit_high] = { REG_DWORD, &cpu_state.seg_gs.limit_high, REG_INTEGER, REG_PERMANENT}, [IREG_SS_limit_high] = { REG_DWORD, &cpu_state.seg_ss.limit_high, REG_INTEGER, REG_PERMANENT}, + [IREG_eaa16] = { REG_WORD, &cpu_state.eaaddr, REG_INTEGER, REG_PERMANENT}, + /*Temporary registers are stored on the stack, and are not guaranteed to be preserved across uOPs. They will not be written back if they will not be read again.*/ diff --git a/src/codegen_new/codegen_reg.h b/src/codegen_new/codegen_reg.h index ebb90b42f..fd3cf279a 100644 --- a/src/codegen_new/codegen_reg.h +++ b/src/codegen_new/codegen_reg.h @@ -132,7 +132,9 @@ enum { IREG_GS_limit_high = 86, IREG_SS_limit_high = 87, - IREG_COUNT = 88, + IREG_eaa16 = 88, + + IREG_COUNT = 89, IREG_INVALID = 255, diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index ec40612ee..a4ea5802b 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -248,6 +248,19 @@ int checkio(uint32_t port, int mask); return 1; \ } +#define CHECK_READ_2OP(chseg, low, high, low2, high2) \ + if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high) || (low2 < (chseg)->limit_low) || (high2 > (chseg)->limit_high) || ((msw & 1) && !(cpu_state.eflags & VM_FLAG) && (((chseg)->access & 10) == 8))) { \ + x86gpf("Limit check (READ)", 0); \ + return 1; \ + } \ + if (msw & 1 && !(cpu_state.eflags & VM_FLAG) && !((chseg)->access & 0x80)) { \ + if ((chseg) == &cpu_state.seg_ss) \ + x86ss(NULL, (chseg)->seg & 0xfffc); \ + else \ + x86np("Read from seg not present", (chseg)->seg & 0xfffc); \ + return 1; \ + } + #define CHECK_READ_REP(chseg, low, high) \ if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) { \ x86gpf("Limit check (READ)", 0); \ @@ -277,6 +290,19 @@ int checkio(uint32_t port, int mask); #define CHECK_WRITE(chseg, low, high) \ CHECK_WRITE_COMMON(chseg, low, high) +#define CHECK_WRITE_2OP(chseg, low, high, low2, high2) \ + if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high) || (low2 < (chseg)->limit_low) || (high2 > (chseg)->limit_high) || !((chseg)->access & 2) || ((msw & 1) && !(cpu_state.eflags & VM_FLAG) && ((chseg)->access & 8))) { \ + x86gpf("Limit check (WRITE)", 0); \ + return 1; \ + } \ + if (msw & 1 && !(cpu_state.eflags & VM_FLAG) && !((chseg)->access & 0x80)) { \ + if ((chseg) == &cpu_state.seg_ss) \ + x86ss(NULL, (chseg)->seg & 0xfffc); \ + else \ + x86np("Write to seg not present", (chseg)->seg & 0xfffc); \ + return 1; \ + } + #define CHECK_WRITE_REP(chseg, low, high) \ if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) { \ x86gpf("Limit check (WRITE REP)", 0); \ diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 80097294d..0e49704fd 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -335,7 +335,10 @@ typedef struct { uint8_t tag[8]; x86seg *ea_seg; - uint32_t eaaddr; + union { + uint32_t eaaddr; + uint16_t eaa16[2]; + }; int flags_op; uint32_t flags_res; diff --git a/src/cpu/x86_ops_mov_seg.h b/src/cpu/x86_ops_mov_seg.h index 7fcc92312..a34bc0c70 100644 --- a/src/cpu/x86_ops_mov_seg.h +++ b/src/cpu/x86_ops_mov_seg.h @@ -272,9 +272,10 @@ opLDS_w_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); - addr = readmemw(easeg, cpu_state.eaaddr); - seg = readmemw(easeg, cpu_state.eaaddr + 2); + CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1, + ((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1); + addr = readmemw(easeg, cpu_state.eaa16[0]); + seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ds); @@ -318,9 +319,10 @@ opLDS_l_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); - addr = readmeml(easeg, cpu_state.eaaddr); - seg = readmemw(easeg, cpu_state.eaaddr + 4); + CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3, + ((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1); + addr = readmeml(easeg, cpu_state.eaa16[0]); + seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ds); @@ -365,9 +367,10 @@ opLSS_w_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); - addr = readmemw(easeg, cpu_state.eaaddr); - seg = readmemw(easeg, cpu_state.eaaddr + 2); + CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1, + ((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1); + addr = readmemw(easeg, cpu_state.eaa16[0]); + seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ss); @@ -411,9 +414,11 @@ opLSS_l_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); - addr = readmeml(easeg, cpu_state.eaaddr); - seg = readmemw(easeg, cpu_state.eaaddr + 4); + CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3, + ((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 5) & 0xffff)); + addr = readmeml(easeg, cpu_state.eaa16[0]); + seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ss); @@ -457,9 +462,9 @@ opLSS_l_a32(uint32_t fetchdat) fetch_ea_16(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ - CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); \ - addr = readmemw(easeg, cpu_state.eaaddr); \ - seg = readmemw(easeg, cpu_state.eaaddr + 2); \ + CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1, ((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1); \ + addr = readmemw(easeg, cpu_state.eaa16[0]); \ + seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff); \ if (cpu_state.abrt) \ return 1; \ op_loadseg(seg, &sel); \ @@ -502,9 +507,9 @@ opLSS_l_a32(uint32_t fetchdat) fetch_ea_16(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ - CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); \ - addr = readmeml(easeg, cpu_state.eaaddr); \ - seg = readmemw(easeg, cpu_state.eaaddr + 4); \ + CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3, ((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1); \ + addr = readmeml(easeg, cpu_state.eaa16[0]); \ + seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff); \ if (cpu_state.abrt) \ return 1; \ op_loadseg(seg, &sel); \ diff --git a/src/cpu/x86_ops_ret.h b/src/cpu/x86_ops_ret.h index 935fb5aa0..8bf72e9ed 100644 --- a/src/cpu/x86_ops_ret.h +++ b/src/cpu/x86_ops_ret.h @@ -15,7 +15,7 @@ op_loadcs(readmemw(ss, ESP + 2)); \ } else { \ cpu_state.pc = readmemw(ss, SP); \ - op_loadcs(readmemw(ss, SP + 2)); \ + op_loadcs(readmemw(ss, (SP + 2) & 0xffff)); \ } \ if (cpu_state.abrt) \ return 1; \ diff --git a/src/cpu/x86_ops_ret_2386.h b/src/cpu/x86_ops_ret_2386.h index 155925dfe..02233fd1d 100644 --- a/src/cpu/x86_ops_ret_2386.h +++ b/src/cpu/x86_ops_ret_2386.h @@ -15,7 +15,7 @@ op_loadcs(readmemw(ss, ESP + 2)); \ } else { \ cpu_state.pc = readmemw(ss, SP); \ - op_loadcs(readmemw(ss, SP + 2)); \ + op_loadcs(readmemw(ss, (SP + 2) & 0xffff)); \ } \ if (cpu_state.abrt) \ return 1; \ From 6884dc573688c4e16b71c218ccc676d8e5796d50 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 7 Apr 2025 06:23:22 +0200 Subject: [PATCH 073/118] Old recompiler: Fix compile-breaking mistakes. --- src/codegen/codegen_ops_x86-64.h | 2 +- src/codegen/codegen_ops_x86.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen/codegen_ops_x86-64.h b/src/codegen/codegen_ops_x86-64.h index 1be5dfdce..1d9b29de2 100644 --- a/src/codegen/codegen_ops_x86-64.h +++ b/src/codegen/codegen_ops_x86-64.h @@ -1055,7 +1055,7 @@ MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset) addbyte(0xc0); addbyte(offset); if (!(op_32 & 0x200)) { - addbyte(0x25) /* AND EAX, ffffh */ + addbyte(0x25); /* AND EAX, ffffh */ addbyte(0xff); addbyte(0xff); addbyte(0x00); diff --git a/src/codegen/codegen_ops_x86.h b/src/codegen/codegen_ops_x86.h index 7a56b5fe1..5e7165939 100644 --- a/src/codegen/codegen_ops_x86.h +++ b/src/codegen/codegen_ops_x86.h @@ -803,7 +803,7 @@ MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset) addbyte(0xc0); addbyte(offset); if (!(op_32 & 0x200)) { - addbyte(0x25) /* AND EAX, ffffh */ + addbyte(0x25); /* AND EAX, ffffh */ addbyte(0xff); addbyte(0xff); addbyte(0x00); From 576d643c4f655affdc0b5d041d3ec97263c64bb2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 7 Apr 2025 06:29:57 +0200 Subject: [PATCH 074/118] And fix the op_32 stuff. --- src/codegen/codegen_ops_mov.h | 4 ++-- src/codegen/codegen_ops_x86-64.h | 2 +- src/codegen/codegen_ops_x86.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/codegen/codegen_ops_mov.h b/src/codegen/codegen_ops_mov.h index 6a5054b81..eb2a0202c 100644 --- a/src/codegen/codegen_ops_mov.h +++ b/src/codegen/codegen_ops_mov.h @@ -600,12 +600,12 @@ ropMOV_seg_w(UNUSED(uint8_t opcode), uint32_t fetchdat, uint32_t op_32, uint32_t MEM_LOAD_ADDR_EA_L(target_seg); \ STORE_HOST_REG_ADDR((uintptr_t) &codegen_temp, 0); \ LOAD_EA(); \ - MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 4); \ + MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 4, op_32); \ } else { \ MEM_LOAD_ADDR_EA_W(target_seg); \ STORE_HOST_REG_ADDR_W((uintptr_t) &codegen_temp, 0); \ LOAD_EA(); \ - MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 2); \ + MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 2, op_32); \ } \ LOAD_SEG(0, &rseg); \ if (op_32 & 0x100) { \ diff --git a/src/codegen/codegen_ops_x86-64.h b/src/codegen/codegen_ops_x86-64.h index 1d9b29de2..129d9a740 100644 --- a/src/codegen/codegen_ops_x86-64.h +++ b/src/codegen/codegen_ops_x86-64.h @@ -1049,7 +1049,7 @@ MEM_LOAD_ADDR_EA_W(x86seg *seg) /*done:*/ } static __inline void -MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset) +MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset, int op_32) { addbyte(0x83); /*ADD EAX, offset*/ addbyte(0xc0); diff --git a/src/codegen/codegen_ops_x86.h b/src/codegen/codegen_ops_x86.h index 5e7165939..3fbefdeaa 100644 --- a/src/codegen/codegen_ops_x86.h +++ b/src/codegen/codegen_ops_x86.h @@ -789,7 +789,7 @@ MEM_LOAD_ADDR_EA_W(x86seg *seg) host_reg_mapping[0] = 8; } static __inline void -MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset) +MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset, int op_32) { if ((seg == &cpu_state.seg_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &cpu_state.seg_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS))) { addbyte(0x31); /*XOR EDX, EDX*/ From fb449f39a44529f0cea0d1842145595f1425ee17 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 7 Apr 2025 07:41:59 +0200 Subject: [PATCH 075/118] Intel Premiere/PCI and Premiere/PCI II: Use a dual-channel IDE controller, fixes #5442. --- src/machine/m_at_socket4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 0d78c6de3..c747d8cc0 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -47,7 +47,7 @@ machine_at_premiere_common_init(const machine_t *model, int pci_switch) machine_at_common_init_ex(model, 2); device_add(&amstrad_megapc_nvr_device); - device_add(&ide_pci_device); + device_add(&ide_pci_2ch_device); pci_init(PCI_CONFIG_TYPE_2 | pci_switch); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); From 44db8bb478eba862d66acbc4f9cc90336ff5d35c Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 7 Apr 2025 11:42:03 +0600 Subject: [PATCH 076/118] Fix compilation on Qt6 --- src/qt/qt_mainwindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 806e8e0e6..e9ebdaad8 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -674,7 +674,11 @@ MainWindow::MainWindow(QWidget *parent) /* Remove default Shift+F10 handler, which unfocuses keyboard input even with no context menu. */ connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_F10), this), &QShortcut::activated, this, [](){}); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_PageDown), this); +#else auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_PageDown), this); +#endif windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut); connect(windowedShortcut, &QShortcut::activated, this, [this] () { if (video_fullscreen) From ebf125082a951752f3b3a819daf6e115a2fc1175 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 7 Apr 2025 20:33:50 +0200 Subject: [PATCH 077/118] Revert a minor commit from Spock. (April 7th, 2025) This fixes OS/2 Warp on a PS/2 machine using the Spock/Tribble during the file copy phase (the bug was probably too many IRQ's being fired). --- src/scsi/scsi_spock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index c500abfbc..6f0b7aacb 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -1050,7 +1050,7 @@ spock_callback(void *priv) spock_execute_cmd(scsi, scb); } - if (scsi->attention_wait) { + if (scsi->attention_wait && ((scsi->scb_state == 0) || (scsi->attention_pending & 0xf0) == 0xe0)) { scsi->attention_wait--; if (!scsi->attention_wait) { scsi->attention = scsi->attention_pending; From f5fcebfbaa7552fc5533a1752ab0f0ea8e953fb8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 9 Apr 2025 12:19:24 +0200 Subject: [PATCH 078/118] Default the language to the system language. --- src/config.c | 2 ++ src/include/86box/86box.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 8ff7d548c..f38b5aa2c 100644 --- a/src/config.c +++ b/src/config.c @@ -1840,6 +1840,8 @@ config_load(void) cassette_pcm = 0; cassette_ui_writeprot = 0; + lang_id = DEFAULT_LANGUAGE; + config_log("Config file not present or invalid!\n"); } else { load_general(); /* General */ diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 61de69cf3..ddca937f1 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -45,7 +45,7 @@ #define MAX_UUID_LEN 64 /* Default language 0xFFFF = from system, 0x409 = en-US */ -#define DEFAULT_LANGUAGE 0x0409 +#define DEFAULT_LANGUAGE 0xffff #define POSTCARDS_NUM 4 #define POSTCARD_MASK (POSTCARDS_NUM - 1) From 8ac9d5d9cf79f7f2bde419300b9a4687889a57ad Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 9 Apr 2025 17:39:26 +0200 Subject: [PATCH 079/118] Default language to system also when the configuration file is present and the language option is not. --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index f38b5aa2c..6f023cf67 100644 --- a/src/config.c +++ b/src/config.c @@ -185,6 +185,8 @@ load_general(void) p = ini_section_get_string(cat, "language", NULL); if (p != NULL) lang_id = plat_language_code(p); + else + lang_id = 0xffff; mouse_sensitivity = ini_section_get_double(cat, "mouse_sensitivity", 1.0); if (mouse_sensitivity < 0.1) From e2f8a58d957ccbb22e59fc48cf98c70c72385650 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 10 Apr 2025 01:08:21 +0200 Subject: [PATCH 080/118] Fix the LxS fix on the new recompiler. --- src/codegen_new/codegen_backend_x86-64_uops.c | 5 ++--- src/codegen_new/codegen_backend_x86_uops.c | 5 ++--- src/codegen_new/codegen_ir_defs.h | 3 ++- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/codegen_new/codegen_backend_x86-64_uops.c b/src/codegen_new/codegen_backend_x86-64_uops.c index 0233a4636..655896b54 100644 --- a/src/codegen_new/codegen_backend_x86-64_uops.c +++ b/src/codegen_new/codegen_backend_x86-64_uops.c @@ -998,10 +998,9 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop) host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) { + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); if (uop->is_a16) { - host_x86_ADD16_REG_IMM(block, REG_SI, uop->imm_data); - } else { - host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); + host_x86_AND32_REG_IMM(block, REG_ESI, 0x0000ffff); } } if (REG_IS_B(dest_size)) { diff --git a/src/codegen_new/codegen_backend_x86_uops.c b/src/codegen_new/codegen_backend_x86_uops.c index beaf85c17..02c441234 100644 --- a/src/codegen_new/codegen_backend_x86_uops.c +++ b/src/codegen_new/codegen_backend_x86_uops.c @@ -982,10 +982,9 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop) host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg); if (uop->imm_data) { + host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); if (uop->is_a16) { - host_x86_ADD16_REG_IMM(block, REG_SI, uop->imm_data); - } else { - host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data); + host_x86_AND32_REG_IMM(block, REG_ESI, 0x0000ffff); } } if (REG_IS_B(dest_size)) { diff --git a/src/codegen_new/codegen_ir_defs.h b/src/codegen_new/codegen_ir_defs.h index ff84c7ccd..d55e57f3d 100644 --- a/src/codegen_new/codegen_ir_defs.h +++ b/src/codegen_new/codegen_ir_defs.h @@ -491,13 +491,14 @@ uop_gen_reg_dst_src2_imm(uint32_t uop_type, ir_data_t *ir, int dest_reg, int src uop_t *uop = uop_alloc(ir, uop_type); uop->type = uop_type; - uop->src_reg_a = codegen_reg_read(src_reg_a); uop->is_a16 = 0; + uop->src_reg_a = codegen_reg_read(src_reg_a); if (src_reg_b == IREG_eaa16) { uop->src_reg_b = codegen_reg_read(IREG_eaaddr); uop->is_a16 = 1; } else uop->src_reg_b = codegen_reg_read(src_reg_b); + uop->is_a16 = 0; uop->dest_reg_a = codegen_reg_write(dest_reg, ir->wr_pos - 1); uop->imm_data = imm; } From daca37aac926f7de5f11c9eba84730d65596a219 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 10 Apr 2025 23:46:38 +0200 Subject: [PATCH 081/118] Media historyy manager: Remove comment and fix the limits. --- src/qt/qt_mediahistorymanager.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index d548c0779..5892c55cd 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -101,15 +101,20 @@ MediaHistoryManager::getImageForSlot(int index, int slot, ui::MediaType type) return image_name; } -// These are hardcoded since we can't include the various -// header files where they are defined (e.g., fdd.h, mo.h). -// However, all in ui::MediaType support 4 except cassette. int MediaHistoryManager::maxDevicesSupported(ui::MediaType type) { switch (type) { default: return 4; + case ui::MediaType::Optical: + return CDROM_NUM; + case ui::MediaType::Floppy: + return FDD_NUM; + case ui::MediaType::Zip: + return ZIP_NUM; + case ui::MediaType::Mo: + return MO_NUM; case ui::MediaType::Cassette: return 1; case ui::MediaType::Cartridge: From f41848bbee691d2cd9462bce2355799a7025ff14 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 11 Apr 2025 00:35:28 +0200 Subject: [PATCH 082/118] Settings: Recalculate CD-ROM model list on CD-ROM selection change and select the correct CD-ROM type. --- src/qt/qt_settingsfloppycdrom.cpp | 34 +++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 52d737ae6..5e0ec7bed 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -200,7 +200,7 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) (cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) { QString name = CDROMName(j); Models::AddEntry(modelType, name, j); - if ((cdrom[cdromIdx].bus_type == bus_type) && (cdrom[cdromIdx].type == j)) + if (cdrom[cdromIdx].type == j) selectedTypeRow = eligibleRows; ++eligibleRows; } @@ -256,9 +256,9 @@ SettingsFloppyCDROM::onFloppyRowChanged(const QModelIndex ¤t) void SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t) { - uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt(); - uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt(); - int type = current.siblingAtColumn(2).data(Qt::UserRole).toInt(); + uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt(); + uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt(); + uint32_t type = current.siblingAtColumn(2).data(Qt::UserRole).toUInt(); ui->comboBoxBus->setCurrentIndex(-1); auto* model = ui->comboBoxBus->model(); @@ -279,7 +279,29 @@ SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t) ui->comboBoxSpeed->setEnabled(false); ui->comboBoxSpeed->setCurrentIndex(speed == 0 ? 7 : speed - 1); - ui->comboBoxCDROMType->setCurrentIndex(type); + auto *modelType = ui->comboBoxCDROMType->model(); + int removeRows = modelType->rowCount(); + + uint32_t j = 0; + int selectedTypeRow = 0; + int eligibleRows = 0; + while (cdrom_drive_types[j].bus_type != BUS_TYPE_NONE) { + if (((bus == CDROM_BUS_ATAPI) || (bus == CDROM_BUS_SCSI)) && + ((cdrom_drive_types[j].bus_type == bus) || + (cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) { + QString name = CDROMName(j); + Models::AddEntry(modelType, name, j); + if (type == j) + selectedTypeRow = eligibleRows; + ++eligibleRows; + } + ++j; + } + modelType->removeRows(0, removeRows); + ui->comboBoxCDROMType->setEnabled(eligibleRows > 1); + ui->comboBoxCDROMType->setCurrentIndex(-1); + ui->comboBoxCDROMType->setCurrentIndex(selectedTypeRow); + enableCurrentlySelectedChannel(); } @@ -371,7 +393,7 @@ SettingsFloppyCDROM::on_comboBoxBus_activated(int) (cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) { QString name = CDROMName(j); Models::AddEntry(modelType, name, j); - if ((cdrom[cdromIdx].bus_type == bus_type) && (cdrom[cdromIdx].type == j)) + if (cdrom[cdromIdx].type == j) selectedTypeRow = eligibleRows; ++eligibleRows; } From 95a6aa0bdff59dd9352f171644054d178ac66c90 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 11 Apr 2025 19:29:40 +0200 Subject: [PATCH 083/118] Fix the LxS fix again. --- src/cpu/386_common.h | 13 ---------- src/cpu/x86_ops_mov_seg.h | 53 ++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index a4ea5802b..83ef4e72b 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -248,19 +248,6 @@ int checkio(uint32_t port, int mask); return 1; \ } -#define CHECK_READ_2OP(chseg, low, high, low2, high2) \ - if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high) || (low2 < (chseg)->limit_low) || (high2 > (chseg)->limit_high) || ((msw & 1) && !(cpu_state.eflags & VM_FLAG) && (((chseg)->access & 10) == 8))) { \ - x86gpf("Limit check (READ)", 0); \ - return 1; \ - } \ - if (msw & 1 && !(cpu_state.eflags & VM_FLAG) && !((chseg)->access & 0x80)) { \ - if ((chseg) == &cpu_state.seg_ss) \ - x86ss(NULL, (chseg)->seg & 0xfffc); \ - else \ - x86np("Read from seg not present", (chseg)->seg & 0xfffc); \ - return 1; \ - } - #define CHECK_READ_REP(chseg, low, high) \ if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) { \ x86gpf("Limit check (READ)", 0); \ diff --git a/src/cpu/x86_ops_mov_seg.h b/src/cpu/x86_ops_mov_seg.h index a34bc0c70..f5bd02923 100644 --- a/src/cpu/x86_ops_mov_seg.h +++ b/src/cpu/x86_ops_mov_seg.h @@ -272,10 +272,13 @@ opLDS_w_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1, - ((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); addr = readmemw(easeg, cpu_state.eaa16[0]); - seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff); + if (cpu_state.abrt) + return 1; + cpu_state.eaa16[0] += 2; + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); + seg = readmemw(easeg, cpu_state.eaa16[0]); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ds); @@ -319,10 +322,13 @@ opLDS_l_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3, - ((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff)); addr = readmeml(easeg, cpu_state.eaa16[0]); - seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff); + if (cpu_state.abrt) + return 1; + cpu_state.eaa16[0] += 4; + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); + seg = readmemw(easeg, cpu_state.eaa16[0]); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ds); @@ -367,10 +373,13 @@ opLSS_w_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1, - ((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); addr = readmemw(easeg, cpu_state.eaa16[0]); - seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff); + if (cpu_state.abrt) + return 1; + cpu_state.eaa16[0] += 2; + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); + seg = readmemw(easeg, cpu_state.eaa16[0]); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ss); @@ -414,11 +423,13 @@ opLSS_l_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); ILLEGAL_ON(cpu_mod == 3); SEG_CHECK_READ(cpu_state.ea_seg); - CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3, - ((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1); - CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 5) & 0xffff)); + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff)); addr = readmeml(easeg, cpu_state.eaa16[0]); - seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff); + if (cpu_state.abrt) + return 1; + cpu_state.eaa16[0] += 4; + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); + seg = readmemw(easeg, cpu_state.eaa16[0]); if (cpu_state.abrt) return 1; op_loadseg(seg, &cpu_state.seg_ss); @@ -462,9 +473,13 @@ opLSS_l_a32(uint32_t fetchdat) fetch_ea_16(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ - CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 1, ((cpu_state.eaa16[0] + 2) & 0xffff), ((cpu_state.eaa16[0] + 2) & 0xffff) + 1); \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \ addr = readmemw(easeg, cpu_state.eaa16[0]); \ - seg = readmemw(easeg, (cpu_state.eaa16[0] + 2) & 0xffff); \ + if (cpu_state.abrt) \ + return 1; \ + cpu_state.eaa16[0] += 2; \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \ + seg = readmemw(easeg, cpu_state.eaa16[0]); \ if (cpu_state.abrt) \ return 1; \ op_loadseg(seg, &sel); \ @@ -507,9 +522,13 @@ opLSS_l_a32(uint32_t fetchdat) fetch_ea_16(fetchdat); \ SEG_CHECK_READ(cpu_state.ea_seg); \ ILLEGAL_ON(cpu_mod == 3); \ - CHECK_READ_2OP(cpu_state.ea_seg, cpu_state.eaa16[0], cpu_state.eaa16[0] + 3, ((cpu_state.eaa16[0] + 4) & 0xffff), ((cpu_state.eaa16[0] + 4) & 0xffff) + 1); \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff)); \ addr = readmeml(easeg, cpu_state.eaa16[0]); \ - seg = readmemw(easeg, (cpu_state.eaa16[0] + 4) & 0xffff); \ + if (cpu_state.abrt) \ + return 1; \ + cpu_state.eaa16[0] += 4; \ + CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \ + seg = readmemw(easeg, cpu_state.eaa16[0]); \ if (cpu_state.abrt) \ return 1; \ op_loadseg(seg, &sel); \ From e21c86d46cbd243fe68f909c94488d6e4c5e0cda Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 11 Apr 2025 19:58:30 +0200 Subject: [PATCH 084/118] PCI TRC Reset: Only zero the RAM on 686 systems, fixes #5462. --- src/acpi.c | 4 +--- src/pci.c | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/acpi.c b/src/acpi.c index 963f26ae6..ccd51ebca 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -1025,10 +1025,8 @@ acpi_reg_write_common_regs(UNUSED(int size), uint16_t addr, uint8_t val, void *p nvr_reg_write(0x000f, 0xff, dev->nvr); } - if (sus_typ & SUS_RESET_PCI) { + if (sus_typ & SUS_RESET_PCI) device_reset_all(DEVICE_PCI); - mem_zero(); - } if (sus_typ & SUS_RESET_CPU) cpu_alt_reset = 0; diff --git a/src/pci.c b/src/pci.c index c2e4ca237..c3020ca73 100644 --- a/src/pci.c +++ b/src/pci.c @@ -420,7 +420,8 @@ pci_trc_reset(uint8_t val) flushmmucache(); - mem_zero(); + if (is_p6) + mem_zero(); } #ifdef USE_DYNAREC From 8aa15fa21fd70ac01bcacfb12d69e9e01ba00edb Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 11 Apr 2025 20:27:41 +0200 Subject: [PATCH 085/118] The update value handler should be at Pentium Pro, not Cyrix Cx6x86. --- src/cpu/cpu.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index ffe582604..d13dfe041 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -2448,11 +2448,6 @@ cpu_CPUID(void) EAX = CPUID; EBX = ECX = 0; EDX = CPUID_FPU | CPUID_DE | CPUID_TSC | CPUID_MSR | CPUID_CMPXCHG8B | CPUID_CMOV | CPUID_MMX; - /* - Return anything non-zero in bits 32-63 of the BIOS signature MSR - to indicate there has been an update. - */ - msr.bbl_cr_dx[3] = 0xffffffff00000000ULL; } else EAX = EBX = ECX = EDX = 0; break; @@ -2467,6 +2462,11 @@ cpu_CPUID(void) EAX = CPUID; EBX = ECX = 0; EDX = CPUID_FPU | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_SEP | CPUID_CMOV; + /* + Return anything non-zero in bits 32-63 of the BIOS signature MSR + to indicate there has been an update. + */ + msr.bbl_cr_dx[3] = 0xffffffff00000000ULL; } else if (EAX == 2) { EAX = 0x03020101; /* Instruction TLB: 4 KB pages, 4-way set associative, 32 entries Instruction TLB: 4 MB pages, fully associative, 2 entries @@ -3301,7 +3301,6 @@ pentium_invalid_rdmsr: case 0x88 ... 0x8b: EAX = msr.bbl_cr_dx[ECX - 0x88] & 0xffffffff; EDX = msr.bbl_cr_dx[ECX - 0x88] >> 32; - // EDX |= 0xffffffff; break; /* Unknown */ case 0xae: From 9b11091c8e282336dc8f9ac81355f81565ff0b48 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 7 Apr 2025 15:58:44 +0500 Subject: [PATCH 086/118] qt: Remove the keyboard shortcut translation hack No longer needed since the Win32 UI is gone and Qt can handle the key names since the base translations are embedded --- src/qt/languages/86box.pot | 10 +++++----- src/qt/languages/ca-ES.po | 20 ++++++++++---------- src/qt/languages/cs-CZ.po | 20 ++++++++++---------- src/qt/languages/de-DE.po | 20 ++++++++++---------- src/qt/languages/es-ES.po | 20 ++++++++++---------- src/qt/languages/fi-FI.po | 20 ++++++++++---------- src/qt/languages/fr-FR.po | 20 ++++++++++---------- src/qt/languages/hr-HR.po | 20 ++++++++++---------- src/qt/languages/hu-HU.po | 20 ++++++++++---------- src/qt/languages/it-IT.po | 20 ++++++++++---------- src/qt/languages/ja-JP.po | 20 ++++++++++---------- src/qt/languages/ko-KR.po | 20 ++++++++++---------- src/qt/languages/nl-NL.po | 20 ++++++++++---------- src/qt/languages/pl-PL.po | 20 ++++++++++---------- src/qt/languages/pt-BR.po | 20 ++++++++++---------- src/qt/languages/pt-PT.po | 20 ++++++++++---------- src/qt/languages/ru-RU.po | 20 ++++++++++---------- src/qt/languages/sk-SK.po | 20 ++++++++++---------- src/qt/languages/sl-SI.po | 20 ++++++++++---------- src/qt/languages/tr-TR.po | 20 ++++++++++---------- src/qt/languages/uk-UA.po | 20 ++++++++++---------- src/qt/languages/vi-VN.po | 20 ++++++++++---------- src/qt/languages/zh-CN.po | 20 ++++++++++---------- src/qt/languages/zh-TW.po | 20 ++++++++++---------- src/qt/qt_progsettings.hpp | 17 +---------------- 25 files changed, 236 insertions(+), 251 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 93a47a1cb..6e610d715 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -18,7 +18,7 @@ msgstr "" msgid "&Hard Reset..." msgstr "" -msgid "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" msgstr "" msgid "Ctrl+Alt+&Esc" @@ -111,7 +111,7 @@ msgstr "" msgid "Hi&DPI scaling" msgstr "" -msgid "&Fullscreen\tCtrl+Alt+PgUp" +msgid "&Fullscreen" msgstr "" msgid "Fullscreen &stretch mode" @@ -186,7 +186,7 @@ msgstr "" msgid "&Update status bar icons" msgstr "" -msgid "Take s&creenshot\tCtrl+F11" +msgid "Take s&creenshot" msgstr "" msgid "&Preferences..." @@ -198,10 +198,10 @@ msgstr "" msgid "Sound &gain..." msgstr "" -msgid "Begin trace\tCtrl+T" +msgid "Begin trace" msgstr "" -msgid "End trace\tCtrl+T" +msgid "End trace" msgstr "" msgid "&Help" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index cf3d5c7f7..8c89c6bad 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -18,8 +18,8 @@ msgstr "CTRL &dret és ALT esquerre" msgid "&Hard Reset..." msgstr "&Reinicialització completa ..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineal" msgid "Hi&DPI scaling" msgstr "&Escalat alta densitat" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Pantalla completa\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Pantalla completa" msgid "Fullscreen &stretch mode" msgstr "Escalat pantalla completa" @@ -186,8 +186,8 @@ msgstr "&Ajustaments ..." msgid "&Update status bar icons" msgstr "&Actualitzar icones a la barra d'estat" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Prendre c&aptura\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Prendre c&aptura" msgid "&Preferences..." msgstr "&Preferències ..." @@ -198,11 +198,11 @@ msgstr "Activar la integració amb el &Discord" msgid "Sound &gain..." msgstr "&Guany de so ..." -msgid "Begin trace\tCtrl+T" -msgstr "Començar traça\tCtrl+T" +msgid "Begin trace" +msgstr "Començar traça" -msgid "End trace\tCtrl+T" -msgstr "Acabar traça\tCtrl+T" +msgid "End trace" +msgstr "Acabar traça" msgid "&Help" msgstr "&Ajuda" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index e3d85dd09..2a26f7ef6 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -18,8 +18,8 @@ msgstr "&Pravý Ctrl je levý Alt" msgid "&Hard Reset..." msgstr "&Resetovat" -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineární" msgid "Hi&DPI scaling" msgstr "Š&kálování HiDPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Celá obrazovka\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Celá obrazovka" msgid "Fullscreen &stretch mode" msgstr "Režím roztá&hnutí při celé obrazovce" @@ -186,8 +186,8 @@ msgstr "&Nastavení..." msgid "&Update status bar icons" msgstr "&Aktualizovat ikony stavového řádku" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Pořídit &screenshot\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Pořídit &screenshot" msgid "&Preferences..." msgstr "&Předvolby..." @@ -198,11 +198,11 @@ msgstr "Povolit integraci s &Discordem" msgid "Sound &gain..." msgstr "&Zesílení zvuku" -msgid "Begin trace\tCtrl+T" -msgstr "Začít trace\tCtrl+T" +msgid "Begin trace" +msgstr "Začít trace" -msgid "End trace\tCtrl+T" -msgstr "Zastavit trace\tCtrl+T" +msgid "End trace" +msgstr "Zastavit trace" msgid "&Help" msgstr "Ná&pověda" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index c904cad0d..fbb97a990 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -18,8 +18,8 @@ msgstr "&Die rechte Strg-Taste ist die Linke Alt-Taste" msgid "&Hard Reset..." msgstr "&Kaltstart..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Strg+Alt+Entf\tStrg+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Strg+Alt+Entf" msgid "Ctrl+Alt+&Esc" msgstr "Strg+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Linear" msgid "Hi&DPI scaling" msgstr "Hi&DPI-Skalierung" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Vollbild\tStrg+Alt+Bild auf" +msgid "&Fullscreen" +msgstr "&Vollbild" msgid "Fullscreen &stretch mode" msgstr "&Vollbild-Skalierungsmodus" @@ -186,8 +186,8 @@ msgstr "&Optionen..." msgid "&Update status bar icons" msgstr "&Statusleistenicons aktualisieren" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "S&creenshot aufnehmen\tStrg+F11" +msgid "Take s&creenshot" +msgstr "S&creenshot aufnehmen" msgid "&Preferences..." msgstr "&Einstellungen..." @@ -198,11 +198,11 @@ msgstr "&Discord-Integration einschalten" msgid "Sound &gain..." msgstr "&Klangverstärkung..." -msgid "Begin trace\tCtrl+T" -msgstr "Tracing starten\tStrg+T" +msgid "Begin trace" +msgstr "Tracing starten" -msgid "End trace\tCtrl+T" -msgstr "Tracing beenden\tStrg+T" +msgid "End trace" +msgstr "Tracing beenden" msgid "&Help" msgstr "&Hilfe" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index ca7a3ad53..1a5550065 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -18,8 +18,8 @@ msgstr "CTRL &derecho es ALT izquierdo" msgid "&Hard Reset..." msgstr "&Hard Reset..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineal" msgid "Hi&DPI scaling" msgstr "&Escalado alta densidad" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Pantalla completa\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Pantalla completa" msgid "Fullscreen &stretch mode" msgstr "Escalado pantalla completa" @@ -186,8 +186,8 @@ msgstr "&Configuraciones..." msgid "&Update status bar icons" msgstr "&Actualizar iconos en barra de estado" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Tomar c&aptura\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Tomar c&aptura" msgid "&Preferences..." msgstr "&Preferencias..." @@ -198,11 +198,11 @@ msgstr "Habilitar integración con &Discord" msgid "Sound &gain..." msgstr "&Ganancia de sonido..." -msgid "Begin trace\tCtrl+T" -msgstr "Comenzar traza\tCtrl+T" +msgid "Begin trace" +msgstr "Comenzar traza" -msgid "End trace\tCtrl+T" -msgstr "Terminar traza\tCtrl+T" +msgid "End trace" +msgstr "Terminar traza" msgid "&Help" msgstr "&Ayuda" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index f044365f0..5222ccc45 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -18,8 +18,8 @@ msgstr "&Oikea CTRL on vasen ALT" msgid "&Hard Reset..." msgstr "&Uudelleenkäynnistys (kylmä)..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "Li&neaarinen interpolaatio" msgid "Hi&DPI scaling" msgstr "&Suuri DPI-skaalaus" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Koko näytön tila\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Koko näytön tila" msgid "Fullscreen &stretch mode" msgstr "Koko näytön &skaalaustila" @@ -186,8 +186,8 @@ msgstr "&Kokoonpano..." msgid "&Update status bar icons" msgstr "&Päivitä tilapalkin kuvakkeita" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Ota &kuvakaappaus\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Ota &kuvakaappaus" msgid "&Preferences..." msgstr "&Sovellusasetukset..." @@ -198,11 +198,11 @@ msgstr "Käytä &Discord-integraatiota" msgid "Sound &gain..." msgstr "&Äänitasot..." -msgid "Begin trace\tCtrl+T" -msgstr "Aloita jäljitys\tCtrl+T" +msgid "Begin trace" +msgstr "Aloita jäljitys" -msgid "End trace\tCtrl+T" -msgstr "Lopeta jäljitys\tCtrl+T" +msgid "End trace" +msgstr "Lopeta jäljitys" msgid "&Help" msgstr "&Ohje" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 590674a29..9937cecd4 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -18,8 +18,8 @@ msgstr "CTRL &Droite devient ALT Gauche" msgid "&Hard Reset..." msgstr "&Hard Reset..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineaire" msgid "Hi&DPI scaling" msgstr "Mise à l'échelle Hi&DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Plein Ecran\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Plein Ecran" msgid "Fullscreen &stretch mode" msgstr "Mode &Elargi plein écran" @@ -186,8 +186,8 @@ msgstr "&Réglages..." msgid "&Update status bar icons" msgstr "Mettre à jour la barre de stat&us" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Copie &Ecran\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Copie &Ecran" msgid "&Preferences..." msgstr "&Préférences..." @@ -198,11 +198,11 @@ msgstr "Activer intégration &Discord" msgid "Sound &gain..." msgstr "&Gain Son..." -msgid "Begin trace\tCtrl+T" -msgstr "Démarrer traces\tCtrl+T" +msgid "Begin trace" +msgstr "Démarrer traces" -msgid "End trace\tCtrl+T" -msgstr "Finir traces\tCtrl+T" +msgid "End trace" +msgstr "Finir traces" msgid "&Help" msgstr "&Aide" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index ed4fdf621..7a8aa53e4 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -18,8 +18,8 @@ msgstr "&Desni CTRL je lijevi ALT" msgid "&Hard Reset..." msgstr "&Ponovno pokretanje..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Linearna" msgid "Hi&DPI scaling" msgstr "&HiDPI skaliranje" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Cijelozaslonski način\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Cijelozaslonski način" msgid "Fullscreen &stretch mode" msgstr "&Način cijelozaslonskog rastezanja" @@ -186,8 +186,8 @@ msgstr "&Opcije..." msgid "&Update status bar icons" msgstr "&Ažuriraj ikone statusnog redka" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Napravi &snimku zaslona\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Napravi &snimku zaslona" msgid "&Preferences..." msgstr "&Postavke..." @@ -198,11 +198,11 @@ msgstr "Omogući integraciju sa programom &Discord" msgid "Sound &gain..." msgstr "&Pojačavanje zvuka..." -msgid "Begin trace\tCtrl+T" -msgstr "Z&apočni praćenje\tCtrl+T" +msgid "Begin trace" +msgstr "Z&apočni praćenje" -msgid "End trace\tCtrl+T" -msgstr "&Svrši praćenje\tCtrl+T" +msgid "End trace" +msgstr "&Svrši praćenje" msgid "&Help" msgstr "&Pomoć" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index b4afd8010..c777c6dd7 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -18,8 +18,8 @@ msgstr "A &jobb oldali CTRL a bal ALT" msgid "&Hard Reset..." msgstr "Hardveres &újraindítás..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineáris" msgid "Hi&DPI scaling" msgstr "Hi&DPI méretezés" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Teljes képernyő\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Teljes képernyő" msgid "Fullscreen &stretch mode" msgstr "Teljes képernyős &méretezés" @@ -186,8 +186,8 @@ msgstr "&Konfigurálás..." msgid "&Update status bar icons" msgstr "Állapotsori ikonok &frissítése" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "&Képernyőkép készítése\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "&Képernyőkép készítése" msgid "&Preferences..." msgstr "&Beállítások..." @@ -198,11 +198,11 @@ msgstr "&Discord integráció engedélyezése" msgid "Sound &gain..." msgstr "&Hangerőszabályzó..." -msgid "Begin trace\tCtrl+T" -msgstr "Nyomkövetés megkezdése\tCtrl+T" +msgid "Begin trace" +msgstr "Nyomkövetés megkezdése" -msgid "End trace\tCtrl+T" -msgstr "Nyomkövetés befejezése\tCtrl+T" +msgid "End trace" +msgstr "Nyomkövetés befejezése" msgid "&Help" msgstr "&Súgó" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 73ec57ec0..adf5b0471 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -18,8 +18,8 @@ msgstr "&CTRL destro è ALT sinistro" msgid "&Hard Reset..." msgstr "&Riavvia..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineare" msgid "Hi&DPI scaling" msgstr "Scala Hi&DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Schermo intero\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Schermo intero" msgid "Fullscreen &stretch mode" msgstr "Modalità adattamento &schermo intero" @@ -186,8 +186,8 @@ msgstr "&Impostazioni..." msgid "&Update status bar icons" msgstr "&Aggiorna icone della barra di stato" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Cattura schermata\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Cattura schermata" msgid "&Preferences..." msgstr "&Preferenze..." @@ -198,11 +198,11 @@ msgstr "Abilita &integrazione Discord" msgid "Sound &gain..." msgstr "Guadagno &suono..." -msgid "Begin trace\tCtrl+T" -msgstr "Inizia traccia\tCtrl+T" +msgid "Begin trace" +msgstr "Inizia traccia" -msgid "End trace\tCtrl+T" -msgstr "Ferma traccia\tCtrl+T" +msgid "End trace" +msgstr "Ferma traccia" msgid "&Help" msgstr "&?" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 6132a8db1..d51be2536 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -18,8 +18,8 @@ msgstr "右CTRLを左ALTへ変換(&R)" msgid "&Hard Reset..." msgstr "ハード リセット(&H)..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "Ctrl+Alt+Del(&C)" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+Esc(&E)" @@ -111,8 +111,8 @@ msgstr "線形補間(&L)" msgid "Hi&DPI scaling" msgstr "HiDPIスケーリング(&D)" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "全画面表示(&F)\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "全画面表示(&F)" msgid "Fullscreen &stretch mode" msgstr "全画面の拡大表示モード(&S)" @@ -186,8 +186,8 @@ msgstr "設定(&S)..." msgid "&Update status bar icons" msgstr "ステータスバーのアイコンを更新(&U)" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "スクリーンショットを撮る(&C)\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "スクリーンショットを撮る(&C)" msgid "&Preferences..." msgstr "環境設定(&P)..." @@ -198,11 +198,11 @@ msgstr "Discord連携機能(&D)" msgid "Sound &gain..." msgstr "音量調整(&G)..." -msgid "Begin trace\tCtrl+T" -msgstr "トレース開始\tCtrl+T" +msgid "Begin trace" +msgstr "トレース開始" -msgid "End trace\tCtrl+T" -msgstr "トレース終了\tCtrl+T" +msgid "End trace" +msgstr "トレース終了" msgid "&Help" msgstr "ヘルプ(&H)" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index ec4b20d0d..859183fc1 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -18,8 +18,8 @@ msgstr "우측CTRL로 좌측ALT 입력(&R)" msgid "&Hard Reset..." msgstr "재시작(&H)..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "Ctrl+Alt+Del(&C)" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+Esc(&E)" @@ -111,8 +111,8 @@ msgstr "선형 보간법(&L)" msgid "Hi&DPI scaling" msgstr "HiDPI 스케일링(&D)" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "전체 화면(&F)\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "전체 화면(&F)" msgid "Fullscreen &stretch mode" msgstr "전체 화면 비율(&S)" @@ -186,8 +186,8 @@ msgstr "설정(&S)..." msgid "&Update status bar icons" msgstr "상태 바 아이콘 갱신하기(&U)" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "스크린샷 찍기(&C)\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "스크린샷 찍기(&C)" msgid "&Preferences..." msgstr "환경설정(&P)..." @@ -198,11 +198,11 @@ msgstr "디스코드 연동 활성화하기(&D)" msgid "Sound &gain..." msgstr "음량 증폭(&G)..." -msgid "Begin trace\tCtrl+T" -msgstr "추적 시작하기\tCtrl+T" +msgid "Begin trace" +msgstr "추적 시작하기" -msgid "End trace\tCtrl+T" -msgstr "추적 끝내기\tCtrl+T" +msgid "End trace" +msgstr "추적 끝내기" msgid "&Help" msgstr "도움말(&H)" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index c601197ac..cce4dfdc9 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -18,8 +18,8 @@ msgstr "&Rechtse CTRL is linkse ALT" msgid "&Hard Reset..." msgstr "&Harde Reset..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineair" msgid "Hi&DPI scaling" msgstr "Hi&DPI-schaling" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Fullscreen\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Fullscreen" msgid "Fullscreen &stretch mode" msgstr "Volledig scherm &uitrekmodus" @@ -186,8 +186,8 @@ msgstr "&Instellingen..." msgid "&Update status bar icons" msgstr "&Statusbalkpictogrammen bijwerken" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Maak een schermafbeelding\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Maak een schermafbeelding" msgid "&Preferences..." msgstr "&Voorkeuren..." @@ -198,11 +198,11 @@ msgstr "&Discord integratie inschakelen" msgid "Sound &gain..." msgstr "&Geluidsversterking..." -msgid "Begin trace\tCtrl+T" -msgstr "Begin traceren\tCtrl+T" +msgid "Begin trace" +msgstr "Begin traceren" -msgid "End trace\tCtrl+T" -msgstr "Traceren beëindigen\tCtrl+T" +msgid "End trace" +msgstr "Traceren beëindigen" msgid "&Help" msgstr "&Help" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 78ded239f..26cc4bae6 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -18,8 +18,8 @@ msgstr "&Prawy CTRL to lewy Alt" msgid "&Hard Reset..." msgstr "&Twardy reset..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Linear" msgid "Hi&DPI scaling" msgstr "Skalowanie Hi&DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Pełny ekran\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Pełny ekran" msgid "Fullscreen &stretch mode" msgstr "Tryb rozciągania na pełnym ekranie" @@ -186,8 +186,8 @@ msgstr "&Ustawienia..." msgid "&Update status bar icons" msgstr "&Aktualizuj ikony na pasku statusu" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Zrób &zrzut ekranu\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Zrób &zrzut ekranu" msgid "&Preferences..." msgstr "&Preferencje..." @@ -198,11 +198,11 @@ msgstr "Włącz integrację z &Discord" msgid "Sound &gain..." msgstr "Wzmocnienie &dźwięku..." -msgid "Begin trace\tCtrl+T" -msgstr "Rozpocznij śledzenie\tCtrl+T" +msgid "Begin trace" +msgstr "Rozpocznij śledzenie" -msgid "End trace\tCtrl+T" -msgstr "Zakończ śledzenie\tCtrl+T" +msgid "End trace" +msgstr "Zakończ śledzenie" msgid "&Help" msgstr "&Pomoc" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 1594e30ab..b453d0f97 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -18,8 +18,8 @@ msgstr "&CTRL direito é o ALT esquerdo" msgid "&Hard Reset..." msgstr "&Reinicialização completa..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Linear" msgid "Hi&DPI scaling" msgstr "Escala Hi&DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Tela cheia\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Tela cheia" msgid "Fullscreen &stretch mode" msgstr "Modo de &redimensionamento da tela cheia" @@ -186,8 +186,8 @@ msgstr "&Configurações..." msgid "&Update status bar icons" msgstr "&Atualizar ícones da barra de status" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Capturar &tela\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Capturar &tela" msgid "&Preferences..." msgstr "&Preferências..." @@ -198,11 +198,11 @@ msgstr "Ativar integração com o &Discord" msgid "Sound &gain..." msgstr "&Ganho de som..." -msgid "Begin trace\tCtrl+T" -msgstr "Inicio do rastreamento\tCtrl+T" +msgid "Begin trace" +msgstr "Inicio do rastreamento" -msgid "End trace\tCtrl+T" -msgstr "Finalizar rastreamento\tCtrl+T" +msgid "End trace" +msgstr "Finalizar rastreamento" msgid "&Help" msgstr "&Ajuda" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index b31f020d4..d732532ed 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -18,8 +18,8 @@ msgstr "&CTRL direito é ALT esquerdo" msgid "&Hard Reset..." msgstr "&Reinicialização completa..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Linear" msgid "Hi&DPI scaling" msgstr "Escala Hi&DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "E&crã cheio\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "E&crã cheio" msgid "Fullscreen &stretch mode" msgstr "Modo &de estiramento na tela cheia" @@ -186,8 +186,8 @@ msgstr "&Definições..." msgid "&Update status bar icons" msgstr "&Atualizar ícones da barra de estado" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Gravar imagem de ecrã\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Gravar imagem de ecrã" msgid "&Preferences..." msgstr "&Preferências..." @@ -198,11 +198,11 @@ msgstr "Ativar integração com &Discord" msgid "Sound &gain..." msgstr "&Ganho de som..." -msgid "Begin trace\tCtrl+T" -msgstr "Iniciar o rastreio\tCtrl+T" +msgid "Begin trace" +msgstr "Iniciar o rastreio" -msgid "End trace\tCtrl+T" -msgstr "Terminar o rastreio\tCtrl+T" +msgid "End trace" +msgstr "Terminar o rastreio" msgid "&Help" msgstr "&Ajuda" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index a8a4b7794..e68e6bb10 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -18,8 +18,8 @@ msgstr "&Правый CTRL - это левый ALT" msgid "&Hard Reset..." msgstr "&Холодная перезагрузка..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Линейный" msgid "Hi&DPI scaling" msgstr "Масштабирование Hi&DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Полноэкранный режим\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Полноэкранный режим" msgid "Fullscreen &stretch mode" msgstr "&Растягивание в полноэкранном режиме" @@ -186,8 +186,8 @@ msgstr "&Настройки машины..." msgid "&Update status bar icons" msgstr "&Обновление значков строки состояния" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Сделать с&криншот\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Сделать с&криншот" msgid "&Preferences..." msgstr "&Параметры..." @@ -198,11 +198,11 @@ msgstr "Включить интеграцию &Discord" msgid "Sound &gain..." msgstr "&Усиление звука..." -msgid "Begin trace\tCtrl+T" -msgstr "Начать трассировку\tCtrl+T" +msgid "Begin trace" +msgstr "Начать трассировку" -msgid "End trace\tCtrl+T" -msgstr "Завершить трассировку\tCtrl+T" +msgid "End trace" +msgstr "Завершить трассировку" msgid "&Help" msgstr "&Помощь" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index e789d9ef9..c091780c2 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -18,8 +18,8 @@ msgstr "&Pravý Ctrl je ľavý Alt" msgid "&Hard Reset..." msgstr "&Resetovať" -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Lineárny" msgid "Hi&DPI scaling" msgstr "Š&kálovanie HiDPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Celá obrazovka\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Celá obrazovka" msgid "Fullscreen &stretch mode" msgstr "Režim roztia&hnutia na celú obrazovku" @@ -186,8 +186,8 @@ msgstr "&Nastavenia..." msgid "&Update status bar icons" msgstr "&Aktualizovať ikony na stavovom riadku" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Urobiť snímku &obrazovky\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Urobiť snímku &obrazovky" msgid "&Preferences..." msgstr "&Predvoľby..." @@ -198,11 +198,11 @@ msgstr "Povolenie integrácie s &Discordem" msgid "Sound &gain..." msgstr "&Zosilnenie zvuku" -msgid "Begin trace\tCtrl+T" -msgstr "Začať trace\tCtrl+T" +msgid "Begin trace" +msgstr "Začať trace" -msgid "End trace\tCtrl+T" -msgstr "Zastaviť trace\tCtrl+T" +msgid "End trace" +msgstr "Zastaviť trace" msgid "&Help" msgstr "&Pomoc" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 1394a3635..15041a4aa 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -18,8 +18,8 @@ msgstr "&Desni CTRL je levi ALT" msgid "&Hard Reset..." msgstr "&Ponovni zagon..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Linearna" msgid "Hi&DPI scaling" msgstr "&Raztezanje za visok DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Celozaslonski način\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Celozaslonski način" msgid "Fullscreen &stretch mode" msgstr "&Način celozaslonskega raztezanja" @@ -186,8 +186,8 @@ msgstr "&Nastavitve..." msgid "&Update status bar icons" msgstr "&Posodabljaj ikone statusne vrstice" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "&Zajemi posnetek zaslona\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "&Zajemi posnetek zaslona" msgid "&Preferences..." msgstr "&Možnosti..." @@ -198,11 +198,11 @@ msgstr "Omogoči integracijo s programom &Discord" msgid "Sound &gain..." msgstr "&Ojačanje zvoka..." -msgid "Begin trace\tCtrl+T" -msgstr "Z&ačni sledenje\tCtrl+T" +msgid "Begin trace" +msgstr "Z&ačni sledenje" -msgid "End trace\tCtrl+T" -msgstr "&Končaj sledenje\tCtrl+T" +msgid "End trace" +msgstr "&Končaj sledenje" msgid "&Help" msgstr "&Pomoč" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 81866b3ce..c16cc12e4 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -18,8 +18,8 @@ msgstr "&Sağ CTRL tuşunu sol ALT tuşu olarak ayarla" msgid "&Hard Reset..." msgstr "Yeniden başlamaya &zorla" -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+&Alt+Esc" @@ -111,8 +111,8 @@ msgstr "Doğ&rusal" msgid "Hi&DPI scaling" msgstr "HiDPI ölçekle&mesi" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "Tam ekran\tCtrl+Alt+Pg&Up" +msgid "&Fullscreen" +msgstr "Tam ekran" msgid "Fullscreen &stretch mode" msgstr "Tam e&kran germe modu" @@ -186,8 +186,8 @@ msgstr "&Ayarlar..." msgid "&Update status bar icons" msgstr "Durum &çubuğu simgelerini güncelle" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "&Ekran görüntüsü al\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "&Ekran görüntüsü al" msgid "&Preferences..." msgstr "&Tercihler..." @@ -198,11 +198,11 @@ msgstr "&Discord entegrasyonunu etkinleştir" msgid "Sound &gain..." msgstr "&Ses düzeyi artışı..." -msgid "Begin trace\tCtrl+T" -msgstr "İzlemeyi başlat\tCtrl+T" +msgid "Begin trace" +msgstr "İzlemeyi başlat" -msgid "End trace\tCtrl+T" -msgstr "İzlemeyi bitir\tCtrl+T" +msgid "End trace" +msgstr "İzlemeyi bitir" msgid "&Help" msgstr "&Yardım" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 9b57ac03e..bde9a4f51 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -18,8 +18,8 @@ msgstr "&Правий CTRL - це лівий ALT" msgid "&Hard Reset..." msgstr "&Холодне перезавантаження..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "&Лінійний" msgid "Hi&DPI scaling" msgstr "Масштабування Hi&DPI" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Повноекранний режим\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "&Повноекранний режим" msgid "Fullscreen &stretch mode" msgstr "&Розстягування у повноекранному режимі" @@ -186,8 +186,8 @@ msgstr "&Налаштування машини..." msgid "&Update status bar icons" msgstr "&Обновлення значків рядка стану" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Зробити &знімок\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Зробити &знімок" msgid "&Preferences..." msgstr "&Параметри..." @@ -198,11 +198,11 @@ msgstr "Увімкнути інтеграцію &Discord" msgid "Sound &gain..." msgstr "&Посилення звуку..." -msgid "Begin trace\tCtrl+T" -msgstr "Почати трасування\tCtrl+T" +msgid "Begin trace" +msgstr "Почати трасування" -msgid "End trace\tCtrl+T" -msgstr "Завершити трасування\tCtrl+T" +msgid "End trace" +msgstr "Завершити трасування" msgid "&Help" msgstr "&Допомога" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index abf9a1dea..fa9384d8f 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -18,8 +18,8 @@ msgstr "Gắn ALT trái vào CTRL ph&ải" msgid "&Hard Reset..." msgstr "Buộc khởi độn&g lại" -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "&Ctrl+Alt+Del\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" @@ -111,8 +111,8 @@ msgstr "Tu&yến tính" msgid "Hi&DPI scaling" msgstr "Tỷ lệ hinh ảnh phân giải cao" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "Toàn màn &hình\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "Toàn màn &hình" msgid "Fullscreen &stretch mode" msgstr "&Chế độ kéo giãn hình" @@ -186,8 +186,8 @@ msgstr "&Cài đặt..." msgid "&Update status bar icons" msgstr "Cậ&p nhật biểu tượng thanh trạng thái" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "Chụp &màn hình\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "Chụp &màn hình" msgid "&Preferences..." msgstr "&Tùy biến..." @@ -198,11 +198,11 @@ msgstr "Bật trình trạng thái cho Discord" msgid "Sound &gain..." msgstr "Bộ &tăng âm..." -msgid "Begin trace\tCtrl+T" -msgstr "Bắt đầu dò\tCtrl+T" +msgid "Begin trace" +msgstr "Bắt đầu dò" -msgid "End trace\tCtrl+T" -msgstr "Ngưng dò\tCtrl+T" +msgid "End trace" +msgstr "Ngưng dò" msgid "&Help" msgstr "&Trợ giúp" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index ec5d2c252..4cccc071a 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -18,8 +18,8 @@ msgstr "将右 CTRL 键映射为左 ALT 键(&R)" msgid "&Hard Reset..." msgstr "硬重置(&H)..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "Ctrl+Alt+Del(&C)" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+Esc(&E)" @@ -111,8 +111,8 @@ msgstr "线性(&L)" msgid "Hi&DPI scaling" msgstr "HiDPI 缩放(&D)" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "全屏(&F)\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "全屏(&F)" msgid "Fullscreen &stretch mode" msgstr "全屏拉伸模式(&S)" @@ -186,8 +186,8 @@ msgstr "设置(&S)..." msgid "&Update status bar icons" msgstr "更新状态栏图标(&U)" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "截图(&C)\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "截图(&C)" msgid "&Preferences..." msgstr "首选项(&P)..." @@ -198,11 +198,11 @@ msgstr "启用 Discord 集成(&D)" msgid "Sound &gain..." msgstr "音量增益(&G)..." -msgid "Begin trace\tCtrl+T" -msgstr "开始追踪\tCtrl+T" +msgid "Begin trace" +msgstr "开始追踪" -msgid "End trace\tCtrl+T" -msgstr "结束追踪\tCtrl+T" +msgid "End trace" +msgstr "结束追踪" msgid "&Help" msgstr "帮助(&H)" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index b0d8163cb..92c6502ea 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -18,8 +18,8 @@ msgstr "將右 CTRL 鍵映射為左 ALT 鍵(&R)" msgid "&Hard Reset..." msgstr "硬重設(&H)..." -msgid "&Ctrl+Alt+Del\tCtrl+F12" -msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12" +msgid "&Ctrl+Alt+Del" +msgstr "Ctrl+Alt+Del(&C)" msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+Esc(&E)" @@ -111,8 +111,8 @@ msgstr "線性(&L)" msgid "Hi&DPI scaling" msgstr "HiDPI 縮放(&D)" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "全螢幕(&F)\tCtrl+Alt+PgUp" +msgid "&Fullscreen" +msgstr "全螢幕(&F)" msgid "Fullscreen &stretch mode" msgstr "全螢幕拉伸模式(&S)" @@ -186,8 +186,8 @@ msgstr "設定(&S)..." msgid "&Update status bar icons" msgstr "更新狀態列圖示(&U)" -msgid "Take s&creenshot\tCtrl+F11" -msgstr "擷圖(&C)\tCtrl+F11" +msgid "Take s&creenshot" +msgstr "擷圖(&C)" msgid "&Preferences..." msgstr "偏好設定(&P)..." @@ -198,11 +198,11 @@ msgstr "啟用 Discord 整合(&D)" msgid "Sound &gain..." msgstr "音量增益(&G)..." -msgid "Begin trace\tCtrl+T" -msgstr "開始追踪\tCtrl+T" +msgid "Begin trace" +msgstr "開始追踪" -msgid "End trace\tCtrl+T" -msgstr "結束追踪\tCtrl+T" +msgid "End trace" +msgstr "結束追踪" msgid "&Help" msgstr "說明(&H)" diff --git a/src/qt/qt_progsettings.hpp b/src/qt/qt_progsettings.hpp index b4e59e02d..1c7295f56 100644 --- a/src/qt/qt_progsettings.hpp +++ b/src/qt/qt_progsettings.hpp @@ -28,22 +28,7 @@ public: QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const override { - if (strcmp(sourceText, "&Fullscreen") == 0) - sourceText = "&Fullscreen\tCtrl+Alt+PgUp"; - if (strcmp(sourceText, "&Ctrl+Alt+Del") == 0) - sourceText = "&Ctrl+Alt+Del\tCtrl+F12"; - if (strcmp(sourceText, "Take s&creenshot") == 0) - sourceText = "Take s&creenshot\tCtrl+F11"; - if (strcmp(sourceText, "Begin trace") == 0) - sourceText = "Begin trace\tCtrl+T"; - if (strcmp(sourceText, "End trace") == 0) - sourceText = "End trace\tCtrl+T"; - QString finalstr = QTranslator::translate("", sourceText, disambiguation, n); -#ifdef Q_OS_MACOS - if (finalstr.contains('\t')) - finalstr.truncate(finalstr.indexOf('\t')); -#endif - return finalstr; + return QTranslator::translate("", sourceText, disambiguation, n); } }; static CustomTranslator *translator; From 8f1fa1e5da5171912849b2830e260e9815d66181 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 7 Apr 2025 19:47:07 +0500 Subject: [PATCH 087/118] qt: Remove unused string translations --- src/qt/languages/86box.pot | 54 -------------------------------------- src/qt/languages/ca-ES.po | 54 -------------------------------------- src/qt/languages/cs-CZ.po | 54 -------------------------------------- src/qt/languages/de-DE.po | 54 -------------------------------------- src/qt/languages/en-GB.po | 12 --------- src/qt/languages/es-ES.po | 54 -------------------------------------- src/qt/languages/fi-FI.po | 51 ----------------------------------- src/qt/languages/fr-FR.po | 54 -------------------------------------- src/qt/languages/hr-HR.po | 54 -------------------------------------- src/qt/languages/hu-HU.po | 54 -------------------------------------- src/qt/languages/it-IT.po | 54 -------------------------------------- src/qt/languages/ja-JP.po | 54 -------------------------------------- src/qt/languages/ko-KR.po | 54 -------------------------------------- src/qt/languages/nl-NL.po | 54 -------------------------------------- src/qt/languages/pl-PL.po | 54 -------------------------------------- src/qt/languages/pt-BR.po | 54 -------------------------------------- src/qt/languages/pt-PT.po | 54 -------------------------------------- src/qt/languages/ru-RU.po | 54 -------------------------------------- src/qt/languages/sk-SK.po | 53 ------------------------------------- src/qt/languages/sl-SI.po | 54 -------------------------------------- src/qt/languages/tr-TR.po | 54 -------------------------------------- src/qt/languages/uk-UA.po | 54 -------------------------------------- src/qt/languages/vi-VN.po | 54 -------------------------------------- src/qt/languages/zh-CN.po | 54 -------------------------------------- src/qt/languages/zh-TW.po | 54 -------------------------------------- 25 files changed, 1304 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 6e610d715..15c605449 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -306,18 +306,12 @@ msgstr "" msgid "Cancel" msgstr "" -msgid "Save these settings as &global defaults" -msgstr "" - msgid "&Default" msgstr "" msgid "Language:" msgstr "" -msgid "Icon set:" -msgstr "" - msgid "Gain" msgstr "" @@ -753,9 +747,6 @@ msgstr "" msgid "KB" msgstr "" -msgid "Could not initialize the video renderer." -msgstr "" - msgid "Default" msgstr "" @@ -906,9 +897,6 @@ msgstr "" msgid "OpenGL Shaders" msgstr "" -msgid "OpenGL options" -msgstr "" - msgid "You are loading an unsupported configuration" msgstr "" @@ -930,12 +918,6 @@ msgstr "" msgid "Cartridge images" msgstr "" -msgid "Error initializing renderer" -msgstr "" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "" - msgid "Resume execution" msgstr "" @@ -1293,21 +1275,6 @@ msgstr "" msgid "NIC %02i (%ls) %ls" msgstr "" -msgid "Error opening \"%1\": %2" -msgstr "" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "" - -msgid "Error linking shader program in file \"%1\"" -msgstr "" - -msgid "OpenGL 3.0 renderer options" -msgstr "" - msgid "Render behavior" msgstr "" @@ -1320,9 +1287,6 @@ msgstr "" msgid "VSync" msgstr "" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "" - msgid "Synchronize with video" msgstr "" @@ -1332,21 +1296,9 @@ msgstr "" msgid "Remove" msgstr "" -msgid "No shader selected" -msgstr "" - msgid "Browse..." msgstr "" -msgid "Shader error" -msgstr "" - -msgid "Could not load shaders." -msgstr "" - -msgid "More information in details." -msgstr "" - msgid "Couldn't create OpenGL context." msgstr "" @@ -1356,18 +1308,12 @@ msgstr "" msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "" -msgid "OpenGL initialization failed. Error %1." -msgstr "" - msgid "Error initializing OpenGL" msgstr "" msgid "Falling back to software rendering.\n" msgstr "" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 8c89c6bad..26e51fe68 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -306,18 +306,12 @@ msgstr "D'acord" msgid "Cancel" msgstr "Anuŀlació" -msgid "Save these settings as &global defaults" -msgstr "Salvar aquests paràmetres com per &defecte globalment" - msgid "&Default" msgstr "&Per defecte" msgid "Language:" msgstr "Idioma:" -msgid "Icon set:" -msgstr "Conjunt d'icones:" - msgid "Gain" msgstr "Guany" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "No has estat possible inicialitzar el renderitzador de vídeo." - msgid "Default" msgstr "Per defecte" @@ -906,9 +897,6 @@ msgstr "Monitor en mode estalvi" msgid "OpenGL Shaders" msgstr "Shaders OpenGL" -msgid "OpenGL options" -msgstr "Opcions OpenGL" - msgid "You are loading an unsupported configuration" msgstr "S'està carregant una configuració no suportada" @@ -930,12 +918,6 @@ msgstr "Cartutx %i: %ls" msgid "Cartridge images" msgstr "Imatges de cartutx" -msgid "Error initializing renderer" -msgstr "Error en inicialitzar el renderitzador" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "No has estat possible inicialitzar el renderitzador OpenGL (3.0 Core). Utilitzar un altre renderitzador." - msgid "Resume execution" msgstr "Reprendre l'execució" @@ -1293,21 +1275,6 @@ msgstr "Controlador nul" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Error d'obertura \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Error en recopilar el vertex shader al fitxer \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Error en recopilar el fragment shader al fitxer \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Error en enllaçar el programa de shader al fitxer \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Opcions del renderitzador OpenGL 3.0" - msgid "Render behavior" msgstr "Comportament del renderitzador" @@ -1320,9 +1287,6 @@ msgstr " fotogrames/s" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Feu que cada fotograma sigui immediatament, en sincronització amb la pantalla emulada.</p><p><span style=" font-style:italic;">Aquesta és l’opció recomanada si els shaders en ús no utilitzen FrameTime per a efectes animats.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Sincronitzar amb vídeo" @@ -1332,21 +1296,9 @@ msgstr "Shaders" msgid "Remove" msgstr "Supressió" -msgid "No shader selected" -msgstr "Cap shader seleccionat" - msgid "Browse..." msgstr "Navegació..." -msgid "Shader error" -msgstr "Error del shader" - -msgid "Could not load shaders." -msgstr "No has estat possible carregar els shaders." - -msgid "More information in details." -msgstr "Més informació en els detalls." - msgid "Couldn't create OpenGL context." msgstr "No has estat possible crear un context d'OpenGL." @@ -1356,18 +1308,12 @@ msgstr "No has estat possible canviar al context d'OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Es requereix la versió 3.0 o superior d'OpenGL. La versió actual és %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "No has estat possible inicialitzar OpenGL. Error %1." - msgid "Error initializing OpenGL" msgstr "Error en inicialitzar OpenGL" msgid "Falling back to software rendering.\n" msgstr "Tornant al renderitzador software.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "No has estat possible assignar la memòria per a un buffer de desempaquetament.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Quan seleccioneu imatges de suports (CD-ROM, disquet, etc.), el diàleg obert s’iniciarà al mateix directori que el fitxer de configuració 86Box. Aquesta configuració només farà una diferència en les macOS.</p></body></html>" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 2a26f7ef6..099245033 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Storno" -msgid "Save these settings as &global defaults" -msgstr "Uložit toto nastavení jako &globální výchozí stav" - msgid "&Default" msgstr "&Výchozí" msgid "Language:" msgstr "Jazyk:" -msgid "Icon set:" -msgstr "Sada ikon:" - msgid "Gain" msgstr "Zesílení" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Nastala chyba při inicializaci video rendereru." - msgid "Default" msgstr "Výchozí" @@ -906,9 +897,6 @@ msgstr "Monitor je v režimu spánku" msgid "OpenGL Shaders" msgstr "Shadery OpenGL" -msgid "OpenGL options" -msgstr "Možnosti OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Pokoušíte se spustit nepodporovanou konfiguraci" @@ -930,12 +918,6 @@ msgstr "Cartridge %i: %ls" msgid "Cartridge images" msgstr "Obrazy cartridge" -msgid "Error initializing renderer" -msgstr "Chyba při inicializaci vykreslovače" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Vykreslovač OpenGL (3.0 Core) se nepodařilo inicializovat. Použijte jiný renderer." - msgid "Resume execution" msgstr "Obnovit" @@ -1293,21 +1275,6 @@ msgstr "Nulový ovladač" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Chyba při otevírání \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Chyba při kompilaci vertex shaderu v souboru \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Chyba při kompilaci fragment shaderu v souboru \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Chyba při linkování shader programu v souboru \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Možnosti vykreslovače OpenGL 3.0" - msgid "Render behavior" msgstr "Chování vykreslování" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Každý snímek se vykreslí okamžitě, synchronizovaně s emulovaným displejem.</p><p><span style=" font-style:italic;">Tuto možnost doporučujeme, pokud používané shadery nevyužívají frametime pro animované efekty.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Synchronizovat s obrazem" @@ -1332,21 +1296,9 @@ msgstr "Shadery" msgid "Remove" msgstr "Odstraň" -msgid "No shader selected" -msgstr "Není vybrán žádný shader" - msgid "Browse..." msgstr "Prohlížejte..." -msgid "Shader error" -msgstr "Chyba shaderu" - -msgid "Could not load shaders." -msgstr "Nepodařilo se načíst shadery." - -msgid "More information in details." -msgstr "Více informací v podrobnostech." - msgid "Couldn't create OpenGL context." msgstr "Nepodařilo se vytvořit kontext OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Nepodařilo se přepnout na kontext OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Je vyžadována verze OpenGL 3.0 nebo vyšší. Aktuální verze je %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Inicializace OpenGL se nezdařila. Chyba %1." - msgid "Error initializing OpenGL" msgstr "Chyba při inicializaci OpenGL" msgid "Falling back to software rendering.\n" msgstr "Návrat k softwarovému vykreslování.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Alokace paměti pro rozbalovací vyrovnávací paměť se nezdařila.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Při výběru obrazů médií (CD-ROM, disketa atd.) se otevřené dialogové okno spustí ve stejném adresáři jako konfigurační soubor 86Box. Toto nastavení bude mít pravděpodobně význam pouze v systému MacOS.</p></body></html>" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index fbb97a990..eae29f084 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Abbrechen" -msgid "Save these settings as &global defaults" -msgstr "Einstellungen als &globalen Standard speichern" - msgid "&Default" msgstr "&Standard" msgid "Language:" msgstr "Sprache:" -msgid "Icon set:" -msgstr "Icon-Satz:" - msgid "Gain" msgstr "Verstärkung" @@ -756,9 +750,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Der Videorenderer konnte nicht initialisiert werden." - msgid "Default" msgstr "Standard" @@ -909,9 +900,6 @@ msgstr "Monitor im Standbymodus" msgid "OpenGL Shaders" msgstr "OpenGL-Shader" -msgid "OpenGL options" -msgstr "OpenGL-Optionen" - msgid "You are loading an unsupported configuration" msgstr "Zur Zeit wird eine nicht unterstützte Konfiguration geladen" @@ -933,12 +921,6 @@ msgstr "Cartridge %i: %ls" msgid "Cartridge images" msgstr "Cartridgeabbilder" -msgid "Error initializing renderer" -msgstr "Fehler bei der Initialisierung des Renderer" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Der OpenGL (3.0-Kern)-Renderer konnte nicht initialisiert werden. Benutze einen anderen Renderer." - msgid "Resume execution" msgstr "Fortsetzen" @@ -1296,21 +1278,6 @@ msgstr "Nulltreiber" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Fehler beim Öffnen \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Fehler beim Kompilieren des Vertex-Shaders in der Datei \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Fehler beim Kompilieren des Fragment-Shaders in der Datei \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Fehler beim Linken des Shader-Programms in der Datei \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0 Renderer-Optionen" - msgid "Render behavior" msgstr "Rendering-Verhalten" @@ -1323,9 +1290,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Jedes Bild sofort rendern, synchron mit der emulierten Monitor.</p><p><span style=" font-style:italic;">Dies ist die empfohlene Option, wenn die verwendeten Shader die Bildzeit für animierte Effekte nicht nutzen.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Mit Videoausgabe synchronisieren" @@ -1335,21 +1299,9 @@ msgstr "Shader" msgid "Remove" msgstr "Entfernen" -msgid "No shader selected" -msgstr "Kein Shader ausgewählt" - msgid "Browse..." msgstr "Durchsuchen..." -msgid "Shader error" -msgstr "Shader-Fehler" - -msgid "Could not load shaders." -msgstr "Shader konnten nicht geladen werden." - -msgid "More information in details." -msgstr "Weitere Informationen im Einzelnen." - msgid "Couldn't create OpenGL context." msgstr "OpenGL-Kontext konnte nicht erstellt werden." @@ -1359,18 +1311,12 @@ msgstr "Konnte nicht in den OpenGL-Kontext wechseln." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL-Version 3.0 oder höher ist erforderlich. Die aktuelle Version ist %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL-Initialisierung fehlgeschlagen. Fehler %1." - msgid "Error initializing OpenGL" msgstr "Fehler beim Initialisieren von OpenGL" msgid "Falling back to software rendering.\n" msgstr "Rückgriff auf Software-Rendering.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Nicht genug Speicher zum Entpacken.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Bei der Auswahl von Medien-Abbildern (CD-ROM, Diskette usw.) wird der Öffnungsdialog im selben Verzeichnis wie die 86Box-Konfigurationsdatei gestartet. Diese Einstellung macht wahrscheinlich nur unter macOS einen Unterschied.</p></body></html>" diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index bd3a5ba99..b9f79882f 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -15,15 +15,6 @@ msgstr "&RGB Greyscale" msgid "Time synchronization" msgstr "Time synchronisation" -msgid "Could not initialize the video renderer." -msgstr "Could not initialise the video renderer." - -msgid "Error initializing renderer" -msgstr "Error initialising renderer" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "OpenGL (3.0 Core) renderer could not be initialised. Use another renderer." - msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behaviour will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." @@ -33,9 +24,6 @@ msgstr "Apply fullscreen stretch mode when maximised" msgid "Render behavior" msgstr "Render behaviour" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilise frametime for animated effects.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Synchronise with video" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 1a5550065..14d6a6383 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -306,18 +306,12 @@ msgstr "Aceptar" msgid "Cancel" msgstr "Cancelar" -msgid "Save these settings as &global defaults" -msgstr "Salvar estos configuraciones como por &defecto globalmente" - msgid "&Default" msgstr "&Por defecto" msgid "Language:" msgstr "Idioma:" -msgid "Icon set:" -msgstr "Juego de iconos:" - msgid "Gain" msgstr "Ganancia" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "No fué posible inicializar el renderizador de vídeo." - msgid "Default" msgstr "Por defecto" @@ -906,9 +897,6 @@ msgstr "Monitor en modo ahorro" msgid "OpenGL Shaders" msgstr "Shaders OpenGL" -msgid "OpenGL options" -msgstr "Opciones OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Está cargando una configuración no soportada" @@ -930,12 +918,6 @@ msgstr "Cartucho %i: %ls" msgid "Cartridge images" msgstr "Imágenes de Cartucho" -msgid "Error initializing renderer" -msgstr "Error al inicializar el renderizador" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "No fué posible inicializar el renderizador OpenGL (3.0 Core). Utilice otro renderizador." - msgid "Resume execution" msgstr "Retomar la ejecución" @@ -1292,21 +1274,6 @@ msgstr "Controlador nulo" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Error al abrir \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Error al compilar el vertex shader en el archivo \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Error al compilar el fragmentshader en el archivo \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Error al enlazar el programa shader en el archivo \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Opciones del renderizador OpenGL 3.0" - msgid "Render behavior" msgstr "Comportamiento del renderizador" @@ -1319,9 +1286,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Renderiza cada fotograma inmediatamente, en sincronía con la pantalla emulada.</p><p><span style=" font-style:italic;">Esta es la opción recomendada si los shaders en uso no utilizan frametime para efectos animados.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Sincronizar con los gráficos" @@ -1331,21 +1295,9 @@ msgstr "Shaders" msgid "Remove" msgstr "Eliminar" -msgid "No shader selected" -msgstr "Ningun shader seleccionado" - msgid "Browse..." msgstr "Buscar..." -msgid "Shader error" -msgstr "Error del shader" - -msgid "Could not load shaders." -msgstr "No ha sido posible carregar los shaders." - -msgid "More information in details." -msgstr "Más informaciones en los detalles." - msgid "Couldn't create OpenGL context." msgstr "No ha sido posible crear el contexto OpenGL." @@ -1355,18 +1307,12 @@ msgstr "No ha sido posible cambiar al contexto OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Es requerida la versión 3.0 o más alta de OpenGL. La versión actual es %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "La inicialización de OpenGL no tuvo éxito. Error %1." - msgid "Error initializing OpenGL" msgstr "Error al inicializar OpenGL" msgid "Falling back to software rendering.\n" msgstr "Recurrir al renderizado por software.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "La allocación de memoria para el búfer de desempaquetado no tuvo éxito.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Al seleccionar imágenes multimedia (CD-ROM, disquete, etc.), el diálogo de apertura se iniciará en el mismo directorio que el archivo de configuración de 86Box. Es probable que este ajuste sólo suponga una diferencia en macOS.</p></body></html>" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 5222ccc45..1408522fc 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Peruuta" -msgid "Save these settings as &global defaults" -msgstr "Tallenna nämä asetukset &globaaleiksi oletuksiksi" - msgid "&Default" msgstr "&Oletus" msgid "Language:" msgstr "Kieli:" -msgid "Icon set:" -msgstr "Kuvakkeet:" - msgid "Gain" msgstr "Taso" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "Kt" -msgid "Could not initialize the video renderer." -msgstr "Videorenderöijän alustus epäonnistui" - msgid "Default" msgstr "Oletus" @@ -906,9 +897,6 @@ msgstr "Näyttö lepotilassa" msgid "OpenGL Shaders" msgstr "OpenGL-varjostinohjelmat" -msgid "OpenGL options" -msgstr "OpenGL-asetukset" - msgid "You are loading an unsupported configuration" msgstr "Olet lataamassa ei-tuettuja määrittelyjä" @@ -930,12 +918,6 @@ msgstr "ROM-moduuli %i: %ls" msgid "Cartridge images" msgstr "ROM-moduulikuvat" -msgid "Error initializing renderer" -msgstr "Virhe renderöijän alustuksessa" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "OpenGL (3.0 Core)-renderöijän alustus epäonnistui. Käytä toista renderöijää." - msgid "Resume execution" msgstr "Jatka suoritusta" @@ -1293,21 +1275,6 @@ msgstr "Nolla-ajuri" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Virhe \"%1\" avaamisessa: %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Virhe vertex-shaderin kääntämisessä tiedostossa \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Virhe fragmenttivarjostimen kääntämisessä tiedostossa \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Virhe varjostinohjelman linkittämisessä tiedostoon \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0-alustusasetukset" - msgid "Render behavior" msgstr "Renderöintikäyttäytyminen" @@ -1320,9 +1287,6 @@ msgstr " ruutua/s" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Renderöi jokainen ruutu välittömästi synkronoidusti emuloidun näytön kanssa.</p><p><span style=" font-style:italic;">Tämä on suositeltava vaihtoehto, jos käytössä olevat varjostimet eivät käytä frametimeä animaatioefekteihin.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Synkronisoi videoon" @@ -1338,15 +1302,6 @@ msgstr "Ei valittu varjostinohjelmatta" msgid "Browse..." msgstr "Selaa..." -msgid "Shader error" -msgstr "Varjostinohjelmatvirhe" - -msgid "Could not load shaders." -msgstr "Varjostinohjelmateita ei voitu ladata." - -msgid "More information in details." -msgstr "Lisätietoja yksityiskohtaisesti." - msgid "Couldn't create OpenGL context." msgstr "OpenGL-kontekstia ei voitu luoda." @@ -1356,18 +1311,12 @@ msgstr "Ei voitu siirtyä OpenGL-kontekstiin." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Tarvitaan OpenGL-versio 3.0 tai uudempi. Nykyinen versio on %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL:n alustaminen epäonnistui. Virhe %1." - msgid "Error initializing OpenGL" msgstr "Virhe OpenGL:n alustamisessa" msgid "Falling back to software rendering.\n" msgstr "Paluu ohjelmistoalustusöintiin.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Pakkauspuskurin muistin varaaminen epäonnistui.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Kun valitset mediakuvia (CD-ROM, levykkeet jne.), avausikkuna käynnistyy samaan hakemistoon kuin 86Boxin konfigurointitiedosto. Tällä asetuksella on todennäköisesti merkitystä vain macOS-käyttöjärjestelmässä.</p></body></html>" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 9937cecd4..829a9658b 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Annuler" -msgid "Save these settings as &global defaults" -msgstr "Sauvegarder ces paramètres comme valeurs par défaut &globales" - msgid "&Default" msgstr "&Défaut" msgid "Language:" msgstr "Langue:" -msgid "Icon set:" -msgstr "Ensemble d'icônes:" - msgid "Gain" msgstr "Gain" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "Ko" -msgid "Could not initialize the video renderer." -msgstr "Impossible d'initialiser le moteur de rendu vidéo." - msgid "Default" msgstr "Défaut" @@ -906,9 +897,6 @@ msgstr "Moniteur en mode veille" msgid "OpenGL Shaders" msgstr "Shaders OpenGL" -msgid "OpenGL options" -msgstr "Options OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Vous chargez une configuration non prise en charge" @@ -930,12 +918,6 @@ msgstr "Cartouche %i: %ls" msgid "Cartridge images" msgstr "Images cartouche" -msgid "Error initializing renderer" -msgstr "Erreur d'initialisation du moteur de rendu" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Le moteur de rendu OpenGL (3.0 Core) n'a pas pu être initialisé. Utilisez un autre moteur de rendu." - msgid "Resume execution" msgstr "Reprendre l'exécution" @@ -1293,21 +1275,6 @@ msgstr "Pilote nul" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Erreur d'ouverture de \"%1\" : %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Erreur de compilation du vertex shader dans le fichier \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Erreur de compilation du fragment shader dans le fichier \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Erreur de liaison du programme shader dans le fichier \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Options de rendu OpenGL 3.0" - msgid "Render behavior" msgstr "Comportement de rendu" @@ -1320,9 +1287,6 @@ msgstr " mages par seconde" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Rendre chaque image immédiatement, en synchronisation avec l'affichage émulé.</p><p><span style=" font-style:italic;">C'est l'option recommandée si les shaders utilisés n'utilisent pas le frametime pour les effets animés.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Synchronisation avec la vidéo" @@ -1332,21 +1296,9 @@ msgstr "Shaders" msgid "Remove" msgstr "Retirer" -msgid "No shader selected" -msgstr "Pas de shader sélectionné" - msgid "Browse..." msgstr "Parcourir..." -msgid "Shader error" -msgstr "Erreur de shader" - -msgid "Could not load shaders." -msgstr "Impossible de charger les shaders." - -msgid "More information in details." -msgstr "Plus d'informations dans les détails." - msgid "Couldn't create OpenGL context." msgstr "Impossible de créer un contexte OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Impossible de passer au contexte OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "La version 3.0 ou supérieure d'OpenGL est requise. La version actuelle est %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "L'initialisation d'OpenGL a échoué. Erreur %1." - msgid "Error initializing OpenGL" msgstr "Erreur d'initialisation d'OpenGL" msgid "Falling back to software rendering.\n" msgstr "Se rabattre sur le rendu logiciel.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "L'allocation de mémoire pour le tampon de décompression a échoué.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Lors de la sélection d'images multimédia (CD-ROM, disquette, etc.), la boîte de dialogue d'ouverture démarrera dans le même répertoire que le fichier de configuration de 86Box. Ce paramètre ne fera probablement une différence que sur macOS.</p></body></html>" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 7a8aa53e4..6ca3ad8f5 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -306,18 +306,12 @@ msgstr "U redu" msgid "Cancel" msgstr "Otkaži" -msgid "Save these settings as &global defaults" -msgstr "Spremite ove postavke kao &globalne zadane postavke" - msgid "&Default" msgstr "Zadano" msgid "Language:" msgstr "Jezik:" -msgid "Icon set:" -msgstr "Paket ikona:" - msgid "Gain" msgstr "Pojačavanje" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Nije moguće inicijalizirati renderer." - msgid "Default" msgstr "Standard" @@ -906,9 +897,6 @@ msgstr "Ekran u stanju mirovanja" msgid "OpenGL Shaders" msgstr "OpenGL shaderi" -msgid "OpenGL options" -msgstr "OpenGL opcije" - msgid "You are loading an unsupported configuration" msgstr "Učitavate nepodržanu konfiguraciju" @@ -930,12 +918,6 @@ msgstr "Kaseta %i: %ls" msgid "Cartridge images" msgstr "Slike kasete" -msgid "Error initializing renderer" -msgstr "Nije moguće inicijalizirati renderer" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Nije moguće inicijalizirati OpenGL (3.0 jezgra) renderer. Molimte koristite drugi renderer." - msgid "Resume execution" msgstr "Nastavi" @@ -1293,21 +1275,6 @@ msgstr "Nulti upravljački program" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Nije moguće otvoriti \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Nije moguće sastaviti vertex shader u datoteci \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Nije moguće sastaviti framgent shader u datoteci \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Nije moguće povezati program shader u datoteci \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Opcije renderera OpenGL 3.0" - msgid "Render behavior" msgstr "Ponašanje rendera" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Odmah napravi svaki okvir, sinkronizirano s emuliranim zaslonom.</p><p><span style=" font-style:italic;">Ovo je preporučena opcija, ako korišćeni shader ne koristi vreme okvira za animirane efekte.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Sinkroniziraj s videom" @@ -1332,21 +1296,9 @@ msgstr "Shaderi" msgid "Remove" msgstr "Ukloni" -msgid "No shader selected" -msgstr "Bez odabranog shadera" - msgid "Browse..." msgstr "Pregledajte..." -msgid "Shader error" -msgstr "Greška shadera" - -msgid "Could not load shaders." -msgstr "Nije moguće učitati shadere." - -msgid "More information in details." -msgstr "Više informacija u detaljima." - msgid "Couldn't create OpenGL context." msgstr "Nije moguće stvoriti kontekst OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Nije se moguće prebaciti na kontekst OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Potrebna je OpenGL verzija 3.0 ili više. Trenutna verzija je %1. %2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Nije moguće inicijalizirati OpenGL. Greška %1." - msgid "Error initializing OpenGL" msgstr "Nije moguće inicijalizirati OpenGL" msgid "Falling back to software rendering.\n" msgstr "Vraća se na softverski renderer.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Nije moguće idodijeliti memoriju za međuspremnik za raspakiranje.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Prilikom odabira medijskih slika (CD-ROM, diskete itd.), otvoreni dijalog zopočet će u istom direktoriju kao i konfiguracijska datoteka 86Box-a. Razlika će vjerojatno biti primjetna samo na macOS-u.</p></body></html>" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index c777c6dd7..7d6a434f7 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Mégse" -msgid "Save these settings as &global defaults" -msgstr "Beállítások mentése &globális alapértékként" - msgid "&Default" msgstr "&Alapértelmezett" msgid "Language:" msgstr "Nyelv:" -msgid "Icon set:" -msgstr "Ikonkészlet:" - msgid "Gain" msgstr "Hangerő" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Nem sikerült inicializálni a videó megjelenítőt." - msgid "Default" msgstr "Alapértelmezett" @@ -906,9 +897,6 @@ msgstr "Képernyő alvó módban" msgid "OpenGL Shaders" msgstr "OpenGL Shaderek" -msgid "OpenGL options" -msgstr "OpenGL beállítások" - msgid "You are loading an unsupported configuration" msgstr "Egy nem támogatott konfigurációt tölt be" @@ -930,12 +918,6 @@ msgstr "ROM-kazetta %i: %ls" msgid "Cartridge images" msgstr "ROM-kazetta képek" -msgid "Error initializing renderer" -msgstr "Hiba történt a renderelő inicializálásakor" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Az OpenGL (3.0 Core) megjelenítő-motort nem sikerült inicializálni. Kérem használjon másik renderelőt." - msgid "Resume execution" msgstr "Folytassa a végrehajtást" @@ -1293,21 +1275,6 @@ msgstr "Null Driver" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Hiba a \"%1\" megnyitásakor: %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Hiba a vertex shader fordításában a \"%1\" fájlban" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Hiba a fragment shader fordításában a \"%1\" fájlban" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Hiba a shader program összekapcsolásában a \"%1\" fájlban" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0 renderelési beállítások" - msgid "Render behavior" msgstr "Renderelési viselkedés" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Az egyes képkockák azonnali, az emulált kijelzővel szinkronizált megjelenítése.</p><p><span style=" font-style:italic;"">Ez az ajánlott opció, ha a használt shaderek nem használják a frametime-ot az animált effektusokhoz.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Szinkronizálás a videóval" @@ -1332,21 +1296,9 @@ msgstr "Shaderek" msgid "Remove" msgstr "Távolítsa el a" -msgid "No shader selected" -msgstr "Nincs shader kiválasztva" - msgid "Browse..." msgstr "Böngésszen..." -msgid "Shader error" -msgstr "Shader hiba" - -msgid "Could not load shaders." -msgstr "Nem sikerült betölteni a shadereket." - -msgid "More information in details." -msgstr "További információ a részletekről." - msgid "Couldn't create OpenGL context." msgstr "Nem sikerült OpenGL-kontextust létrehozni." @@ -1356,18 +1308,12 @@ msgstr "Nem tudott OpenGL-kontextusra váltani." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Az OpenGL 3.0 vagy magasabb verziója szükséges. Az aktuális verzió %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Az OpenGL inicializálása sikertelen. Hiba %1." - msgid "Error initializing OpenGL" msgstr "Hiba az OpenGL inicializálásában" msgid "Falling back to software rendering.\n" msgstr "Visszatérés a szoftveres rendereléshez.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "A memória kiosztása a kicsomagolási pufferhez sikertelen.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>A médiaképek (CD-ROM, floppy stb.) kiválasztásakor a megnyitási párbeszédpanel ugyanabban a könyvtárban indul, mint a 86Box konfigurációs fájl. Ez a beállítás valószínűleg csak a macOS rendszerben jelent különbséget.</p></body></html>" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index adf5b0471..256337a0d 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Annulla" -msgid "Save these settings as &global defaults" -msgstr "Salva queste impostazioni come &predefinite globali" - msgid "&Default" msgstr "&Predefinito" msgid "Language:" msgstr "Lingua:" -msgid "Icon set:" -msgstr "Pacchetto di icone:" - msgid "Gain" msgstr "Guadagno" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Impossibile inizializzare il renderer video." - msgid "Default" msgstr "Predefinito" @@ -906,9 +897,6 @@ msgstr "Monitor in modalità riposo" msgid "OpenGL Shaders" msgstr "Shader OpenGL" -msgid "OpenGL options" -msgstr "Impostazioni OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Stai caricando una configurazione non supportata" @@ -930,12 +918,6 @@ msgstr "Cartuccia %i: %ls" msgid "Cartridge images" msgstr "Immagini cartuccia" -msgid "Error initializing renderer" -msgstr "Errore nell'inizializzazione del renderer" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Non è stato possibile inizializzare il renderer OpenGL (3.0 Core). Utilizzare un altro renderer." - msgid "Resume execution" msgstr "Riprendere l'esecuzione" @@ -1293,21 +1275,6 @@ msgstr "Driver nullo" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Errore nell'apertura di \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Errore nella compilazione di vertex shader nel file \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Errore nella compilazione dello shader dei frammenti nel file \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Errore nel collegamento del programma shader nel file \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Opzioni del renderer OpenGL 3.0" - msgid "Render behavior" msgstr "Comportamento di rendering" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Renderizza ogni fotogramma immediatamente, in sincronia con la visualizzazione emulata.</p><p><span style=" font-style:italic;">Questa è l'opzione consigliata se gli shader in uso non utilizzano il frametime per gli effetti animati.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Sincronizza col video" @@ -1332,21 +1296,9 @@ msgstr "Shader" msgid "Remove" msgstr "Rimuovere" -msgid "No shader selected" -msgstr "Nessuno shader selezionato" - msgid "Browse..." msgstr "Sfoglia..." -msgid "Shader error" -msgstr "Errore dello shader" - -msgid "Could not load shaders." -msgstr "Impossibile caricare gli shader." - -msgid "More information in details." -msgstr "Maggiori informazioni in dettaglio." - msgid "Couldn't create OpenGL context." msgstr "Impossibile creare un contesto OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Impossibile passare al contesto OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "È richiesta la versione OpenGL 3.0 o superiore. La versione attuale è %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Inizializzazione OpenGL non riuscita. Errore %1." - msgid "Error initializing OpenGL" msgstr "Errore nell'inizializzazione di OpenGL" msgid "Falling back to software rendering.\n" msgstr "Ricaduta sul rendering software." -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "L'allocazione della memoria per il buffer di disimballaggio non è riuscita." - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Quando si selezionano immagini multimediali (CD-ROM, floppy, ecc.) la finestra di dialogo di apertura si avvia nella stessa directory del file di configurazione di 86Box. Questa impostazione probabilmente farà la differenza solo su macOS.</p></body></html>" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index d51be2536..d38760f15 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "キャンセル" -msgid "Save these settings as &global defaults" -msgstr "これらの設定をグローバル既定値として保存(&G)" - msgid "&Default" msgstr "既定値(&D)" msgid "Language:" msgstr "言語:" -msgid "Icon set:" -msgstr "アイコンセット:" - msgid "Gain" msgstr "音量" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "ビデオレンダラーが初期化できません。" - msgid "Default" msgstr "既定値" @@ -906,9 +897,6 @@ msgstr "モニターのスリープモード" msgid "OpenGL Shaders" msgstr "OpenGLシェーダー" -msgid "OpenGL options" -msgstr "OpenGL設定" - msgid "You are loading an unsupported configuration" msgstr "サポートされていないコンフィグを読み込んでいます" @@ -930,12 +918,6 @@ msgstr "カートリッジ %i: %ls" msgid "Cartridge images" msgstr "カートリッジイメージ" -msgid "Error initializing renderer" -msgstr "レンダラーの初期化エラー" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "OpenGL (3.0 Core) レンダラーが初期化できません。別のレンダラーを使用してください。" - msgid "Resume execution" msgstr "実行を再開" @@ -1293,21 +1275,6 @@ msgstr "ヌル・ドライバー" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "\"%1\"を開く際にエラーが発生しました: %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "ファイル\"%1\"の頂点シェーダのコンパイルエラー。" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "ファイル\"%1\"のフラグメント・シェーダのコンパイル・エラー。" - -msgid "Error linking shader program in file \"%1\"" -msgstr "ファイル\"%1\"のシェーダープログラムのリンクエラー。" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0レンダラー設定" - msgid "Render behavior" msgstr "レンダリング動作" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSシンク" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>エミュレートされたディスプレイと同期して、各フレームを即座にレンダリングします。</p><p><span style=" font-style:italic;">これは、使用中のシェーダがアニメーション効果のためにフレームタイムを利用しない場合に推奨されるオプションです。</span></p></body></html>" - msgid "Synchronize with video" msgstr "ビデオと同期" @@ -1332,21 +1296,9 @@ msgstr "シェーダー" msgid "Remove" msgstr "削除" -msgid "No shader selected" -msgstr "シェーダーが選択されていない" - msgid "Browse..." msgstr "ブラウズ..." -msgid "Shader error" -msgstr "シェーダーエラー" - -msgid "Could not load shaders." -msgstr "シェーダーをロードできませんでした。" - -msgid "More information in details." -msgstr "詳細はこちら。" - msgid "Couldn't create OpenGL context." msgstr "OpenGLコンテキストを作成できませんでした。" @@ -1356,18 +1308,12 @@ msgstr "OpenGLコンテキストに切り替えられなかった。" msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGLのバージョン3.0以上が必要です。現在のバージョンは %1.%2 です。" -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL の初期化に失敗しました。エラー %1。" - msgid "Error initializing OpenGL" msgstr "OpenGLの初期化エラー" msgid "Falling back to software rendering.\n" msgstr "ソフトウェアレンダリングに逆戻り。" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "アンパックバッファのメモリ確保に失敗しました。" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>メディアイメージ(CD-ROM、フロッピーなど)を選択するとき、オープンダイアログは86Box設定ファイルと同じディレクトリで開始します。この設定は、おそらく macOS でのみ違いがあります。</p></body></html>" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 859183fc1..dbf77106b 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -306,18 +306,12 @@ msgstr "확인" msgid "Cancel" msgstr "취소" -msgid "Save these settings as &global defaults" -msgstr "이 설정들을 전역 기본값으로 저장하기(&G)" - msgid "&Default" msgstr "기본값(&D)" msgid "Language:" msgstr "언어:" -msgid "Icon set:" -msgstr "아이콘셋:" - msgid "Gain" msgstr "증가값" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "비디오 렌더러를 초기화할 수 없습니다." - msgid "Default" msgstr "기본값" @@ -906,9 +897,6 @@ msgstr "모니터 절전 모드" msgid "OpenGL Shaders" msgstr "OpenGL 쉐이더" -msgid "OpenGL options" -msgstr "OpenGL 설정" - msgid "You are loading an unsupported configuration" msgstr "지원하지 않는 설정입니다" @@ -930,12 +918,6 @@ msgstr "카트리지 %i: %ls" msgid "Cartridge images" msgstr "카트리지 이미지" -msgid "Error initializing renderer" -msgstr "렌더러 초기화 오류" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "OpenGL (3.0 Core) 렌더러를 초기화할 수 없습니다. 다른 렌더러를 사용하십시오." - msgid "Resume execution" msgstr "실행 재개" @@ -1293,21 +1275,6 @@ msgstr "Null 드라이버" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "열기 오류 \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "파일 \"%1\"에서 버텍스 셰이더를 컴파일하는 동안 오류가 발생했습니다." - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "파일에서 조각 셰이더 컴파일 중 오류 발생 \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "파일에서 셰이더 프로그램 연결 중 오류 \"%1\"\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0 렌더러 옵션" - msgid "Render behavior" msgstr "렌더링 동작" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>;에뮬레이트된 디스플레이와 동기화하여 각 프레임을 즉시 렌더링합니다.</p><p><span style=" font-style:italic;">사용 중인 셰이더가 애니메이션 효과에 프레임 시간을 활용하지 않는 경우 권장되는 옵션입니다.</span></p></body></html>" - msgid "Synchronize with video" msgstr "비디오와 동기" @@ -1332,21 +1296,9 @@ msgstr "셰이더" msgid "Remove" msgstr "제거" -msgid "No shader selected" -msgstr "셰이더를 선택하지 않음" - msgid "Browse..." msgstr "찾아보기..." -msgid "Shader error" -msgstr "셰이더 오류" - -msgid "Could not load shaders." -msgstr "셰이더를 로드할 수 없습니다." - -msgid "More information in details." -msgstr "자세한 내용은 자세히 알아보세요." - msgid "Couldn't create OpenGL context." msgstr "OpenGL 컨텍스트를 만들 수 없습니다." @@ -1356,18 +1308,12 @@ msgstr "OpenGL 컨텍스트로 전환할 수 없습니다." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL 버전 3.0 이상이 필요합니다. 현재 버전은 %1.%2입니다." -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL 초기화에 실패했습니다. 오류 %1입니다." - msgid "Error initializing OpenGL" msgstr "OpenGL 초기화 중 오류 발생" msgid "Falling back to software rendering.\n" msgstr "소프트웨어 렌더링으로 돌아가기.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "압축 해제 버퍼에 메모리를 할당하지 못했습니다.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>미디어 이미지(CD-ROM, 플로피 등)를 선택하면 86Box 구성 파일과 동일한 디렉터리에서 열기 대화 상자가 시작됩니다. 이 설정은 macOS에서만 차이가 있을 수 있습니다.</p></body></html>" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index cce4dfdc9..65e59331b 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Annuleren" -msgid "Save these settings as &global defaults" -msgstr "Sla deze instellingen op als &globale standaardinstellingen" - msgid "&Default" msgstr "&Standaard" msgid "Language:" msgstr "Taal:" -msgid "Icon set:" -msgstr "Pictogrammenset:" - msgid "Gain" msgstr "Versterking" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Kan de videorenderer niet initialiseren." - msgid "Default" msgstr "Standaard" @@ -906,9 +897,6 @@ msgstr "Monitor in slaapstand" msgid "OpenGL Shaders" msgstr "OpenGL Shaders" -msgid "OpenGL options" -msgstr "OpenGL-opties" - msgid "You are loading an unsupported configuration" msgstr "U laadt een configuratie die niet wordt ondersteund" @@ -930,12 +918,6 @@ msgstr "Cartridge %i: %ls" msgid "Cartridge images" msgstr "Cartridge-images" -msgid "Error initializing renderer" -msgstr "Fout bij het initialiseren van renderer" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "OpenGL (3.0 Core) renderer kon niet worden geïnitialiseerd. Gebruik een andere renderer." - msgid "Resume execution" msgstr "Hervat executie" @@ -1293,21 +1275,6 @@ msgstr "Null Driver" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Fout bij het openen van \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Fout bij het compileren van vertex shader in bestand \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Fout bij het compileren van fragment shader in bestand \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Fout bij koppelen shaderprogramma in bestand \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0 renderer opties" - msgid "Render behavior" msgstr "Rendergedrag" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Onmiddellijk elk frame synchroon met het geëmuleerde beeldscherm renderen.</p><p><span style=" font-style:italic;">Dit is de aanbevolen optie als de gebruikte shaders geen frametime gebruiken voor geanimeerde effecten.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Synchroniseren met video" @@ -1332,21 +1296,9 @@ msgstr "Shaders" msgid "Remove" msgstr "Verwijderen" -msgid "No shader selected" -msgstr "Geen shader geselecteerd" - msgid "Browse..." msgstr "Bladeren..." -msgid "Shader error" -msgstr "Shader-fout" - -msgid "Could not load shaders." -msgstr "Kan shaders niet laden." - -msgid "More information in details." -msgstr "Meer informatie in details." - msgid "Couldn't create OpenGL context." msgstr "Kan OpenGL context niet maken." @@ -1356,18 +1308,12 @@ msgstr "Kan niet overschakelen naar OpenGL context." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL versie 3.0 of hoger is vereist. De huidige versie is %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL initialisatie mislukt. Fout %1." - msgid "Error initializing OpenGL" msgstr "Fout bij het initialiseren van OpenGL" msgid "Falling back to software rendering.\n" msgstr "Terugvallen op software rendering.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Toewijzen van geheugen voor uitpakbuffer mislukt.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Bij het selecteren van media-images (CD-ROM, floppy, etc.) zal de \"open dialoog\" starten in dezelfde map als het 86Box configuratiebestand. Deze instelling is doet er waarschijnlijk alleen toe op macOS.</p></body></html>" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 26cc4bae6..bed21af24 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Anuluj" -msgid "Save these settings as &global defaults" -msgstr "Zapisz ustawienia jako &globalne ustawienia domyślne" - msgid "&Default" msgstr "&Domyślny" msgid "Language:" msgstr "Język:" -msgid "Icon set:" -msgstr "Zestaw ikon:" - msgid "Gain" msgstr "Wzmacniacz" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Nie można zainicjować renderera wideo." - msgid "Default" msgstr "Domyślny" @@ -906,9 +897,6 @@ msgstr "Monitor w trybie czuwania" msgid "OpenGL Shaders" msgstr "Shadery OpenGL" -msgid "OpenGL options" -msgstr "Opcje OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Ładujesz nieobsługiwaną konfigurację" @@ -930,12 +918,6 @@ msgstr "Kartrydż %i: %ls" msgid "Cartridge images" msgstr "Obrazy kartrydżu" -msgid "Error initializing renderer" -msgstr "Błąd inicjalizacji renderera" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Nie można zainicjować renderera OpenGL (3.0 Core). Użyj innego." - msgid "Resume execution" msgstr "Wznów wykonywanie" @@ -1293,21 +1275,6 @@ msgstr "Null Driver" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Błąd otwarcia \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Błąd kompilacji shadera wierzchołków w pliku \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Błąd kompilacji shadera fragmentów w pliku \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Błąd łączenia programu shader w pliku \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Opcje renderowania OpenGL 3.0" - msgid "Render behavior" msgstr "Zachowanie renderowania" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Renderuj każdą klatkę natychmiast, w synchronizacji z emulowanym wyświetlaczem.</p><p><span style=" font-style:italic;">Jest to zalecana opcja, jeśli używane shadery nie wykorzystują frametime do animowanych efektów.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Zsynchronizuj z wideo" @@ -1332,21 +1296,9 @@ msgstr "Shadery" msgid "Remove" msgstr "Usuń" -msgid "No shader selected" -msgstr "Nie wybrano shadera" - msgid "Browse..." msgstr "Przeglądaj..." -msgid "Shader error" -msgstr "Błąd shadera" - -msgid "Could not load shaders." -msgstr "Nie można załadować shaderów." - -msgid "More information in details." -msgstr "Więcej informacji w szczegółach." - msgid "Couldn't create OpenGL context." msgstr "Nie można utworzyć kontekstu OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Nie można przełączyć na kontekst OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Wymagana jest wersja OpenGL 3.0 lub wyższa. Aktualna wersja to %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Inicjalizacja OpenGL nie powiodła się. Błąd %1." - msgid "Error initializing OpenGL" msgstr "Błąd inicjalizacji OpenGL" msgid "Falling back to software rendering.\n" msgstr "Powrót do renderowania oprogramowania.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Przydzielenie pamięci dla bufora rozpakowywania nie powiodło się.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Podczas wybierania obrazów nośników (CD-ROM, dyskietka itp.) otwarte okno dialogowe rozpocznie się w tym samym katalogu, co plik konfiguracyjny 86Box. To ustawienie prawdopodobnie będzie miało znaczenie tylko na macOS.</p></body></html>" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index b453d0f97..df606a635 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Cancelar" -msgid "Save these settings as &global defaults" -msgstr "Salvar estas configurações como &padrões globais" - msgid "&Default" msgstr "&Padrão" msgid "Language:" msgstr "Idioma:" -msgid "Icon set:" -msgstr "Conjunto de ícones:" - msgid "Gain" msgstr "Ganho" @@ -753,9 +747,6 @@ msgstr "SE" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Não foi possível inicializar o renderizador de vídeo." - msgid "Default" msgstr "Padrão" @@ -906,9 +897,6 @@ msgstr "Monitor em modo de suspensão" msgid "OpenGL Shaders" msgstr "Shaders OpenGL" -msgid "OpenGL options" -msgstr "Opções do OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Você está carregando uma configuração não suportada" @@ -930,12 +918,6 @@ msgstr "Cartucho %i: %ls" msgid "Cartridge images" msgstr "Imagens de cartucho" -msgid "Error initializing renderer" -msgstr "Erro ao inicializar o renderizador" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "O renderizador OpenGL (Núcleo 3.0) não pôde ser inicializado. Use outro renderizador." - msgid "Resume execution" msgstr "Continuar a execução" @@ -1293,21 +1275,6 @@ msgstr "Driver nulo" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Erro ao abrir \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Erro ao compilar o sombreador de vértice no arquivo \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Erro ao compilar o fragment shader no arquivo \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Erro ao vincular o programa de shader no arquivo \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Opções do renderizador OpenGL 3.0" - msgid "Render behavior" msgstr "Comportamento de renderização" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Renderize cada quadro imediatamente, em sincronia com a tela emulada.</p><p><span style=" font-style:italic;">Essa é a opção recomendada se os shaders em uso não utilizarem o frametime para efeitos animados.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Sincronizar com o vídeo" @@ -1332,21 +1296,9 @@ msgstr "Shaders" msgid "Remove" msgstr "Remover" -msgid "No shader selected" -msgstr "Nenhum shader selecionado" - msgid "Browse..." msgstr "Procurar..." -msgid "Shader error" -msgstr "Erro do sombreador" - -msgid "Could not load shaders." -msgstr "Não foi possível carregar os shaders." - -msgid "More information in details." -msgstr "Mais informações em detalhes." - msgid "Couldn't create OpenGL context." msgstr "Não foi possível criar o contexto OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Não foi possível alternar para o contexto OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Falha na inicialização do OpenGL. Erro %1." - msgid "Error initializing OpenGL" msgstr "Erro ao inicializar o OpenGL" msgid "Falling back to software rendering.\n" msgstr "Voltando à renderização de software.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Falha na alocação de memória para o buffer de descompactação.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Ao selecionar imagens de mídia (CD-ROM, disquete, etc.), a caixa de diálogo de abertura será iniciada no mesmo diretório do arquivo de configuração do 86Box. Essa configuração provavelmente só fará diferença no macOS.</p></body></html>" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index d732532ed..b3458bcdf 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Cancelar" -msgid "Save these settings as &global defaults" -msgstr "Guardar estas definições como padrões &globais" - msgid "&Default" msgstr "&Padrão" msgid "Language:" msgstr "Idioma:" -msgid "Icon set:" -msgstr "Pacote de ícones:" - msgid "Gain" msgstr "Ganho" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Não foi possível inicializar o renderizador vídeo." - msgid "Default" msgstr "Padrão" @@ -906,9 +897,6 @@ msgstr "Ecrã em modo de sono" msgid "OpenGL Shaders" msgstr "Shaders OpenGL" -msgid "OpenGL options" -msgstr "Opções de OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Está a carregar uma configuração sem suporte!" @@ -930,12 +918,6 @@ msgstr "Cartucho %i: %ls" msgid "Cartridge images" msgstr "Imagens de cartucho" -msgid "Error initializing renderer" -msgstr "Erro na inicialização do renderizador" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Não foi possível inicializar o renderizador OpenGL (3.0 Core). Utilize outro renderizador." - msgid "Resume execution" msgstr "Retomar execução" @@ -1293,21 +1275,6 @@ msgstr "Condutor nulo" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Erro ao abrir \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Erro ao compilar o sombreador de vértice no ficheiro \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Erro ao compilar o shader de fragmento no ficheiro \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Erro ao ligar o programa de shader no ficheiro \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Opções do renderizador OpenGL 3.0" - msgid "Render behavior" msgstr "Comportamento de renderização" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Renderiza cada frame imediatamente, em sincronia com o ecrã emulado.</p><p><span style=" font-style:italic;">Esta é a opção recomendada se os shaders em uso não utilizam frametime para efeitos animados.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Sincronizar com vídeo" @@ -1332,21 +1296,9 @@ msgstr "Shaders" msgid "Remove" msgstr "Remover" -msgid "No shader selected" -msgstr "Nenhum sombreador selecionado" - msgid "Browse..." msgstr "Navegar..." -msgid "Shader error" -msgstr "Erro de shader" - -msgid "Could not load shaders." -msgstr "Não foi possível carregar os shaders." - -msgid "More information in details." -msgstr "Mais informações em pormenor." - msgid "Couldn't create OpenGL context." msgstr "Não foi possível criar o contexto OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Não foi possível mudar para o contexto OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Falha na inicialização do OpenGL. Erro %1." - msgid "Error initializing OpenGL" msgstr "Erro ao inicializar o OpenGL" msgid "Falling back to software rendering.\n" msgstr "Recuando para a renderização de software." -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Falha na atribuição de memória para a memória intermédia de descompactação.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Ao selecionar imagens multimédia (CD-ROM, disquete, etc.) a caixa de diálogo de abertura irá começar no mesmo diretório que o ficheiro de configuração da 86Box. Esta configuração provavelmente só fará diferença no macOS.</p></body></html>" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index e68e6bb10..6104d064f 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Отмена" -msgid "Save these settings as &global defaults" -msgstr "Сохранить эти параметры как &глобальные по умолчанию" - msgid "&Default" msgstr "&По умолчанию" msgid "Language:" msgstr "Язык:" -msgid "Icon set:" -msgstr "Набор иконок:" - msgid "Gain" msgstr "Усиление" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "КБ" -msgid "Could not initialize the video renderer." -msgstr "Не удалось инициализировать рендерер видео." - msgid "Default" msgstr "По умолчанию" @@ -906,9 +897,6 @@ msgstr "Монитор в спящем режиме" msgid "OpenGL Shaders" msgstr "Шейдеры OpenGL" -msgid "OpenGL options" -msgstr "Параметры OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Вы загружаете неподдерживаемую конфигурацию" @@ -930,12 +918,6 @@ msgstr "Картридж %i: %ls" msgid "Cartridge images" msgstr "Образы картриджей" -msgid "Error initializing renderer" -msgstr "Ошибка инициализации рендерера" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Невозможно инициализировать рендерер OpenGL (3.0). Пожалуйста, используйте другой рендерер." - msgid "Resume execution" msgstr "Возобновить выполнение" @@ -1293,21 +1275,6 @@ msgstr "Нулевой драйвер" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Ошибка при открытии \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Ошибка компиляции вершинного шейдера в файле \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Ошибка компиляции фрагментного шейдера в файле \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Ошибка компоновки программы шейдера в файле \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Параметры рендеринга OpenGL 3.0" - msgid "Render behavior" msgstr "Режим рендеринга" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "Вертикальная синхронизация" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Рендерить каждый кадр немедленно, синхронно с эмулируемым дисплеем.</p><p><span style="font-style:italic;">Это рекомендуемый вариант, если используемые шейдеры не используют время кадров для анимированных эффектов.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Синхронизация с видео" @@ -1332,21 +1296,9 @@ msgstr "Шейдеры" msgid "Remove" msgstr "Удалить" -msgid "No shader selected" -msgstr "Шейдер не выбран" - msgid "Browse..." msgstr "Обзор..." -msgid "Shader error" -msgstr "Ошибка шейдера" - -msgid "Could not load shaders." -msgstr "Не удалось загрузить шейдеры." - -msgid "More information in details." -msgstr "Более подробная информация в деталях." - msgid "Couldn't create OpenGL context." msgstr "Не удалось создать контекст OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Не удалось переключиться на контекст Ope msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Требуется OpenGL версии 3.0 или выше. Текущая версия %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Не удалось выполнить инициализацию OpenGL. Ошибка %1." - msgid "Error initializing OpenGL" msgstr "Ошибка инициализации OpenGL" msgid "Falling back to software rendering.\n" msgstr "Переключение на программный рендеринг.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Выделение памяти для буфера распаковки не удалось.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>При выборе образов носителей (CD-ROM, дискет и т. д.) диалог открытия будет запускаться в том же каталоге, что и файл конфигурации 86Box. Эта настройка, скорее всего, будет иметь значение только на macOS.</p></body></html>" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index c091780c2..9e6532267 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Storno" -msgid "Save these settings as &global defaults" -msgstr "Uložiť toto nastavenie ako &globálny východiskový stav" - msgid "&Default" msgstr "&Východiskové" msgid "Language:" msgstr "Jazyk:" -msgid "Icon set:" -msgstr "Súprava ikon:" - msgid "Gain" msgstr "Zosilnenie" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Nastala chyba pri inicializácii video renderera." - msgid "Default" msgstr "Východiskové" @@ -906,9 +897,6 @@ msgstr "Monitor je v režime spánku" msgid "OpenGL Shaders" msgstr "Shadery OpenGL" -msgid "OpenGL options" -msgstr "Možnosti OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Pokúšate sa spustiť nepodporovanú konfiguráciu" @@ -930,12 +918,6 @@ msgstr "Cartridge %i: %ls" msgid "Cartridge images" msgstr "Obrazy cartridge" -msgid "Error initializing renderer" -msgstr "Chyba pri inicializácii vykresľovača" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Vykresľovač OpenGL (3.0 Core) sa nepodarilo inicializovať. Použite iný renderer." - msgid "Resume execution" msgstr "Obnoviť" @@ -1293,20 +1275,6 @@ msgstr "Nulový ovládač" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Chyba pri otváraní \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Chyba kompilácie vertex shadera v súbore \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Chyba kompilácie fragment shadera v súbore \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Chyba pri prepojení shader programu v súbore \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Možnosti vykresľovania OpenGL 3.0" msgid "Render behavior" msgstr "Správanie pri vykresľovaní" @@ -1320,9 +1288,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Okamžite vykresliť každú snímku v synchronizácii s emulovaným displejom.</p><p><span style=" font-style:italic;">Toto je odporúčaná možnosť, ak používané shadery nevyužívajú frametime pre animované efekty.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Synchronizovať s obrazom" @@ -1332,21 +1297,9 @@ msgstr "Shadery" msgid "Remove" msgstr "Odstránenie stránky" -msgid "No shader selected" -msgstr "Nie je vybraný žiadny tieňovač" - msgid "Browse..." msgstr "Prehľadávať..." -msgid "Shader error" -msgstr "Chyba shadera" - -msgid "Could not load shaders." -msgstr "Nepodarilo sa načítať shadery." - -msgid "More information in details." -msgstr "Viac informácií v detailoch." - msgid "Couldn't create OpenGL context." msgstr "Nepodarilo sa vytvoriť kontext OpenGL." @@ -1356,18 +1309,12 @@ msgstr "Nepodarilo sa prepnúť na kontext OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Vyžaduje sa verzia OpenGL 3.0 alebo vyššia. Aktuálna verzia je %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Inicializácia OpenGL zlyhala. Chyba %1." - msgid "Error initializing OpenGL" msgstr "Chyba pri inicializácii OpenGL" msgid "Falling back to software rendering.\n" msgstr "Návrat k softvérovému vykresľovaniu.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Alokácia pamäte pre rozbaľovaciu vyrovnávaciu pamäť zlyhala.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Pri výbere multimediálnych obrazov (CD-ROM, disketa atď.) sa dialógové okno otvorenia spustí v rovnakom adresári ako konfiguračný súbor 86Box. Toto nastavenie bude mať pravdepodobne význam len v systéme MacOS.</p></body></html>" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 15041a4aa..efb62153a 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -306,18 +306,12 @@ msgstr "V redu" msgid "Cancel" msgstr "Prekliči" -msgid "Save these settings as &global defaults" -msgstr "Shrani te nastavitve kot globalne privzete" - msgid "&Default" msgstr "Privzeto" msgid "Language:" msgstr "Jezik:" -msgid "Icon set:" -msgstr "Komplet ikon:" - msgid "Gain" msgstr "Ojačanje" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Ne morem inicializirati sistema za upodabljanje." - msgid "Default" msgstr "Privzeto" @@ -906,9 +897,6 @@ msgstr "Zaslon v načinu spanja" msgid "OpenGL Shaders" msgstr "Senčilniki OpenGL" -msgid "OpenGL options" -msgstr "Možnosti OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Nalagate nepodprto konfiguracijo" @@ -930,12 +918,6 @@ msgstr "Spominski vložek %i: %ls" msgid "Cartridge images" msgstr "Slike spominskega vložka" -msgid "Error initializing renderer" -msgstr "Napaka pri zagonu sistema za upodabljanje" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Sistema za upodabljanje OpenGL (3.0 Core) ni bilo mogoče zagnati. Uporabite drug sistem za upodabljanje." - msgid "Resume execution" msgstr "Nadaljuj izvajanje" @@ -1293,21 +1275,6 @@ msgstr "Ničelni gonilnik" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Napaka pri odpiranju \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Napaka pri sestavljanju senčilnika vrhov v datoteki \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Napaka pri sestavljanju shaderja fragmentov v datoteki \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Napaka pri povezovanju programa shader v datoteki \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Možnosti sistema za upodabljanje OpenGL 3.0" - msgid "Render behavior" msgstr "Obnašanje pri upodabljanju" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Vsako sličico prikažite takoj, sinhronizirano z emuliranim zaslonom.</p><p><span style=" font-style:italic;">To je priporočljiva možnost, če uporabljeni senčilniki ne uporabljajo časa okvirja za animirane učinke.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Sinhroniziraj z videom" @@ -1332,21 +1296,9 @@ msgstr "Senčilniki" msgid "Remove" msgstr "Odstrani" -msgid "No shader selected" -msgstr "Ni izbran noben senčnik" - msgid "Browse..." msgstr "Brskaj..." -msgid "Shader error" -msgstr "Napaka senčilnika" - -msgid "Could not load shaders." -msgstr "Ni bilo mogoče naložiti senčilnikov." - -msgid "More information in details." -msgstr "Več informacij v podrobnostih." - msgid "Couldn't create OpenGL context." msgstr "Ni bilo mogoče ustvariti konteksta OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Ni bilo mogoče preklopiti na kontekst OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Zahteva se različica OpenGL 3.0 ali novejša. Trenutna različica je %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Inicializacija OpenGL ni uspela. Napaka %1." - msgid "Error initializing OpenGL" msgstr "Napaka pri inicializaciji OpenGL" msgid "Falling back to software rendering.\n" msgstr "Vrnitev k programskemu upodabljanju.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Dodelitev pomnilnika za razpakirni predpomnilnik ni uspela.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Pri izbiri medijskih slik (CD-ROM, disketa itd.) se bo odprto pogovorno okno začelo v istem imeniku kot konfiguracijska datoteka 86Box. Ta nastavitev bo verjetno imela pomen le v operacijskem sistemu MacOS.</p></body></html>" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index c16cc12e4..e3d692537 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -306,18 +306,12 @@ msgstr "Tamam" msgid "Cancel" msgstr "İptal" -msgid "Save these settings as &global defaults" -msgstr "Ayarları &varsayılan olarak kaydet" - msgid "&Default" msgstr "&Varsayılan" msgid "Language:" msgstr "Dil:" -msgid "Icon set:" -msgstr "Simge seti:" - msgid "Gain" msgstr "Artış" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Video işleyici başlatılamadı." - msgid "Default" msgstr "Varsayılan" @@ -906,9 +897,6 @@ msgstr "Monitör uyku modunda" msgid "OpenGL Shaders" msgstr "OpenGL gölgelendiricileri" -msgid "OpenGL options" -msgstr "OpenGL ayarları" - msgid "You are loading an unsupported configuration" msgstr "Desteklenmeyen bir konfigürasyon kullanıyorsunuz" @@ -930,12 +918,6 @@ msgstr "Kartuş %i: %ls" msgid "Cartridge images" msgstr "Kartuş imajları" -msgid "Error initializing renderer" -msgstr "İşleyici başlatılırken hata oluştu" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "OpenGL (3.0 Core) işleyici başlatılamadı. Başka bir görüntüleyici kullanın." - msgid "Resume execution" msgstr "Çalıştırmaya devam et" @@ -1293,21 +1275,6 @@ msgstr "Null sürücü" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "\"%1\": %2 açılırken hata oluştu" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "\"%1\" dosyasında tepe gölgelendirici derlenirken hata oluştu" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "\"%1\" dosyasında parça gölgelendirici derlenirken hata oluştu" - -msgid "Error linking shader program in file \"%1\"" -msgstr "\"%1\" dosyasında gölgelendirici programı bağlanırken hata oluştu" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0 işleyici seçenekleri" - msgid "Render behavior" msgstr "İşleyiş davranışı" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Emüle edilen ekranla senkronize olarak her kareyi hemen işleyin.</p><p><span style=" font-style:italic;">Kullanılan gölgelendiriciler animasyonlu efektler için kare zamanını kullanmıyorsa bu önerilen seçenektir.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Video ile senkronize et" @@ -1332,21 +1296,9 @@ msgstr "Gölgelendiriciler" msgid "Remove" msgstr "Kaldır" -msgid "No shader selected" -msgstr "Gölgelendirici seçili değil" - msgid "Browse..." msgstr "Göz at..." -msgid "Shader error" -msgstr "Gölgelendirici hatası" - -msgid "Could not load shaders." -msgstr "Gölgelendiriciler yüklenemedi." - -msgid "More information in details." -msgstr "Daha fazla bilgi detaylardadır." - msgid "Couldn't create OpenGL context." msgstr "OpenGL bağlamı oluşturulamadı." @@ -1356,18 +1308,12 @@ msgstr "OpenGL bağlamına geçilemedi." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL sürüm 3.0 veya üstü gereklidir. Geçerli sürüm %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL başlatılamadı. Hata %1." - msgid "Error initializing OpenGL" msgstr "OpenGL başlatılırken hata oluştu" msgid "Falling back to software rendering.\n" msgstr "Yazılım işleyicisine geri dönülüyor.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Paket açma arabelleği için bellek ayırma başarısız oldu.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Medya görüntüsü (CD-ROM, disket, vb.) seçme diyaloğu 86Box yapılandırma dosyasıyla aynı dizinde başlayacaktır. Bu ayar muhtemelen sadece macOS üzerinde bir fark meydana getirecektir.</p></body></html>" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index bde9a4f51..687186f56 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -306,18 +306,12 @@ msgstr "OK" msgid "Cancel" msgstr "Відміна" -msgid "Save these settings as &global defaults" -msgstr "Зберегти ці параметри як &глобальні за замовчуванням" - msgid "&Default" msgstr "&За замовчуванням" msgid "Language:" msgstr "Мова:" -msgid "Icon set:" -msgstr "Набір іконок:" - msgid "Gain" msgstr "Посилення" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "КБ" -msgid "Could not initialize the video renderer." -msgstr "Не вдалося ініціалізувати рендер відео." - msgid "Default" msgstr "За замовчуванням" @@ -906,9 +897,6 @@ msgstr "Монітор у сплячому режимі" msgid "OpenGL Shaders" msgstr "Шейдери OpenGL" -msgid "OpenGL options" -msgstr "Параметри OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Ви завантажуєте непідтримувану конфігурацію" @@ -930,12 +918,6 @@ msgstr "Картридж %i: %ls" msgid "Cartridge images" msgstr "Образи картриджів" -msgid "Error initializing renderer" -msgstr "Помилка ініціалізації рендерера" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Неможливо ініціалізувати рендерер OpenGL (3.0). Будь ласка, використовуйте інший рендерер." - msgid "Resume execution" msgstr "Відновити виконання" @@ -1293,21 +1275,6 @@ msgstr "Нульовий драйвер" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Помилка відкриття \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Помилка компіляції вершинного шейдера у файлі \"%1\"." - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Помилка компіляції фрагментного шейдера у файлі \"%1\"." - -msgid "Error linking shader program in file \"%1\"" -msgstr "Помилка зв'язування шейдерної програми у файлі \"%1\"." - -msgid "OpenGL 3.0 renderer options" -msgstr "Параметри рендерингу OpenGL 3.0" - msgid "Render behavior" msgstr "Поведінка рендерингу" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Відображати кожен кадр миттєво, синхронно з емульованим дисплеєм.</p><p><span style=" font-style:italic;">Це рекомендований варіант, якщо використовувані шейдери не використовують час кадру для анімованих ефектів.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Синхронізація з відео" @@ -1332,21 +1296,9 @@ msgstr "Шейдери" msgid "Remove" msgstr "Видалити" -msgid "No shader selected" -msgstr "Не вибрано шейдер" - msgid "Browse..." msgstr "Переглянути..." -msgid "Shader error" -msgstr "Помилка шейдеру" - -msgid "Could not load shaders." -msgstr "Не вдалося завантажити шейдери." - -msgid "More information in details." -msgstr "Більше інформації в деталях." - msgid "Couldn't create OpenGL context." msgstr "Не вдалося створити контекст OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Не вдалося переключитися на контекст Ope msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "Потрібна версія OpenGL 3.0 або новіша. Поточна версія %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Не вдалося ініціалізувати OpenGL. Помилка %1." - msgid "Error initializing OpenGL" msgstr "Помилка ініціалізації OpenGL" msgid "Falling back to software rendering.\n" msgstr "Повернення до програмного рендерингу.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Не вдалося виділити пам'ять для буфера розпакування.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>При виборі медіа-образів (CD-ROM, дискета і т.д.) діалогове вікно буде відкриватися в тому ж каталозі, що і файл конфігурації 86Box. Цей параметр, швидше за все, матиме значення лише на macOS.</p></body></html>" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index fa9384d8f..55a70991c 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -306,18 +306,12 @@ msgstr "Đồng ý" msgid "Cancel" msgstr "Thôi" -msgid "Save these settings as &global defaults" -msgstr "Lưu cài đặt làm mặc định chung" - msgid "&Default" msgstr "&Mặc định" msgid "Language:" msgstr "Ngôn ngữ:" -msgid "Icon set:" -msgstr "Bộ biểu tượng:" - msgid "Gain" msgstr "Tăng" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "Không thể khởi tạo trình kết xuất (renderer) video ." - msgid "Default" msgstr "Mặc định" @@ -906,9 +897,6 @@ msgstr "Màn hình chế độ chờ/ngủ" msgid "OpenGL Shaders" msgstr "Shader OpenGL" -msgid "OpenGL options" -msgstr "Tùy chọn OpenGL" - msgid "You are loading an unsupported configuration" msgstr "Bạn đang load tinh chỉnh không được hỗ trợ." @@ -930,12 +918,6 @@ msgstr "Băng cartridge %i: %ls" msgid "Cartridge images" msgstr "Ảnh đĩa băng cartridge" -msgid "Error initializing renderer" -msgstr "Lỗi khởi tạo renderer (trình kết xuất)" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "Không khởi tạo được renderer OpenGL (3.0 Core). Hãy dùng renderer khác." - msgid "Resume execution" msgstr "Tiếp tục chạy thực thi" @@ -1293,21 +1275,6 @@ msgstr "Trình điều khiển NULL" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i ( %ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "Mở lỗi \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Lỗi biên dịch shader đỉnh trong tệp \"%1\"" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Lỗi biên dịch shader fragment trong tệp \"%1\"" - -msgid "Error linking shader program in file \"%1\"" -msgstr "Lỗi liên kết chương trình shader trong tệp \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "Tùy chọn kết xuất OpenGL 3.0" - msgid "Render behavior" msgstr "Hành vi kết xuất" @@ -1320,9 +1287,6 @@ msgstr " khung hình / giây" msgid "VSync" msgstr "Vsync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>Kết xuất mỗi khung ngay lập tức, đồng bộ với màn hình mô phỏng.</p><p><span style=" font-style:italic;">Đây là tùy chọn được đề xuất nếu các shader đang sử dụng không tối ưu frametime cho các hiệu ứng động.</span></p></body></html>" - msgid "Synchronize with video" msgstr "Đồng bộ với video" @@ -1332,21 +1296,9 @@ msgstr "Shaders" msgid "Remove" msgstr "Loại bỏ" -msgid "No shader selected" -msgstr "Không có shader được chọn" - msgid "Browse..." msgstr "Duyệt..." -msgid "Shader error" -msgstr "Lỗi shader" - -msgid "Could not load shaders." -msgstr "Không thể tải shader." - -msgid "More information in details." -msgstr "Thêm thông tin chi tiết." - msgid "Couldn't create OpenGL context." msgstr "Không thể tạo bối cảnh OpenGL." @@ -1356,18 +1308,12 @@ msgstr "Không thể chuyển sang bối cảnh OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL phiên bản 3.0 trở lên là bắt buộc. Phiên bản hiện tại là %1. %2" -msgid "OpenGL initialization failed. Error %1." -msgstr "Khởi tạo OpenGL không thành công. Lỗi %1." - msgid "Error initializing OpenGL" msgstr "Lỗi khởi tạo OpenGL" msgid "Falling back to software rendering.\n" msgstr "Quay trở lại kết xuất phần mềm.\n" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Phân bổ bộ nhớ cho bộ đệm giải nén không thành công.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Khi chọn hình ảnh phương tiện (CD-ROM, ổ mềm, v.v.), hộp thoại mở sẽ bắt đầu trong cùng thư mục với tệp cấu hình 86box. Cài đặt này có thể sẽ chỉ tạo ra sự khác biệt trên macOS.</p></body></html>" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 4cccc071a..cd720c0ee 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -306,18 +306,12 @@ msgstr "确定" msgid "Cancel" msgstr "取消" -msgid "Save these settings as &global defaults" -msgstr "将以上设置存储为全局默认值(&G)" - msgid "&Default" msgstr "默认(&D)" msgid "Language:" msgstr "语言:" -msgid "Icon set:" -msgstr "图标集:" - msgid "Gain" msgstr "增益" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "无法初始化视频渲染器。" - msgid "Default" msgstr "默认" @@ -906,9 +897,6 @@ msgstr "显示器处在睡眠状态" msgid "OpenGL Shaders" msgstr "OpenGL 着色器" -msgid "OpenGL options" -msgstr "OpenGL 选项" - msgid "You are loading an unsupported configuration" msgstr "正在载入一个不受支持的配置" @@ -930,12 +918,6 @@ msgstr "卡带 %i: %ls" msgid "Cartridge images" msgstr "卡带映像" -msgid "Error initializing renderer" -msgstr "初始化渲染器时出错" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "无法初始化 OpenGL (3.0 Core) 渲染器。请使用其他渲染器。" - msgid "Resume execution" msgstr "恢复执行" @@ -1293,21 +1275,6 @@ msgstr "空驱动程序" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "打开 \"%1\": %2 时出错" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "文件 \"%1\" 中的顶点着色器编译出错" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "文件 \"%1\" 中的片段着色器编译出错" - -msgid "Error linking shader program in file \"%1\"" -msgstr "文件 \"%1\" 中的着色器程序链接出错" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0 渲染器选项" - msgid "Render behavior" msgstr "渲染行为" @@ -1320,9 +1287,6 @@ msgstr " fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>与模拟显示同步,即时渲染每一帧。</p><p><span style=" font-style:italic;">如果使用的着色器不使用帧时间来产生动画效果,则建议使用此选项。</span></p></body></html>" - msgid "Synchronize with video" msgstr "与视频同步" @@ -1332,21 +1296,9 @@ msgstr "着色器" msgid "Remove" msgstr "移除" -msgid "No shader selected" -msgstr "未选择着色器" - msgid "Browse..." msgstr "浏览..." -msgid "Shader error" -msgstr "着色器错误" - -msgid "Could not load shaders." -msgstr "无法加载着色器。" - -msgid "More information in details." -msgstr "更多详细信息。" - msgid "Couldn't create OpenGL context." msgstr "无法创建 OpenGL 上下文。" @@ -1356,18 +1308,12 @@ msgstr "无法切换到 OpenGL 上下文。" msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "需要 OpenGL 3.0 或更高版本。当前版本为 %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL 初始化失败。错误 %1." - msgid "Error initializing OpenGL" msgstr "初始化 OpenGL 时出错" msgid "Falling back to software rendering.\n" msgstr "回到软件渲染。" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "为解包缓冲区分配内存失败.\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>选择媒体图像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。</p></body></html>;" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 92c6502ea..a11ef8d44 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -306,18 +306,12 @@ msgstr "確定" msgid "Cancel" msgstr "取消" -msgid "Save these settings as &global defaults" -msgstr "將以上設定存儲為全局預設值(&G)" - msgid "&Default" msgstr "預設(&D)" msgid "Language:" msgstr "語言:" -msgid "Icon set:" -msgstr "圖示集:" - msgid "Gain" msgstr "增益" @@ -753,9 +747,6 @@ msgstr "S" msgid "KB" msgstr "KB" -msgid "Could not initialize the video renderer." -msgstr "無法初始化視訊渲染器。" - msgid "Default" msgstr "預設" @@ -906,9 +897,6 @@ msgstr "顯示器處在睡眠狀態" msgid "OpenGL Shaders" msgstr "OpenGL 著色器" -msgid "OpenGL options" -msgstr "OpenGL 選項" - msgid "You are loading an unsupported configuration" msgstr "正在載入一個不受支援的設定" @@ -930,12 +918,6 @@ msgstr "卡帶 %i: %ls" msgid "Cartridge images" msgstr "卡帶映像" -msgid "Error initializing renderer" -msgstr "初始化渲染器時出錯" - -msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." -msgstr "無法初始化 OpenGL (3.0 Core) 渲染器。請使用其他渲染器。" - msgid "Resume execution" msgstr "恢復執行" @@ -1293,21 +1275,6 @@ msgstr "空驅動程式" msgid "NIC %02i (%ls) %ls" msgstr "網路卡 %02i (%ls) %ls" -msgid "Error opening \"%1\": %2" -msgstr "錯誤開啟 \"%1\": %2" - -msgid "Error compiling vertex shader in file \"%1\"" -msgstr "編譯檔案 \"%1\" 中的頂點著色器時發生錯誤" - -msgid "Error compiling fragment shader in file \"%1\"" -msgstr "編譯檔案 \"%1\" 中的片段著色器出錯" - -msgid "Error linking shader program in file \"%1\"" -msgstr "在檔案中連結shader程式出錯 \"%1\"" - -msgid "OpenGL 3.0 renderer options" -msgstr "OpenGL 3.0 渲染器選項" - msgid "Render behavior" msgstr "渲染行為" @@ -1320,9 +1287,6 @@ msgstr "fps" msgid "VSync" msgstr "VSync" -msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" -msgstr "<html><head/><body><p>立即渲染每個畫面,與模擬顯示同步。</p><p><span style=" font-style:italic;">如果使用中的著色器不利用影格時間製作動畫效果,建議使用此選項。</span></p></body></html>" - msgid "Synchronize with video" msgstr "與視訊同步" @@ -1332,21 +1296,9 @@ msgstr "著色器" msgid "Remove" msgstr "移除" -msgid "No shader selected" -msgstr "未選擇著色器" - msgid "Browse..." msgstr "瀏覽..." -msgid "Shader error" -msgstr "著色器錯誤" - -msgid "Could not load shaders." -msgstr "無法載入著色器。" - -msgid "More information in details." -msgstr "更多詳細資訊。" - msgid "Couldn't create OpenGL context." msgstr "無法建立 OpenGL 上下文。" @@ -1356,18 +1308,12 @@ msgstr "無法切換至 OpenGL 上下文。" msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "需要 OpenGL 版本 3.0 或更高。目前版本為 %1.%2" -msgid "OpenGL initialization failed. Error %1." -msgstr "OpenGL 初始化失敗。錯誤 %1." - msgid "Error initializing OpenGL" msgstr "初始化 OpenGL 出錯" msgid "Falling back to software rendering.\n" msgstr "回退到軟體渲染。" -msgid "Allocating memory for unpack buffer failed.\n" -msgstr "為解除封包緩衝區分配記憶體失敗。\n" - msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>當選擇媒體映像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 設定檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。</p></body></html>" From c08775becfd721f587c3196b2a3b4d1378646e99 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 7 Apr 2025 19:50:42 +0500 Subject: [PATCH 088/118] qt: Use `util::DlgFilter` for the shader picker Also fix the translation for its filter --- src/qt/languages/86box.pot | 2 +- src/qt/languages/ca-ES.po | 4 ++-- src/qt/languages/cs-CZ.po | 4 ++-- src/qt/languages/de-DE.po | 4 ++-- src/qt/languages/es-ES.po | 4 ++-- src/qt/languages/fi-FI.po | 4 ++-- src/qt/languages/fr-FR.po | 4 ++-- src/qt/languages/hr-HR.po | 4 ++-- src/qt/languages/hu-HU.po | 4 ++-- src/qt/languages/it-IT.po | 4 ++-- src/qt/languages/ja-JP.po | 4 ++-- src/qt/languages/ko-KR.po | 4 ++-- src/qt/languages/nl-NL.po | 4 ++-- src/qt/languages/pl-PL.po | 4 ++-- src/qt/languages/pt-BR.po | 4 ++-- src/qt/languages/pt-PT.po | 4 ++-- src/qt/languages/ru-RU.po | 4 ++-- src/qt/languages/sk-SK.po | 4 ++-- src/qt/languages/sl-SI.po | 4 ++-- src/qt/languages/tr-TR.po | 4 ++-- src/qt/languages/uk-UA.po | 4 ++-- src/qt/languages/vi-VN.po | 4 ++-- src/qt/languages/zh-CN.po | 4 ++-- src/qt/languages/zh-TW.po | 4 ++-- src/qt/qt_openglshadermanagerdialog.cpp | 5 ++++- 25 files changed, 51 insertions(+), 48 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 15c605449..264060afe 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -894,7 +894,7 @@ msgstr "" msgid "Monitor in sleep mode" msgstr "" -msgid "OpenGL Shaders" +msgid "GLSL shaders" msgstr "" msgid "You are loading an unsupported configuration" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 26e51fe68..1d03316b6 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -894,8 +894,8 @@ msgstr "Configuració de Dispositiu %1" msgid "Monitor in sleep mode" msgstr "Monitor en mode estalvi" -msgid "OpenGL Shaders" -msgstr "Shaders OpenGL" +msgid "GLSL shaders" +msgstr "Shaders GLSL" msgid "You are loading an unsupported configuration" msgstr "S'està carregant una configuració no suportada" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 099245033..a5378a978 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -894,8 +894,8 @@ msgstr "Nastavení zařízení %1" msgid "Monitor in sleep mode" msgstr "Monitor je v režimu spánku" -msgid "OpenGL Shaders" -msgstr "Shadery OpenGL" +msgid "GLSL shaders" +msgstr "Shadery GLSL" msgid "You are loading an unsupported configuration" msgstr "Pokoušíte se spustit nepodporovanou konfiguraci" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index eae29f084..c3ca0953a 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -897,8 +897,8 @@ msgstr "%1-Gerätekonfiguration" msgid "Monitor in sleep mode" msgstr "Monitor im Standbymodus" -msgid "OpenGL Shaders" -msgstr "OpenGL-Shader" +msgid "GLSL shaders" +msgstr "GLSL-Shader" msgid "You are loading an unsupported configuration" msgstr "Zur Zeit wird eine nicht unterstützte Konfiguration geladen" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 14d6a6383..20a6eb351 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -894,8 +894,8 @@ msgstr "%1 Configuración de Dispositivo" msgid "Monitor in sleep mode" msgstr "Monitor en modo ahorro" -msgid "OpenGL Shaders" -msgstr "Shaders OpenGL" +msgid "GLSL shaders" +msgstr "Shaders GLSL" msgid "You are loading an unsupported configuration" msgstr "Está cargando una configuración no soportada" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 1408522fc..e12e27db4 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -894,8 +894,8 @@ msgstr "%1 - Laitteen määritykset" msgid "Monitor in sleep mode" msgstr "Näyttö lepotilassa" -msgid "OpenGL Shaders" -msgstr "OpenGL-varjostinohjelmat" +msgid "GLSL shaders" +msgstr "GLSL-varjostinohjelmat" msgid "You are loading an unsupported configuration" msgstr "Olet lataamassa ei-tuettuja määrittelyjä" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 829a9658b..8900dbf2d 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -894,8 +894,8 @@ msgstr "Configuration du dispositif %1" msgid "Monitor in sleep mode" msgstr "Moniteur en mode veille" -msgid "OpenGL Shaders" -msgstr "Shaders OpenGL" +msgid "GLSL shaders" +msgstr "Shaders GLSL" msgid "You are loading an unsupported configuration" msgstr "Vous chargez une configuration non prise en charge" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 6ca3ad8f5..ffa21efd1 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -894,8 +894,8 @@ msgstr "Konfiguracija uređaja %1" msgid "Monitor in sleep mode" msgstr "Ekran u stanju mirovanja" -msgid "OpenGL Shaders" -msgstr "OpenGL shaderi" +msgid "GLSL shaders" +msgstr "GLSL shaderi" msgid "You are loading an unsupported configuration" msgstr "Učitavate nepodržanu konfiguraciju" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 7d6a434f7..bbcfbd814 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -894,8 +894,8 @@ msgstr "%1 eszközkonfiguráció" msgid "Monitor in sleep mode" msgstr "Képernyő alvó módban" -msgid "OpenGL Shaders" -msgstr "OpenGL Shaderek" +msgid "GLSL shaders" +msgstr "GLSL shaderek" msgid "You are loading an unsupported configuration" msgstr "Egy nem támogatott konfigurációt tölt be" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 256337a0d..8c2322bb0 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -894,8 +894,8 @@ msgstr "Configurazione del dispositivo %1" msgid "Monitor in sleep mode" msgstr "Monitor in modalità riposo" -msgid "OpenGL Shaders" -msgstr "Shader OpenGL" +msgid "GLSL shaders" +msgstr "Shader GLSL" msgid "You are loading an unsupported configuration" msgstr "Stai caricando una configurazione non supportata" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index d38760f15..03c1f5fdc 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -894,8 +894,8 @@ msgstr "%1 のデバイス設定" msgid "Monitor in sleep mode" msgstr "モニターのスリープモード" -msgid "OpenGL Shaders" -msgstr "OpenGLシェーダー" +msgid "GLSL shaders" +msgstr "GLSLシェーダー" msgid "You are loading an unsupported configuration" msgstr "サポートされていないコンフィグを読み込んでいます" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index dbf77106b..ee2e5db5f 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -894,8 +894,8 @@ msgstr "%1 장치 설정" msgid "Monitor in sleep mode" msgstr "모니터 절전 모드" -msgid "OpenGL Shaders" -msgstr "OpenGL 쉐이더" +msgid "GLSL shaders" +msgstr "GLSL 쉐이더" msgid "You are loading an unsupported configuration" msgstr "지원하지 않는 설정입니다" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 65e59331b..3e95f69de 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -894,8 +894,8 @@ msgstr "%1 Apparaatconfiguratie" msgid "Monitor in sleep mode" msgstr "Monitor in slaapstand" -msgid "OpenGL Shaders" -msgstr "OpenGL Shaders" +msgid "GLSL shaders" +msgstr "GLSL Shaders" msgid "You are loading an unsupported configuration" msgstr "U laadt een configuratie die niet wordt ondersteund" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index bed21af24..472c29d41 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -894,8 +894,8 @@ msgstr "Konfiguracja urządzenia %1" msgid "Monitor in sleep mode" msgstr "Monitor w trybie czuwania" -msgid "OpenGL Shaders" -msgstr "Shadery OpenGL" +msgid "GLSL shaders" +msgstr "Shadery GLSL" msgid "You are loading an unsupported configuration" msgstr "Ładujesz nieobsługiwaną konfigurację" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index df606a635..b9c391083 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -894,8 +894,8 @@ msgstr "Configuração do dispositivo %1" msgid "Monitor in sleep mode" msgstr "Monitor em modo de suspensão" -msgid "OpenGL Shaders" -msgstr "Shaders OpenGL" +msgid "GLSL shaders" +msgstr "Shaders GLSL" msgid "You are loading an unsupported configuration" msgstr "Você está carregando uma configuração não suportada" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index b3458bcdf..a9c6a6810 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -894,8 +894,8 @@ msgstr "Configuração de dispositivo %1" msgid "Monitor in sleep mode" msgstr "Ecrã em modo de sono" -msgid "OpenGL Shaders" -msgstr "Shaders OpenGL" +msgid "GLSL shaders" +msgstr "Shaders GLSL" msgid "You are loading an unsupported configuration" msgstr "Está a carregar uma configuração sem suporte!" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 6104d064f..9bf253eca 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -894,8 +894,8 @@ msgstr "Конфигурация устройства %1" msgid "Monitor in sleep mode" msgstr "Монитор в спящем режиме" -msgid "OpenGL Shaders" -msgstr "Шейдеры OpenGL" +msgid "GLSL shaders" +msgstr "Шейдеры GLSL" msgid "You are loading an unsupported configuration" msgstr "Вы загружаете неподдерживаемую конфигурацию" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 9e6532267..172332178 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -894,8 +894,8 @@ msgstr "Konfigurácia zariadenia %1" msgid "Monitor in sleep mode" msgstr "Monitor je v režime spánku" -msgid "OpenGL Shaders" -msgstr "Shadery OpenGL" +msgid "GLSL shaders" +msgstr "Shadery GLSL" msgid "You are loading an unsupported configuration" msgstr "Pokúšate sa spustiť nepodporovanú konfiguráciu" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index efb62153a..3ca041b7c 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -894,8 +894,8 @@ msgstr "Konfiguracija naprave %1" msgid "Monitor in sleep mode" msgstr "Zaslon v načinu spanja" -msgid "OpenGL Shaders" -msgstr "Senčilniki OpenGL" +msgid "GLSL shaders" +msgstr "Senčilniki GLSL" msgid "You are loading an unsupported configuration" msgstr "Nalagate nepodprto konfiguracijo" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index e3d692537..0408a5cbe 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -894,8 +894,8 @@ msgstr "%1 cihaz konfigürasyonu" msgid "Monitor in sleep mode" msgstr "Monitör uyku modunda" -msgid "OpenGL Shaders" -msgstr "OpenGL gölgelendiricileri" +msgid "GLSL shaders" +msgstr "GLSL gölgelendiricileri" msgid "You are loading an unsupported configuration" msgstr "Desteklenmeyen bir konfigürasyon kullanıyorsunuz" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 687186f56..641c454ce 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -894,8 +894,8 @@ msgstr "Конфігурація пристрою %1" msgid "Monitor in sleep mode" msgstr "Монітор у сплячому режимі" -msgid "OpenGL Shaders" -msgstr "Шейдери OpenGL" +msgid "GLSL shaders" +msgstr "Шейдери GLSL" msgid "You are loading an unsupported configuration" msgstr "Ви завантажуєте непідтримувану конфігурацію" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 55a70991c..ce2967007 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -894,8 +894,8 @@ msgstr "Tinh chỉnh thiết bị %1" msgid "Monitor in sleep mode" msgstr "Màn hình chế độ chờ/ngủ" -msgid "OpenGL Shaders" -msgstr "Shader OpenGL" +msgid "GLSL shaders" +msgstr "Shader GLSL" msgid "You are loading an unsupported configuration" msgstr "Bạn đang load tinh chỉnh không được hỗ trợ." diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index cd720c0ee..f30dc48f3 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -894,8 +894,8 @@ msgstr "%1 设备配置" msgid "Monitor in sleep mode" msgstr "显示器处在睡眠状态" -msgid "OpenGL Shaders" -msgstr "OpenGL 着色器" +msgid "GLSL shaders" +msgstr "GLSL 着色器" msgid "You are loading an unsupported configuration" msgstr "正在载入一个不受支持的配置" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index a11ef8d44..9116bf09d 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -894,8 +894,8 @@ msgstr "%1 裝置設定" msgid "Monitor in sleep mode" msgstr "顯示器處在睡眠狀態" -msgid "OpenGL Shaders" -msgstr "OpenGL 著色器" +msgid "GLSL shaders" +msgstr "GLSL 著色器" msgid "You are loading an unsupported configuration" msgstr "正在載入一個不受支援的設定" diff --git a/src/qt/qt_openglshadermanagerdialog.cpp b/src/qt/qt_openglshadermanagerdialog.cpp index 72f58f9cb..2a03b46f7 100644 --- a/src/qt/qt_openglshadermanagerdialog.cpp +++ b/src/qt/qt_openglshadermanagerdialog.cpp @@ -2,6 +2,7 @@ #include "ui_qt_openglshadermanagerdialog.h" #include "qt_mainwindow.hpp" +#include "qt_util.hpp" extern MainWindow* main_window; #include "qt_openglshaderconfig.hpp" @@ -9,6 +10,7 @@ extern MainWindow* main_window; #include #include #include +#include extern "C" { #include <86box/86box.h> @@ -166,7 +168,8 @@ void OpenGLShaderManagerDialog::on_buttonMoveDown_clicked() void OpenGLShaderManagerDialog::on_buttonAdd_clicked() { - auto res = QFileDialog::getOpenFileName(this, QString(), QString(), "GLSL Shaders (*.glslp *.glsl);;All files (*.*)"); + auto res = QFileDialog::getOpenFileName(this, QString(), QString(), + tr("GLSL shaders") % util::DlgFilter({ "glslp", "glsl" }) % tr("All files") % util::DlgFilter({ "*" }, true)); if (!res.isEmpty()) { auto glslp_file = res.toUtf8(); glslp_t* shaderfile = glslp_parse(glslp_file.data()); From f16265e2a418cab4f10ffc63527aaa5944c4faee Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 7 Apr 2025 19:55:07 +0500 Subject: [PATCH 089/118] qt: Remove the translation for the LBA Enhancer It wasn't supposed to be translated due to being a company name and a product name --- src/qt/languages/86box.pot | 3 --- src/qt/languages/ca-ES.po | 3 --- src/qt/languages/cs-CZ.po | 3 --- src/qt/languages/de-DE.po | 3 --- src/qt/languages/es-ES.po | 3 --- src/qt/languages/fi-FI.po | 3 --- src/qt/languages/fr-FR.po | 3 --- src/qt/languages/hr-HR.po | 3 --- src/qt/languages/hu-HU.po | 3 --- src/qt/languages/it-IT.po | 3 --- src/qt/languages/ja-JP.po | 3 --- src/qt/languages/ko-KR.po | 3 --- src/qt/languages/nl-NL.po | 3 --- src/qt/languages/pl-PL.po | 3 --- src/qt/languages/pt-BR.po | 3 --- src/qt/languages/pt-PT.po | 3 --- src/qt/languages/ru-RU.po | 3 --- src/qt/languages/sk-SK.po | 3 --- src/qt/languages/sl-SI.po | 3 --- src/qt/languages/tr-TR.po | 3 --- src/qt/languages/uk-UA.po | 3 --- src/qt/languages/vi-VN.po | 3 --- src/qt/languages/zh-CN.po | 3 --- src/qt/languages/zh-TW.po | 3 --- 24 files changed, 72 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 264060afe..a2eb3c4c3 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -1380,9 +1380,6 @@ msgstr "" msgid "Serial port passthrough 4" msgstr "" -msgid "Vision Systems LBA Enhancer" -msgstr "" - msgid "Renderer options..." msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 1d03316b6..64e314124 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -1380,9 +1380,6 @@ msgstr "Pas del port sèrie 3" msgid "Serial port passthrough 4" msgstr "Pas del port sèrie 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Opcions del renderitzador ..." diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index a5378a978..fcc6e7baf 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -1380,9 +1380,6 @@ msgstr "Průchod sériového portu 3" msgid "Serial port passthrough 4" msgstr "Průchod sériového portu 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Možnosti vykreslovače..." diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index c3ca0953a..12ec816be 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1383,9 +1383,6 @@ msgstr "Durchreichung der Serielle Schnittstelle 3" msgid "Serial port passthrough 4" msgstr "Durchreichung der Serielle Schnittstelle 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Renderer-Optionen..." diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 20a6eb351..9eb413d12 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -1379,9 +1379,6 @@ msgstr "Paso de puerto serie 3" msgid "Serial port passthrough 4" msgstr "Paso de puerto serie 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Opciones del renderizador..." diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index e12e27db4..19b0c1ae1 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -1383,9 +1383,6 @@ msgstr "Sarjaportin läpivienti 3" msgid "Serial port passthrough 4" msgstr "Sarjaportin läpivienti 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Alustusasetukset..." diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 8900dbf2d..1636356e2 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -1380,9 +1380,6 @@ msgstr "Passage du port série 3" msgid "Serial port passthrough 4" msgstr "Passage du port série 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Options de rendu..." diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index ffa21efd1..f30d973e2 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -1380,9 +1380,6 @@ msgstr "Prolaz serijskih vrata 3" msgid "Serial port passthrough 4" msgstr "Prolaz serijskih vrata 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Opcije rendera..." diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index bbcfbd814..7dc86fd66 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -1380,9 +1380,6 @@ msgstr "Soros port áthaladás 3" msgid "Serial port passthrough 4" msgstr "Soros port áthaladás 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Renderer opciók..." diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 8c2322bb0..7e91d6f8f 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1380,9 +1380,6 @@ msgstr "Passaggio della porta seriale 3" msgid "Serial port passthrough 4" msgstr "Passaggio della porta seriale 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Opzioni del renderer..." diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 03c1f5fdc..7bd0eb2db 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1380,9 +1380,6 @@ msgstr "シリアル・ポート・パススルー 3" msgid "Serial port passthrough 4" msgstr "シリアル・ポート・パススルー 4" -msgid "Vision Systems LBA Enhancer" -msgstr "ビジョン・システムズ LBAエンハンサー" - msgid "Renderer options..." msgstr "レンダラー設定..." diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index ee2e5db5f..3650bd39e 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1380,9 +1380,6 @@ msgstr "직렬 포트 패스스루 3" msgid "Serial port passthrough 4" msgstr "직렬 포트 패스스루 4" -msgid "Vision Systems LBA Enhancer" -msgstr "비전 시스템 LBA 인핸서" - msgid "Renderer options..." msgstr "렌더러 옵션..." diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 3e95f69de..54e3422ea 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -1380,9 +1380,6 @@ msgstr "Seriële poort doorvoer 3" msgid "Serial port passthrough 4" msgstr "Seriële poort doorvoer 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Renderer-opties..." diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 472c29d41..0e00ea6be 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1380,9 +1380,6 @@ msgstr "Przełączanie portu szeregowego 3" msgid "Serial port passthrough 4" msgstr "Przełączanie portu szeregowego 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Opcje renderowania..." diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index b9c391083..d7092c6d0 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1380,9 +1380,6 @@ msgstr "Passagem de porta serial 3" msgid "Serial port passthrough 4" msgstr "Passagem de porta serial 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Opções do renderizador..." diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index a9c6a6810..e04d93c54 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -1380,9 +1380,6 @@ msgstr "Passagem da porta de série 3" msgid "Serial port passthrough 4" msgstr "Passagem da porta de série 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Sistemas de visão Melhorador LBA" - msgid "Renderer options..." msgstr "Opções do renderizador..." diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 9bf253eca..a67583a74 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1380,9 +1380,6 @@ msgstr "Сквозной последовательный порт COM3" msgid "Serial port passthrough 4" msgstr "Сквозной последовательный порт COM4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Параметры рендеринга..." diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 172332178..f976147b8 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -1381,9 +1381,6 @@ msgstr "Priechod sériového portu 3" msgid "Serial port passthrough 4" msgstr "Priechod cez sériový port 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Možnosti vykresľovača..." diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 3ca041b7c..7022ad7b0 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -1380,9 +1380,6 @@ msgstr "Prepust za serijska vrata 3" msgid "Serial port passthrough 4" msgstr "Prepust za serijska vrata 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Možnosti sistema za upodabljanje..." diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 0408a5cbe..6f8359823 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -1380,9 +1380,6 @@ msgstr "Seri port geçişi 3" msgid "Serial port passthrough 4" msgstr "Seri port geçişi 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "İşleyici seçenekleri..." diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 641c454ce..c42e72e2b 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -1380,9 +1380,6 @@ msgstr "Пропуск послідовного порту 3" msgid "Serial port passthrough 4" msgstr "Пропуск послідовного порту 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Параметри рендерингу..." diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index ce2967007..dacd8efac 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -1380,9 +1380,6 @@ msgstr "Thông qua cổng serial 3" msgid "Serial port passthrough 4" msgstr "Thông qua cổng serial 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "Tùy chọn kết xuất ..." diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index f30dc48f3..1a78b8abc 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1380,9 +1380,6 @@ msgstr "串行端口直通 3" msgid "Serial port passthrough 4" msgstr "串行端口直通 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA 增强器" - msgid "Renderer options..." msgstr "渲染器选项..." diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 9116bf09d..a9e73c563 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -1380,9 +1380,6 @@ msgstr "序列埠的直通 3" msgid "Serial port passthrough 4" msgstr "序列埠的直通 4" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Renderer options..." msgstr "渲染器選項..." From bc8aae429ec6398b4f79a18cfe294192756f4357 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 7 Apr 2025 19:57:18 +0500 Subject: [PATCH 090/118] qt: Update the British English translation More ize -> ise spelling changes --- src/qt/languages/en-GB.po | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index b9f79882f..6043c10d9 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -15,18 +15,30 @@ msgstr "&RGB Greyscale" msgid "Time synchronization" msgstr "Time synchronisation" +msgid "Unable to initialize Ghostscript" +msgstr "Unable to initialise Ghostscript" + +msgid "Unable to initialize GhostPCL" +msgstr "Unable to initialise GhostPCL" + msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behaviour will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." msgid "Apply fullscreen stretch mode when maximized" msgstr "Apply fullscreen stretch mode when maximised" +msgid "Failed to initialize network driver" +msgstr "Failed to initialise network driver" + msgid "Render behavior" msgstr "Render behaviour" msgid "Synchronize with video" msgstr "Synchronise with video" +msgid "Error initializing OpenGL" +msgstr "Error initialising OpenGL" + msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialogue will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" From 890362131d1953f108a74dcf34a119732d26f334 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 8 Apr 2025 11:57:33 +0500 Subject: [PATCH 091/118] qt: Fix translations for "Falling back to software renderer" --- src/qt/languages/86box.pot | 2 +- src/qt/languages/ca-ES.po | 4 ++-- src/qt/languages/cs-CZ.po | 4 ++-- src/qt/languages/de-DE.po | 4 ++-- src/qt/languages/es-ES.po | 4 ++-- src/qt/languages/fi-FI.po | 4 ++-- src/qt/languages/fr-FR.po | 4 ++-- src/qt/languages/hr-HR.po | 4 ++-- src/qt/languages/hu-HU.po | 4 ++-- src/qt/languages/it-IT.po | 4 ++-- src/qt/languages/ja-JP.po | 4 ++-- src/qt/languages/ko-KR.po | 4 ++-- src/qt/languages/nl-NL.po | 4 ++-- src/qt/languages/pl-PL.po | 4 ++-- src/qt/languages/pt-BR.po | 4 ++-- src/qt/languages/pt-PT.po | 4 ++-- src/qt/languages/ru-RU.po | 4 ++-- src/qt/languages/sk-SK.po | 4 ++-- src/qt/languages/sl-SI.po | 4 ++-- src/qt/languages/tr-TR.po | 4 ++-- src/qt/languages/uk-UA.po | 4 ++-- src/qt/languages/vi-VN.po | 4 ++-- src/qt/languages/zh-CN.po | 4 ++-- src/qt/languages/zh-TW.po | 4 ++-- src/qt/qt_rendererstack.cpp | 2 +- 25 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index a2eb3c4c3..83e021d2a 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -1311,7 +1311,7 @@ msgstr "" msgid "Error initializing OpenGL" msgstr "" -msgid "Falling back to software rendering.\n" +msgid "\nFalling back to software rendering." msgstr "" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 64e314124..48c2a777d 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -1311,8 +1311,8 @@ msgstr "Es requereix la versió 3.0 o superior d'OpenGL. La versió actual és % msgid "Error initializing OpenGL" msgstr "Error en inicialitzar OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Tornant al renderitzador software.\n" +msgid "\nFalling back to software rendering." +msgstr "\nTornant al renderitzador software." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Quan seleccioneu imatges de suports (CD-ROM, disquet, etc.), el diàleg obert s’iniciarà al mateix directori que el fitxer de configuració 86Box. Aquesta configuració només farà una diferència en les macOS.</p></body></html>" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index fcc6e7baf..bcb7cc714 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -1311,8 +1311,8 @@ msgstr "Je vyžadována verze OpenGL 3.0 nebo vyšší. Aktuální verze je %1.% msgid "Error initializing OpenGL" msgstr "Chyba při inicializaci OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Návrat k softwarovému vykreslování.\n" +msgid "\nFalling back to software rendering." +msgstr "\nNávrat k softwarovému vykreslování." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Při výběru obrazů médií (CD-ROM, disketa atd.) se otevřené dialogové okno spustí ve stejném adresáři jako konfigurační soubor 86Box. Toto nastavení bude mít pravděpodobně význam pouze v systému MacOS.</p></body></html>" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 12ec816be..6255deef7 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1314,8 +1314,8 @@ msgstr "OpenGL-Version 3.0 oder höher ist erforderlich. Die aktuelle Version is msgid "Error initializing OpenGL" msgstr "Fehler beim Initialisieren von OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Rückgriff auf Software-Rendering.\n" +msgid "\nFalling back to software rendering." +msgstr "\nRückgriff auf Software-Rendering." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Bei der Auswahl von Medien-Abbildern (CD-ROM, Diskette usw.) wird der Öffnungsdialog im selben Verzeichnis wie die 86Box-Konfigurationsdatei gestartet. Diese Einstellung macht wahrscheinlich nur unter macOS einen Unterschied.</p></body></html>" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 9eb413d12..285809cc5 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -1310,8 +1310,8 @@ msgstr "Es requerida la versión 3.0 o más alta de OpenGL. La versión actual e msgid "Error initializing OpenGL" msgstr "Error al inicializar OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Recurrir al renderizado por software.\n" +msgid "\nFalling back to software rendering." +msgstr "\nRecurrir al renderizado por software." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Al seleccionar imágenes multimedia (CD-ROM, disquete, etc.), el diálogo de apertura se iniciará en el mismo directorio que el archivo de configuración de 86Box. Es probable que este ajuste sólo suponga una diferencia en macOS.</p></body></html>" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 19b0c1ae1..5419b9c5a 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -1314,8 +1314,8 @@ msgstr "Tarvitaan OpenGL-versio 3.0 tai uudempi. Nykyinen versio on %1.%2" msgid "Error initializing OpenGL" msgstr "Virhe OpenGL:n alustamisessa" -msgid "Falling back to software rendering.\n" -msgstr "Paluu ohjelmistoalustusöintiin.\n" +msgid "\nFalling back to software rendering." +msgstr "\nPaluu ohjelmistoalustusöintiin." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Kun valitset mediakuvia (CD-ROM, levykkeet jne.), avausikkuna käynnistyy samaan hakemistoon kuin 86Boxin konfigurointitiedosto. Tällä asetuksella on todennäköisesti merkitystä vain macOS-käyttöjärjestelmässä.</p></body></html>" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 1636356e2..39479b40f 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -1311,8 +1311,8 @@ msgstr "La version 3.0 ou supérieure d'OpenGL est requise. La version actuelle msgid "Error initializing OpenGL" msgstr "Erreur d'initialisation d'OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Se rabattre sur le rendu logiciel.\n" +msgid "\nFalling back to software rendering." +msgstr "\nSe rabattre sur le rendu logiciel." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Lors de la sélection d'images multimédia (CD-ROM, disquette, etc.), la boîte de dialogue d'ouverture démarrera dans le même répertoire que le fichier de configuration de 86Box. Ce paramètre ne fera probablement une différence que sur macOS.</p></body></html>" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index f30d973e2..634523c5c 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -1311,8 +1311,8 @@ msgstr "Potrebna je OpenGL verzija 3.0 ili više. Trenutna verzija je %1. %2" msgid "Error initializing OpenGL" msgstr "Nije moguće inicijalizirati OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Vraća se na softverski renderer.\n" +msgid "\nFalling back to software rendering." +msgstr "\nVraća se na softverski renderer." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Prilikom odabira medijskih slika (CD-ROM, diskete itd.), otvoreni dijalog zopočet će u istom direktoriju kao i konfiguracijska datoteka 86Box-a. Razlika će vjerojatno biti primjetna samo na macOS-u.</p></body></html>" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 7dc86fd66..db6354680 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -1311,8 +1311,8 @@ msgstr "Az OpenGL 3.0 vagy magasabb verziója szükséges. Az aktuális verzió msgid "Error initializing OpenGL" msgstr "Hiba az OpenGL inicializálásában" -msgid "Falling back to software rendering.\n" -msgstr "Visszatérés a szoftveres rendereléshez.\n" +msgid "\nFalling back to software rendering." +msgstr "\nVisszatérés a szoftveres rendereléshez." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>A médiaképek (CD-ROM, floppy stb.) kiválasztásakor a megnyitási párbeszédpanel ugyanabban a könyvtárban indul, mint a 86Box konfigurációs fájl. Ez a beállítás valószínűleg csak a macOS rendszerben jelent különbséget.</p></body></html>" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 7e91d6f8f..effbee5bd 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1311,8 +1311,8 @@ msgstr "È richiesta la versione OpenGL 3.0 o superiore. La versione attuale è msgid "Error initializing OpenGL" msgstr "Errore nell'inizializzazione di OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Ricaduta sul rendering software." +msgid "\nFalling back to software rendering." +msgstr "\nRicaduta sul rendering software." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Quando si selezionano immagini multimediali (CD-ROM, floppy, ecc.) la finestra di dialogo di apertura si avvia nella stessa directory del file di configurazione di 86Box. Questa impostazione probabilmente farà la differenza solo su macOS.</p></body></html>" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 7bd0eb2db..4ef8d01de 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1311,8 +1311,8 @@ msgstr "OpenGLのバージョン3.0以上が必要です。現在のバージョ msgid "Error initializing OpenGL" msgstr "OpenGLの初期化エラー" -msgid "Falling back to software rendering.\n" -msgstr "ソフトウェアレンダリングに逆戻り。" +msgid "\nFalling back to software rendering." +msgstr "\nソフトウェアレンダリングに逆戻り。" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>メディアイメージ(CD-ROM、フロッピーなど)を選択するとき、オープンダイアログは86Box設定ファイルと同じディレクトリで開始します。この設定は、おそらく macOS でのみ違いがあります。</p></body></html>" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 3650bd39e..e9e4b99e6 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1311,8 +1311,8 @@ msgstr "OpenGL 버전 3.0 이상이 필요합니다. 현재 버전은 %1.%2입 msgid "Error initializing OpenGL" msgstr "OpenGL 초기화 중 오류 발생" -msgid "Falling back to software rendering.\n" -msgstr "소프트웨어 렌더링으로 돌아가기.\n" +msgid "\nFalling back to software rendering." +msgstr "\n소프트웨어 렌더링으로 돌아가기." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>미디어 이미지(CD-ROM, 플로피 등)를 선택하면 86Box 구성 파일과 동일한 디렉터리에서 열기 대화 상자가 시작됩니다. 이 설정은 macOS에서만 차이가 있을 수 있습니다.</p></body></html>" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 54e3422ea..10e4c2bd2 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -1311,8 +1311,8 @@ msgstr "OpenGL versie 3.0 of hoger is vereist. De huidige versie is %1.%2" msgid "Error initializing OpenGL" msgstr "Fout bij het initialiseren van OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Terugvallen op software rendering.\n" +msgid "\nFalling back to software rendering." +msgstr "\nTerugvallen op software rendering." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Bij het selecteren van media-images (CD-ROM, floppy, etc.) zal de \"open dialoog\" starten in dezelfde map als het 86Box configuratiebestand. Deze instelling is doet er waarschijnlijk alleen toe op macOS.</p></body></html>" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 0e00ea6be..f8367176d 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1311,8 +1311,8 @@ msgstr "Wymagana jest wersja OpenGL 3.0 lub wyższa. Aktualna wersja to %1.%2" msgid "Error initializing OpenGL" msgstr "Błąd inicjalizacji OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Powrót do renderowania oprogramowania.\n" +msgid "\nFalling back to software rendering." +msgstr "\nPowrót do renderowania oprogramowania." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Podczas wybierania obrazów nośników (CD-ROM, dyskietka itp.) otwarte okno dialogowe rozpocznie się w tym samym katalogu, co plik konfiguracyjny 86Box. To ustawienie prawdopodobnie będzie miało znaczenie tylko na macOS.</p></body></html>" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index d7092c6d0..9f0370f5e 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1311,8 +1311,8 @@ msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é % msgid "Error initializing OpenGL" msgstr "Erro ao inicializar o OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Voltando à renderização de software.\n" +msgid "\nFalling back to software rendering." +msgstr "\nVoltando à renderização de software." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Ao selecionar imagens de mídia (CD-ROM, disquete, etc.), a caixa de diálogo de abertura será iniciada no mesmo diretório do arquivo de configuração do 86Box. Essa configuração provavelmente só fará diferença no macOS.</p></body></html>" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index e04d93c54..f665424e0 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -1311,8 +1311,8 @@ msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é % msgid "Error initializing OpenGL" msgstr "Erro ao inicializar o OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Recuando para a renderização de software." +msgid "\nFalling back to software rendering." +msgstr "\nRecuando para a renderização de software." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Ao selecionar imagens multimédia (CD-ROM, disquete, etc.) a caixa de diálogo de abertura irá começar no mesmo diretório que o ficheiro de configuração da 86Box. Esta configuração provavelmente só fará diferença no macOS.</p></body></html>" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index a67583a74..92542b70d 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1311,8 +1311,8 @@ msgstr "Требуется OpenGL версии 3.0 или выше. Текуща msgid "Error initializing OpenGL" msgstr "Ошибка инициализации OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Переключение на программный рендеринг.\n" +msgid "\nFalling back to software rendering." +msgstr "\nПереключение на программный рендеринг." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>При выборе образов носителей (CD-ROM, дискет и т. д.) диалог открытия будет запускаться в том же каталоге, что и файл конфигурации 86Box. Эта настройка, скорее всего, будет иметь значение только на macOS.</p></body></html>" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index f976147b8..36298269d 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -1312,8 +1312,8 @@ msgstr "Vyžaduje sa verzia OpenGL 3.0 alebo vyššia. Aktuálna verzia je %1.%2 msgid "Error initializing OpenGL" msgstr "Chyba pri inicializácii OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Návrat k softvérovému vykresľovaniu.\n" +msgid "\nFalling back to software rendering." +msgstr "\nNávrat k softvérovému vykresľovaniu." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Pri výbere multimediálnych obrazov (CD-ROM, disketa atď.) sa dialógové okno otvorenia spustí v rovnakom adresári ako konfiguračný súbor 86Box. Toto nastavenie bude mať pravdepodobne význam len v systéme MacOS.</p></body></html>" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 7022ad7b0..0eeca62f8 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -1311,8 +1311,8 @@ msgstr "Zahteva se različica OpenGL 3.0 ali novejša. Trenutna različica je %1 msgid "Error initializing OpenGL" msgstr "Napaka pri inicializaciji OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Vrnitev k programskemu upodabljanju.\n" +msgid "\nFalling back to software rendering." +msgstr "\nVrnitev k programskemu upodabljanju." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Pri izbiri medijskih slik (CD-ROM, disketa itd.) se bo odprto pogovorno okno začelo v istem imeniku kot konfiguracijska datoteka 86Box. Ta nastavitev bo verjetno imela pomen le v operacijskem sistemu MacOS.</p></body></html>" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 6f8359823..41930bd96 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -1311,8 +1311,8 @@ msgstr "OpenGL sürüm 3.0 veya üstü gereklidir. Geçerli sürüm %1.%2" msgid "Error initializing OpenGL" msgstr "OpenGL başlatılırken hata oluştu" -msgid "Falling back to software rendering.\n" -msgstr "Yazılım işleyicisine geri dönülüyor.\n" +msgid "\nFalling back to software rendering." +msgstr "\nYazılım işleyicisine geri dönülüyor." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Medya görüntüsü (CD-ROM, disket, vb.) seçme diyaloğu 86Box yapılandırma dosyasıyla aynı dizinde başlayacaktır. Bu ayar muhtemelen sadece macOS üzerinde bir fark meydana getirecektir.</p></body></html>" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index c42e72e2b..4632d001b 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -1311,8 +1311,8 @@ msgstr "Потрібна версія OpenGL 3.0 або новіша. Поточ msgid "Error initializing OpenGL" msgstr "Помилка ініціалізації OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Повернення до програмного рендерингу.\n" +msgid "\nFalling back to software rendering." +msgstr "\nПовернення до програмного рендерингу." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>При виборі медіа-образів (CD-ROM, дискета і т.д.) діалогове вікно буде відкриватися в тому ж каталозі, що і файл конфігурації 86Box. Цей параметр, швидше за все, матиме значення лише на macOS.</p></body></html>" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index dacd8efac..b8322d600 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -1311,8 +1311,8 @@ msgstr "OpenGL phiên bản 3.0 trở lên là bắt buộc. Phiên bản hiện msgid "Error initializing OpenGL" msgstr "Lỗi khởi tạo OpenGL" -msgid "Falling back to software rendering.\n" -msgstr "Quay trở lại kết xuất phần mềm.\n" +msgid "\nFalling back to software rendering." +msgstr "\nQuay trở lại kết xuất phần mềm." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Khi chọn hình ảnh phương tiện (CD-ROM, ổ mềm, v.v.), hộp thoại mở sẽ bắt đầu trong cùng thư mục với tệp cấu hình 86box. Cài đặt này có thể sẽ chỉ tạo ra sự khác biệt trên macOS.</p></body></html>" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 1a78b8abc..308cbe5b3 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1311,8 +1311,8 @@ msgstr "需要 OpenGL 3.0 或更高版本。当前版本为 %1.%2" msgid "Error initializing OpenGL" msgstr "初始化 OpenGL 时出错" -msgid "Falling back to software rendering.\n" -msgstr "回到软件渲染。" +msgid "\nFalling back to software rendering." +msgstr "\n回到软件渲染。" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>选择媒体图像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。</p></body></html>;" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index a9e73c563..1ffb9843e 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -1311,8 +1311,8 @@ msgstr "需要 OpenGL 版本 3.0 或更高。目前版本為 %1.%2" msgid "Error initializing OpenGL" msgstr "初始化 OpenGL 出錯" -msgid "Falling back to software rendering.\n" -msgstr "回退到軟體渲染。" +msgid "\nFalling back to software rendering." +msgstr "\n回退到軟體渲染。" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>當選擇媒體映像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 設定檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。</p></body></html>" diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index aed932e92..610d89d17 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -375,7 +375,7 @@ RendererStack::createRenderer(Renderer renderer) try { hw = new VulkanWindowRenderer(this); } catch (std::runtime_error &e) { - auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", e.what() + QString("\nFalling back to software rendering."), QMessageBox::Ok); + auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", e.what() + tr("\nFalling back to software rendering."), QMessageBox::Ok); msgBox->setAttribute(Qt::WA_DeleteOnClose); msgBox->show(); imagebufs = {}; From ba6694f9f2c102876aa7f1b9d49cecdd57c6d7c1 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 8 Apr 2025 12:01:05 +0500 Subject: [PATCH 092/118] qt: Make "Failed to init Vulkan" error translatable --- src/qt/languages/86box.pot | 3 +++ src/qt/languages/en-GB.po | 3 +++ src/qt/qt_rendererstack.cpp | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 83e021d2a..6327cf1f3 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2087,3 +2087,6 @@ msgstr "" msgid "Inhibit multimedia keys on Windows" msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index 6043c10d9..8cc29a71a 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -71,3 +71,6 @@ msgstr "Grey" msgid "Color" msgstr "Colour" + +msgid "Failed to initialize Vulkan renderer." +msgstr "Failed to initialise Vulkan renderer." diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index 610d89d17..b5b910fe9 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #ifdef __APPLE__ # include @@ -393,7 +394,7 @@ RendererStack::createRenderer(Renderer renderer) }); connect(hw, &VulkanWindowRenderer::errorInitializing, [=]() { /* Renderer could not initialize, fallback to software. */ - auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", QString("Failed to initialize Vulkan renderer.\nFalling back to software rendering."), QMessageBox::Ok); + auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", tr("Failed to initialize Vulkan renderer.") % tr("\nFalling back to software rendering."), QMessageBox::Ok); msgBox->setAttribute(Qt::WA_DeleteOnClose); msgBox->show(); imagebufs = {}; From 377381a8fadf5fc358712925561a44e55e662fde Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 8 Apr 2025 15:28:09 +0500 Subject: [PATCH 093/118] qt: Fix an error with the "%i Wait state(s)" string --- src/qt/languages/86box.pot | 2 +- src/qt/languages/ca-ES.po | 2 +- src/qt/languages/nl-NL.po | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 6327cf1f3..856888d7c 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -750,7 +750,7 @@ msgstr "" msgid "Default" msgstr "" -msgid "%i estat(s) d'espera" +msgid "%i Wait state(s)" msgstr "" msgid "Type" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 48c2a777d..ae9a22622 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -750,7 +750,7 @@ msgstr "KB" msgid "Default" msgstr "Per defecte" -msgid "%i estat(s) d'espera" +msgid "%i Wait state(s)" msgstr "%i estado(s) de Espera" msgid "Type" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 10e4c2bd2..8326ef49d 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Standaard" -msgid "%i estat(s) d'espera" -msgstr "%i estat(s) d'espera" +msgid "%i Wait state(s)" +msgstr "%i Wachttoestand(en)" msgid "Type" msgstr "Type" From 0a2d15db9bbb9a69327b5f40b5bd86c10d9f5d92 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 8 Apr 2025 15:29:07 +0500 Subject: [PATCH 094/118] qt: Reword some error messages slightly --- src/qt/languages/86box.pot | 2 +- src/qt/qt_glsl_parser.cpp | 2 +- src/qt/qt_openglrenderer.cpp | 2 +- src/qt/qt_openglshadermanagerdialog.cpp | 2 +- src/qt/qt_progsettings.cpp | 2 +- src/qt/qt_progsettings.ui | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 856888d7c..382e00835 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2085,7 +2085,7 @@ msgstr "" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "" -msgid "Inhibit multimedia keys on Windows" +msgid "Inhibit multimedia keys" msgstr "" msgid "Failed to initialize Vulkan renderer." diff --git a/src/qt/qt_glsl_parser.cpp b/src/qt/qt_glsl_parser.cpp index fa45267a7..6e107bc19 100644 --- a/src/qt/qt_glsl_parser.cpp +++ b/src/qt/qt_glsl_parser.cpp @@ -214,7 +214,7 @@ static glslp_t *glsl_parse(const char *f) { strcpy(shader->shader_fn, f); shader->shader_program = load_file(f); if (!shader->shader_program) { - QMessageBox::critical((QWidget *) qApp->findChild(), QObject::tr("GLSL error"), QObject::tr("Could not load shader %1").arg(shader->shader_fn)); + QMessageBox::critical((QWidget *) qApp->findChild(), QObject::tr("GLSL error"), QObject::tr("Could not load shader: %1").arg(shader->shader_fn)); //wx_simple_messagebox("GLSL error", "Could not load shader %s\n", shader->shader_fn); glslp_free(glslp); return 0; diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index cc48ca06e..2e8869c09 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -633,7 +633,7 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f) if (!load_texture(file, &tex->texture)) { //QMessageBox::critical(main_window, tr("GLSL Error"), tr("Could not load texture: %s").arg(file)); - main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %s").arg(file)); + main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %1").arg(file)); pclog("Could not load texture %s!\n", file); failed = 1; break; diff --git a/src/qt/qt_openglshadermanagerdialog.cpp b/src/qt/qt_openglshadermanagerdialog.cpp index 2a03b46f7..90f38f40f 100644 --- a/src/qt/qt_openglshadermanagerdialog.cpp +++ b/src/qt/qt_openglshadermanagerdialog.cpp @@ -184,7 +184,7 @@ void OpenGLShaderManagerDialog::on_buttonAdd_clicked() ui->buttonAdd->setDisabled(ui->shaderListWidget->count() >= MAX_USER_SHADERS); } } else { - QMessageBox::critical(this, tr("GLSL error"), tr("Could not load filename %1").arg(res)); + QMessageBox::critical(this, tr("GLSL error"), tr("Could not load file %1").arg(res)); } } } diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 2fd108186..0fce0d705 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -80,7 +80,7 @@ ProgSettings::accept() confirm_save = ui->checkBoxConfirmSave->isChecked() ? 1 : 0; confirm_reset = ui->checkBoxConfirmHardReset->isChecked() ? 1 : 0; video_fullscreen_first = ui->checkBoxFullscreenFirst->isChecked() ? 1 : 0; - inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked(); + inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked() ? 1 : 0; loadTranslators(QCoreApplication::instance()); reloadStrings(); diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui index d3ebf8c85..b01199dfd 100644 --- a/src/qt/qt_progsettings.ui +++ b/src/qt/qt_progsettings.ui @@ -140,7 +140,7 @@ - Inhibit multimedia keys on Windows + Inhibit multimedia keys From 0fd0c9adee4ce712b7c11520736c024f5290de3c Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 10 Apr 2025 02:05:50 +0500 Subject: [PATCH 095/118] qt: Miscellaneous translation corrections --- src/qt/languages/fr-FR.po | 4 ++-- src/qt/languages/hu-HU.po | 2 +- src/qt/languages/it-IT.po | 4 ++-- src/qt/languages/nl-NL.po | 2 +- src/qt/languages/pl-PL.po | 2 +- src/qt/languages/sk-SK.po | 2 +- src/qt/languages/zh-CN.po | 2 +- src/qt/languages/zh-TW.po | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 39479b40f..b0afd8ae2 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -220,7 +220,7 @@ msgid "&Existing image..." msgstr "Image &Existante..." msgid "Existing image (&Write-protected)..." -msgstr "Image Existante(&Lecture seule)..." +msgstr "Image Existante (&Lecture seule)..." msgid "&Record" msgstr "En®istrer" @@ -235,7 +235,7 @@ msgid "&Fast forward to the end" msgstr "Aller à la &Fin" msgid "E&ject" -msgstr "E&jecter" +msgstr "É&jecter" msgid "&Image..." msgstr "&Image..." diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index db6354680..8c9dc67dd 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -1252,7 +1252,7 @@ msgid "Host CD/DVD Drive (%1:)" msgstr "Gazdag CD/DVD-meghajtó (%1:)" msgid "&Connected" -msgstr "&Connected" +msgstr "" msgid "Clear image history" msgstr "Törölje a kép előzményeit" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index effbee5bd..4f9137d77 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1267,7 +1267,7 @@ msgid "Host CD/DVD Drive (%1)" msgstr "Unità CD/DVD host (%1)" msgid "Unknown Bus" -msgstr "Autobus sconosciuto" +msgstr "Bus sconosciuto" msgid "Null Driver" msgstr "Driver nullo" @@ -2062,7 +2062,7 @@ msgid "RAM Disk (max. speed)" msgstr "Disco RAM (velocità massima)" msgid "IBM 8514/A clone (ISA)" -msgstr "Clone IBM 8514/A(ISA)" +msgstr "Clone IBM 8514/A (ISA)" msgid "Vendor" msgstr "Fabricante" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 8326ef49d..f7d64a413 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -235,7 +235,7 @@ msgid "&Fast forward to the end" msgstr "&Snel vooruit naar het einde" msgid "E&ject" -msgstr "E&ject" +msgstr "&Uitwerpen" msgid "&Image..." msgstr "&Image..." diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index f8367176d..3b29c3415 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1252,7 +1252,7 @@ msgid "Host CD/DVD Drive (%1:)" msgstr "Napęd CD/DVD hosta (%1:)" msgid "&Connected" -msgstr "&Connected" +msgstr "" msgid "Clear image history" msgstr "Wyczyść historię obrazów" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 36298269d..1d8768dd8 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -1252,7 +1252,7 @@ msgid "Host CD/DVD Drive (%1:)" msgstr "Hostiteľská jednotka CD/DVD (%1:)" msgid "&Connected" -msgstr "&Connected" +msgstr "" msgid "Clear image history" msgstr "Vymazanie histórie obrázkov" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 308cbe5b3..32358584e 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1252,7 +1252,7 @@ msgid "Host CD/DVD Drive (%1:)" msgstr "主机 CD/DVD 驱动器 (%1:)" msgid "&Connected" -msgstr "&Connected" +msgstr "" msgid "Clear image history" msgstr "清除映像历史记录" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 1ffb9843e..6b7420bc7 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2050,7 +2050,7 @@ msgid "Eject %s" msgstr "退出 %s" msgid "&Unmute" -msgstr "解除靜音 (&U)" +msgstr "解除靜音(&U)" msgid "Softfloat FPU" msgstr "Softfloat FPU" From cc01d7c3b8ee0b837feb59467eea1678642e63eb Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 10 Apr 2025 02:51:04 +0500 Subject: [PATCH 096/118] =?UTF-8?q?qt=5Fmediamenu.cpp:=20Get=20rid=20of=20?= =?UTF-8?q?pointless=20QString=20=E2=86=94=20C=20string=20conversions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/qt/qt_mediamenu.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index f7abebdf1..478f64c2a 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -263,7 +263,7 @@ void MediaMenu::cassetteMenuSelect(int slot) { QString filename = mhm.getImageForSlot(0, slot, ui::MediaType::Cassette); - cassetteMount(filename.toUtf8().constData(), 0); + cassetteMount(filename, 0); cassetteUpdateMenu(); ui_sb_update_tip(SB_CASSETTE); } @@ -365,7 +365,7 @@ void MediaMenu::cartridgeMenuSelect(int index, int slot) { QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Cartridge); - cartridgeMount(index, filename.toUtf8().constData()); + cartridgeMount(index, filename); cartridgeUpdateMenu(index); ui_sb_update_tip(SB_CARTRIDGE | index); } @@ -507,7 +507,7 @@ void MediaMenu::floppyMenuSelect(int index, int slot) { QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Floppy); - floppyMount(index, filename.toUtf8().constData(), false); + floppyMount(index, filename, false); floppyUpdateMenu(index); ui_sb_update_tip(SB_FLOPPY | index); } @@ -594,7 +594,7 @@ void MediaMenu::cdromReload(int index, int slot) { const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Optical); - cdromMount(index, filename.toUtf8().constData()); + cdromMount(index, filename); cdromUpdateMenu(index); ui_sb_update_tip(SB_CDROM | index); } @@ -630,7 +630,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) switch (type) { default: - menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); + menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); return; case ui::MediaType::Cassette: if (!MachineStatus::hasCassette()) @@ -639,7 +639,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[cassetteImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); + menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); break; case ui::MediaType::Cartridge: if (!machine_has_cartridge(machine)) @@ -648,7 +648,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[cartridgeImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); + menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); break; case ui::MediaType::Floppy: if (!floppyMenus.contains(index)) @@ -657,7 +657,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[floppyImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); + menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); break; case ui::MediaType::Optical: if (!cdromMenus.contains(index)) @@ -668,14 +668,14 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) if (fn.left(8) == "ioctl://") { menu_icon = QIcon(":/settings/qt/icons/cdrom_host.ico"); #ifdef Q_OS_WINDOWS - menu_item_name = tr("Host CD/DVD Drive (%1)").arg(fn.right(2)).toUtf8().constData(); + menu_item_name = tr("Host CD/DVD Drive (%1)").arg(fn.right(2)); #else menu_item_name = tr("Host CD/DVD Drive (%1)").arg(fn.right(fn.length() - 8)); #endif } else { fi.setFile(fn); menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico"); - menu_item_name = fn.isEmpty() ? tr("previous image").toUtf8().constData() : fn.toUtf8().constData(); + menu_item_name = fn.isEmpty() ? tr("previous image") : fn; } imageHistoryUpdatePos->setIcon(menu_icon); break; @@ -686,7 +686,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[zipImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); + menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); break; case ui::MediaType::Mo: if (!moMenus.contains(index)) @@ -695,11 +695,11 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[moImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); + menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); break; } - imageHistoryUpdatePos->setText(QString::asprintf(tr("%s").toUtf8().constData(), menu_item_name.toUtf8().constData())); + imageHistoryUpdatePos->setText(menu_item_name); if (fn.left(8) == "ioctl://") imageHistoryUpdatePos->setVisible(true); @@ -735,7 +735,7 @@ MediaMenu::cdromUpdateMenu(int i) QString menu_item_name; if (name.left(8) == "ioctl://") { #ifdef Q_OS_WINDOWS - menu_item_name = tr("Host CD/DVD Drive (%1)").arg(name.right(2)).toUtf8().constData(); + menu_item_name = tr("Host CD/DVD Drive (%1)").arg(name.right(2)); #else menu_item_name = tr("Host CD/DVD Drive (%1)").arg(name.right(name.length() - 8)); #endif @@ -744,7 +744,7 @@ MediaMenu::cdromUpdateMenu(int i) } else { QFileInfo fi(cdrom[i].image_path); - menu_item_name = name.isEmpty() ? QString().toUtf8().constData() : name.toUtf8().constData(); + menu_item_name = name.isEmpty() ? QString() : name; name2 = name; menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico"); } From 5ff206e493153471088aa96755d76c2b44bc6f17 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 10 Apr 2025 04:34:37 +0500 Subject: [PATCH 097/118] qt: Get rid of most uses of `QString::asprintf()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that the Win32 UI is out of the way, we can rewrite the strings to use QString::arg() instead and avoid even more QString ↔ C string conversions --- src/qt/languages/86box.pot | 20 +++++++++--------- src/qt/languages/ca-ES.po | 40 +++++++++++++++++------------------ src/qt/languages/cs-CZ.po | 40 +++++++++++++++++------------------ src/qt/languages/de-DE.po | 40 +++++++++++++++++------------------ src/qt/languages/es-ES.po | 40 +++++++++++++++++------------------ src/qt/languages/fi-FI.po | 40 +++++++++++++++++------------------ src/qt/languages/fr-FR.po | 40 +++++++++++++++++------------------ src/qt/languages/hr-HR.po | 40 +++++++++++++++++------------------ src/qt/languages/hu-HU.po | 40 +++++++++++++++++------------------ src/qt/languages/it-IT.po | 40 +++++++++++++++++------------------ src/qt/languages/ja-JP.po | 38 ++++++++++++++++----------------- src/qt/languages/ko-KR.po | 40 +++++++++++++++++------------------ src/qt/languages/nl-NL.po | 40 +++++++++++++++++------------------ src/qt/languages/pl-PL.po | 40 +++++++++++++++++------------------ src/qt/languages/pt-BR.po | 40 +++++++++++++++++------------------ src/qt/languages/pt-PT.po | 40 +++++++++++++++++------------------ src/qt/languages/ru-RU.po | 40 +++++++++++++++++------------------ src/qt/languages/sk-SK.po | 40 +++++++++++++++++------------------ src/qt/languages/sl-SI.po | 40 +++++++++++++++++------------------ src/qt/languages/tr-TR.po | 40 +++++++++++++++++------------------ src/qt/languages/uk-UA.po | 40 +++++++++++++++++------------------ src/qt/languages/vi-VN.po | 40 +++++++++++++++++------------------ src/qt/languages/zh-CN.po | 40 +++++++++++++++++------------------ src/qt/languages/zh-TW.po | 40 +++++++++++++++++------------------ src/qt/qt_harddiskdialog.cpp | 3 +-- src/qt/qt_mediamenu.cpp | 36 ++++++++++++++----------------- src/qt/qt_settingsmachine.cpp | 2 +- 27 files changed, 487 insertions(+), 492 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 382e00835..a778f9f6d 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -642,7 +642,7 @@ msgstr "" msgid "Speed" msgstr "" -msgid "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" msgstr "" msgid "ZIP images" @@ -750,7 +750,7 @@ msgstr "" msgid "Default" msgstr "" -msgid "%i Wait state(s)" +msgid "%1 Wait state(s)" msgstr "" msgid "Type" @@ -795,10 +795,10 @@ msgstr "" msgid "None" msgstr "" -msgid "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" msgstr "" -msgid "Floppy %i (%s): %ls" +msgid "Floppy %1 (%2): %3" msgstr "" msgid "Advanced sector images" @@ -819,7 +819,7 @@ msgstr "" msgid "Unable to initialize GhostPCL" msgstr "" -msgid "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" msgstr "" msgid "MO images" @@ -906,13 +906,13 @@ msgstr "" msgid "Continue" msgstr "" -msgid "Cassette: %s" +msgid "Cassette: %1" msgstr "" msgid "Cassette images" msgstr "" -msgid "Cartridge %i: %ls" +msgid "Cartridge %1: %2" msgstr "" msgid "Cartridge images" @@ -1080,7 +1080,7 @@ msgstr "" msgid "ATAPI" msgstr "" -msgid "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" msgstr "" msgid "160 KB" @@ -1272,7 +1272,7 @@ msgstr "" msgid "Null Driver" msgstr "" -msgid "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" msgstr "" msgid "Render behavior" @@ -2046,7 +2046,7 @@ msgstr "" msgid "Host Serial Passthrough" msgstr "" -msgid "Eject %s" +msgid "E&ject %1" msgstr "" msgid "&Unmute" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index ae9a22622..808799859 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -642,8 +642,8 @@ msgstr "Premeu Ctrl+Alt+PgDn per tornar al mode de finestra." msgid "Speed" msgstr "Velocitat" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Imatges ZIP" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Per defecte" -msgid "%i Wait state(s)" -msgstr "%i estado(s) de Espera" +msgid "%1 Wait state(s)" +msgstr "%1 estado(s) de Espera" msgid "Type" msgstr "Tipus" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Cap" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disquet %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disquet %1 (%2): %3" msgid "Advanced sector images" msgstr "Imatges avançates del sector" @@ -819,8 +819,8 @@ msgstr "No es pot inicialitzar Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "No es pot inicialitzar GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Imatges MO" @@ -906,14 +906,14 @@ msgstr "El Filtratge de tipus de CPU basat en màquina seleccionada està deshab msgid "Continue" msgstr "Continuar" -msgid "Cassette: %s" -msgstr "Casset: %s" +msgid "Cassette: %1" +msgstr "Casset: %1" msgid "Cassette images" msgstr "Imatges de casset" -msgid "Cartridge %i: %ls" -msgstr "Cartutx %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartutx %1: %2" msgid "Cartridge images" msgstr "Imatges de cartutx" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Bus desconegut" msgid "Null Driver" msgstr "Controlador nul" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Comportament del renderitzador" @@ -2046,8 +2046,8 @@ msgstr "Pipe anomenat (servidor)" msgid "Host Serial Passthrough" msgstr "Pas del port sèrie amfitrió" -msgid "Eject %s" -msgstr "Extreure %s" +msgid "E&ject %1" +msgstr "E&xtreure %1" msgid "&Unmute" msgstr "&Saver" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index bcb7cc714..d3985b67a 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -642,8 +642,8 @@ msgstr "Stiskněte Ctrl+Alt+PgDn pro návrat z režimu celé obrazovky." msgid "Speed" msgstr "Rychlost" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Obrazy ZIP disků" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Výchozí" -msgid "%i Wait state(s)" -msgstr "%i čekací stav(y)" +msgid "%1 Wait state(s)" +msgstr "%1 čekací stav(y)" msgid "Type" msgstr "Typ" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Žadné" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disketová mechanika %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disketová mechanika %1 (%2): %3" msgid "Advanced sector images" msgstr "Rozšířené sektorové obrazy" @@ -819,8 +819,8 @@ msgstr "Nastala chyba při inicializaci knihovny Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Nastala chyba při inicializaci knihovny GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Obrazy MO" @@ -906,14 +906,14 @@ msgstr "Pro tuto konfiguraci bylo vypnuto filtrování procesorů podle zvolené msgid "Continue" msgstr "Pokračovat" -msgid "Cassette: %s" -msgstr "Kazeta: %s" +msgid "Cassette: %1" +msgstr "Kazeta: %1" msgid "Cassette images" msgstr "Kazetové nahrávky" -msgid "Cartridge %i: %ls" -msgstr "Cartridge %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartridge %1: %2" msgid "Cartridge images" msgstr "Obrazy cartridge" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Neznámá sběrnice" msgid "Null Driver" msgstr "Nulový ovladač" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Chování vykreslování" @@ -2046,8 +2046,8 @@ msgstr "Pojmenované potrubí (server)" msgid "Host Serial Passthrough" msgstr "Průchod sériového portu hostitele" -msgid "Eject %s" -msgstr "Vyjmout %s" +msgid "E&ject %1" +msgstr "&Vyjmout %1" msgid "&Unmute" msgstr "&Roztišit" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 6255deef7..781269af9 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -642,8 +642,8 @@ msgstr "Strg+Alt+Bild ab, zur Rückkehr in den Fenstermodus." msgid "Speed" msgstr "Geschwindigkeit" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP-Abbilder" @@ -753,8 +753,8 @@ msgstr "KB" msgid "Default" msgstr "Standard" -msgid "%i Wait state(s)" -msgstr "%i Wartezustände" +msgid "%1 Wait state(s)" +msgstr "%1 Wartezustände" msgid "Type" msgstr "Typ" @@ -798,11 +798,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Ohne" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Diskette %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Diskette %1 (%2): %3" msgid "Advanced sector images" msgstr "Fortgeschrittene Sektorabbilder" @@ -822,8 +822,8 @@ msgstr "Ghostscript konnte nicht initialisiert werden" msgid "Unable to initialize GhostPCL" msgstr "GhostPCL konnte nicht initialisiert werden" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "MO-Abbilder" @@ -909,14 +909,14 @@ msgstr "Das Filtern der CPU-Typen basierend auf dem ausgewählten System ist fü msgid "Continue" msgstr "Fortfahren" -msgid "Cassette: %s" -msgstr "Kassette: %s" +msgid "Cassette: %1" +msgstr "Kassette: %1" msgid "Cassette images" msgstr "Kassettenabbilder" -msgid "Cartridge %i: %ls" -msgstr "Cartridge %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartridge %1: %2" msgid "Cartridge images" msgstr "Cartridgeabbilder" @@ -1083,8 +1083,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1275,8 +1275,8 @@ msgstr "Unbekannter Bus" msgid "Null Driver" msgstr "Nulltreiber" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Rendering-Verhalten" @@ -2049,8 +2049,8 @@ msgstr "Benanntes Pipe (Server)" msgid "Host Serial Passthrough" msgstr "Durchreichung der seriellen Schnittstelle des Hosts" -msgid "Eject %s" -msgstr "Auswerfen %s" +msgid "E&ject %1" +msgstr "A&uswerfen %1" msgid "&Unmute" msgstr "&Ton einschalten" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 285809cc5..3cdcedd98 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -642,8 +642,8 @@ msgstr "Pulsa Ctrl+Alt+PgDn para volver a modo ventana." msgid "Speed" msgstr "Velocidad" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Imagenes ZIP" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Por defecto" -msgid "%i Wait state(s)" -msgstr "%i estado(s) de Espera" +msgid "%1 Wait state(s)" +msgstr "%1 estado(s) de Espera" msgid "Type" msgstr "Tipo" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Ninguno" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disquete %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disquete %1 (%2): %3" msgid "Advanced sector images" msgstr "Imágenes avanzadas de sector" @@ -819,8 +819,8 @@ msgstr "No fué posible inicializar Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "No fué posible inicializar GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Imágenes de MO" @@ -906,14 +906,14 @@ msgstr "El Filtrado de tipo de CPU basado en máquina seleccionada está deshabi msgid "Continue" msgstr "Continuar" -msgid "Cassette: %s" -msgstr "Cassette: %s" +msgid "Cassette: %1" +msgstr "Cassette: %1" msgid "Cassette images" msgstr "Imágenes de Cassette" -msgid "Cartridge %i: %ls" -msgstr "Cartucho %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartucho %1: %2" msgid "Cartridge images" msgstr "Imágenes de Cartucho" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1271,8 +1271,8 @@ msgstr "Bus desconocido" msgid "Null Driver" msgstr "Controlador nulo" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Comportamiento del renderizador" @@ -2045,8 +2045,8 @@ msgstr "Tubería con nombre (servidor)" msgid "Host Serial Passthrough" msgstr "Paso del puerto serie del host" -msgid "Eject %s" -msgstr "Extraer %s" +msgid "E&ject %1" +msgstr "E&xtraer %1" msgid "&Unmute" msgstr "&Reactivar sonido" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 5419b9c5a..ddae5c2ba 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -642,8 +642,8 @@ msgstr "Paina Ctrl+Alt+PgDn palataksesi ikkunoituun tilaan." msgid "Speed" msgstr "Nopeus" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP-levykuvat" @@ -750,8 +750,8 @@ msgstr "Kt" msgid "Default" msgstr "Oletus" -msgid "%i Wait state(s)" -msgstr "%i odotustilaa" +msgid "%1 Wait state(s)" +msgstr "%1 odotustilaa" msgid "Type" msgstr "Tyyppi" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Ei mikään" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u Mt (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 Mt (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Levyke %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Levyke %1 (%2): %3" msgid "Advanced sector images" msgstr "Kehittyneet sektorilevykuvat" @@ -819,8 +819,8 @@ msgstr "Ghostscriptin alustus epäonnistui" msgid "Unable to initialize GhostPCL" msgstr "GhostPCLin alustus epäonnistui" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "MO-levykuvat" @@ -906,14 +906,14 @@ msgstr "Valittuun tietokoneeseen perustuva suoritintyypin suodatus ei ole käyt msgid "Continue" msgstr "Jatka" -msgid "Cassette: %s" -msgstr "Kasetti: %s" +msgid "Cassette: %1" +msgstr "Kasetti: %1" msgid "Cassette images" msgstr "Kasettitiedostot" -msgid "Cartridge %i: %ls" -msgstr "ROM-moduuli %i: %ls" +msgid "Cartridge %1: %2" +msgstr "ROM-moduuli %1: %2" msgid "Cartridge images" msgstr "ROM-moduulikuvat" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 Kt" @@ -1272,8 +1272,8 @@ msgstr "Tuntematon väylä" msgid "Null Driver" msgstr "Nolla-ajuri" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Renderöintikäyttäytyminen" @@ -2049,8 +2049,8 @@ msgstr "Nimetty putki (palvelin)" msgid "Host Serial Passthrough" msgstr "Isännän sarjaportin läpivienti" -msgid "Eject %s" -msgstr "Poista kasettipesästä %s" +msgid "E&ject %1" +msgstr "&Poista kasettipesästä %1" msgid "&Unmute" msgstr "&Poista mykistys" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index b0afd8ae2..df5bf7ef6 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -642,8 +642,8 @@ msgstr "Appuyez sur Ctrl+Alt+PgDn pour revenir au mode fenêtré." msgid "Speed" msgstr "Vitesse" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Images ZIP" @@ -750,8 +750,8 @@ msgstr "Ko" msgid "Default" msgstr "Défaut" -msgid "%i Wait state(s)" -msgstr "%i état(s) d'attente" +msgid "%1 Wait state(s)" +msgstr "%1 état(s) d'attente" msgid "Type" msgstr "Type" @@ -795,11 +795,11 @@ msgstr "Système de contrôle de vol Thrustmaster" msgid "None" msgstr "Aucun" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u Mo (CTS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 Mo (CTS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disquette %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disquette %1 (%2): %3" msgid "Advanced sector images" msgstr "Images du secteur avancés" @@ -819,8 +819,8 @@ msgstr "Impossible d'initialiser Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Impossible d'initialiser GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "Magnéto-optique %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "Magnéto-optique %1 (%2): %3" msgid "MO images" msgstr "Images magnéto-optiques" @@ -906,14 +906,14 @@ msgstr "La filtrage du type du processeur sur la base de la machine sélectionn msgid "Continue" msgstr "Continuer" -msgid "Cassette: %s" -msgstr "Cassette: %s" +msgid "Cassette: %1" +msgstr "Cassette: %1" msgid "Cassette images" msgstr "Images cassette" -msgid "Cartridge %i: %ls" -msgstr "Cartouche %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartouche %1: %2" msgid "Cartridge images" msgstr "Images cartouche" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 Ko" @@ -1272,8 +1272,8 @@ msgstr "Bus inconnu" msgid "Null Driver" msgstr "Pilote nul" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Comportement de rendu" @@ -2046,8 +2046,8 @@ msgstr "Tuyau nommé (serveur)" msgid "Host Serial Passthrough" msgstr "Passage du port série de l'hôte" -msgid "Eject %s" -msgstr "Éjecter %s" +msgid "E&ject %1" +msgstr "É&jecter %1" msgid "&Unmute" msgstr "&Réactiver son" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 634523c5c..ecfd0c696 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -642,8 +642,8 @@ msgstr "Pritisnite Ctrl+Alt+PgDn za povratak u prozorski način rada." msgid "Speed" msgstr "Brzina" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP slike" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Standard" -msgid "%i Wait state(s)" -msgstr "%i stanje čekanja" +msgid "%1 Wait state(s)" +msgstr "%1 stanje čekanja" msgid "Type" msgstr "Tip" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Bez" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disketa %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disketa %1 (%2): %3" msgid "Advanced sector images" msgstr "Napredne sektorske slike" @@ -819,8 +819,8 @@ msgstr "Nije moguće inicijalizirati GhostScript" msgid "Unable to initialize GhostPCL" msgstr "Nije moguće inicijalizirati GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "MO slike" @@ -906,14 +906,14 @@ msgstr "Filtriranje tipa CPU-a na temelju odabranog sistema onemogućeno je za o msgid "Continue" msgstr "Nastavi" -msgid "Cassette: %s" -msgstr "Audio kaseta: %s" +msgid "Cassette: %1" +msgstr "Audio kaseta: %1" msgid "Cassette images" msgstr "Slike audio kasete" -msgid "Cartridge %i: %ls" -msgstr "Kaseta %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Kaseta %1: %2" msgid "Cartridge images" msgstr "Slike kasete" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Nepoznata sabirnica" msgid "Null Driver" msgstr "Nulti upravljački program" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Ponašanje rendera" @@ -2046,8 +2046,8 @@ msgstr "Imenovani vod (server)" msgid "Host Serial Passthrough" msgstr "Prolaz serijskih vrata nositelja" -msgid "Eject %s" -msgstr "Izbaci %s" +msgid "E&ject %1" +msgstr "&Izbaci %1" msgid "&Unmute" msgstr "&Uključi zvuk" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 8c9dc67dd..79e0dd5e6 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -642,8 +642,8 @@ msgstr "Használja a Ctrl+Alt+PgDn gombokat az ablakhoz való visszatéréshez." msgid "Speed" msgstr "Sebesség" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP-lemezképek" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Alapértelmezett" -msgid "%i Wait state(s)" -msgstr "%i várakozási ciklus(ok)" +msgid "%1 Wait state(s)" +msgstr "%1 várakozási ciklus(ok)" msgid "Type" msgstr "Típus" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Nincs" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Floppy %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Floppy %1 (%2): %3" msgid "Advanced sector images" msgstr "Továbbfejlesztett szektor képek" @@ -819,8 +819,8 @@ msgstr "Nem sikerült inicializálni a Ghostscript-et" msgid "Unable to initialize GhostPCL" msgstr "Nem sikerült inicializálni a GhostPCL-et" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "MO-képfájlok" @@ -906,14 +906,14 @@ msgstr "A kiválasztott gépen alapuló CPU-típusszűrés le van tiltva ezen az msgid "Continue" msgstr "Folytatás" -msgid "Cassette: %s" -msgstr "Magnókazetta: %s" +msgid "Cassette: %1" +msgstr "Magnókazetta: %1" msgid "Cassette images" msgstr "Magnókazetta-képek" -msgid "Cartridge %i: %ls" -msgstr "ROM-kazetta %i: %ls" +msgid "Cartridge %1: %2" +msgstr "ROM-kazetta %1: %2" msgid "Cartridge images" msgstr "ROM-kazetta képek" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Ismeretlen busz" msgid "Null Driver" msgstr "Null Driver" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Renderelési viselkedés" @@ -2046,8 +2046,8 @@ msgstr "Megnevezett cső (kiszolgáló)" msgid "Host Serial Passthrough" msgstr "Az állomás soros portjának áthaladása" -msgid "Eject %s" -msgstr "%s kiadás" +msgid "E&ject %1" +msgstr "%1 &kiadás" msgid "&Unmute" msgstr "&Hang újra bekapcsolása" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 4f9137d77..832c5b3fc 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -642,8 +642,8 @@ msgstr "Usa Ctrl+Alt+PgDn per tornare alla modalità finestra." msgid "Speed" msgstr "Velocità" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Immagini ZIP" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Predefinito" -msgid "%i Wait state(s)" -msgstr "%i stati d'attesa" +msgid "%1 Wait state(s)" +msgstr "%1 stati d'attesa" msgid "Type" msgstr "Tipo" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Nessuno" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Floppy %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Floppy %1 (%2): %3" msgid "Advanced sector images" msgstr "Immagini da settori avanzati" @@ -819,8 +819,8 @@ msgstr "Impossibile inizializzare Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Impossibile inizializzare GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Immagini MO" @@ -906,14 +906,14 @@ msgstr "Il filtraggio della tipologia di CPU è disabilitato per la macchina sel msgid "Continue" msgstr "Continua" -msgid "Cassette: %s" -msgstr "Cassetta: %s" +msgid "Cassette: %1" +msgstr "Cassetta: %1" msgid "Cassette images" msgstr "Immagini cassetta" -msgid "Cartridge %i: %ls" -msgstr "Cartuccia %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartuccia %1: %2" msgid "Cartridge images" msgstr "Immagini cartuccia" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Bus sconosciuto" msgid "Null Driver" msgstr "Driver nullo" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Comportamento di rendering" @@ -2046,8 +2046,8 @@ msgstr "Tubo denominato (Server)" msgid "Host Serial Passthrough" msgstr "Passaggio della porta seriale host" -msgid "Eject %s" -msgstr "Espelli %s" +msgid "E&ject %1" +msgstr "&Espelli %1" msgid "&Unmute" msgstr "&Riattiva l'audio" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 4ef8d01de..4bf10f7fc 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -642,8 +642,8 @@ msgstr "Ctrl+Alt+PgDnでウィンドウ モードに戻ります。" msgid "Speed" msgstr "速度" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIPイメージ" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "既定値" -msgid "%i Wait state(s)" -msgstr "%iつのウェイト ステート" +msgid "%1 Wait state(s)" +msgstr "%1つのウェイト ステート" msgid "Type" msgstr "タイプ" @@ -795,11 +795,11 @@ msgstr "Thrustmaster飛行制御システム" msgid "None" msgstr "なし" -msgid "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" msgstr "%u MB (CHS値: %i、%i、%i)" -msgid "Floppy %i (%s): %ls" -msgstr "フロッピー %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "フロッピー %1 (%2): %3" msgid "Advanced sector images" msgstr "アドバンスドセクターイメージ" @@ -819,8 +819,8 @@ msgstr "Ghostscriptが初期化できません" msgid "Unable to initialize GhostPCL" msgstr "GhostPCLが初期化できません" -msgid "MO %i (%ls): %ls" -msgstr "光磁気 %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "光磁気 %1 (%2): %3" msgid "MO images" msgstr "光磁気イメージ" @@ -906,14 +906,14 @@ msgstr "選択したマシンに基づくCPUタイプのフィルター機能は msgid "Continue" msgstr "続行" -msgid "Cassette: %s" -msgstr "カセット: %s" +msgid "Cassette: %1" +msgstr "カセット: %1" msgid "Cassette images" msgstr "カセットイメージ" -msgid "Cartridge %i: %ls" -msgstr "カートリッジ %i: %ls" +msgid "Cartridge %1: %2" +msgstr "カートリッジ %1: %2" msgid "Cartridge images" msgstr "カートリッジイメージ" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "不明なバス" msgid "Null Driver" msgstr "ヌル・ドライバー" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "レンダリング動作" @@ -2046,8 +2046,8 @@ msgstr "名前付きパイプ(サーバー)" msgid "Host Serial Passthrough" msgstr "ホストシリアルポートのパススルー" -msgid "Eject %s" -msgstr "%sを取り出す" +msgid "E&ject %1" +msgstr "%1を取り出す(&J)" msgid "&Unmute" msgstr "ミュート解除(&U)" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index e9e4b99e6..d6a0c234a 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -642,8 +642,8 @@ msgstr "Ctrl+Alt+PgDn 키를 누르면 창 모드로 전환합니다." msgid "Speed" msgstr "속도" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP 이미지" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "기본값" -msgid "%i Wait state(s)" -msgstr "%i 대기 상태" +msgid "%1 Wait state(s)" +msgstr "%1 대기 상태" msgid "Type" msgstr "형식" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "없음" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "플로피 %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "플로피 %1 (%2): %3" msgid "Advanced sector images" msgstr "어드밴스드 섹터 이미지" @@ -819,8 +819,8 @@ msgstr "Ghostscript를 초기화할 수 없습니다" msgid "Unable to initialize GhostPCL" msgstr "GhostPCL를 초기화할 수 없습니다" -msgid "MO %i (%ls): %ls" -msgstr "광자기 %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "광자기 %1 (%2): %3" msgid "MO images" msgstr "광자기 이미지" @@ -906,14 +906,14 @@ msgstr "이 에뮬레이트된 기종에 대해 선택한 기종을 기반으로 msgid "Continue" msgstr "계속" -msgid "Cassette: %s" -msgstr "카세트: %s" +msgid "Cassette: %1" +msgstr "카세트: %1" msgid "Cassette images" msgstr "카세트 이미지" -msgid "Cartridge %i: %ls" -msgstr "카트리지 %i: %ls" +msgid "Cartridge %1: %2" +msgstr "카트리지 %1: %2" msgid "Cartridge images" msgstr "카트리지 이미지" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "알 수 없는 버스" msgid "Null Driver" msgstr "Null 드라이버" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "렌더링 동작" @@ -2046,8 +2046,8 @@ msgstr "네임드 파이프(서버)" msgid "Host Serial Passthrough" msgstr "호스트 직렬 포트 패스스루" -msgid "Eject %s" -msgstr "%s 꺼내기" +msgid "E&ject %1" +msgstr "%1 꺼내기(&J)" msgid "&Unmute" msgstr "음소거 해제(&U)" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index f7d64a413..d57c389e1 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -642,8 +642,8 @@ msgstr "Druk op Ctrl+Alt+PgDn om terug te gaan naar de venstermodus." msgid "Speed" msgstr "Snelheid" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP-images" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Standaard" -msgid "%i Wait state(s)" -msgstr "%i Wachttoestand(en)" +msgid "%1 Wait state(s)" +msgstr "%1 Wachttoestand(en)" msgid "Type" msgstr "Type" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control systeem" msgid "None" msgstr "Geen" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Floppy %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Floppy %1 (%2): %3" msgid "Advanced sector images" msgstr "Geavanceerde sector-images" @@ -819,8 +819,8 @@ msgstr "Kan Ghostscript niet initialiseren" msgid "Unable to initialize GhostPCL" msgstr "Kan GhostPCL niet initialiseren" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "MO-images" @@ -906,14 +906,14 @@ msgstr "Filteren op CPU type voor de geselecteerde machine is niet mogelijk met msgid "Continue" msgstr "Doorgaan" -msgid "Cassette: %s" -msgstr "Cassette: %s" +msgid "Cassette: %1" +msgstr "Cassette: %1" msgid "Cassette images" msgstr "Cassette-images" -msgid "Cartridge %i: %ls" -msgstr "Cartridge %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartridge %1: %2" msgid "Cartridge images" msgstr "Cartridge-images" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Onbekende bus" msgid "Null Driver" msgstr "Null Driver" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Rendergedrag" @@ -2046,8 +2046,8 @@ msgstr "Named Pipe (Server)" msgid "Host Serial Passthrough" msgstr "Host seriële doorgave" -msgid "Eject %s" -msgstr "Uitwerpen %s" +msgid "E&ject %1" +msgstr "&Uitwerpen %1" msgid "&Unmute" msgstr "&Geluid aanzetten" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 3b29c3415..a72810b01 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -642,8 +642,8 @@ msgstr "Naciśnij klawisze Ctrl+Alt+PgDn aby wrócić to trybu okna." msgid "Speed" msgstr "Szybkość" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Obrazy ZIP" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Domyślny" -msgid "%i Wait state(s)" -msgstr "%i Stany oczekiwania" +msgid "%1 Wait state(s)" +msgstr "%1 Stany oczekiwania" msgid "Type" msgstr "Rodzaj" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Żaden" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Dyskietka %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Dyskietka %1 (%2): %3" msgid "Advanced sector images" msgstr "Zaawansowane obrazy sektorów" @@ -819,8 +819,8 @@ msgstr "Nie można zainicjować Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Nie można zainicjować GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Obrazy MO" @@ -906,14 +906,14 @@ msgstr "Wybór rodzaju procesora oparty na wybranej maszynie jest wyłączony dl msgid "Continue" msgstr "Kontynuuj" -msgid "Cassette: %s" -msgstr "Kaseta: %s" +msgid "Cassette: %1" +msgstr "Kaseta: %1" msgid "Cassette images" msgstr "Obrazy kaset" -msgid "Cartridge %i: %ls" -msgstr "Kartrydż %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Kartrydż %1: %2" msgid "Cartridge images" msgstr "Obrazy kartrydżu" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Nieznana magistrala" msgid "Null Driver" msgstr "Null Driver" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Zachowanie renderowania" @@ -2046,8 +2046,8 @@ msgstr "Nazwana rura (serwer)" msgid "Host Serial Passthrough" msgstr "Przejście przez port szeregowy hosta" -msgid "Eject %s" -msgstr "Wyjmij %s" +msgid "E&ject %1" +msgstr "W&yjmij %1" msgid "&Unmute" msgstr "&Wycisz" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 9f0370f5e..3535f63b9 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -642,8 +642,8 @@ msgstr "Use Ctrl+Alt+PgDn para retornar ao modo janela" msgid "Speed" msgstr "Velocidade" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Imagens ZIP" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Padrão" -msgid "%i Wait state(s)" -msgstr "%i estado(s) de espera" +msgid "%1 Wait state(s)" +msgstr "%1 estado(s) de espera" msgid "Type" msgstr "Tipo" @@ -795,11 +795,11 @@ msgstr "Sistema de Controle de Voo Thrustmaster" msgid "None" msgstr "Nenhum" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CCS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CCS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disquete %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disquete %1 (%2): %3" msgid "Advanced sector images" msgstr "Imagens de setor avançado" @@ -819,8 +819,8 @@ msgstr "Não foi possível inicializar o Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Não foi possível inicializar o GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "Magneto-óptico %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "Magneto-óptico %1 (%2): %3" msgid "MO images" msgstr "Imagens magneto-ópticas" @@ -906,14 +906,14 @@ msgstr "A filtragem do tipo de CPU baseada na máquina selecionada está desativ msgid "Continue" msgstr "Continuar" -msgid "Cassette: %s" -msgstr "Cassete: %s" +msgid "Cassette: %1" +msgstr "Cassete: %1" msgid "Cassette images" msgstr "Imagens de cassete" -msgid "Cartridge %i: %ls" -msgstr "Cartucho %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartucho %1: %2" msgid "Cartridge images" msgstr "Imagens de cartucho" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Barramento desconhecido" msgid "Null Driver" msgstr "Driver nulo" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Comportamento de renderização" @@ -2046,8 +2046,8 @@ msgstr "Tubo nomeado (servidor)" msgid "Host Serial Passthrough" msgstr "Passagem da porta serial do host" -msgid "Eject %s" -msgstr "Ejetar %s" +msgid "E&ject %1" +msgstr "E&jetar %1" msgid "&Unmute" msgstr "&Reativar som" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index f665424e0..ea6856347 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -642,8 +642,8 @@ msgstr "Pressione Ctrl+Alt+PgDn para voltar ao modo de janela." msgid "Speed" msgstr "Velocidade" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Imagens ZIP" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Padrão" -msgid "%i Wait state(s)" -msgstr "%i estado(s) de espera" +msgid "%1 Wait state(s)" +msgstr "%1 estado(s) de espera" msgid "Type" msgstr "Tipo" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Nenhum" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CCS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CCS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disquete %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disquete %1 (%2): %3" msgid "Advanced sector images" msgstr "Imagens avançadas de sector" @@ -819,8 +819,8 @@ msgstr "Não foi possível inicializar o Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Não foi possível inicializar o GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "Magneto-óptico %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "Magneto-óptico %1 (%2): %3" msgid "MO images" msgstr "Imagens magneto-ópticas" @@ -906,14 +906,14 @@ msgstr "A filtragem do tipo de CPU baseada na máquina escolhida está desativad msgid "Continue" msgstr "Continuar" -msgid "Cassette: %s" -msgstr "Cassete: %s" +msgid "Cassette: %1" +msgstr "Cassete: %1" msgid "Cassette images" msgstr "Imagens de cassete" -msgid "Cartridge %i: %ls" -msgstr "Cartucho %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartucho %1: %2" msgid "Cartridge images" msgstr "Imagens de cartucho" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Autocarro desconhecido" msgid "Null Driver" msgstr "Condutor nulo" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Comportamento de renderização" @@ -2046,8 +2046,8 @@ msgstr "Tubo nomeado (servidor)" msgid "Host Serial Passthrough" msgstr "Passagem da porta de série do anfitrião" -msgid "Eject %s" -msgstr "Ejetar %s" +msgid "E&ject %1" +msgstr "E&jetar %1" msgid "&Unmute" msgstr "&Reativar som" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 92542b70d..fd6a1d72a 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -642,8 +642,8 @@ msgstr "Нажмите Ctrl+Alt+PgDn для возврата в оконный msgid "Speed" msgstr "Скорость" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Образы ZIP" @@ -750,8 +750,8 @@ msgstr "КБ" msgid "Default" msgstr "По умолчанию" -msgid "%i Wait state(s)" -msgstr "%i WS" +msgid "%1 Wait state(s)" +msgstr "%1 WS" msgid "Type" msgstr "Тип" @@ -795,11 +795,11 @@ msgstr "Система управления полётом Thrustmaster" msgid "None" msgstr "Нет" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u МБ (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 МБ (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Дисковод %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Дисковод %1 (%2): %3" msgid "Advanced sector images" msgstr "Расширенные образы секторов" @@ -819,8 +819,8 @@ msgstr "Невозможно инициализировать Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Невозможно инициализировать GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "Магнитооптический %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "Магнитооптический %1 (%2): %3" msgid "MO images" msgstr "Образы магнитооптических дисков" @@ -906,14 +906,14 @@ msgstr "Выбор типов ЦП для этой системной платы msgid "Continue" msgstr "Продолжить" -msgid "Cassette: %s" -msgstr "Кассета: %s" +msgid "Cassette: %1" +msgstr "Кассета: %1" msgid "Cassette images" msgstr "Образы кассет" -msgid "Cartridge %i: %ls" -msgstr "Картридж %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Картридж %1: %2" msgid "Cartridge images" msgstr "Образы картриджей" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 КБ" @@ -1272,8 +1272,8 @@ msgstr "Неизвестная шина" msgid "Null Driver" msgstr "Нулевой драйвер" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Режим рендеринга" @@ -2046,8 +2046,8 @@ msgstr "Именованный пайп (Сервер)" msgid "Host Serial Passthrough" msgstr "Последовательный порт хоста" -msgid "Eject %s" -msgstr "Извлечь %s" +msgid "E&ject %1" +msgstr "И&звлечь %1" msgid "&Unmute" msgstr "В&ключить звук" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 1d8768dd8..b77ff5695 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -642,8 +642,8 @@ msgstr "Stlačte Ctrl+Alt+PgDn pre návrat z režimu celej obrazovky." msgid "Speed" msgstr "Rýchlosť" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Obrazy ZIP diskov" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Východiskové" -msgid "%i Wait state(s)" -msgstr "%i čakací stav(y)" +msgid "%1 Wait state(s)" +msgstr "%1 čakací stav(y)" msgid "Type" msgstr "Typ" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Žiadne" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disketová mechanika %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disketová mechanika %1 (%2): %3" msgid "Advanced sector images" msgstr "Rozšírené sektorové obrazy" @@ -819,8 +819,8 @@ msgstr "Nastala chyba pri inicializácii knižnice Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Nastala chyba pri inicializácii knižnice GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Obrazy MO" @@ -906,14 +906,14 @@ msgstr "Pre túto konfiguráciu bolo vypnuté filtrovanie procesorov podľa zvol msgid "Continue" msgstr "Pokračovať" -msgid "Cassette: %s" -msgstr "Kazeta: %s" +msgid "Cassette: %1" +msgstr "Kazeta: %1" msgid "Cassette images" msgstr "Kazetové nahrávky" -msgid "Cartridge %i: %ls" -msgstr "Cartridge %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Cartridge %1: %2" msgid "Cartridge images" msgstr "Obrazy cartridge" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Neznáma zbernica" msgid "Null Driver" msgstr "Nulový ovládač" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" @@ -2047,8 +2047,8 @@ msgstr "Pomenované potrubie (server)" msgid "Host Serial Passthrough" msgstr "Priechod sériového portu hostiteľa" -msgid "Eject %s" -msgstr "Vystrihnúť %s" +msgid "E&ject %1" +msgstr "&Vystrihnúť %1" msgid "&Unmute" msgstr "&Roztíšiť" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 0eeca62f8..9bedaa6cf 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -642,8 +642,8 @@ msgstr "Pritisnite Ctrl+Alt+PgDn za povratek iz celozaslonskega načina." msgid "Speed" msgstr "Hitrost" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP slike" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Privzeto" -msgid "%i Wait state(s)" -msgstr "%i stanj čakanja" +msgid "%1 Wait state(s)" +msgstr "%1 stanj čakanja" msgid "Type" msgstr "Vrsta" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Brez" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disketa %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disketa %1 (%2): %3" msgid "Advanced sector images" msgstr "Napredne sektorske slike" @@ -819,8 +819,8 @@ msgstr "Ghostscript-a ni bilo mogoče inicializirati" msgid "Unable to initialize GhostPCL" msgstr "GhostPCL-ja ni bilo mogoče inicializirati" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Slike MO" @@ -906,14 +906,14 @@ msgstr "Filtriranje vrste procesorja glede na izbran sistem je onemogočeno za t msgid "Continue" msgstr "Nadaljuj" -msgid "Cassette: %s" -msgstr "Kaseta: %s" +msgid "Cassette: %1" +msgstr "Kaseta: %1" msgid "Cassette images" msgstr "Slike kaset" -msgid "Cartridge %i: %ls" -msgstr "Spominski vložek %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Spominski vložek %1: %2" msgid "Cartridge images" msgstr "Slike spominskega vložka" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Neznano vodilo" msgid "Null Driver" msgstr "Ničelni gonilnik" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Obnašanje pri upodabljanju" @@ -2046,8 +2046,8 @@ msgstr "Poimenovana cev (Strežnik)" msgid "Host Serial Passthrough" msgstr "Prepustno serijskih vrat gostitelja" -msgid "Eject %s" -msgstr "Izvrzi %s" +msgid "E&ject %1" +msgstr "I&zvrzi %1" msgid "&Unmute" msgstr "&Vklopi zvok" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 41930bd96..5936f39c9 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -642,8 +642,8 @@ msgstr "Pencere moduna geri dönmek için Ctrl+Alt+PgDn tuşlarına basın." msgid "Speed" msgstr "Hız" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP imajları" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Varsayılan" -msgid "%i Wait state(s)" -msgstr "%i Bekleme durumları" +msgid "%1 Wait state(s)" +msgstr "%1 Bekleme durumları" msgid "Type" msgstr "Tür" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Hiçbiri" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Disket %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Disket %1 (%2): %3" msgid "Advanced sector images" msgstr "Gelişmiş sektör imajları" @@ -819,8 +819,8 @@ msgstr "Ghostscript başlatılamadı" msgid "Unable to initialize GhostPCL" msgstr "GhostPCL başlatılamadı" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "MO imajları" @@ -906,14 +906,14 @@ msgstr "Seçtiğiniz makineye uygun işlemci türü filtrelemesi bu emüle edile msgid "Continue" msgstr "Devam et" -msgid "Cassette: %s" -msgstr "Kaset: %s" +msgid "Cassette: %1" +msgstr "Kaset: %1" msgid "Cassette images" msgstr "Kaset imajları" -msgid "Cartridge %i: %ls" -msgstr "Kartuş %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Kartuş %1: %2" msgid "Cartridge images" msgstr "Kartuş imajları" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Bilinmeyen veri yolu" msgid "Null Driver" msgstr "Null sürücü" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "İşleyiş davranışı" @@ -2046,8 +2046,8 @@ msgstr "Adlandırılmış boru (Sunucu)" msgid "Host Serial Passthrough" msgstr "Ana bilgisayar seri port geçişi" -msgid "Eject %s" -msgstr "%s diskini çıkar" +msgid "E&ject %1" +msgstr "%1 diskini &çıkar" msgid "&Unmute" msgstr "&Sesi aç" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 4632d001b..36e227d6f 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -642,8 +642,8 @@ msgstr "Натисніть Ctrl+Alt+PgDn для повернення у віко msgid "Speed" msgstr "Швидкість" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Образи ZIP" @@ -750,8 +750,8 @@ msgstr "КБ" msgid "Default" msgstr "За замовчуванням" -msgid "%i Wait state(s)" -msgstr "%i WS" +msgid "%1 Wait state(s)" +msgstr "%1 WS" msgid "Type" msgstr "Тип" @@ -795,11 +795,11 @@ msgstr "Система управління польотом Thrustmaster" msgid "None" msgstr "Ні" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u МБ (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 МБ (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Дисковод %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Дисковод %1 (%2): %3" msgid "Advanced sector images" msgstr "Розширені образи секторів" @@ -819,8 +819,8 @@ msgstr "Неможливо ініціалізувати Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Неможливо ініціалізувати GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "Магнітооптичний %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "Магнітооптичний %1 (%2): %3" msgid "MO images" msgstr "Образи магнітооптичних дисків" @@ -906,14 +906,14 @@ msgstr "Вибір типів ЦП для цієї системної плати msgid "Continue" msgstr "Продовжити" -msgid "Cassette: %s" -msgstr "Касета: %s" +msgid "Cassette: %1" +msgstr "Касета: %1" msgid "Cassette images" msgstr "Образи касет" -msgid "Cartridge %i: %ls" -msgstr "Картридж %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Картридж %1: %2" msgid "Cartridge images" msgstr "Образи картриджів" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 КБ" @@ -1272,8 +1272,8 @@ msgstr "Невідома шина" msgid "Null Driver" msgstr "Нульовий драйвер" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Поведінка рендерингу" @@ -2046,8 +2046,8 @@ msgstr "Іменований пайп (сервер)" msgid "Host Serial Passthrough" msgstr "Пропуск послідовного порту хоста" -msgid "Eject %s" -msgstr "Вилучити %s" +msgid "E&ject %1" +msgstr "&Вилучити %1" msgid "&Unmute" msgstr "&Увімкнути звук" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index b8322d600..1d1a3697e 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -642,8 +642,8 @@ msgstr "Bấm Ctrl+Alt+PgDn để quay lại chế độ cửa sổ." msgid "Speed" msgstr "Vận tốc" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "Ảnh đĩa ZIP" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "Mặc định" -msgid "%i Wait state(s)" -msgstr "%i trạng thái chờ" +msgid "%1 Wait state(s)" +msgstr "%1 trạng thái chờ" msgid "Type" msgstr "Loại" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Không có" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "Đĩa mềm %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "Đĩa mềm %1 (%2): %3" msgid "Advanced sector images" msgstr "Ảnh (đĩa) sector nâng cao" @@ -819,8 +819,8 @@ msgstr "Không thể khởi tạo Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Không thể khởi tạo GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "MO %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" msgid "MO images" msgstr "Ảnh đĩa MO" @@ -906,14 +906,14 @@ msgstr "Phần chọn loại CPU dựa trên mẫu máy đã chọn bị vô hi msgid "Continue" msgstr "Tiếp tục" -msgid "Cassette: %s" -msgstr "Cassette: %s" +msgid "Cassette: %1" +msgstr "Cassette: %1" msgid "Cassette images" msgstr "Ảnh đĩa Cassette" -msgid "Cartridge %i: %ls" -msgstr "Băng cartridge %i: %ls" +msgid "Cartridge %1: %2" +msgstr "Băng cartridge %1: %2" msgid "Cartridge images" msgstr "Ảnh đĩa băng cartridge" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "CD-ROM %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "Bus không xác định" msgid "Null Driver" msgstr "Trình điều khiển NULL" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i ( %ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "Hành vi kết xuất" @@ -2046,8 +2046,8 @@ msgstr "Đường ống có tên (máy chủ)" msgid "Host Serial Passthrough" msgstr "Thông qua cổng serial của máy chủ" -msgid "Eject %s" -msgstr "Đẩy đĩa ra %s" +msgid "E&ject %1" +msgstr "Đẩy đĩ&a ra %1" msgid "&Unmute" msgstr "&Mở tiếng" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 32358584e..b39c64563 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -642,8 +642,8 @@ msgstr "按下 Ctrl+Alt+PgDn 返回到窗口模式。" msgid "Speed" msgstr "速度" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP 映像" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "默认" -msgid "%i Wait state(s)" -msgstr "%i 等待状态 (WS)" +msgid "%1 Wait state(s)" +msgstr "%1 等待状态 (WS)" msgid "Type" msgstr "类型" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "无" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "软盘 %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "软盘 %1 (%2): %3" msgid "Advanced sector images" msgstr "高级扇区映像" @@ -819,8 +819,8 @@ msgstr "无法初始化 Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "无法初始化 GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "磁光盘 %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "磁光盘 %1 (%2): %3" msgid "MO images" msgstr "磁光盘映像" @@ -906,14 +906,14 @@ msgstr "此模拟计算机禁用了基于选定计算机的 CPU 类型过滤。\ msgid "Continue" msgstr "继续" -msgid "Cassette: %s" -msgstr "磁带: %s" +msgid "Cassette: %1" +msgstr "磁带: %1" msgid "Cassette images" msgstr "磁带映像" -msgid "Cartridge %i: %ls" -msgstr "卡带 %i: %ls" +msgid "Cartridge %1: %2" +msgstr "卡带 %1: %2" msgid "Cartridge images" msgstr "卡带映像" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "光盘 %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "光盘 %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "未知总线" msgid "Null Driver" msgstr "空驱动程序" -msgid "NIC %02i (%ls) %ls" -msgstr "NIC %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" msgid "Render behavior" msgstr "渲染行为" @@ -2046,8 +2046,8 @@ msgstr "命名管道(服务器)" msgid "Host Serial Passthrough" msgstr "主机串行端口直通" -msgid "Eject %s" -msgstr "弹出 %s" +msgid "E&ject %1" +msgstr "弹出 %1(&J)" msgid "&Unmute" msgstr "解除静音(&U)" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 6b7420bc7..3526f696d 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -642,8 +642,8 @@ msgstr "按下 Ctrl+Alt+PgDn 返回到視窗模式。" msgid "Speed" msgstr "速度" -msgid "ZIP %03i %i (%s): %ls" -msgstr "ZIP %03i %i (%s): %ls" +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" msgid "ZIP images" msgstr "ZIP 映像" @@ -750,8 +750,8 @@ msgstr "KB" msgid "Default" msgstr "預設" -msgid "%i Wait state(s)" -msgstr "%i 等待狀態 (WS)" +msgid "%1 Wait state(s)" +msgstr "%1 等待狀態 (WS)" msgid "Type" msgstr "類型" @@ -795,11 +795,11 @@ msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "無" -msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %i (%s): %ls" -msgstr "軟碟 %i (%s): %ls" +msgid "Floppy %1 (%2): %3" +msgstr "軟碟 %1 (%2): %3" msgid "Advanced sector images" msgstr "進階磁區映像" @@ -819,8 +819,8 @@ msgstr "無法初始化 Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "無法初始化 GhostPCL" -msgid "MO %i (%ls): %ls" -msgstr "磁光碟 %i (%ls): %ls" +msgid "MO %1 (%2): %3" +msgstr "磁光碟 %1 (%2): %3" msgid "MO images" msgstr "磁光碟映像" @@ -906,14 +906,14 @@ msgstr "此模擬電腦停用了基於選定電腦的 CPU 類型過濾。\n\n能 msgid "Continue" msgstr "繼續" -msgid "Cassette: %s" -msgstr "磁帶: %s" +msgid "Cassette: %1" +msgstr "磁帶: %1" msgid "Cassette images" msgstr "磁帶映像" -msgid "Cartridge %i: %ls" -msgstr "卡帶 %i: %ls" +msgid "Cartridge %1: %2" +msgstr "卡帶 %1: %2" msgid "Cartridge images" msgstr "卡帶映像" @@ -1080,8 +1080,8 @@ msgstr "IDE" msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %i (%s): %s" -msgstr "光碟 %i (%s): %s" +msgid "CD-ROM %1 (%2): %3" +msgstr "光碟 %1 (%2): %3" msgid "160 KB" msgstr "160 KB" @@ -1272,8 +1272,8 @@ msgstr "未知匯流排" msgid "Null Driver" msgstr "空驅動程式" -msgid "NIC %02i (%ls) %ls" -msgstr "網路卡 %02i (%ls) %ls" +msgid "NIC %1 (%2) %3" +msgstr "網路卡 %1 (%2) %3" msgid "Render behavior" msgstr "渲染行為" @@ -2046,8 +2046,8 @@ msgstr "已命名管道 (伺服器)" msgid "Host Serial Passthrough" msgstr "主機序列埠的直通" -msgid "Eject %s" -msgstr "退出 %s" +msgid "E&ject %1" +msgstr "退出 %1(&J)" msgid "&Unmute" msgstr "解除靜音(&U)" diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index 2acaaeacc..9e5563536 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -77,8 +77,7 @@ HarddiskDialog::HarddiskDialog(bool existing, QWidget *parent) for (int i = 0; i < 127; i++) { uint64_t size = ((uint64_t) hdd_table[i][0]) * hdd_table[i][1] * hdd_table[i][2]; uint32_t size_mb = size >> 11LL; - // QString text = QString("%1 MiB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]); - QString text = QString::asprintf(tr("%u MB (CHS: %i, %i, %i)").toUtf8().constData(), size_mb, (hdd_table[i][0]), (hdd_table[i][1]), (hdd_table[i][2])); + QString text = tr("%1 MB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]); Models::AddEntry(model, text, i); } Models::AddEntry(model, tr("Custom..."), 127); diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 478f64c2a..3e7c84ca7 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -93,7 +93,7 @@ MediaMenu::refresh(QMenu *parentMenu) cassetteMenu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { cassetteImageHistoryPos[slot] = cassetteMenu->children().count(); - cassetteMenu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false); + cassetteMenu->addAction(tr("Image %1").arg(slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false); } cassetteMenu->addSeparator(); cassetteRecordPos = cassetteMenu->children().count(); @@ -118,7 +118,7 @@ MediaMenu::refresh(QMenu *parentMenu) menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { cartridgeImageHistoryPos[slot] = menu->children().count(); - menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false); + menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false); } menu->addSeparator(); cartridgeEjectPos = menu->children().count(); @@ -138,7 +138,7 @@ MediaMenu::refresh(QMenu *parentMenu) menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { floppyImageHistoryPos[slot] = menu->children().count(); - menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { floppyMenuSelect(i, slot); })->setCheckable(false); + menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { floppyMenuSelect(i, slot); })->setCheckable(false); } menu->addSeparator(); floppyExportPos = menu->children().count(); @@ -161,7 +161,7 @@ MediaMenu::refresh(QMenu *parentMenu) menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { cdromImageHistoryPos[slot] = menu->children().count(); - menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { cdromReload(i, slot); })->setCheckable(false); + menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { cdromReload(i, slot); })->setCheckable(false); } menu->addSeparator(); #ifdef Q_OS_WINDOWS @@ -191,7 +191,7 @@ MediaMenu::refresh(QMenu *parentMenu) menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { zipImageHistoryPos[slot] = menu->children().count(); - menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false); + menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false); } menu->addSeparator(); zipEjectPos = menu->children().count(); @@ -210,7 +210,7 @@ MediaMenu::refresh(QMenu *parentMenu) menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { moImageHistoryPos[slot] = menu->children().count(); - menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false); + menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false); } menu->addSeparator(); moEjectPos = menu->children().count(); @@ -323,8 +323,7 @@ MediaMenu::cassetteUpdateMenu() recordMenu->setChecked(isSaving); playMenu->setChecked(!isSaving); - cassetteMenu->setTitle(QString::asprintf(tr("Cassette: %s").toUtf8().constData(), - (name.isEmpty() ? tr("(empty)") : name).toUtf8().constData())); + cassetteMenu->setTitle(tr("Cassette: %1").arg(name.isEmpty() ? tr("(empty)") : name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { updateImageHistory(0, slot, ui::MediaType::Cassette); @@ -389,8 +388,7 @@ MediaMenu::cartridgeUpdateMenu(int i) auto childs = menu->children(); auto *ejectMenu = dynamic_cast(childs[cartridgeEjectPos]); ejectMenu->setEnabled(!name.isEmpty()); - // menu->setTitle(tr("Cartridge %1: %2").arg(QString::number(i+1), name.isEmpty() ? tr("(empty)") : name)); - menu->setTitle(QString::asprintf(tr("Cartridge %i: %ls").toUtf8().constData(), i + 1, name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data())); + menu->setTitle(tr("Cartridge %1: %2").arg(QString::number(i + 1), name.isEmpty() ? tr("(empty)") : name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { updateImageHistory(i, slot, ui::MediaType::Cartridge); @@ -491,7 +489,7 @@ MediaMenu::floppyUpdateMenu(int i) auto *ejectMenu = dynamic_cast(childs[floppyEjectPos]); auto *exportMenu = dynamic_cast(childs[floppyExportPos]); ejectMenu->setEnabled(!name.isEmpty()); - ejectMenu->setText(QString::asprintf(tr("Eject %s").toUtf8().constData(), name.isEmpty() ? QString().toUtf8().constData() : fi.fileName().toUtf8().constData())); + ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName())); exportMenu->setEnabled(!name.isEmpty()); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { @@ -499,8 +497,8 @@ MediaMenu::floppyUpdateMenu(int i) } int type = fdd_get_type(i); - // floppyMenus[i]->setTitle(tr("Floppy %1 (%2): %3").arg(QString::number(i+1), fdd_getname(type), name.isEmpty() ? tr("(empty)") : name)); - floppyMenus[i]->setTitle(QString::asprintf(tr("Floppy %i (%s): %ls").toUtf8().constData(), i + 1, fdd_getname(type), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data())); + floppyMenus[i]->setTitle(tr("Floppy %1 (%2): %3").arg(QString::number(i + 1), fdd_getname(type), name.isEmpty() ? tr("(empty)") : name)); + } void @@ -749,7 +747,7 @@ MediaMenu::cdromUpdateMenu(int i) menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico"); } imageMenu->setIcon(menu_icon); - imageMenu->setText(QString::asprintf(tr("Eject %s").toUtf8().constData(), menu_item_name.toUtf8().constData())); + imageMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(menu_item_name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) updateImageHistory(i, slot, ui::MediaType::Optical); @@ -769,8 +767,7 @@ MediaMenu::cdromUpdateMenu(int i) break; } - // menu->setTitle(tr("CD-ROM %1 (%2): %3").arg(QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name)); - menu->setTitle(QString::asprintf(tr("CD-ROM %i (%s): %s").toUtf8().constData(), i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toUtf8().data() : name2.toUtf8().data())); + menu->setTitle(tr("CD-ROM %1 (%2): %3").arg(QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name2)); } void @@ -899,8 +896,7 @@ MediaMenu::zipUpdateMenu(int i) break; } - // menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? "250" : "100", QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name)); - menu->setTitle(QString::asprintf(tr("ZIP %03i %i (%s): %ls").toUtf8().constData(), (zip_drives[i].is_250 > 0) ? 250 : 100, i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data())); + menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? QString("250") : QString("100"), QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) updateImageHistory(i, slot, ui::MediaType::Zip); @@ -1035,7 +1031,7 @@ MediaMenu::moUpdateMenu(int i) break; } - menu->setTitle(QString::asprintf(tr("MO %i (%ls): %ls").toUtf8().constData(), i + 1, busName.toStdU16String().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data())); + menu->setTitle(tr("MO %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) updateImageHistory(i, slot, ui::MediaType::Mo); @@ -1087,7 +1083,7 @@ MediaMenu::nicUpdateMenu(int i) auto *connectedAction = dynamic_cast(childs[netDisconnPos]); connectedAction->setChecked(network_is_connected(i)); - menu->setTitle(QString::asprintf(tr("NIC %02i (%ls) %ls").toUtf8().constData(), i + 1, netType.toStdU16String().data(), devName.toStdU16String().data())); + menu->setTitle(tr("NIC %1 (%2) %3").arg(QString::number(i + 1), netType, devName)); } QString diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index 34968b288..939cd9eb2 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -69,7 +69,7 @@ SettingsMachine::SettingsMachine(QWidget *parent) waitStatesModel->setData(idx, 0, Qt::UserRole); for (int i = 0; i < 8; ++i) { idx = waitStatesModel->index(i + 1, 0); - waitStatesModel->setData(idx, QString::asprintf(tr("%i Wait state(s)").toUtf8().constData(), i), Qt::DisplayRole); + waitStatesModel->setData(idx, tr("%1 Wait state(s)").arg(i), Qt::DisplayRole); waitStatesModel->setData(idx, i + 1, Qt::UserRole); } From 1819539c976659fb5ba24bd32be5e5d39ad9f8df Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 11 Apr 2025 05:16:39 +0500 Subject: [PATCH 098/118] qt: Make filename/path display consistent across media menus - All media history entries now display the full path - All "Eject" menu items now display the file name --- src/qt/languages/86box.pot | 5 +---- src/qt/languages/ca-ES.po | 7 ++----- src/qt/languages/cs-CZ.po | 7 ++----- src/qt/languages/de-DE.po | 7 ++----- src/qt/languages/es-ES.po | 7 ++----- src/qt/languages/fi-FI.po | 7 ++----- src/qt/languages/fr-FR.po | 7 ++----- src/qt/languages/hr-HR.po | 7 ++----- src/qt/languages/hu-HU.po | 7 ++----- src/qt/languages/it-IT.po | 7 ++----- src/qt/languages/ja-JP.po | 7 ++----- src/qt/languages/ko-KR.po | 7 ++----- src/qt/languages/nl-NL.po | 7 ++----- src/qt/languages/pl-PL.po | 7 ++----- src/qt/languages/pt-BR.po | 7 ++----- src/qt/languages/pt-PT.po | 7 ++----- src/qt/languages/ru-RU.po | 7 ++----- src/qt/languages/sk-SK.po | 7 ++----- src/qt/languages/sl-SI.po | 7 ++----- src/qt/languages/tr-TR.po | 7 ++----- src/qt/languages/uk-UA.po | 7 ++----- src/qt/languages/vi-VN.po | 7 ++----- src/qt/languages/zh-CN.po | 7 ++----- src/qt/languages/zh-TW.po | 7 ++----- src/qt/qt_mediamenu.cpp | 43 ++++++++++++++++++++++---------------- src/qt/qt_mediamenu.hpp | 3 +-- 26 files changed, 73 insertions(+), 139 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index a778f9f6d..07dfb7cc5 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -249,7 +249,7 @@ msgstr "" msgid "E&mpty" msgstr "" -msgid "&Reload previous image" +msgid "Reload previous image" msgstr "" msgid "&Folder..." @@ -1260,9 +1260,6 @@ msgstr "" msgid "Create..." msgstr "" -msgid "previous image" -msgstr "" - msgid "Host CD/DVD Drive (%1)" msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 808799859..dc0a9df2a 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -249,8 +249,8 @@ msgstr "&Silenciar" msgid "E&mpty" msgstr "E&xtreure disc" -msgid "&Reload previous image" -msgstr "&Recarregar imatge anterior" +msgid "Reload previous image" +msgstr "Recarregar imatge anterior" msgid "&Folder..." msgstr "&Carpeta ..." @@ -1260,9 +1260,6 @@ msgstr "Esborrar la història de imatges" msgid "Create..." msgstr "Crear ..." -msgid "previous image" -msgstr "imatge anterior" - msgid "Host CD/DVD Drive (%1)" msgstr "Unitat CD/DVD d'amfitrió (%1)" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index d3985b67a..7e76d3760 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -249,8 +249,8 @@ msgstr "&Ztišit" msgid "E&mpty" msgstr "&Vyjmout" -msgid "&Reload previous image" -msgstr "&Načíst znova předchozí obraz" +msgid "Reload previous image" +msgstr "Načíst znova předchozí obraz" msgid "&Folder..." msgstr "&Složka..." @@ -1260,9 +1260,6 @@ msgstr "Vymaž historie snímků" msgid "Create..." msgstr "Vytvoř..." -msgid "previous image" -msgstr "předchozí obraz" - msgid "Host CD/DVD Drive (%1)" msgstr "Jednotka CD/DVD hostitele (%1)" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 781269af9..f545729a8 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -249,8 +249,8 @@ msgstr "&Stummschalten" msgid "E&mpty" msgstr "L&eer" -msgid "&Reload previous image" -msgstr "&Voriges Abbild neu laden" +msgid "Reload previous image" +msgstr "Voriges Abbild neu laden" msgid "&Folder..." msgstr "&Verzeichnis..." @@ -1263,9 +1263,6 @@ msgstr "Abbildverlauf löschen" msgid "Create..." msgstr "Erstellen..." -msgid "previous image" -msgstr "Vorheriges Abbild" - msgid "Host CD/DVD Drive (%1)" msgstr "Host-CD/DVD-Laufwerk (%1)" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 3cdcedd98..0733f46ec 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -249,8 +249,8 @@ msgstr "&Silenciar" msgid "E&mpty" msgstr "E&xtraer disco" -msgid "&Reload previous image" -msgstr "&Recargar imagen previa" +msgid "Reload previous image" +msgstr "Recargar imagen previa" msgid "&Folder..." msgstr "&Carpeta..." @@ -1259,9 +1259,6 @@ msgstr "Eliminar historia de imágenes" msgid "Create..." msgstr "Crear..." -msgid "previous image" -msgstr "imagen previa" - msgid "Host CD/DVD Drive (%1)" msgstr "Unidad de CD/DVD anfitriona (%1)" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index ddae5c2ba..a7ac64eff 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -249,8 +249,8 @@ msgstr "&Mykistä" msgid "E&mpty" msgstr "&Tyhjä" -msgid "&Reload previous image" -msgstr "&Lataa edellinen levykuva uudelleen" +msgid "Reload previous image" +msgstr "Lataa edellinen levykuva uudelleen" msgid "&Folder..." msgstr "&Kansio..." @@ -1260,9 +1260,6 @@ msgstr "Tyhjennä kuvahistoria" msgid "Create..." msgstr "Luo..." -msgid "previous image" -msgstr "edellinen levykuva" - msgid "Host CD/DVD Drive (%1)" msgstr "Isäntä CD/DVD-asema (%1)" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index df5bf7ef6..434e8c31b 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -249,8 +249,8 @@ msgstr "&Couper" msgid "E&mpty" msgstr "E&jecter" -msgid "&Reload previous image" -msgstr "&Recharger image précedente" +msgid "Reload previous image" +msgstr "Recharger image précedente" msgid "&Folder..." msgstr "&Dossier..." @@ -1260,9 +1260,6 @@ msgstr "Effacer l'historique de l'image" msgid "Create..." msgstr "Créer..." -msgid "previous image" -msgstr "image précedente" - msgid "Host CD/DVD Drive (%1)" msgstr "Lecteur CD/DVD hôte (%1)" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index ecfd0c696..b202b39b5 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -249,8 +249,8 @@ msgstr "&Isključi zvuk" msgid "E&mpty" msgstr "&Prazno" -msgid "&Reload previous image" -msgstr "&Ponovo učitaj prethodnu sliku" +msgid "Reload previous image" +msgstr "Ponovo učitaj prethodnu sliku" msgid "&Folder..." msgstr "&Mapa..." @@ -1260,9 +1260,6 @@ msgstr "Očisti povijest slika" msgid "Create..." msgstr "Stvori..." -msgid "previous image" -msgstr "prethodna slika" - msgid "Host CD/DVD Drive (%1)" msgstr "CD/DVD pogon nositelja (%1)" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 79e0dd5e6..e9aa6a4ff 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -249,8 +249,8 @@ msgstr "&Némítás" msgid "E&mpty" msgstr "&Kiadás" -msgid "&Reload previous image" -msgstr "Előző képfájl &újratöltése" +msgid "Reload previous image" +msgstr "Előző képfájl újratöltése" msgid "&Folder..." msgstr "&Mappa..." @@ -1260,9 +1260,6 @@ msgstr "Törölje a kép előzményeit" msgid "Create..." msgstr "Hozzon létre..." -msgid "previous image" -msgstr "előző képfájl" - msgid "Host CD/DVD Drive (%1)" msgstr "Gazdag CD/DVD-meghajtó (%1)" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 832c5b3fc..2f31a9dba 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -249,8 +249,8 @@ msgstr "&Muto" msgid "E&mpty" msgstr "&Espelli" -msgid "&Reload previous image" -msgstr "&Ricarica l'immagine precedente" +msgid "Reload previous image" +msgstr "Ricarica l'immagine precedente" msgid "&Folder..." msgstr "&Cartella..." @@ -1260,9 +1260,6 @@ msgstr "Cancella la cronologia delle immagini" msgid "Create..." msgstr "Creare..." -msgid "previous image" -msgstr "immagine precedente" - msgid "Host CD/DVD Drive (%1)" msgstr "Unità CD/DVD host (%1)" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 4bf10f7fc..318d0dca5 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -249,8 +249,8 @@ msgstr "ミュート(&M)" msgid "E&mpty" msgstr "なし(&M)" -msgid "&Reload previous image" -msgstr "前のイメージを再読み込み(&R)" +msgid "Reload previous image" +msgstr "前のイメージを再読み込み" msgid "&Folder..." msgstr "フォルダ(&F)..." @@ -1260,9 +1260,6 @@ msgstr "クリア画像履歴" msgid "Create..." msgstr "作成..." -msgid "previous image" -msgstr "前の画像" - msgid "Host CD/DVD Drive (%1)" msgstr "ホスト CD/DVD ドライブ (%1)" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index d6a0c234a..027c5a778 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -249,8 +249,8 @@ msgstr "음소거(&M)" msgid "E&mpty" msgstr "비었음(&M)" -msgid "&Reload previous image" -msgstr "이전 이미지 다시 불러오기(&R)" +msgid "Reload previous image" +msgstr "이전 이미지 다시 불러오기" msgid "&Folder..." msgstr "폴더(&F)..." @@ -1260,9 +1260,6 @@ msgstr "이미지 기록 지우기" msgid "Create..." msgstr "만들기..." -msgid "previous image" -msgstr "이전 이미지" - msgid "Host CD/DVD Drive (%1)" msgstr "호스트 CD/DVD 드라이브 (%1)" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index d57c389e1..65e589b2b 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -249,8 +249,8 @@ msgstr "&Mute" msgid "E&mpty" msgstr "E&mpty" -msgid "&Reload previous image" -msgstr "&Herlaad vorige image" +msgid "Reload previous image" +msgstr "Herlaad vorige image" msgid "&Folder..." msgstr "&Map..." @@ -1260,9 +1260,6 @@ msgstr "Imagegeschiedenis verwijderen" msgid "Create..." msgstr "Creëer..." -msgid "previous image" -msgstr "vorige image" - msgid "Host CD/DVD Drive (%1)" msgstr "Host CD/DVD-station (%1)" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index a72810b01..4e93f9dd1 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -249,8 +249,8 @@ msgstr "&Ścisz" msgid "E&mpty" msgstr "P&usty" -msgid "&Reload previous image" -msgstr "&Przeładuj poprzedni obraz" +msgid "Reload previous image" +msgstr "Przeładuj poprzedni obraz" msgid "&Folder..." msgstr "&Teczka..." @@ -1260,9 +1260,6 @@ msgstr "Wyczyść historię obrazów" msgid "Create..." msgstr "Stwórz..." -msgid "previous image" -msgstr "poprzedni obraz" - msgid "Host CD/DVD Drive (%1)" msgstr "Napęd CD/DVD hosta (%1)" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 3535f63b9..3e0ec7ff1 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -249,8 +249,8 @@ msgstr "&Silenciar" msgid "E&mpty" msgstr "&Vazio" -msgid "&Reload previous image" -msgstr "&Recarregar imagem anterior" +msgid "Reload previous image" +msgstr "Recarregar imagem anterior" msgid "&Folder..." msgstr "&Pasta..." @@ -1260,9 +1260,6 @@ msgstr "Limpar histórico de imagens" msgid "Create..." msgstr "Criar..." -msgid "previous image" -msgstr "imagem anterior" - msgid "Host CD/DVD Drive (%1)" msgstr "Unidade de CD/DVD do anfitrião (%1)" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index ea6856347..9fb1ce342 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -249,8 +249,8 @@ msgstr "&Desativar som" msgid "E&mpty" msgstr "&CDROM vazio" -msgid "&Reload previous image" -msgstr "&Recarregar imagem anterior" +msgid "Reload previous image" +msgstr "Recarregar imagem anterior" msgid "&Folder..." msgstr "&Pasta..." @@ -1260,9 +1260,6 @@ msgstr "Limpar o histórico de imagens" msgid "Create..." msgstr "Criar..." -msgid "previous image" -msgstr "imagem anterior" - msgid "Host CD/DVD Drive (%1)" msgstr "Unidade de CD/DVD do anfitrião (%1)" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index fd6a1d72a..725f7adf6 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -249,8 +249,8 @@ msgstr "О&тключить звук" msgid "E&mpty" msgstr "П&устой" -msgid "&Reload previous image" -msgstr "&Снова загрузить предыдущий образ" +msgid "Reload previous image" +msgstr "Загрузить предыдущий образ" msgid "&Folder..." msgstr "&Папка..." @@ -1260,9 +1260,6 @@ msgstr "Очистить историю образов" msgid "Create..." msgstr "Создайте..." -msgid "previous image" -msgstr "предыдущее изображение" - msgid "Host CD/DVD Drive (%1)" msgstr "Главный CD/DVD-привод (%1)" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index b77ff5695..937b067fe 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -249,8 +249,8 @@ msgstr "&Stíšiť" msgid "E&mpty" msgstr "&Vystrihnúť" -msgid "&Reload previous image" -msgstr "&Načítať znova predchádzajúci obraz" +msgid "Reload previous image" +msgstr "Načítať znova predchádzajúci obraz" msgid "&Folder..." msgstr "&Zložka..." @@ -1260,9 +1260,6 @@ msgstr "Vymazanie histórie obrázkov" msgid "Create..." msgstr "Vytvorte..." -msgid "previous image" -msgstr "predchádzajúca snímka" - msgid "Host CD/DVD Drive (%1)" msgstr "Hostiteľská jednotka CD/DVD (%1)" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 9bedaa6cf..b28954b19 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -249,8 +249,8 @@ msgstr "&Utišaj" msgid "E&mpty" msgstr "&Prazen" -msgid "&Reload previous image" -msgstr "&Naloži zadnjo sliko" +msgid "Reload previous image" +msgstr "Naloži zadnjo sliko" msgid "&Folder..." msgstr "&Mapa..." @@ -1260,9 +1260,6 @@ msgstr "Jasna zgodovina slik" msgid "Create..." msgstr "Ustvari..." -msgid "previous image" -msgstr "zadnja slika" - msgid "Host CD/DVD Drive (%1)" msgstr "Pogon CD/DVD gostitelja (%1)" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 5936f39c9..54bdac06e 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -249,8 +249,8 @@ msgstr "&Sesi kapat" msgid "E&mpty" msgstr "İmajı &çıkar" -msgid "&Reload previous image" -msgstr "&Önceki imajı yeniden seç" +msgid "Reload previous image" +msgstr "Önceki imajı yeniden seç" msgid "&Folder..." msgstr "&Klasör..." @@ -1260,9 +1260,6 @@ msgstr "İmaj geçmişini temizleyin" msgid "Create..." msgstr "Oluştur..." -msgid "previous image" -msgstr "önceki imaj" - msgid "Host CD/DVD Drive (%1)" msgstr "Ana bilgisayar CD/DVD sürücüsü (%1)" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 36e227d6f..b78bb0661 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -249,8 +249,8 @@ msgstr "&Відключити звук" msgid "E&mpty" msgstr "&Пустий" -msgid "&Reload previous image" -msgstr "&Знову завантажити попередній образ" +msgid "Reload previous image" +msgstr "Знову завантажити попередній образ" msgid "&Folder..." msgstr "&Тека..." @@ -1260,9 +1260,6 @@ msgstr "Очистити історію образів" msgid "Create..." msgstr "Створити..." -msgid "previous image" -msgstr "попередній образ" - msgid "Host CD/DVD Drive (%1)" msgstr "CD/DVD привід хоста (%1)" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 1d1a3697e..e4b15a971 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -249,8 +249,8 @@ msgstr "Tắt tiến&g" msgid "E&mpty" msgstr "Làm trố&ng đĩa" -msgid "&Reload previous image" -msgstr "Load đĩ&a trước đó" +msgid "Reload previous image" +msgstr "Load đĩa trước đó" msgid "&Folder..." msgstr "Thư mụ&c" @@ -1260,9 +1260,6 @@ msgstr "Xóa lịch sử ảnh đĩa" msgid "Create..." msgstr "Tạo..." -msgid "previous image" -msgstr "đĩa trước đó" - msgid "Host CD/DVD Drive (%1)" msgstr "Máy chủ CD/DVD Drive (%1)" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index b39c64563..b02f41bbb 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -249,8 +249,8 @@ msgstr "静音(&M)" msgid "E&mpty" msgstr "空置驱动器(&M)" -msgid "&Reload previous image" -msgstr "载入上一个映像(&R)" +msgid "Reload previous image" +msgstr "载入上一个映像" msgid "&Folder..." msgstr "文件夹(&F)..." @@ -1260,9 +1260,6 @@ msgstr "清除映像历史记录" msgid "Create..." msgstr "创建..." -msgid "previous image" -msgstr "上一张" - msgid "Host CD/DVD Drive (%1)" msgstr "主机 CD/DVD 驱动器 (%1)" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 3526f696d..2662770b8 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -249,8 +249,8 @@ msgstr "靜音(&M)" msgid "E&mpty" msgstr "空置光碟機(&M)" -msgid "&Reload previous image" -msgstr "載入上一個映像(&R)" +msgid "Reload previous image" +msgstr "載入上一個映像" msgid "&Folder..." msgstr "資料夾(&F)..." @@ -1260,9 +1260,6 @@ msgstr "清除映像歷史記錄" msgid "Create..." msgstr "建立..." -msgid "previous image" -msgstr "上一個映像" - msgid "Host CD/DVD Drive (%1)" msgstr "主機 CD/DVD 光碟機 (%1)" diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 3e7c84ca7..351012d1e 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -174,8 +174,7 @@ MediaMenu::refresh(QMenu *parentMenu) } menu->addSeparator(); #endif // Q_OS_WINDOWS - cdromImagePos = menu->children().count(); - cdromDirPos = menu->children().count(); + cdromEjectPos = menu->children().count(); menu->addAction(tr("E&ject"), [this, i]() { cdromEject(i); })->setCheckable(false); cdromMenus[i] = menu; cdromUpdateMenu(i); @@ -304,7 +303,8 @@ MediaMenu::cassetteEject() void MediaMenu::cassetteUpdateMenu() { - QString name = cassette_fname; + QString name = cassette_fname; + QFileInfo fi(cassette_fname); const QString mode = cassette_mode; auto childs = cassetteMenu->children(); auto *recordMenu = dynamic_cast(childs[cassetteRecordPos]); @@ -318,6 +318,7 @@ MediaMenu::cassetteUpdateMenu() rewindMenu->setEnabled(!name.isEmpty()); fastFwdMenu->setEnabled(!name.isEmpty()); ejectMenu->setEnabled(!name.isEmpty()); + ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName())); const bool isSaving = (mode == QStringLiteral("save")); recordMenu->setChecked(isSaving); @@ -384,10 +385,12 @@ void MediaMenu::cartridgeUpdateMenu(int i) { const QString name = cart_fns[i]; - auto *menu = cartridgeMenus[i]; + QFileInfo fi(cart_fns[i]); + auto *menu = cartridgeMenus[i]; auto childs = menu->children(); auto *ejectMenu = dynamic_cast(childs[cartridgeEjectPos]); ejectMenu->setEnabled(!name.isEmpty()); + ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName())); menu->setTitle(tr("Cartridge %1: %2").arg(QString::number(i + 1), name.isEmpty() ? tr("(empty)") : name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { @@ -628,7 +631,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) switch (type) { default: - menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; return; case ui::MediaType::Cassette: if (!MachineStatus::hasCassette()) @@ -637,7 +640,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[cassetteImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; break; case ui::MediaType::Cartridge: if (!machine_has_cartridge(machine)) @@ -646,7 +649,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[cartridgeImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; break; case ui::MediaType::Floppy: if (!floppyMenus.contains(index)) @@ -655,7 +658,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[floppyImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; break; case ui::MediaType::Optical: if (!cdromMenus.contains(index)) @@ -673,7 +676,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) } else { fi.setFile(fn); menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico"); - menu_item_name = fn.isEmpty() ? tr("previous image") : fn; + menu_item_name = fn.isEmpty() ? tr("Reload previous image") : fn; } imageHistoryUpdatePos->setIcon(menu_icon); break; @@ -684,7 +687,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[zipImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; break; case ui::MediaType::Mo: if (!moMenus.contains(index)) @@ -693,7 +696,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[moImageHistoryPos[slot]]); fi.setFile(fn); - menu_item_name = fi.fileName().isEmpty() ? tr("previous image") : fi.fileName(); + menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn; break; } @@ -728,8 +731,8 @@ MediaMenu::cdromUpdateMenu(int i) muteMenu->setIcon(QIcon((cdrom[i].sound_on == 0) ? ":/settings/qt/icons/cdrom_unmute.ico" : ":/settings/qt/icons/cdrom_mute.ico")); muteMenu->setText((cdrom[i].sound_on == 0) ? tr("&Unmute") : tr("&Mute")); - auto *imageMenu = dynamic_cast(childs[cdromImagePos]); - imageMenu->setEnabled(!name.isEmpty()); + auto *ejectMenu = dynamic_cast(childs[cdromEjectPos]); + ejectMenu->setEnabled(!name.isEmpty()); QString menu_item_name; if (name.left(8) == "ioctl://") { #ifdef Q_OS_WINDOWS @@ -742,12 +745,12 @@ MediaMenu::cdromUpdateMenu(int i) } else { QFileInfo fi(cdrom[i].image_path); - menu_item_name = name.isEmpty() ? QString() : name; + menu_item_name = name.isEmpty() ? QString() : fi.fileName(); name2 = name; menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico"); } - imageMenu->setIcon(menu_icon); - imageMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(menu_item_name)); + ejectMenu->setIcon(menu_icon); + ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(menu_item_name)); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) updateImageHistory(i, slot, ui::MediaType::Optical); @@ -876,6 +879,7 @@ MediaMenu::zipUpdateMenu(int i) { const QString name = zip_drives[i].image_path; const QString prev_name = zip_drives[i].prev_image_path; + QFileInfo fi(zip_drives[i].image_path); if (!zipMenus.contains(i)) return; auto *menu = zipMenus[i]; @@ -883,6 +887,7 @@ MediaMenu::zipUpdateMenu(int i) auto *ejectMenu = dynamic_cast(childs[zipEjectPos]); ejectMenu->setEnabled(!name.isEmpty()); + ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName())); QString busName = tr("Unknown Bus"); switch (zip_drives[i].bus_type) { @@ -1009,8 +1014,9 @@ MediaMenu::moReload(int index, int slot) void MediaMenu::moUpdateMenu(int i) { - QString name = mo_drives[i].image_path; - QString prev_name = mo_drives[i].prev_image_path; + QString name = mo_drives[i].image_path; + QString prev_name = mo_drives[i].prev_image_path; + QFileInfo fi(mo_drives[i].image_path); if (!moMenus.contains(i)) return; auto *menu = moMenus[i]; @@ -1018,6 +1024,7 @@ MediaMenu::moUpdateMenu(int i) auto *ejectMenu = dynamic_cast(childs[moEjectPos]); ejectMenu->setEnabled(!name.isEmpty()); + ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName())); QString busName = tr("Unknown Bus"); switch (mo_drives[i].bus_type) { diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp index b069c67d9..ed97a0a50 100644 --- a/src/qt/qt_mediamenu.hpp +++ b/src/qt/qt_mediamenu.hpp @@ -108,8 +108,7 @@ private: int floppyImageHistoryPos[MAX_PREV_IMAGES]; int cdromMutePos; - int cdromImagePos; - int cdromDirPos; + int cdromEjectPos; int cdromImageHistoryPos[MAX_PREV_IMAGES]; int zipEjectPos; From 40ee98d6f3837b311c4573d1daf1b9d98143ebb1 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 11 Apr 2025 05:26:01 +0500 Subject: [PATCH 099/118] qt: The sound icon's menu is now a submenu of the Tools menu Replaces (and includes) the standalone Sound gain option --- src/qt/languages/86box.pot | 3 +++ src/qt/languages/ca-ES.po | 3 +++ src/qt/languages/cs-CZ.po | 3 +++ src/qt/languages/de-DE.po | 3 +++ src/qt/languages/es-ES.po | 3 +++ src/qt/languages/fi-FI.po | 3 +++ src/qt/languages/fr-FR.po | 3 +++ src/qt/languages/hr-HR.po | 3 +++ src/qt/languages/hu-HU.po | 3 +++ src/qt/languages/it-IT.po | 3 +++ src/qt/languages/ja-JP.po | 3 +++ src/qt/languages/ko-KR.po | 3 +++ src/qt/languages/nl-NL.po | 3 +++ src/qt/languages/pl-PL.po | 3 +++ src/qt/languages/pt-BR.po | 3 +++ src/qt/languages/pt-PT.po | 3 +++ src/qt/languages/ru-RU.po | 3 +++ src/qt/languages/sk-SK.po | 3 +++ src/qt/languages/sl-SI.po | 3 +++ src/qt/languages/tr-TR.po | 3 +++ src/qt/languages/uk-UA.po | 3 +++ src/qt/languages/vi-VN.po | 3 +++ src/qt/languages/zh-CN.po | 3 +++ src/qt/languages/zh-TW.po | 3 +++ src/qt/qt_machinestatus.cpp | 36 +++++++++--------------------------- src/qt/qt_machinestatus.hpp | 5 ++--- src/qt/qt_mainwindow.cpp | 14 ++++++++++++-- src/qt/qt_mainwindow.hpp | 1 + src/qt/qt_mainwindow.ui | 15 ++++++++++++++- 29 files changed, 110 insertions(+), 33 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 07dfb7cc5..066e98167 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -189,6 +189,9 @@ msgstr "" msgid "Take s&creenshot" msgstr "" +msgid "S&ound" +msgstr "" + msgid "&Preferences..." msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index dc0a9df2a..93ad884bd 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -189,6 +189,9 @@ msgstr "&Actualitzar icones a la barra d'estat" msgid "Take s&creenshot" msgstr "Prendre c&aptura" +msgid "S&ound" +msgstr "S&o" + msgid "&Preferences..." msgstr "&Preferències ..." diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 7e76d3760..9205839aa 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -189,6 +189,9 @@ msgstr "&Aktualizovat ikony stavového řádku" msgid "Take s&creenshot" msgstr "Pořídit &screenshot" +msgid "S&ound" +msgstr "&Zvuk" + msgid "&Preferences..." msgstr "&Předvolby..." diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index f545729a8..a90c29ac0 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -189,6 +189,9 @@ msgstr "&Statusleistenicons aktualisieren" msgid "Take s&creenshot" msgstr "S&creenshot aufnehmen" +msgid "S&ound" +msgstr "S&ound" + msgid "&Preferences..." msgstr "&Einstellungen..." diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 0733f46ec..3b90772c0 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -189,6 +189,9 @@ msgstr "&Actualizar iconos en barra de estado" msgid "Take s&creenshot" msgstr "Tomar c&aptura" +msgid "S&ound" +msgstr "S&onido" + msgid "&Preferences..." msgstr "&Preferencias..." diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index a7ac64eff..6460ce286 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -189,6 +189,9 @@ msgstr "&Päivitä tilapalkin kuvakkeita" msgid "Take s&creenshot" msgstr "Ota &kuvakaappaus" +msgid "S&ound" +msgstr "&Ääni" + msgid "&Preferences..." msgstr "&Sovellusasetukset..." diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 434e8c31b..d83bd81a3 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -189,6 +189,9 @@ msgstr "Mettre à jour la barre de stat&us" msgid "Take s&creenshot" msgstr "Copie &Ecran" +msgid "S&ound" +msgstr "S&on" + msgid "&Preferences..." msgstr "&Préférences..." diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index b202b39b5..1bc6d4d25 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -189,6 +189,9 @@ msgstr "&Ažuriraj ikone statusnog redka" msgid "Take s&creenshot" msgstr "Napravi &snimku zaslona" +msgid "S&ound" +msgstr "&Zvuk" + msgid "&Preferences..." msgstr "&Postavke..." diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index e9aa6a4ff..23229893a 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -189,6 +189,9 @@ msgstr "Állapotsori ikonok &frissítése" msgid "Take s&creenshot" msgstr "&Képernyőkép készítése" +msgid "S&ound" +msgstr "&Hang" + msgid "&Preferences..." msgstr "&Beállítások..." diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 2f31a9dba..690af0a68 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -189,6 +189,9 @@ msgstr "&Aggiorna icone della barra di stato" msgid "Take s&creenshot" msgstr "Cattura schermata" +msgid "S&ound" +msgstr "A&udio" + msgid "&Preferences..." msgstr "&Preferenze..." diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 318d0dca5..502ccda20 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -189,6 +189,9 @@ msgstr "ステータスバーのアイコンを更新(&U)" msgid "Take s&creenshot" msgstr "スクリーンショットを撮る(&C)" +msgid "S&ound" +msgstr "サウンド(&O)" + msgid "&Preferences..." msgstr "環境設定(&P)..." diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 027c5a778..b149b62bb 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -189,6 +189,9 @@ msgstr "상태 바 아이콘 갱신하기(&U)" msgid "Take s&creenshot" msgstr "스크린샷 찍기(&C)" +msgid "S&ound" +msgstr "사운드(&O)" + msgid "&Preferences..." msgstr "환경설정(&P)..." diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 65e589b2b..0fe316550 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -189,6 +189,9 @@ msgstr "&Statusbalkpictogrammen bijwerken" msgid "Take s&creenshot" msgstr "Maak een schermafbeelding" +msgid "S&ound" +msgstr "&Geluid" + msgid "&Preferences..." msgstr "&Voorkeuren..." diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 4e93f9dd1..81b9f9b04 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -189,6 +189,9 @@ msgstr "&Aktualizuj ikony na pasku statusu" msgid "Take s&creenshot" msgstr "Zrób &zrzut ekranu" +msgid "S&ound" +msgstr "Dź&więk" + msgid "&Preferences..." msgstr "&Preferencje..." diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 3e0ec7ff1..0b1ab46e4 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -189,6 +189,9 @@ msgstr "&Atualizar ícones da barra de status" msgid "Take s&creenshot" msgstr "Capturar &tela" +msgid "S&ound" +msgstr "&Som" + msgid "&Preferences..." msgstr "&Preferências..." diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 9fb1ce342..c83ac3655 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -189,6 +189,9 @@ msgstr "&Atualizar ícones da barra de estado" msgid "Take s&creenshot" msgstr "Gravar imagem de ecrã" +msgid "S&ound" +msgstr "&Som" + msgid "&Preferences..." msgstr "&Preferências..." diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 725f7adf6..b466c6624 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -189,6 +189,9 @@ msgstr "&Обновление значков строки состояния" msgid "Take s&creenshot" msgstr "Сделать с&криншот" +msgid "S&ound" +msgstr "&Звук" + msgid "&Preferences..." msgstr "&Параметры..." diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 937b067fe..d70d14e56 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -189,6 +189,9 @@ msgstr "&Aktualizovať ikony na stavovom riadku" msgid "Take s&creenshot" msgstr "Urobiť snímku &obrazovky" +msgid "S&ound" +msgstr "&Zvuk" + msgid "&Preferences..." msgstr "&Predvoľby..." diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index b28954b19..419d7dcc5 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -189,6 +189,9 @@ msgstr "&Posodabljaj ikone statusne vrstice" msgid "Take s&creenshot" msgstr "&Zajemi posnetek zaslona" +msgid "S&ound" +msgstr "Z&vok" + msgid "&Preferences..." msgstr "&Možnosti..." diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 54bdac06e..d134be6d0 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -195,6 +195,9 @@ msgstr "&Tercihler..." msgid "Enable &Discord integration" msgstr "&Discord entegrasyonunu etkinleştir" +msgid "S&ound" +msgstr "&Ses" + msgid "Sound &gain..." msgstr "&Ses düzeyi artışı..." diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index b78bb0661..d475fa201 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -189,6 +189,9 @@ msgstr "&Обновлення значків рядка стану" msgid "Take s&creenshot" msgstr "Зробити &знімок" +msgid "S&ound" +msgstr "&Звук" + msgid "&Preferences..." msgstr "&Параметри..." diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index e4b15a971..b4c72ec26 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -189,6 +189,9 @@ msgstr "Cậ&p nhật biểu tượng thanh trạng thái" msgid "Take s&creenshot" msgstr "Chụp &màn hình" +msgid "S&ound" +msgstr "&Thanh âm" + msgid "&Preferences..." msgstr "&Tùy biến..." diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index b02f41bbb..8e5dd1a4b 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -189,6 +189,9 @@ msgstr "更新状态栏图标(&U)" msgid "Take s&creenshot" msgstr "截图(&C)" +msgid "S&ound" +msgstr "声音(&O)" + msgid "&Preferences..." msgstr "首选项(&P)..." diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 2662770b8..584c18dc9 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -189,6 +189,9 @@ msgstr "更新狀態列圖示(&U)" msgid "Take s&creenshot" msgstr "擷圖(&C)" +msgid "S&ound" +msgstr "聲音(&O)" + msgid "&Preferences..." msgstr "偏好設定(&P)..." diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index aba7fc1d4..d86dae7b9 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -270,7 +270,6 @@ MachineStatus::MachineStatus(QObject *parent) , refreshTimer(new QTimer(this)) { d = std::make_unique(this); - muteUnmuteAction = nullptr; soundMenu = nullptr; connect(refreshTimer, &QTimer::timeout, this, &MachineStatus::refreshIcons); refreshTimer->start(75); @@ -279,9 +278,9 @@ MachineStatus::MachineStatus(QObject *parent) MachineStatus::~MachineStatus() = default; void -MachineStatus::setSoundGainAction(QAction* action) +MachineStatus::setSoundMenu(QMenu* menu) { - soundGainAction = action; + soundMenu = menu; } bool @@ -519,28 +518,6 @@ MachineStatus::refresh(QStatusBar *sbar) } sbar->removeWidget(d->sound.get()); - if (!muteUnmuteAction) { - muteUnmuteAction = new QAction; - connect(muteUnmuteAction, &QAction::triggered, this, [this]() { - sound_muted ^= 1; - config_save(); - if (d->sound) - d->sound->setPixmap(sound_muted ? d->pixmaps.sound.disabled : d->pixmaps.sound.normal); - - muteUnmuteAction->setText(sound_muted ? tr("&Unmute") : tr("&Mute")); - }); - } - - if (!soundMenu) { - soundMenu = new QMenu((QWidget*)parent()); - - soundMenu->addAction(muteUnmuteAction); - soundMenu->addSeparator(); - soundMenu->addAction(soundGainAction); - - muteUnmuteAction->setParent(soundMenu); - } - if (cassette_enable) { d->cassette.label = std::make_unique(); d->cassette.setEmpty(QString(cassette_fname).isEmpty()); @@ -710,8 +687,6 @@ MachineStatus::refresh(QStatusBar *sbar) d->sound = std::make_unique(); d->sound->setPixmap(sound_muted ? d->pixmaps.sound.disabled : d->pixmaps.sound.normal); - if (muteUnmuteAction) - muteUnmuteAction->setText(sound_muted ? tr("&Unmute") : tr("&Mute")); connect(d->sound.get(), &ClickableLabel::clicked, this, [this](QPoint pos) { this->soundMenu->popup(pos - QPoint(0, this->soundMenu->sizeHint().height())); @@ -727,6 +702,13 @@ MachineStatus::refresh(QStatusBar *sbar) refreshEmptyIcons(); } +void +MachineStatus::updateSoundIcon() +{ + if (d->sound) + d->sound->setPixmap(sound_muted ? d->pixmaps.sound.disabled : d->pixmaps.sound.normal); +} + void MachineStatus::message(const QString &msg) { diff --git a/src/qt/qt_machinestatus.hpp b/src/qt/qt_machinestatus.hpp index 90b420763..ad6425b5a 100644 --- a/src/qt/qt_machinestatus.hpp +++ b/src/qt/qt_machinestatus.hpp @@ -73,20 +73,19 @@ public: QString getMessage(); void clearActivity(); - void setSoundGainAction(QAction* action); + void setSoundMenu(QMenu* menu); public slots: void refresh(QStatusBar *sbar); void message(const QString &msg); void updateTip(int tag); void refreshEmptyIcons(); void refreshIcons(); + void updateSoundIcon(); private: struct States; std::unique_ptr d; QTimer *refreshTimer; - QAction *soundGainAction; - QAction *muteUnmuteAction; QMenu *soundMenu; }; diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index e9ebdaad8..886f84dcd 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -180,7 +180,8 @@ MainWindow::MainWindow(QWidget *parent) extern MainWindow *main_window; main_window = this; ui->setupUi(this); - status->setSoundGainAction(ui->actionSound_gain); + status->setSoundMenu(ui->menuSound); + ui->actionMute_Unmute->setText(sound_muted ? tr("&Unmute") : tr("&Mute")); ui->menuEGA_S_VGA_settings->menuAction()->setMenuRole(QAction::NoRole); ui->stackedWidget->setMouseTracking(true); statusBar()->setVisible(!hide_status_bar); @@ -1334,7 +1335,7 @@ void MainWindow::refreshMediaMenu() { mm->refresh(ui->menuMedia); - status->setSoundGainAction(ui->actionSound_gain); + status->setSoundMenu(ui->menuSound); status->refresh(ui->statusbar); ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); @@ -1937,6 +1938,15 @@ MainWindow::on_actionTake_screenshot_triggered() device_force_redraw(); } +void +MainWindow::on_actionMute_Unmute_triggered() +{ + sound_muted ^= 1; + config_save(); + status->updateSoundIcon(); + ui->actionMute_Unmute->setText(sound_muted ? tr("&Unmute") : tr("&Mute")); +} + void MainWindow::on_actionSound_gain_triggered() { diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 5c8bd388b..4b3f9ecae 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -116,6 +116,7 @@ private slots: void on_actionHide_tool_bar_triggered(); void on_actionUpdate_status_bar_icons_triggered(); void on_actionTake_screenshot_triggered(); + void on_actionMute_Unmute_triggered(); void on_actionSound_gain_triggered(); void on_actionPreferences_triggered(); void on_actionEnable_Discord_integration_triggered(bool checked); diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index ef3cf16c6..83a80342b 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -87,13 +87,21 @@ &Tools + + + S&ound + + + + + - + @@ -725,6 +733,11 @@ false + + + &Mute + + Sound &gain... From 91531529903a4295b254bd4241b1d58d83dd25ca Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 11 Apr 2025 06:35:18 +0500 Subject: [PATCH 100/118] qt: Redesign hard disk dialog to accommodate drive models --- src/disk/hdd.c | 16 +-- src/qt/languages/86box.pot | 26 +++- src/qt/languages/ca-ES.po | 4 +- src/qt/languages/cs-CZ.po | 4 +- src/qt/languages/de-DE.po | 4 +- src/qt/languages/es-ES.po | 4 +- src/qt/languages/fi-FI.po | 4 +- src/qt/languages/fr-FR.po | 4 +- src/qt/languages/hr-HR.po | 4 +- src/qt/languages/hu-HU.po | 4 +- src/qt/languages/it-IT.po | 4 +- src/qt/languages/ja-JP.po | 4 +- src/qt/languages/ko-KR.po | 4 +- src/qt/languages/nl-NL.po | 4 +- src/qt/languages/pl-PL.po | 4 +- src/qt/languages/pt-BR.po | 4 +- src/qt/languages/pt-PT.po | 4 +- src/qt/languages/ru-RU.po | 7 +- src/qt/languages/sk-SK.po | 4 +- src/qt/languages/sl-SI.po | 4 +- src/qt/languages/tr-TR.po | 4 +- src/qt/languages/uk-UA.po | 4 +- src/qt/languages/vi-VN.po | 4 +- src/qt/languages/zh-CN.po | 4 +- src/qt/languages/zh-TW.po | 4 +- src/qt/qt_harddiskdialog.ui | 232 ++++++++++++++++----------------- src/qt/qt_settingsharddisks.ui | 2 +- 27 files changed, 199 insertions(+), 172 deletions(-) diff --git a/src/disk/hdd.c b/src/disk/hdd.c index 8292dc472..8a02173ce 100644 --- a/src/disk/hdd.c +++ b/src/disk/hdd.c @@ -407,14 +407,14 @@ hdd_zones_init(hard_disk_t *hdd) static hdd_preset_t hdd_speed_presets[] = { // clang-format off - { .name = "RAM Disk (max. speed)", .internal_name = "ramdisk", .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, - { .name = "[1989] 3500 RPM", .internal_name = "1989_3500rpm", .zones = 1, .avg_spt = 35, .heads = 2, .rpm = 3500, .full_stroke_ms = 40, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 16, .max_multiple = 8 }, - { .name = "[1992] 3600 RPM", .internal_name = "1992_3600rpm", .zones = 1, .avg_spt = 45, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 6, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 }, - { .name = "[1994] 4500 RPM", .internal_name = "1994_4500rpm", .zones = 8, .avg_spt = 80, .heads = 4, .rpm = 4500, .full_stroke_ms = 26, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 16 }, - { .name = "[1996] 5400 RPM", .internal_name = "1996_5400rpm", .zones = 16, .avg_spt = 135, .heads = 4, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, - { .name = "[1997] 5400 RPM", .internal_name = "1997_5400rpm", .zones = 16, .avg_spt = 185, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 32 }, - { .name = "[1998] 5400 RPM", .internal_name = "1998_5400rpm", .zones = 16, .avg_spt = 300, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 }, - { .name = "[2000] 7200 RPM", .internal_name = "2000_7200rpm", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, + { .name = "[Generic] RAM Disk (max. speed)", .internal_name = "ramdisk", .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, + { .name = "[Generic] 1989 (3500 RPM)", .internal_name = "1989_3500rpm", .zones = 1, .avg_spt = 35, .heads = 2, .rpm = 3500, .full_stroke_ms = 40, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 16, .max_multiple = 8 }, + { .name = "[Generic] 1992 (3600 RPM)", .internal_name = "1992_3600rpm", .zones = 1, .avg_spt = 45, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 6, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 }, + { .name = "[Generic] 1994 (4500 RPM)", .internal_name = "1994_4500rpm", .zones = 8, .avg_spt = 80, .heads = 4, .rpm = 4500, .full_stroke_ms = 26, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 16 }, + { .name = "[Generic] 1996 (5400 RPM)", .internal_name = "1996_5400rpm", .zones = 16, .avg_spt = 135, .heads = 4, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, + { .name = "[Generic] 1997 (5400 RPM)", .internal_name = "1997_5400rpm", .zones = 16, .avg_spt = 185, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 32 }, + { .name = "[Generic] 1998 (5400 RPM)", .internal_name = "1998_5400rpm", .zones = 16, .avg_spt = 300, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 }, + { .name = "[Generic] 2000 (7200 RPM)", .internal_name = "2000_7200rpm", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, { .name = "[PIO IDE] IBM WDA-L42", .internal_name = "WDAL42", .model = "WDA-L42", .zones = 1, .avg_spt = 85, .heads = 2, .rpm = 3600, .full_stroke_ms = 33, .track_seek_ms = 2.5, .rcache_num_seg = 1, .rcache_seg_size = 32, .max_multiple = 1 }, { .name = "[ATA-1] Conner CP3024", .internal_name = "CP3024", .model = "Conner Peripherals 20MB - CP3024", .zones = 1, .avg_spt = 33, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work { .name = "[ATA-1] Conner CP3044", .internal_name = "CP3044", .model = "Conner Peripherals 40MB - CP3044", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 066e98167..fde3f921c 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2058,7 +2058,28 @@ msgstr "" msgid "High performance impact" msgstr "" -msgid "RAM Disk (max. speed)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "" + +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" msgstr "" msgid "IBM 8514/A clone (ISA)" @@ -2088,5 +2109,8 @@ msgstr "" msgid "Inhibit multimedia keys" msgstr "" +msgid "Model:" +msgstr "" + msgid "Failed to initialize Vulkan renderer." msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 93ad884bd..f39be48ca 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -2058,8 +2058,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Alt impact en el rendiment" -msgid "RAM Disk (max. speed)" -msgstr "Disc RAM (velocitat màxima)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disc RAM (velocitat màxima)" msgid "IBM 8514/A clone (ISA)" msgstr "Clon IBM 8514/A (ISA)" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 9205839aa..34b5dfa6d 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Vysoký dopad na výkon" -msgid "RAM Disk (max. speed)" -msgstr "Disk RAM (max. rychlost)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disk RAM (max. rychlost)" msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index a90c29ac0..e69d496a7 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -2061,8 +2061,8 @@ msgstr "Softfloat-FPU" msgid "High performance impact" msgstr "Hohe Auswirkung auf die Leistung" -msgid "RAM Disk (max. speed)" -msgstr "RAM-Diskette (maximale Geschwindigkeit)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM-Diskette (maximale Geschwindigkeit)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-Klon (ISA)" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 3b90772c0..1e9bc1c23 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2057,8 +2057,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Alto impact en el rendimiento" -msgid "RAM Disk (max. speed)" -msgstr "Disco RAM (velocidad máxima)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disco RAM (velocidad máxima)" msgid "IBM 8514/A clone (ISA)" msgstr "Clon IBM 8514/A (ISA)" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 6460ce286..d35e45b21 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2061,8 +2061,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Suuri vaikutus suorituskykyyn" -msgid "RAM Disk (max. speed)" -msgstr "RAM-levy (maksiminopeus)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM-levy (maksiminopeus)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-klooni (ISA)" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index d83bd81a3..50de1f001 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2058,8 +2058,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Impact important sur la performance" -msgid "RAM Disk (max. speed)" -msgstr "Disque RAM (vitesse maximale)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disque RAM (vitesse maximale)" msgid "IBM 8514/A clone (ISA)" msgstr "Clon IBM 8514/A (ISA)" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 1bc6d4d25..93c247319 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Visoki učinak na brzinu izvršavanja" -msgid "RAM Disk (max. speed)" -msgstr "Disk RAM (najviša brzina)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disk RAM (najviša brzina)" msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 23229893a..b92b9c11b 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Nagy hatással van a teljesítményre" -msgid "RAM Disk (max. speed)" -msgstr "RAM lemez (max. sebesség)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM lemez (max. sebesség)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A klón (ISA)" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 690af0a68..b85bb64bd 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2058,8 +2058,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Impatto elevato sulla prestazione" -msgid "RAM Disk (max. speed)" -msgstr "Disco RAM (velocità massima)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disco RAM (velocità massima)" msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 502ccda20..07c783dd1 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "パフォーマンスへの影響が大きい" -msgid "RAM Disk (max. speed)" -msgstr "RAMディスク(最高速度)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAMディスク(最高速度)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A クローン(ISA)" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index b149b62bb..cea372b7f 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2058,8 +2058,8 @@ msgstr "소프트플로트 FPU" msgid "High performance impact" msgstr "성능에 미치는 영향" -msgid "RAM Disk (max. speed)" -msgstr "RAM 디스크(최대 속도)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM 디스크(최대 속도)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A 클론(ISA)" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 0fe316550..97634842b 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Hoge prestatie-impact" -msgid "RAM Disk (max. speed)" -msgstr "RAM-schijf (max. snelheid)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM-schijf (max. snelheid)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-kloon (ISA)" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 81b9f9b04..980ee69f1 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2058,8 +2058,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Wysoki wpływ na wydajność" -msgid "RAM Disk (max. speed)" -msgstr "Dysk RAM (maks. prędkość)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Dysk RAM (maks. prędkość)" msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 0b1ab46e4..c48e7a07f 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2058,8 +2058,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Alto impacto no desempenho" -msgid "RAM Disk (max. speed)" -msgstr "Disco RAM (velocidade máxima)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disco RAM (velocidade máxima)" msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index c83ac3655..1900a42d9 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2058,8 +2058,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Elevado impacto no desempenho" -msgid "RAM Disk (max. speed)" -msgstr "Disco RAM (velocidade máxima)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disco RAM (velocidade máxima)" msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index b466c6624..afc4c72a4 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Сильное влияние на производительность" -msgid "RAM Disk (max. speed)" -msgstr "RAM-диск (макс. скорость)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Стандартный] RAM-диск (макс. скорость)" msgid "IBM 8514/A clone (ISA)" msgstr "Клон IBM 8514/A (ISA)" @@ -2084,3 +2084,6 @@ msgstr "Невозможно найти матричные шрифты" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Шрифты TrueType в каталоге \"roms/printer/fonts\" необходимы для эмуляции стандартного матричного принтера ESC/P." + +msgid "Model:" +msgstr "Модель:" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index d70d14e56..f1a6144a6 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2059,8 +2059,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Vysoký vplyv na výkon" -msgid "RAM Disk (max. speed)" -msgstr "Disk RAM (max. rýchlosť)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Disk RAM (max. rýchlosť)" msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 419d7dcc5..94c241dea 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Visok učinek na hitrost delovanja" -msgid "RAM Disk (max. speed)" -msgstr "Pogon RAM (največja hitrost)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Pogon RAM (največja hitrost)" msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index d134be6d0..1be214342 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Ciddi performans düşüklüğüne neden olabilir" -msgid "RAM Disk (max. speed)" -msgstr "RAM Disk (maks. hız)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM Disk (maks. hız)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A klonu (ISA)" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index d475fa201..6acb947cf 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -2058,8 +2058,8 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Високий вплив на продуктивність" -msgid "RAM Disk (max. speed)" -msgstr "Диск оперативної пам'яті (макс. швидкість)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Диск оперативної пам'яті (макс. швидкість)" msgid "IBM 8514/A clone (ISA)" msgstr "Клон IBM 8514/A (ISA)" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index b4c72ec26..c1d461fb7 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Ảnh hưởng lớn đến hiệu suất" -msgid "RAM Disk (max. speed)" -msgstr "Đĩa RAM (tốc độ tối đa)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] Đĩa RAM (tốc độ tối đa)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A bản nhái (ISA)" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 8e5dd1a4b..0ce76cff9 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "重大性能影响" -msgid "RAM Disk (max. speed)" -msgstr "RAM 磁盘 (最大速度)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM 磁盘 (最大速度)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A 克隆 (ISA)" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 584c18dc9..d50449aa2 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2058,8 +2058,8 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "對效能影響大" -msgid "RAM Disk (max. speed)" -msgstr "RAM 磁碟 (最大速度)" +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Generic] RAM 磁碟 (最大速度)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A 克隆 (ISA)" diff --git a/src/qt/qt_harddiskdialog.ui b/src/qt/qt_harddiskdialog.ui index 91499d2cb..cba835134 100644 --- a/src/qt/qt_harddiskdialog.ui +++ b/src/qt/qt_harddiskdialog.ui @@ -32,27 +32,16 @@ Dialog - - - - - - - Channel: + + + + false - - - - - - Speed: + + 0 - - - - - - 30 + + true @@ -63,86 +52,34 @@ - - + + - Type: + Image Format: - - - - - 0 - 0 - - - - - 64 - 16777215 - - - - - - - - - 0 - 0 - - - - - 64 - 16777215 - - - - - - - - Size (MB): - - - - - + + 30 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + Bus: - - - - Qt::Vertical - - - - 20 - 20 - - - + + - - + + - Cylinders: + Type: @@ -165,10 +102,29 @@ - - - - Image Format: + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + 0 + 0 + + + + + 64 + 16777215 + @@ -179,31 +135,47 @@ - - + + + + + 0 + 0 + + + + + 64 + 16777215 + + + + + + 30 - - + + - Bus: + Cylinders: - - - - 30 + + + + File name: - - - - 30 + + + + Size (MB): @@ -226,37 +198,65 @@ - - + + + + Channel: + + + + + 30 - + Block Size: - - + + + + Qt::Vertical + + + + 20 + 20 + + + + + + - File name: + Model: - - - - false + + + + 30 - - 0 + + + + + + 30 - - true + + + + + + 30 diff --git a/src/qt/qt_settingsharddisks.ui b/src/qt/qt_settingsharddisks.ui index 3ae20fee1..ea69edc5b 100644 --- a/src/qt/qt_settingsharddisks.ui +++ b/src/qt/qt_settingsharddisks.ui @@ -78,7 +78,7 @@ - Speed: + Model: From bfec519a015839e9a901d9e11dfd23970ad2d2a0 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 11 Apr 2025 06:36:18 +0500 Subject: [PATCH 101/118] nl-NL.po: Remove trailing whitespace --- src/qt/languages/nl-NL.po | 1376 ++++++++++++++++++------------------- 1 file changed, 688 insertions(+), 688 deletions(-) diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 97634842b..20c193afe 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -6,2071 +6,2071 @@ msgstr "" "X-Language: nl_NL\n" "X-Source-Language: en_US\n" -msgid "&Action" +msgid "&Action" msgstr "&Actie" -msgid "&Keyboard requires capture" +msgid "&Keyboard requires capture" msgstr "&Keyboard vereist vastleggen" -msgid "&Right CTRL is left ALT" +msgid "&Right CTRL is left ALT" msgstr "&Rechtse CTRL is linkse ALT" -msgid "&Hard Reset..." +msgid "&Hard Reset..." msgstr "&Harde Reset..." -msgid "&Ctrl+Alt+Del" +msgid "&Ctrl+Alt+Del" msgstr "&Ctrl+Alt+Del" -msgid "Ctrl+Alt+&Esc" +msgid "Ctrl+Alt+&Esc" msgstr "Ctrl+Alt+&Esc" -msgid "&Pause" +msgid "&Pause" msgstr "&Pauze" -msgid "E&xit..." +msgid "E&xit..." msgstr "&Afsluiten..." -msgid "&View" +msgid "&View" msgstr "&Beeld" -msgid "&Hide status bar" +msgid "&Hide status bar" msgstr "&Statusbalk verbergen" -msgid "Hide &toolbar" +msgid "Hide &toolbar" msgstr "Verberg &toolbar" -msgid "&Resizeable window" +msgid "&Resizeable window" msgstr "&Venster met aanpasbare grootte" -msgid "R&emember size && position" +msgid "R&emember size && position" msgstr "&Onthoud grootte && positie" -msgid "Re&nderer" +msgid "Re&nderer" msgstr "Re&nderer" -msgid "&Qt (Software)" +msgid "&Qt (Software)" msgstr "&Qt (software)" -msgid "Qt (&OpenGL)" +msgid "Qt (&OpenGL)" msgstr "Qt (&OpenGL)" -msgid "Open&GL (3.0 Core)" +msgid "Open&GL (3.0 Core)" msgstr "Open&GL (3.0 Core)" -msgid "&VNC" +msgid "&VNC" msgstr "&VNC" -msgid "Specify dimensions..." +msgid "Specify dimensions..." msgstr "Afmetingen opgeven..." -msgid "F&orce 4:3 display ratio" +msgid "F&orce 4:3 display ratio" msgstr "F&orceer 4:3 beeldverhouding" -msgid "&Window scale factor" +msgid "&Window scale factor" msgstr "&Venster schaalfactor" -msgid "&0.5x" +msgid "&0.5x" msgstr "&0,5x" -msgid "&1x" +msgid "&1x" msgstr "&1x" -msgid "1.&5x" +msgid "1.&5x" msgstr "1,&5x" -msgid "&2x" +msgid "&2x" msgstr "&2x" -msgid "&3x" +msgid "&3x" msgstr "&3x" -msgid "&4x" +msgid "&4x" msgstr "&4x" -msgid "&5x" +msgid "&5x" msgstr "&5x" -msgid "&6x" +msgid "&6x" msgstr "&6x" -msgid "&7x" +msgid "&7x" msgstr "&7x" -msgid "&8x" +msgid "&8x" msgstr "&8x" -msgid "Filter method" +msgid "Filter method" msgstr "Filtermethode" -msgid "&Nearest" +msgid "&Nearest" msgstr "&Dichtsbijzijnde" -msgid "&Linear" +msgid "&Linear" msgstr "&Lineair" -msgid "Hi&DPI scaling" +msgid "Hi&DPI scaling" msgstr "Hi&DPI-schaling" -msgid "&Fullscreen" +msgid "&Fullscreen" msgstr "&Fullscreen" -msgid "Fullscreen &stretch mode" +msgid "Fullscreen &stretch mode" msgstr "Volledig scherm &uitrekmodus" -msgid "&Full screen stretch" +msgid "&Full screen stretch" msgstr "&Volledig scherm uitrekken" -msgid "&4:3" +msgid "&4:3" msgstr "&4:3" -msgid "&Square pixels (Keep ratio)" +msgid "&Square pixels (Keep ratio)" msgstr "&Vierkante pixels (behoud verhouding)" -msgid "&Integer scale" +msgid "&Integer scale" msgstr "&Integerschaal" -msgid "4:&3 Integer scale" +msgid "4:&3 Integer scale" msgstr "4:&3 integerschaal" -msgid "E&GA/(S)VGA settings" +msgid "E&GA/(S)VGA settings" msgstr "E&GA/(S)VGA-instellingen" -msgid "&Inverted VGA monitor" +msgid "&Inverted VGA monitor" msgstr "Ge&ïnverteerde VGA-monitor" -msgid "VGA screen &type" +msgid "VGA screen &type" msgstr "VGA-scherm &type" -msgid "RGB &Color" +msgid "RGB &Color" msgstr "RGB &Kleur" -msgid "&RGB Grayscale" +msgid "&RGB Grayscale" msgstr "&RGB grijstinten" -msgid "&Amber monitor" +msgid "&Amber monitor" msgstr "&Amber monitor" -msgid "&Green monitor" +msgid "&Green monitor" msgstr "&Groene monitor" -msgid "&White monitor" +msgid "&White monitor" msgstr "&Witte monitor" -msgid "Grayscale &conversion type" +msgid "Grayscale &conversion type" msgstr "Grijstinten &conversietype" -msgid "BT&601 (NTSC/PAL)" +msgid "BT&601 (NTSC/PAL)" msgstr "BT&601 (NTSC/PAL)" -msgid "BT&709 (HDTV)" +msgid "BT&709 (HDTV)" msgstr "BT&709 (HDTV)" -msgid "&Average" +msgid "&Average" msgstr "&Gemiddelde" -msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" +msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" msgstr "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" -msgid "Change contrast for &monochrome display" +msgid "Change contrast for &monochrome display" msgstr "Contrast wijzigen voor &monochroom beeldscherm" -msgid "&Media" +msgid "&Media" msgstr "&Media" -msgid "&Tools" +msgid "&Tools" msgstr "&Tools" -msgid "&Settings..." +msgid "&Settings..." msgstr "&Instellingen..." -msgid "&Update status bar icons" +msgid "&Update status bar icons" msgstr "&Statusbalkpictogrammen bijwerken" -msgid "Take s&creenshot" +msgid "Take s&creenshot" msgstr "Maak een schermafbeelding" -msgid "S&ound" +msgid "S&ound" msgstr "&Geluid" -msgid "&Preferences..." +msgid "&Preferences..." msgstr "&Voorkeuren..." -msgid "Enable &Discord integration" +msgid "Enable &Discord integration" msgstr "&Discord integratie inschakelen" -msgid "Sound &gain..." +msgid "Sound &gain..." msgstr "&Geluidsversterking..." -msgid "Begin trace" +msgid "Begin trace" msgstr "Begin traceren" -msgid "End trace" +msgid "End trace" msgstr "Traceren beëindigen" -msgid "&Help" +msgid "&Help" msgstr "&Help" -msgid "&Documentation..." +msgid "&Documentation..." msgstr "&Documentatie..." -msgid "&About 86Box..." +msgid "&About 86Box..." msgstr "&Over 86Box..." -msgid "&New image..." +msgid "&New image..." msgstr "&Nieuw image..." -msgid "&Existing image..." +msgid "&Existing image..." msgstr "&Bestaande image..." -msgid "Existing image (&Write-protected)..." +msgid "Existing image (&Write-protected)..." msgstr "Bestaande image (&Schrijfbeveiligd)..." -msgid "&Record" +msgid "&Record" msgstr "&Opnemen" -msgid "&Play" +msgid "&Play" msgstr "&Play" -msgid "&Rewind to the beginning" +msgid "&Rewind to the beginning" msgstr "&Terugspoelen naar het begin" -msgid "&Fast forward to the end" +msgid "&Fast forward to the end" msgstr "&Snel vooruit naar het einde" -msgid "E&ject" +msgid "E&ject" msgstr "&Uitwerpen" -msgid "&Image..." +msgid "&Image..." msgstr "&Image..." -msgid "E&xport to 86F..." +msgid "E&xport to 86F..." msgstr "E&xporteer naar 86F..." -msgid "&Mute" +msgid "&Mute" msgstr "&Mute" -msgid "E&mpty" +msgid "E&mpty" msgstr "E&mpty" -msgid "Reload previous image" +msgid "Reload previous image" msgstr "Herlaad vorige image" -msgid "&Folder..." +msgid "&Folder..." msgstr "&Map..." -msgid "Target &framerate" +msgid "Target &framerate" msgstr "Doel &framerate" -msgid "&Sync with video" +msgid "&Sync with video" msgstr "&Synchroniseer met video" -msgid "&25 fps" +msgid "&25 fps" msgstr "&25 fps" -msgid "&30 fps" +msgid "&30 fps" msgstr "&30 fps" -msgid "&50 fps" +msgid "&50 fps" msgstr "&50 fps" -msgid "&60 fps" +msgid "&60 fps" msgstr "&60 fps" -msgid "&75 fps" +msgid "&75 fps" msgstr "&75 fps" -msgid "&VSync" +msgid "&VSync" msgstr "&VSync" -msgid "&Select shader..." +msgid "&Select shader..." msgstr "&Selecteer shader..." -msgid "&Remove shader" +msgid "&Remove shader" msgstr "&Remove shader" -msgid "Preferences" +msgid "Preferences" msgstr "Voorkeuren" -msgid "Sound Gain" +msgid "Sound Gain" msgstr "Geluidsversterking" -msgid "New Image" +msgid "New Image" msgstr "Nieuw image" -msgid "Settings" +msgid "Settings" msgstr "Instellingen" -msgid "Specify Main Window Dimensions" +msgid "Specify Main Window Dimensions" msgstr "Afmetingen hoofdvenster opgeven" -msgid "OK" +msgid "OK" msgstr "OK" -msgid "Cancel" +msgid "Cancel" msgstr "Annuleren" -msgid "&Default" +msgid "&Default" msgstr "&Standaard" -msgid "Language:" +msgid "Language:" msgstr "Taal:" -msgid "Gain" +msgid "Gain" msgstr "Versterking" -msgid "File name:" +msgid "File name:" msgstr "Bestandsnaam:" -msgid "Disk size:" +msgid "Disk size:" msgstr "Schijfgrootte:" -msgid "RPM mode:" +msgid "RPM mode:" msgstr "RPM-modus:" -msgid "Progress:" +msgid "Progress:" msgstr "Vooruitgang:" -msgid "Width:" +msgid "Width:" msgstr "Breedte:" -msgid "Height:" +msgid "Height:" msgstr "Hoogte:" -msgid "Lock to this size" +msgid "Lock to this size" msgstr "Leg vast op deze grootte" -msgid "Machine type:" +msgid "Machine type:" msgstr "Machinetype:" -msgid "Machine:" +msgid "Machine:" msgstr "Machine:" -msgid "Configure" +msgid "Configure" msgstr "Configureren" -msgid "CPU type:" +msgid "CPU type:" msgstr "CPU type:" -msgid "Speed:" +msgid "Speed:" msgstr "Snelheid:" -msgid "Frequency:" +msgid "Frequency:" msgstr "Frequentie:" -msgid "FPU:" +msgid "FPU:" msgstr "FPU:" -msgid "Wait states:" +msgid "Wait states:" msgstr "Wachttoestanden:" -msgid "MB" +msgid "MB" msgstr "MB" -msgid "Memory:" +msgid "Memory:" msgstr "Geheugen:" -msgid "Time synchronization" +msgid "Time synchronization" msgstr "Tijdsynchronisatie" -msgid "Disabled" +msgid "Disabled" msgstr "Uitgeschakeld" -msgid "Enabled (local time)" +msgid "Enabled (local time)" msgstr "Ingeschakeld (lokale tijd)" -msgid "Enabled (UTC)" +msgid "Enabled (UTC)" msgstr "Ingeschakeld (UTC)" -msgid "Dynamic Recompiler" +msgid "Dynamic Recompiler" msgstr "Dynamische Recompiler" -msgid "Video:" +msgid "Video:" msgstr "Video:" -msgid "Video #2:" +msgid "Video #2:" msgstr "Video #2:" -msgid "Voodoo 1 or 2 Graphics" +msgid "Voodoo 1 or 2 Graphics" msgstr "Voodoo 1 of 2 graphics" -msgid "IBM 8514/A Graphics" +msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A-graphics" -msgid "XGA Graphics" +msgid "XGA Graphics" msgstr "XGA Graphics" -msgid "Mouse:" +msgid "Mouse:" msgstr "Muis:" -msgid "Joystick:" +msgid "Joystick:" msgstr "Joystick:" -msgid "Joystick 1..." +msgid "Joystick 1..." msgstr "Joystick 1..." -msgid "Joystick 2..." +msgid "Joystick 2..." msgstr "Joystick 2..." -msgid "Joystick 3..." +msgid "Joystick 3..." msgstr "Joystick 3..." -msgid "Joystick 4..." +msgid "Joystick 4..." msgstr "Joystick 4..." -msgid "Sound card #1:" +msgid "Sound card #1:" msgstr "Geluidskaart #1:" -msgid "Sound card #2:" +msgid "Sound card #2:" msgstr "Geluidskaart #2:" -msgid "Sound card #3:" +msgid "Sound card #3:" msgstr "Geluidskaart #3:" -msgid "Sound card #4:" +msgid "Sound card #4:" msgstr "Geluidskaart #4:" -msgid "MIDI Out Device:" +msgid "MIDI Out Device:" msgstr "MIDI Out-apparaat:" -msgid "MIDI In Device:" +msgid "MIDI In Device:" msgstr "MIDI In-apparaat:" -msgid "Standalone MPU-401" +msgid "Standalone MPU-401" msgstr "Standalone MPU-401" -msgid "Use FLOAT32 sound" +msgid "Use FLOAT32 sound" msgstr "Gebruik FLOAT32-geluid" -msgid "FM synth driver" +msgid "FM synth driver" msgstr "FM-synthesizer" -msgid "Nuked (more accurate)" +msgid "Nuked (more accurate)" msgstr "Nuked (nauwkeuriger)" -msgid "YMFM (faster)" +msgid "YMFM (faster)" msgstr "YMFM (sneller)" -msgid "Network type:" +msgid "Network type:" msgstr "Type netwerk:" -msgid "PCap device:" +msgid "PCap device:" msgstr "PCap-apparaat:" -msgid "Network adapter:" +msgid "Network adapter:" msgstr "Netwerkadapter:" -msgid "COM1 Device:" +msgid "COM1 Device:" msgstr "COM1-apparaat:" -msgid "COM2 Device:" +msgid "COM2 Device:" msgstr "COM2-apparaat:" -msgid "COM3 Device:" +msgid "COM3 Device:" msgstr "COM3-apparaat:" -msgid "COM4 Device:" +msgid "COM4 Device:" msgstr "COM4-apparaat:" -msgid "LPT1 Device:" +msgid "LPT1 Device:" msgstr "LPT1-apparaat:" -msgid "LPT2 Device:" +msgid "LPT2 Device:" msgstr "LPT2-apparaat:" -msgid "LPT3 Device:" +msgid "LPT3 Device:" msgstr "LPT3-apparaat:" -msgid "LPT4 Device:" +msgid "LPT4 Device:" msgstr "LPT4-apparaat:" -msgid "Serial port 1" +msgid "Serial port 1" msgstr "Seriële poort 1" -msgid "Serial port 2" +msgid "Serial port 2" msgstr "Seriële poort 2" -msgid "Serial port 3" +msgid "Serial port 3" msgstr "Seriële poort 3" -msgid "Serial port 4" +msgid "Serial port 4" msgstr "Seriële poort 4" -msgid "Parallel port 1" +msgid "Parallel port 1" msgstr "Parallelle poort 1" -msgid "Parallel port 2" +msgid "Parallel port 2" msgstr "Parallelle poort 2" -msgid "Parallel port 3" +msgid "Parallel port 3" msgstr "Parallelle poort 3" -msgid "Parallel port 4" +msgid "Parallel port 4" msgstr "Parallelle poort 4" -msgid "HD Controller:" +msgid "HD Controller:" msgstr "HD-controller:" -msgid "FD Controller:" +msgid "FD Controller:" msgstr "FD-Controller:" -msgid "Tertiary IDE Controller" +msgid "Tertiary IDE Controller" msgstr "Tertiaire IDE-controller" -msgid "Quaternary IDE Controller" +msgid "Quaternary IDE Controller" msgstr "Quaternaire IDE-controller" -msgid "SCSI" +msgid "SCSI" msgstr "SCSI" -msgid "Controller 1:" +msgid "Controller 1:" msgstr "Controller 1:" -msgid "Controller 2:" +msgid "Controller 2:" msgstr "Controller 2:" -msgid "Controller 3:" +msgid "Controller 3:" msgstr "Controller 3:" -msgid "Controller 4:" +msgid "Controller 4:" msgstr "Controller 4:" -msgid "Cassette" +msgid "Cassette" msgstr "Cassette" -msgid "Hard disks:" +msgid "Hard disks:" msgstr "Harde schijven:" -msgid "&New..." +msgid "&New..." msgstr "&Nieuw..." -msgid "&Existing..." +msgid "&Existing..." msgstr "&Bestaande..." -msgid "&Remove" +msgid "&Remove" msgstr "&Verwijderen" -msgid "Bus:" +msgid "Bus:" msgstr "Bus:" -msgid "Channel:" +msgid "Channel:" msgstr "Kanaal:" -msgid "ID:" +msgid "ID:" msgstr "ID:" -msgid "&Specify..." +msgid "&Specify..." msgstr "&Specificeer..." -msgid "Sectors:" +msgid "Sectors:" msgstr "Sectoren:" -msgid "Heads:" +msgid "Heads:" msgstr "Heads:" -msgid "Cylinders:" +msgid "Cylinders:" msgstr "Cilinders:" -msgid "Size (MB):" +msgid "Size (MB):" msgstr "Grootte (MB):" -msgid "Type:" +msgid "Type:" msgstr "Type:" -msgid "Image Format:" +msgid "Image Format:" msgstr "Imageformaat:" -msgid "Block Size:" +msgid "Block Size:" msgstr "Blokgrootte:" -msgid "Floppy drives:" +msgid "Floppy drives:" msgstr "Floppy-schijfstations:" -msgid "Turbo timings" +msgid "Turbo timings" msgstr "Turbo timings" -msgid "Check BPB" +msgid "Check BPB" msgstr "Controleer BPB" -msgid "CD-ROM drives:" +msgid "CD-ROM drives:" msgstr "CD-ROM-stations:" -msgid "MO drives:" +msgid "MO drives:" msgstr "MO-schijven:" -msgid "ZIP drives:" +msgid "ZIP drives:" msgstr "ZIP-schijven:" -msgid "ZIP 250" +msgid "ZIP 250" msgstr "ZIP 250" -msgid "ISA RTC:" +msgid "ISA RTC:" msgstr "ISA RTC:" -msgid "ISA Memory Expansion" +msgid "ISA Memory Expansion" msgstr "ISA-geheugenuitbreiding" -msgid "Card 1:" +msgid "Card 1:" msgstr "Kaart 1:" -msgid "Card 2:" +msgid "Card 2:" msgstr "Kaart 2:" -msgid "Card 3:" +msgid "Card 3:" msgstr "Kaart 3:" -msgid "Card 4:" +msgid "Card 4:" msgstr "Kaart 4:" -msgid "ISABugger device" +msgid "ISABugger device" msgstr "ISABugger-apparaat" -msgid "POST card" +msgid "POST card" msgstr "POST-kaart" -msgid "86Box" +msgid "86Box" msgstr "86Box" -msgid "Error" +msgid "Error" msgstr "Fout" -msgid "Fatal error" +msgid "Fatal error" msgstr "Fatale fout" -msgid " - PAUSED" +msgid " - PAUSED" msgstr " - GEPAUZEERD" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." +msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Druk op Ctrl+Alt+PgDn om terug te gaan naar de venstermodus." -msgid "Speed" +msgid "Speed" msgstr "Snelheid" -msgid "ZIP %1 %2 (%3): %4" +msgid "ZIP %1 %2 (%3): %4" msgstr "ZIP %1 %2 (%3): %4" -msgid "ZIP images" +msgid "ZIP images" msgstr "ZIP-images" -msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." +msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." msgstr "86Box kon geen bruikbare ROM images vinden.\n\nDownload een ROM set en pak deze uit in de map \"roms\"." -msgid "(empty)" +msgid "(empty)" msgstr "(leeg)" -msgid "All files" +msgid "All files" msgstr "Alle bestanden" -msgid "Turbo" +msgid "Turbo" msgstr "Turbo" -msgid "On" +msgid "On" msgstr "Aan" -msgid "Off" +msgid "Off" msgstr "Uit" -msgid "All images" +msgid "All images" msgstr "Alle schijfimages" -msgid "Basic sector images" +msgid "Basic sector images" msgstr "Basissectorimages" -msgid "Surface images" +msgid "Surface images" msgstr "Oppervlakte-images" -msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." +msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." msgstr "Machine \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/machines. Overschakelen naar een beschikbare machine." -msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Videokaart \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Overschakel over naar een beschikbare videokaart." -msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." msgstr "Videokaart #2 \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Uitschakel de tweede videokaart." msgid "Device \"%hs\" is not available due to missing ROMs. Ignoring the device." msgstr "Het apparaat \"%hs\" is niet beschikbaar door ontbrekende ROMs. Negeer het apparaat." -msgid "Machine" +msgid "Machine" msgstr "Machine" -msgid "Display" +msgid "Display" msgstr "Scherm" -msgid "Input devices" +msgid "Input devices" msgstr "Invoerapparaten" -msgid "Sound" +msgid "Sound" msgstr "Geluid" -msgid "Network" +msgid "Network" msgstr "Netwerk" -msgid "Ports (COM & LPT)" +msgid "Ports (COM & LPT)" msgstr "Poorten (COM & LPT)" -msgid "Storage controllers" +msgid "Storage controllers" msgstr "Opslagcontrollers" -msgid "Hard disks" +msgid "Hard disks" msgstr "Harde schijven" -msgid "Floppy & CD-ROM drives" +msgid "Floppy & CD-ROM drives" msgstr "Floppy- en CD-ROM-stations" -msgid "Other removable devices" +msgid "Other removable devices" msgstr "Andere verwijderbare apparaten" -msgid "Other peripherals" +msgid "Other peripherals" msgstr "Andere randapparatuur" -msgid "Click to capture mouse" +msgid "Click to capture mouse" msgstr "Klik om muis vast te leggen" -msgid "Press %1 to release mouse" +msgid "Press %1 to release mouse" msgstr "Druk op %1 om de muis los te laten" -msgid "Press %1 or middle button to release mouse" +msgid "Press %1 or middle button to release mouse" msgstr "Druk op %1 of middelste knop om de muis los te laten" -msgid "Bus" +msgid "Bus" msgstr "Bus" -msgid "File" +msgid "File" msgstr "Bestand" -msgid "C" +msgid "C" msgstr "C" -msgid "H" +msgid "H" msgstr "H" -msgid "S" +msgid "S" msgstr "S" -msgid "KB" +msgid "KB" msgstr "KB" -msgid "Default" +msgid "Default" msgstr "Standaard" -msgid "%1 Wait state(s)" +msgid "%1 Wait state(s)" msgstr "%1 Wachttoestand(en)" -msgid "Type" +msgid "Type" msgstr "Type" -msgid "No PCap devices found" +msgid "No PCap devices found" msgstr "Geen PCap-apparaten gevonden" -msgid "Invalid PCap device" +msgid "Invalid PCap device" msgstr "Ongeldig PCap-apparaat" -msgid "2-axis, 2-button joystick(s)" +msgid "2-axis, 2-button joystick(s)" msgstr "Joystick(s) met 2 assen en 2 knoppen" -msgid "2-axis, 4-button joystick" +msgid "2-axis, 4-button joystick" msgstr "Joystick met 2 assen en 4 knoppen" -msgid "2-axis, 6-button joystick" +msgid "2-axis, 6-button joystick" msgstr "Joystick met 2 assen en 6 knoppen" -msgid "2-axis, 8-button joystick" +msgid "2-axis, 8-button joystick" msgstr "Joystick met 2 assen en 8 knoppen" -msgid "3-axis, 2-button joystick" +msgid "3-axis, 2-button joystick" msgstr "Joystick met 3 assen en 2 knoppen" -msgid "3-axis, 4-button joystick" +msgid "3-axis, 4-button joystick" msgstr "Joystick met 3 assen en 4 knoppen" -msgid "4-axis, 4-button joystick" +msgid "4-axis, 4-button joystick" msgstr "Joystick met 4 assen en 4 knoppen" -msgid "CH Flightstick Pro" +msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" -msgid "Microsoft SideWinder Pad" +msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" -msgid "Thrustmaster Flight Control System" +msgid "Thrustmaster Flight Control System" msgstr "Thrustmaster Flight Control systeem" -msgid "None" +msgid "None" msgstr "Geen" -msgid "%1 MB (CHS: %2, %3, %4)" +msgid "%1 MB (CHS: %2, %3, %4)" msgstr "%1 MB (CHS: %2, %3, %4)" -msgid "Floppy %1 (%2): %3" +msgid "Floppy %1 (%2): %3" msgstr "Floppy %1 (%2): %3" -msgid "Advanced sector images" +msgid "Advanced sector images" msgstr "Geavanceerde sector-images" -msgid "Flux images" +msgid "Flux images" msgstr "Flux images" -msgid "Are you sure you want to hard reset the emulated machine?" +msgid "Are you sure you want to hard reset the emulated machine?" msgstr "Weet je zeker dat je de geëmuleerde machine wilt resetten?" -msgid "Are you sure you want to exit 86Box?" +msgid "Are you sure you want to exit 86Box?" msgstr "Weet je zeker dat je 86Box wilt verlaten?" -msgid "Unable to initialize Ghostscript" +msgid "Unable to initialize Ghostscript" msgstr "Kan Ghostscript niet initialiseren" -msgid "Unable to initialize GhostPCL" +msgid "Unable to initialize GhostPCL" msgstr "Kan GhostPCL niet initialiseren" -msgid "MO %1 (%2): %3" +msgid "MO %1 (%2): %3" msgstr "MO %1 (%2): %3" -msgid "MO images" +msgid "MO images" msgstr "MO-images" -msgid "Welcome to 86Box!" +msgid "Welcome to 86Box!" msgstr "Welkom bij 86Box!" -msgid "Internal device" +msgid "Internal device" msgstr "Intern apparaat" -msgid "Exit" +msgid "Exit" msgstr "&Afsluiten" -msgid "No ROMs found" +msgid "No ROMs found" msgstr "Geen ROMs gevonden" -msgid "Do you want to save the settings?" +msgid "Do you want to save the settings?" msgstr "Wil je de instellingen opslaan?" -msgid "This will hard reset the emulated machine." +msgid "This will hard reset the emulated machine." msgstr "Dit zal de geëmuleerde machine een hard reset geven." -msgid "Save" +msgid "Save" msgstr "Opslaan" -msgid "About 86Box" +msgid "About 86Box" msgstr "Over 86Box" -msgid "86Box v" +msgid "86Box v" msgstr "86Box v" -msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." +msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." msgstr "Een emulator van oude computers\n\nAuteurs: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nMet eerdere bijdragen van Sarah Walker, leilei, JohnElliott, greatpsycho en anderen.\n\nUitgebracht onder de GNU General Public License versie 2 of later. Zie LICENSE voor meer informatie." -msgid "Hardware not available" +msgid "Hardware not available" msgstr "Hardware niet beschikbaar" -msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." +msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." msgstr "Zorg ervoor dat %1 is geïnstalleerd en dat je een %1-compatibele netwerkverbinding hebt." -msgid "Invalid configuration" +msgid "Invalid configuration" msgstr "Ongeldige configuratie" -msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." +msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." msgstr "%1 is vereist voor automatische conversie van PostScript-bestanden naar PDF.\n\nAlle documenten die naar de generieke PostScript-printer worden gestuurd, worden opgeslagen als PostScript-bestanden (.ps)." -msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." +msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 is vereist voor automatische conversie van PCL-bestanden naar PDF.\n\nAlle documenten die naar de generieke PCL-printer worden gestuurd, worden opgeslagen als Printer Command Language (.pcl) bestanden." -msgid "Entering fullscreen mode" +msgid "Entering fullscreen mode" msgstr "Volledig scherm modus openen" -msgid "Don't show this message again" +msgid "Don't show this message again" msgstr "Dit bericht niet meer tonen" -msgid "Don't exit" +msgid "Don't exit" msgstr "Niet afsluiten" -msgid "Reset" +msgid "Reset" msgstr "Reset" -msgid "Don't reset" +msgid "Don't reset" msgstr "Niet resetten" -msgid "CD-ROM images" +msgid "CD-ROM images" msgstr "CD-ROM-images" -msgid "%1 Device Configuration" +msgid "%1 Device Configuration" msgstr "%1 Apparaatconfiguratie" -msgid "Monitor in sleep mode" +msgid "Monitor in sleep mode" msgstr "Monitor in slaapstand" -msgid "GLSL shaders" +msgid "GLSL shaders" msgstr "GLSL Shaders" -msgid "You are loading an unsupported configuration" +msgid "You are loading an unsupported configuration" msgstr "U laadt een configuratie die niet wordt ondersteund" -msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." +msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." msgstr "Filteren op CPU type voor de geselecteerde machine is niet mogelijk met de geselecteerde machine.\n\nDit maakt het mogelijk een CPU te kunnen kiezen die anders niet compatible zou zijn met de geselecteerde machine. Je kunt hiermee echter compatibiliteitsproblemen krijgen met de BIOS van de machine of met andere software.\n\nHet inschakelen van deze instelling wordt niet officieel ondersteund en bugrapporten die worden ingediend kunnen als ongeldig worden gesloten." -msgid "Continue" +msgid "Continue" msgstr "Doorgaan" -msgid "Cassette: %1" +msgid "Cassette: %1" msgstr "Cassette: %1" -msgid "Cassette images" +msgid "Cassette images" msgstr "Cassette-images" -msgid "Cartridge %1: %2" +msgid "Cartridge %1: %2" msgstr "Cartridge %1: %2" -msgid "Cartridge images" +msgid "Cartridge images" msgstr "Cartridge-images" -msgid "Resume execution" +msgid "Resume execution" msgstr "Hervat executie" -msgid "Pause execution" +msgid "Pause execution" msgstr "Pauze executie" -msgid "Press Ctrl+Alt+Del" +msgid "Press Ctrl+Alt+Del" msgstr "Druk op Ctrl+Alt+Del" -msgid "Press Ctrl+Alt+Esc" +msgid "Press Ctrl+Alt+Esc" msgstr "Druk op Ctrl+Alt+Esc" -msgid "Hard reset" +msgid "Hard reset" msgstr "Harde reset" -msgid "ACPI shutdown" +msgid "ACPI shutdown" msgstr "ACPI uitschakeling" -msgid "Hard disk (%1)" +msgid "Hard disk (%1)" msgstr "Harde schijf (%1)" -msgid "MFM/RLL or ESDI CD-ROM drives never existed" +msgid "MFM/RLL or ESDI CD-ROM drives never existed" msgstr "MFM/RLL of ESDI CD-ROM-stations hebben nooit bestaan" -msgid "Custom..." +msgid "Custom..." msgstr "Aangepast..." -msgid "Custom (large)..." +msgid "Custom (large)..." msgstr "Aangepast (groot)..." -msgid "Add New Hard Disk" +msgid "Add New Hard Disk" msgstr "Nieuwe harde schijf toevoegen" -msgid "Add Existing Hard Disk" +msgid "Add Existing Hard Disk" msgstr "Bestaande harde schijf toevoegen" -msgid "HDI disk images cannot be larger than 4 GB." +msgid "HDI disk images cannot be larger than 4 GB." msgstr "HDI-schijfimages kunnen niet groter zijn dan 4 GB." -msgid "Disk images cannot be larger than 127 GB." +msgid "Disk images cannot be larger than 127 GB." msgstr "Schijfimages kunnen niet groter zijn dan 127 GB." -msgid "Hard disk images" +msgid "Hard disk images" msgstr "Harde schijf-image" -msgid "Unable to read file" +msgid "Unable to read file" msgstr "Kan bestand niet lezen" -msgid "Unable to write file" +msgid "Unable to write file" msgstr "Kan bestand niet schrijven" -msgid "HDI or HDX images with a sector size other than 512 are not supported." +msgid "HDI or HDX images with a sector size other than 512 are not supported." msgstr "HDI- of HDX-image met een andere sectorgrootte dan 512 worden niet ondersteund." -msgid "Disk image file already exists" +msgid "Disk image file already exists" msgstr "Schijfimagebestand bestaat al" -msgid "Please specify a valid file name." +msgid "Please specify a valid file name." msgstr "Geef een geldige bestandsnaam op." -msgid "Disk image created" +msgid "Disk image created" msgstr "Schijfimage gemaakt" -msgid "Make sure the file exists and is readable." +msgid "Make sure the file exists and is readable." msgstr "Controleer of het bestand bestaat en leesbaar is." -msgid "Make sure the file is being saved to a writable directory." +msgid "Make sure the file is being saved to a writable directory." msgstr "Zorg ervoor dat het bestand wordt opgeslagen in een schrijfbare map." -msgid "Disk image too large" +msgid "Disk image too large" msgstr "Schijfimage te groot" -msgid "Remember to partition and format the newly-created drive." +msgid "Remember to partition and format the newly-created drive." msgstr "Vergeet niet om de nieuw aangemaakte schijf te partitioneren en te formatteren." -msgid "The selected file will be overwritten. Are you sure you want to use it?" +msgid "The selected file will be overwritten. Are you sure you want to use it?" msgstr "Het geselecteerde bestand wordt overschreven. Weet u zeker dat u het wilt gebruiken?" -msgid "Unsupported disk image" +msgid "Unsupported disk image" msgstr "Niet-ondersteunde schijfimage" -msgid "Overwrite" +msgid "Overwrite" msgstr "Overschrijven" -msgid "Don't overwrite" +msgid "Don't overwrite" msgstr "Niet overschrijven" -msgid "Raw image" +msgid "Raw image" msgstr "Ruw image" -msgid "HDI image" +msgid "HDI image" msgstr "HDI-image" -msgid "HDX image" +msgid "HDX image" msgstr "HDX-image" -msgid "Fixed-size VHD" +msgid "Fixed-size VHD" msgstr "VHD met vaste grootte" -msgid "Dynamic-size VHD" +msgid "Dynamic-size VHD" msgstr "VHD met dynamisch grootte" -msgid "Differencing VHD" +msgid "Differencing VHD" msgstr "Verschil-VHD" -msgid "(N/A)" +msgid "(N/A)" msgstr "(N/A)" -msgid "Raw image (.img)" +msgid "Raw image (.img)" msgstr "Ruw image (.img)" -msgid "HDI image (.hdi)" +msgid "HDI image (.hdi)" msgstr "HDI-image (.hdi)" -msgid "HDX image (.hdx)" +msgid "HDX image (.hdx)" msgstr "HDX-image (.hdx)" -msgid "Fixed-size VHD (.vhd)" +msgid "Fixed-size VHD (.vhd)" msgstr "VHD met vaste grootte (.vhd)" -msgid "Dynamic-size VHD (.vhd)" +msgid "Dynamic-size VHD (.vhd)" msgstr "VHD met dynamisch grootte (.vhd)" -msgid "Differencing VHD (.vhd)" +msgid "Differencing VHD (.vhd)" msgstr "Verschil-VHD (.vhd)" -msgid "Large blocks (2 MB)" +msgid "Large blocks (2 MB)" msgstr "Grote blokken (2 MB)" -msgid "Small blocks (512 KB)" +msgid "Small blocks (512 KB)" msgstr "Kleine blokken (512 KB)" -msgid "VHD files" +msgid "VHD files" msgstr "VHD-bestanden" -msgid "Select the parent VHD" +msgid "Select the parent VHD" msgstr "Selecteer de bovenliggende VHD" -msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" +msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" msgstr "Dit kan betekenen dat de bovenliggende image is gewijzigd nadat de verschil-image is gemaakt.\n\nDit kan ook gebeuren als de imagebestanden zijn verplaatst of gekopieerd, of door een fout in het programma waarmee deze schijf is gemaakt.\n\nWil je de tijdstempels herstellen?" -msgid "Parent and child disk timestamps do not match" +msgid "Parent and child disk timestamps do not match" msgstr "Bovenliggende en onderliggende schijf tijdstempels komen niet overeen" -msgid "Could not fix VHD timestamp." +msgid "Could not fix VHD timestamp." msgstr "Kan VHD tijdstempel niet herstellen." -msgid "MFM/RLL" +msgid "MFM/RLL" msgstr "MFM/RLL" -msgid "XTA" +msgid "XTA" msgstr "XTA" -msgid "ESDI" +msgid "ESDI" msgstr "ESDI" -msgid "IDE" +msgid "IDE" msgstr "IDE" -msgid "ATAPI" +msgid "ATAPI" msgstr "ATAPI" -msgid "CD-ROM %1 (%2): %3" +msgid "CD-ROM %1 (%2): %3" msgstr "CD-ROM %1 (%2): %3" -msgid "160 KB" +msgid "160 KB" msgstr "160 KB" -msgid "180 KB" +msgid "180 KB" msgstr "180 KB" -msgid "320 KB" +msgid "320 KB" msgstr "320 KB" -msgid "360 KB" +msgid "360 KB" msgstr "360 KB" -msgid "640 KB" +msgid "640 KB" msgstr "640 KB" -msgid "720 KB" +msgid "720 KB" msgstr "720 KB" -msgid "1.2 MB" +msgid "1.2 MB" msgstr "1,2 MB" -msgid "1.25 MB" +msgid "1.25 MB" msgstr "1,25 MB" -msgid "1.44 MB" +msgid "1.44 MB" msgstr "1,44 MB" -msgid "DMF (cluster 1024)" +msgid "DMF (cluster 1024)" msgstr "DMF (cluster 1024)" -msgid "DMF (cluster 2048)" +msgid "DMF (cluster 2048)" msgstr "DMF (cluster 2048)" -msgid "2.88 MB" +msgid "2.88 MB" msgstr "2,88 MB" -msgid "ZIP 100" +msgid "ZIP 100" msgstr "ZIP 100" -msgid "3.5\" 128 MB (ISO 10090)" +msgid "3.5\" 128 MB (ISO 10090)" msgstr "3,5\" 128 MB (ISO 10090)" -msgid "3.5\" 230 MB (ISO 13963)" +msgid "3.5\" 230 MB (ISO 13963)" msgstr "3,5\" 230 MB (ISO 13963)" -msgid "3.5\" 540 MB (ISO 15498)" +msgid "3.5\" 540 MB (ISO 15498)" msgstr "3,5\" 540 MB (ISO 15498)" -msgid "3.5\" 640 MB (ISO 15498)" +msgid "3.5\" 640 MB (ISO 15498)" msgstr "3,5\" 640 MB (ISO 15498)" -msgid "3.5\" 1.3 GB (GigaMO)" +msgid "3.5\" 1.3 GB (GigaMO)" msgstr "3,5\" 1,3 GB (GigaMO)" -msgid "3.5\" 2.3 GB (GigaMO 2)" +msgid "3.5\" 2.3 GB (GigaMO 2)" msgstr "3,5\" 2,3 GB (GigaMO 2)" -msgid "5.25\" 600 MB" +msgid "5.25\" 600 MB" msgstr "5,25\" 600 MB" -msgid "5.25\" 650 MB" +msgid "5.25\" 650 MB" msgstr "5,25\" 650 MB" -msgid "5.25\" 1 GB" +msgid "5.25\" 1 GB" msgstr "5,25\" 1 GB" -msgid "5.25\" 1.3 GB" +msgid "5.25\" 1.3 GB" msgstr "5,25\" 1,3 GB" -msgid "Perfect RPM" +msgid "Perfect RPM" msgstr "Perfecte RPM" -msgid "1% below perfect RPM" +msgid "1% below perfect RPM" msgstr "1% onder perfecte RPM" -msgid "1.5% below perfect RPM" +msgid "1.5% below perfect RPM" msgstr "1,5% onder perfecte RPM" -msgid "2% below perfect RPM" +msgid "2% below perfect RPM" msgstr "2% onder perfecte RPM" -msgid "(System Default)" +msgid "(System Default)" msgstr "(Systeemstandaard)" -msgid "Failed to initialize network driver" +msgid "Failed to initialize network driver" msgstr "Netwerkstuurprogramma niet geïnitialiseerd" -msgid "The network configuration will be switched to the null driver" +msgid "The network configuration will be switched to the null driver" msgstr "De netwerkconfiguratie wordt overgeschakeld naar de nul-driver" -msgid "Mouse sensitivity:" +msgid "Mouse sensitivity:" msgstr "Muisgevoeligheid:" -msgid "Select media images from program working directory" +msgid "Select media images from program working directory" msgstr "Selecteer media-images uit de werkmap van het programma" -msgid "PIT mode:" +msgid "PIT mode:" msgstr "PIT-modus:" -msgid "Auto" +msgid "Auto" msgstr "Auto" -msgid "Slow" +msgid "Slow" msgstr "Langzaam" -msgid "Fast" +msgid "Fast" msgstr "Snel" -msgid "&Auto-pause on focus loss" +msgid "&Auto-pause on focus loss" msgstr "&Autopauze bij focusverlies" -msgid "WinBox is no longer supported" +msgid "WinBox is no longer supported" msgstr "WinBox wordt niet langer ondersteund" -msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." +msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." msgstr "De ontwikkeling van de WinBox manager is gestopt in 2022 door een gebrek aan beheerders. Omdat we onze inspanningen richten op het nog beter maken van 86Box, hebben we de beslissing genomen om WinBox niet langer te ondersteunen als een manager.\n\nEr zullen geen verdere updates worden geleverd door WinBox. Je kunt onjuist gedrag tegenkomen als je het blijft gebruiken met nieuwere versies van 86Box. Alle bugrapporten gerelateerd aan het gedrag van WinBox zullen worden gesloten als ongeldig.\n\nGa naar 86box.net voor een lijst van andere managers die je kunt gebruiken." -msgid "Generate" +msgid "Generate" msgstr "Genereren" -msgid "Joystick configuration" +msgid "Joystick configuration" msgstr "Joystick configuratie " -msgid "Device" +msgid "Device" msgstr "Apparaat" -msgid "%1 (X axis)" +msgid "%1 (X axis)" msgstr "%1 (X-as)" -msgid "%1 (Y axis)" +msgid "%1 (Y axis)" msgstr "%1 (Y-as)" -msgid "MCA devices" +msgid "MCA devices" msgstr "MCA-apparaten" -msgid "List of MCA devices:" +msgid "List of MCA devices:" msgstr "Lijst van MCA-apparaten:" -msgid "Tablet tool" +msgid "Tablet tool" msgstr "Tablet-hulpmiddel" -msgid "Qt (OpenGL &ES)" +msgid "Qt (OpenGL &ES)" msgstr "Qt (OpenGL &ES)" -msgid "About Qt" +msgid "About Qt" msgstr "Over Qt" -msgid "MCA devices..." +msgid "MCA devices..." msgstr "MCA-apparaten..." -msgid "Show non-primary monitors" +msgid "Show non-primary monitors" msgstr "Toon niet-primaire monitors" -msgid "Open screenshots folder..." +msgid "Open screenshots folder..." msgstr "Map met schermafbeeldingen openen..." -msgid "Apply fullscreen stretch mode when maximized" +msgid "Apply fullscreen stretch mode when maximized" msgstr "Pas fullscreen stretchmodus toe wanneer gemaximaliseerd" -msgid "Cursor/Puck" +msgid "Cursor/Puck" msgstr "Cursor/Puck" -msgid "Pen" +msgid "Pen" msgstr "Pen" -msgid "Host CD/DVD Drive (%1:)" +msgid "Host CD/DVD Drive (%1:)" msgstr "Host cd/dvd-station (%1:)" -msgid "&Connected" +msgid "&Connected" msgstr "&Verbonden" -msgid "Clear image history" +msgid "Clear image history" msgstr "Imagegeschiedenis verwijderen" -msgid "Create..." +msgid "Create..." msgstr "Creëer..." -msgid "Host CD/DVD Drive (%1)" +msgid "Host CD/DVD Drive (%1)" msgstr "Host CD/DVD-station (%1)" -msgid "Unknown Bus" +msgid "Unknown Bus" msgstr "Onbekende bus" -msgid "Null Driver" +msgid "Null Driver" msgstr "Null Driver" -msgid "NIC %1 (%2) %3" +msgid "NIC %1 (%2) %3" msgstr "NIC %1 (%2) %3" -msgid "Render behavior" +msgid "Render behavior" msgstr "Rendergedrag" -msgid "Use target framerate:" +msgid "Use target framerate:" msgstr "Gebruik doelframerate:" -msgid " fps" +msgid " fps" msgstr " fps" -msgid "VSync" +msgid "VSync" msgstr "VSync" -msgid "Synchronize with video" +msgid "Synchronize with video" msgstr "Synchroniseren met video" -msgid "Shaders" +msgid "Shaders" msgstr "Shaders" -msgid "Remove" +msgid "Remove" msgstr "Verwijderen" -msgid "Browse..." +msgid "Browse..." msgstr "Bladeren..." -msgid "Couldn't create OpenGL context." +msgid "Couldn't create OpenGL context." msgstr "Kan OpenGL context niet maken." -msgid "Couldn't switch to OpenGL context." +msgid "Couldn't switch to OpenGL context." msgstr "Kan niet overschakelen naar OpenGL context." -msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL versie 3.0 of hoger is vereist. De huidige versie is %1.%2" -msgid "Error initializing OpenGL" +msgid "Error initializing OpenGL" msgstr "Fout bij het initialiseren van OpenGL" -msgid "\nFalling back to software rendering." +msgid "\nFalling back to software rendering." msgstr "\nTerugvallen op software rendering." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Bij het selecteren van media-images (CD-ROM, floppy, etc.) zal de \"open dialoog\" starten in dezelfde map als het 86Box configuratiebestand. Deze instelling is doet er waarschijnlijk alleen toe op macOS.</p></body></html>" -msgid "This machine might have been moved or copied." +msgid "This machine might have been moved or copied." msgstr "Deze machine is misschien verplaatst of gekopieerd." -msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure." +msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure." msgstr "Om een goede netwerkfunctionaliteit te garanderen, moet 86Box weten of deze machine verplaatst of gekopieerd is.\n\nSelecteer \"Ik heb het gekopieerd\" als u het niet zeker weet." -msgid "I Moved It" +msgid "I Moved It" msgstr "Ik heb het verplaatst" -msgid "I Copied It" +msgid "I Copied It" msgstr "Ik heb het gekopieerd" -msgid "86Box Monitor #" +msgid "86Box Monitor #" msgstr "86Box Monitor #" -msgid "No MCA devices." +msgid "No MCA devices." msgstr "Geen MCA-apparaten." -msgid "MiB" +msgid "MiB" msgstr "MiB" -msgid "Network Card #1" +msgid "Network Card #1" msgstr "Netwerkkaart #1" -msgid "Network Card #2" +msgid "Network Card #2" msgstr "Netwerkkaart #2" -msgid "Network Card #3" +msgid "Network Card #3" msgstr "Netwerkkaart #3" -msgid "Network Card #4" +msgid "Network Card #4" msgstr "Netwerkkaart #4" -msgid "Mode" +msgid "Mode" msgstr "Modus" -msgid "Interface" +msgid "Interface" msgstr "Interface" -msgid "Adapter" +msgid "Adapter" msgstr "Adapter" -msgid "VDE Socket" +msgid "VDE Socket" msgstr "VDE-socket" -msgid "86Box Unit Tester" +msgid "86Box Unit Tester" msgstr "86Box apparaattester" -msgid "Novell NetWare 2.x Key Card" +msgid "Novell NetWare 2.x Key Card" msgstr "Novell NetWare 2.x Key Card" -msgid "Serial port passthrough 1" +msgid "Serial port passthrough 1" msgstr "Seriële poort doorvoer 1" -msgid "Serial port passthrough 2" +msgid "Serial port passthrough 2" msgstr "Seriële poort doorvoer 2" -msgid "Serial port passthrough 3" +msgid "Serial port passthrough 3" msgstr "Seriële poort doorvoer 3" -msgid "Serial port passthrough 4" +msgid "Serial port passthrough 4" msgstr "Seriële poort doorvoer 4" -msgid "Renderer options..." +msgid "Renderer options..." msgstr "Renderer-opties..." -msgid "Logitech/Microsoft Bus Mouse" +msgid "Logitech/Microsoft Bus Mouse" msgstr "Logitech/Microsoft busmuis" -msgid "Microsoft Bus Mouse (InPort)" +msgid "Microsoft Bus Mouse (InPort)" msgstr "Microsoft busmuis (InPort)" -msgid "Mouse Systems Serial Mouse" +msgid "Mouse Systems Serial Mouse" msgstr "Mouse Systems seriële muis" -msgid "Microsoft Serial Mouse" +msgid "Microsoft Serial Mouse" msgstr "Microsoft seriële muis" -msgid "Logitech Serial Mouse" +msgid "Logitech Serial Mouse" msgstr "Logitech seriële muis" -msgid "PS/2 Mouse" +msgid "PS/2 Mouse" msgstr "PS/2-muis" -msgid "3M MicroTouch (Serial)" +msgid "3M MicroTouch (Serial)" msgstr "3M MicroTouch (serieel)" -msgid "[COM] Standard Hayes-compliant Modem" +msgid "[COM] Standard Hayes-compliant Modem" msgstr "COM] Standaard Hayes-compatibele modem " -msgid "Roland MT-32 Emulation" +msgid "Roland MT-32 Emulation" msgstr "Roland MT-32-emulatie" -msgid "Roland MT-32 (New) Emulation" +msgid "Roland MT-32 (New) Emulation" msgstr "Roland MT-32 (nieuwe) emulatie" -msgid "Roland CM-32L Emulation" +msgid "Roland CM-32L Emulation" msgstr "Roland CM-32L-emulatie" -msgid "Roland CM-32LN Emulation" +msgid "Roland CM-32LN Emulation" msgstr "Roland CM-32LN-emulatie" -msgid "OPL4-ML Daughterboard" +msgid "OPL4-ML Daughterboard" msgstr "OPL4-ML-dochterbord" -msgid "System MIDI" +msgid "System MIDI" msgstr "Systeem MIDI" -msgid "MIDI Input Device" +msgid "MIDI Input Device" msgstr "MIDI-ingangsapparaat" -msgid "BIOS Address" +msgid "BIOS Address" msgstr "BIOS-adres" -msgid "Enable BIOS extension ROM Writes" +msgid "Enable BIOS extension ROM Writes" msgstr "BIOS-extensie ROM Writes inschakelen" -msgid "Address" +msgid "Address" msgstr "Adres" -msgid "IRQ" +msgid "IRQ" msgstr "IRQ" -msgid "BIOS Revision" +msgid "BIOS Revision" msgstr "BIOS Revisie" -msgid "Translate 26 -> 17" +msgid "Translate 26 -> 17" msgstr "Vertaal 26 -> 17" -msgid "Language" +msgid "Language" msgstr "Taal" -msgid "Enable backlight" +msgid "Enable backlight" msgstr "Backlight inschakelen" -msgid "Invert colors" +msgid "Invert colors" msgstr "Kleuren omkeren" -msgid "BIOS size" +msgid "BIOS size" msgstr "BIOS-grootte" -msgid "Map C0000-C7FFF as UMB" +msgid "Map C0000-C7FFF as UMB" msgstr "Geheugenadres C0000-C7FFF toewijzen aan UMB" -msgid "Map C8000-CFFFF as UMB" +msgid "Map C8000-CFFFF as UMB" msgstr "Geheugenadres C8000-CFFFF toewijzen aan UMB" -msgid "Map D0000-D7FFF as UMB" +msgid "Map D0000-D7FFF as UMB" msgstr "Geheugenadres D0000-D7FFF toewijzen aan UMB" -msgid "Map D8000-DFFFF as UMB" +msgid "Map D8000-DFFFF as UMB" msgstr "Geheugenadres D8000-DFFFF toewijzen aan UMB" -msgid "Map E0000-E7FFF as UMB" +msgid "Map E0000-E7FFF as UMB" msgstr "Geheugenadres E0000-E7FFF toewijzen aan UMB" -msgid "Map E8000-EFFFF as UMB" +msgid "Map E8000-EFFFF as UMB" msgstr "Geheugenadres E8000-EFFFF toewijzen aan UMB" -msgid "JS9 Jumper (JIM)" +msgid "JS9 Jumper (JIM)" msgstr "JS9 Jumper (JIM)" -msgid "MIDI Output Device" +msgid "MIDI Output Device" msgstr "MIDI-uitgangsapparaat" -msgid "MIDI Real time" +msgid "MIDI Real time" msgstr "MIDI real-time" -msgid "MIDI Thru" +msgid "MIDI Thru" msgstr "MIDI doorvoer" -msgid "MIDI Clockout" +msgid "MIDI Clockout" msgstr "MIDI Clockout" -msgid "SoundFont" +msgid "SoundFont" msgstr "SoundFont" -msgid "Output Gain" +msgid "Output Gain" msgstr "Output Gain" -msgid "Chorus" +msgid "Chorus" msgstr "Chorus" -msgid "Chorus Voices" +msgid "Chorus Voices" msgstr "Chorus-stemmen" -msgid "Chorus Level" +msgid "Chorus Level" msgstr "Chorus-niveau" -msgid "Chorus Speed" +msgid "Chorus Speed" msgstr "Chorus-snelheid" -msgid "Chorus Depth" +msgid "Chorus Depth" msgstr "Chorus-diepte" -msgid "Chorus Waveform" +msgid "Chorus Waveform" msgstr "Chorus-golfvorm" -msgid "Reverb" +msgid "Reverb" msgstr "Reverb" -msgid "Reverb Room Size" +msgid "Reverb Room Size" msgstr "Reverbkamer afmetingen" -msgid "Reverb Damping" +msgid "Reverb Damping" msgstr "Reverbdemping" -msgid "Reverb Width" +msgid "Reverb Width" msgstr "Reverbbreedte" -msgid "Reverb Level" +msgid "Reverb Level" msgstr "Reverbniveau" -msgid "Interpolation Method" +msgid "Interpolation Method" msgstr "Interpolatiemethode" -msgid "Reverb Output Gain" +msgid "Reverb Output Gain" msgstr "Reverbuitgang Versterking" -msgid "Reversed stereo" +msgid "Reversed stereo" msgstr "Omgekeerde stereo" -msgid "Nice ramp" +msgid "Nice ramp" msgstr "Mooie helling" -msgid "Hz" +msgid "Hz" msgstr "Hz" -msgid "Buttons" +msgid "Buttons" msgstr "Knoppen" -msgid "Serial Port" +msgid "Serial Port" msgstr "Seriële poort" -msgid "RTS toggle" +msgid "RTS toggle" msgstr "RTS toggle" -msgid "Revision" +msgid "Revision" msgstr "Revisie" -msgid "Controller" +msgid "Controller" msgstr "Controller" -msgid "Show Crosshair" +msgid "Show Crosshair" msgstr "Toon dradenkruis" -msgid "DMA" +msgid "DMA" msgstr "DMA" -msgid "MAC Address" +msgid "MAC Address" msgstr "MAC-adres" -msgid "MAC Address OUI" +msgid "MAC Address OUI" msgstr "MAC-adres OUI" -msgid "Enable BIOS" +msgid "Enable BIOS" msgstr "BIOS inschakelen" -msgid "Baud Rate" +msgid "Baud Rate" msgstr "Baud-snelheid" -msgid "TCP/IP listening port" +msgid "TCP/IP listening port" msgstr "TCP/IP-luisterpoort" -msgid "Phonebook File" +msgid "Phonebook File" msgstr "Telefoonboekbestand" -msgid "Telnet emulation" +msgid "Telnet emulation" msgstr "Telnet-emulatie" -msgid "RAM Address" +msgid "RAM Address" msgstr "RAM-adres" -msgid "RAM size" +msgid "RAM size" msgstr "RAM-grootte" -msgid "Initial RAM size" +msgid "Initial RAM size" msgstr "Oorspronkelijke RAM-grootte" -msgid "Serial Number" +msgid "Serial Number" msgstr "Serienummer" -msgid "Host ID" +msgid "Host ID" msgstr "Host-ID" -msgid "FDC Address" +msgid "FDC Address" msgstr "FDC Adres" -msgid "MPU-401 Address" +msgid "MPU-401 Address" msgstr "MPU-401 Adres" -msgid "MPU-401 IRQ" +msgid "MPU-401 IRQ" msgstr "MPU-401 IRQ" -msgid "Receive MIDI input" +msgid "Receive MIDI input" msgstr "MIDI-ingang ontvangen" -msgid "Low DMA" +msgid "Low DMA" msgstr "Lage DMA" -msgid "Enable Game port" +msgid "Enable Game port" msgstr "Game-poort inschakelen" -msgid "Surround module" +msgid "Surround module" msgstr "Surroundmodule" -msgid "CODEC" +msgid "CODEC" msgstr "Codec" -msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" msgstr "Verhoog CODEC interrupt bij CODEC setup (nodig voor sommige stuurprogramma's)" -msgid "SB Address" +msgid "SB Address" msgstr "SB-adres" -msgid "WSS IRQ" +msgid "WSS IRQ" msgstr "WSS IRQ" -msgid "WSS DMA" +msgid "WSS DMA" msgstr "WSS DMA" -msgid "Enable OPL" +msgid "Enable OPL" msgstr "OPL inschakelen" -msgid "Receive MIDI input (MPU-401)" +msgid "Receive MIDI input (MPU-401)" msgstr "MIDI-ingang ontvangen (MPU-401)" -msgid "SB low DMA" +msgid "SB low DMA" msgstr "SB lage DMA" -msgid "6CH variant (6-channel)" +msgid "6CH variant (6-channel)" msgstr "6CH-variant (6-kanaals)" -msgid "Enable CMS" +msgid "Enable CMS" msgstr "CMS inschakelen" -msgid "Mixer" +msgid "Mixer" msgstr "Mixer" -msgid "High DMA" +msgid "High DMA" msgstr "Hoge DMA" -msgid "Control PC speaker" +msgid "Control PC speaker" msgstr "Bestuur pc-luidspreker" -msgid "Memory size" +msgid "Memory size" msgstr "Geheugengrootte" -msgid "EMU8000 Address" +msgid "EMU8000 Address" msgstr "EMU8000 Adres" -msgid "IDE Controller" +msgid "IDE Controller" msgstr "IDE-controller" -msgid "Codec" +msgid "Codec" msgstr "Codec" -msgid "GUS type" +msgid "GUS type" msgstr "GUS-type" -msgid "Enable 0x04 \"Exit 86Box\" command" +msgid "Enable 0x04 \"Exit 86Box\" command" msgstr "Schakel het commando 0x04 \"Exit 86Box\" in" -msgid "Display type" +msgid "Display type" msgstr "Scherm type" -msgid "Composite type" +msgid "Composite type" msgstr "Composite type" -msgid "RGB type" +msgid "RGB type" msgstr "RGB-type" -msgid "Line doubling type" +msgid "Line doubling type" msgstr "Type lijnverdubbeling" -msgid "Snow emulation" +msgid "Snow emulation" msgstr "Sneeuwemulatie" -msgid "Monitor type" +msgid "Monitor type" msgstr "Type monitor" -msgid "Character set" +msgid "Character set" msgstr "Tekenset" -msgid "XGA type" +msgid "XGA type" msgstr "XGA-type" -msgid "Instance" +msgid "Instance" msgstr "Instantie" -msgid "MMIO Address" +msgid "MMIO Address" msgstr "MMIO-adres" -msgid "RAMDAC type" +msgid "RAMDAC type" msgstr "RAMDAC type" -msgid "Blend" +msgid "Blend" msgstr "Mengen" -msgid "Bilinear filtering" +msgid "Bilinear filtering" msgstr "Bilineaire filtering" -msgid "Dithering" +msgid "Dithering" msgstr "Dithering" -msgid "Enable NMI for CGA emulation" +msgid "Enable NMI for CGA emulation" msgstr "NMI inschakelen voor CGA-emulatie" -msgid "Voodoo type" +msgid "Voodoo type" msgstr "Voodoo-type" -msgid "Framebuffer memory size" +msgid "Framebuffer memory size" msgstr "Framebuffer geheugengrootte" -msgid "Texture memory size" +msgid "Texture memory size" msgstr "Grootte textuurgeheugen" -msgid "Dither subtraction" +msgid "Dither subtraction" msgstr "Dither aftrekken" -msgid "Screen Filter" +msgid "Screen Filter" msgstr "Schermfilter" -msgid "Render threads" +msgid "Render threads" msgstr "Render threads" -msgid "SLI" +msgid "SLI" msgstr "SLI" -msgid "Start Address" +msgid "Start Address" msgstr "Startadres" -msgid "Contiguous Size" +msgid "Contiguous Size" msgstr "Aaneengesloten grootte" -msgid "I/O Width" +msgid "I/O Width" msgstr "I/O-breedte" -msgid "Transfer Speed" +msgid "Transfer Speed" msgstr "Overdrachtssnelheid" -msgid "EMS mode" +msgid "EMS mode" msgstr "EMS-modus" -msgid "Address for > 2 MB" +msgid "Address for > 2 MB" msgstr "Adres voor > 2 MB" -msgid "Frame Address" +msgid "Frame Address" msgstr "Frameadres" -msgid "USA" +msgid "USA" msgstr "USA" -msgid "Danish" +msgid "Danish" msgstr "Deens" -msgid "Always at selected speed" +msgid "Always at selected speed" msgstr "Altijd op geselecteerde snelheid" -msgid "BIOS setting + Hotkeys (off during POST)" +msgid "BIOS setting + Hotkeys (off during POST)" msgstr "BIOS-instelling + Sneltoetsen (niet actief tijdens POST)" -msgid "64 kB starting from F0000" +msgid "64 kB starting from F0000" msgstr "64 kB vanaf F0000" -msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "128 kB vanaf E0000 (geïnverteerd MSB adres, laatste 64KB eerst)" -msgid "Sine" +msgid "Sine" msgstr "Sinus" -msgid "Triangle" +msgid "Triangle" msgstr "Driehoek" -msgid "Linear" +msgid "Linear" msgstr "Lineair" -msgid "4th Order" +msgid "4th Order" msgstr "4e Orde" -msgid "7th Order" +msgid "7th Order" msgstr "7e Orde" -msgid "Non-timed (original)" +msgid "Non-timed (original)" msgstr "Niet-getimed (origineel)" -msgid "45 Hz (JMP2 not populated)" +msgid "45 Hz (JMP2 not populated)" msgstr "45 Hz (JMP2 niet gezet)" -msgid "Two" +msgid "Two" msgstr "Twee" -msgid "Three" +msgid "Three" msgstr "Drie" -msgid "Wheel" +msgid "Wheel" msgstr "Wiel" -msgid "Five + Wheel" +msgid "Five + Wheel" msgstr "Vijf + Wiel" -msgid "A3 - SMT2 Serial / SMT3(R)V" +msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 Serieel / SMT3(R)V" -msgid "Q1 - SMT3(R) Serial" +msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) Serieel" -msgid "8 KB" +msgid "8 KB" msgstr "8 KB" -msgid "32 KB" +msgid "32 KB" msgstr "32 KB" -msgid "16 KB" +msgid "16 KB" msgstr "16 KB" -msgid "64 KB" +msgid "64 KB" msgstr "64 KB" -msgid "Disable BIOS" +msgid "Disable BIOS" msgstr "BIOS uitschakelen" -msgid "512 KB" +msgid "512 KB" msgstr "512 KB" -msgid "2 MB" +msgid "2 MB" msgstr "2 MB" -msgid "8 MB" +msgid "8 MB" msgstr "8 MB" -msgid "28 MB" +msgid "28 MB" msgstr "28 MB" -msgid "1 MB" +msgid "1 MB" msgstr "1 MB" -msgid "4 MB" +msgid "4 MB" msgstr "4 MB" -msgid "12 MB" +msgid "12 MB" msgstr "12 MB" -msgid "16 MB" +msgid "16 MB" msgstr "16 MB" -msgid "20 MB" +msgid "20 MB" msgstr "20 MB" -msgid "24 MB" +msgid "24 MB" msgstr "24 MB" -msgid "SigmaTel STAC9721T (stereo)" +msgid "SigmaTel STAC9721T (stereo)" msgstr "SigmaTel STAC9721T (stereo)" -msgid "Classic" +msgid "Classic" msgstr "Klassiek" -msgid "256 KB" +msgid "256 KB" msgstr "256 KB" -msgid "Composite" +msgid "Composite" msgstr "Composite" -msgid "Old" +msgid "Old" msgstr "Oud" -msgid "New" +msgid "New" msgstr "Nieuw" -msgid "Color (generic)" +msgid "Color (generic)" msgstr "Kleur (algemeen)" -msgid "Green Monochrome" +msgid "Green Monochrome" msgstr "Groen monochroom" -msgid "Amber Monochrome" +msgid "Amber Monochrome" msgstr "Amber Monochroom" -msgid "Gray Monochrome" +msgid "Gray Monochrome" msgstr "Grijs monochroom" -msgid "Color (no brown)" +msgid "Color (no brown)" msgstr "Kleur (geen bruin)" -msgid "Color (IBM 5153)" +msgid "Color (IBM 5153)" msgstr "Kleur (IBM 5153)" -msgid "Simple doubling" +msgid "Simple doubling" msgstr "Eenvoudige verdubbeling" -msgid "sRGB interpolation" +msgid "sRGB interpolation" msgstr "sRGB-interpolatie" -msgid "Linear interpolation" +msgid "Linear interpolation" msgstr "Lineaire interpolatie" -msgid "128 KB" +msgid "128 KB" msgstr "128 KB" -msgid "Monochrome (5151/MDA) (white)" +msgid "Monochrome (5151/MDA) (white)" msgstr "Monochroom (5151/MDA) (wit)" -msgid "Monochrome (5151/MDA) (green)" +msgid "Monochrome (5151/MDA) (green)" msgstr "Monochroom (5151/MDA) (groen)" -msgid "Monochrome (5151/MDA) (amber)" +msgid "Monochrome (5151/MDA) (amber)" msgstr "Monochroom (5151/MDA) (amber)" -msgid "Color 40x25 (5153/CGA)" +msgid "Color 40x25 (5153/CGA)" msgstr "Kleur 40x25 (5153/CGA)" -msgid "Color 80x25 (5153/CGA)" +msgid "Color 80x25 (5153/CGA)" msgstr "Kleur 80x25 (5153/CGA)" -msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgid "Enhanced Color - Normal Mode (5154/ECD)" msgstr "Verbeterde kleur - normale modus (5154/ECD)" -msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" msgstr "Verbeterde kleur - Verbeterde modus (5154/ECD)" -msgid "Green" +msgid "Green" msgstr "Groen" -msgid "Amber" +msgid "Amber" msgstr "Amber" -msgid "Gray" +msgid "Gray" msgstr "Grijs" -msgid "Color" +msgid "Color" msgstr "Kleur" -msgid "U.S. English" +msgid "U.S. English" msgstr "Amerikaans Engels" -msgid "Scandinavian" +msgid "Scandinavian" msgstr "Scandinavisch" -msgid "Other languages" +msgid "Other languages" msgstr "Andere talen" -msgid "Bochs latest" +msgid "Bochs latest" msgstr "Bochs nieuwste" -msgid "Mono Non-Interlaced" +msgid "Mono Non-Interlaced" msgstr "Mono Non-Interlaced" -msgid "Color Interlaced" +msgid "Color Interlaced" msgstr "Kleur interlaced" -msgid "Color Non-Interlaced" +msgid "Color Non-Interlaced" msgstr "Kleur non-interlaced" -msgid "3Dfx Voodoo Graphics" +msgid "3Dfx Voodoo Graphics" msgstr "3Dfx Voodoo Graphics" -msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgid "Obsidian SB50 + Amethyst (2 TMUs)" msgstr "Obsidian SB50 + Amethyst (2 TMU's)" -msgid "8-bit" +msgid "8-bit" msgstr "8-bit" -msgid "16-bit" +msgid "16-bit" msgstr "16-bit" -msgid "Standard (150ns)" +msgid "Standard (150ns)" msgstr "Standaard (150ns)" -msgid "High-Speed (120ns)" +msgid "High-Speed (120ns)" msgstr "Hoge snelheid (120ns)" -msgid "Enabled" +msgid "Enabled" msgstr "Ingeschakeld" -msgid "Standard" +msgid "Standard" msgstr "Standaard" -msgid "High-Speed" +msgid "High-Speed" msgstr "Hoge snelheid" -msgid "Stereo LPT DAC" +msgid "Stereo LPT DAC" msgstr "Stereo LPT DAC" -msgid "Generic Text Printer" +msgid "Generic Text Printer" msgstr "Generieke tekstprinter" -msgid "Generic ESC/P Dot-Matrix Printer" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "Generieke ESC/P dot-matrix-printer" -msgid "Generic PostScript Printer" +msgid "Generic PostScript Printer" msgstr "Generieke PostScript-printer" -msgid "Generic PCL5e Printer" +msgid "Generic PCL5e Printer" msgstr "Generieke PCL5e-printer" -msgid "Parallel Line Internet Protocol" +msgid "Parallel Line Internet Protocol" msgstr "Internetprotocol voor parallelle lijnen" -msgid "Protection Dongle for Savage Quest" +msgid "Protection Dongle for Savage Quest" msgstr "Beschermingsdongle voor Savage Quest" -msgid "Serial Passthrough Device" +msgid "Serial Passthrough Device" msgstr "Serieel doorvoerapparaat" -msgid "Passthrough Mode" +msgid "Passthrough Mode" msgstr "Doorgeefmodus" -msgid "Host Serial Device" +msgid "Host Serial Device" msgstr "Host Serieel Apparaat" -msgid "Name of pipe" +msgid "Name of pipe" msgstr "Naam van de pipe" -msgid "Data bits" +msgid "Data bits" msgstr "Databits" -msgid "Stop bits" +msgid "Stop bits" msgstr "Stopbits" -msgid "Baud Rate of Passthrough" +msgid "Baud Rate of Passthrough" msgstr "Baud-snelheid van doorvoer" -msgid "Named Pipe (Server)" +msgid "Named Pipe (Server)" msgstr "Named Pipe (Server)" -msgid "Host Serial Passthrough" +msgid "Host Serial Passthrough" msgstr "Host seriële doorgave" -msgid "E&ject %1" +msgid "E&ject %1" msgstr "&Uitwerpen %1" -msgid "&Unmute" +msgid "&Unmute" msgstr "&Geluid aanzetten" -msgid "Softfloat FPU" +msgid "Softfloat FPU" msgstr "Softfloat FPU" -msgid "High performance impact" +msgid "High performance impact" msgstr "Hoge prestatie-impact" -msgid "[Generic] RAM Disk (max. speed)" +msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM-schijf (max. snelheid)" -msgid "IBM 8514/A clone (ISA)" +msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-kloon (ISA)" -msgid "Vendor" +msgid "Vendor" msgstr "Verkoper" -msgid "Generic PC/XT Memory Expansion" +msgid "Generic PC/XT Memory Expansion" msgstr "Generieke PC/XT geheugenuitbreiding" -msgid "Generic PC/AT Memory Expansion" +msgid "Generic PC/AT Memory Expansion" msgstr "Generieke PC/AT geheugenuitbreiding" msgid "Unable to find Dot-Matrix fonts" From d0d2ba29ec71d8de86def03f9f363f16d54ff165 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 11 Apr 2025 06:37:01 +0500 Subject: [PATCH 102/118] qt: Add the remaining untranslated strings to the template --- src/qt/languages/86box.pot | 51 ++++++++++++++++++++++++ src/qt/languages/ca-ES.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/cs-CZ.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/de-DE.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/es-ES.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/fi-FI.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/fr-FR.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/hr-HR.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/hu-HU.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/it-IT.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/ja-JP.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/ko-KR.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/nl-NL.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/pl-PL.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/pt-BR.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/pt-PT.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/ru-RU.po | 78 ++++++++++++++++++++++++++++++++++++ src/qt/languages/sk-SK.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/sl-SI.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/tr-TR.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/uk-UA.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/vi-VN.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/zh-CN.po | 81 ++++++++++++++++++++++++++++++++++++++ src/qt/languages/zh-TW.po | 81 ++++++++++++++++++++++++++++++++++++++ 24 files changed, 1911 insertions(+) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index fde3f921c..1d151a9d9 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2109,8 +2109,59 @@ msgstr "" msgid "Inhibit multimedia keys" msgstr "" +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + msgid "Model:" msgstr "" msgid "Failed to initialize Vulkan renderer." msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index f39be48ca..9dec41c32 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -2061,6 +2061,27 @@ msgstr "Alt impact en el rendiment" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disc RAM (velocitat màxima)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Clon IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "No es pot trobar tipus de lletra de matriu de punts" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Els tipus de lletra TrueType al directori \"roms/printer/fonts\" són necessaris per a l'emulació de la impressora de matriu de punts ESC/P genèrica." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 34b5dfa6d..2098fe018 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2061,6 +2061,27 @@ msgstr "Vysoký dopad na výkon" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disk RAM (max. rychlost)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Nastala chyba při nachození jehličkových písem" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Pro emulaci obecné jehličkové tiskárny ESC/P jsou vyžadována písma TrueType ve složce \"roms/printer/fonts\"." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index e69d496a7..2088e4141 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -2064,6 +2064,27 @@ msgstr "Hohe Auswirkung auf die Leistung" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM-Diskette (maximale Geschwindigkeit)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-Klon (ISA)" @@ -2081,3 +2102,63 @@ msgstr "Nadel-Schriften konnten nicht gefunden werden" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "TrueType-Schriften in das \"roms/printer/fonts\"-Verzeichnis sind für die Allgemeines ESC/P Nadel-Druckers erforderlich." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 1e9bc1c23..bc11a4d4c 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2060,6 +2060,27 @@ msgstr "Alto impact en el rendimiento" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disco RAM (velocidad máxima)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Clon IBM 8514/A (ISA)" @@ -2077,3 +2098,63 @@ msgstr "No fué posible encontrar las fuentes matriciales" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Las fuentes TrueType en el directorio \"roms/printer/fonts\" son necesarias para la emulación de la impresora matricial ESC/P genérica." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index d35e45b21..34e9aeead 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2064,6 +2064,27 @@ msgstr "Suuri vaikutus suorituskykyyn" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM-levy (maksiminopeus)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-klooni (ISA)" @@ -2081,3 +2102,63 @@ msgstr "Pistematriisifontteja ei löydy" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "TrueType-fontteja kansiossa \"roms/printer/fonts\"-hakemistoon yleinen ESC/P pistematriisitulostin emulointiin." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 50de1f001..ebb181a30 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2061,6 +2061,27 @@ msgstr "Impact important sur la performance" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disque RAM (vitesse maximale)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Clon IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Impossible de trouver les polices à matrice à points" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Les polices TrueType dans le répertoire \"roms/printer/fonts\" sont nécessaires à l'émulation de l'imprimante générique ESC/P à matrice à points." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 93c247319..c1f6480c2 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2061,6 +2061,27 @@ msgstr "Visoki učinak na brzinu izvršavanja" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disk RAM (najviša brzina)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Nije moguće pronaći matrične fontove" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "TrueType fontovi u mapi \"roms/printer/fonts\" potrebni su za emulaciju generičnog matričnog pisača ESC/P." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index b92b9c11b..09f914860 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -2061,6 +2061,27 @@ msgstr "Nagy hatással van a teljesítményre" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM lemez (max. sebesség)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A klón (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Nem találja a Dot-Matrix betűtípusokat" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Az általános ESC/P pontmátrixnyomtató emulációjához a \"roms/printer/fonts\" könyvtárban található TrueType betűtípusok szükségesek." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index b85bb64bd..c9694c3be 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2061,6 +2061,27 @@ msgstr "Impatto elevato sulla prestazione" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disco RAM (velocità massima)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Impossibile trovare i font a matrice di punti" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "I font TrueType presenti nella directory \"roms/printer/fonts\" sono necessari per l'emulazione della stampante a matrice di punti ESC/P generica." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 07c783dd1..1c139aaec 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2061,6 +2061,27 @@ msgstr "パフォーマンスへの影響が大きい" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAMディスク(最高速度)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A クローン(ISA)" @@ -2078,3 +2099,63 @@ msgstr "ドットマトリクスフォントが見つかりません" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "汎用ESC/Pドットマトリクスプリンタのエミュレーションには、roms/printer/fontsディレクトリ内のTrueTypeフォントが必要です。" + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index cea372b7f..941bd740a 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2061,6 +2061,27 @@ msgstr "성능에 미치는 영향" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM 디스크(최대 속도)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A 클론(ISA)" @@ -2078,3 +2099,63 @@ msgstr "도트 매트릭스 글꼴을 찾을 수 없습니다" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "일반 ESC/P 도트 매트릭스 프린터의 에뮬레이션을 사용하려면 \"roms/printer/fonts\" 디렉터리에 있는 트루타입 글꼴이 필요합니다." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 20c193afe..fd2b66245 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -2061,6 +2061,27 @@ msgstr "Hoge prestatie-impact" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM-schijf (max. snelheid)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-kloon (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Dot-matrix-lettertypen niet gevonden" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "TrueType lettertypen in de map \"roms/printer/fonts\" zijn nodig voor de emulatie van de generieke ESC/P dot-matrix-printer." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 980ee69f1..ab50711f6 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2061,6 +2061,27 @@ msgstr "Wysoki wpływ na wydajność" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Dysk RAM (maks. prędkość)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Nie można znaleźć czcionek igłowych" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Czcionki TrueType w katalogu \"roms/printer/fonts\" są wymagane do emulacji generyczniej drukarki igłowej ESC/P." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index c48e7a07f..db07a69ae 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2061,6 +2061,27 @@ msgstr "Alto impacto no desempenho" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disco RAM (velocidade máxima)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Não foi possível localizar os fontes matriciais de pontos" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "As fontes TrueType no diretório \"roms/printer/fonts\" são necessárias para a emulação da impressora matricial de pontos ESC/P genérica." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 1900a42d9..f67ddbdf8 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2061,6 +2061,27 @@ msgstr "Elevado impacto no desempenho" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disco RAM (velocidade máxima)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Não foi possível encontrar os fontes matriciais de pontos" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "As fontes TrueType no diretório \"roms/printer/fonts\" são necessárias para a emulação da impressora matricial de pontos ESC/P genérica" + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index afc4c72a4..a8cd0295a 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2061,6 +2061,27 @@ msgstr "Сильное влияние на производительность" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Стандартный] RAM-диск (макс. скорость)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Клон IBM 8514/A (ISA)" @@ -2085,5 +2106,62 @@ msgstr "Невозможно найти матричные шрифты" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Шрифты TrueType в каталоге \"roms/printer/fonts\" необходимы для эмуляции стандартного матричного принтера ESC/P." +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + msgid "Model:" msgstr "Модель:" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index f1a6144a6..5080c49b5 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2062,6 +2062,27 @@ msgstr "Vysoký vplyv na výkon" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disk RAM (max. rýchlosť)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" @@ -2079,3 +2100,63 @@ msgstr "Nastala chyba pri hľadaní ihličkových písem" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Písma TrueType v adresári \"roms/printer/fonts\" sú potrebné na emuláciu generickej ihličkovej tlačiarne ESC/P." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 94c241dea..c34fb6f7e 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2061,6 +2061,27 @@ msgstr "Visok učinek na hitrost delovanja" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Pogon RAM (največja hitrost)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Klon IBM 8514/A (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Matričnih pisav ni bilo mogoče najti" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Matrične pisave v imeniku \"roms/printer/fonts\" so potrebne za emulacijo generičnega matričnega tiskalnika ESC/P." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 1be214342..b7a59b620 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -2061,6 +2061,27 @@ msgstr "Ciddi performans düşüklüğüne neden olabilir" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM Disk (maks. hız)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A klonu (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Dot Matrix yazı tipleri bulunamıyor" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Sıradan ESC/P Dot Matrix Yazıcının emülasyonu için \"roms/printer/fonts\" dizinindeki TrueType yazı tipleri gereklidir." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 6acb947cf..3145f5e34 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -2061,6 +2061,27 @@ msgstr "Високий вплив на продуктивність" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Диск оперативної пам'яті (макс. швидкість)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "Клон IBM 8514/A (ISA)" @@ -2084,3 +2105,63 @@ msgstr "Неможливо знайти матричні шрифти" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Шрифти TrueType у каталозі \"roms/printer/fonts\" потрібні для емуляції загального матричного принтера Generic ESC/P." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index c1d461fb7..932150f7b 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -2061,6 +2061,27 @@ msgstr "Ảnh hưởng lớn đến hiệu suất" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Đĩa RAM (tốc độ tối đa)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A bản nhái (ISA)" @@ -2078,3 +2099,63 @@ msgstr "Không tìm thấy phông chữ ma trận chấm" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "Cần có phông chữ TrueType trong thư mục \"roms/printer/fonts\" để mô phỏng máy in generic ESC/P ma trận chấm." + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 0ce76cff9..18f5a8fb8 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -2061,6 +2061,27 @@ msgstr "重大性能影响" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM 磁盘 (最大速度)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A 克隆 (ISA)" @@ -2078,3 +2099,63 @@ msgstr "无法找到点阵字体" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "仿真通用 ESC/P 点阵打印机需要使用 \"roms/printer/fonts\" 目录中的 TrueType 字体。" + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index d50449aa2..9dbf51c70 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2061,6 +2061,27 @@ msgstr "對效能影響大" msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] RAM 磁碟 (最大速度)" +msgid "[Generic] 1989 (3500 RPM)" +msgstr "" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "" + msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A 克隆 (ISA)" @@ -2078,3 +2099,63 @@ msgstr "無法找到點矩陣字型" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." msgstr "通用 ESC/P 點矩陣印表機的模擬需要 \"roms/printer/fonts\" 目錄中的 TrueType 字體。" + +msgid "Inhibit multimedia keys" +msgstr "" + +msgid "Ask for confirmation before saving settings" +msgstr "" + +msgid "Ask for confirmation before hard resetting" +msgstr "" + +msgid "Ask for confirmation before quitting" +msgstr "" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Model:" +msgstr "" + +msgid "Failed to initialize Vulkan renderer." +msgstr "" + +msgid "GLSL Error" +msgstr "" + +msgid "Could not load shader: %1" +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "" + +msgid "Could not load texture: %1" +msgstr "" + +msgid "Could not compile shader:\n\n%1" +msgstr "" + +msgid "Program not linked:\n\n%1" +msgstr "" + +msgid "Shader Manager" +msgstr "" + +msgid "Shader Configuration" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Move up" +msgstr "" + +msgid "Move down" +msgstr "" + +msgid "Could not load file %1" +msgstr "" From 12eefc9519a8882da723389d9cc5ff6e13fade25 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 11 Apr 2025 06:38:46 +0500 Subject: [PATCH 103/118] qt: Update the Russian translation --- src/qt/languages/ru-RU.po | 74 +++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index a8cd0295a..fb1908f60 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1252,19 +1252,19 @@ msgid "Pen" msgstr "Ручка" msgid "Host CD/DVD Drive (%1:)" -msgstr "Главный CD/DVD-привод (%1:)" +msgstr "CD/DVD-привод хоста (%1:)" msgid "&Connected" -msgstr "&Connected" +msgstr "&Кабель подключен" msgid "Clear image history" msgstr "Очистить историю образов" msgid "Create..." -msgstr "Создайте..." +msgstr "Создать..." msgid "Host CD/DVD Drive (%1)" -msgstr "Главный CD/DVD-привод (%1)" +msgstr "CD/DVD-привод хоста (%1)" msgid "Unknown Bus" msgstr "Неизвестная шина" @@ -1288,7 +1288,7 @@ msgid "VSync" msgstr "Вертикальная синхронизация" msgid "Synchronize with video" -msgstr "Синхронизация с видео" +msgstr "Синхронизировать с видео" msgid "Shaders" msgstr "Шейдеры" @@ -1384,25 +1384,25 @@ msgid "Renderer options..." msgstr "Параметры рендеринга..." msgid "Logitech/Microsoft Bus Mouse" -msgstr "Шинная мышь Logitech/Microsoft" +msgstr "Bus-мышь Logitech/Microsoft" msgid "Microsoft Bus Mouse (InPort)" -msgstr "Шинная мышь Microsoft (InPort)" +msgstr "Bus-мышь Microsoft (InPort)" msgid "Mouse Systems Serial Mouse" -msgstr "Последовательная мышь Mouse Systems" +msgstr "COM-мышь Mouse Systems" msgid "Microsoft Serial Mouse" -msgstr "Последовательная мышь Microsoft" +msgstr "COM-мышь Microsoft" msgid "Logitech Serial Mouse" -msgstr "Последовательная мышь Logitech" +msgstr "COM-мышь Logitech" msgid "PS/2 Mouse" msgstr "Мышь PS/2" msgid "3M MicroTouch (Serial)" -msgstr "3M MicroTouch (последовательная)" +msgstr "3M MicroTouch (последовательный)" msgid "[COM] Standard Hayes-compliant Modem" msgstr "[COM] Стандартный Hayes-совместимый модем" @@ -2062,25 +2062,25 @@ msgid "[Generic] RAM Disk (max. speed)" msgstr "[Стандартный] RAM-диск (макс. скорость)" msgid "[Generic] 1989 (3500 RPM)" -msgstr "" +msgstr "[Стандартный] 1989 (3500 RPM)" msgid "[Generic] 1992 (3600 RPM)" -msgstr "" +msgstr "[Стандартный] 1989 (3500 RPM)" msgid "[Generic] 1994 (4500 RPM)" -msgstr "" +msgstr "[Стандартный] 1989 (3500 RPM)" msgid "[Generic] 1996 (5400 RPM)" -msgstr "" +msgstr "[Стандартный] 1989 (3500 RPM)" msgid "[Generic] 1997 (5400 RPM)" -msgstr "" +msgstr "[Стандартный] 1989 (3500 RPM)" msgid "[Generic] 1998 (5400 RPM)" -msgstr "" +msgstr "[Стандартный] 1989 (3500 RPM)" msgid "[Generic] 2000 (7200 RPM)" -msgstr "" +msgstr "[Стандартный] 1989 (3500 RPM)" msgid "IBM 8514/A clone (ISA)" msgstr "Клон IBM 8514/A (ISA)" @@ -2107,61 +2107,61 @@ msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for t msgstr "Шрифты TrueType в каталоге \"roms/printer/fonts\" необходимы для эмуляции стандартного матричного принтера ESC/P." msgid "Inhibit multimedia keys" -msgstr "" +msgstr "Перехватывать мультимедиа-клавиши" msgid "Ask for confirmation before saving settings" -msgstr "" +msgstr "Спрашивать подтверждения перед сохранением настроек" msgid "Ask for confirmation before hard resetting" -msgstr "" +msgstr "Спрашивать подтверждения перед холодной перезагрузкой" msgid "Ask for confirmation before quitting" -msgstr "" +msgstr "Спрашивать подтвержждения перед выходом" msgid "Display hotkey message when entering full-screen mode" -msgstr "" +msgstr "Показывать сообщение о горячих клавишах при включении полноэкранного режима" msgid "Options" -msgstr "" +msgstr "Параметры" msgid "Model:" msgstr "Модель:" msgid "Failed to initialize Vulkan renderer." -msgstr "" +msgstr "Не удалось инициализировать рендерер Vulkan." msgid "GLSL Error" -msgstr "" +msgstr "Ошибка GLSL" msgid "Could not load shader: %1" -msgstr "" +msgstr "Не удалось загрузить шейдер: %1" msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" -msgstr "" +msgstr "Требуется OpenGL версии 3.0 или выше. Текущая версия GLSL %1.%2" msgid "Could not load texture: %1" -msgstr "" +msgstr "Не удалось загрузить текстуру: %1" msgid "Could not compile shader:\n\n%1" -msgstr "" +msgstr "Не удалось скомпилировать шейдер:\n\n%1" msgid "Program not linked:\n\n%1" -msgstr "" +msgstr "Не удалось скомпоновать шейдер:\n\n%1" msgid "Shader Manager" -msgstr "" +msgstr "Управление шейдерами" msgid "Shader Configuration" -msgstr "" +msgstr "Конфигурация шейдера" msgid "Add" -msgstr "" +msgstr "Добавить" msgid "Move up" -msgstr "" +msgstr "Вверх" msgid "Move down" -msgstr "" +msgstr "Вниз" msgid "Could not load file %1" -msgstr "" +msgstr "Не удалось загрузить файл %1" From a0f0c42f4aec8d8ae2a4f427d54113b0a01ced7d Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 12 Apr 2025 14:34:36 +0600 Subject: [PATCH 104/118] Microtouch touch points now work properly in fullscreen/maximized with scaling changes --- src/qt/qt_renderercommon.cpp | 3 ++ src/qt/qt_renderercommon.hpp | 2 + src/qt/qt_rendererstack.cpp | 85 ++++++++++++++++++++++++++++++++++-- 3 files changed, 86 insertions(+), 4 deletions(-) diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp index 3a34452e6..56217b611 100644 --- a/src/qt/qt_renderercommon.cpp +++ b/src/qt/qt_renderercommon.cpp @@ -132,6 +132,9 @@ RendererCommon::onResize(int width, int height) monitors[r_monitor_index].mon_res_x = (double) destination.width(); monitors[r_monitor_index].mon_res_y = (double) destination.height(); + + destinationF.setRect((double)destination.x() / (double)width, (double)destination.y() / (double)height, + (double)destination.width() / (double)width, (double)destination.height() / (double)height); } bool diff --git a/src/qt/qt_renderercommon.hpp b/src/qt/qt_renderercommon.hpp index 333b9df0a..6bfa51a8d 100644 --- a/src/qt/qt_renderercommon.hpp +++ b/src/qt/qt_renderercommon.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ public: virtual bool rendererTakeScreenshot() { return false; } int r_monitor_index = 0; + QRectF destinationF = QRectF(0, 0, 1, 1); /* normalized to 0.0-1.0 range. */ protected: bool eventDelegate(QEvent *event, bool &result); diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index b5b910fe9..431b3609b 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -488,6 +488,17 @@ RendererStack::event(QEvent* event) mouse_y_abs = (mouse_event->localPos().y()) / (double)height(); if (!mouse_tablet_in_proximity) mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; } return QStackedWidget::event(event); } @@ -496,12 +507,34 @@ RendererStack::event(QEvent* event) if (mouse_input_mode == 0) { mouse_x_abs = (mouse_event->localPos().x()) / (double)width(); mouse_y_abs = (mouse_event->localPos().y()) / (double)height(); + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; return QStackedWidget::event(event); } #endif mouse_x_abs = (mouse_event->localPos().x()) / (double)width(); mouse_y_abs = (mouse_event->localPos().y()) / (double)height(); + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; } else switch (event->type()) { case QEvent::TouchBegin: @@ -511,8 +544,19 @@ RendererStack::event(QEvent* event) QTouchEvent* touchevent = (QTouchEvent*)event; if (mouse_input_mode == 0) break; if (touchevent->touchPoints().count()) { - mouse_x_abs = (touchevent->touchPoints()[0].pos().x()) / (double)width(); - mouse_y_abs = (touchevent->touchPoints()[0].pos().y()) / (double)height(); + mouse_x_abs = (touchevent->touchPoints()[0].pos().x()) / (double)width(); + mouse_y_abs = (touchevent->touchPoints()[0].pos().y()) / (double)height(); + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; } mouse_set_buttons_ex(mouse_get_buttons_ex() | 1); touchevent->accept(); @@ -521,8 +565,19 @@ RendererStack::event(QEvent* event) QTouchEvent* touchevent = (QTouchEvent*)event; if (mouse_input_mode == 0) break; if (touchevent->pointCount()) { - mouse_x_abs = (touchevent->point(0).position().x()) / (double)width(); - mouse_y_abs = (touchevent->point(0).position().y()) / (double)height(); + mouse_x_abs = (touchevent->point(0).position().x()) / (double)width(); + mouse_y_abs = (touchevent->point(0).position().y()) / (double)height(); + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; } mouse_set_buttons_ex(mouse_get_buttons_ex() | 1); touchevent->accept(); @@ -538,6 +593,17 @@ RendererStack::event(QEvent* event) if (touchevent->touchPoints().count()) { mouse_x_abs = (touchevent->touchPoints()[0].pos().x()) / (double)width(); mouse_y_abs = (touchevent->touchPoints()[0].pos().y()) / (double)height(); + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; } mouse_set_buttons_ex(mouse_get_buttons_ex() & ~1); touchevent->accept(); @@ -548,6 +614,17 @@ RendererStack::event(QEvent* event) if (touchevent->pointCount()) { mouse_x_abs = (touchevent->point(0).position().x()) / (double)width(); mouse_y_abs = (touchevent->point(0).position().y()) / (double)height(); + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; } mouse_set_buttons_ex(mouse_get_buttons_ex() & ~1); touchevent->accept(); From 1f9f0a0d6e3703ff111395d8210e1001466debf4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 12 Apr 2025 14:54:35 +0200 Subject: [PATCH 105/118] NEAT: The chipset has its own A20 toggle, it cannot alter the external one as that's an input to the chipset, fixes #5332. --- src/chipset/neat.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/chipset/neat.c b/src/chipset/neat.c index 1146ecbff..0661f89ee 100644 --- a/src/chipset/neat.c +++ b/src/chipset/neat.c @@ -956,8 +956,9 @@ neat_write(uint16_t port, uint8_t val, void *priv) dev->ems_size); } - mem_a20_key = !(val & RB12_GA20); + mem_a20_alt = !(val & RB12_GA20); mem_a20_recalc(); + flushmmucache(); break; default: @@ -987,7 +988,7 @@ neat_read(uint16_t port, void *priv) if ((dev->indx >= 0x60) && (dev->indx <= 0x6e)) ret = dev->regs[dev->indx]; else if (dev->indx == 0x6f) - ret = (dev->regs[dev->indx] & 0xfd) | (mem_a20_key & 2); + ret = (dev->regs[dev->indx] & 0xfd) | ~(mem_a20_alt & 0x02); break; default: From b91986499daabb9a96f1cdb9f986c135af2102e2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 12 Apr 2025 17:54:36 +0200 Subject: [PATCH 106/118] The forgotten keyboard.h. --- src/include/86box/keyboard.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 9142fbfe1..e495cb0df 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -245,6 +245,7 @@ extern const device_t keyboard_ps2_ps1_device; extern const device_t keyboard_ps2_ps1_pci_device; extern const device_t keyboard_ps2_xi8088_device; extern const device_t keyboard_ps2_ami_device; +extern const device_t keyboard_ps2_compaq_device; extern const device_t keyboard_ps2_holtek_device; extern const device_t keyboard_ps2_mca_1_device; extern const device_t keyboard_ps2_mca_2_device; @@ -258,6 +259,7 @@ extern const device_t keyboard_ps2_ami_pci_device; extern const device_t keyboard_ps2_intel_ami_pci_device; extern const device_t keyboard_ps2_acer_pci_device; extern const device_t keyboard_ps2_ali_pci_device; +extern const device_t keyboard_ps2_phoenix_pci_device; extern const device_t keyboard_ps2_tg_ami_pci_device; extern const device_t keyboard_at_generic_device; @@ -284,6 +286,7 @@ extern int keyboard_isfsexit_up(void); extern int keyboard_ismsexit(void); extern void keyboard_set_is_amstrad(int ams); extern void kbc_at_set_ps2(void *priv, uint8_t ps2); +extern void kbc_at_write_p(void *priv, uint8_t port, uint8_t mask, uint8_t val); extern void kbc_at_set_fast_reset(uint8_t new_fast_reset); extern void kbc_at_handler(int set, void *priv); From 08437a4d335530fc0b7c6e115b2a37cc40f4a099 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 13 Apr 2025 16:53:03 +0200 Subject: [PATCH 107/118] WD76C10: Implement the interleave modes complete with row and column calculation, fixes #5465. --- src/chipset/wd76c10.c | 425 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 404 insertions(+), 21 deletions(-) diff --git a/src/chipset/wd76c10.c b/src/chipset/wd76c10.c index a375c8eb6..48bb56483 100644 --- a/src/chipset/wd76c10.c +++ b/src/chipset/wd76c10.c @@ -65,9 +65,10 @@ wd76c10_log(const char *fmt, ...) #endif typedef struct { - uint32_t enable; + uint32_t phys_on, enable; uint32_t virt_addr, phys_addr; uint32_t virt_size, phys_size; + uint32_t adj_virt_addr, adj_virt_size; } ram_bank_t; typedef struct { @@ -103,6 +104,7 @@ typedef struct int locked; uint32_t mem_top, hmwp_base; + uint32_t fast; ram_bank_t ram_banks[5]; @@ -121,6 +123,40 @@ static uint32_t bank_sizes[4] = { 0x00020000, /* 64 Kbit X 16 = 1024 Kbit 0x00200000, /* 1 Mbit X 16 = 16 Mbit = 2 MB, 10x10 */ 0x00800000 }; /* 4 Mbit X 16 = 64 Mbit = 8 MB, 11x11 */ +static uint32_t +wd76c10_calc_phys(uint32_t row, uint32_t col, uint32_t size, uint32_t a0) +{ + uint32_t ret = WD76C10_ADDR_INVALID; + + switch (size) { + default: + ret = WD76C10_ADDR_INVALID; + break; + case 0x00020000: + row = (row & 0x0000ff) << 9; + col = (col & 0x0000ff) << 1; + ret = row | col | a0; + break; + case 0x00080000: + row = (row & 0x0001ff) << 10; + col = (col & 0x0001ff) << 1; + ret = row | col | a0; + break; + case 0x00200000: + row = (row & 0x0003ff) << 11; + col = (col & 0x0003ff) << 1; + ret = row | col | a0; + break; + case 0x00800000: + row = (row & 0x0007ff) << 12; + col = (col & 0x0007ff) << 1; + ret = row | col | a0; + break; + } + + return ret; +} + static uint32_t wd76c10_calc_addr(wd76c10_t *dev, uint32_t addr) { @@ -159,20 +195,303 @@ wd76c10_calc_addr(wd76c10_t *dev, uint32_t addr) ret = WD76C10_ADDR_INVALID; /* Then, handle the physical memory banks. */ + int ilv4 = (dev->mem_ctl >> 8) & 4; + int8_t add = 0; + uint32_t pg = (dev->mem_ctl & 0x0800); + uint32_t nrt = WD76C10_ADDR_INVALID; + + if (ret != WD76C10_ADDR_INVALID) { + if (dev->fast) for (int8_t i = 0; i < 4; i++) { + rb = &(dev->ram_banks[i]); + + uint32_t ret2 = ret - rb->phys_addr; + + if (rb->phys_on && (ret >= rb->phys_addr) && + (ret < (rb->phys_addr + rb->phys_size))) { + if (ret2 < rb->phys_size) + nrt = ret2 + rb->phys_addr; + break; + } + } else for (int8_t i = 0; i < 4; i++) { + rb = &(dev->ram_banks[i]); + + int ilv2 = (dev->mem_ctl >> 8) & (1 << (i >> 1)); + uint32_t size = rb->virt_size; + uint32_t ret2 = ret - rb->virt_addr; + uint32_t ret4 = ret2; + uint32_t row = WD76C10_ADDR_INVALID; + uint32_t col = WD76C10_ADDR_INVALID; + uint32_t rb_or = 0; + + if (ilv4) { + size <<= 2; + switch (rb->virt_size) { + default: + ret4 = WD76C10_ADDR_INVALID; + break; + case 0x00020000: + if (pg) { + row = (ret2 >> 9) & 0x0000fc; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 9) & 0x000003; + } else + ret4 = WD76C10_ADDR_INVALID; + break; + case 0x00080000: + if (pg) { + row = (ret2 >> 9) & 0x0000f8; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 21) & 0x000001) << 2; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 10) & 0x000003; + } else + ret4 = WD76C10_ADDR_INVALID; + break; + case 0x00200000: + if (pg) { + row = (ret2 >> 9) & 0x0000f0; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 21) & 0x000001) << 2; + row |= ((ret2 >> 23) & 0x000001) << 3; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 11) & 0x000003; + } else + ret4 = WD76C10_ADDR_INVALID; + break; + case 0x00800000: + if (pg) { + row = (ret2 >> 9) & 0x0000e0; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 21) & 0x000001) << 2; + row |= ((ret2 >> 23) & 0x000001) << 3; + row |= ((ret2 >> 24) & 0x000001) << 4; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 12) & 0x000003; + } else + ret4 = WD76C10_ADDR_INVALID; + break; + } + add = 3; + } else if (ilv2) { + size <<= 1; + switch (rb->virt_size) { + default: + ret4 = WD76C10_ADDR_INVALID; + break; + case 0x00020000: + if (pg) { + row = (ret2 >> 9) & 0x0000fe; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 9) & 0x000001; + } else { + row = (ret2 >> 1) & 0x0007fe; + row |= (ret2 >> 13) & 0x000001; + col = (ret2 >> 9) & 0x0000ef; + col |= ((ret2 >> 17) & 0x000001) << 4; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + rb_or = (ret2 >> 1) & 0x000001; + } + break; + case 0x00080000: + if (pg) { + row = (ret2 >> 9) & 0x0000fc; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 10) & 0x000001; + } else { + row = (ret2 >> 1) & 0x0007fe; + row |= (ret2 >> 13) & 0x000001; + col = (ret2 >> 9) & 0x0000ee; + col |= (ret2 >> 17) & 0x000001; + col |= ((ret2 >> 19) & 0x000001) << 4; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + rb_or = (ret2 >> 1) & 0x000001; + } + break; + case 0x00200000: + if (pg) { + row = (ret2 >> 9) & 0x0000f8; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 21) & 0x000001) << 2; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 11) & 0x000001; + } else { + row = (ret2 >> 1) & 0x0007fe; + row |= (ret2 >> 13) & 0x000001; + col = (ret2 >> 9) & 0x0000ec; + col |= (ret2 >> 17) & 0x000001; + col |= ((ret2 >> 19) & 0x000001) << 1; + col |= ((ret2 >> 21) & 0x000001) << 4; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + rb_or = (ret2 >> 1) & 0x000001; + } + break; + case 0x00800000: + if (pg) { + row = (ret2 >> 9) & 0x0000f0; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 21) & 0x000001) << 2; + row |= ((ret2 >> 23) & 0x000001) << 3; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x000007ff; + rb_or = (ret2 >> 12) & 0x000001; + } else { + row = (ret2 >> 1) & 0x0007fe; + row |= (ret2 >> 13) & 0x000001; + col = (ret2 >> 9) & 0x0000e0; + col |= (ret2 >> 17) & 0x000001; + col |= ((ret2 >> 19) & 0x000001) << 1; + col |= ((ret2 >> 21) & 0x000001) << 2; + col |= ((ret2 >> 23) & 0x000001) << 3; + col |= ((ret2 >> 12) & 0x000001) << 4; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + rb_or = (ret2 >> 1) & 0x000001; + } + break; + } + add = 1; + } else if (pg) switch (rb->virt_size) { + default: + ret4 = WD76C10_ADDR_INVALID; + break; + case 0x00020000: + row = (ret2 >> 9) & 0x0000ff; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x0007ff; + break; + case 0x00080000: + row = (ret2 >> 9) & 0x0000fe; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x0007ff; + break; + case 0x00200000: + row = (ret2 >> 9) & 0x0000fc; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x0007ff; + break; + case 0x00800000: + row = (ret2 >> 9) & 0x0000f8; + row |= (ret2 >> 17) & 0x000001; + row |= ((ret2 >> 19) & 0x000001) << 1; + row |= ((ret2 >> 21) & 0x000001) << 2; + row |= ((ret2 >> 18) & 0x000001) << 8; + row |= ((ret2 >> 20) & 0x000001) << 9; + row |= ((ret2 >> 22) & 0x000001) << 10; + col = (ret2 >> 1) & 0x0007ff; + break; + } else switch (rb->virt_size) { + default: + ret4 = WD76C10_ADDR_INVALID; + break; + case 0x00020000: + row = (ret2 >> 1) & 0x0007ff; + col = (ret2 >> 9) & 0x0000ff; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + break; + case 0x00080000: + row = (ret2 >> 1) & 0x0007ff; + col = (ret2 >> 9) & 0x0000fe; + col |= (ret2 >> 17) & 0x000001; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + break; + case 0x00200000: + row = (ret2 >> 1) & 0x0007ff; + col = (ret2 >> 9) & 0x0000fc; + col |= (ret2 >> 17) & 0x000001; + col |= ((ret2 >> 19) & 0x000001) << 1; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + break; + case 0x00800000: + row = (ret2 >> 1) & 0x0007ff; + col = (ret2 >> 9) & 0x0000f8; + col |= (ret2 >> 17) & 0x000001; + col |= ((ret2 >> 19) & 0x000001) << 1; + col |= ((ret2 >> 21) & 0x000001) << 2; + col |= ((ret2 >> 18) & 0x000001) << 8; + col |= ((ret2 >> 20) & 0x000001) << 9; + col |= ((ret2 >> 22) & 0x000001) << 10; + break; + } + + if (row != WD76C10_ADDR_INVALID) { + ret4 = wd76c10_calc_phys(row & 0x0007ff, col & 0x0007ff, + rb->phys_size, ret2 & 0x000001); + + if (ilv4 || ilv2) + rb = &(dev->ram_banks[i | rb_or]); + + i += add; + } + + if (rb->enable && (ret >= rb->virt_addr) && + (ret < (rb->virt_addr + size))) { + if ((ret4 != WD76C10_ADDR_INVALID) && (rb->phys_size > 0x00000000)) + nrt = ret4 + rb->phys_addr; + break; + } + } + + ret = nrt; + } + if (ret >= (mem_size << 10)) /* The physical memory address is too high or disabled, which is invalid. */ ret = WD76C10_ADDR_INVALID; - /* Otherwise, map it to the correct bank so the BIOS can auto-size it correctly. */ - else for (uint8_t i = 0; i < 4; i++) { - rb = &(dev->ram_banks[i]); - if (rb->enable && (ret >= rb->virt_addr) && (ret < (rb->virt_addr + rb->virt_size))) { - if (rb->phys_size == 0x00000000) - ret = WD76C10_ADDR_INVALID; - else - ret = ((ret - rb->virt_addr) % rb->phys_size) + rb->phys_addr; - break; - } - } return ret; } @@ -185,8 +504,12 @@ wd76c10_read_ram(uint32_t addr, void *priv) addr = wd76c10_calc_addr(dev, addr); - if (addr != WD76C10_ADDR_INVALID) - ret = mem_read_ram(addr, priv); + if (addr != WD76C10_ADDR_INVALID) { + if (dev->fast) + ret = mem_read_ram(addr, priv); + else + ret = ram[addr]; + } return ret; } @@ -199,8 +522,12 @@ wd76c10_read_ramw(uint32_t addr, void *priv) addr = wd76c10_calc_addr(dev, addr); - if (addr != WD76C10_ADDR_INVALID) - ret = mem_read_ramw(addr, priv); + if (addr != WD76C10_ADDR_INVALID) { + if (dev->fast) + ret = mem_read_ramw(addr, priv); + else + ret = *(uint16_t *) &(ram[addr]); + } return ret; } @@ -212,8 +539,12 @@ wd76c10_write_ram(uint32_t addr, uint8_t val, void *priv) addr = wd76c10_calc_addr(dev, addr); - if (addr != WD76C10_ADDR_INVALID) - mem_write_ram(addr, val, priv); + if (addr != WD76C10_ADDR_INVALID) { + if (dev->fast) + mem_write_ram(addr, val, priv); + else + ram[addr] = val; + } } static void @@ -223,8 +554,12 @@ wd76c10_write_ramw(uint32_t addr, uint16_t val, void *priv) addr = wd76c10_calc_addr(dev, addr); - if (addr != WD76C10_ADDR_INVALID) - mem_write_ramw(addr, val, priv); + if (addr != WD76C10_ADDR_INVALID) { + if (dev->fast) + mem_write_ramw(addr, val, priv); + else + *(uint16_t *) &(ram[addr]) = val; + } } static void @@ -258,6 +593,9 @@ wd76c10_recalc_exec(wd76c10_t *dev, uint32_t base, uint32_t size) static void wd76c10_banks_recalc(wd76c10_t *dev) { + int match = 0; + dev->fast = 0; + for (uint8_t i = 0; i < 4; i++) { ram_bank_t *rb = &(dev->ram_banks[i]); uint8_t bit = i << 1; @@ -266,8 +604,42 @@ wd76c10_banks_recalc(wd76c10_t *dev) rb->enable = (dev->split_sa >> bit) & 0x01; rb->virt_addr = ((uint32_t) dev->bank_bases[i]) << 17; + if (rb->enable) { + rb->adj_virt_addr = rb->virt_addr; + rb->adj_virt_size = rb->virt_size; + + if (dev->mem_ctl & 0x0400) + rb->adj_virt_addr += (i * rb->adj_virt_size); + else if ((dev->mem_ctl >> 8) & (1 << (i >> 1))) + rb->adj_virt_addr += ((i & 1) * rb->adj_virt_size); + } else { + rb->adj_virt_addr = WD76C10_ADDR_INVALID; + rb->adj_virt_size = 0x00000000; + } + + if ((rb->enable == rb->phys_on) && + (rb->adj_virt_addr == rb->phys_addr) && + (rb->adj_virt_size == rb->phys_size)) + match++; + } + + dev->fast = (match == 4); + + for (uint8_t i = 0; i < 4; i++) { + ram_bank_t *rb = &(dev->ram_banks[i]); + if (cpu_use_exec) wd76c10_recalc_exec(dev, rb->virt_addr, rb->virt_size); + + wd76c10_log("Bank %i (%s), physical: %i, %08X-%08X, " + "virtual: %i, %08X-%08X, adj.: %i, %08X-%08X\n", + i, dev->fast ? "FAST" : "SLOW", + rb->phys_on, + rb->phys_addr, rb->phys_addr + rb->phys_size - 1, + rb->enable, + rb->virt_addr, rb->virt_addr + rb->virt_size - 1, + rb->enable, + rb->adj_virt_addr, rb->adj_virt_addr + rb->adj_virt_size - 1); } } @@ -899,11 +1271,22 @@ wd76c10_init(UNUSED(const device_t *info)) } } if (size != 0x00000000) { + rb->phys_on = 1; rb->phys_addr = accum_mem; rb->phys_size = size; + wd76c10_log("Bank %i size: %5i KiB, starting at %5i KiB\n", i, rb->phys_size >> 10, rb->phys_addr >> 10); total_mem -= size; accum_mem += size; - } + } else + rb->phys_addr = WD76C10_ADDR_INVALID; + } + + if (mem_size == 3072) { + /* Reorganize the banks a bit so, we have 2048, 0, 512, 512. */ + ram_bank_t rt = dev->ram_banks[3]; + dev->ram_banks[3] = dev->ram_banks[2]; + dev->ram_banks[2] = dev->ram_banks[1]; + dev->ram_banks[1] = rt; } rb = &(dev->ram_banks[4]); From d07038961fa6e428f58493660484d0d3e0849907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:15:42 +0200 Subject: [PATCH 108/118] Add win11arm job --- .github/workflows/cmake_windows_msys2.yml | 35 +++++++---------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index abe25b949..495937b10 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -18,7 +18,6 @@ on: - cmake/** - "**/CMakeLists.txt" - "CMakePresets.json" - - .github/workflows/** - .github/workflows/cmake_windows_msys2.yml - vcpkg.json - "!**/Makefile*" @@ -26,9 +25,9 @@ on: jobs: msys2: - name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}" + name: "${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}" - runs-on: windows-2022 + runs-on: ${{ matrix.environment.runner }} env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed @@ -41,8 +40,6 @@ jobs: fail-fast: true matrix: build: -# - name: Regular -# preset: regular - name: Debug preset: dev_debug slug: -Debug @@ -56,26 +53,15 @@ jobs: - name: NDR new: on slug: -NDR - ui: - - name: Qt GUI - qt: on - static: on - slug: -Qt - packages: >- - qt5-static:p - vulkan-headers:p environment: -# - msystem: MSYS -# toolchain: ./cmake/flags-gcc-x86_64.cmake - msystem: MINGW64 - prefix: mingw-w64-x86_64 toolchain: ./cmake/flags-gcc-x86_64.cmake -# - msystem: CLANG64 -# prefix: mingw-w64-clang-x86_64 -# toolchain: ./cmake/llvm-win32-x86_64.cmake -# - msystem: UCRT64 -# prefix: mingw-w64-ucrt-x86_64 -# toolchain: ./cmake/flags-gcc-x86_64.cmake + slug: -x64 + runner: windows-2022 + - msystem: CLANGARM64 + toolchain: ./cmake/flags-gcc-aarch64.cmake + slug: -ARM64 + runner: windows-11-arm steps: - name: Prepare MSYS2 environment @@ -98,7 +84,8 @@ jobs: libslirp:p fluidsynth:p libserialport:p - ${{ matrix.ui.packages }} + qt5-static:p + vulkan-headers:p - name: Checkout repository uses: actions/checkout@v4 @@ -114,8 +101,6 @@ jobs: --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} -D CMAKE_INSTALL_PREFIX=./build/artifacts - -D QT=${{ matrix.ui.qt }} - -D STATIC_BUILD=${{ matrix.ui.static }} - name: Build run: | From 775c7bd3d61c356d74fa51b7dd865fd77559a861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:26:14 +0200 Subject: [PATCH 109/118] Try to fix the job --- .github/workflows/cmake_windows_msys2.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index 495937b10..f3262c4d5 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -40,11 +40,10 @@ jobs: fail-fast: true matrix: build: - - name: Debug - preset: dev_debug - slug: -Debug + - name: Regular + preset: regular - name: Dev - preset: development + preset: dev_debug slug: -Dev dynarec: - name: ODR @@ -60,14 +59,19 @@ jobs: runner: windows-2022 - msystem: CLANGARM64 toolchain: ./cmake/flags-gcc-aarch64.cmake - slug: -ARM64 + slug: -arm64 runner: windows-11-arm + exclude: + - dynarec: + new: off + environment: + msystem: CLANGARM64 steps: - name: Prepare MSYS2 environment uses: msys2/setup-msys2@v2 with: - release: false + release: true update: true msystem: ${{ matrix.environment.msystem }} pacboy: >- From 1080389bfd403b561935b8fe8ae43bd99f680f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:35:48 +0200 Subject: [PATCH 110/118] Fix number 2 --- .github/workflows/cmake_windows_msys2.yml | 26 ++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index f3262c4d5..b2bb9b3a6 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -96,8 +96,8 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp@v3 + # - name: Install sonar-scanner and build-wrapper + # uses: SonarSource/sonarcloud-github-c-cpp@v3 - name: Configure CMake run: >- @@ -106,17 +106,19 @@ jobs: -D NEW_DYNAREC=${{ matrix.dynarec.new }} -D CMAKE_INSTALL_PREFIX=./build/artifacts - - name: Build - run: | - .sonar/build-wrapper-win-x86/build-wrapper-win-x86-64.exe --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build + # - name: Build + # run: | + # .sonar/build-wrapper-win-x86/build-wrapper-win-x86-64.exe --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build - - name: Run sonar-scanner - if: 0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: | - .sonar/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}" + - name: Build + run: cmake --build build + + # - name: Run sonar-scanner + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + # run: | + # .sonar/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}" - name: Generate package run: cmake --install build From 52458f78439c255886b8e54de95beb9d0c7e4770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:43:11 +0200 Subject: [PATCH 111/118] Fix number 3 --- .github/workflows/cmake_windows_msys2.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index b2bb9b3a6..f94853279 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -90,6 +90,7 @@ jobs: libserialport:p qt5-static:p vulkan-headers:p + openmp:p - name: Checkout repository uses: actions/checkout@v4 From fe9f6a7f1daafa8cf7747f4270bb6af8baf1bef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:54:21 +0200 Subject: [PATCH 112/118] Artifact names in line with Jenkins --- .github/workflows/cmake_windows_msys2.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index f94853279..d9cd37d0d 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -48,14 +48,13 @@ jobs: dynarec: - name: ODR new: off - slug: -ODR - name: NDR new: on slug: -NDR environment: - msystem: MINGW64 toolchain: ./cmake/flags-gcc-x86_64.cmake - slug: -x64 + slug: "-64" runner: windows-2022 - msystem: CLANGARM64 toolchain: ./cmake/flags-gcc-aarch64.cmake @@ -127,5 +126,5 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}' + name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}${{ matrix.environment.slug }}-gha${{ github.run_number }}' path: build/artifacts/** From 1b61f58bf00ce333c7baf4d6235b1cfd0816f486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:55:11 +0200 Subject: [PATCH 113/118] Fix --- .github/workflows/cmake_windows_msys2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index d9cd37d0d..44d982e16 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -126,5 +126,5 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}${{ matrix.environment.slug }}-gha${{ github.run_number }}' + name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows${{ matrix.environment.slug }}-gha${{ github.run_number }}' path: build/artifacts/** From e4d7911f857695cd956280b9050173d14d03c5ab Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 15 Apr 2025 14:06:02 -0300 Subject: [PATCH 114/118] Fix Conner name in one model preset --- src/disk/hdd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disk/hdd.c b/src/disk/hdd.c index 8a02173ce..e051cc841 100644 --- a/src/disk/hdd.c +++ b/src/disk/hdd.c @@ -469,7 +469,7 @@ static hdd_preset_t hdd_speed_presets[] = { { .name = "[ATA-2] Western Digital Caviar 22000", .internal_name = "AC22000", .model = "WDC AC22000LA", .zones = 8, .avg_spt = 130, .heads = 3, .rpm = 5200, .full_stroke_ms = 33, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, { .name = "[ATA-2] Western Digital Caviar 22100", .internal_name = "AC22100", .model = "WDC AC22100H", .zones = 8, .avg_spt = 140, .heads = 4, .rpm = 5200, .full_stroke_ms = 30, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, { .name = "[ATA-2] Western Digital Caviar 31200", .internal_name = "AC31200", .model = "WDC AC31200F", .zones = 8, .avg_spt = 210, .heads = 4, .rpm = 4500, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 16 }, - { .name = "[ATA-3] Connor CFS1275A", .internal_name = "CFS1275A", .model = "Connor Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3 + { .name = "[ATA-3] Conner CFS1275A", .internal_name = "CFS1275A", .model = "Conner Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3 { .name = "[ATA-3] Fujitsu MPA3017AT", .internal_name = "MPA3017AT", .model = "FUJITSU MPA3017AT", .zones = 5, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, { .name = "[ATA-3] Fujitsu MPA3026AT", .internal_name = "MPA3026AT", .model = "FUJITSU MPA3026AT", .zones = 8, .avg_spt = 195, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, { .name = "[ATA-3] Fujitsu MPA3035AT", .internal_name = "MPA3035AT", .model = "FUJITSU MPA3035AT", .zones = 11, .avg_spt = 195, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, From 9b54021061a09ebf5588425279f95d2428faefb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:10:18 +0200 Subject: [PATCH 115/118] Use debug instead of release --- .github/workflows/cmake_windows_msys2.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index 44d982e16..9dda6a695 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -40,8 +40,9 @@ jobs: fail-fast: true matrix: build: - - name: Regular - preset: regular + - name: Debug + preset: debug + slug: -Debug - name: Dev preset: dev_debug slug: -Dev From 90134095b95b36f9635d036bb8aababcb784256a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:16:59 +0200 Subject: [PATCH 116/118] Fix the presets once again --- .github/workflows/cmake_windows_msys2.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index 9dda6a695..98aae1883 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -40,11 +40,11 @@ jobs: fail-fast: true matrix: build: - - name: Debug + - name: Dev Debug preset: debug - slug: -Debug + slug: -Dev-Debug - name: Dev - preset: dev_debug + preset: development slug: -Dev dynarec: - name: ODR From bb0b8f254de968e9b0de8918467dea741f83a7e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:19:39 +0200 Subject: [PATCH 117/118] ... --- .github/workflows/cmake_windows_msys2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index 98aae1883..ca48599a0 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -41,7 +41,7 @@ jobs: matrix: build: - name: Dev Debug - preset: debug + preset: dev_debug slug: -Dev-Debug - name: Dev preset: development From 245619674d160e092bd0d54ed50a5edb06294094 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 15 Apr 2025 22:05:11 +0200 Subject: [PATCH 118/118] PAS16/Plus change of the day (April 15th, 2025) Actually make the DMA transfer speed normal in when in 16-bit stereo mode with System Configuration 1 bit 1 (Master Clock) cleared. Fixes audio being too quick with said configuration. --- src/sound/snd_pas16.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c index dd95eac4c..cfefc8df5 100644 --- a/src/sound/snd_pas16.c +++ b/src/sound/snd_pas16.c @@ -1756,7 +1756,7 @@ static uint16_t pas16_readdmaw_stereo(pas16_t *pas16) { uint16_t ret; - uint16_t ticks = (pas16->sys_conf_1 & 0x02) ? (1 + (pas16->dma < 5)) : 2; + uint16_t ticks = (pas16->sys_conf_1 & 0x02) ? (1 + (pas16->dma < 5)) : 1; ret = pas16_dma_readw(pas16, ticks);