From 906f856dd0471cdafe922af1fbcb88b0750bed69 Mon Sep 17 00:00:00 2001 From: JustinJ553 Date: Tue, 26 Oct 2021 09:22:52 +0800 Subject: [PATCH 001/159] Add an leftover out of spec K6-III+/100 and change its multiplier. --- src/cpu/cpu_table.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index b29e20ce0..834d25ebe 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -833,7 +833,7 @@ const cpu_family_t cpu_families[] = { .name = "K6-III+", .internal_name = "k6_3p", .cpus = (const CPU[]) { - {"100", CPU_K6_3P, fpus_internal, 100000000, 1.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7, 4, 4, 9}, + {"100", CPU_K6_3P, fpus_internal, 100000000, 1.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7, 4, 4, 9}, /* out of spec */ {"400", CPU_K6_3P, fpus_internal, 400000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, {"450", CPU_K6_3P, fpus_internal, 450000000, 4.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, {"475", CPU_K6_3P, fpus_internal, 475000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, @@ -1564,7 +1564,8 @@ static const cpu_legacy_table_t cpus_K56_SS7[] = { {"k6_3", 400000000, 4.0}, {"k6_3", 450000000, 4.5}, {"k6_3p", 75000000, 1.5}, - {"k6_3p", 400000000, 4.0}, + {"k6_3p", 100000000, 1.5}, + {"k6_3p", 400000000, 4.0}, {"k6_3p", 450000000, 4.5}, {"k6_3p", 475000000, 5.0}, {"k6_3p", 500000000, 5.0}, From 92bfb61dfc73703fe2e24583cc8ca526266f398e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 28 Oct 2021 15:44:31 -0400 Subject: [PATCH 002/159] More systems which have PS/2 mouse --- src/machine/machine_table.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 9dd5db1fa..e4d5ff9bc 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -221,24 +221,24 @@ const machine_t machines[] = { { "[SiS 471] AMI 486 Clone", "ami471", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE, 1024, 65536, 1024, 127, machine_at_ami471_init, NULL }, { "[SiS 471] AMI WinBIOS 486 clone", "win471", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE, 1024, 65536, 1024, 127, machine_at_win471_init, NULL }, { "[SiS 471] AOpen Vi15G", "vi15g", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE, 1024, 65536, 1024, 127, machine_at_vi15g_init, NULL }, - { "[SiS 471] ASUS VL/I-486SV2G (GX4)", "vli486sv2g", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE_DUAL, 1024, 65536, 1024, 127, machine_at_vli486sv2g_init, NULL }, + { "[SiS 471] ASUS VL/I-486SV2G (GX4)", "vli486sv2g", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 65536, 1024, 127, machine_at_vli486sv2g_init, NULL }, { "[SiS 471] DTK PKM-0038S E-2", "dtk486", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE, 1024, 65536, 1024, 127, machine_at_dtk486_init, NULL }, { "[SiS 471] Phoenix SiS 471", "px471", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE, 1024,131072, 1024, 127, machine_at_px471_init, NULL }, /* 486 machines which utilize the PCI bus */ { "[ALi M1489] ABIT AB-PB4", "abpb4", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 65536, 1024, 255, machine_at_abpb4_init, NULL }, { "[ALi M1489] AMI WinBIOS 486 PCI", "win486pci", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 65536, 1024, 255, machine_at_win486pci_init, NULL }, - { "[OPTi 802G] IBM PC 330 (type 6573)", "pc330_6573", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3_PC330, 0, 25000000, 33333333, 0, 0, 2.0, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE, 1024, 65536, 1024, 127, machine_at_pc330_6573_init, NULL }, - { "[i420EX] ASUS PVI-486AP4", "486ap4", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCIV | MACHINE_IDE_DUAL, 1024, 131072, 1024, 127, machine_at_486ap4_init, NULL }, - { "[i420ZX] ASUS PCI/I-486SP3G", "486sp3g", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL | MACHINE_SCSI, 1024, 131072, 1024, 127, machine_at_486sp3g_init, NULL }, + { "[OPTi 802G] IBM PC 330 (type 6573)", "pc330_6573", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3_PC330, 0, 25000000, 33333333, 0, 0, 2.0, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE, 1024, 65536, 1024, 127, machine_at_pc330_6573_init, NULL }, + { "[i420EX] ASUS PVI-486AP4", "486ap4", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCIV | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 131072, 1024, 127, machine_at_486ap4_init, NULL }, + { "[i420ZX] ASUS PCI/I-486SP3G", "486sp3g", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SCSI, 1024, 131072, 1024, 127, machine_at_486sp3g_init, NULL }, { "[i420TX] ASUS PCI/I-486SP3", "486sp3", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL | MACHINE_SCSI, 1024, 131072, 1024, 127, machine_at_486sp3_init, NULL }, { "[i420TX] Intel Classic/PCI", "alfredo", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 2048, 131072, 2048, 127, machine_at_alfredo_init, NULL }, - { "[SiS 496] ASUS PVI-486SP3C", "486sp3c", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCIV | MACHINE_IDE_DUAL, 1024, 261120, 1024, 255, machine_at_486sp3c_init, NULL }, + { "[SiS 496] ASUS PVI-486SP3C", "486sp3c", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCIV | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 261120, 1024, 255, machine_at_486sp3c_init, NULL }, { "[SiS 496] Lucky Star LS-486E", "ls486e", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_ls486e_init, NULL }, { "[SiS 496] Micronics M4Li", "m4li", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 131072, 1024, 127, machine_at_m4li_init, NULL }, { "[SiS 496] Rise Computer R418", "r418", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 261120, 1024, 255, machine_at_r418_init, NULL }, { "[SiS 496] Soyo 4SA2", "4sa2", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, CPU_BLOCK(CPU_i486SX, CPU_i486DX, CPU_Am486SX, CPU_Am486DX), 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 261120, 1024, 255, machine_at_4sa2_init, NULL }, - { "[SiS 496] Zida Tomato 4DP", "4dps", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 261120, 1024, 255, machine_at_4dps_init, NULL }, + { "[SiS 496] Zida Tomato 4DP", "4dps", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 261120, 1024, 255, machine_at_4dps_init, NULL }, { "[UMC 8881] A-Trend ATC-1415", "atc1415", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 65536, 1024, 255, machine_at_atc1415_init, NULL }, { "[UMC 8881] ECS Elite UM8810PAIO", "ecs486", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_ecs486_init, NULL }, { "[UMC 8881] Shuttle HOT-433A", "hot433", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 262144, 1024, 255, machine_at_hot433_init, NULL }, @@ -266,7 +266,7 @@ const machine_t machines[] = { { "[i430LX] Packard Bell PB520R", "pb520r", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 139264, 2048, 127, machine_at_pb520r_init, at_pb520r_get_device }, /* OPTi 596/597 */ - { "[OPTi 597] AMI Excalibur VLB", "excalibur", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_VLB | MACHINE_IDE, 2048, 65536, 2048, 127, machine_at_excalibur_init, NULL }, + { "[OPTi 597] AMI Excalibur VLB", "excalibur", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_VLB | MACHINE_BUS_PS2 | MACHINE_IDE, 2048, 65536, 2048, 127, machine_at_excalibur_init, NULL }, /* SiS 85C50x */ { "[SiS 85C50x] ASUS PCI/I-P5SP4", "p5sp4", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p5sp4_init, NULL }, @@ -297,7 +297,7 @@ const machine_t machines[] = { { "[SiS 85C50x] BCM SQ-588", "sq588", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_PENTIUMMMX), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_sq588_init, NULL }, /* UMC 889x */ - { "[UMC 889x] Shuttle HOT-539", "hot539", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3600, 1.5, 2.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 262144, 8192, 127, machine_at_hot539_init, NULL }, + { "[UMC 889x] Shuttle HOT-539", "hot539", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3600, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 127, machine_at_hot539_init, NULL }, /* Socket 7 (Single Voltage) machines */ /* 430FX */ @@ -308,7 +308,7 @@ const machine_t machines[] = { { "[i430FX] Intel Advanced/ATX (MR BIOS)", "mrthor", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_mrthor_init, NULL }, { "[i430FX] Intel Advanced/EV", "endeavor", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_endeavor_init, at_endeavor_get_device }, { "[i430FX] Packard Bell PB640", "pb640", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_pb640_init, at_pb640_get_device }, - { "[i430FX] QDI Chariot", "chariot", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_WINCHIP, CPU_WINCHIP2, CPU_Cx6x86, CPU_Cx6x86L, CPU_Cx6x86MX), 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_chariot_init, NULL }, + { "[i430FX] QDI Chariot", "chariot", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_WINCHIP, CPU_WINCHIP2, CPU_Cx6x86, CPU_Cx6x86L, CPU_Cx6x86MX), 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_chariot_init, NULL }, /* 430HX */ { "[i430HX] Acer M3A", "acerm3a", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3300, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 196608, 8192, 127, machine_at_acerm3a_init, NULL }, From 88bfee8e07b4e428f947487d49224ceb0d3ab8fe Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Sat, 30 Oct 2021 20:44:09 +0300 Subject: [PATCH 003/159] Add Winbox to recommended managers in readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 87b06018c..f351fb7e2 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,13 @@ System requirements and recommendations Performance may vary depending on both host and guest configuration. Most emulation logic is executed in a single thread, therefore generally systems with better IPC (instructions per clock) should be able to emulate higher clock speeds. -It is also recommended to use the [86Box Manager](https://github.com/86Box/86BoxManager) by [daviunic](https://github.com/daviunic) (Overdoze) to manage virtual machines. However, it is also possible to use 86Box on its own with the `--vmpath`/`-P` command line option. +It is also recommended to use a manager application with 86Box for easier handling of multiple virtual machines. +* [Winbox for 86Box](https://github.com/laciba96/WinBox-for-86Box) by [Laci bá'](https://github.com/laciba96) + * The new manager with improved new user experience; installer, automatic updates of emulator files and more. +* [86Box Manager](https://github.com/86Box/86BoxManager) by [daviunic](https://github.com/daviunic) (Overdoze) + * The traditional 86Box manager with simple interface. + +However, it is also possible to use 86Box on its own with the `--vmpath`/`-P` command line option. Downloads --------- From 295b6bd211fa799d2834793764de7996402be340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= <84271678+laciba96@users.noreply.github.com> Date: Sat, 30 Oct 2021 21:12:54 +0200 Subject: [PATCH 004/159] Fix character casing in the managers list --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f351fb7e2..92fc718dd 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ System requirements and recommendations Performance may vary depending on both host and guest configuration. Most emulation logic is executed in a single thread, therefore generally systems with better IPC (instructions per clock) should be able to emulate higher clock speeds. It is also recommended to use a manager application with 86Box for easier handling of multiple virtual machines. -* [Winbox for 86Box](https://github.com/laciba96/WinBox-for-86Box) by [Laci bá'](https://github.com/laciba96) +* [WinBox for 86Box](https://github.com/laciba96/WinBox-for-86Box) by [Laci bá'](https://github.com/laciba96) * The new manager with improved new user experience; installer, automatic updates of emulator files and more. * [86Box Manager](https://github.com/86Box/86BoxManager) by [daviunic](https://github.com/daviunic) (Overdoze) * The traditional 86Box manager with simple interface. From 9b3b9c86b09adcdcf75a61fe1c0342ef250cbd27 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 31 Oct 2021 18:35:04 +0100 Subject: [PATCH 005/159] MIDI changes: Fixed MIDI UART OUT of the ES1371 using NT 4.0's drivers and keeping compatibility with Win9x/2000. --- src/sound/snd_audiopci.c | 17 +++++------------ src/sound/snd_opl.c | 10 ++++------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index 4956f7742..62fd8f310 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -1703,24 +1703,17 @@ es1371_poll(void *p) But if anything sets MIDI Input and Output together we'd have to take account of the MIDI Output case, and disable IRQ's and RX bits when MIDI Input is enabled as well but not in the MIDI Output portion */ - if (dev->uart_ctrl & UART_CTRL_TXINTEN) - dev->int_status |= INT_STATUS_UART; - else - dev->int_status &= ~INT_STATUS_UART; + dev->int_status &= ~INT_STATUS_UART; + dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); } else if (!(dev->uart_ctrl & UART_CTRL_RXINTEN) && ((dev->uart_ctrl & UART_CTRL_TXINTEN))) { /* Or enable the UART IRQ and the respective TX bits only when the MIDI Output is enabled */ dev->int_status |= INT_STATUS_UART; + } else { + dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); } - if (dev->uart_ctrl & UART_CTRL_RXINTEN) { - if (dev->uart_ctrl & UART_CTRL_TXINTEN) - dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); - else - dev->uart_status &= ~(UART_STATUS_TXINT | UART_STATUS_TXRDY); - } else - dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); - + audiopci_log("UART control = %02x\n", dev->uart_ctrl & (UART_CTRL_RXINTEN | UART_CTRL_TXINTEN)); es1371_update_irqs(dev); } diff --git a/src/sound/snd_opl.c b/src/sound/snd_opl.c index 7708a3b59..6cd31f608 100644 --- a/src/sound/snd_opl.c +++ b/src/sound/snd_opl.c @@ -108,12 +108,10 @@ timer_control(opl_t *dev, int tmr, int start) timer_on_auto(&dev->timers[tmr], (tmr == 1) ? 320.0 : 80.0); } else { opl_log("Timer %i stopped\n", tmr); - if (!(dev->flags & FLAG_OPL3)) { - if (tmr == 1) { - dev->status &= ~STAT_TMR2_OVER; - } else - dev->status &= ~STAT_TMR1_OVER; - } + if (tmr == 1) { + dev->status &= ~STAT_TMR2_OVER; + } else + dev->status &= ~STAT_TMR1_OVER; } } From 7bf6fc384401fb6d636f2866404dafd3dabea063 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 31 Oct 2021 19:06:16 +0100 Subject: [PATCH 006/159] Video changes (ET4000W32/i): Bit 1 is of 0x3DA (read only) is apparently required to make the OS/2 Tseng ET4000W32/i drivers work fine, fixes hangs upon reaching the GUI with said drivers. Avoid division by zero in the blitter of the ET4000W32/i under OS/2. Video changes (PVGA): Fixes mode changes of the PVGA1a, including the built-in video card of the Amstrad 2086/3086. --- src/video/vid_et4000w32.c | 56 ++++++++++++++++++++++++++------------- src/video/vid_paradise.c | 7 +++-- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index 233783439..65dced875 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -169,7 +169,7 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *p) uint32_t add2addr = 0; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) - addr ^= 0x60; + addr ^= 0x60; switch (addr) { case 0x3c2: @@ -311,7 +311,7 @@ et4000w32p_in(uint16_t addr, void *p) svga_t *svga = &et4000->svga; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) - addr ^= 0x60; + addr ^= 0x60; switch (addr) { case 0x3c5: @@ -335,13 +335,25 @@ et4000w32p_in(uint16_t addr, void *p) case 0x3d5: return svga->crtc[svga->crtcreg]; + case 0x3da: + svga->attrff = 0; + + /*Bit 1 of the Input Status Register is required by OS/2 ET4000W32/I drivers to be set otherwise + the guest will loop infinitely upon reaching the GUI*/ + if (svga->cgastat & 0x01) + svga->cgastat &= ~0x32; + else + svga->cgastat ^= 0x32; + return svga->cgastat; + case 0x210a: case 0x211a: case 0x212a: case 0x213a: case 0x214a: case 0x215a: case 0x216a: case 0x217a: return et4000->index; - case 0x210B: case 0x211B: case 0x212B: case 0x213B: - case 0x214B: case 0x215B: case 0x216B: case 0x217B: - if (et4000->index == 0xec) + case 0x210B: case 0x211B: case 0x212B: case 0x213B: + case 0x214B: case 0x215B: case 0x216B: case 0x217B: + if (et4000->index == 0xec) { return (et4000->regs[0xec] & 0xf) | (et4000->rev << 4); + } if (et4000->index == 0xee) { if (svga->bpp == 8) { if ((svga->gdcreg[5] & 0x60) >= 0x40) @@ -761,7 +773,7 @@ et4000w32p_mmu_read(uint32_t addr, void *p) svga_t *svga = &et4000->svga; int bank; uint8_t temp; - + switch (addr & 0x6000) { case 0x0000: /* MMU 0 */ case 0x2000: /* MMU 1 */ @@ -783,7 +795,7 @@ et4000w32p_mmu_read(uint32_t addr, void *p) if ((addr&0x1fff) + et4000->mmu.base[bank] >= svga->vram_max) return 0xff; - + return svga->vram[(addr&0x1fff) + et4000->mmu.base[bank]]; case 0x6000: @@ -889,7 +901,10 @@ et4000w32_blit_start(et4000w32p_t *et4000) } et4000->acl.pattern_back = et4000->acl.pattern_addr; if (!(et4000->acl.internal.pattern_wrap & 0x40)) { - et4000->acl.pattern_y = (et4000->acl.pattern_addr / (et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); + if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00) + et4000->acl.pattern_y = (et4000->acl.pattern_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); + else + et4000->acl.pattern_y = (et4000->acl.pattern_addr / (et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); et4000->acl.pattern_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7]) - 1); } et4000->acl.pattern_x_back = et4000->acl.pattern_x; @@ -902,7 +917,10 @@ et4000w32_blit_start(et4000w32p_t *et4000) et4000->acl.source_back = et4000->acl.source_addr; if (!(et4000->acl.internal.source_wrap & 0x40)) { - et4000->acl.source_y = (et4000->acl.source_addr / (et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); + if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00) + et4000->acl.source_y = (et4000->acl.source_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); + else + et4000->acl.source_y = (et4000->acl.source_addr / (et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); et4000->acl.source_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7]) - 1); } et4000->acl.source_x_back = et4000->acl.source_x; @@ -1655,7 +1673,7 @@ static const device_config_t et4000w32p_config[] = const device_t et4000w32_device = { - "Tseng Labs ET4000/w32", + "Tseng Labs ET4000/w32 ISA", DEVICE_ISA | DEVICE_AT, ET4000W32, et4000w32p_init, et4000w32p_close, NULL, { et4000w32_available }, @@ -1666,7 +1684,7 @@ const device_t et4000w32_device = const device_t et4000w32_onboard_device = { - "Tseng Labs ET4000/w32 (On-board)", + "Tseng Labs ET4000/w32 (ISA) (On-Board)", DEVICE_ISA | DEVICE_AT, ET4000W32, et4000w32p_init, et4000w32p_close, NULL, { et4000w32_available }, @@ -1677,7 +1695,7 @@ const device_t et4000w32_onboard_device = const device_t et4000w32i_isa_device = { - "Tseng Labs ET4000/w32i ISA", + "Tseng Labs ET4000/w32i Rev. B ISA", DEVICE_ISA | DEVICE_AT, ET4000W32I, et4000w32p_init, et4000w32p_close, NULL, { et4000w32i_isa_available }, @@ -1688,7 +1706,7 @@ const device_t et4000w32i_isa_device = const device_t et4000w32i_vlb_device = { - "Tseng Labs ET4000/w32i VLB", + "Tseng Labs ET4000/w32i Rev. B VLB", DEVICE_VLB, ET4000W32I, et4000w32p_init, et4000w32p_close, NULL, { et4000w32i_vlb_available }, @@ -1721,7 +1739,7 @@ const device_t et4000w32p_revc_pci_device = const device_t et4000w32p_noncardex_vlb_device = { - "Tseng Labs ET4000/w32p VLB", + "Tseng Labs ET4000/w32p Rev. D VLB", DEVICE_VLB, ET4000W32P, et4000w32p_init, et4000w32p_close, NULL, { et4000w32p_noncardex_available }, @@ -1732,7 +1750,7 @@ const device_t et4000w32p_noncardex_vlb_device = const device_t et4000w32p_noncardex_pci_device = { - "Tseng Labs ET4000/w32p PCI", + "Tseng Labs ET4000/w32p Rev. D PCI", DEVICE_PCI, ET4000W32P, et4000w32p_init, et4000w32p_close, NULL, { et4000w32p_noncardex_available }, @@ -1743,7 +1761,7 @@ const device_t et4000w32p_noncardex_pci_device = const device_t et4000w32p_cardex_vlb_device = { - "Tseng Labs ET4000/w32p VLB (Cardex)", + "Tseng Labs ET4000/w32p Rev. D VLB (Cardex)", DEVICE_VLB, ET4000W32P_CARDEX, et4000w32p_init, et4000w32p_close, NULL, { et4000w32p_cardex_available }, @@ -1754,7 +1772,7 @@ const device_t et4000w32p_cardex_vlb_device = const device_t et4000w32p_cardex_pci_device = { - "Tseng Labs ET4000/w32p PCI (Cardex)", + "Tseng Labs ET4000/w32p Rev. D PCI (Cardex)", DEVICE_PCI, ET4000W32P_CARDEX, et4000w32p_init, et4000w32p_close, NULL, { et4000w32p_cardex_available }, @@ -1765,7 +1783,7 @@ const device_t et4000w32p_cardex_pci_device = const device_t et4000w32p_vlb_device = { - "Tseng Labs ET4000/w32p VLB (Diamond)", + "Tseng Labs ET4000/w32p Rev. D VLB (Diamond Stealth32)", DEVICE_VLB, ET4000W32P_DIAMOND, et4000w32p_init, et4000w32p_close, NULL, { et4000w32p_available }, @@ -1776,7 +1794,7 @@ const device_t et4000w32p_vlb_device = const device_t et4000w32p_pci_device = { - "Tseng Labs ET4000/w32p PCI (Diamond)", + "Tseng Labs ET4000/w32p Rev. D PCI (Diamond Stealth32)", DEVICE_PCI, ET4000W32P_DIAMOND, et4000w32p_init, et4000w32p_close, NULL, { et4000w32p_available }, diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 5fd0aada0..107a1773f 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -231,7 +231,7 @@ uint8_t paradise_in(uint16_t addr, void *p) case 0x3cf: if (svga->gdcaddr >= 9 && svga->gdcaddr <= 0x0e) { - if ((paradise->pr5 & 7) != 5) + if (paradise->pr5 & 0x10) return 0xff; } switch (svga->gdcaddr) { @@ -354,8 +354,11 @@ void paradise_recalctimings(svga_t *svga) } if (paradise->type < WD90C30) { - if (svga->bpp >= 8 && !svga->lowres) + if (svga->bpp >= 8 && !svga->lowres) { + if ((svga->crtc[0x17] == 0xc2) && (svga->crtc[0x14] & 0x40)) + paradise->check = 1; svga->render = svga_render_8bpp_highres; + } } else { if (svga->bpp >= 8 && !svga->lowres) { if (svga->bpp == 16) { From a34ebbc44ce38b49eddd9fc745e5cfa5ed99bd7f Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 5 Nov 2021 20:45:34 -0300 Subject: [PATCH 007/159] Reintroduce TGUI DDC --- src/video/vid_tgui9440.c | 42 +++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index b961fbf78..6c4faf170 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -479,6 +479,10 @@ tgui_out(uint16_t addr, uint8_t val, void *p) tgui_recalcmapping(tgui); break; + case 0x37: + i2c_gpio_set(tgui->i2c, (val & 0x02) || !(val & 0x04), (val & 0x01) || !(val & 0x08)); + break; + case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: if (tgui->type >= TGUI_9440) { @@ -577,7 +581,7 @@ tgui_in(uint16_t addr, void *p) return svga->seqregs[0x0e]; } break; - + case 0x3C6: if (tgui->type == TGUI_9400CXI) return tkd8001_ramdac_in(addr, svga->ramdac, svga); @@ -585,13 +589,13 @@ tgui_in(uint16_t addr, void *p) return tgui->ramdac_ctrl; tgui->ramdac_state++; break; - + case 0x3C7: case 0x3C8: case 0x3C9: if (tgui->type == TGUI_9400CXI) return tkd8001_ramdac_in(addr, svga->ramdac, svga); tgui->ramdac_state = 0; break; - + case 0x3CF: if (tgui->type == TGUI_9400CXI && svga->gdcaddr >= 16 && svga->gdcaddr < 32) return tgui->ext_gdc_regs[svga->gdcaddr & 15]; @@ -601,7 +605,17 @@ tgui_in(uint16_t addr, void *p) case 0x3D4: return svga->crtcreg; case 0x3D5: - temp = svga->crtc[svga->crtcreg]; + temp = svga->crtc[svga->crtcreg]; + if (!(svga->crtc[0x37] & 0x04)) { + temp &= 0xfd; + if (i2c_gpio_get_scl(tgui->i2c)) + temp |= 0x02; + } + if (!(svga->crtc[0x37] & 0x08)) { + temp &= 0xfe; + if (i2c_gpio_get_sda(tgui->i2c)) + temp |= 0x01; + } return temp; case 0x3d8: return tgui->tgui_3d8; @@ -2991,16 +3005,19 @@ static void *tgui_init(const device_t *info) tgui_set_io(tgui); if (tgui->pci && (tgui->type >= TGUI_9440)) - tgui->card = pci_add_card(PCI_ADD_VIDEO, tgui_pci_read, tgui_pci_write, tgui); + tgui->card = pci_add_card(PCI_ADD_VIDEO, tgui_pci_read, tgui_pci_write, tgui); - tgui->pci_regs[PCI_REG_COMMAND] = 7; + tgui->pci_regs[PCI_REG_COMMAND] = 7; - tgui->pci_regs[0x30] = 0x00; - tgui->pci_regs[0x32] = 0x0c; - tgui->pci_regs[0x33] = 0x00; + tgui->pci_regs[0x30] = 0x00; + tgui->pci_regs[0x32] = 0x0c; + tgui->pci_regs[0x33] = 0x00; - if (tgui->type >= TGUI_9440) - svga->packed_chain4 = 1; + tgui->i2c = i2c_gpio_init("ddc_tgui9440"); + tgui->ddc = ddc_init(i2c_gpio_get_bus(tgui->i2c)); + + if (tgui->type >= TGUI_9440) + svga->packed_chain4 = 1; return tgui; } @@ -3026,6 +3043,9 @@ void tgui_close(void *p) svga_close(&tgui->svga); + ddc_close(tgui->ddc); + i2c_gpio_close(tgui->i2c); + free(tgui); } From f48c3a299e3978f92b6a177f6191124c3ee8849b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 5 Nov 2021 20:48:56 -0300 Subject: [PATCH 008/159] Add CMake artifacts to gitignore --- .gitignore | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ac3c080a8..6de49d74e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ src/*.o src/*.exe src/*.res -src/*.d src/*.cfg src/*.log src/*.dll @@ -10,6 +9,14 @@ src/NUL src/nvr/ src/roms/ /.vs -/CMakeUserPresets.json /build /.vscode +/CMakeUserPresets.json +/CMakeCache.txt +CMakeFiles +*.cmake +*.obj +*.d +*.a +src/include/86box/version.h +Makefile From 06ab671d326dc4e99b5bc72180e5edc743909d12 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 5 Nov 2021 21:49:00 -0300 Subject: [PATCH 009/159] Allow inserting of build number and git hash through CMake, while also porting the mouse capture title fix from the CLI branch --- CMakeLists.txt | 2 +- src/86box.c | 12 ++++++++---- src/win/win.c | 2 +- src/win/win_about.c | 14 ++++++++++---- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10f14a967..9565d55b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") project(86Box VERSION 3.0 DESCRIPTION "Emulator of x86-based systems" - HOMEPAGE_URL "https://86box.github.io/" + HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) # Detect the target architecture by trying to compile `src/arch_detect.c` diff --git a/src/86box.c b/src/86box.c index eca8544a5..e93f8bbe3 100644 --- a/src/86box.c +++ b/src/86box.c @@ -196,7 +196,7 @@ int unscaled_size_y = SCREEN_RES_Y; /* current unscaled size Y */ int efscrnsz_y = SCREEN_RES_Y; -static wchar_t mouse_msg[2][200]; +static wchar_t mouse_msg[3][200]; #ifndef RELEASE_BUILD @@ -1010,11 +1010,13 @@ pc_reset_hard_init(void) *(wcp - 1) = L'\0'; mbstowcs(wcpu, cpu_s->name, strlen(cpu_s->name)+1); swprintf(mouse_msg[0], sizeof_w(mouse_msg[0]), L"%ls v%ls - %%i%%%% - %ls - %ls/%ls - %ls", - EMU_NAME_W, EMU_VERSION_W, wmachine, wcpufamily, wcpu, + EMU_NAME_W, EMU_VERSION_FULL_W, wmachine, wcpufamily, wcpu, plat_get_string(IDS_2077)); swprintf(mouse_msg[1], sizeof_w(mouse_msg[1]), L"%ls v%ls - %%i%%%% - %ls - %ls/%ls - %ls", - EMU_NAME_W, EMU_VERSION_W, wmachine, wcpufamily, wcpu, + EMU_NAME_W, EMU_VERSION_FULL_W, wmachine, wcpufamily, wcpu, (mouse_get_buttons() > 2) ? plat_get_string(IDS_2078) : plat_get_string(IDS_2079)); + swprintf(mouse_msg[2], sizeof_w(mouse_msg[2]), L"%ls v%ls - %%i%%%% - %ls - %ls/%ls", + EMU_NAME_W, EMU_VERSION_FULL_W, wmachine, wcpufamily, wcpu); } @@ -1101,6 +1103,7 @@ static void _ui_window_title(void *s) void pc_run(void) { + int mouse_msg_idx; wchar_t temp[200]; /* Trigger a hard reset if one is pending. */ @@ -1125,7 +1128,8 @@ pc_run(void) } if (title_update) { - swprintf(temp, sizeof_w(temp), mouse_msg[!!mouse_capture], fps); + mouse_msg_idx = (mouse_type == MOUSE_TYPE_NONE) ? 2 : !!mouse_capture; + swprintf(temp, sizeof_w(temp), mouse_msg[mouse_msg_idx], fps); #ifdef __APPLE__ /* Needed due to modifying the UI on the non-main thread is a big no-no. */ dispatch_async_f(dispatch_get_main_queue(), wcsdup((const wchar_t *) temp), _ui_window_title); diff --git a/src/win/win.c b/src/win/win.c index 6e397b98f..133a7c1db 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -434,7 +434,7 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) hinstance = hInst; /* Set the application version ID string. */ - sprintf(emu_version, "%s v%s", EMU_NAME, EMU_VERSION); + sprintf(emu_version, "%s v%s", EMU_NAME, EMU_VERSION_FULL); /* First, set our (default) language. */ set_language(0x0409); diff --git a/src/win/win_about.c b/src/win/win_about.c index 7ca81cd2c..b84711a62 100644 --- a/src/win/win_about.c +++ b/src/win/win_about.c @@ -39,17 +39,23 @@ AboutDialogCreate(HWND hwnd) int i; TASKDIALOGCONFIG tdconfig = {0}; TASKDIALOG_BUTTON tdbuttons[] = { - {IDOK, EMU_SITE}, - {IDCANCEL, MAKEINTRESOURCE(IDS_2127)} + {IDOK, EMU_SITE}, + {IDCANCEL, MAKEINTRESOURCE(IDS_2127)} }; + wchar_t emu_version[256]; + i = swprintf(emu_version, sizeof(emu_version), L"%ls v%ls", EMU_NAME_W, EMU_VERSION_FULL_W); +#ifdef EMU_GIT_HASH + swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); +#endif + tdconfig.cbSize = sizeof(tdconfig); tdconfig.hwndParent = hwnd; tdconfig.hInstance = hinstance; tdconfig.dwCommonButtons = 0; tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_2124); tdconfig.pszMainIcon = (PCWSTR) 10; - tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2125); + tdconfig.pszMainInstruction = emu_version; tdconfig.pszContent = MAKEINTRESOURCE(IDS_2126); tdconfig.cButtons = ARRAYSIZE(tdbuttons); tdconfig.pButtons = tdbuttons; @@ -57,5 +63,5 @@ AboutDialogCreate(HWND hwnd) TaskDialogIndirect(&tdconfig, &i, NULL, NULL); if (i == IDOK) - ShellExecute(hwnd, L"open", L"https://" EMU_SITE, NULL, NULL, SW_SHOW); + ShellExecute(hwnd, L"open", L"https://" EMU_SITE, NULL, NULL, SW_SHOW); } From 9699d63e7034b6b7d95bb4ca0a8633ca24d1367e Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 5 Nov 2021 22:02:34 -0300 Subject: [PATCH 010/159] Add icon type switch to CMake and de-duplicate wide version strings --- CMakeLists.txt | 9 +++++++++ src/86box.c | 2 +- src/include/86box/version.h.in | 28 +++++++++++++++++++++++----- src/win/win_sdl.c | 2 +- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9565d55b5..89e661fcb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,15 @@ CMAKE_DEPENDENT_OPTION(VNC "VNC renderer" ON "DEV_BRANCH" OFF) CMAKE_DEPENDENT_OPTION(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) CMAKE_DEPENDENT_OPTION(VECT486VL "HP Vectra 486VL" ON "DEV_BRANCH" OFF) +string(TOLOWER "${BUILD_TYPE}" BUILD_TYPE_LOWER) +if(BUILD_TYPE_LOWER STREQUAL "release") + add_compile_definitions(RELEASE_BUILD) +elseif(BUILD_TYPE_LOWER STREQUAL "beta") + add_compile_definitions(BETA_BUILD) +elseif(BUILD_TYPE_LOWER STREQUAL "alpha") + add_compile_definitions(ALPHA_BUILD) +endif() + # HACK: Avoid a MSVC2019 compiler bug on ARM64 Debug builds if(MSVC_TOOLSET_VERSION GREATER_EQUAL 142 AND ARCH STREQUAL "arm64") # Define a cache option in case somebody wants to disable this workaround diff --git a/src/86box.c b/src/86box.c index e93f8bbe3..a9f78dc53 100644 --- a/src/86box.c +++ b/src/86box.c @@ -665,7 +665,7 @@ usage: info = localtime(&now); strftime(temp, sizeof(temp), "%Y/%m/%d %H:%M:%S", info); pclog("#\n# %ls v%ls logfile, created %s\n#\n", - EMU_NAME_W, EMU_VERSION_W, temp); + EMU_NAME_W, EMU_VERSION_FULL_W, temp); pclog("# VM: %s\n#\n", vm_name); pclog("# Emulator path: %s\n", exe_path); pclog("# Userfiles path: %s\n", usr_path); diff --git a/src/include/86box/version.h.in b/src/include/86box/version.h.in index 67832258d..ec7a4fdb7 100644 --- a/src/include/86box/version.h.in +++ b/src/include/86box/version.h.in @@ -13,19 +13,37 @@ * Copyright 2020 Miran Grca. */ +#define _LSTR(s) L ## s +#define LSTR(s) _LSTR(s) + /* Version info. */ #define EMU_NAME "@CMAKE_PROJECT_NAME@" -#define EMU_NAME_W L"@CMAKE_PROJECT_NAME@" +#define EMU_NAME_W LSTR(EMU_NAME) #define EMU_VERSION "@CMAKE_PROJECT_VERSION@" -#define EMU_VERSION_W L"@CMAKE_PROJECT_VERSION@" -#define EMU_VERSION_EX "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@0" +#define EMU_VERSION_W LSTR(EMU_VERSION) +#define EMU_VERSION_EX "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@@CMAKE_PROJECT_VERSION_PATCH@" #define EMU_VERSION_MAJ @CMAKE_PROJECT_VERSION_MAJOR@ #define EMU_VERSION_MIN @CMAKE_PROJECT_VERSION_MINOR@ -#define COPYRIGHT_YEAR "2020" +#cmakedefine EMU_BUILD "@EMU_BUILD@" +#cmakedefine EMU_GIT_HASH "@EMU_GIT_HASH@" + +#ifdef EMU_BUILD +# define EMU_BUILD_W LSTR(EMU_BUILD) +# define EMU_VERSION_FULL EMU_VERSION " [" EMU_BUILD "]" +# define EMU_VERSION_FULL_W EMU_VERSION_W L" [" EMU_BUILD_W L"]" +#else +# define EMU_VERSION_FULL EMU_VERSION +# define EMU_VERSION_FULL_W EMU_VERSION_W +#endif +#ifdef EMU_GIT_HASH +# define EMU_GIT_HASH_W LSTR(EMU_GIT_HASH) +#endif + +#define COPYRIGHT_YEAR "2021" /* Web URL info. */ -#define EMU_SITE L"@CMAKE_PROJECT_HOMEPAGE_URL@" +#define EMU_SITE L"86box.net" #define EMU_ROMS_URL L"https://github.com/86Box/roms/releases/latest" #define EMU_DOCS_URL L"https://86box.readthedocs.io" diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index e8bdd6e0d..af876540d 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -459,7 +459,7 @@ sdl_init_common(int flags) sdl_h = GetSystemMetrics(SM_CYSCREEN); /* Create the desktop-covering window. */ - _swprintf(temp, L"%s v%s", EMU_NAME_W, EMU_VERSION_W); + _swprintf(temp, L"%s v%s", EMU_NAME_W, EMU_VERSION_FULL_W); sdl_parent_hwnd = CreateWindow(SDL_CLASS_NAME, temp, WS_POPUP, 0, 0, sdl_w, sdl_h, HWND_DESKTOP, NULL, hinstance, NULL); ShowWindow(sdl_parent_hwnd, FALSE); From b4ac1042dd75c94d13018eb72d757428eba59050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Sun, 7 Nov 2021 13:49:25 +0100 Subject: [PATCH 011/159] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 92fc718dd..3dcf0f3a6 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ We operate an IRC channel and a Discord server for discussing 86Box, its develop Licensing --------- -86Box is released under the [GNU General Public License, version 2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) only. For more information, see the `COPYING` file in the root of the repository. +86Box is released under the [GNU General Public License, version 2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later. For more information, see the `COPYING` file in the root of the repository. The emulator can also optionally make use of [munt](https://github.com/munt/munt), [FluidSynth](https://www.fluidsynth.org/), [Ghostscript](https://www.ghostscript.com/) and [Discord Game SDK](https://discord.com/developers/docs/game-sdk/sdk-starter-guide), which are distributed under their respective licenses. From 452e2348dabd640a915fba6ed335b13006e9fabf Mon Sep 17 00:00:00 2001 From: dob205 Date: Sun, 7 Nov 2021 18:00:18 +0100 Subject: [PATCH 012/159] Removes timespec_get() from Unix systems This change removes timespec_get() from Unix systems and makes it also possible to cross-compile binaries on macOS Big Sur or macOS Monterrey that target macOS Mojave at minimum since Mojave lacks support for timespec_get(). --- src/unix/unix_thread.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/unix/unix_thread.c b/src/unix/unix_thread.c index d95c337d1..f045d2820 100644 --- a/src/unix/unix_thread.c +++ b/src/unix/unix_thread.c @@ -101,11 +101,7 @@ thread_wait_event(event_t *handle, int timeout) event_pthread_t *event = (event_pthread_t *)handle; struct timespec abstime; -#ifdef HAS_TIMESPEC_GET - timespec_get(&abstime, TIME_UTC); -#else clock_gettime(CLOCK_REALTIME, &abstime); -#endif abstime.tv_nsec += (timeout % 1000) * 1000000; abstime.tv_sec += (timeout / 1000); if (abstime.tv_nsec > 1000000000) { From 82973668576ca0dfb4647e3528b797d5ca24608d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Sun, 7 Nov 2021 18:29:49 +0100 Subject: [PATCH 013/159] Changed Discord rich presence ID. --- src/win/win_discord.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_discord.c b/src/win/win_discord.c index 61b300341..066c927d3 100644 --- a/src/win/win_discord.c +++ b/src/win/win_discord.c @@ -147,7 +147,7 @@ discord_init() return; DiscordCreateParamsSetDefault(¶ms); - params.client_id = 651478134352248832; + params.client_id = 906956844956782613; params.flags = DiscordCreateFlags_NoRequireDiscord; result = discord_create(DISCORD_VERSION, ¶ms, &discord_core); From 56e93959b4cbff21575763724774dc7fd58d0ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sun, 7 Nov 2021 21:32:06 +0100 Subject: [PATCH 014/159] Initial commit for multilingual UI, and Hungarian translation --- src/win/86Box.rc | 981 +------------------------------------ src/win/languages/en-US.rc | 975 ++++++++++++++++++++++++++++++++++++ src/win/languages/hu-HU.rc | 978 ++++++++++++++++++++++++++++++++++++ 3 files changed, 1959 insertions(+), 975 deletions(-) create mode 100644 src/win/languages/en-US.rc create mode 100644 src/win/languages/hu-HU.rc diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 05990324f..cb2d306a5 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -14,6 +14,7 @@ * * Copyright 2016-2019 Miran Grca. * Copyright 2018,2019 David Hrdlička. + * Copyright 2021 Laci bá' */ #define IN_RESOURCE_H #include <86box/resource.h> @@ -27,271 +28,7 @@ #undef APSTUDIO_HIDDEN_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(65001) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -MainMenu MENU DISCARDABLE -BEGIN - POPUP "&Action" - BEGIN - MENUITEM "&Keyboard requires capture", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&Right CTRL is left ALT", IDM_ACTION_RCTRL_IS_LALT - MENUITEM SEPARATOR - MENUITEM "&Hard Reset", IDM_ACTION_HRESET - MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD - MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC - MENUITEM SEPARATOR - MENUITEM "&Pause", IDM_ACTION_PAUSE - MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_ACTION_EXIT - END - POPUP "&View" - BEGIN - MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR - MENUITEM SEPARATOR - MENUITEM "&Resizeable window", IDM_VID_RESIZE - MENUITEM "R&emember size && position", IDM_VID_REMEMBER - MENUITEM SEPARATOR - POPUP "Re&nderer" - BEGIN - MENUITEM "&SDL (Software)", IDM_VID_SDL_SW - MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW - MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL -#if defined(DEV_BRANCH) && defined(USE_OPENGL) - MENUITEM "Open&GL (3.3 Core)", IDM_VID_OPENGL_CORE -#endif -#ifdef USE_VNC - MENUITEM "&VNC", IDM_VID_VNC -#endif - END - MENUITEM SEPARATOR - MENUITEM "Specify dimensions", IDM_VID_SPECIFY_DIM - MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 - POPUP "&Window scale factor" - BEGIN - MENUITEM "&0.5x", IDM_VID_SCALE_1X - MENUITEM "&1x", IDM_VID_SCALE_2X - MENUITEM "1.&5x", IDM_VID_SCALE_3X - MENUITEM "&2x", IDM_VID_SCALE_4X - END - POPUP "Filter method" - BEGIN - MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST - MENUITEM "&Linear", IDM_VID_FILTER_LINEAR - END - MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI - MENUITEM SEPARATOR - MENUITEM "&Fullscreen\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN - POPUP "Fullscreen &stretch mode" - BEGIN - MENUITEM "&Full screen stretch", IDM_VID_FS_FULL - MENUITEM "&4:3", IDM_VID_FS_43 - MENUITEM "&Square pixels (Keep ratio)", IDM_VID_FS_KEEPRATIO - MENUITEM "&Integer scale", IDM_VID_FS_INT - END - POPUP "E&GA/(S)VGA settings" - BEGIN - MENUITEM "&Inverted VGA monitor", IDM_VID_INVERT - POPUP "VGA screen &type" - BEGIN - MENUITEM "RGB &Color", IDM_VID_GRAY_RGB - MENUITEM "&RGB Grayscale", IDM_VID_GRAY_MONO - MENUITEM "&Amber monitor", IDM_VID_GRAY_AMBER - MENUITEM "&Green monitor", IDM_VID_GRAY_GREEN - MENUITEM "&White monitor", IDM_VID_GRAY_WHITE - END - POPUP "Grayscale &conversion type" - BEGIN - MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 - MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 - MENUITEM "&Average", IDM_VID_GRAYCT_AVE - END - END - MENUITEM SEPARATOR - MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN - MENUITEM "Change contrast for &monochrome display", IDM_VID_CGACON - END - MENUITEM "&Media", IDM_MEDIA - POPUP "&Tools" - BEGIN - MENUITEM "&Settings...", IDM_CONFIG - MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS -# ifdef USE_DISCORD - MENUITEM SEPARATOR - MENUITEM "Enable &Discord integration", IDM_DISCORD -# endif - MENUITEM SEPARATOR - MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT - MENUITEM SEPARATOR - MENUITEM "Sound &gain...", IDM_SND_GAIN -#ifdef MTR_ENABLED - MENUITEM SEPARATOR - MENUITEM "Begin trace\tCtrl+T", IDM_ACTION_BEGIN_TRACE - MENUITEM "End trace\tCtrl+T", IDM_ACTION_END_TRACE -#endif - END -#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) - POPUP "&Logging" - BEGIN -# ifdef ENABLE_BUSLOGIC_LOG - MENUITEM "Enable BusLogic logs\tCtrl+F4", IDM_LOG_BUSLOGIC -# endif -# ifdef ENABLE_CDROM_LOG - MENUITEM "Enable CD-ROM logs\tCtrl+F5", IDM_LOG_CDROM -# endif -# ifdef ENABLE_D86F_LOG - MENUITEM "Enable floppy (86F) logs\tCtrl+F6", IDM_LOG_D86F -# endif -# ifdef ENABLE_FDC_LOG - MENUITEM "Enable floppy controller logs\tCtrl+F7", IDM_LOG_FDC -# endif -# ifdef ENABLE_IDE_LOG - MENUITEM "Enable IDE logs\tCtrl+F8", IDM_LOG_IDE -# endif -# ifdef ENABLE_SERIAL_LOG - MENUITEM "Enable Serial Port logs\tCtrl+F3", IDM_LOG_SERIAL -# endif -# ifdef ENABLE_NIC_LOG - MENUITEM "Enable Network logs\tCtrl+F9", IDM_LOG_NIC -# endif -# ifdef ENABLE_LOG_COMMANDS -# ifdef ENABLE_LOG_TOGGLES - MENUITEM SEPARATOR -# endif -# ifdef ENABLE_LOG_BREAKPOINT - MENUITEM "&Log breakpoint\tCtrl+F10", IDM_LOG_BREAKPOINT -# endif -# ifdef ENABLE_VRAM_DUMP - MENUITEM "Dump &video RAM\tCtrl+F1", IDM_DUMP_VRAM -# endif -# endif - END -#endif - POPUP "&Help" - BEGIN - MENUITEM "&Documentation...", IDM_DOCS - MENUITEM "&About 86Box...", IDM_ABOUT - END -END - -StatusBarMenu MENU DISCARDABLE -BEGIN - MENUITEM SEPARATOR -END - -CassetteSubmenu MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&New image...", IDM_CASSETTE_IMAGE_NEW - MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_CASSETTE_IMAGE_EXISTING_WP - MENUITEM SEPARATOR - MENUITEM "&Record", IDM_CASSETTE_RECORD - MENUITEM "&Play", IDM_CASSETTE_PLAY - MENUITEM "&Rewind to the beginning", IDM_CASSETTE_REWIND - MENUITEM "&Fast forward to the end", IDM_CASSETTE_FAST_FORWARD - MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_CASSETTE_EJECT - END -END - -CartridgeSubmenu MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE - MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_CARTRIDGE_EJECT - END -END - -FloppySubmenu MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&New image...", IDM_FLOPPY_IMAGE_NEW - MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_FLOPPY_IMAGE_EXISTING_WP - MENUITEM SEPARATOR - MENUITEM "E&xport to 86F...", IDM_FLOPPY_EXPORT_TO_86F - MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_FLOPPY_EJECT - END -END - -CdromSubmenu MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&Mute", IDM_CDROM_MUTE - MENUITEM SEPARATOR - MENUITEM "E&mpty", IDM_CDROM_EMPTY - MENUITEM "&Reload previous image", IDM_CDROM_RELOAD - MENUITEM SEPARATOR - MENUITEM "&Image", IDM_CDROM_IMAGE - END -END - -ZIPSubmenu MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&New image...", IDM_ZIP_IMAGE_NEW - MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_ZIP_IMAGE_EXISTING_WP - MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_ZIP_EJECT - MENUITEM "&Reload previous image", IDM_ZIP_RELOAD - END -END - -MOSubmenu MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&New image...", IDM_MO_IMAGE_NEW - MENUITEM SEPARATOR - MENUITEM "&Existing image...", IDM_MO_IMAGE_EXISTING - MENUITEM "Existing image (&Write-protected)...", IDM_MO_IMAGE_EXISTING_WP - MENUITEM SEPARATOR - MENUITEM "E&ject", IDM_MO_EJECT - MENUITEM "&Reload previous image", IDM_MO_RELOAD - END -END - -#if defined(DEV_BRANCH) && defined(USE_OPENGL) -VidGLSubMenu MENU DISCARDABLE -BEGIN - POPUP "Target &framerate" - BEGIN - MENUITEM "&Sync with video", IDM_VID_GL_FPS_BLITTER - MENUITEM "&25 fps", IDM_VID_GL_FPS_25 - MENUITEM "&30 fps", IDM_VID_GL_FPS_30 - MENUITEM "&50 fps", IDM_VID_GL_FPS_50 - MENUITEM "&60 fps", IDM_VID_GL_FPS_60 - MENUITEM "&75 fps", IDM_VID_GL_FPS_75 - END - MENUITEM "&VSync", IDM_VID_GL_VSYNC - MENUITEM "&Select shader...", IDM_VID_GL_SHADER - MENUITEM "&Remove shader", IDM_VID_GL_NOSHADER -END -#endif ///////////////////////////////////////////////////////////////////////////// // @@ -337,472 +74,6 @@ BEGIN END -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// -DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Status" -FONT 9, "Segoe UI" -BEGIN - LTEXT "1",IDT_SDEVICE,16,16,180,1000 - LTEXT "1",IDT_STEXT,16,186,180,1000 -END - -DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Sound Gain" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,57,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,57,24,50,14 - CONTROL "Gain",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 - CTEXT "Gain",IDT_1746,10,7,32,9,SS_CENTERIMAGE -END - -DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "New Image" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,104,65,50,14 - PUSHBUTTON "Cancel",IDCANCEL,162,65,50,14 - LTEXT "File name:",IDT_1749,7,6,44,12,SS_CENTERIMAGE - LTEXT "Disk size:",IDT_1750,7,25,44,12,SS_CENTERIMAGE - LTEXT "RPM mode:",IDT_1751,7,45,44,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY - COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...",IDC_CFILE,206,5,13,14 - LTEXT "Progress:",IDT_1757,7,45,44,12,SS_CENTERIMAGE - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,53,45,166,14 -END - -DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "86Box Settings" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,246,235,50,14 - PUSHBUTTON "Cancel",IDCANCEL,307,235,50,14 - CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 - CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -/* Leave this commented out until we get into localization. */ -#if 0 - LTEXT "Language:",IDT_1700,7,237,41,10 - COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWN | WS_VSCROLL | - WS_TABSTOP -#endif -END - -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Specify Main Window Dimensions" -FONT 9, "Segoe UI" -BEGIN - LTEXT "Width:",IDT_1709,7,9,24,12 - EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, - 12,12 - LTEXT "Height:",IDT_1710,97,9,24,12 - EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, - 12,12 - CONTROL "Lock to this size",IDC_CHECK_LOCK_SIZE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 - DEFPUSHBUTTON "OK",IDOK,30,45,50,14 - PUSHBUTTON "Cancel",IDCANCEL,99,45,50,14 -END - -DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Machine type:",IDT_1708,7,9,60,10 - COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Machine:",IDT_1701,7,28,60,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MACHINE,214,26,46,12 - COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "CPU type:",IDT_1702,7,47,59,10 - COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Speed:",IDT_1704,189,47,24,10 - COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "FPU:",IDT_1707,7,66,59,10 - COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Wait states:",IDT_1703,7,85,60,10 - EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, - 12,12 - LTEXT "MB",IDT_1705,123,104,10,10 - LTEXT "Memory:",IDT_1706,7,104,30,10 - GROUPBOX "Time synchronization",IDC_TIME_SYNC,7,135,100,56 - CONTROL "Disabled",IDC_RADIO_TS_DISABLED,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 - CONTROL "Enabled (local time)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 - CONTROL "Enabled (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 -#ifdef USE_DYNAREC - CONTROL "Dynamic Recompiler",IDC_CHECK_DYNAREC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 -#endif -END - -DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Video:",IDT_1707,7,9,48,10 - COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_VID,222,7,38,12 - CONTROL "Voodoo Graphics",IDC_CHECK_VOODOO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 - PUSHBUTTON "Configure",IDC_BUTTON_VOODOO,222,26,38,12 -END - -DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Mouse:",IDT_1709,7,9,57,10 - COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_MOUSE,214,7,46,12 - LTEXT "Joystick:",IDT_1710,7,27,58,10 - COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 - PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 - PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 - PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 -END - -DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Sound card:",IDT_1711,7,9,59,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_SND,214,7,46,12 - - COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI Out Device:",IDT_1712,7,28,59,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MIDI,214,26,46,12 - - COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI In Device:",IDT_1713,7,47,59,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MIDI_IN,214,45,46,12 - - CONTROL "Standalone MPU-401",IDC_CHECK_MPU401,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MPU401,214,64,46,12 - - CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_SSI,214,82,46,12 - - CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_CMS,214,100,46,12 - - CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_GUS,214,118,46,12 - - CONTROL "Use FLOAT32 sound",IDC_CHECK_FLOAT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 -END - -DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Network type:",IDT_1714,7,9,59,10 - COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - - LTEXT "PCap device:",IDT_1715,7,28,59,10 - COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - - LTEXT "Network adapter:",IDT_1716,7,47,59,10 - COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_NET,214,44,46,12 -END - -DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "LPT1 Device:",IDT_1717,7,9,61,10 - COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT2 Device:",IDT_1718,7,28,61,10 - COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT3 Device:",IDT_1719,7,47,61,10 - COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - CONTROL "Serial port 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 - CONTROL "Serial port 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 - CONTROL "Serial port 3",IDC_CHECK_SERIAL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 - CONTROL "Serial port 4",IDC_CHECK_SERIAL4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 - - CONTROL "Parallel port 1",IDC_CHECK_PARALLEL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 - CONTROL "Parallel port 2",IDC_CHECK_PARALLEL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 - CONTROL "Parallel port 3",IDC_CHECK_PARALLEL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 -END - -DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "HD Controller:",IDT_1718,7,9,64,10 - COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_HDC,222,7,38,12 - - LTEXT "FD Controller:",IDT_1768,7,28,64,10 - COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_FDC,222,26,38,12 - - CONTROL "Tertiary IDE Controller",IDC_CHECK_IDE_TER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 - PUSHBUTTON "Configure",IDC_BUTTON_IDE_TER,222,45,38,12 - - CONTROL "Quaternary IDE Controller",IDC_CHECK_IDE_QUA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configure",IDC_BUTTON_IDE_QUA,222,64,38,12 - - GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 - LTEXT "Controller 1:",IDT_1763,16,102,48,10 - COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_1,213,100,38,12 - LTEXT "Controller 2:",IDT_1764,16,121,48,10 - COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_2,213,119,38,12 - LTEXT "Controller 3:",IDT_1765,16,140,48,10 - COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_3,213,138,38,12 - LTEXT "Controller 4:",IDT_1766,16,159,48,10 - COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_4,213,157,38,12 - - CONTROL "Cassette",IDC_CHECK_CASSETTE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 -END - -DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,92 - LTEXT "Hard disks:",IDT_1720,7,7,253,8 - PUSHBUTTON "&New...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 - PUSHBUTTON "&Existing...",IDC_BUTTON_HDD_ADD,129,137,62,10 - PUSHBUTTON "&Remove",IDC_BUTTON_HDD_REMOVE,198,137,62,10 - COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,119,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1722,131,119,38,8 - COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,131,119,38,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP -END - -DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add Hard Disk" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,55,127,50,14 - PUSHBUTTON "Cancel",IDCANCEL,112,127,50,14 - EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 - PUSHBUTTON "&Specify...",IDC_CFILE,167,16,44,12 - EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 - EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 - EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 - EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 - COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Sectors:",IDT_1726,154,35,27,10 - LTEXT "Heads:",IDT_1727,81,35,29,8 - LTEXT "Cylinders:",IDT_1728,7,35,32,12 - LTEXT "Size (MB):",IDT_1729,7,54,33,8 - LTEXT "Type:",IDT_1730,86,54,24,8 - LTEXT "File name:",IDT_1731,7,7,204,9 - COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,73,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1722,99,73,34,8 - COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,99,73,34,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Image Format:",IDT_1774,7,92,50,12 - COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Block Size:",IDT_1775,7,111,50,12 - COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Progress:",IDT_1752,7,7,204,9 - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,7,16,204,12 -END - -DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", - LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,60 - LTEXT "Floppy drives:",IDT_1737,7,7,253,8 - COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Type:",IDT_1738,7,87,24,8 - CONTROL "Turbo timings",IDC_CHECKTURBO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 - CONTROL "Check BPB",IDC_CHECKBPB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 - - CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,117,253,60 - LTEXT "CD-ROM drives:",IDT_1739,7,107,253,8 - COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1740,7,187,24,8 - COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1741,131,187,38,8 - COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1742,131,187,38,8 - COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Speed:",IDT_1758,7,207,24,8 -END - -DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - - CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,17,253,60 - LTEXT "MO drives:",IDT_1769,7,7,253,8 - COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1770,7,87,24,8 - COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1771,131,87,38,8 - COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1772,131,87,38,8 - COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Type:",IDT_1773,7,107,24,8 - - CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,137,253,60 - LTEXT "ZIP drives:",IDT_1759,7,127,253,8 - COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1753,7,207,14,8 - COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1754,120,207,28,8 - COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1755,120,207,28,8 - CONTROL "ZIP 250",IDC_CHECK250,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 -END - -DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "ISA RTC:",IDT_1767,7,9,48,10 - COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISARTC,222,7,38,12 - - GROUPBOX "ISA Memory Expansion",IDC_GROUP_ISAMEM,7,28,253,93 - LTEXT "Card 1:",IDT_1763,16,45,48,10 - COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 - LTEXT "Card 2:",IDT_1764,16,64,48,10 - COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 - LTEXT "Card 3:",IDT_1765,16,83,48,10 - COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 - LTEXT "Card 4:",IDT_1766,16,102,48,10 - COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 - - CONTROL "ISABugger device",IDC_CHECK_BUGGER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 - - CONTROL "POST card",IDC_CHECK_POSTCARD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 -END - - #ifndef NO_INCLUDE_MANIFEST ///////////////////////////////////////////////////////////////////////////// // @@ -1033,249 +304,6 @@ END #endif // APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - 2048 "86Box" - IDS_2049 "Error" - IDS_2050 "Fatal error" - IDS_2051 "" - IDS_2052 "Press CTRL+ALT+PAGE DOWN to return to windowed mode." - IDS_2053 "Speed" - IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the ""roms"" directory." - IDS_2057 "(empty)" - IDS_2058 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" - IDS_2059 "Turbo" - IDS_2060 "On" - IDS_2061 "Off" - IDS_2062 "All images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" - IDS_2063 "Machine ""%hs"" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_2064 "Video card ""%hs"" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." - IDS_2065 "Machine" - IDS_2066 "Display" - IDS_2067 "Input devices" - IDS_2068 "Sound" - IDS_2069 "Network" - IDS_2070 "Ports (COM & LPT)" - IDS_2071 "Storage controllers" - IDS_2072 "Hard disks" - IDS_2073 "Floppy & CD-ROM drives" - IDS_2074 "Other removable devices" - IDS_2075 "Other peripherals" - IDS_2076 "Surface images (*.86F)\0*.86F\0" - IDS_2077 "Click to capture mouse" - IDS_2078 "Press F8+F12 to release mouse" - IDS_2079 "Press F8+F12 or middle button to release mouse" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_2080 "Unable to initialize FluidSynth" - IDS_2081 "Bus" - IDS_2082 "File" - IDS_2083 "C" - IDS_2084 "H" - IDS_2085 "S" - IDS_2086 "MB" - IDS_2087 "Check BPB" - IDS_2088 "KB" - IDS_2089 "Could not initialize the video renderer." - IDS_2090 "Default" - IDS_2091 "%i Wait state(s)" - IDS_2092 "Type" - IDS_2093 "Failed to set up PCap" - IDS_2094 "No PCap devices found" - IDS_2095 "Invalid PCap device" - IDS_2096 "Standard 2-button joystick(s)" - IDS_2097 "Standard 4-button joystick" - IDS_2098 "Standard 6-button joystick" - IDS_2099 "Standard 8-button joystick" - IDS_2100 "CH Flightstick Pro" - IDS_2101 "Microsoft SideWinder Pad" - IDS_2102 "Thrustmaster Flight Control System" - IDS_2103 "None" - IDS_2104 "Unable to load keyboard accelerators." - IDS_2105 "Unable to register raw input." - IDS_2106 "%u" - IDS_2107 "%u MB (CHS: %i, %i, %i)" - IDS_2108 "Floppy %i (%s): %ls" - IDS_2109 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" - IDS_2110 "Unable to initialize FreeType" - IDS_2111 "Unable to initialize SDL, SDL2.dll is required" - IDS_2112 "Are you sure you want to hard reset the emulated machine?" - IDS_2113 "Are you sure you want to exit 86Box?" - IDS_2114 "Unable to initialize Ghostscript" - IDS_2115 "MO %i (%ls): %ls" - IDS_2116 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2117 "Welcome to 86Box!" - IDS_2118 "Internal controller" - IDS_2119 "Exit" - IDS_2120 "No ROMs found" - IDS_2121 "Do you want to save the settings?" - IDS_2122 "This will hard reset the emulated machine." - IDS_2123 "Save" - IDS_2124 "About 86Box" - IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information." - IDS_2127 "OK" - IDS_2128 "Hardware not available" -#ifdef _WIN32 -#define LIB_NAME_PCAP "WinPcap" -#else -#define LIB_NAME_PCAP "libpcap" -#endif - IDS_2129 "Make sure " LIB_NAME_PCAP " is installed and that you are on a " LIB_NAME_PCAP "-compatible network connection." - IDS_2130 "Invalid configuration" -#ifdef _WIN32 -#define LIB_NAME_FREETYPE "freetype.dll" -#else -#define LIB_NAME_FREETYPE "libfreetype" -#endif - IDS_2131 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." -#ifdef _WIN32 -#define LIB_NAME_GS "gsdll32.dll" -#else -#define LIB_NAME_GS "libgs" -#endif - IDS_2132 LIB_NAME_GS " 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." -#ifdef _WIN32 -#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" -#else -#define LIB_NAME_FLUIDSYNTH "libfluidsynth" -#endif - IDS_2133 LIB_NAME_FLUIDSYNTH " is required for FluidSynth MIDI output." - IDS_2134 "Entering fullscreen mode" - IDS_2135 "Don't show this message again" - IDS_2136 "Don't exit" - IDS_2137 "Reset" - IDS_2138 "Don't reset" - IDS_2139 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" - IDS_2140 "CD-ROM images (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" - IDS_2141 "%hs Device Configuration" - IDS_2142 "Monitor in sleep mode" - IDS_2143 "OpenGL Shaders (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" - IDS_2144 "OpenGL options" - IDS_2145 "You are loading an unsupported configuration" - IDS_2146 "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." - IDS_2147 "Continue" - IDS_2148 "Cassette: %s" - IDS_2149 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" - IDS_2150 "Cartridge %i: %ls" - IDS_2151 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" -END - -STRINGTABLE DISCARDABLE -BEGIN - IDS_4096 "Hard disk (%s)" - IDS_4097 "%01i:%01i" - IDS_4098 "%01i" - IDS_4099 "MFM/RLL or ESDI CD-ROM drives never existed" - IDS_4100 "Custom..." - IDS_4101 "Custom (large)..." - IDS_4102 "Add New Hard Disk" - IDS_4103 "Add Existing Hard Disk" - IDS_4104 "HDI disk images cannot be larger than 4 GB." - IDS_4105 "Disk images cannot be larger than 127 GB." - IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" - IDS_4107 "Unable to read file" - IDS_4108 "Unable to write file" - IDS_4109 "HDI or HDX images with a sector size other than 512 are not supported." - IDS_4110 "USB is not yet supported" - IDS_4111 "Disk image file already exists" - IDS_4112 "Please specify a valid file name." - IDS_4113 "Disk image created" - IDS_4114 "Make sure the file exists and is readable." - IDS_4115 "Make sure the file is being saved to a writable directory." - IDS_4116 "Disk image too large" - IDS_4117 "Remember to partition and format the newly-created drive." - IDS_4118 "The selected file will be overwritten. Are you sure you want to use it?" - IDS_4119 "Unsupported disk image" - IDS_4120 "Overwrite" - IDS_4121 "Don't overwrite" - IDS_4122 "Raw image (.img)" - IDS_4123 "HDI image (.hdi)" - IDS_4124 "HDX image (.hdx)" - IDS_4125 "Fixed-size VHD (.vhd)" - IDS_4126 "Dynamic-size VHD (.vhd)" - IDS_4127 "Differencing VHD (.vhd)" - IDS_4128 "Large blocks (2 MB)" - IDS_4129 "Small blocks (512 KB)" - IDS_4130 "VHD files (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" - IDS_4131 "Select the parent VHD" - IDS_4132 "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?" - IDS_4133 "Parent and child disk timestamps do not match" - IDS_4134 "Could not fix VHD timestamp." - IDS_4135 "%01i:%02i" - - IDS_4352 "MFM/RLL" - IDS_4353 "XTA" - IDS_4354 "ESDI" - IDS_4355 "IDE" - IDS_4356 "ATAPI" - IDS_4357 "SCSI" - - IDS_4608 "MFM/RLL (%01i:%01i)" - IDS_4609 "XTA (%01i:%01i)" - IDS_4610 "ESDI (%01i:%01i)" - IDS_4611 "IDE (%01i:%01i)" - IDS_4612 "ATAPI (%01i:%01i)" - IDS_4613 "SCSI (%01i:%02i)" - - IDS_5120 "CD-ROM %i (%s): %s" - - IDS_5376 "Disabled" - IDS_5381 "ATAPI" - IDS_5382 "SCSI" - - IDS_5632 "Disabled" - IDS_5637 "ATAPI (%01i:%01i)" - IDS_5638 "SCSI (%01i:%02i)" - - IDS_5888 "160 kB" - IDS_5889 "180 kB" - IDS_5890 "320 kB" - IDS_5891 "360 kB" - IDS_5892 "640 kB" - IDS_5893 "720 kB" - IDS_5894 "1.2 MB" - IDS_5895 "1.25 MB" - IDS_5896 "1.44 MB" - IDS_5897 "DMF (cluster 1024)" - IDS_5898 "DMF (cluster 2048)" - IDS_5899 "2.88 MB" - IDS_5900 "ZIP 100" - IDS_5901 "ZIP 250" - IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" - IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" - IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" - IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" - IDS_5906 "3.5"" 1.3Gb M.O. (GigaMO)" - IDS_5907 "3.5"" 2.3Gb M.O. (GigaMO 2)" - IDS_5908 "5.25"" 600Mb M.O." - IDS_5909 "5.25"" 650Mb M.O." - IDS_5910 "5.25"" 1Gb M.O." - IDS_5911 "5.25"" 1.3Gb M.O." - - IDS_6144 "Perfect RPM" - IDS_6145 "1%% below perfect RPM" - IDS_6146 "1.5%% below perfect RPM" - IDS_6147 "2%% below perfect RPM" - - IDS_7168 "English (United States)" -END -#define IDS_LANG_ENUS IDS_7168 - - #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // @@ -1317,8 +345,7 @@ END #endif // !_MAC -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// +#endif @@ -1331,3 +358,7 @@ END ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED + + +#include "languages/en-US.rc" +#include "languages/hu-HU.rc" \ No newline at end of file diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc new file mode 100644 index 000000000..8a0b4d9ab --- /dev/null +++ b/src/win/languages/en-US.rc @@ -0,0 +1,975 @@ +//////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(65001) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Action" + BEGIN + MENUITEM "&Keyboard requires capture", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Right CTRL is left ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Hard Reset", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Pause", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "E&xit", IDM_ACTION_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Hide status bar", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Resizeable window", IDM_VID_RESIZE + MENUITEM "R&emember size && position", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "Re&nderer" + BEGIN + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (3.3 Core)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "Specify dimensions", IDM_VID_SPECIFY_DIM + MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 + POPUP "&Window scale factor" + BEGIN + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Filter method" + BEGIN + MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + END + MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Fullscreen\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Fullscreen &stretch mode" + BEGIN + MENUITEM "&Full screen stretch", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Square pixels (Keep ratio)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Integer scale", IDM_VID_FS_INT + END + POPUP "E&GA/(S)VGA settings" + BEGIN + MENUITEM "&Inverted VGA monitor", IDM_VID_INVERT + POPUP "VGA screen &type" + BEGIN + MENUITEM "RGB &Color", IDM_VID_GRAY_RGB + MENUITEM "&RGB Grayscale", IDM_VID_GRAY_MONO + MENUITEM "&Amber monitor", IDM_VID_GRAY_AMBER + MENUITEM "&Green monitor", IDM_VID_GRAY_GREEN + MENUITEM "&White monitor", IDM_VID_GRAY_WHITE + END + POPUP "Grayscale &conversion type" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Average", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN + MENUITEM "Change contrast for &monochrome display", IDM_VID_CGACON + END + MENUITEM "&Media", IDM_MEDIA + POPUP "&Tools" + BEGIN + MENUITEM "&Settings...", IDM_CONFIG + MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "Enable &Discord integration", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "Sound &gain...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Begin trace\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "End trace\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Logging" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "Enable BusLogic logs\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Enable CD-ROM logs\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Enable floppy (86F) logs\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Enable floppy controller logs\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "Enable IDE logs\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Enable Serial Port logs\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Enable Network logs\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Log breakpoint\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "Dump &video RAM\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Help" + BEGIN + MENUITEM "&Documentation...", IDM_DOCS + MENUITEM "&About 86Box...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&New image...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existing image...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Record", IDM_CASSETTE_RECORD + MENUITEM "&Play", IDM_CASSETTE_PLAY + MENUITEM "&Rewind to the beginning", IDM_CASSETTE_REWIND + MENUITEM "&Fast forward to the end", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "E&ject", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Image...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "E&ject", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&New image...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existing image...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&xport to 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "E&ject", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Mute", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "E&mpty", IDM_CDROM_EMPTY + MENUITEM "&Reload previous image", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Image", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&New image...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existing image...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&ject", IDM_ZIP_EJECT + MENUITEM "&Reload previous image", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&New image...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existing image...", IDM_MO_IMAGE_EXISTING + MENUITEM "Existing image (&Write-protected)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&ject", IDM_MO_EJECT + MENUITEM "&Reload previous image", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "Target &framerate" + BEGIN + MENUITEM "&Sync with video", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 fps", IDM_VID_GL_FPS_25 + MENUITEM "&30 fps", IDM_VID_GL_FPS_30 + MENUITEM "&50 fps", IDM_VID_GL_FPS_50 + MENUITEM "&60 fps", IDM_VID_GL_FPS_60 + MENUITEM "&75 fps", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&Select shader...", IDM_VID_GL_SHADER + MENUITEM "&Remove shader", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// +DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Status" +FONT 9, "Segoe UI" +BEGIN + LTEXT "1",IDT_SDEVICE,16,16,180,1000 + LTEXT "1",IDT_STEXT,16,186,180,1000 +END + +DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Sound Gain" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,57,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,57,24,50,14 + CONTROL "Gain",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | + TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 + CTEXT "Gain",IDT_1746,10,7,32,9,SS_CENTERIMAGE +END + +DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "New Image" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,104,65,50,14 + PUSHBUTTON "Cancel",IDCANCEL,162,65,50,14 + LTEXT "File name:",IDT_1749,7,6,44,12,SS_CENTERIMAGE + LTEXT "Disk size:",IDT_1750,7,25,44,12,SS_CENTERIMAGE + LTEXT "RPM mode:",IDT_1751,7,45,44,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY + COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_CFILE,206,5,13,14 + LTEXT "Progress:",IDT_1757,7,45,44,12,SS_CENTERIMAGE + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,53,45,166,14 +END + +DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "86Box Settings" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,246,235,50,14 + PUSHBUTTON "Cancel",IDCANCEL,307,235,50,14 + CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 + CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 +/* Leave this commented out until we get into localization. */ +#if 0 + LTEXT "Language:",IDT_1700,7,237,41,10 + COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP +#endif +END + +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Specify Main Window Dimensions" +FONT 9, "Segoe UI" +BEGIN + LTEXT "Width:",IDT_1709,7,9,24,12 + EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, + 12,12 + LTEXT "Height:",IDT_1710,97,9,24,12 + EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, + 12,12 + CONTROL "Lock to this size",IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + DEFPUSHBUTTON "OK",IDOK,30,45,50,14 + PUSHBUTTON "Cancel",IDCANCEL,99,45,50,14 +END + +DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Machine type:",IDT_1708,7,9,60,10 + COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Machine:",IDT_1701,7,28,60,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_MACHINE,214,26,46,12 + COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "CPU type:",IDT_1702,7,47,59,10 + COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Speed:",IDT_1704,189,47,24,10 + COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "FPU:",IDT_1707,7,66,59,10 + COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Wait states:",IDT_1703,7,85,60,10 + EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, + 12,12 + LTEXT "MB",IDT_1705,123,104,10,10 + LTEXT "Memory:",IDT_1706,7,104,30,10 + GROUPBOX "Time synchronization",IDC_TIME_SYNC,7,135,100,56 + CONTROL "Disabled",IDC_RADIO_TS_DISABLED,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 + CONTROL "Enabled (local time)", IDC_RADIO_TS_LOCAL,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 + CONTROL "Enabled (UTC)", IDC_RADIO_TS_UTC,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 +#ifdef USE_DYNAREC + CONTROL "Dynamic Recompiler",IDC_CHECK_DYNAREC,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 +#endif +END + +DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Video:",IDT_1707,7,9,48,10 + COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_VID,222,7,38,12 + CONTROL "Voodoo Graphics",IDC_CHECK_VOODOO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 + PUSHBUTTON "Configure",IDC_BUTTON_VOODOO,222,26,38,12 +END + +DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Mouse:",IDT_1709,7,9,57,10 + COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_MOUSE,214,7,46,12 + LTEXT "Joystick:",IDT_1710,7,27,58,10 + COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 + PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 + PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 + PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 +END + +DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Sound card:",IDT_1711,7,9,59,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_SND,214,7,46,12 + + COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "MIDI Out Device:",IDT_1712,7,28,59,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_MIDI,214,26,46,12 + + COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "MIDI In Device:",IDT_1713,7,47,59,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_MIDI_IN,214,45,46,12 + + CONTROL "Standalone MPU-401",IDC_CHECK_MPU401,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_MPU401,214,64,46,12 + + CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_SSI,214,82,46,12 + + CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_CMS,214,100,46,12 + + CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_GUS,214,118,46,12 + + CONTROL "Use FLOAT32 sound",IDC_CHECK_FLOAT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 +END + +DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Network type:",IDT_1714,7,9,59,10 + COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "PCap device:",IDT_1715,7,28,59,10 + COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "Network adapter:",IDT_1716,7,47,59,10 + COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_NET,214,44,46,12 +END + +DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "LPT1 Device:",IDT_1717,7,9,61,10 + COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "LPT2 Device:",IDT_1718,7,28,61,10 + COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "LPT3 Device:",IDT_1719,7,47,61,10 + COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + CONTROL "Serial port 1",IDC_CHECK_SERIAL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 + CONTROL "Serial port 2",IDC_CHECK_SERIAL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 + CONTROL "Serial port 3",IDC_CHECK_SERIAL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 + CONTROL "Serial port 4",IDC_CHECK_SERIAL4,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 + + CONTROL "Parallel port 1",IDC_CHECK_PARALLEL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 + CONTROL "Parallel port 2",IDC_CHECK_PARALLEL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 + CONTROL "Parallel port 3",IDC_CHECK_PARALLEL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 +END + +DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "HD Controller:",IDT_1718,7,9,64,10 + COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_HDC,222,7,38,12 + + LTEXT "FD Controller:",IDT_1768,7,28,64,10 + COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_FDC,222,26,38,12 + + CONTROL "Tertiary IDE Controller",IDC_CHECK_IDE_TER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 + PUSHBUTTON "Configure",IDC_BUTTON_IDE_TER,222,45,38,12 + + CONTROL "Quaternary IDE Controller",IDC_CHECK_IDE_QUA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Configure",IDC_BUTTON_IDE_QUA,222,64,38,12 + + GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 + LTEXT "Controller 1:",IDT_1763,16,102,48,10 + COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_1,213,100,38,12 + LTEXT "Controller 2:",IDT_1764,16,121,48,10 + COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_2,213,119,38,12 + LTEXT "Controller 3:",IDT_1765,16,140,48,10 + COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_3,213,138,38,12 + LTEXT "Controller 4:",IDT_1766,16,159,48,10 + COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_4,213,157,38,12 + + CONTROL "Cassette",IDC_CHECK_CASSETTE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 +END + +DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,92 + LTEXT "Hard disks:",IDT_1720,7,7,253,8 + PUSHBUTTON "&New...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 + PUSHBUTTON "&Existing...",IDC_BUTTON_HDD_ADD,129,137,62,10 + PUSHBUTTON "&Remove",IDC_BUTTON_HDD_REMOVE,198,137,62,10 + COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1721,7,119,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Channel:",IDT_1722,131,119,38,8 + COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,131,119,38,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Add Hard Disk" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,55,127,50,14 + PUSHBUTTON "Cancel",IDCANCEL,112,127,50,14 + EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 + PUSHBUTTON "&Specify...",IDC_CFILE,167,16,44,12 + EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 + EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 + EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 + EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 + COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Sectors:",IDT_1726,154,35,27,10 + LTEXT "Heads:",IDT_1727,81,35,29,8 + LTEXT "Cylinders:",IDT_1728,7,35,32,12 + LTEXT "Size (MB):",IDT_1729,7,54,33,8 + LTEXT "Type:",IDT_1730,86,54,24,8 + LTEXT "File name:",IDT_1731,7,7,204,9 + COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1721,7,73,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Channel:",IDT_1722,99,73,34,8 + COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,99,73,34,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Image Format:",IDT_1774,7,92,50,12 + COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Block Size:",IDT_1775,7,111,50,12 + COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Progress:",IDT_1752,7,7,204,9 + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,7,16,204,12 +END + +DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,60 + LTEXT "Floppy drives:",IDT_1737,7,7,253,8 + COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Type:",IDT_1738,7,87,24,8 + CONTROL "Turbo timings",IDC_CHECKTURBO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 + CONTROL "Check BPB",IDC_CHECKBPB,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 + + CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,117,253,60 + LTEXT "CD-ROM drives:",IDT_1739,7,107,253,8 + COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1740,7,187,24,8 + COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1741,131,187,38,8 + COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Channel:",IDT_1742,131,187,38,8 + COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Speed:",IDT_1758,7,207,24,8 +END + +DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + + CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,17,253,60 + LTEXT "MO drives:",IDT_1769,7,7,253,8 + COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1770,7,87,24,8 + COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1771,131,87,38,8 + COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Channel:",IDT_1772,131,87,38,8 + COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Type:",IDT_1773,7,107,24,8 + + CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,137,253,60 + LTEXT "ZIP drives:",IDT_1759,7,127,253,8 + COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1753,7,207,14,8 + COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1754,120,207,28,8 + COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Channel:",IDT_1755,120,207,28,8 + CONTROL "ZIP 250",IDC_CHECK250,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 +END + +DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "ISA RTC:",IDT_1767,7,9,48,10 + COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_ISARTC,222,7,38,12 + + GROUPBOX "ISA Memory Expansion",IDC_GROUP_ISAMEM,7,28,253,93 + LTEXT "Card 1:",IDT_1763,16,45,48,10 + COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 + LTEXT "Card 2:",IDT_1764,16,64,48,10 + COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 + LTEXT "Card 3:",IDT_1765,16,83,48,10 + COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 + LTEXT "Card 4:",IDT_1766,16,102,48,10 + COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 + + CONTROL "ISABugger device",IDC_CHECK_BUGGER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 + + CONTROL "POST card",IDC_CHECK_POSTCARD,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 +END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Error" + IDS_2050 "Fatal error" + IDS_2051 "" + IDS_2052 "Press CTRL+ALT+PAGE DOWN to return to windowed mode." + IDS_2053 "Speed" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the ""roms"" directory." + IDS_2057 "(empty)" + IDS_2058 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "On" + IDS_2061 "Off" + IDS_2062 "All images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basic sector images (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Surface images (*.86F)\0*.86F\0" + IDS_2063 "Machine ""%hs"" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "Video card ""%hs"" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." + IDS_2065 "Machine" + IDS_2066 "Display" + IDS_2067 "Input devices" + IDS_2068 "Sound" + IDS_2069 "Network" + IDS_2070 "Ports (COM & LPT)" + IDS_2071 "Storage controllers" + IDS_2072 "Hard disks" + IDS_2073 "Floppy & CD-ROM drives" + IDS_2074 "Other removable devices" + IDS_2075 "Other peripherals" + IDS_2076 "Surface images (*.86F)\0*.86F\0" + IDS_2077 "Click to capture mouse" + IDS_2078 "Press F8+F12 to release mouse" + IDS_2079 "Press F8+F12 or middle button to release mouse" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Unable to initialize FluidSynth" + IDS_2081 "Bus" + IDS_2082 "File" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "Check BPB" + IDS_2088 "KB" + IDS_2089 "Could not initialize the video renderer." + IDS_2090 "Default" + IDS_2091 "%i Wait state(s)" + IDS_2092 "Type" + IDS_2093 "Failed to set up PCap" + IDS_2094 "No PCap devices found" + IDS_2095 "Invalid PCap device" + IDS_2096 "Standard 2-button joystick(s)" + IDS_2097 "Standard 4-button joystick" + IDS_2098 "Standard 6-button joystick" + IDS_2099 "Standard 8-button joystick" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "None" + IDS_2104 "Unable to load keyboard accelerators." + IDS_2105 "Unable to register raw input." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Floppy %i (%s): %ls" + IDS_2109 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" + IDS_2110 "Unable to initialize FreeType" + IDS_2111 "Unable to initialize SDL, SDL2.dll is required" + IDS_2112 "Are you sure you want to hard reset the emulated machine?" + IDS_2113 "Are you sure you want to exit 86Box?" + IDS_2114 "Unable to initialize Ghostscript" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2117 "Welcome to 86Box!" + IDS_2118 "Internal controller" + IDS_2119 "Exit" + IDS_2120 "No ROMs found" + IDS_2121 "Do you want to save the settings?" + IDS_2122 "This will hard reset the emulated machine." + IDS_2123 "Save" + IDS_2124 "About 86Box" + IDS_2125 "86Box v" EMU_VERSION + IDS_2126 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information." + IDS_2127 "OK" + IDS_2128 "Hardware not available" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Make sure " LIB_NAME_PCAP " is installed and that you are on a " LIB_NAME_PCAP "-compatible network connection." + IDS_2130 "Invalid configuration" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " 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." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " is required for FluidSynth MIDI output." + IDS_2134 "Entering fullscreen mode" + IDS_2135 "Don't show this message again" + IDS_2136 "Don't exit" + IDS_2137 "Reset" + IDS_2138 "Don't reset" + IDS_2139 "MO images (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2140 "CD-ROM images (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" + IDS_2141 "%hs Device Configuration" + IDS_2142 "Monitor in sleep mode" + IDS_2143 "OpenGL Shaders (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" + IDS_2144 "OpenGL options" + IDS_2145 "You are loading an unsupported configuration" + IDS_2146 "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." + IDS_2147 "Continue" + IDS_2148 "Cassette: %s" + IDS_2149 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" + IDS_2150 "Cartridge %i: %ls" + IDS_2151 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Hard disk (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL or ESDI CD-ROM drives never existed" + IDS_4100 "Custom..." + IDS_4101 "Custom (large)..." + IDS_4102 "Add New Hard Disk" + IDS_4103 "Add Existing Hard Disk" + IDS_4104 "HDI disk images cannot be larger than 4 GB." + IDS_4105 "Disk images cannot be larger than 127 GB." + IDS_4106 "Hard disk images (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0All files (*.*)\0*.*\0" + IDS_4107 "Unable to read file" + IDS_4108 "Unable to write file" + IDS_4109 "HDI or HDX images with a sector size other than 512 are not supported." + IDS_4110 "USB is not yet supported" + IDS_4111 "Disk image file already exists" + IDS_4112 "Please specify a valid file name." + IDS_4113 "Disk image created" + IDS_4114 "Make sure the file exists and is readable." + IDS_4115 "Make sure the file is being saved to a writable directory." + IDS_4116 "Disk image too large" + IDS_4117 "Remember to partition and format the newly-created drive." + IDS_4118 "The selected file will be overwritten. Are you sure you want to use it?" + IDS_4119 "Unsupported disk image" + IDS_4120 "Overwrite" + IDS_4121 "Don't overwrite" + IDS_4122 "Raw image (.img)" + IDS_4123 "HDI image (.hdi)" + IDS_4124 "HDX image (.hdx)" + IDS_4125 "Fixed-size VHD (.vhd)" + IDS_4126 "Dynamic-size VHD (.vhd)" + IDS_4127 "Differencing VHD (.vhd)" + IDS_4128 "Large blocks (2 MB)" + IDS_4129 "Small blocks (512 KB)" + IDS_4130 "VHD files (*.VHD)\0*.VHD\0All files (*.*)\0*.*\0" + IDS_4131 "Select the parent VHD" + IDS_4132 "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?" + IDS_4133 "Parent and child disk timestamps do not match" + IDS_4134 "Could not fix VHD timestamp." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Disabled" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Disabled" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3.5"" 1.3Gb M.O. (GigaMO)" + IDS_5907 "3.5"" 2.3Gb M.O. (GigaMO 2)" + IDS_5908 "5.25"" 600Mb M.O." + IDS_5909 "5.25"" 650Mb M.O." + IDS_5910 "5.25"" 1Gb M.O." + IDS_5911 "5.25"" 1.3Gb M.O." + + IDS_6144 "Perfect RPM" + IDS_6145 "1%% below perfect RPM" + IDS_6146 "1.5%% below perfect RPM" + IDS_6147 "2%% below perfect RPM" + + IDS_7168 "English (United States)" +END +#define IDS_LANG_ENUS IDS_7168 + +// English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc new file mode 100644 index 000000000..6dd75e2d1 --- /dev/null +++ b/src/win/languages/hu-HU.rc @@ -0,0 +1,978 @@ +//////////////////////////////////////////////////////////////////////////// +// Hungarian resources +// +// Translated by Laci bá', 2021 +// + +#ifdef _WIN32 +LANGUAGE 0x0E,0x01 +#pragma code_page(65001) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Művelet" + BEGIN + MENUITEM "A &billentyűzet elfogást igényel", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "A &jobb oldali CTRL a bal ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "Hardveres &újraindítás", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Szüneteltetés", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "&Kilépés", IDM_ACTION_EXIT + END + POPUP "&Nézet" + BEGIN + MENUITEM "Állapotsor &elrejtése", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Átméretezhető ablak", IDM_VID_RESIZE + MENUITEM "Méret és pozíció &megjegyzése", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "&Megjelenítő" + BEGIN + MENUITEM "&SDL (Szoftveres)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardveres)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (3.3 Core)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "Méretek kézi megadása", IDM_VID_SPECIFY_DIM + MENUITEM "&Rögzített 4:3 képarány", IDM_VID_FORCE43 + POPUP "&Ablak méretezési tényező" + BEGIN + MENUITEM "&0,5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1,&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Szűrési mód" + BEGIN + MENUITEM "&Szomszédos", IDM_VID_FILTER_NEAREST + MENUITEM "&Lineáris", IDM_VID_FILTER_LINEAR + END + MENUITEM "Hi&DPI méretezés", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Teljes képernyő\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Teljes képernyős &méretezés" + BEGIN + MENUITEM "&Nyújtás a teljes képernyőre", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Négyzetes képpontok (aránytartás)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Egész tényezős nagyítás", IDM_VID_FS_INT + END + POPUP "E&GA/(S)VGA beállítások" + BEGIN + MENUITEM "&Invertált VGA kijelző", IDM_VID_INVERT + POPUP "VGA képernyő &típusa" + BEGIN + MENUITEM "RGB &színes", IDM_VID_GRAY_RGB + MENUITEM "&RGB szürkeárnyalatos", IDM_VID_GRAY_MONO + MENUITEM "&Gyömbér kijelző", IDM_VID_GRAY_AMBER + MENUITEM "&Zöld kijelző", IDM_VID_GRAY_GREEN + MENUITEM "&Fehér kijelző", IDM_VID_GRAY_WHITE + END + POPUP "Szürkéskála &konzerziós eljárás" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Átlag szerint", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA túlpásztázás", IDM_VID_OVERSCAN + MENUITEM "Kontraszt illesztése &monokróm kijelzőhöz", IDM_VID_CGACON + END + MENUITEM "&Média", IDM_MEDIA + POPUP "&Eszközök" + BEGIN + MENUITEM "&Beállítások...", IDM_CONFIG + MENUITEM "Állapotsori ikonok &frissítése", IDM_UPDATE_ICONS +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "&Discord integráció engedélyezése", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "&Képernyőkép készítése\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "&Hangerőszabályzó...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Nyomkövetés megkezdése\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Nyomkövetés befejezése\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Naplózás" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "BusLogic naplók engedélyezése\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "CD-ROM naplók engedélyezése\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Hajlékonylemez (86F) naplók engedélyezése\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Hajlékonylemez-vezérlő naplók engedélyezése\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "IDE naplók engedélyezése\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Soros port naplók engedélyezése\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Hálózati naplók engedélyezése\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "Töréspontok &naplózása\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "&Videómemória lementése\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Súgó" + BEGIN + MENUITEM "&Dokumentáció...", IDM_DOCS + MENUITEM "A 86Box &névjegye...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Új képfájl létrehozása...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "Meglévő képfájl &megnyitása...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Felvétel", IDM_CASSETTE_RECORD + MENUITEM "&Lejátszás", IDM_CASSETTE_PLAY + MENUITEM "&Visszatekerés az elejére", IDM_CASSETTE_REWIND + MENUITEM "&Előretekerés a végére", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "&Kiadás", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Kép&fájl...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "&Kiadás", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Új képfájl létrehozása...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "Meglévő képfájl &megnyitása...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&xportálás 86F formátumba...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "&Kiadás", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Némítás", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "&Kiadás", IDM_CDROM_EMPTY + MENUITEM "Előző képfájl &újratöltése", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Meglévő képfájl &megnyitása...", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Új képfájl létrehozása...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Meglévő képfájl &megnyitása...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "Kiadás", IDM_ZIP_EJECT + MENUITEM "Előző képfájl &újratöltése", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Új képfájl létrehozása...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Meglévő képfájl &megnyitása...", IDM_MO_IMAGE_EXISTING + MENUITEM "Meglévő képfájl megnyitása (&írásvédett)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "Kiadás", IDM_MO_EJECT + MENUITEM "Előző képfájl &újratöltése", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "Cél &képkockasebesség" + BEGIN + MENUITEM "&Szinkronizálás a videóval ", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 fps", IDM_VID_GL_FPS_25 + MENUITEM "&30 fps", IDM_VID_GL_FPS_30 + MENUITEM "&50 fps", IDM_VID_GL_FPS_50 + MENUITEM "&60 fps", IDM_VID_GL_FPS_60 + MENUITEM "&75 fps", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "Shader &kiválasztása...", IDM_VID_GL_SHADER + MENUITEM "Shader &eltávolítása", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// +DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Status" +FONT 9, "Segoe UI" +BEGIN + LTEXT "1",IDT_SDEVICE,16,16,180,1000 + LTEXT "1",IDT_STEXT,16,186,180,1000 +END + +DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Hangerőszabályzó" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,57,7,50,14 + PUSHBUTTON "Mégse",IDCANCEL,57,24,50,14 + CONTROL "Hangerő",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | + TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 + CTEXT "Hangerő",IDT_1746,10,7,32,9,SS_CENTERIMAGE +END + +DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Új képfájl létrehozása" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,104,65,50,14 + PUSHBUTTON "Mégse",IDCANCEL,162,65,50,14 + LTEXT "Fájlnév:",IDT_1749,7,6,44,12,SS_CENTERIMAGE + LTEXT "Méret:",IDT_1750,7,25,44,12,SS_CENTERIMAGE + LTEXT "RPM-mód:",IDT_1751,7,45,44,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY + COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_CFILE,206,5,13,14 + LTEXT "Folyamat:",IDT_1757,7,45,44,12,SS_CENTERIMAGE + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,53,45,166,14 +END + +DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "86Box beállítások" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,246,235,50,14 + PUSHBUTTON "Mégse",IDCANCEL,307,235,50,14 + CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 + CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 +/* Leave this commented out until we get into localization. */ +#if 0 + LTEXT "Nyelv:",IDT_1700,7,237,41,10 + COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWN | WS_VSCROLL | + WS_TABSTOP +#endif +END + +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Főablak méreteinek megadása" +FONT 9, "Segoe UI" +BEGIN + LTEXT "Szél.:",IDT_1709,7,9,24,12 + EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, + 12,12 + LTEXT "Mag.:",IDT_1710,97,9,24,12 + EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, + 12,12 + CONTROL "Rögzítés erre a méretre",IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + DEFPUSHBUTTON "OK",IDOK,30,45,50,14 + PUSHBUTTON "Mégse",IDCANCEL,99,45,50,14 +END + +DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Géptípus:",IDT_1708,7,9,60,10 + COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Számítógép:",IDT_1701,7,28,60,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MACHINE,214,26,46,12 + COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Processzor:",IDT_1702,7,47,59,10 + COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Seb.:",IDT_1704,189,47,24,10 + COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "FPU-egység:",IDT_1707,7,66,59,10 + COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Várakozási cikl.:",IDT_1703,7,85,60,10 + EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, + 12,12 + LTEXT "MB",IDT_1705,123,104,10,10 + LTEXT "Memória:",IDT_1706,7,104,30,10 + GROUPBOX "Idő szinkronizáció",IDC_TIME_SYNC,7,135,100,56 + CONTROL "Letiltva",IDC_RADIO_TS_DISABLED,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 + CONTROL "Engedély. (helyi idő)", IDC_RADIO_TS_LOCAL,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 + CONTROL "Engedély. (UTC)", IDC_RADIO_TS_UTC,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 +#ifdef USE_DYNAREC + CONTROL "Dinamikus újrafordítás",IDC_CHECK_DYNAREC,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 +#endif +END + +DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Videokártya:",IDT_1707,7,9,48,10 + COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_VID,222,7,38,12 + CONTROL "Voodoo-gyorsítókártya",IDC_CHECK_VOODOO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 + PUSHBUTTON "Beállítások",IDC_BUTTON_VOODOO,222,26,38,12 +END + +DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Egér:",IDT_1709,7,9,57,10 + COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MOUSE,214,7,46,12 + LTEXT "Játékvezérlő:",IDT_1710,7,27,58,10 + COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Játékvez. 1...",IDC_JOY1,7,44,50,14 + PUSHBUTTON "Játékvez. 2...",IDC_JOY2,74,44,50,14 + PUSHBUTTON "Játékvez. 3...",IDC_JOY3,141,44,50,14 + PUSHBUTTON "Játékvez. 4...",IDC_JOY4,209,44,50,14 +END + +DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Hangkártya:",IDT_1711,7,9,59,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_SND,214,7,46,12 + + COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "MIDI-kimenet:",IDT_1712,7,28,59,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MIDI,214,26,46,12 + + COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "MIDI-bemenet:",IDT_1713,7,47,59,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MIDI_IN,214,45,46,12 + + CONTROL "Különálló MPU-401",IDC_CHECK_MPU401,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MPU401,214,64,46,12 + + CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_SSI,214,82,46,12 + + CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_CMS,214,100,46,12 + + CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_GUS,214,118,46,12 + + CONTROL "FLOAT32 használata",IDC_CHECK_FLOAT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 +END + +DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Hálózati típusa:",IDT_1714,7,9,59,10 + COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "PCap eszköz:",IDT_1715,7,28,59,10 + COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "Hálózati kártya:",IDT_1716,7,47,59,10 + COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "Beállítások...",IDC_CONFIGURE_NET,214,44,46,12 +END + +DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "LPT1 eszköz:",IDT_1717,7,9,61,10 + COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "LPT2 eszköz:",IDT_1718,7,28,61,10 + COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "LPT3 eszköz:",IDT_1719,7,47,61,10 + COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + CONTROL "Soros port 1",IDC_CHECK_SERIAL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 + CONTROL "Soros port 2",IDC_CHECK_SERIAL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 + CONTROL "Soros port 3",IDC_CHECK_SERIAL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 + CONTROL "Soros port 4",IDC_CHECK_SERIAL4,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 + + CONTROL "Párhuzamos port 1",IDC_CHECK_PARALLEL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 + CONTROL "Párhuzamos port 2",IDC_CHECK_PARALLEL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 + CONTROL "Párhuzamos port 3",IDC_CHECK_PARALLEL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 +END + +DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Merevl.-vezérlő:",IDT_1718,7,9,64,10 + COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_HDC,222,7,38,12 + + LTEXT "Floppy-vezérlő:",IDT_1768,7,28,64,10 + COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_FDC,222,26,38,12 + + CONTROL "Harmadlagos IDE-vezérlő",IDC_CHECK_IDE_TER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 + PUSHBUTTON "Beállítások",IDC_BUTTON_IDE_TER,222,45,38,12 + + CONTROL "Negyedleges IDE-vezérlő",IDC_CHECK_IDE_QUA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Beállítások",IDC_BUTTON_IDE_QUA,222,64,38,12 + + GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 + LTEXT "Gazdaadapt. 1:",IDT_1763,16,102,48,10 + COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_1,213,100,38,12 + LTEXT "Gazdaadap. 2:",IDT_1764,16,121,48,10 + COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_2,213,119,38,12 + LTEXT "Gazdaadapt. 3:",IDT_1765,16,140,48,10 + COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_3,213,138,38,12 + LTEXT "Gazdaadapt. 4:",IDT_1766,16,159,48,10 + COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_4,213,157,38,12 + + CONTROL "Magnókazetta",IDC_CHECK_CASSETTE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 +END + +DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,92 + LTEXT "Merevlemezek:",IDT_1720,7,7,253,8 + PUSHBUTTON "&Új...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 + PUSHBUTTON "&Megnyitás...",IDC_BUTTON_HDD_ADD,129,137,62,10 + PUSHBUTTON "&Eltávolítás",IDC_BUTTON_HDD_REMOVE,198,137,62,10 + COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Busz:",IDT_1721,7,119,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Csatorna:",IDT_1722,131,119,38,8 + COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,131,119,38,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Merevlemez hozzáadása" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,55,127,50,14 + PUSHBUTTON "Mégse",IDCANCEL,112,127,50,14 + EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 + PUSHBUTTON "&Kiválasztás...",IDC_CFILE,167,16,44,12 + EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 + EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 + EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 + EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 + COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Szektorok:",IDT_1726,154,35,27,10 + LTEXT "Fejek:",IDT_1727,81,35,29,8 + LTEXT "Cilinderek:",IDT_1728,7,35,32,12 + LTEXT "Méret (MB):",IDT_1729,7,54,33,8 + LTEXT "Típus:",IDT_1730,86,54,24,8 + LTEXT "Fájlnév:",IDT_1731,7,7,204,9 + COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Busz:",IDT_1721,7,73,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Csatorna:",IDT_1722,99,73,34,8 + COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,99,73,34,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Formátum:",IDT_1774,7,92,50,12 + COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Blokkméret:",IDT_1775,7,111,50,12 + COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Folyamat:",IDT_1752,7,7,204,9 + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,7,16,204,12 +END + +DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,60 + LTEXT "Floppy-meghajtók:",IDT_1737,7,7,253,8 + COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Típus:",IDT_1738,7,87,24,8 + CONTROL "Turbó időzítés",IDC_CHECKTURBO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 + CONTROL "BPB ellenőrzés",IDC_CHECKBPB,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 + + CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,117,253,60 + LTEXT "CD-ROM meghajtók:",IDT_1739,7,107,253,8 + COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Busz:",IDT_1740,7,187,24,8 + COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1741,131,187,38,8 + COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Csatorna:",IDT_1742,131,187,38,8 + COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Seb.:",IDT_1758,7,207,24,8 +END + +DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + + CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,17,253,60 + LTEXT "MO-meghajtók:",IDT_1769,7,7,253,8 + COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Busz:",IDT_1770,7,87,24,8 + COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1771,131,87,38,8 + COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Csatorna:",IDT_1772,131,87,38,8 + COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Típus:",IDT_1773,7,107,24,8 + + CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,137,253,60 + LTEXT "ZIP-meghajtók:",IDT_1759,7,127,253,8 + COMBOBOX IDC_COMBO_ZIP_BUS,33,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Busz:",IDT_1753,7,207,24,8 + COMBOBOX IDC_COMBO_ZIP_ID,170,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1754,120,207,28,8 + COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Csatorna:",IDT_1755,120,207,28,8 + CONTROL "ZIP 250",IDC_CHECK250,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 +END + +DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "ISA RTC:",IDT_1767,7,9,48,10 + COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISARTC,222,7,38,12 + + GROUPBOX "ISA memóriabővítők",IDC_GROUP_ISAMEM,7,28,253,93 + LTEXT "Kártya 1:",IDT_1763,16,45,48,10 + COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 + LTEXT "Kártya 2:",IDT_1764,16,64,48,10 + COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 + LTEXT "Kártya 3:",IDT_1765,16,83,48,10 + COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 + LTEXT "Kártya 4:",IDT_1766,16,102,48,10 + COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 + + CONTROL "ISABugger eszköz",IDC_CHECK_BUGGER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 + + CONTROL "POST kártya",IDC_CHECK_POSTCARD,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 +END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Hiba" + IDS_2050 "Végzetes hiba" + IDS_2051 "" + IDS_2052 "Használja a CTRL+ALT+PAGE DOWN kombinációt az ablakhoz való visszatéréshez." + IDS_2053 "Sebesség" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP-lemezképek (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "A 86Box nem talált használható ROM-képeket\n\nKérem töltse le a ROM készletet és bontsa ki a ""roms"" könyvtárba." + IDS_2057 "(üres)" + IDS_2058 "ZIP-lemezképek (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Minden fájl (*.*)\0*.*\0" + IDS_2059 "Turbó" + IDS_2060 "Bekapcsolva" + IDS_2061 "Kikapcsolva" + IDS_2062 "Minden képfájl (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Alapvető szektor képfájlok (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Felületi képfájlok (*.86F)\0*.86F\0" + IDS_2063 "A számítógép ""%hs"" nem elérhető a ""roms/machines"" mappából hiányzó ROM-képek miatt. Ehelyett egy másik gép kerül futtatásra." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "A videokártya ""%hs"" nem elérhető a ""roms/video"" mappából hiányzó ROM-képek miatt. Ehelyett egy másik kártya kerül futtatásra." + IDS_2065 "Számítógép" + IDS_2066 "Megjelenítő" + IDS_2067 "Beviteli eszközök" + IDS_2068 "Hang" + IDS_2069 "Hálózat" + IDS_2070 "Portok (COM és LPT)" + IDS_2071 "Tárolóvezérlők" + IDS_2072 "Merevlemezek" + IDS_2073 "Floppy és CD-ROM meghajtók" + IDS_2074 "Egyéb cserélhető tárolók" + IDS_2075 "Egyéb perifériák" + IDS_2076 "Felületi képfájlok (*.86F)\0*.86F\0" + IDS_2077 "Az egér elfogásához kattintson az ablakba" + IDS_2078 "Nyomja meg az F8+F12-t az egér elengédéséhez" + IDS_2079 "Nyomja meg az F8+F12-t vagy a középső gombot az egér elengédéséhez" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Nem sikerült a FluidSynth inicializálása" + IDS_2081 "Busz" + IDS_2082 "Fájl" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "BPB ellenőrzése" + IDS_2088 "KB" + IDS_2089 "Nem sikerült inicializálni a videó megjelenítőt." + IDS_2090 "Alapértelmezet" + IDS_2091 "%i várakozási ciklus(ok)" + IDS_2092 "Típus" + IDS_2093 "Nem sikerült a PCap beállítása" + IDS_2094 "Nem találhatóak PCap eszközök" + IDS_2095 "Érvénytelen PCap eszköz" + IDS_2096 "Szabványos 2-gombos játékvezérlő(k)" + IDS_2097 "Szabványos 4-gombos játékvezérlő" + IDS_2098 "Szabványos 6-gombos játékvezérlő" + IDS_2099 "Szabványos 8-gombos játékvezérlő" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Nincs" + IDS_2104 "Nem lehet betölteni a billentyűzetgyorsítókat." + IDS_2105 "A közvetlen nyers bevitel regisztrálása nem sikerült." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Floppy %i (%s): %ls" + IDS_2109 "Minden képfájl (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Továbbfejlesztett szektor képek (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Alapvető szektor képek (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux képekfájlok (*.FDI)\0*.FDI\0Felületi képfájlok (*.86F;*.MFM)\0*.86F;*.MFM\0Minden fájl (*.*)\0*.*\0" + IDS_2110 "A FreeType inicializálása nem lehetséges" + IDS_2111 "Az SDL inicializálása nem lehetséges, az SDL2.dll fájl szükséges" + IDS_2112 "Biztosan szeretné újraindítani az emulált gépet?" + IDS_2113 "Biztos benne, hogy ki szeretne lépni a 86Box-ból?" + IDS_2114 "Nem sikerült inicializálni a Ghostscript-et" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "MO-képfájlok (*.IM?;*.MDI)\0*.IM?;*.MDI\0Minden fájl (*.*)\0*.*\0" + IDS_2117 "Üdvözli önt az 86Box!" + IDS_2118 "Integrált vezérlő" + IDS_2119 "Kilépés" + IDS_2120 "Nem találhatóak meg a ROM-képek" + IDS_2121 "Szeretné menteni a beállításokat?" + IDS_2122 "Ezzel hardveresen újraindítja az emulált gépet." + IDS_2123 "Mentés" + IDS_2124 "A 86Box névjegye" + IDS_2125 "86Box v" EMU_VERSION + IDS_2126 "Régi számítógépek emulátora\n\nFejlesztők: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, és mások.\n\nMegjelent a GNU General Public License v2 alatt. További információért lásd a LICENSE fájlt. " + IDS_2127 "OK" + IDS_2128 "Hardver nem elérhető" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Győződjön meg hogy a(z) " LIB_NAME_PCAP " telepítve van és jelenleg a " LIB_NAME_PCAP "-kompatibilis kapcsolatot használja." + IDS_2130 "Érvénytelen konfiguráció" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " szükséges az ESC/P nyomtató emulációhoz." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " szükséges a PostScript fájlok PDF formátumba való automatikus konvertálásához.\n\nAz általános PostScript nyomtatóra küldött dokumentumok PostScript (.ps) fájlként kerülnek mentésre." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " szükséges a FluidSynth MIDI kimenethez." + IDS_2134 "Teljes képernyős módra váltás" + IDS_2135 "Ne jelenítse meg újra ezt az üzenetet " + IDS_2136 "Ne lépjen ki" + IDS_2137 "Újraindítás" + IDS_2138 "Ne indítsa újra" + IDS_2139 "MO-képfájlok (*.IM?;*.MDI)\0*.IM?;*.MDI\0Minden fájl (*.*)\0*.*\0" + IDS_2140 "CD-ROM-képek (*.ISO;*.CUE)\0*.ISO;*.CUE\0Minden fájl (*.*)\0*.*\0" + IDS_2141 "%hs eszközkonfiguráció" + IDS_2142 "Képernyő alvó módban" + IDS_2143 "OpenGL Shaderek (*.GLSL)\0*.GLSL\0Minden fájl (*.*)\0*.*\0" + IDS_2144 "OpenGL beállítások" + IDS_2145 "Egy nem támogatott konfigurációt tölt be" + IDS_2146 "A kiválasztott gépen alapuló CPU-típusszűrés le van tiltva ezen az emulált gépen.\n\nEz lehetővé teszi olyan CPU kiválasztását, amely egyébként nem kompatibilis a kiválasztott géppel. Előfordulhat azonban, hogy nem kompatibilis a gép BIOS-ával vagy más szoftverekkel.\n\nA beállítás engedélyezése hivatalosan nem támogatott, és a benyújtott hibajelentéseket érvénytelenként lezárhatjuk." + IDS_2147 "Folytatás" + IDS_2148 "Magnókazetta: %s" + IDS_2149 "Magnókazetta-képek (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Minden fájl (*.*)\0*.*\0" + IDS_2150 "ROM-kazetta %i: %ls" + IDS_2151 "ROM-kazetta képek (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Minden fájl (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Merevlemez (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL vagy ESDI CD-ROM meghajtók soha nem léteztek" + IDS_4100 "Egyéni..." + IDS_4101 "Egyéni (nagy)..." + IDS_4102 "Új merevlemez hozzáadása" + IDS_4103 "Meglévő merevlemez hozzáadása" + IDS_4104 "A HDI lemezképek nem lehetnek nagyobbak 4 GB-nál." + IDS_4105 "A lemezképek mérete nem haladhatja meg a 127 GB-ot." + IDS_4106 "Merevlemez-képfájlok (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Minden fájl (*.*)\0*.*\0" + IDS_4107 "A fájl nem olvasható" + IDS_4108 "A fájl nem írható" + IDS_4109 "Az 512-től eltérő szektorméretű HDI vagy HDX képek nem támogatottak." + IDS_4110 "Az USB még nem támogatott" + IDS_4111 "A lemezképfájl már létezik" + IDS_4112 "Adjon meg egy érvényes fájlnevet." + IDS_4113 "A lemezképfájl létrehozásra került" + IDS_4114 "Győződjön meg arról, hogy a fájl létezik és olvasható." + IDS_4115 "Győződjön meg arról, hogy a fájlt egy írható könyvtárba menti." + IDS_4116 "A lemezképfájl túl nagy" + IDS_4117 "Ne felejtse el particionálni és formázni az újonnan létrehozott meghajtót." + IDS_4118 "A kiválasztott fájl felülírásra kerül. Biztos, hogy ezt kívánja használni?" + IDS_4119 "Nem támogatott lemezkép" + IDS_4120 "Felülírás" + IDS_4121 "Ne írja felül" + IDS_4122 "Nyers lemezkép (.img)" + IDS_4123 "HDI-lemezkép (.hdi)" + IDS_4124 "HDX-lemezkép (.hdx)" + IDS_4125 "Rögzített méretű VHD (.vhd)" + IDS_4126 "Dinamikusan bővülő VHD (.vhd)" + IDS_4127 "Különbség-VHD (.vhd)" + IDS_4128 "Nagy blokkméret (2 MB)" + IDS_4129 "Kis blokkméret (512 KB)" + IDS_4130 "VHD fájlok (*.VHD)\0*.VHD\0Minden fájl (*.*)\0*.*\0" + IDS_4131 "Válassza ki a szülő VHD-t" + IDS_4132 "Ez azt jelentheti, hogy a szülőkép módosult az eltérő kép létrehozása után.\n\nEz akkor is előfordulhat, ha a képfájlokat áthelyezték vagy másolták, vagy a lemezt létrehozó program hibája miatt.\n\nSzeretné kijavítani az időbélyegeket?" + IDS_4133 "A szülő- és a gyermeklemez időbélyegei nem egyeznek" + IDS_4134 "Nem sikerült kijavítani a VHD időbélyegét." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Letiltva" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Letiltva" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (klaszter 1024)" + IDS_5898 "DMF (klaszter 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3.5"" 1.3Gb M.O. (GigaMO)" + IDS_5907 "3.5"" 2.3Gb M.O. (GigaMO 2)" + IDS_5908 "5.25"" 600Mb M.O." + IDS_5909 "5.25"" 650Mb M.O." + IDS_5910 "5.25"" 1Gb M.O." + IDS_5911 "5.25"" 1.3Gb M.O." + + IDS_6144 "Tökéletes RPM" + IDS_6145 "1%%-kal a tökéletes RPM alatt" + IDS_6146 "1.5%%-kal a tökéletes RPM alatt" + IDS_6147 "2%%-kal a tökéletes RPM alatt" + + IDS_7168 "magyar (Magyarország)" +END +#define IDS_LANG_ENUS IDS_7168 + +// Hungarian resources +///////////////////////////////////////////////////////////////////////////// \ No newline at end of file From 8f2b111c2bf248b4358d2c131de0bb0d3716fd04 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 14:34:05 -0300 Subject: [PATCH 015/159] Fix typo in CMakePresets --- CMakePresets.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 843727936..2cfd8ea4a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -16,8 +16,8 @@ "CMAKE_CXX_FLAGS_RELEASE": "-g0 -O3", "CMAKE_C_FLAGS_DEBUG": "-ggdb -Og", "CMAKE_CXX_FLAGS_DEBUG": "-ggdb -Og", - "CMAKE_C_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=last -flto", - "CMAKE_CXX_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=last -flto" + "CMAKE_C_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=fast -flto", + "CMAKE_CXX_FLAGS_OPTIMIZED": "-march=native -mtune=native -O3 -ffp-contract=fast -flto" }, "hidden": true, "binaryDir": "build" From 691e3029a876b12c2bb8b325d35d4c5c2877170d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Mon, 8 Nov 2021 19:10:37 +0100 Subject: [PATCH 016/159] Updates for Discord Rich Presence - Change the large image varying with build type based on 86Box.rc - Upload the necessary assets --- src/win/assets/86Box-green.png | Bin 0 -> 35465 bytes src/win/assets/86box-rb.png | Bin 0 -> 35252 bytes src/win/assets/86box-red.png | Bin 0 -> 57521 bytes src/win/assets/86box-yellow.png | Bin 0 -> 37482 bytes src/win/assets/86box.png | Bin 0 -> 35252 bytes src/win/assets/status-paused.png | Bin 0 -> 8460 bytes src/win/assets/status-running.png | Bin 0 -> 1863 bytes src/win/win_discord.c | 16 ++++++++++++++-- 8 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/win/assets/86Box-green.png create mode 100644 src/win/assets/86box-rb.png create mode 100644 src/win/assets/86box-red.png create mode 100644 src/win/assets/86box-yellow.png create mode 100644 src/win/assets/86box.png create mode 100644 src/win/assets/status-paused.png create mode 100644 src/win/assets/status-running.png diff --git a/src/win/assets/86Box-green.png b/src/win/assets/86Box-green.png new file mode 100644 index 0000000000000000000000000000000000000000..c1af649a1f6d513daef5794c1db68ecc6b595bed GIT binary patch literal 35465 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�tlbB$fC*9|z9|TJu#hgw~a9_zvdbw~Tu$b0$xkO)A9HH(|9v0m~a1>`! z>IRrz1AUs|PeJ@As9}iwODD1Y?3)@tNT`!Auft}yx+iOqy zI3jrYOkSy$vW0VRxeYAX)z9#rBy6=F)$VCW!3R-Lf`fKsuQ_T*YrD3IQrWm`u#gq7N`BGB*qdQ_ornI|jH{P}wZoi7;BmjhJk_ ze;QsYzpLWj_ebn`p0wf2=?h0!J@Cix#B(`u;w0kD!{`>QZbl~mu_wo%PPNJ7 zENc(wIE&=KAf5UdQIm}D5#Z+J;vvhrhd>P;+KviM>@xCh9XoC^Oo(qGydXYhsNZB# zVuuu!s!gq`4FU4^=x5-v$XB~1$tniU297hD#KC|o9AeQj%&C>(hwNmVhiT(coB8OU z@B4fCdF&yPpMa^vkyv;RhBzA6_y;Sd7TkiX!lz6UYCQp0=Zw`-Dd$e-0*$xZDgR25 z%%ag}4sFFnpY5>89w^8M<`o$Rtxttzc$H1IIH-CHG_*azh0=@-5Xh0eXJV8Na%V1Z@PF(~I-rLXEJSi(- za9*_*wQok9wkF?s_C@&L^A_JEKcJJk4GMXGu=cE$ae!Q{HMl)_9gVv3`XtB1<%u1g z@Vls>Dn0Jg6NWn`pxFR%4^T|t**u&@MTu9?69!Ud0eJaUlWf=8wPQ1iNACc*O+i7y zqih(&NSU6FBJMhN-(B|^Pr3P~uPt|s8{^cCd-L+n$``%aE`CmrY;n;wbLGWu81@-@+Fl?{BW785(!IO{>fL>>9;BnTAZy%;DMguzuAOlIJOYk3|L&f=MU zk@-Q(Xw>&H69O?3+3}}NzRZ(TOIeioh8Tb}qJkQW5X%M18y2@FV0XX83?+2r$5uT^L=d0#%{G={25Vsu5E>uT z`9a>-`1l{WI9~v;@$KJtQP8IsC~b41D&}VjfAs{|@%z-^?8Av_RqXzHZH*GSmPWl- zDZ%_W5fkdrClB9J;f~wDFaDgw0w#V75f@jBi8GvJ-a){QKfr|4*i&Kd`-8(blg_ORQ;D^9ONnBcN72H@4mQJr7i23ey`o>G>HqD$ZHT!zyOR&fBfpVSHpn&CXA|o e{BJ3&cOu=U{!!jQDR>5A-!A9hvUi-k@_zt^`A4Jx literal 0 HcmV?d00001 diff --git a/src/win/assets/86box-rb.png b/src/win/assets/86box-rb.png new file mode 100644 index 0000000000000000000000000000000000000000..a29748b8d1b3ab51eecde6c0a89a3f08d6b632e1 GIT binary patch literal 35252 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 ?!|Xhq%+ zAY_~iO@N{{!*f?JEEP literal 0 HcmV?d00001 diff --git a/src/win/assets/86box-red.png b/src/win/assets/86box-red.png new file mode 100644 index 0000000000000000000000000000000000000000..0ddf9d3a444b5dbfb90f6d213da6fc026a2dd10b GIT binary patch literal 57521 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 z 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 literal 0 HcmV?d00001 diff --git a/src/win/assets/86box.png b/src/win/assets/86box.png new file mode 100644 index 0000000000000000000000000000000000000000..a29748b8d1b3ab51eecde6c0a89a3f08d6b632e1 GIT binary patch literal 35252 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 ?!|Xhq%+ zAY_~iO@N{{!*f?JEEP literal 0 HcmV?d00001 diff --git a/src/win/assets/status-paused.png b/src/win/assets/status-paused.png new file mode 100644 index 0000000000000000000000000000000000000000..e913fbf6c85fbc09228da5ba2a811ce0b6e988a0 GIT binary patch literal 8460 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 literal 0 HcmV?d00001 diff --git a/src/win/assets/status-running.png b/src/win/assets/status-running.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cc5fec193c0507264090674deb51609ecade96 GIT binary patch literal 1863 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&t&wwUqN(AjMc5RtvY3HEOcjI~J%dy}Ffg#)@pN$vsfc@fm64ahfaAc1-@C+~JQP;U z4&tw^XKzqoWN_hRQ1D`42xMaD5Mpqc!oaYIg+V}-p+RF*YBV%P)5d6a7%dz|%frD~ dJ51P8oE_lh8= Date: Mon, 8 Nov 2021 19:28:28 +0100 Subject: [PATCH 017/159] Fix a typo in Hungarian translation --- src/win/languages/hu-HU.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 6dd75e2d1..68a25c27e 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -789,7 +789,7 @@ BEGIN IDS_2087 "BPB ellenőrzése" IDS_2088 "KB" IDS_2089 "Nem sikerült inicializálni a videó megjelenítőt." - IDS_2090 "Alapértelmezet" + IDS_2090 "Alapértelmezett" IDS_2091 "%i várakozási ciklus(ok)" IDS_2092 "Típus" IDS_2093 "Nem sikerült a PCap beállítása" From 7900178a87ca9658fa2ad1af5165f955f3502892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Mon, 8 Nov 2021 21:55:55 +0100 Subject: [PATCH 018/159] Fix character casing in asset names --- src/win/win_discord.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_discord.c b/src/win/win_discord.c index 54bdd4135..487157af5 100644 --- a/src/win/win_discord.c +++ b/src/win/win_discord.c @@ -109,7 +109,7 @@ discord_update_activity(int paused) strcpy(activity.assets.large_image, "86box-red"); #else /* Icon by OBattler and laciba96 (gray for builds of branches and from the git master)*/ - strcpy(activity.assets.large_image, "86Box"); + strcpy(activity.assets.large_image, "86box"); #endif /* End of icon choosing */ From e2fbac9e0001588fabbafc45de3471ee390c01fb Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 18:21:28 -0300 Subject: [PATCH 019/159] Revamp gitignore --- .gitignore | 50 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 6de49d74e..e91950bf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,36 @@ -src/*.o -src/*.exe -src/*.res -src/*.cfg -src/*.log -src/*.dll -src/*.dmp -src/NUL -src/nvr/ -src/roms/ -/.vs -/build -/.vscode +# CMake /CMakeUserPresets.json /CMakeCache.txt +/build CMakeFiles -*.cmake -*.obj -*.d -*.a -src/include/86box/version.h Makefile +*.a +*.cmake +/src/*.exe +/src/86Box +/src/include/86box/version.h + +# Legacy Makefile +/src/*.o +/src/*.d +/src/*.res +/src/*.dll +/src/NUL + +# State +/src/*.cfg +/src/*.log +/src/*.dmp +/src/nvr/ +/src/printer/ +/src/roms/ +/src/screenshots/ + +# Build scripts +/archive_tmp +/static2dll.* +/*.zip + +# Visual Studio Code +/.vs +/.vscode From 43da85325e447ae824d79a604d30116674a0566f Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 18:22:04 -0300 Subject: [PATCH 020/159] Fixes for static and CMake version includes --- src/include/86box/version.h.in | 2 +- src/include_make/86box/version.h | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/include/86box/version.h.in b/src/include/86box/version.h.in index ec7a4fdb7..f0a92a008 100644 --- a/src/include/86box/version.h.in +++ b/src/include/86box/version.h.in @@ -22,7 +22,7 @@ #define EMU_VERSION "@CMAKE_PROJECT_VERSION@" #define EMU_VERSION_W LSTR(EMU_VERSION) -#define EMU_VERSION_EX "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@@CMAKE_PROJECT_VERSION_PATCH@" +#define EMU_VERSION_EX "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@0" #define EMU_VERSION_MAJ @CMAKE_PROJECT_VERSION_MAJOR@ #define EMU_VERSION_MIN @CMAKE_PROJECT_VERSION_MINOR@ diff --git a/src/include_make/86box/version.h b/src/include_make/86box/version.h index b3da62c6e..6574d0049 100644 --- a/src/include_make/86box/version.h +++ b/src/include_make/86box/version.h @@ -13,19 +13,25 @@ * Copyright 2020 Miran Grca. */ +#define _LSTR(s) L ## s +#define LSTR(s) _LSTR(s) + /* Version info. */ #define EMU_NAME "86Box" -#define EMU_NAME_W L"86Box" +#define EMU_NAME_W LSTR(EMU_NAME) #define EMU_VERSION "3.0" -#define EMU_VERSION_W L"3.0" +#define EMU_VERSION_W LSTR(EMU_VERSION) #define EMU_VERSION_EX "3.00" #define EMU_VERSION_MAJ 3 #define EMU_VERSION_MIN 0 -#define COPYRIGHT_YEAR "2020" +#define EMU_VERSION_FULL EMU_VERSION +#define EMU_VERSION_FULL_W EMU_VERSION_W + +#define COPYRIGHT_YEAR "2021" /* Web URL info. */ #define EMU_SITE L"86box.net" #define EMU_ROMS_URL L"https://github.com/86Box/roms/releases/latest" -#define EMU_DOCS_URL L"https://86box.readthedocs.io" \ No newline at end of file +#define EMU_DOCS_URL L"https://86box.readthedocs.io" From e904cf782f0db9f61e2edc452d84ee345667bd30 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 18:56:00 -0300 Subject: [PATCH 021/159] Add tar.xz to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e91950bf5..4103ce839 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ Makefile /archive_tmp /static2dll.* /*.zip +/*.tar.xz # Visual Studio Code /.vs From dfa2583cfbb6d487f9f98fc44bd0534b70327549 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 22:40:12 -0300 Subject: [PATCH 022/159] Remove unused code from x86 Voodoo dynarec, fixes x86 Linux builds --- src/include/86box/vid_voodoo_codegen_x86.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/include/86box/vid_voodoo_codegen_x86.h b/src/include/86box/vid_voodoo_codegen_x86.h index d54a7e683..b6d60e5ff 100644 --- a/src/include/86box/vid_voodoo_codegen_x86.h +++ b/src/include/86box/vid_voodoo_codegen_x86.h @@ -3361,12 +3361,6 @@ voodoo_recomp++; void voodoo_codegen_init(voodoo_t *voodoo) { int c; -#if defined(__linux__) || defined(__APPLE__) - void *start; - size_t len; - long pagesize = sysconf(_SC_PAGESIZE); - long pagemask = ~(pagesize - 1); -#endif voodoo->codegen_data = plat_mmap(sizeof(voodoo_x86_data_t) * BLOCK_NUM*4, 1); From 409671115467d5c79f3fe611785b883b044df497 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 22:46:53 -0300 Subject: [PATCH 023/159] Initial commit of the new Jenkins build flow --- .jenkins/Jenkinsfile | 44 ++++ .jenkins/build.sh | 447 +++++++++++++++++++++++++++++++++++++++++ .jenkins/static2dll.sh | 148 ++++++++++++++ 3 files changed, 639 insertions(+) create mode 100644 .jenkins/Jenkinsfile create mode 100644 .jenkins/build.sh create mode 100644 .jenkins/static2dll.sh diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile new file mode 100644 index 000000000..f0457e976 --- /dev/null +++ b/.jenkins/Jenkinsfile @@ -0,0 +1,44 @@ +def gitClone() { + cleanWs() + def scmVars = git url: 'https://github.com/richardg867/86Box.git', + branch: 'cleanup30' + env.GIT_COMMIT = scmVars.GIT_COMMIT +} + +def windowsBuild() { + bat 'C:\\msys64\\msys2_shell.cmd -msys2 -defterm -here -no-start -c .jenkins/build.sh' +} + +def unixBuild() { + sh 'chmod u+x .jenkins/build.sh && .jenkins/build.sh' +} + +def saveArtifacts() { + archiveArtifacts artifacts: "${env.JOB_BASE_NAME}-*" +} + +pipeline { + agent any + + stages { + stage('Build Windows') { + steps { + node('windows') { + gitClone() + windowsBuild() + saveArtifacts() + } + } + } + + stage('Build Linux') { + steps { + node('debian') { + gitClone() + unixBuild() + saveArtifacts() + } + } + } + } +} diff --git a/.jenkins/build.sh b/.jenkins/build.sh new file mode 100644 index 000000000..f32793584 --- /dev/null +++ b/.jenkins/build.sh @@ -0,0 +1,447 @@ +#!/bin/sh +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box distribution. +# +# Jenkins build script. +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +# +# While this script was made for our Jenkins infrastructure, you can run it +# to produce Jenkins-like builds on your local machine by following these notes: +# +# - Run build.sh without parameters to see its usage +# - For Windows (MSYS MinGW) builds: +# - Packaging requires 7-Zip on Program Files +# - Packaging the Ghostscript DLL requires 32-bit and/or 64-bit Ghostscript on Program Files +# - Packaging the FluidSynth DLL requires it to be at /home/86Box/dll32/libfluidsynth.dll +# and/or /home/86Box/dll64/libfluidsynth64.dll (for 32-bit and 64-bit builds respectively) +# - Packaging the Discord DLL requires wget (MSYS should come with it) +# - For Linux builds: +# - Only Debian and derivatives are supported +# - dpkg and apt-get are called through sudo to manage dependencies +# - For macOS builds: +# - TBD +# + +alias is_windows='[ ! -z "$MSYSTEM" ]' +alias is_mac='uname -s | grep -q Darwin' + +try_make() { + # Try makefiles on two locations. I don't know what causes + # CMake to pick ./ instead of build/, but :worksonmymachine: + if [ -e "build/Makefile" ] + then + build_dir="$(pwd)/build" + cd build + make -j$(nproc) $* + local status=$? + cd .. + return $status + elif [ -e "Makefile" ] + then + build_dir="$(pwd)" + make -j$(nproc) $* + return $? + else + echo [!] No makefile found + return 1 + fi +} + +build() { + # Create a line gap between builds. + [ $first_build -eq 0 ] && echo + first_build=0 + + # Set argument and environment variables. + local job_name=$JOB_BASE_NAME + local build_number=$BUILD_NUMBER + local git_hash=$(echo $GIT_COMMIT | cut -c1-7) + local arch=$1 + shift + local cmake_flags=$* + local cmake_flags_extra= + + # Check if at least the job name was received. + if [ -z "$job_name" ] + then + echo [!] Missing environment variables: received JOB_BASE_NAME=[$job_name] BUILD_NUMBER=[$build_number] GIT_COMMIT=[$git_hash] + return 1 + fi + + # Generate the build qualifier and filename. + if echo $build_number | grep -q " " + then + # Full build qualifier. + build_qualifier="$build_number" + build_fn="-"$(echo "$build_number" | rev | cut -f1 -d" " | rev | tr '\\/:*?"<>|' '_') + elif [ ! -z "$build_number" ] + then + # Build number. + build_number=$(echo "$build_number" | sed "s/[^0-9]//g") # remove non-numeric characters + build_qualifier="build $build_number" + build_fn="-b$build_number" + else + # No build information. + build_qualifier= + build_fn= + fi + + echo [-] Building [$job_name] [$build_number] [$git_hash] for [$arch] with flags [$cmake_flags] + + # Switch to the correct directory. + cd "$cwd" + [ -e "build.sh" ] && cd .. + + # Perform platform-specific setup. + if is_windows + then + # Switch into the correct MSYSTEM if required. + msys=MINGW$arch + [ ! -d "/$msys" ] && msys=CLANG$arch + if [ -d "/$msys" ] + then + if [ "$MSYSTEM" != "$msys" ] + then + # Call build with the correct MSYSTEM. + echo [-] Switching to MSYSTEM [$msys] + cd "$cwd" + CHERE_INVOKING=yes MSYSTEM=$msys JOB_BASE_NAME=$JOB_BASE_NAME BUILD_NUMBER=$BUILD_NUMBER GIT_COMMIT=$GIT_COMMIT \ + bash -lc '"'$0'" -b "'$arch'" '$cmake_flags + return $? + fi + else + echo [!] No MSYSTEM for architecture [$arch] + return 2 + fi + echo [-] Using MSYSTEM [$MSYSTEM] + elif is_mac + then + # macOS lacks nproc, but sysctl can do the same job. + alias nproc='sysctl -n hw.logicalcpu' + else + # Determine Debian architecture. + case $arch in + x86) arch_deb="i386";; + x86_64) arch_deb="amd64";; + arm32) arch_deb="armhf";; + *) arch_deb="$arch";; + esac + + # Establish general and architecture-specific dependencies. + local pkgs="cmake git tar xz-utils dpkg-dev rpm" + if [ "$(dpkg --print-architecture)" = "$arch_deb" ] + then + local pkgs="$pkgs build-essential" + else + sudo dpkg --add-architecture $arch_deb + local pkgs="$pkgs crossbuild-essential-$arch_deb" + fi + local libpkgs="" + local longest_libpkg=0 + for pkg in libc6-dev linux-libc-dev libopenal-dev libfreetype6-dev libsdl2-dev libpng-dev + do + local libpkgs="$libpkgs $pkg:$arch_deb" + length=$(echo -n $pkg | sed 's/-dev$//g' | wc -c) + [ $length -gt $longest_libpkg ] && longest_libpkg=$length + done + + # Determine GNU toolchain architecture. + case $arch in + x86) arch_gnu="i686-linux-gnu";; + arm32) arch_gnu="arm-linux-gnueabihf";; + arm64) arch_gnu="aarch64-linux-gnu";; + *) arch_gnu="$arch-linux-gnu";; + esac + + # Create CMake toolchain file. + cat << EOF > toolchain.cmake +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR $arch) + +set(CMAKE_AR $arch_gnu-ar) +set(CMAKE_ASM_COMPILER $arch_gnu-gcc) +set(CMAKE_C_COMPILER $arch_gnu-gcc) +set(CMAKE_CXX_COMPILER $arch_gnu-g++) +set(CMAKE_LINKER $arch_gnu-ld) +set(CMAKE_OBJCOPY $arch_gnu-objcopy) +set(CMAKE_RANLIB $arch_gnu-ranlib) +set(CMAKE_SIZE $arch_gnu-size) +set(CMAKE_STRIP $arch_gnu-strip) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +EOF + local cmake_flags_extra="$cmake_flags_extra -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake" + + # Install or update dependencies. + echo [-] Installing dependencies through apt + sudo apt-get update + DEBIAN_FRONTEND=noninteractive sudo apt-get -y install $pkgs $libpkgs + sudo apt-get clean + fi + + # Clean workspace. + echo [-] Cleaning workspace + try_make clean > /dev/null + find . \( -name Makefile -o -name CMakeCache.txt -o -name CMakeFiles \) -exec rm -rf "{}" \; 2> /dev/null + rm -rf build + + # Determine available dynarec types for this architecture, and + # also specify ARCH right away to skip the arch_detect process. + case $arch in + # old dynarec available + 32 | x86) local cmake_flags_extra="$cmake_flags_extra -D ARCH=i386";; + 64 | x86_64) local cmake_flags_extra="$cmake_flags_extra -D ARCH=x86_64";; + # new dynarec only + arm32) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm";; + arm64) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm64";; + # no dynarec + *) local cmake_flags_extra="$cmake_flags_extra -D DYNAREC=OFF";; # no dynarec + esac + + # Run CMake. + echo [-] Running CMake + cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra -D BUILD_TYPE="alpha" -D EMU_BUILD="$build_qualifier" -D EMU_GIT_HASH="$git_hash" . + local status=$? + if [ $? -gt 0 ] + then + echo [!] CMake failed with status [$status] + return 3 + fi + + # Run actual build. + echo [-] Running build + try_make + local status=$? + if [ $status -gt 0 ] + then + echo [!] Make failed with status [$status] + return 4 + fi + + # Create temporary directory for archival. + echo [-] Gathering archive files + rm -rf archive_tmp + mkdir archive_tmp + if [ ! -d "archive_tmp" ] + then + echo [!] Archive directory creation failed + return 5 + fi + + # Archive the executable and its dependencies. + # The executable should always be archived last for the check after this block. + local status=$? + if is_windows + then + # Determine Program Files directory for Ghostscript and 7-Zip. + # Manual checks because MSYS is bad at passing the ProgramFiles variables. + pf="/c/Program Files" + sevenzip="$pf/7-Zip/7z.exe" + [ "$arch" = "32" -a -d "/c/Program Files (x86)" ] && pf="/c/Program Files (x86)" + + # Archive freetype from local MSYS installation. + ./.jenkins/static2dll.sh -p freetype2 /$MSYSTEM/lib/libfreetype.a archive_tmp/libfreetype-6.dll + + # Archive Ghostscript DLL from local official distribution installation. + for gs in "$pf"/gs/gs*.*.* + do + cp -p "$gs"/bin/gsdll*.dll archive_tmp/ + done + + # Archive Discord Game SDK DLL from their CDN. + discordarch= + [ "$arch" = "32" ] && discordarch=x86 + [ "$arch" = "64" ] && discordarch=x86_64 + if [ ! -z "$discordarch" ] + then + [ ! -e "discord_game_sdk.zip" ] && wget -qOdiscord_game_sdk.zip https://dl-game-sdk.discordapp.net/2.5.6/discord_game_sdk.zip + "$sevenzip" e -y -oarchive_tmp discord_game_sdk.zip lib/$discordarch/discord_game_sdk.dll + fi + + # Archive other DLLs from local directory. + cp -p /home/$project/dll$arch/* archive_tmp/ + + # Archive executable. + mv "$build_dir"/src/$project.exe archive_tmp/ + status=$? + elif is_mac + then + # TBD + : + else + # Archive readme with library package versions. + echo Libraries used to compile this $arch build of $project: > archive_tmp/README + dpkg-query -f '${Package} ${Version}\n' -W $libpkgs | sed "s/-dev / /g" | while IFS=" " read pkg version + do + for i in $(seq $(expr $longest_libpkg - $(echo -n $pkg | wc -c))) + do + echo -n " " >> archive_tmp/README + done + echo $pkg $version >> archive_tmp/README + done + + # Archive executable. + mv "$build_dir"/src/$project archive_tmp/ + status=$? + fi + + # Check if the executable move succeeded. + if [ $status -gt 0 ] + then + echo [!] Executable move failed with status [$status] + return 6 + fi + + # Produce artifact archive. + echo [-] Creating artifact archive + cd archive_tmp + if is_windows + then + # Create zip. + "$sevenzip" a -y -mx9 "..\\$job_name-Windows-$arch$build_fn.zip" * + local status=$? + elif is_mac + then + # TBD + : + else + # Create tarball. + tar Jcvf ../$job_name-Linux-$arch$build_fn.tar.xz --owner=0 --group=0 * # strip UID/GID metadata + local status=$? + fi + cd .. + + # Check if the archival succeeded. + if [ $status -gt 0 ] + then + echo [!] Artifact archive creation failed with status [$status] + return 7 + fi + + # All good. + echo [-] Build of [$job_name] [$build_number] [$git_hash] for [$arch] with flags [$cmake_flags] successful + job_exit=0 +} + +# Set common variables. +project=86Box +cwd=$(pwd) +first_build=1 +job_exit=1 + +# Parse arguments. +single_build=0 +args=0 +while [ $# -gt 0 ] +do + case $1 in + -b) + # Execute single build. + shift + [ -z "$JOB_BASE_NAME" ] && JOB_BASE_NAME=$project-Custom + single_build=1 + break + ;; + + *) + # Allow for manually specifying Jenkins variables. + if [ $args -eq 0 ] + then + JOB_BASE_NAME=$1 + args=1 + elif [ $args -eq 1 ] + then + BUILD_NUMBER=$1 + args=2 + elif [ $args -eq 2 ] + then + GIT_COMMIT=$1 + args=3 + fi + shift + ;; + esac +done + +# Check if at least the job name was specified. +if [ -z "$JOB_BASE_NAME" ] +then + echo [!] Manual usage: build.sh [{job_name} [{build_number|build_qualifier} [git_hash]]] [-b {architecture} [cmake_flags...]] + exit 100 +fi + +# Run single build if requested. +if [ $single_build -ne 0 ] +then + build $* + exit $? +fi + +# Run builds according to the Jenkins job name. +case $JOB_BASE_NAME in + $project | $project-TestBuildPleaseIgnore) + if is_windows + then + build 32 --preset=regular + elif is_mac + then + build Universal --preset=regular + else + build x86 --preset=regular + build x86_64 --preset=regular + build arm32 --preset=regular + build arm64 --preset=regular + fi + ;; + + $project-Debug) + if is_windows + then + build 32 --preset=debug + build 64 --preset=debug + elif is_mac + then + build Universal --preset=debug + else + build x86 --preset=debug + build x86_64 --preset=debug + build arm32 --preset=debug + build arm64 --preset=debug + fi + ;; + + $project-Dev) + if is_windows + then + build 32 --preset=experimental + build 64 --preset=experimental + elif is_mac + then + build Universal --preset=experimental + else + build x86 --preset=experimental + build x86_64 --preset=experimental + build arm32 --preset=experimental + build arm64 --preset=experimental + fi + ;; + + *) + echo Error: unknown job name $JOB_BASE_NAME + exit 1 + ;; +esac +exit $job_exit diff --git a/.jenkins/static2dll.sh b/.jenkins/static2dll.sh new file mode 100644 index 000000000..2148537d1 --- /dev/null +++ b/.jenkins/static2dll.sh @@ -0,0 +1,148 @@ +#!/bin/sh +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box distribution. +# +# Script for converting MinGW static libraries into a DLL. +# +# +# Authors: RichardG, +# +# Copyright 2021 RichardG. +# + +def_file="static2dll.def" +seen_file="static2dll.seen" +libs_file="static2dll.libs" + +find_lib() { + # Try to find a static library's file. + local msystem_lib="/$(echo $MSYSTEM | tr '[:upper:]' '[:lower:]')/lib/lib" + if [ -e "$msystem_lib$1.a" ] + then + echo "$msystem_lib$1.a" + elif [ -e "$msystem_lib$1.dll.a" ] + then + echo "$msystem_lib$1.dll.a" + else + # Return dynamic reference to the library. + echo "-l$1" + return 1 + fi +} + +add_lib() { + # Always make sure this lib is listed after the last lib that depends on it. + if grep -q -- '^'"$*"'$' "$libs_file" + then + cp "$libs_file" "$libs_file.tmp" + grep -v -- '^'"$*"'$' "$libs_file.tmp" > "$libs_file" + fi + echo "$*" >> "$libs_file" + + # Add libstdc++ in the end if required. + if echo "$*" | grep -q "/" + then + grep -Eq -- "__cxa_|__gxx_" "$1" 2> /dev/null && add_lib -static -lstdc++ + fi + + # Add libiconv for libintl. + if echo "$*" | grep -q "libintl" + then + add_lib $(find_lib iconv) + fi + + # Add libuuid for glib. + if echo "$*" | grep -q "libglib" + then + add_lib $(find_lib uuid) + fi +} + +parse_pkgconfig() { + # Parse arguments. + local layers=$1 + shift + local input_lib_name=$1 + shift + + # Don't process the same file again. + grep -q '^'$input_lib_name'$' "$seen_file" && return + echo $input_lib_name >> "$seen_file" + + echo "$layers" parse_pkgconfig $input_lib_name + + # Parse pkg-config arguments. + for arg in $* + do + local arg_base="$(echo $arg | cut -c1-2)" + if [ "x$arg_base" = "x-l" ] + then + # Don't process the same lib again. + local lib_name="$(echo $arg | cut -c3-)" + [ "x$lib_name" == "x$input_lib_name" ] && continue + + # Add lib path. + add_lib "$(find_lib $lib_name)" + + # Get this lib's dependencies through pkg-config. + local pkgconfig="$(pkg-config --static --libs "$lib_name" 2>/dev/null)" + [ $? -eq 0 ] && parse_pkgconfig "$layers"'>' "$lib_name" $pkgconfig || echo $lib_name >> "$seen_file" + elif [ "x$(echo $arg_base | cut -c1)" = "x-" ] + then + # Ignore other arguments. + continue + else + # Add lib path. + add_lib "$arg" + fi + done +} + +# Parse arguments. +case $1 in + -p) # -p pkg_config_name static_lib_path out_dll + shift + base_pkgconfig=$(pkg-config --static --libs "$1") + base_path="$2" + base_name="$1" + ;; + + *) # pc_path static_lib_path out_dll + base_pkgconfig="$(grep ^Libs.private: $1 | cut -d: -f2-)" + base_path="$2" + base_name="$2" + ;; +esac + +# Check arguments. +if [ -z "$base_pkgconfig" -o -z "$base_path" -o -z "$base_name" ] +then + echo Usage: + echo static2dll.sh -p {pkgconfig_package_name} {static_lib_path} {out_dll_name} + echo static2dll.sh {pc_file_path} {static_lib_path} {out_dll_name} + exit 1 +fi + +# Produce .def file. +echo LIBRARY $(basename "$3") > "$def_file" +echo EXPORTS >> "$def_file" +nm "$base_path" | grep " [TC] " | sed "/ _/s// /" | awk '{ print $3 }' >> "$def_file" + +# Parse dependencies recursively. +rm -f "$seen_file" "$libs_file" "$libs_file.tmp" +touch "$seen_file" "$libs_file" +parse_pkgconfig '>' $base_name $base_pkgconfig + +# Produce final DLL. +dllwrap --def "$def_file" -o "$3" -Wl,--allow-multiple-definition "$base_path" $(cat "$libs_file") +status=$? + +# Update final DLL timestamp. +touch -r "$base_path" "$3" + +exit $status From 70e2503fc7ec9521fe3cdae5c6045a6754100f43 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 22:56:48 -0300 Subject: [PATCH 024/159] Add build type to Jenkins flow --- .jenkins/Jenkinsfile | 24 ++++++++++++++++++++++++ .jenkins/build.sh | 14 +++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile index f0457e976..846c75a76 100644 --- a/.jenkins/Jenkinsfile +++ b/.jenkins/Jenkinsfile @@ -1,3 +1,20 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Jenkins build pipeline definition. + * + * + * + * Authors: RichardG, + * + * Copyright 2021 RichardG. + */ + def gitClone() { cleanWs() def scmVars = git url: 'https://github.com/richardg867/86Box.git', @@ -20,6 +37,13 @@ def saveArtifacts() { pipeline { agent any + parameters { + choice(name: 'BUILD_TYPE', + choices: ['none', 'alpha', 'beta', 'release'], + defaultValue: 'beta', + description: 'Build type to pass on to CMake. This may affect the UI icon and feature set.') + } + stages { stage('Build Windows') { steps { diff --git a/.jenkins/build.sh b/.jenkins/build.sh index f32793584..321e17fa4 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -116,7 +116,7 @@ build() { # Call build with the correct MSYSTEM. echo [-] Switching to MSYSTEM [$msys] cd "$cwd" - CHERE_INVOKING=yes MSYSTEM=$msys JOB_BASE_NAME=$JOB_BASE_NAME BUILD_NUMBER=$BUILD_NUMBER GIT_COMMIT=$GIT_COMMIT \ + CHERE_INVOKING=yes MSYSTEM=$msys JOB_BASE_NAME=$JOB_BASE_NAME BUILD_TYPE=$BUILD_TYPE BUILD_NUMBER=$BUILD_NUMBER GIT_COMMIT=$GIT_COMMIT \ bash -lc '"'$0'" -b "'$arch'" '$cmake_flags return $? fi @@ -213,7 +213,7 @@ EOF # Run CMake. echo [-] Running CMake - cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra -D BUILD_TYPE="alpha" -D EMU_BUILD="$build_qualifier" -D EMU_GIT_HASH="$git_hash" . + cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra -D BUILD_TYPE="$BUILD_TYPE" -D EMU_BUILD="$build_qualifier" -D EMU_GIT_HASH="$git_hash" . local status=$? if [ $? -gt 0 ] then @@ -364,12 +364,16 @@ do args=1 elif [ $args -eq 1 ] then - BUILD_NUMBER=$1 + BUILD_TYPE=$1 args=2 elif [ $args -eq 2 ] then - GIT_COMMIT=$1 + BUILD_NUMBER=$1 args=3 + elif [ $args -eq 3 ] + then + GIT_COMMIT=$1 + args=4 fi shift ;; @@ -379,7 +383,7 @@ done # Check if at least the job name was specified. if [ -z "$JOB_BASE_NAME" ] then - echo [!] Manual usage: build.sh [{job_name} [{build_number|build_qualifier} [git_hash]]] [-b {architecture} [cmake_flags...]] + echo [!] Manual usage: build.sh [{job_name} [{build_type} [{build_number|build_qualifier} [git_hash]]]] [-b {architecture} [cmake_flags...]] exit 100 fi From a0c27de4d97f0955779d64e6ba76c5a993a4fec7 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 22:59:18 -0300 Subject: [PATCH 025/159] Fix Jenkins build type choice --- .jenkins/Jenkinsfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile index 846c75a76..aa084ef49 100644 --- a/.jenkins/Jenkinsfile +++ b/.jenkins/Jenkinsfile @@ -39,8 +39,7 @@ pipeline { parameters { choice(name: 'BUILD_TYPE', - choices: ['none', 'alpha', 'beta', 'release'], - defaultValue: 'beta', + choices: ['beta', 'none', 'alpha', 'beta', 'release'], // duplicated on purpose, first is default description: 'Build type to pass on to CMake. This may affect the UI icon and feature set.') } From 703aa87cbf4fde8f12ef47655562c92cccafe24b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:15:39 -0300 Subject: [PATCH 026/159] Fix VIA AC97 warning --- src/sound/snd_ac97_via.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index 1707c0c9a..2ca80e538 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -176,7 +176,8 @@ 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) +{ /* Get primary audio codec. */ ac97_codec_t *codec = dev->codec[0][0]; @@ -378,16 +379,16 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) if (val & 1) { /* return 0x00 on unaligned reads */ dev->sgd_regs[0x80] = dev->sgd_regs[0x81] = 0x00; } else { - dev->sgd_regs[0x80] = dev->codec_shadow[modem].regs_codec[i][val] = ac97_codec_read(codec, val); - dev->sgd_regs[0x81] = dev->codec_shadow[modem].regs_codec[i][val | 1] = ac97_codec_read(codec, val | 1); + dev->sgd_regs[0x80] = dev->codec_shadow[modem].regs_codec[i][(val & 0x7f)] = ac97_codec_read(codec, val); + dev->sgd_regs[0x81] = dev->codec_shadow[modem].regs_codec[i][(val & 0x7f) | 1] = ac97_codec_read(codec, val | 1); } /* Flag data/status/index for this codec as valid. */ if (val & 0x80) dev->sgd_regs[0x83] |= 0x02 << (i << 1); } else if (!(val & 1)) { /* do nothing on unaligned writes */ - ac97_codec_write(codec, val, dev->codec_shadow[modem].regs_codec[i][val] = dev->sgd_regs[0x80]); - ac97_codec_write(codec, val | 1, dev->codec_shadow[modem].regs_codec[i][val | 1] = dev->sgd_regs[0x81]); + ac97_codec_write(codec, val, dev->codec_shadow[modem].regs_codec[i][(val & 0x7f)] = dev->sgd_regs[0x80]); + ac97_codec_write(codec, val | 1, dev->codec_shadow[modem].regs_codec[i][(val & 0x7f) | 1] = dev->sgd_regs[0x81]); /* Update primary audio codec state if that codec was written to. */ if (!modem && !i) From 1b4745847baffc5f449241afbc8145f07330eafd Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:17:17 -0300 Subject: [PATCH 027/159] Attempt to fix Jenkins build script exit code issue --- .jenkins/Jenkinsfile | 2 +- .jenkins/build.sh | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile index aa084ef49..a1b24438d 100644 --- a/.jenkins/Jenkinsfile +++ b/.jenkins/Jenkinsfile @@ -23,7 +23,7 @@ def gitClone() { } def windowsBuild() { - bat 'C:\\msys64\\msys2_shell.cmd -msys2 -defterm -here -no-start -c .jenkins/build.sh' + bat 'C:\\msys64\\msys2_shell.cmd -msys2 -defterm -here -no-start -c "exec .jenkins/build.sh"' } def unixBuild() { diff --git a/.jenkins/build.sh b/.jenkins/build.sh index 321e17fa4..c78f56ee8 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -208,12 +208,13 @@ EOF arm32) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm";; arm64) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm64";; # no dynarec - *) local cmake_flags_extra="$cmake_flags_extra -D DYNAREC=OFF";; # no dynarec + *) local cmake_flags_extra="$cmake_flags_extra -D DYNAREC=OFF";; esac # Run CMake. - echo [-] Running CMake - cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra -D BUILD_TYPE="$BUILD_TYPE" -D EMU_BUILD="$build_qualifier" -D EMU_GIT_HASH="$git_hash" . + cmake_flags_extra="$cmake_flags_extra -D BUILD_TYPE=\"$BUILD_TYPE\" -D EMU_BUILD=\"$build_qualifier\" -D EMU_GIT_HASH=\"$git_hash\"" + echo [-] Running CMake with flags [$cmake_flags $cmake_flags_extra] + cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra . local status=$? if [ $? -gt 0 ] then @@ -333,7 +334,7 @@ EOF # All good. echo [-] Build of [$job_name] [$build_number] [$git_hash] for [$arch] with flags [$cmake_flags] successful - job_exit=0 + export job_exit=0 } # Set common variables. @@ -444,8 +445,11 @@ case $JOB_BASE_NAME in ;; *) - echo Error: unknown job name $JOB_BASE_NAME + echo [!] Unknown job name $JOB_BASE_NAME exit 1 ;; esac + +echo +echo [-] Exiting with code [$job_exit] exit $job_exit From 0cbf23fda33feb51ceb74aae2943dd78c4e17475 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:22:19 -0300 Subject: [PATCH 028/159] Fix CMake quoting issue in Jenkins build flow --- .jenkins/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.jenkins/build.sh b/.jenkins/build.sh index c78f56ee8..816bb3a2d 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -214,7 +214,7 @@ EOF # Run CMake. cmake_flags_extra="$cmake_flags_extra -D BUILD_TYPE=\"$BUILD_TYPE\" -D EMU_BUILD=\"$build_qualifier\" -D EMU_GIT_HASH=\"$git_hash\"" echo [-] Running CMake with flags [$cmake_flags $cmake_flags_extra] - cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra . + eval cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra . local status=$? if [ $? -gt 0 ] then From 74ec220a370c4100416af08094ce43a108ea6973 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:23:13 -0300 Subject: [PATCH 029/159] *Actually* fix CMake quoting issue --- .jenkins/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.jenkins/build.sh b/.jenkins/build.sh index 816bb3a2d..e0f783db7 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -214,7 +214,7 @@ EOF # Run CMake. cmake_flags_extra="$cmake_flags_extra -D BUILD_TYPE=\"$BUILD_TYPE\" -D EMU_BUILD=\"$build_qualifier\" -D EMU_GIT_HASH=\"$git_hash\"" echo [-] Running CMake with flags [$cmake_flags $cmake_flags_extra] - eval cmake -G "Unix Makefiles" $cmake_flags $cmake_flags_extra . + eval cmake -G \"Unix Makefiles\" $cmake_flags $cmake_flags_extra . local status=$? if [ $? -gt 0 ] then From 3b450932219d28fec71921872e420b18f0a2aa68 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:25:34 -0300 Subject: [PATCH 030/159] Add potential future Windows build targets to Jenkins dynarec check --- .jenkins/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.jenkins/build.sh b/.jenkins/build.sh index e0f783db7..66a0aed0b 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -205,8 +205,8 @@ EOF 32 | x86) local cmake_flags_extra="$cmake_flags_extra -D ARCH=i386";; 64 | x86_64) local cmake_flags_extra="$cmake_flags_extra -D ARCH=x86_64";; # new dynarec only - arm32) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm";; - arm64) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm64";; + ARM32 | arm32) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm";; + ARM64 | arm64) local cmake_flags_extra="$cmake_flags_extra -D NEW_DYNAREC=ON -D ARCH=arm64";; # no dynarec *) local cmake_flags_extra="$cmake_flags_extra -D DYNAREC=OFF";; esac From e75376b4844ac30f0e1aa69b7c4ba911a58c1d44 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:34:15 -0300 Subject: [PATCH 031/159] Improvements to Jenkins CMake flow, and fix MSYS-switching exit code bug --- .jenkins/build.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.jenkins/build.sh b/.jenkins/build.sh index 66a0aed0b..abe117466 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -65,6 +65,7 @@ build() { # Set argument and environment variables. local job_name=$JOB_BASE_NAME + local build_type=$BUILD_TYPE local build_number=$BUILD_NUMBER local git_hash=$(echo $GIT_COMMIT | cut -c1-7) local arch=$1 @@ -117,8 +118,7 @@ build() { echo [-] Switching to MSYSTEM [$msys] cd "$cwd" CHERE_INVOKING=yes MSYSTEM=$msys JOB_BASE_NAME=$JOB_BASE_NAME BUILD_TYPE=$BUILD_TYPE BUILD_NUMBER=$BUILD_NUMBER GIT_COMMIT=$GIT_COMMIT \ - bash -lc '"'$0'" -b "'$arch'" '$cmake_flags - return $? + bash -lc '"'$0'" -b "'$arch'" '$cmake_flags && job_exit=0 fi else echo [!] No MSYSTEM for architecture [$arch] @@ -211,8 +211,12 @@ EOF *) local cmake_flags_extra="$cmake_flags_extra -D DYNAREC=OFF";; esac + # Determine additional CMake flags. + [ ! -z "$build_type" ] && local cmake_flags_extra="$cmake_flags_extra -D BUILD_TYPE=\"$build_type\"" + [ ! -z "$build_qualifier" ] && local cmake_flags_extra="$cmake_flags_extra -D EMU_BUILD=\"$build_qualifier\"" + [ ! -z "$git_hash" ] && local cmake_flags_extra="$cmake_flags_extra -D EMU_GIT_HASH=\"$git_hash\"" + # Run CMake. - cmake_flags_extra="$cmake_flags_extra -D BUILD_TYPE=\"$BUILD_TYPE\" -D EMU_BUILD=\"$build_qualifier\" -D EMU_GIT_HASH=\"$git_hash\"" echo [-] Running CMake with flags [$cmake_flags $cmake_flags_extra] eval cmake -G \"Unix Makefiles\" $cmake_flags $cmake_flags_extra . local status=$? @@ -334,7 +338,7 @@ EOF # All good. echo [-] Build of [$job_name] [$build_number] [$git_hash] for [$arch] with flags [$cmake_flags] successful - export job_exit=0 + job_exit=0 } # Set common variables. From 786b294bb09b00dbbfb80d227c680a686e901c58 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:35:42 -0300 Subject: [PATCH 032/159] Re-add missing return statement --- .jenkins/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.jenkins/build.sh b/.jenkins/build.sh index abe117466..f56152dd0 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -119,6 +119,7 @@ build() { cd "$cwd" CHERE_INVOKING=yes MSYSTEM=$msys JOB_BASE_NAME=$JOB_BASE_NAME BUILD_TYPE=$BUILD_TYPE BUILD_NUMBER=$BUILD_NUMBER GIT_COMMIT=$GIT_COMMIT \ bash -lc '"'$0'" -b "'$arch'" '$cmake_flags && job_exit=0 + return $? fi else echo [!] No MSYSTEM for architecture [$arch] From e0c2d2f30bba6215475c7f22fb30da1d9fc30ed8 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:36:49 -0300 Subject: [PATCH 033/159] Use exec when jumping between MSYSTEMs to preserve exit code --- .jenkins/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.jenkins/build.sh b/.jenkins/build.sh index f56152dd0..db71e3e98 100644 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -118,7 +118,7 @@ build() { echo [-] Switching to MSYSTEM [$msys] cd "$cwd" CHERE_INVOKING=yes MSYSTEM=$msys JOB_BASE_NAME=$JOB_BASE_NAME BUILD_TYPE=$BUILD_TYPE BUILD_NUMBER=$BUILD_NUMBER GIT_COMMIT=$GIT_COMMIT \ - bash -lc '"'$0'" -b "'$arch'" '$cmake_flags && job_exit=0 + bash -lc 'exec "'$0'" -b "'$arch'" '$cmake_flags && job_exit=0 # make sure the main script exits cleanly on any success return $? fi else From 02df33d1aae945e10c9ba2d09bff8502aa5f9b4c Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 8 Nov 2021 23:54:41 -0300 Subject: [PATCH 034/159] Change some dynamically loaded library names to reflect the new build infrastructure --- src/printer/prt_escp.c | 2 +- src/printer/prt_ps.c | 12 ++++++++---- src/sound/midi_fluidsynth.c | 6 +++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index 8e490e9e1..1cd3b8ebe 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -87,7 +87,7 @@ #ifdef _WIN32 -# define PATH_FREETYPE_DLL "freetype.dll" +# define PATH_FREETYPE_DLL "libfreetype-6.dll" #else # define PATH_FREETYPE_DLL "libfreetype.so.6" #endif diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index 5f16784cb..73bd56b63 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -44,11 +44,15 @@ #define gs_error_Quit -101 #ifdef _WIN32 -#define PATH_GHOSTSCRIPT_DLL "gsdll32.dll" +#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)) +# define PATH_GHOSTSCRIPT_DLL "gsdll32.dll" +#else +# define PATH_GHOSTSCRIPT_DLL "gsdll64.dll" +#endif #elif defined __APPLE__ #define PATH_GHOSTSCRIPT_DLL "libgs.dylib" #else -#define PATH_GHOSTSCRIPT_DLL "libgs.so" +#define PATH_GHOSTSCRIPT_DLL "libgs.so.9" #endif #define POSTSCRIPT_BUFFER_LENGTH 65536 @@ -344,8 +348,6 @@ ps_init(void *lpt) dev->ctrl = 0x04; dev->lpt = lpt; - reset_ps(dev); - /* Try loading the DLL. */ ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL, ghostscript_imports); if (ghostscript_handle == NULL) @@ -369,6 +371,8 @@ ps_init(void *lpt) timer_add(&dev->pulse_timer, pulse_timer, dev, 0); timer_add(&dev->timeout_timer, timeout_timer, dev, 0); + reset_ps(dev); + return(dev); } diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c index 874d328f3..283188fef 100644 --- a/src/sound/midi_fluidsynth.c +++ b/src/sound/midi_fluidsynth.c @@ -224,11 +224,15 @@ void* fluidsynth_init(const device_t *info) /* Try loading the DLL. */ #ifdef _WIN32 +# if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)) fluidsynth_handle = dynld_module("libfluidsynth.dll", fluidsynth_imports); +# else + fluidsynth_handle = dynld_module("libfluidsynth64.dll", fluidsynth_imports); +# endif #elif defined __APPLE__ fluidsynth_handle = dynld_module("libfluidsynth.dylib", fluidsynth_imports); #else - fluidsynth_handle = dynld_module("libfluidsynth.so", fluidsynth_imports); + fluidsynth_handle = dynld_module("libfluidsynth.so.3", fluidsynth_imports); #endif if (fluidsynth_handle == NULL) { From 9914ad520c5bb7ac79bddf457b2b23174bd4047e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Tue, 9 Nov 2021 18:53:15 +0100 Subject: [PATCH 035/159] Multiple language-related updates Add the possibility to change runtime language, via --lang parameter. Also specify the verbose language code in the Hungarian translation. --- src/86box.c | 13 +++++++++++++ src/include/86box/plat.h | 1 + src/unix/unix.c | 8 ++++++++ src/win/languages/hu-HU.rc | 2 +- src/win/win.c | 17 +++++++++++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/86box.c b/src/86box.c index eca8544a5..a3ddd43ae 100644 --- a/src/86box.c +++ b/src/86box.c @@ -433,6 +433,7 @@ usage: #endif printf("-F or --fullscreen - start in fullscreen mode\n"); #ifdef _WIN32 + printf("-G or --lang langid - start the application with the specified language\n"); printf("-H or --hwnd id,hwnd - sends back the main dialog's hwnd\n"); #endif printf("-L or --logfile path - set 'path' to be the logfile\n"); @@ -512,6 +513,18 @@ usage: uid = (uint32_t *) &unique_id; shwnd = (uint32_t *) &source_hwnd; sscanf(argv[++c], "%08X%08X,%08X%08X", uid + 1, uid, shwnd + 1, shwnd); + } else if (!strcasecmp(argv[c], "--lang") || + !strcasecmp(argv[c], "-G")) { + + + //This function is currently unimplemented for *nix. + + if (!plat_set_language(argv[++c])) + printf("\nWarning: Invalid language code, ignoring --lang parameter.\n\n"); + + //The return value of 0 only means that the code is invalid, + // not related to that translation is exists or not for the + // selected language. #endif } else if (!strcasecmp(argv[c], "--test")) { /* some (undocumented) test function here.. */ diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index d413add7d..e28a40fc7 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -121,6 +121,7 @@ extern void plat_setfullscreen(int on); extern void plat_resize(int x, int y); extern void plat_vidapi_enable(int enabled); extern void plat_vid_reload_options(void); +extern int plat_set_language(char* langcode); /* Resource management. */ extern void set_language(int id); diff --git a/src/unix/unix.c b/src/unix/unix.c index 286b937bd..7683dcd67 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1220,6 +1220,14 @@ char* plat_vidapi_name(int i) { return "default"; } + +/* Sets up the program language before initialization. */ +int plat_set_language(char* langcode) +{ + /* or maybe not */ + return 0; +} + void joystick_init(void) {} void joystick_close(void) {} void joystick_process(void) {} diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 68a25c27e..f8fdbc41d 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -5,7 +5,7 @@ // #ifdef _WIN32 -LANGUAGE 0x0E,0x01 +LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT #pragma code_page(65001) #endif //_WIN32 diff --git a/src/win/win.c b/src/win/win.c index 6e397b98f..30f3412d9 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -1163,6 +1163,23 @@ plat_vid_reload_options(void) vid_apis[vid_api].reload(); } +/* Sets up the program language before initialization. */ +int +plat_set_language(char* langcode) +{ + int len = mbstoc16s(NULL, langcode, 0) + 1; + wchar_t *temp = malloc(len * sizeof(wchar_t)); + mbstoc16s(temp, langcode, len); + + LCID lcid = LocaleNameToLCID((LPWSTR)temp, 0); + + free(temp); + + if (lcid) + return (SetThreadUILanguage(lcid) == lcid); + else + return 0; +} void take_screenshot(void) From e2bdeae4ccb5a3b845e9c34987aa041d200883c2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 9 Nov 2021 19:50:42 +0100 Subject: [PATCH 036/159] Bugfixes to prepare for localization. --- src/win/win.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/win/win.c b/src/win/win.c index 6e397b98f..591caecac 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -74,16 +74,16 @@ volatile int cpu_thread_run = 1; /* Local data. */ static HANDLE thMain; -static rc_str_t *lpRCstr2048, - *lpRCstr4096, - *lpRCstr4352, - *lpRCstr4608, - *lpRCstr5120, - *lpRCstr5376, - *lpRCstr5632, - *lpRCstr5888, - *lpRCstr6144, - *lpRCstr7168; +static rc_str_t *lpRCstr2048 = NULL, + *lpRCstr4096 = NULL, + *lpRCstr4352 = NULL, + *lpRCstr4608 = NULL, + *lpRCstr5120 = NULL, + *lpRCstr5376 = NULL, + *lpRCstr5632 = NULL, + *lpRCstr5888 = NULL, + *lpRCstr6144 = NULL, + *lpRCstr7168 = NULL; static int vid_api_inited = 0; static char *argbuf; static int first_use = 1; @@ -139,11 +139,31 @@ win_log(const char *fmt, ...) #endif +free_string(rc_str_t **str) +{ + if (*str != NULL) { + free(*str); + *str = NULL; + } +} + + static void LoadCommonStrings(void) { int i; + free_string(&lpRCstr7168); + free_string(&lpRCstr6144); + free_string(&lpRCstr5888); + free_string(&lpRCstr5632); + free_string(&lpRCstr5376); + free_string(&lpRCstr5120); + free_string(&lpRCstr4608); + free_string(&lpRCstr4352); + free_string(&lpRCstr4096); + free_string(&lpRCstr2048); + lpRCstr2048 = (rc_str_t *)malloc(STR_NUM_2048*sizeof(rc_str_t)); lpRCstr4096 = (rc_str_t *)malloc(STR_NUM_4096*sizeof(rc_str_t)); lpRCstr4352 = (rc_str_t *)malloc(STR_NUM_4352*sizeof(rc_str_t)); From c892c521ea642cd5c406f5a6eab7159ba9f871bd Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 9 Nov 2021 19:57:38 +0100 Subject: [PATCH 037/159] More preparation for localization. --- src/include/86box/win.h | 1 + src/win/win.c | 9 +++++++++ src/win/win_settings.c | 12 ++++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 079463214..a986456d9 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -129,6 +129,7 @@ extern void do_start(void); extern void do_stop(void); /* Internal platform support functions. */ +extern int has_language_changed(int id); extern void set_language(int id); extern int get_vidpause(void); extern void show_cursor(int); diff --git a/src/win/win.c b/src/win/win.c index 591caecac..d7094ec50 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -241,6 +241,15 @@ size_t c16stombs(char dst[], const uint16_t src[], int len) } +int +has_language_changed(int id) +{ + LCID lcidNew = MAKELCID(id, dwSubLangID); + + return (lang_id != lcidNew); +} + + /* Set (or re-set) the language for the application. */ void set_language(int id) diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 668487d00..e8e4f831a 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -77,6 +77,9 @@ static int first_cat = 0; static int dpi = 96; +/* Language */ +static int temp_language; + /* Machine category */ static int temp_machine_type, temp_machine, temp_cpu, temp_wait_states, temp_fpu, temp_sync; static cpu_family_t *temp_cpu_f; @@ -322,6 +325,9 @@ win_settings_init(void) { int i = 0; + /* Language */ + // TODO: Set temp_language here. + /* Machine category */ temp_machine_type = machines[machine].type; temp_machine = machine; @@ -447,6 +453,9 @@ win_settings_changed(void) { int i = 0, j = 0; + /* Language */ + // i = i || has_language_changed(temp_language); + /* Machine category */ i = i || (machine != temp_machine); i = i || (cpu_f != temp_cpu_f); @@ -537,6 +546,9 @@ win_settings_save(void) pc_reset_hard_close(); + /* Language */ + // set_language(temp_language); + /* Machine category */ machine = temp_machine; cpu_f = temp_cpu_f; From 0b1b116061f5e1146e6adf5eb67b58d82b445367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Tue, 9 Nov 2021 20:02:52 +0100 Subject: [PATCH 038/159] Enable the disabled language ComboBox in the settings dialog --- src/include/86box/resource.h | 3 --- src/win/languages/en-US.rc | 3 --- src/win/languages/hu-HU.rc | 3 --- 3 files changed, 9 deletions(-) diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 7168ce5ba..eaadaccd6 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -122,10 +122,7 @@ #define IDC_RADIO_TS_DISABLED 1006 #define IDC_RADIO_TS_LOCAL 1007 #define IDC_RADIO_TS_UTC 1008 -/* Leave this as is until we finally get into localization in 86Box 3.00(?). */ -#if 0 #define IDC_COMBO_LANG 1009 -#endif #define IDC_COMBO_MACHINE_TYPE 1010 #define IDC_COMBO_MACHINE 1011 /* machine/cpu config */ diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 8a0b4d9ab..4f05cb841 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -320,12 +320,9 @@ BEGIN CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -/* Leave this commented out until we get into localization. */ -#if 0 LTEXT "Language:",IDT_1700,7,237,41,10 COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP -#endif END DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index f8fdbc41d..3514d391e 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -323,12 +323,9 @@ BEGIN CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -/* Leave this commented out until we get into localization. */ -#if 0 LTEXT "Nyelv:",IDT_1700,7,237,41,10 COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP -#endif END DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 From 5616ffbed2850bfc661b92f853028d4058365960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Tue, 9 Nov 2021 20:36:07 +0100 Subject: [PATCH 039/159] Populate the languages ComboBox on-fly --- src/win/win_settings.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/win/win_settings.c b/src/win/win_settings.c index e8e4f831a..c760302e0 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -318,6 +318,22 @@ settings_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn return(i); } +BOOL CALLBACK +EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam) +{ + wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1]; + LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0); + SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)temp); + return 1; +} + +/* Load available languages */ +static void +win_fill_languages(HWND hdlg) +{ + SendMessage(GetDlgItem(hdlg, IDC_COMBO_LANG), CB_GETCURSEL, 0, 0); + EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)GetDlgItem(hdlg, IDC_COMBO_LANG)); +} /* This does the initial read of global variables into the temporary ones. */ static void @@ -326,7 +342,7 @@ win_settings_init(void) int i = 0; /* Language */ - // TODO: Set temp_language here. + win_fill_languages(hwndParentDialog); /* Machine category */ temp_machine_type = machines[machine].type; From 11527d39b0f8d30ee0349913a2d325402473d28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Tue, 9 Nov 2021 20:50:38 +0100 Subject: [PATCH 040/159] Select the current language in the ComboBox, and change it's style --- src/win/languages/en-US.rc | 2 +- src/win/languages/hu-HU.rc | 2 +- src/win/win_settings.c | 16 ++++++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 4f05cb841..e08aad513 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -321,7 +321,7 @@ BEGIN LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 LTEXT "Language:",IDT_1700,7,237,41,10 - COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWN | WS_VSCROLL | + COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 3514d391e..bd9e7425a 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -324,7 +324,7 @@ BEGIN LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 LTEXT "Nyelv:",IDT_1700,7,237,41,10 - COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWN | WS_VSCROLL | + COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END diff --git a/src/win/win_settings.c b/src/win/win_settings.c index c760302e0..e46037e4d 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -318,12 +318,19 @@ settings_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn return(i); } +int enum_helper = -1, c = 0; + BOOL CALLBACK EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam) { wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1]; LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0); SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)temp); + + if (wIDLanguage == temp_language) + enum_helper = c; + + c++; return 1; } @@ -331,8 +338,13 @@ EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLan static void win_fill_languages(HWND hdlg) { - SendMessage(GetDlgItem(hdlg, IDC_COMBO_LANG), CB_GETCURSEL, 0, 0); - EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)GetDlgItem(hdlg, IDC_COMBO_LANG)); + temp_language = GetThreadUILanguage(); + HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG); + + SendMessage(lang_combo, CB_RESETCONTENT, 0, 0); + EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo); + + SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0); } /* This does the initial read of global variables into the temporary ones. */ From dafc429e934b37abf12a8ad7f7d7600612476610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Tue, 9 Nov 2021 22:33:54 +0100 Subject: [PATCH 041/159] A lot of changes - Fix the broken itemindex of ComboBox in the Settings dialog - Change from LCID to uint32_t - Rewrite the headers of the lang related functions (can handle the whole LCID as input) - Add dummy functions to unix.c - Add proper combobox handling in win_settings.c - Added a lot of debug calls temporarily - Reactivate every disabled option related to language changes - Move lang_id to 86box.h from win.h - Implement on-fly resource switch as discussed with OBattler - Reimplement everything language related in the initialization section of the program - Implemented the ladder of three points 1, what is the --lang? 2, what are definied in the config? (to be implemented) 3, what is the system language --- src/86box.c | 21 +++++++++++++--- src/include/86box/86box.h | 2 ++ src/include/86box/plat.h | 5 ++-- src/include/86box/win.h | 6 ++--- src/unix/unix.c | 9 ++++++- src/win/win.c | 50 ++++++++++++++++++--------------------- src/win/win_settings.c | 28 +++++++++++++++++----- 7 files changed, 79 insertions(+), 42 deletions(-) diff --git a/src/86box.c b/src/86box.c index a3ddd43ae..c67d01ff8 100644 --- a/src/86box.c +++ b/src/86box.c @@ -17,6 +17,7 @@ * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2021 Laci bá' */ #include #include @@ -395,7 +396,8 @@ pc_init(int argc, char *argv[]) int c, vmrp = 0; int ng = 0, lvmp = 0; uint32_t *uid, *shwnd; - + uint32_t lang_init = 0; + /* Grab the executable's full path. */ plat_get_exe_name(exe_path, sizeof(exe_path)-1); p = plat_get_filename(exe_path); @@ -519,7 +521,8 @@ usage: //This function is currently unimplemented for *nix. - if (!plat_set_language(argv[++c])) + lang_init = plat_language_code(argv[++c]); + if (!lang_init) printf("\nWarning: Invalid language code, ignoring --lang parameter.\n\n"); //The return value of 0 only means that the code is invalid, @@ -702,7 +705,19 @@ usage: /* Load the configuration file. */ config_load(); - + + /* Load the desired language */ + pclog("lang_init %u, lang_id: %u\n", lang_init, lang_id); + if (lang_init) + lang_id = lang_init; + + pclog("lang_init %u, lang_id: %u\n", lang_init, lang_id); + lang_init = lang_id; + lang_id = 0; + if (lang_init) + set_language(lang_init); + + pclog("lang_init %u, lang_id: %u\n", lang_init, lang_id); /* All good! */ return(1); } diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 4066036b4..a49fb198f 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -15,6 +15,7 @@ * * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2021 Laci bá' */ #ifndef EMU_86BOX_H # define EMU_86BOX_H @@ -90,6 +91,7 @@ extern int window_w, window_h, /* (C) window size and */ vid_resize, /* (C) allow resizing */ invert_display, /* (C) invert the display */ suppress_overscan; /* (C) suppress overscans */ +extern uint32_t lang_id; /* (C) language code identifier */ extern int scale; /* (C) screen scale factor */ extern int dpi_scale; /* (C) DPI scaling of the emulated screen */ extern int vid_api; /* (C) video renderer */ diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index e28a40fc7..148b396c3 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -15,6 +15,7 @@ * * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2021 Laci bá' */ #ifndef EMU_PLAT_H # define EMU_PLAT_H @@ -121,10 +122,10 @@ extern void plat_setfullscreen(int on); extern void plat_resize(int x, int y); extern void plat_vidapi_enable(int enabled); extern void plat_vid_reload_options(void); -extern int plat_set_language(char* langcode); +extern uint32_t plat_language_code(char* langcode); /* Resource management. */ -extern void set_language(int id); +extern void set_language(uint32_t id); extern wchar_t *plat_get_string(int id); diff --git a/src/include/86box/win.h b/src/include/86box/win.h index a986456d9..da4d9fb05 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -17,6 +17,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2021 Laci bá' */ #ifndef PLAT_WIN_H # define PLAT_WIN_H @@ -105,7 +106,6 @@ extern HINSTANCE hinstance; extern HWND hwndMain, hwndRender; extern HANDLE ghMutex; -extern LCID lang_id; extern HICON hIcon[256]; extern RECT oldclip; extern int sbar_height, user_resize; @@ -129,8 +129,8 @@ extern void do_start(void); extern void do_stop(void); /* Internal platform support functions. */ -extern int has_language_changed(int id); -extern void set_language(int id); +extern int has_language_changed(uint32_t id); +extern void set_language(uint32_t id); extern int get_vidpause(void); extern void show_cursor(int); diff --git a/src/unix/unix.c b/src/unix/unix.c index 7683dcd67..4a15dbfb7 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1221,8 +1221,15 @@ char* plat_vidapi_name(int i) return "default"; } +void +set_language(uint32_t id) +{ + lang_id = id; +} + + /* Sets up the program language before initialization. */ -int plat_set_language(char* langcode) +uint32_t plat_language_code(char* langcode) { /* or maybe not */ return 0; diff --git a/src/win/win.c b/src/win/win.c index 30a73d048..1aa25a8c9 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -17,6 +17,7 @@ * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2017-2019 Fred N. van Kempen. + * Copyright 2021 Laci bá' */ #define UNICODE #define NTDDI_VERSION 0x06010000 @@ -66,7 +67,7 @@ typedef struct { /* Platform Public data, specific. */ HINSTANCE hinstance; /* application instance */ HANDLE ghMutex; -LCID lang_id; /* current language ID used */ +uint32_t lang_id; /* current language ID used */ DWORD dwSubLangID; int acp_utf8; /* Windows supports UTF-8 codepage */ volatile int cpu_thread_run = 1; @@ -138,7 +139,7 @@ win_log(const char *fmt, ...) #define win_log(fmt, ...) #endif - +void free_string(rc_str_t **str) { if (*str != NULL) { @@ -242,29 +243,28 @@ size_t c16stombs(char dst[], const uint16_t src[], int len) int -has_language_changed(int id) +has_language_changed(uint32_t id) { - LCID lcidNew = MAKELCID(id, dwSubLangID); - - return (lang_id != lcidNew); + pclog("has_language_changed? lang_id:%u == id:%u?\n", lang_id, id); + return (lang_id != id); } /* Set (or re-set) the language for the application. */ void -set_language(int id) +set_language(uint32_t id) { - LCID lcidNew = MAKELCID(id, dwSubLangID); + pclog("set_language %u, lang_id %u\n", id, lang_id); + if (lang_id != id) { + /* Set our new language ID. */ + lang_id = id; + SetThreadUILanguage(lang_id); + + SetMenu(hwndMain, LoadMenu(hinstance, L"MainMenu")); - if (lang_id != lcidNew) { - /* Set our new language ID. */ - lang_id = lcidNew; - - SetThreadLocale(lang_id); - - /* Load the strings table for this ID. */ - LoadCommonStrings(); - } + /* Load the strings table for this ID. */ + LoadCommonStrings(); + } } @@ -464,9 +464,9 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) /* Set the application version ID string. */ sprintf(emu_version, "%s v%s", EMU_NAME, EMU_VERSION); - - /* First, set our (default) language. */ - set_language(0x0409); + + /* First, set our (default) language. */ + set_language(GetThreadUILanguage()); /* Process the command line for options. */ argc = ProcessCommandLine(&argv); @@ -1193,8 +1193,8 @@ plat_vid_reload_options(void) } /* Sets up the program language before initialization. */ -int -plat_set_language(char* langcode) +uint32_t +plat_language_code(char* langcode) { int len = mbstoc16s(NULL, langcode, 0) + 1; wchar_t *temp = malloc(len * sizeof(wchar_t)); @@ -1203,11 +1203,7 @@ plat_set_language(char* langcode) LCID lcid = LocaleNameToLCID((LPWSTR)temp, 0); free(temp); - - if (lcid) - return (SetThreadUILanguage(lcid) == lcid); - else - return 0; + return lcid; } void diff --git a/src/win/win_settings.c b/src/win/win_settings.c index e46037e4d..1a1aa12a1 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -15,6 +15,7 @@ * * Copyright 2016-2019 Miran Grca. * Copyright 2018,2019 David Hrdlička. + * Copyright 2021 Laci bá' */ #define UNICODE #define BITMAP WINDOWS_BITMAP @@ -78,7 +79,7 @@ static int first_cat = 0; static int dpi = 96; /* Language */ -static int temp_language; +static LCID temp_language; /* Machine category */ static int temp_machine_type, temp_machine, temp_cpu, temp_wait_states, temp_fpu, temp_sync; @@ -318,7 +319,7 @@ settings_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn return(i); } -int enum_helper = -1, c = 0; +int enum_helper, c; BOOL CALLBACK EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam) @@ -326,11 +327,13 @@ EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLan wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1]; LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0); SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)temp); + SendMessage((HWND)lParam, CB_SETITEMDATA, c, (LPARAM)wIDLanguage); - if (wIDLanguage == temp_language) + pclog("widl: %u, langid: %u, c: %u\n", wIDLanguage, lang_id, c); + if (wIDLanguage == lang_id) enum_helper = c; - c++; + return 1; } @@ -342,9 +345,13 @@ win_fill_languages(HWND hdlg) HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG); SendMessage(lang_combo, CB_RESETCONTENT, 0, 0); + + enum_helper = -1; c = 0; EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo); + pclog("enum_helper is %d\n", enum_helper); SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0); + pclog("win_fill_languages\n"); } /* This does the initial read of global variables into the temporary ones. */ @@ -354,6 +361,8 @@ win_settings_init(void) int i = 0; /* Language */ + temp_language = lang_id; + pclog("temp_language is %u\n", lang_id); win_fill_languages(hwndParentDialog); /* Machine category */ @@ -482,7 +491,7 @@ win_settings_changed(void) int i = 0, j = 0; /* Language */ - // i = i || has_language_changed(temp_language); + i = i || has_language_changed(temp_language); /* Machine category */ i = i || (machine != temp_machine); @@ -575,7 +584,7 @@ win_settings_save(void) pc_reset_hard_close(); /* Language */ - // set_language(temp_language); + set_language(temp_language); /* Machine category */ machine = temp_machine; @@ -5229,6 +5238,13 @@ win_settings_main_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) EndDialog(hdlg, 0); win_notify_dlg_closed(); return TRUE; + case IDC_COMBO_LANG: + if (HIWORD(wParam) == CBN_SELCHANGE) { + HWND combo = GetDlgItem(hwndParentDialog, IDC_COMBO_LANG); + int index = SendMessage(combo, CB_GETCURSEL, 0, 0); + temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0); + pclog("combobox changed -> temp_language = %u", temp_language); + } } break; From efc2c547a000a4661183f88df336a5f07e847e97 Mon Sep 17 00:00:00 2001 From: dob205 Date: Wed, 10 Nov 2021 09:53:47 +0100 Subject: [PATCH 042/159] Preparing macOS app bundle resources This commit adds the app icons for the macOS app bundle and a custom template for the Info.plist file --- src/mac/Info.plist.in | 38 +++++++++++++++++++++++++++++++ src/mac/icons/beta/86Box.icns | Bin 0 -> 169574 bytes src/mac/icons/branch/86box.icns | Bin 0 -> 194973 bytes src/mac/icons/dev/86Box.icns | Bin 0 -> 217773 bytes src/mac/icons/release/86Box.icns | Bin 0 -> 196323 bytes 5 files changed, 38 insertions(+) create mode 100644 src/mac/Info.plist.in create mode 100644 src/mac/icons/beta/86Box.icns create mode 100644 src/mac/icons/branch/86box.icns create mode 100644 src/mac/icons/dev/86Box.icns create mode 100644 src/mac/icons/release/86Box.icns diff --git a/src/mac/Info.plist.in b/src/mac/Info.plist.in new file mode 100644 index 000000000..e06b17ecf --- /dev/null +++ b/src/mac/Info.plist.in @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleGetInfoString + ${MACOSX_BUNDLE_INFO_STRING} + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + ${MACOSX_BUNDLE_LONG_VERSION_STRING} + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleSignature + ???? + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CSResourcesFileMapped + + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + NSPrincipalClass + NSApplication + NSHighResolutionCapable + True + + diff --git a/src/mac/icons/beta/86Box.icns b/src/mac/icons/beta/86Box.icns new file mode 100644 index 0000000000000000000000000000000000000000..0068beeda30c9d8219a71b4467cd5e0dd35a9e6c GIT binary patch literal 169574 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 literal 0 HcmV?d00001 diff --git a/src/mac/icons/branch/86box.icns b/src/mac/icons/branch/86box.icns new file mode 100644 index 0000000000000000000000000000000000000000..a2631c66ed8764c3633af309be5422fd5bef64c0 GIT binary patch literal 194973 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

^C z%srqc?7pZ#<%aCf=S8)rdelnZ;)3vLc*&u@u77OZ3;yb34z2`u+j4Cfu|Fq@ZyY`L z5hDpTkOErL9UWNVVR3ROy}a`(>YBqt+ZdJ2!U@!8f2uS`aVUAJDj;&hAy!lDC%2S2 zb;vgzUYdikRix4_@|u2wt)}yV0;?OD@H0xdvTQfckVOYmv-SyLui?lj+Wd*gVQ#Y1 zBnfDwPK_}|?^Pv};!eDzRh$m5pp?9x+Nk62(|$5Q<}?WgPko}$l!Mq4*k?B0U(QZ) zTrsL~CMG!K559&y@l8sE_S)jEmmS3*dwIZZ47Q=NtuaB-`DC#uFFI^)b2jpcokMOK z6`Tj9%?gP3)hK$7-)leP)`BlT`%HrI)ff;~UKTWdr-r7CRaLHad;4=dlvmbHFm#2s z`e3ClqQ|rK7bA0j)8T53Dy%5WrL7V;vW%)(Ld}@o zEu|csvg53)Ok*)ox^+M?9r5#exeQ&~d;vbw2A@3xmw^xIM}3`0b_*eFww!(12rNvp=xVOSdYyMheZr~Y^ zowpf%!zQaC^AqW$^Oh%0DO06~5faKm5W6eY_8E$yQ^xdPiONDH-y37~a94 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Π`!~tPTiCW!_mkvO&j@00% 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 literal 0 HcmV?d00001 diff --git a/src/mac/icons/dev/86Box.icns b/src/mac/icons/dev/86Box.icns new file mode 100644 index 0000000000000000000000000000000000000000..5ff137b55a47114bcd3988ab666df6e9d0d9ef3a GIT binary patch literal 217773 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 z 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 Bi#q@S literal 0 HcmV?d00001 diff --git a/src/mac/icons/release/86Box.icns b/src/mac/icons/release/86Box.icns new file mode 100644 index 0000000000000000000000000000000000000000..4f15661ed03c6ffbe15ed4bcc8359d9d64417f8a GIT binary patch literal 196323 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

{_+Lg{Pk1snq`62q$sKV;CNR*R(%L3>% z&QkB2)-Iz37PJi%0iJ-}z9`D=n)wnB*;3z^6594M)6PGO*2|AFRa9OR%{5>~~V)+5>$aSjjg;~LdrIR$=V z%apr3Oaid{1=Jv1nCkNPCO*H5kLPQBvGS7**X{x8c8+^c)~9_aIgm>Nr+Y$ z&=WtJ_7i=HyYy_%FkZT626lwfn;oNhdrj~n!GVAPH#T4Mj(d~pY~oR;-^I$@suUes za&0wz)NviVjbXhpi?Ln7tk)wQwi1PMG?2gzY_2hS_JZ^7vTK&ZeHb zc}e!{O)j#hs=tFdvBiw zZmB5;K6(2Mh=&e6LdtI_?_f-l6}G&6?w>`IIVJ(sBtP>5Bl9B@`;C;Tj;3u5!bA@; zY4!cFGuH4;IdhZ&jn6+!=)|VrxjyX$6^LEF_Xhi1>tH6Fy5UV8RucR!Maff9v5*)KZn#Ypxj* zT$6wZ-TCl=X;J*}75@b(F{=f7E;8Dl&>{i<=qX{*fXU~d?f51v727&d1NFW{N^M*@mikLC;beTEN)*!)x+n zhX|OS(3I%Z*C_o2PrJGBaYGLUyU7<#X%ZH@bMKy|VM%Y*nHLsZdaQNm%`ssF8+8rs zwZL-0KX6X346^tIN4U~<&~iR=>l#*rneO(^XgKM5M<_c9w$rG4)N^QgT|Sh|SWTYM zojOtsD!}IH|2XWF4A#=nuF*2WLwhr?md~a*a70x^jvAR(h41xMx2)`kP&7qV-WHK~ zOg%wpeBErOZiONI;O*gpi27HkY6XA626^B8;dgPzCxU)*E9guD1>G{G^HxVci&Yw3 zod0}6*8BvfR$QG8W!^DnMT<)f_(P3>NTWXRN`&(&9YmYjf{)a@%b)A0 z4p*}%_m0im^Z0GxWM)vab2!aW&v6SQd5CO(jr!tNJRi<%N{AWt*0CmUvdZI`)*=`` zmxx(n^9r+JIhPQ(>9m1H%$0arR_Fs++&V%G*Q?NUo+gUv1-fc_WdK_gYE5Z z)jJEwZ>@08mu08ysQJ!U7*00EzVc?IP`@Sv+pZLzQHJ?B0*6;FHRCu`Zf%3CT!3a` zk0y%5spXw#$Uh9|nleJoB5Hdt=pqBe4f}?%*=Nw1#-h_F6rT)!~PHI+u+aw~BmCu`S%r^H@t3#~03w zj_ohHSq<}}y)ORVZ#9aC(|?b@S}=1pi%O6y`GJRB*Y|I$1= zY0`f5Goa~)3{=$b2UCL>2GR4KCNuRJ+G=@A73L?4dmJlo8%wUH?l}q_%;4t9Mb5Z?k^hi(R+l?)v|1b@3aj@^Gb@`e169y-ImbSKLVQ6E)T7GV@DkBcI7yZ z#@NIuxHv~ooicSBtEz6AkSWhayKKK@x(H#Nuhsne=3((L+MN8I;)5wDn`XvdHpZ-) zr==rWe+Tn^wa@o}yJHmR^$x>UY!^0Y9~wLQ`1{8-ePuM3ZsYdGq^lK)`V7Tq$P<3P zTU>wCV74mI_X3Q_;6U}}^25I~1MVV6L9aM4M!>6>MNTvZN3K12VCs=54d@#;H+TqUYbSeG0gJ6vzNuput)>^D)dcGn1ZTHNfqxVO(Yipt>iN+}eX%T3 zAvw2aI9Vq@{ffW7+;=^rm~httH>|A&dZfmzsde!yKEKW@GoC8aeT-L6LVjlpz88KxK1 zikKm%zxewxi!xxkJX@Np%P3>YxvAsiI{-#&M16>MaI?<0^IrzRXe&|obmFm1y_j^Y zL4Cz&qUXDMi-u2o2~$}1gQ_3Nq=am%42pb#I!6p|4qJ~1#|GA7e`c8jOY?cI(pO2g zAju)R*3@pnR|6crsz zy>DHMuI}W<`K|Lqm7&ST+-Jh}EW+Llli&S)E{?4}{qi&UrE^CE_5Z{vL3b+~lx)hgB<`1%Tdc|pTjD#FG|H>kVig6K zGtlJ>A2vU8ys*pNZhaog3cd_S_wA~!>uFzbo1j2sHRV=fXth6FH`bTum zHi-H2L-8Ie%WM~hDgg}>R#&R)Ikkvyq+?fA+PcGG&iPPJ-kKRahP(&0TiawU{_z|G z1j7+WP8pT14%qD}1GaM`A_31w@0^NX^HLwZ0*w|wlye%1<%fE!mp!fo8CgUnqw?+)Z=0}C6o!U}vy zJ?E{_UtF%It;2@RWgxRma>A$hzF$^rkU+V47{xJ(Chiov={w&(i!LLSEInv=<%Dxw z^clPt%BxQf9d1ivrFd^pUBEz*c@rautb9X1O9jDp929$(bx3T#ZkM?2x7WVb4kr-&NP3cf=lSF=KB%u{ zI~(5 z86bspqy=P7Es_=Pjgwb8=*uZS87^uKeqDk^S;e(MfUFivt>5NlfVZTOeWIh@e_lVou zf2A9r1|&D(PWMlgZxgzvJF~3Y!d-(bmq3q|LMg1sSM|qIzzfe)f_$$zt2GUkayZ{< zA!d6I3}L5dTEZTLwnnRQF-MlSz=17qaWNG2Ls+u}su(vw6E`&pI6IOY5WMUA0}h5Z z&&mKWu+ZKiQv7^b(w}dtyiT_>^qa=I&DQJEeBOY8(}2RA=iksS5IOOtY%p&3-xoEI z=W3TME(~j7DmZ`^I;F)Xl?zYr6i=tU+R}mn=j~|qgIWl?15ct4&dDxdTtwuV!YXxQ zVm6n)U;JjV+B-oP&NG;G5D?(va4tJweu|~Lbi*{2TD^EWmT8-i14mDZ?v@dV0l3sc zDqy;R6Ns~q39g)(g7waaY?m$G6M-44pvzFn*QmKEZj{XzDSeq`y{tzcaZ3219$!&{ zy%15o=Ivy4gO1;k@59D;)bo=O*}2WQqM*I(5<`ESlh|-eCVKh=C+IVm_^G_ZgUkMzPv^4xBVeX8Lw5pN zxjci_z-1E9@zfOtm(vP}%V}%6E5|d5P|_n`?ap2qL5^#B#T773O(Ov&)N)1z>_-Vs zmk;XwT;yC)*ISECT?W+x=z5H9^i7-1e>1u|_@Ovao&nAeE!*F)BZQbgG{WrFSy&Vp zdd~Z?#*#)RzYy|#ZPl`A+IgTJH99{)I%f2oq(KI1u|$ie(}zvpOgzL2Q;!-GV)3XMj)7 z4#vV^rk-nNVPUNz3i}JZNtR+9V`!xrv%7p|W1=p}vUVFREi@N)n-KU_EpH*&D$Au& zHRx5`hDi4J>ev>yB*y7j1_6?NL&$eXLw@39tvk1ewWyFGZ0vA_fb1eHuhbd0hs=Y1 zg7qEZiq@WMSoe;87__OCc{(=cQ~$C+zn|b$v6|2AV_z#;Im0%&o$bY6 z4js&SIo^Limr~~RLc$8BVfn7~v3pm~V0}A&#b&ErLsQ_7k_>|)1Mx_*EHK5-|=-p)Q=6}q25-M{jj)85o31;wW$g)7g_3dTlMLPk3?;MWk+)fhuuSNw09q?*Hdj_duFhY~R~J0euE z2VAF=*oUF;iJj*jU}O$M(%}0(Vpxv^i)&qG9c?PN(j623ws5V5Y;U1{w}iLeF&<5M zhPd0N^ej}=2a7v2{g9J(1?7faHN*GbEN3O|gXur`X?;9LlOzrN2uGTawXEj)JedlA zVs72R)iRfYcr4oUTnxVk#-2v^*eqU;RWrZD;y%?L zT=sK;hRQ;L4Z5JE!#lH4qqTYmIk+9FgfA9tA(>xp@}EnTz4MTze?J^fAFg3X5H1d? z&PyagXH;?q-dpCzV^?^_Z@d8`xLqINUXNGY`C(C`3mJ1v6v&^N#kIsG+uD&N)uSa_ z&{AbyBpRvp8pooCXo^KjQ6&_Qd67;rbS9F9}e8v``E~Vt4>s{pIUwp{({ai2as3k2W? z9UXDF^K^YZ6OitMFy)5^bn?g&qfpuyfkQ6f_tchB?PM2mYf;zOC*z~}B2iGx(3ho! zp4Pq(J@k3gMU1>3O};MoNJ~b@0P3$aTjxKM{i&|vy7?)C6TLoI#xnK&$6%AP**pD< z86-&I#%5M!vctjw!hHP-m6jF{eSMSLkLZe_T6Z5g#T7)q9NWCUZ&;w=#yhG}x@%l4 ztu1TuhgvZ7KHbCBu<@c{uA8R#UM6V`AGIlm04_mHUxdnMf8C5a#6A&mT32nNh)A6H%OjY^l5{buL*>|jQuYV&92sKvm_ z%q>~I*&QJh#z~<8Y*5Wc>SteIdgXMbh#Flq$8Mm>VD`ips{c#CTNc^I*k(;cF8q`pn4`MX-w)?Uz@JS7Z`uAYekrOtqkyhsihtHxZ{zdkgqK&N=Ga7k^Gkg+qQ{YA$y5;%f z4KEFa{Mw%2gg5)s56JsX_(qP~V$HXxfh7D|&#B;#x%N^GP+5jm<91T%`PuC2hg=AJ zj+WyL1JiYZOan(WIxv1DlRNe)+|&M)rZ&F zu2%sfa{FQJUvV5A_?cJr?)@B<;kmd^hb9gTNu#&Y=x>#7W8!`W(Ob*Hu08xg9}k@W zk}4mS;ey@0sCHM&x9!{z3AlPNI3aKI;@JA7Mj#zwrr~)-JZ-5Z?uIX^Ot;d=yUaRX zfOatPz6_9dYsQu06DIE_hC*v%rnwrPe5D#vWo-?uZN2Xu`vhz zQVO5NUm%?OYZZ&HV(W1DdBov5>MI^}c3-EjvQp)uG`X3y_GSI*`WfZleqiu-`!y?W6DJaQM?dHt&$2HRQe)Fhn}m$_MVT3+z)vKSUdxSrQ2&TN?)($l6qjT^HmXV?$a8taANrXTwmu;DO=|u|P=5Rojy7C!M6V6gG^ExT4vjYA zI=u(hhl*ytB2ZLZQ@a-Sf6C29+}I@TM#2pCEG7g(b4nuC`l>|oyv1kh)5^uZT@?8G ztl?+DDA(q9H5LB}B`g`&H0=gmNG)RB4ZB-}*;bz1blr~aAS4KUm8E8r^6>7!>|e5B zpyP+!w<64ZI-CgO1dNwId%G(Ax>_B*_M{!(Y7DLy1a5;9t#t#2Kvk>7L#aXIZ6)Ha z5T(cppX1$wU5xNaReE(4pZvQw)L{wo zsFEw+&KP^z$Mtx`%20$$~@im^3oQu!Fbpq31zOmE3;3D^EKyahP-<)iC!!uNKYUZ&YV0+~4x?ps!3)13v3i)IG9S7bL3V{ zyAWQ>)nFu)uK*<7-k*k;4l1ysooH=HhsFFcRNCc+KsYca zrD3rjGAD8Oj+b7^HF%p@RkQ!QFc*+rI>dKJLBD1f7U#akAPpDx#NVH_qHgXCXjrwD z?1>Qu&%_3|ev$Vi*S|LZjaTFvzxe(_0l}aPvD!$L{b$YJYA+~(l=taUF5>r$)+vO* z;hy(fdz66z43N99ZAbVp%pE}*XR2KE8i(5$4@@{kxNAq?zBWfxT7e8903jy!y@rkW zu?`Dv$Y&Ts*Bcow-D|G|Z1M*Bwp%$iLcjkEPB_pT+KESBBD<-SV0l>mm+PY}D_R}d z$WN&ZH61MIc*Q!n-f8uv_>tnM`IO@6V4lj3(fxIS!zmiRaT~I+q!BeWf5mi%VNz31 zHopN){28dIstn*=fSkIXX$JGj-#5cJ%**H2V_PnD7|2^?#U!wB;H5sN6r`ibU(M;% z9UFIe;3>6Cg(|()vp*dHR*EqX8ApoCw<7g7J_nCCS=KJM+a#TC3R^3AoH4&-_EQ48 z`#Q7fTLmrSMk^wnDG*ukYVBYMzhAknRlf+m!2H(}p$XLV{xJExAIkCi!!iJfYw(HM z(o0Xh&|yzqkl*>bp>xB1xzF}nWfVCVsPW0T%-xS>XGFhgiymAJDr|j}6mli<1yw_u zizcqU-8knoI0uM%Q*(*Y^w#f!a3%^~ailPCFh6h(2@6akbs?RtsHc)(63PJ(yISJ+ z?}+?v8FPf(3Rn!>0ICv&BhO8F@hdiZ+{aB7CHOHBr52?PZi2ya zhbCyn2zB*s)`5Ky^TzI;=9&7i^P^37GNry>!jsB$ z-Ga_YOP(u(@@mE_)TxyV(lfY?+PT76oq}fqVzf7BWZezQpY?@mWmM>V;0{6ho)Oh< zF|pfL;LkLoEu-fc@%caO0(}1_iH17su`n_^0n)?nM=sEF-{Z%3)Td@$6)0!6W}cBu zN2*VCB>Pdj+`K}W$;XO-0Ww(GE^8tDOUTIH-)0SA75`25ag&+D0c@JTUL-{M@i z)duUIQ5`36%Mt!}cL6_y_ou;K26Uef5Bt$3Y~mo{QzWj`2E@kvfhxoG+C4`lTe=DGdiwO04Q4Fm7f>NVi z7NRmce|y9nB7)~8E{g?BJF!HO$g+{%nhdc@3j1iYVLoa8rq3#YCYH%O&!b!i! zCUk_s!3d@bY@J?b&zTn>aVm8p_|6U;`0!IGFm{de*W?AbU@$Z4{b2lW&Pi|MKSqHZ zN)iLaQLX-bsoSzJ6*b^gG_-sEwoWkI=rZf}W5G8RawD3pb;o?O#t*CxV)4v}^ zxEXuO6SlgFveQKhDn=@lb^@4sq^48cuDNuKO86D@M6K7j0zdJnAyQFr`WO6eY6|<; z94Vf(_DUC9Xh!d55INBQu~kbb<$tmD-tknwfBf)q9D8NuNOqBgBbDt?L=l?yJS15e z8R48GW#m|qy^5&JY#HZ>>=k9NY=wivvCg>PKA&%&-~IUA_y3ObzTW40UDxY+u4_5G z1GF31o5^j-EAx7AUW~6vSO=meHfX_5GrVx1er7JLZ}d9>KtY~i6ZNYljt@~wf!{y; zt#a1$$4?LYQZA1o;_q(kkz4$gg#q@=KzW@VCcz3&`eIT>xKuQhBYM7;Ek0;)R_Gl>2n*^<{o+uuu>Rw)RDpHu;p& z&vg!XNr>NPhw+P;0>W||)4~8wo6<+(>U$n$(4vB$c`R7%Cl#>WeW;jynGu~Y5ilk2( z@11ba+lGdkU&KNAZeiLYwzG9AG4Zh52_LOu3>7?d177dnq6>!OHiy)DG24LTK^xrl zKIPNrUN0J13 z;@~OmuaBIbjgdaPXmZkkUY}-$bPN{ArKkW^^{lHg*qRJznmN-hSk{(ZozpF^I?-|D z_oeFk$N%6bKn$ak;|y%CK$jG^((4ZL0uQ>QowB28mrtXShO})g+}8oE)XtAgCv<=c zE38yQ*>!`KfRi@h%zU==GRtpUxM!yH+f4O^rdUajTG21a{w<%|qJ$KbOdE#+5u>ck zVDcpYx!2Bp>A9gI@;giCZ1LYmfShf|oHFT8CZ#C4+c%u;zIl>KZ*j>% z@(Bol1rwmE!HYld#@j4*_U>-1Iu~kXx^E6kx!N$TLTzjn z`GD@=+#b?Et|V9}N<{x?P0(TMVE6Os{EZ2V0B8J1-u0mXp2R~>m^R}<$%ZCN`ACaMJA0k+9W1(Mp5kuoq=mgBMh34V0x?^wei z$79|0rFEd~p)jxw8-Gu@B$1R-z8lV-+c!k$at35LjMroWZHxkKVq)^(K2U^pKpIvZ zw{Lc&i@$X(_T;yY)#k16kzkob;Tq3taf*K~d+3Gr?xee*yJ4Pp@n=~D0)5s@6#zNo-ZsIrSlPsh z@2ZnS*2l(Qvq#hdrk`RU zi+cU`mh*7LM#Jp(-~l1DfwT_^ z)=f+euxz~e`>3bVOVai$%yGzWJTg9^3jaq&Usxi$d9-e7z~R%LN{gr$h)^(@7YiNW zm^a`Ack|m$O5GWl5>!`rs$t^dOf}>8^qhLA4bJb2;RJiplmpVQ{1K~#bUi-sWlp7o zg@n*vE5E5KeG4%#G(aMjJ@<5ywlE{&v*O3^%H&s&nw0I zrqK)oz_1a-_K;!-^7(z_I;s2C>2NylLGbiAT$1S-YB2mHun2^m^w|B&H|3l?@yHy4 z>z63LY(WTEd>RwgP(viRCn^;g~>9T&L+aBJbI$t0}w_?ri9TLn{eOENn2n^}CKPnKEp2#`lk z%AnQLG+yA9a7(Zg7TKBmd10XCo!b81yC9OP=}qR4FizXz87FFmFGp_sXE{J9H<5cZ zK`l!LNTT!9pO1<^JO8&xzQBoy+Om9(4m5J1T)G@aKjhSl0v~nT#l&57z+cRusC@ZHlcc7Z*d=X{>h9bKHy zwv9*kTI33sFPK@>SZ}8wo1yCdT+L+<&4^dkn#;;Y5=~oK^x0lJ`iqDq^aMd@yq8?c zl@za^_)zkCfw9bj=Ap+j9gkZEz?<*O6qil$X|oQeH8qPtp*O4P!0IOCvVPAiUnFJ< z60CTDp6*6Cd0NK$Gzx3C1M^!0me~>M@W<=epWaN{Pez$^DLm`@_%;1qs#VWKY70u=2DFkThe8liS7D46vtyQY;zCzDO+ z85=A!?5V00hqz6Qp*k15PQ{>aNmtu`jpBWc8@|EAiF%37)k|0`XqwMylaxc=r#8G+cDA=2V_BHC)^An{WzK-3zn~P_~?k+LZ zEU=#t)vFim;Gd15IR%Z8G6AVsIbf_VT+-)Emh!;pyn>v0v|}tllLAi)aM{rY0|ttx zFsm;~uA;|u{ z{x;U3C2y@dr>?}nBc-$=SI*Gq6WQ6&rUL?J$i+IE{j+|}Yh!1PpXFbC9w%@82M(Ne zNySYLbu1a)#&1|Yk0Wg^go_}AUO~`h3$iCZD7NQdS+gRviiyQd53nqZx;}3J`^@3) zW3Rs*%Heeoc*4(3_`Te?8!D?aFn>sQNF!=+94jxKA`|~|VFW7PBiuGw<&%04eOIdD zPtLnaKR>K|F#MNA^mhd%8*1yc=X%{l$`o|Cq?jfiG#^L(%E9jRmOJM@f)h2cd4XFFhEWj+S4L@kv=WbDSv9T$$3~B91~U%eQ%7Hg!j0=EwZOT zFKVRJuabo9!ivVJMs$N>oS7Wti-|t{xmU}1IRTeT%jF0CDd~coo0M>utlu>nK;3@e zkTm`K?TtWf>WSkijV>v zV{0{IoxU*j;hpcoS+FMi1$|SrD$%(gE=b-l#C?`Y#eSny` ztUApyv!Yl!r?FLijfC6$9?6;$D!Hf)R?8YKumnk;o9IO9SmfIHTQww8%Jt=7~Wj1ZqZrYN_I5{Di(RKcj!!^doItjWGWQOqSWDL;S#s z)^&yd+y&1$(TpP*b5SPNsU3rbZTI8RD*T4Wx;YSH5u!>DA?P{*vvR}$-GP&tivR2f z2pkLW+*v}3`O|JLAN)Kbj|LSh;8Sb*ZIurj+^M4*$y*Pq8`)p=xQ_4pFOgd1xv!E< zqwWD+^W)*PpKp<`bx!Q(KkZnOc}ogy%PXxv{GDUtaHymz`L<>1)e66YfAeN&f)xoj zJwM^7e9{pyoZ-q)vZ%htXpMd3^lK(~vsnwZ@<9<&*SkdZ6774UdaRCd`0jm_9UWhV z^u19w3~$?ne^1%%Hd5y`zfd)acJIEtaxuU0C`A6^Hfdh|V%c8v)(foq8rfha0`Gja zeRMW_?{dBZJ@%xax4}8M$F<4mtwvgo2=U4UumX`P?7S?}I?kFAr?aGMNE;7&GP_4B z5gP+f2v7#msdAtvnKv{$)=r0P7f@9EX9>%b4?gaW-@klM>+T8Y?=@;Z>leDr%4d+P z^&s=jYq_HTP1|)w%^fdKkt0-t{N3{8&ZRwemR&ZTnaQgP%m8JX1A= z2-Kgo9i$EUCG|f!wWW=Ps@Flt3el{ED~l<0Zwt#E6R?YeEGu7R1CD;m7gE{GFg$Ay zB6_@|7NIdyq_Fqo)79yU_PG=;`eG`q zPJ5^mdW@+BQzvs%IK^*BnTY%#Qd0Q6RW5EQyg>G0njSGPaP` z*SB&yY9)QzBf7?vIr*v94I48OF;Xv2aPi&6oM*4b`~WcSnz4XC9*3N#B<9o87S z;j0YTPqjghOv=awRhP9@Jjl)?~1YSeLOm6 zZ3j`2X{q>qDy$~qhQC3rg?5h914~t-dV0&yua&iJ8q-94f;SDpXbEO6J?f6%ddi^& zy@~WDd1`HE?VC@m_U%YMCtN{LVyFCU9x1LCUF-Gcv2lyv^V!I#Wm(9_#@4GgJ>9pn zL*uJYhr13VJ#h=>FqWO=xecx*wvw|GHQ8b`l?Xo8XE6@FSl4=*T5=iTm##fa6lg## zv*Jih~| zhlXu0WjNX(DF?G)dghkpE7*mZVagc3Uoly7{R%d4%>nz_o5+4EhPtAx^%a+pt%XD% zEMEt^nlyV<+_yWEE{s&}7&6pQ?g(X5TuR=oIgNgv32Pq@v_FhFP`E|SQnG_(Vh5BZ zQt~^Zx~0&~N!{|&zXqy2Z76p+)Op4^X>#Cl`X}xD+q3G!KiNz@bBU8{b)c^8$<$*P zrxSEss}pNpZXx&D@Q{G;sp(pgN2+8IF`PS}7>&z(py4uIk#*hOTpBg=GolDZblu@s zc(Ayd)%Nt>eWm_xx(~3|$3`pV~Wm?>&kA{P5Bv}yj(a4}<^QFvP>`cb!kMfzQYHC*L zEe@lIqw0cQjLUT4o{>6RSEv(FvBdQBp)$&MF^xSQME`5T(f6bEL0J3qPC>bLJ)Ed- zlwhs+R!e8ljs5^zKh0MsieC9~$Gz+q1Z&$qxmy;DUv)?OXOys??b%a<+feeEeA2`LDDj3z3TiVGAv%>mRDd&%}+2YSwX z&W>mh>~S{PDB$OKxg)ut1Klko2jCb8t+W=mHd4i+^wrMdww?Y;Zt5tWgMj*4Ois2I zz;-u$BOY-0+~TKK9yUA-{goR^%N3XcKce#MTGwY6?K?i%`r$nv+OUaHc&FbIe&C*^ zD3@qtS$#pzi{@3Bssa2Sk@8{Csf}>rlbC{Uy^tSm;`iR$3;5JbLipZeGsop=ydUL& z$`RexM9vXG)!drCJF>Bb>HO(3zr6hsZ{|xS4T&+ro{E8n5NFPddwmT6jnZU}Na?DO z&Xv5rE7>mA7X_m|W;*%*Q5-5DHkm~coph^rZwb#FM$2A z91}8u+yy%HJFln4>F0?=>pe{7W&1VT?a|vtXF$Q}I_Jv@CMVu<^XCY=S4`}LLYel{ z7QvPdb)eC2r%4y|<3STn_*CS^IGnX=sL^X$SWxt{QG7<1+^27+>FdYbcUyWVs@p91 z@Y(WGJWs1v1JicDr_9T5%w)yf{WC4(D36Rum8+L{owaAX|K1YRy;KnF=?h3_9srRO z%aWN4w(Ck9B2y3c@12(HnYo;N9x{F^Bon%m(}w_pu%>GduBGoKE0o1x2n#;cDwv)z44*m5KD_0xhTL#{b>3lmr1`o0 zZn^wZVa^X-Kg*^-@2gy%qp$+#DX4`qM~*#D)f>LMdFNvM6EX>~)f6Q;KxY&H#y$uz zQb)}BE#B{M_de0IYug|_JJl{EoPW`6dQxOWCNSUYvG$#apm=VaJB^ss4~sty7BrrQ zFJvnSpf)ugalO< z$z;n1icfi-i8VIFG)1uJ9E!BdCTn6|*#`@v_pP=Kp zXx@x5I0>AC=6 zx%d44m9JLE3GxDQopfKKVA~{I4TTC%#c4joaJG0a>SHnI4*$-?N1r`My7fk zjHdFe-zjfnrPbXi|8DrEYR#@1MlmOUCfcCw(lfk z=we^+tiKm%GR^xwJGxl;aE+Q*TA`=OUJHm5v&;y-%SG>p(_=p?4BWjDgbr!xuzOL| ztV;NDA7Ir``vnb2f`a8lyg1Ds1O#g zsp1&P9$ppk+^O3LBiZu1!46L=5tbVEPlmGsA)#|;Y`7-^8gQJJZai#J=KDv;@2kn4 z1D{bw7O$q>{*JeyoJwG>IE0$2m$t#g>c^0v|-5fHpE> ze3$yuO(38%Xa1`}vEv$KqD{df#G;o$xLaaQ3+y0N|LJ&ij~58aV8Go-U{_6^<+=Ip zMd$q_cFRzyxlRS0u0K^rotI~rZ!uTnvx$;ff|3jUG`1A&>t(uMN#6^-Kp&uI>WFr# zkuhuDN0S$V=TZmef2=LM%9_|!ztu5U+G8i#q|vkN#9PsI(U&HUWx(Qu4DQ>Q$wyLC zYOv>Uk1ep}ET($fC!A6S>A1|C8~S)EmiYzl-1VH{&d{pg7J@1O1xaRe4*FYC^fV#k zoFJ8_J$cioL1}wlxq`8cMw670U4Q@v4mjtT19|5d5^bI|3%_h{uW;j`V^R=)bS2>B zki_|-gZbB1Ab|~=ldp)GCr2n8Q|eyGrRcoOWZ>ki4OXIw^F^-1GeM7(AtKi2%=*_J z;I!Bdu1(Nw9*z)$C4%dl3QBZ`!&33Y>#C!;Ujx^Mo1{xWa*1l1hYr44o=cFHTUY?$ zNG?Q4T0nT<#rfgen#<2+75C4tx=?Q{T%VkZ`M0G!J_af={=k41vKUv|5uDEf_7^_x zMCHq07c^g(qBp&ge}f%2(Mv4`GA}~Pw!bM(p3EX1>^v7S3oLy@=iVD`39#Fz1@;tS z9`u*qN;h!ORc#l2-1bqQ!u)#=l0EYHDVyrLnz?&tfO4^%UllKkA^1UmP z*=)fWv4-5O6hKpY-H9z647N)~*h?J~52l3AuyX$}b-6Aq+lln*BZUK~n9WMW%(rPp zCwJ&v^A(#}F~Iu{?-ZknG+VmWlL<BKlH7qeZW>y}NLwrJ^?Rw1v5 zOpw)kH8wk7vG*0f_1h2)X|t+OPb%ilH!r6!4@E-qtZ09zcFLl^{^l)__!Qk#ppp5( zm=SXk@>u@Je0QBW8E|?WE?si}D;lBIJU05`B*Cw_jl~&q9ytvr2R{4i<8EGguETq| zpJV$|dlDpIU`a-cGVD%A+FIZ8t)Bbi^ujA;2~`pRTPbR6!Cm_$LfRzf4Dq^99FBQI zO0N@DHdgB^Nj*2+VXv`;r@Kw5lV~IfQdzS3)gbqh-O5TuzsZ30EC0fWHSoR-URm07 zvTSKt%TT5**0R2_z|)rjCqQ*TrnFzy)%gwomO>5V^_6`Y3&HKLuTgv4X%@(IPNfu_ zEbnNjbU%X9lY9rM;D-aYw%os}B!DCaq^g5y4G59C+_I_wEDM^A zG|9D+%CSr{n@nDD>Kl^-0)=Ag8JMTGScy@x(JmC>gYl#&%?HXMy)+3sg@wAVAJ%=lRjOsuO52I1`NCJUSRMkoat zex3u(p;Mqg$?Du)3Y+ul&7?>O+PkuZDygifj7`Rb&&(VOcHcSP$Nu?g#p$GgB)hKk zA8LO&-AiboJ)M+jM zno{^WZ}RZ8=IuCnZn5qTqT~_WuNZoriBJR>^V#Py{`o;0%B&hkGgYM~GG-m&9!ars z)+f`fH^b&bEh%>}KBST0^{uS@m`t9wV4RRV*DfAKP}Iskg*;5ZP_%i!`3SwmO;a{g zkht5A=kt=}3)Xn1>dxu2=rrzznZXZ5GQY&FT(t$#G3~y-&%nm!$eX9Y35)nkU;Y|!_!y&Q~f%U(`q z#AVcNT{u8#tdne?Mf~EOKWo-@N`(_dS}Y-#nhV}KT~b6Inx3H<(8+tb=MuI6;km%& zW8v4}{mXNrcWW^g2~E~22{<=R-=WyGVdjYpH;l3j=+wB46`O#rWviXPf||e}T3X)B z9Nvr*Kyt#JT8LR|+FiR?)01t4Byl5luVEbqx`STslk}Z(hUNs0_lO$Os9iL|Ej9e55^La{ijXB_Gqn>VLhS~;yFAL=6URMFbg5muS94Rb( zvOCvyRZx$E0`B@ytQEhdX8h&s0JB>NU}D9g!~4yn! z*0R^rlw?={BY%`!6Mi*3;f7KmMlJJZl#Tqk8gOgLW50QAGrOEDB{Fe(s`EMGwYItK zVPxI*bWq?>`{uM|u(NOLXT6xVw_6Wd&hEJEjoVbK%~7$*uFOJN6W+mb?@g*1lov<+ zXVmdb4F#-&fj5WB`dh-n5s-ow<1dsCGzuHTBa=nHF<%&yRS(Kflzlnlsc6%Z8dxFuoEeyQ4n z1~{w4UCcqniFU=Mr)zsgF>4`JNCYKy6*w@FjT~Bsx6KH0eUWus8sNA<22dSj0RpAy z_D97_!qrx<+MW@aO-1E;pIYw`ZrBeDll`kX2879Ah{%)N$lH}mk7iWqW)3KF!ERVN9wfQi- z?xY2ufY3w0$$LF$A|;|f*F#OzG>G_H4l-6%Ab)rtpgg`tdEUYr5D$Mbr0a4ooWxX_ZhqOP^mbeAWC3$Q{~S5Wm=5TPnPvZdY#N90UN|QeA;f z`-?e7sfu!XO`_u5gk{A7+siAd>S}!A@Nc)|=-{i|X7dD{GdQenIkng9LD+#sGj!sc z=NPB%3ob8E+1^E+u%MT~Jbli1!L&>S^XdC#B>c?-1m)?%N*?wCQnq*CpnjOuX8W&H z3NW)Vf#V;n+n2#2uk&AP|NZlOp?qE?(W4&3JcK9##iR2|uUxP5v#bvvdu^e~t{GC~ zByf~Owy(bIvKmzJ>(7v#TsyQ`u`Qd&Jcv>lzp75;^X&E85N@*!T~utdfOPx5vl{cI z1KqZBb!g3qh9ldA-hNV&O~S6eT@Iy0!bu4tb|e^ChOqQ2#`71>#+K6!pHGtOPHEgXz!T|RQk5VG{Wm4*3p zZZFaW*sPhW!>rPpJl+eY^}38B;Q4zUUd_qHFO5%$~yPTx1TkX+X!!RV0g5Iq+v%=foh zMGau@^a95?<0(aurBOI6VmW?@IJtSfNbZ*GU1eQ2Y!5n!ZF`5AHg`UHE9tIZ<6s}*F#l7@Z zorOd(Hq40uac~|gux*bZr49U2A8nF5wsI?EVE1q)Qun8fu!~Erx_mXPfM=wsfM~$# zi|C3!u-QKxVIapTen(``)Gs&22#RGXLUNzxzvBo=3zZe`F;5)csg$?vU+=Lv`>t-=)F<8 zqGF;hGTSjBHVQb^`+TeVj=Y8O4{~tpxj#zjS~8~0a^yD2Pn_}*gTP4YlC4{KJ4ro_ zeFphL_|cz(<|e1<1`)R(jkhO>G9*#iTQ~65T#Gw8X6!Sza^3$M@5$r{ugz z;MVl4K`bOHT5LDjkuZLO%i>Qo=<4XTZ6kb&DlGZv9}=WAgpHJXaG^0heWeFO8QX~n zTVB9n0uZyiErOtei7{$&!(MPLGhi?TJ z+OWR~i)>9Sd-qCu?L@{a@=_^}AiZ~=U#&5g}=u5yo) zrhg&!3byFiP~XIDc0z&hq3%-g?vRFju(Ze#yqJtwaj>TlfnqpxS{L>v9u#<=ESgL5 zvV1v1{1SS#(<4?{qQmC2mtN({MvNCmK4@B6v%#T`E1^JJwW;P}mg$%IYBdeTjEwdY z&_rfgawf#A^1_kO+SX8xgVLpW?;i7cmbQIKqu3h5*H3|59R#Jnom=)UYh(nY|Jn*J z3-rMY0%Tx#bK^Q4evVOhLNf{0as(&;*TB{yHXz%Byrtj7`v<~ zA5Rl@tu7gc?DBKiYfq}Qp=Ly<_qP-Mg{~62q~AJ+WH59yoimNmbe^nTN%Qqd6xWxw zhf8tI?vaQ3kfnp2sFO@kMEu90y-`7Zz=QPr#Oz)gD*3t~h&H1PAc-Kxy??=#N^$U0 zT@bN$tz7f9HQ-*X{ovfwste{K)J)J666Kb2AfYe6ODG`j0Wx1ZfZ8T~loUf72LE&i z=r0EmdH?P?-FBl%nV2L;7)p#yYTH&~r#@F_F(F&`jeEV&d5c|liyCfjDI-bBZQIwU zLBo`fVO!I~f))GS^KD_D1o~B^(@xZtx$b=pWBVL*SB(HqKf&+O~)uAnz9G%ck_jJR?hA@*>BXHWP5-s<7b$kIN8sqS3@^$#q4NUeZkBDCkFW@ zGx_IH$G8=DUG8TjDH4TT&*r9V(h?*qG+n5G>ObwoW{-^vl^l5V|B3Gh)GxM48eE`+ zysXQQfN+Wgfw=Ndc9su~zmc3D`N9yd>;TL0-R$-TyOqegLEM>L*fTNO(U$%1ceR^` zNi5Y54I8~}EOrTwGj&z2DF;APLF{M5coHZStavQz8i zpyP{uYtDdUJPoO?KOiku+NejEww#g)R4BAlRuG8vfxYG&NJDu~yC2q1pY{VHtp6S# zD`}52vQl`=790^Olo$|7OoTJUJRU?cxnY=AQ8l#CuJBO&o%+#+faN};R>)-=glWK+ zek+`8g=db@oFN37Ug*TecQof+__g*<>(><6yg|<>>ApNNMcm*A&9^kv`73b2>V7~f zo+QH-Yc$GFiK6bueq=6xbx?osS+1#U^_#6t78hPm&mgPHXZ*guhvPR5O_+b~B%K(o zqbfs42fFj?$tWJ4$dC69Z@7>f;GsFM4lIIG6Cj_R)P^@Cg%9-nxd8C&BG*8pXmz| z4CP!(_oB6Ztp}A@x2%iR^ckgW4EChHWq|rQ&ou2mY`itY!J4|=x}VA*s32Uby2LT> zghjozbrQI$U97GQstugnxKn#j?7^mERX;Ln`fKVN}W* zrAjpb)8eHbXe@Ps5#tnndTA-e*u1-@r2CH;V%v{?-vS~aBt;&X7#J()pj#G5$-bB6 zy{C2GFKaBFhM-SmFSzFpnDp8&lkUaXENt_>eZ?1)?pT;>L#^&0c~CdQ6QWFnKMhl) z9|!V2c`Iz=fx%vS>Q&SnqX!~poanFut^62@9of=VSMd!PocLZU*Dfb1(6o7V({$2) z8EhO|8Stjw-XW*qd*2Nav02iHJtfI2&e8XeO~JZs$bn0*0-mn0;mwJEE~?e1Tw(U>GBALr|LG&@g$GQ2w9p>{nLZ`RzWH0+)=ey0ye80WfDnd^CIlo)fa9w(Vt8L33vto2q z<$J5-eI05S84wUGMW54BCOc<3u0CuH1;p>68M)o?GYV|1IPk zYY3P8#~Q6hUuQoMrYl9%C1drZmNeeh1pO4GU`TE*l0uKY6}PI3Wt>g+DxJ^2IX9wE z)8Ms?M&6M}#(fmi!0mGnp$=1TvK;-UZz*`~;X@Y%ntXgj?mWb<3C!Rw0iGdYh{Ma< z3Or9Pn(=aODubJhQtF+ySEiei*f%7is+am|??7nbm~7vb1+}>E z@x&v%`sE~3h%Kg=>_P4Gd(EQG81g_jCw%JS72`$F+F>*h{xGut;h(#1M2;6HC^JcXJ(OHjza%-$?za}o@iJe1Xpd=77p#W3=|cS2(qYC@U79%w zx9+n_Tgq(9 z4HP_u+hZ|w%*Y(8u@CgRjjpY?je%f1miLuvC8^%o!6hFNB$!JdTaFcwdA-H?FuE0| z5L}8#mh8L*%g6Vw%*3(;CHSxnX`tHvq+(+&>xc^mal7zgFQw|pgTTCFd|6%idxx(ynpOs=@Y2(TM*T+Ym5Uu0fHLaH>eg8EX62~d)w&U91 zlEyjaE8rKOe1;Fd>(Y^--AoG`DXq;wKX)wDZAx>TxWJI(_Y?lb z$ABm77Rss`g`9L*3VZjd0~BUG$LG8&bv4e5?R@@xqr=X~<|#PYd;x9Eyi$Sig^yA6 zU3-O>sFKvf-dCR&rUbAn4TR@buOLsj1kDZ<<|3bW^3Rt)=aK4=lIwd_BXigR!b~6C zT3nJ_g`NsETr2_7rI)PpeeW&oB!~&hUZtIvv&d`Jg*>r1E93RHf?ODPI|LX>%W=@f ze>Y|wu`%=I4Bg8s*GIll0GDxFQEtrz@ez=q1it&Du6?-SMssa|JQ#?TlH7fN z8Fg5*B|mvp1uJ5>);=}y&PDYX{^7*35o%E}^DDyYH4u`G?x!xJ!hCC>h+V@7OMlE#;af2wxi-81B!s+0Pts=BU=j*uAryBEbq=gf?joCojrV_Zq0=6o^@Q1am#Z`SX5v zA|OE|8IQ>K0ArpP3rXx`E30;<*7u6bBMOaN7V`rovcw?68YTt774PwURAs^q%#4O^ zK{nL#H3QOV(9w8ze_%gAB@@1vGeOx+@{`=dygzq=?x(5Qx#u6 zxlwcY(NT68nY?({kWDtGoRNvL(Lm_iWNfi4v!%JuyU6=8_?$La!|rKzDKBSP0JpOq z4S!#oZo8H-4fe#XXht;jCvlU?ga-0;G8^4P%|kh1xpcvpac-Q28|p3}AROoq&F zV}}0hSd_NPafZZNv=jn4txDAic&<C@&N6jdqqa-Fyah!{5;bYKQ&=@j zZ7H_6#tpqP|LK*|Y;EU7MX}AB4fo?JHtP2#O5ZJ4M&YvKZS3Ck-ST-KT{zj43~ln( zQua-CB*cEMI3zDG#Kx-1`upP}B_H^6&6lFD9jA}Dp@GtO+kAaV`*_njmPGYl&v6q2 zA?LIq8st?YhSyhqy4M7bemL@QV@oBE8chb9JfXR}^rBf(0>iPmc0NZq_ z-Kc0?E;@l(3LEhK-KHMa5kZQ@E6AiRz$oG}_1V61(0QYHhV*PI{W8DwJk<4u_G|*R zrjf80JzqPgq|+A0#&^K7*7oWSBqF|zIVa@=;~BJNT{IO`a1nFqwvHxRpq`oM&1xoG zBpYJTQoc(MJ-N&WzIu6SUp>wLT%>v=O}B>1ElDa>R3%#(XLN z#Cp0E8HsJaQa+ff3&_@|*-j49--P`+Vld2lX+LX$z7|2)nD&TF8 z&GY;G#y0D65Bgafc6LWjJ+6Mcwe%@!x?;oz3mEjjCI6P{E4=x^7y?i-9$6v zEXAX2{&|U@5E;nByEH3lqSVo#>?4^WtnFSi1D{+?W7$m0hzH>hG<{XSM(W(kGK0^k zt9f_33bEj)$I8T3Q*hQeUO#SL6ckd&nFEH^M9gvgGek|15S;6I5L43^({~0osaWl? zrncqb>fTlaZ)i1fsjb2XHQo5M(1)-3H(_Vm4Q-qerv6bI|*YPUyF4MX5t`&Uxbhbp%Hm(1Ci6i(PNLIlP0zT1UpvnK_ zVMR(P2=eSi4tRi8DE#WbbL{3>O}d;P9d8A|0*pOphh*2S1J3XLcq(vJwaeIfQa9w{ z{H+h59;Mn^dYXU!D}NC6ma06w6NMl_oGBJzQm90&qj%A#7%u@+?$LG*!@rO8;rLVWUk$En zaIJJz2OJ&lzEgkDW?9KC(Ar(9>bK#VvJ3Zl@}!JM3Qm%~ZpR0_l`qEg(0^Z&<}b(x z5RZ`N!nGU+a97;Vq_yrZ#JYou4S~|-Yrw+=*+)wLZyGrOAAEiL^9eA8@!Zh8KSp+G zVyhB}4uUKVA8q+HXDNka2N1j0(Q0xsA_J1?n!U70OOB>}&uWVtbi8-B;l5*BHfUweZ z+d=@BE7;Z`cZDXsuS4MYo}x+xL$El1i4DeLe?=K9tw+40tc_cI)oSkjodq5&4IXys z;9he$*wSIwEjwI&tKmWGvDgbKcp?&m95fBdMC`L)>Mae=gsZ#^Ua5*4T02o~rl=yR?#N%`H?1;K~FEFBR$N&iS$ zF1Wi5Yy6JQBBCQ)IS}+jH>bNo*uUOgzM$OxZwjH5qbXl;c?Rr$6+FwZ%%r@Y2|-s+ zThvS;eOZgc?Fe~_! zi%QC5?`4$~p(v|MnHly8z9#YQ4GT*76ll&ZHv6H+|3v!2J_55yrOn;#GYIyQWdxS~ zTzTyD-l(R67S5gbIk>lQ9)mw$!jH=AT|EciI#MeaO=Tv2 zCG?+wZI3BE2WOLMIql-(V^~c65!jvQ3`1q^Ld6?bAF9Ooia@f$R@DFI<#jHgc0*~H z%5Z||=EnoJmPad(*8$C0s|Y?{RC}!aZ`_oFz~tI}_3n6#uu+L`l1@c2qO>~p+A1P= z-H`_6pTm(lQOda6-UKi>rH>!)&7WEV!z}|U`g^2`iox7ar=il()rXgYR&7{J4X^>y zPfc@oI(~~)n)&`Xu(VS-mlBE1(2RZjp))Nl?c&aR@5(=TPRs&wy)g2~zji~xMyy;D zyLtU{ z$Zzjq{A|017c7rR`ojiPTq3w$j*nL4lBU@8{LYwE*Qs(V=S!V$Gl=0iI)!oFhDU#8 zt~CBF&>h_BAJfMVVBNY(i$Zd6&IN{Mf5%_GUdvkl)b%>2s!CDd^=*@@lj762pv#Z; z`sO-ou$2hpC`}Ft33(@R=;gMMW3}at>8pRl4*qE^nX?M?UqTd{;UrV_XVeUEMu!?i zyZt6kRSmEE_Rd7}C6U`t>fz@Uiq3IB+K-j~t&4OREGI|f;!2tv4*M<(V< zGd$N6=J6%hmt=G6C9W_OJrw(rsmj^BgI21b8 zV6a|+)&)_izZSPmdb1!y!L_}`#lhl&XR0+!A{$D^+$&5r2($IOHJV z?OhSzdE@FJ)SW=A-uV*fVI(*exKdnT<`e4ixG|gWO*LWBKdr%|eo}4ce42LVd{(M) zg2zY4*FQ>3a|7K<-rJG>s?aE(wBLUntIH-+?X9F5;xPG^K}#{L!yvr<-o3-KnYPN# z<~2ELud<8A)cMMPrI8F2s#bsfnEWTmALO!f^DDj4HZgsEl7S!^DU1YBd zjToXxlo3Ntn;{3u6}&sSUM*aQ5BjU;h}zy`^a?u5^NZ8reOHd!l<89&2dt>3M{4-b zYUUDJ_d1&=V`1-8!)(mad_7uPIUhT*44>K*hV(IK@+`iS0wXyC8+uHri#@1MLYdgC)YeHS=`EsL%^`fSyolw2=e3bkbP;-rAVbpg}B zCI<|mA@={8d~sE=e4(Oapj{qIbhd~cg&DM+# zP3K>3$7fCbnamiBZ5-xH2AWR4;f5Z$bu1$zW1_XIOaGvw;}1f~-=v4n8Eb8(0Vlz( z?UvvPeu%xFB7!Ta+3MY7G#K8j_sQY-!Pb)z}1t!^Ci^?o{xRSSgY{&3FqGC;11jmK`n7- z(pj1qmr(xq(9gk@9PY1GswG~O)ilBK6@APU!KunShkNUIir>b0+Et4Dh5`RokET}h z_;sp(Mu+RA@)RSg1OO~tFx}2HTbaA6RE(Z)?76SxiOgm$+A#C9|Ih8Zu^-+3pZ*TLG{mC8ZLkoc;p`$9`XJ+xnu*vi#Q`y1o;-sgFN=43_ zy&RRs{dt?D1y|$VJKj%9COBJcuJ+EPj&<)eM&`C-bFzo|^l_0hd^<$njqR!%k9ejy zNf)h>iToU>{%|h3Jspw202hVS>_`dknWU|x4Jw{as&QxcgiBe2cMgbq20k>+VG=6V zvp2&Jwsqw6%E=F3q|R^3+$ch7Wlm-*uBEcGqKgUj?(>_mYY&h`)=j_~dY$Fjx%0BB zS6tDCBzVJ4n=bd+p5LujGyZKyV~YYkH-DDyu3DwZ%njDeK0o=~F*P~Wu^!!z;`pNJ_?o|+3F!Hcj(Ae1 z>jV7kGos&hBfq_Jr4Y>?TT z*{IqEX()L6=_uGTJnbDcn_pUTer+qJ%KvIx^u)8IYVH{Dg4eF08=E=of!+xMdOshk zx%T)a>3Tw7@Mob-f5uy_+MaB+Qrxx-hA=y6ki@k+O40inG z`lqt_bw;kvdqb)iNEpZb+Lm@#^@Z_&Eh*`h_?$_+z*VuSHz|J8vjhxg3}X1-OnDD~ zi-D%Ex_Ku!gkHt44gqH=g{`BDl(pJS(7*CKFQ#VJvz}XgZ*3febuyyvd}d2m`e!C| z)M|%u35-kVE<$mQ;6w(975x8uy8LA@i`$9;TQ0I|?ea@~XLfdVWn6GA*eXjI_V*|4 z3?q_|uOw_`RB8C-Z!+!8F9Q4YU8*>TPwY6N=-R`*&Sn(osDNF6f^McbP1l)%4a3mM+j^c$=(d_D{b)vIZdcV)d%YwI`~)Lc zD<;rA%KosHEl-;VVY%yO#!^V}XIfn=T<{< zoB7F>2U*Yy4)N~2_U425OB~G!4a!}G!1czaachpBP^RJM(>}Y`zDNP!`6gZ$I1Jv3 zVulUjHd(`~MLt4nrBhYS`>Fxf`&?peC8u_i4X^Bw9ktBpA{Q<1swX4 zH!8d1%?EEL1l9|bFp5BB5mwCquDA{X;b`Ct5tL_s;8&hR(5$a)yn{*bI(R+$=WUgO zmegJoW`Tj8t)-)qLh`wC8Pjl}-Y{76?Y$-rye3>lg$;CA@EQ8JZ9SF1a>Xo2rztIU zZyv-0zg2?U?;@qGBOzd)7<(xy`w?SpUw!{xOGZ$&FaP}cvs64IOeEiS#zo8SE?g}^ zms9sSo<@R>P5+S^G{rU#w>%$N4?)jKcYROa$AB2Y%hi`jA;NKN> z-OD+u7LV=&;9Llbq>Z?)t9g*|C?ojl;1#XQHz5cHeuY8wwBWxrpY9z9qI!N`P3`&> zH8uY0ZqBy%AKrr?;b(zyt=g~~hZ_-1-`P%lJi>a8Hvi61+t;tMg6V0kXpPPtZE`)F z;>x8dV$WT8U!ZV0Z>Gq;tGrljfL7%OyfX)x-h0|ct~aS8QqJWPqT0W`Y%>TdIb&~} zcMcN%^hPMdGDu7jQ;{~JA>=1a2haNw$`)}+xO#TerzSMyw*z8u9Z$ecw_Lr)>atuP z|MtVNdhL3(*04sO)Ka}nP1YreSLc-OrR0_NOkX*5qF$!HGLbXCKDS;;GFKF8+VC&9 z`pUzp#pD+d)^D3N2pT|FMoj^^o=gS^kGoxAzb#qd%CpNRw4)9&W-Q#j`q+0)UKj?U} zE%8YhA1e8Quieu36`nX_>c0uKi@XwoU8zrzKHZ(m%^Raw-oYllOQYU3zhopqR0q0r z&+v-vwQGVl6W8!)-0CsDqd-^lcWVoz{r z-zFmhCOstbBPv9dsg+6asW8>OEBp-o{0Fq3>z02Wo*c$iT}ho4y8YYqkLhpX814_}%4 zgT`d+9lT)@*d_8qS52tHcFsEmtAZnrBd6@?_wNilN`YKFx^k5G+lrK#>ScV8`O}^} z-<0`dx4RNBRMY2jFO|GEaL%d($xk2m-Mk(Z5Kn`Z0^Ho(dIabEjPs4LCR@fmoxu!nio`a{Q~0iowS(Pt&EXShHJ><=#6P8i1+T}P7Cl)nlk{pr%3qYR!gZ|0(=E0AG zP~h0xn-sYy$-NVlA*0>$Yar0krzh{8Y@ubKk|di_f2Oa^S-J6FPMkFY$V&{!wjvSX zx<7aC4T(Y}A_E~&*mXYLe71do-%{TEt@q3%mfu2Zw>FK56=p?>rpo@`s$?LEoOwnf zGFAD94rQn$>M1Q`b^+yG;jfMV8xRKyOxem#J;4Eb_khywS_vRALSh8Klye0=IQLHw z)%0^9)6G9s6tO)8Wmx^Y?galNHia{tUfJE{1t;YripT&VMG#u_1WET{H@h>p=?leS z6K-XJbh*zC1RsY}R>gSt$5L_d*69NrFZY|lH41XM7UG6&$j8WE7Zkz6G|mFCi2g9ul=g&6D%E^|9g!^H3IDhcJtj0z{IjEh`k6*j^S&TOUo`AmBpIib&;1lDGE1& zD|eKRWw~@vDjYfl?$GVG*O(d1Y2&3-Ci}}zkDNPt-TwmU^>knQyFuF%9PN~vLdL-K zmNS_tQr9`_epP2=oLKu@V^9Y}&fa20!9#g>`wlz|9K!^vKw!xj`%bg@Y4>@J^Dv1G zTTR#i&G|&c*lj03TNex9LwsBea`#^y#zE159He0H#U%3g&;xXfwO z45dKrPrrRX4iM8jr+f-U)AbC)zFcQT34|E)>`yg&9`IiKRBy@jXHT}7>6Jk9Lmoj6 z!-|TEA%AOrr%p3gy8jH=f-aa0?V=3MfM+Ic15+)+)AxT0r5!El3hUlhuQu*`cKdEuonWToQfkA_y_lMSrZ3lyZtH-j{ojO%V8zuj z*2wLugQ(-+(b4T%La>XGhVJtmRQ88r{;N?=&!(u4Y_kN~U3@HiMY!RZosAOPi0Ayt za863+aw6Bo_Sas)yzl<{NW8@Szz zAy(vHT^dB;%mb}1jDL8I(%(Nf-`?0C0dP1RjQlO1iCyrij%xbaEz1q9mZT){O*yaU z*%Sqmy{>fr=>9@edjvjFgB8fJ!az$3`Cw^3GNjo-1^J0HO#rnTOwjZT*ryt&_S=1( zGG+H+XO!{$aZN)F^Mg}77o~2hLq}D#i}#0AgC1DLs5s87`@5!$HWJdo;Kuyq_=QpxzIJE#OC-cbhfoy%uwO3Rez_@RQ$w$xSQ6YE}PxxdZU>nMCbbx&*j zb_ar@a?et3IQ#Xp{_YJpR^gXdzunK{DogF1>6G@QRI@I`^;w7OR@wMdW`TdDQ1ren zQr2hXy1NqLa^716IE#Q6d%Fc&!hQWIz7Mn z4a^%w7k;{5;ndJ#@BT;qg5y1Y_y7kLhETOQbz3|>e5Ti73IA-^m?D?)l3K=YcT$>p zl0GVtzLscUX7p`YksYH}U?z_pE@^#Ae;jX4=19J|G#H&s|BYYLk8Ji}=FHpWveyri z!gf57o=&D-Qf#nn6v`ZLrvtPBW2}UC%QFdo51Wh$F!Iclk^diEge#`4^P6k>FTA#&*<ww)Mx#O^r(q}y8~QX-#Cd6*aV+(4qQb_sd{X!N^k6V&&`Z(loKaFo z`C&GA=8kK(-6hE)S{j#w0gUb63lG@#C+tx*N`cc)D?;=)NtZce0AvjBdm}U89!YOl zcbLJ4l%rv~?udPNfmDyeFP_4!n_=$v6k1`?y^00Sg=5{r6O6)w9m3D^u^ccS9-fL% zIiE~QT`X@WF>3HpRzkIR4)?y4&Bmu;9kWq2);|Z9U1yT2F({>r637%lUZIf0DY?uV zT)9!yVpNfH4^XnSy@)+*~r-wo_T@MORVzFMfSmXLDN=WcWg%8wg)?)1>S z@5UfDdCID52EQ?=e&V2_Sj4Ez-*>&QHq*6~Lu#YlaNk;X_$I!_B+q~Y3lGeSPVZxI zSpd@I9GG0K!h81NiNj7Hjx4qjs+?#+#Dgn@j z;fl8+xs~5P@?EVO%f2VG*k`S}WQr)ipw&(zKh)^)^a>vX>dnO#ou8)F&DM=COtiTa zqK+$KUB7%2%jH@34O*S8LU<55axPQ-`YHOEmDT>Rvm5nc2FQi7=b?=RN|0Lp`oe$p z$pV!6WPp!rlimB2nv`@oGDv)sp>Q~guFr(WWpsH9>2T4(5LrV9aW0yz&idGmKB zVJ4yaaEtk+ltfe#&k;{Ss=$lGw*}fb8=vYP%M_wr$lpAZ$^9##uK5gr=+CtdH#gTS zE5VgJhwI``Cdrh(i`*Jn$&nFE*FsU>`~+qkQ3Dw7Ahpb}{gpJp8LaXY>b4?P&V{qnu>Fhw>1J5raJ)3{tSBj;LnirE8)$cTY_WO8N*dS;1$cF}bXgMM3fa~$J zH~Qvc>yMir{S?PAkBKfyD_-;@+UaH@Fa#CXD0MjCb3VO=pMHErC5VtLPAfb4m&|Rm z(rHd-l&_`S=sy~mUT1ID#<(#1R)s89PFd--prl0h*c%+ zcRpZ6Qcs^@MJY_8WkfLq_BwB-Lc7VR5kcplHHBW+K8CAg)K#9rSTElmleX29jgoht z=oXquEMMx46;+2nBxDT>a@?|2}mtJapZ-$&Bxt2B>h3L?UJOw^;X)AOg}=>+3Y8F1WvmqX_B_6L1^;d zFG(tQX4;j?aKxTp`gL2i$;hKJxFW4^X}xC*1MmI#xW7JuoQ})&?B7O71K>11g~q}3?k53690n~NbWsp>#f?ey@H6v_+;8ui77^m-Lya^jRU)%JD*9ZF@ItuJxf>h9GaqVFz%{%2_S&(Ju6S zFF4d%WbyOQy#3<6`@U@g!tD{Vv=Ss6J01C#873zoc|oenyw78(#=^?jRa}VHX(w@o z^7K+@`H>cVd4DZd>Mr*au!EDd_68_TV+!N(I)&i4O6!O2{#K73EL+Oxm>)R7g>WE6 zZ0E)}Y)h1$`WKd%KQ4PqaTM z$b-w@s_oXe7MD~M_lHi7QTHCF!82w^7+|MPbZ(!7Lh-x%|kn1Fl02A`|#!Y#DLp9N)804g|x7UZ*|k| zi9wP4T>6>3lR!1jzbMmO->k1MEg_^qGJbh5ZL;wfaK z%l$)Y8d#FfU2Wt-xzAgkDQZHUkT~<{i2g|l($Iy#IT=a2ITjw;LtSBcLV?i}ViG~) z&r2Ny#%xqtej@t?IcPqM=VG}YFzO4@8NFxkmyjnMnMU7*;-fHQTJ<4r?LuEIZ!=K% zcL6h}my!%Wpp#?CQ%Ts3n{-p+HAkVW{X>1VS`^_RW{oNbQnl$Xp7@NE`5=!T!jELT zXdc@`>|rZihisWM0J(*>b9fBWjXt2JTL>xZfKMCETsc~|iPM&){^1(1Onf7q1JD@g zX>l4-xm^n>C?PZ7thaQDj*)P~a}yF1^-)Ig-VQSnqb6QT4&yKCQlzc7Wv9N4g(sJ9PYsN5_yR++qt*h&dbhMqYLn zZ9S;vRdY0sI|J$%LvI5?}4r~$m?n6tT#!?FcSWzWUv8EQ~ z5!*c#jY~VB40Tau*Tki5na0T9-Zofj*`dkp{9Qa$5`iTedXK+jLVRzw2b|gTi)0yJ z4>=Lfz`V%lvfkFqVVA-j7dRXLW_Ao+C8foMv}zl%J48qh`on~#x`fQ)`^;CNFe&oz zHTxz$qYJPx1#SImee>YUkHbbT2TP@ctp+kq{E$=@>P5v<>0h?-n{aw=49-NKI;|HR ze|tSe+1{&~ulFv+a;fqQ0G;tjmH9ul$4oh8Ivd((hsS%J0Z3Tk9$^vN#{;RnJaBX zte9+6+O?#0`u~yk!*q8x8J>g`*Oz!_i!zcnHT`ExOvb;(zV>Bf(2|pdZE zVLoq@sWOF*{@~FU!^rGOnqI(TS9etwCK1riUMq=4bp1G(p8N!5x45nW50EF=#wtFD zrPDO>QMf&$LQ&{nrNJh8J}NA2-}(aZfY}(xM`1OwrX*yWomCm2JEo1w3I0BI2^G@$ z{mN|gHo3Gyp6lxey}72T#JAM|4E+W92hYb=cX#`E~MKdc{Xl`JKF z@qWDOP(yUY*?+$mi`PK$klIA!)3q!4vI$XH< znFR8a753GaTSyRK@{Em&KlopA)Z_8*G2{bdR`TzWbS!*Yg!U=vGbI zW>$;g%Wy!FfS96VIn!s$aT&5$oG$!qz$R;Pd`;ikzaKX6LaIM<^=bnHd+Dg$q zKS`LnZgeWfxTXaA%KJl&b?uk!_zBEWe0h5!4LQRujUh*<+6m2{$<-x(42QAanOZ!C zIaoSV=C3B7o8TB-W#KSqP9zk4JA?>B@fuBtlzzR#CWWW)CjCDnw~>&xYwoAj$oq{TTEGkh@f9j;d&)KeHQ zV)E6M+)lt2)BLysC~OutJB|1lO9axKJX7%v&Gq`R4W`jVk)rL7$()MCs~A6f1SM`!i2Dl&jy_#GYtsBC=8jUh`g;$iS6`4lSC_DXB^G4jz1Bx5M7m-PM+c($ zHnPTW#yPI=n8DdYX&7|igSgA^=7XhwBSlrW&CQQ&cA>X8mk!F6LE(K0C5xN|OHGJl zy~Fw^Yb65(VI(j0MK0mNG6;~xxgSu?tU@%?j9gT2>5PE8>K$T<{S)P!y+P%Qs)@sONv|)$zxq(N4GP^{u&XyzeMz}u$vz% zAR2-5X}w3y3uY}zfX&K8`_G$J=i$Tdu=Yz!v5(B8*{(-Ei??bQqjEcOwQ&vSMdjkp z|BTa(R^gD0cqHq=MUm1;yQh^AYpE>!Y|5Q|cJ8`I&WF_ZP1VbD&fX*Sy$_lnR|k+0 z9h|VVyv=*kaZ*d>tii$QvRjTIy%G@hJ7nJkzEVqHq*oqp1}MO3rW`oC1%z`AB4%g+ z(U98snB1CA^4}PgzI9DWO6tsf@;Su<@^DLq8t2qcKYewB%P`@!1*t)vQjCSDRlwj9jjrL=}+>7Vgx(b|yH@ z`wiR*<2Ry%4Yee2GJG_y$Yo_n*G7vfm%U?|K0t+O!{_@JwMlQhZIu=2$C?iGu4-3p zYWx2frJP0{Z7{F;Z;~C^We4veaXVH4pg@1wjcY6QRYURQ0P3!UzHGnG^LJ{hIFEBb zNG{r7wqBA5W2)2KtozP8sn>&$rT1O9sPI*=bf?4|ad^C9m}ocb8LITni^c`U|1wAh z0O&!oN9Jk2ZjaKHIT|UbxDMqtJ$_q&LE6Q&P(g1RZOl%hj-wQugR=SLTLS%ezUjJo zoPelvLm$~q7bPM{_6faunwkpFIPmIEkE{sy!zj)ROk73nzYSwI{Vk9m^M~=5LF>Ax zz)66BbHTAEzw_s4Y>6|op5DOGwWnUK=1mTNlh51X>q;G>>!iJUR`1irH^uk~QcWv* z2|*h#{N+6asn_aE;p4EOjmSSjeUf5{0L^NOC+>j6xBTj|V<>v)S@7S&(qoU}p&wMs za%J4sQw{EPAZl=Ntu-fVX>b5hDt)L?98_FNtW~B!T#98>zQcK~pAE`b`Z!>lL+*O$ z-xA209zEIUkC`c2&^m4kGj$_B6zJ>pQ1h6u)Bmios>N59k066qa>9*jHX0sxkJmSF zsS^;TC)N?Td&i15$Q_eE-`KZAxQEy*fE_D?T6mtnM*Bk03-2SM0&kC3=$fcy9{-?+ znC`}#z`3Uy!|#MOMQidLep=i}53T!3Ng|oM z78I96!@CD*NV7!=f0{M;ov)=C)s1vou2!e`y#s;Mps$l}wkPqL; zW+)nj*!ldy5$ltJYk9fmu@N@xEG+TPuqSTM04E;)Y+(AMnT*~@xW&}qji4qT@5h=T zO#(Ka24WzcmP<*etr#rrdlF$ZyL+`8+eKsrp2;P5$Ras~8XD8g#0ovclAX`uYXaO9 z+>xqH`4(;innBE6rdN9=EoYleFAikozfxqS7lak<;2g-IR(DO&+tt?AxhCGT0i3Zk zPZM99^L}gBxMuMauN8%z?WY+reNJ5~3$tE0gkm;=Pins+V#JuRW|Wx7LM+M-1U3R> zrPrhQcp_4594J8&hicB~tNT%sbPB>-ZE`M##$ti*!;GiKLK0%)_7wEx34SC3ZsEOR z86MswuCz19pI{?-Yy_n?WqDJ;azw%{QQiT^(RfgJs}4b0*7H3lUv9I2)r4In;KVb2 zRKzxVBmf3@Rw3#g6RICnwK=cGt2}wV>?O{bz(;!?F)Yv?T4C)nShWVCen zQb#lJ50O1P4O=Rosz6!5!g}?2<9!QsO(k6f7MH)^=;&LSDvKF#dG6tiUzWd<9dWAo z)wK(38dr2{i!&1%MND3c4JvlcON(!=J>Ge}u<0K1+4G_I3Sy|dTQeV<^JbaDU<)PHeLHvx5)9sHl zNkz^tr0w8WY(5m)dUkXT)U=Y8{AOpaBLEFJ{Kq*IIDf_Hk5ss*l%})Qw{CtweP@zh z>bYuqAPZ`{Zo2bXTm76w02jhb3vjvL%`al@z^?QJA&#c*8!DAu5xEQAm1N@^O#U{y zGb?h~q++6srViIBtmvDSh~1)48gE+4Y+S&HgXtG4TM%MaOghl8^=CWq9h)4yvAo_ZyJ<1R<<4xlEExZ*$-%MYo@enpK+D?1*1Ymt|P zS>hYL`VK^JJ3i6-*e-br!lSTrX*28$%D;5;t0*bks^J8U|0s>lP>j@SrBmKr6vI5D zgc_1hv5h^<{3Ug*Rk1o-qsfLZFT3LAi$o6O`fr19-XByxGxajGfq_jM{52Jd!)BT% zYr_%_%HZsdJD06JT5hgJ0zZvh;Qji@wS(yVP$=M}#jpH(o$bq_CiSNzkx#+tZ{_og z#Qq!GpS~R=BK((noJxl{Ri)USucK?MndjgAz(%VbRrJCy2&un>d= z{p6FUM4_&ug@`;*-^99F)p!S`w5Vg`i`lNfNExWZu$P5jz3u()dKvMjQZR?d-xhnN zBqC%Xt=GCuv!%3uD$04ZzoZ>Utqv4%O#EmcsJm?W!RSmHwX)c^2F}a0#IOD2*_x#T zdU|{;HFX~C(Itabo_-1{ONd?tu301h@L&_%hXYt zLFLv>`a&L9kRu{?yKc>r6!f-e7MEDFc_Pq<;xYY?k_Gc?Sor24Xo{+o9>vqS6cOl_ z0Js*!ls|n10rNw)x(w1BzUW)n~b;;aQaOvvV+`yL9l%0EdV6ji9Fo;i>WKw#3=!3g$Yn-!@M}VU+_} z%vUx?^(T;4x{f^l^!cGoEli$u*{qf3((H7GDv<|4%Cz_XJrzROYC^D{L@4Mxze;Q0 zD2Xw|Wtxxg;9rF`RW&Z~j`w1G?c&1Y?-qedNy{M-v~ttT97BTc=o@$5ZT z7V(+zg=p@`nt;_wVbLkvK*#+GVX>Eo%iV2fc?O;So~#&^=7!liqj^)$zva{*HOL+e zj49rKv2Xp7BLUdAMMQQUUrTaq%g<`!;o%^T21ME-$;@j(k8(Z^Kn#rTZH_kFA#8JisD#H;~47%nzWV{fs;uiN6A4 zvx#KALC=+-L7I^!0Z?NX+@p!Qi!wg3ARdxik_y;as)9$e4F0z+CU}S*#mB)U8Jpzi z@6khwfad#7e|6AP5`vH^=ee9SG5Pta*S(*s!xmEuH6;S)u|Y@1t5aPMR=5NJDjR<* zu%b&_lqUKT9lp*yD<-8gs*XLJ0w)4H=m#W)!yOJy}@g7NyEeplaL<8Y31&2o%Wuw$-KJrCrc~#9HsK_+?v$+!}~^6EmZkb_E1(Y zyV81=@{T#cQDpqo9)U7ha6+vN9jr~RG#SKxBmDI3UmeVwsz)FX@Jwu3Km1c{Iqbo8 z-eEZ0c-wkRC@ixea;2wSJlj`lx+bMqviXcq{gc{XxmcdHADZfcV`>;$p2oOCFAAWhTajm&&n)Fb=!_S^@TVVejGAeEcJC)`+cz@ zdd0Ps)MN(o1;HD@(ONZT4c4%mC&~<%ZKzSILe!p?`0ZB@cCb;P^|}67H`X#=XdJ%R z#y2@#KOhl|By*Fe>SNIAt&pZct0*l82Bi#NV z$&C$q{7w3AW(Ixj6J$ej`u;xP!R~I?jj9ieetkgM{LAREj8j6j(mSi=K4F28!dwOC z290GFSI4(FL{)#=K80^NU;I+WXT^$Q7veoUf8f?HfJmr7E>ba8Wl{=R&~lIDz&XU>6p?`a@G)UBu$*f<-E59 z0&X-o{s{S|1DRKDhSJ_()=-EX6Z`SXeW`sN_P92Obp%yoYO-*v6_7M%_xEfx9m9qF z`1Lp*Z#cO53?)LVtrl-XtoY0GNuCp>rTk5h@iNR}AQy1Z46OdN`<{PK1#2~-!u^=9 ztPQ)fDny((C@^}Tb|hg~Q!`K{)p3Z%!ka6gUzcVar#$17keHwmqpR>0F6(} zW97LQnO03-X93xuuTA$7LN7dhaiBKEO_$KxYL>|je1MpDl_G2wI(@kj>k_jU5t3C?tTZ#EXz^fJ5gGg5I(NBu3xNZdyAWIB5Sj~#b7+CrdQhgfW@jc0GL$dNn^a2_8NI)N%+zf0arEiby`37iIC(W z?J0Rr5Z+Ja&$aZ z*U`F9VHORB1;6G&PD|zcL)0kazAF|P;!4oFc zPx|B@Bh3z--aPBAn!ZgB@Z);sXFBb0oPV(T&Y@%jMt6Z2s+%bc}pFGj>)oXwsP@idvqFMrSvfAn!Ak^SF=tH>l5fk4QP7flO>hM(-{cRV1h}yZ(ne0D3hzIy=N^BjY zf|c1pZfNwBRxgPE%{Uw4{xb@6FzOg6?!fY|mj;b<6H)!nd4pT0`<$Si#Uxhe6}73y zwNcW zqE;*2p6K<-W@omMEf5Y1QI&mNh;#c!RyZAK4iJJ89{J6i$nM5e9mnhGd zL~bnUFK!a+d}R4R_Dn~1;gG~>CXmt>JflY}rNh)_ZA?sq6z)8i-8mk_kM{Nx=?d0J zMB6V(!FEAr=g86z6 zVCsjc?Ow5-Nmme;8aV+=saSsGbr4D&=NIgl9zf{S^u#@Z`^dMfxX)%~`o*VX&73Ak#bT0)W^M}}F!t4~Vr?P|Gh=;|t$ zpMX9%hF#{j7%7vBc_wiqKFc&lSK3+A_xaW}nm|PDa+ku-s8vw%a2eL}KJioDPYO5U zW<^M5P1|3F;K0qadqrHx@YmsX-M&HkvI~~e(_EmCPUBu0A6C2^w=^|z0`}+fcY8a( zenOsuGAkAI{5T`L`B$cRq8wONel1mjW<*fa%$iIAYE}KKnP0@xjQ1`t(#ZNR`~-?& z)YI<+^9puJannDYAUD`ACzKsJntBRwzUopp9$?o1wNh){sdgw|IVOo*CE16I)VNwv z9oAI8$wRdbUm~hu&buyQ&8Kusc^Rm7@R9?LDRL*?@rVIv29-kItu9_X+x{F z$?Mi`LF5uFM_m56BT@-a9)^tGku+mUIh$+Be$}GAu&E8dQeL9g#JusMS2Pgs=h+i8 zli<}{2?BV?0WukofW1j0%Ga>3#aN%d^&$iCWEF0<$OO$RP`958@2^X*N^4rPoD@Yj zc)GvaobtpT7+W5*RkB4df7R+OER%HWw3K@$DF~}HSBEK#{Gy|#3PM`0O>4D0i~81E zH)Kfwh^}%Ar%c#^$uY)N+27h1f|eurgC<06nYd=tfk zWbGhY9mSFnO338kTm4u?Hsthhdv6B2rE=~mOCMh^U!rsx-~khbRn%{3v(_loykKV# z=4!8uUGVxq+Ni@YeQ-{^B-tEd_*$B-uMT3Xdmm!V))-aK+jy|x1E@O?-VD+a&k5vx z%CC)|=doGYUe7!JVR6vJ_x@5A$3mCy;TJou5>9}x?*2lLYr?mn6&n?$nxWwSF)s#T zHfZGePvu%Wa^3uP;D%h_O<*R6qzMX>da^*)0~A^30`1T5%Nho!$hzu9ZA0BgqC41g zy)*v&=~s#Q>*0qo+PiQq_dyvBz1lf{b3K3an3#764=!sn-{cy_+ASlz=F&B_*dqx%Pf7)XqF(aA;eoo2>?THd(sjQ@89cP$pG^l0FC7R!!iwwcLhCDiNI%R~f9Vv{F@KMFLupXXxVegR&6YK=<5ab?Nz1Al9l^K0 zW*$?1?q6H_%ZZUm=R4tySf3-{d^Cv{Yl~Y>==1+WTR%``w{hQbI5E(*OFJ*Lid?_!xKIP?Q?E0R2}#8f*ciTUTxOa^$Di81 z`vDkrz-J$>1>tNG>Y|KXD~mVuYycM`6D@-PAo!}Cx7_hftsS={4aWc-qbsjVTMz2# zDe{~uZ39SHRw|9?0$dxT_*B%EZABcvj< z?0rVEGBU#5Ng3HGdqz}dwu~dPSCn;D_Fl(XH-2xQPkp|>-}m?D@xJ%H-mmxT`5MpX zV}$ev`UGm@Btp1*F9ZmX0)@SSbGLdYIFx9i(o5zmE;~y1<8fQz;P@B4~BA z2)Ee6&sG(R@&bpTz%OD?znN<<7TRs149a%LuHW}_@Hd}_!nPV__lAx!Aq}`?C`0)$ zhwEYL@{7#hh@rfX+tu1{Q~b>vudSW-R(gt9e}mW$+e}2nCsb{(i|gMQ3hqk&_oe$pW-bZ`!?uSlZbR78;Q!y>hB1&UpK93*B_5 zm0g9vWWP#75+IL9e*Tcc04t)=?MPZy-F%Pc*5CVl$dIB>$c!JB zWRXcpR#|i~GIfim>|SNh@YwZFwa*f9HcE#%@A)&4wQIzv>*=Yl^=AP}Voc0Cc^93S zUK|X3AHe(!nwO9FNhKKp62tmn>l1<=$b0S7Wl}rG@nkyBFlc%LDnk7nF%)(lm;^%4 zyC3|mH)UU9d~6DC9uO{;F(Z!$jodM*7q*SlBNd`-PBuF;z-WNj2t|#SE}rfJwh!$q zV;;V04z%xFPKzVA+w*R?Rn?#C%s=#bTTo^0ym_kK;s2V}zLI)6pe13B}4{g$wexcH>$v}oGfVojaO z?HAoEZ@sYU@nzAW&Dy<>+DkdQ?ksWX-pQWKdH!Th{W&o_4kb46&ai#AV2XT6T#I5S zlb!$RGHo6P{MbezF0Ye^hikX+3`Y74nfp9^rb)eHxNwXwd7nbFL#siW67HZsxmVY2lr)iR@Zc(ZhjtqlD$LM2Mcw`-ZB5$^f|mvhbc>a#Ip;PjZ^!zWjAlpO9tz{U~Aq66@-5s6N7?PkYr@t8wzc)1}78 zEY2Q?Q+cE2VtfG3c7EEA?)0EwlPywS1VkpLpVje9@?|P1c1+4L67sH~V}tnZ3cA$Y z$G(ScXYrE2gC)wE1$svQTlL(XoU<_`7dT=>jX=s4c2O2ruj?=+iMmH=y#@ezO4*41E_G3I?dK3pdNK zsDz%Q0So!&V8AHTU`y~gYmouBg+;f7(dE&WTR*^!_|wi z#Z88&b5z>i?*RJD$-xuPzdMwZn;=rOuPg5d$q83PW>-M|u=cQO3xcgWkzBBlw&lx(_izve{_Z3d> zna0OkLRaJ?NBRbHynOs2WuXKhgaNd)DwuQi`v} zq1#mTz%1$J66JgW&(eSiHuJZ|ghJL|Er5!|0n^t3hDu z;S7^SX}Ho|Jbhn`_oQz&VYlG;`gJLk>xD9UzfhNW3{ygr;SBL)pf4ncW!09i#T7R(W3KU_QnQMv1V#_-yh|`6?Gg*K2gNVt0+{b%VfDaBb{zC%Z`WmFdv@AJjpf~w@<_Mvfn^v|M&(-=8 z@VnIqH%k+vir`!f;~O>OT|N+%k^LXMnUE&i1s!a-z2NPHtc?_G8QJOwCvm#eIr@C9MfotCR5kZ?BBC@DSs+>7iU=9+yjP8PKndMsf zSu`XO%5@~8&$my05#wl;bl<)$F|VQdwd^!6J5hYO<*?%dqDxiemSHEhVz<|r(^u5n zJ*J+{a*{)knyW5j@Of54K-BdORe#UR{LDM&B55IaR7W|T*W8K|>q%exL|QMcNqh3w zvhe*vixfS6GsDhhm3g^;TJGTw_wtHx-J#7K+$*zh3B+`NrBb;k+h`qLPAb3l>BpMQ zHN2c3qcTmdpKK4VsNaiAH^G9Fzh|?jt3h2~^PJ5+8gBx*dD{0rTx{>~M zugk=d-x97(isc60IPxK|Yko44`YQ+iMvL(%|5@jfcn&V4J+HL>WG&mu?nGWmB&T)i z^$Mr7U&~HNf(5R5dLC`BaNZs^lI}uTvZ!)MWr=$1_xt8B}8Z32f4>vD$t?aM` zutZeZ!0WDrZ#&)S7@G|{l*yN-K%M9I(!C6I*O-jnZ6sp|7pzPmmBtczotF99CTP>+ zw3f8>$l^gyXAjAQV`HERfcG=G5(9FQW=pMe<6`h$0YTAk7PCBQ_~~Hck<3H&2aFtR z8^nCtujCn(&%rn9L8dzzx%~eP+f6F9eNPX*Q$&N*gYu-Vr9%m0#pJr2!gBir)Z);&m9G;1 zr@y2MiF77WtQ&^my7Ubxwqt?+$Lg%oeLLzqADydx~pJ%4TuF(=W~;p1aFHP@%_XSk~zH;uWiX^12qG{g2*dN2&=cG zMOv`ym(^&&CF=BZ6kR|?wH$iLGgx;5kZ-ZeEnNxU% z^nU%ryZ?vN1Zkl9IZ0mDmfXvqzUWTd;CR#C@Hr1gKZ^I}+g4ra4xGtp*s75|9-VT~ zygZ6S$jDynL`Mg2A;$PyypJ3F+=J?r;JYXIQaC9)+umf5KF!J9fhn%M(fa6kpYwt* zM=damGy&<)ES~8DCYfkA^~5L>RR_Px-B*$?0h4swP&N0MS5n8GjkGh;h*C6iY`cH7 z-(&J-C-rNE?E>p%kojX@aNut|f=9W00M$Bl(4h~AGOwTbUCVx!_GO9p$F_JCT-GFS z{!@T}-eQUe`_0|#&RP-gj_~er1tw0SWy99Y@UPK8DcXob#ofiuog^#X8BAV(Z6U1c z_by_?i&#*!Da|iQ=k7*!b^LbhD%GuuQbnf0<4<4DHLumxXZKowd`bYZ=;OwjbBQ&G zqgFN^Ofp<*S;gpjB4FR6ra^VR8OOD!WZVwyBhQ!b{Rf$N1?oL|>*F5ao+q+Rj`yEZRlMIXDd-7I5IFv!u&zhBs6=)D$gcT9v&tu!7Vz^B9A z5V!cuxmCVewejk$5u5@v*e6iUkHIR#ww_eg+vahHUl|NnxPet1!HxUs6ALD`!nNTi z!?TX3MI8Joo|6sP45I<5n05J~naT5BGM0xEqoKRFz6cSDl<|^qZ)ZUTP@!Sl^W#>?U*F*~kfuc190w5r?2LRue+p3^`MV^#H^EkN`1Z5NZTd%$I~&&TZ`Xub zMMpmfKHm1i#^*Q;V{1Rdr?W)t*?F28t25$*s zDmLb}z55I>^0@=|!g;9gWgeNLSNr!xUSMQlgxD!xtH*MyMH+oxtX8h^hu&N1wdWS{ zQL*((P0x;OY>?a47sFge;2zBjrjT>{%X3@IOLQfd&^1{CB$Y6B+UGHLeJGcDl3IKj z=C`)(xk%8Uaz@eZ;4@IfU5)H}ODG^uIe7S~AakNpinc8t;I^vk0~#m))(|U2N#kX= zZFe9_?xgek0D5S|`g*#(6`XK9OG-i0x-5%Ym>D6AZx6^NiEPTE0ygYWU%asNcVmbv z3hLjQ6SCCd$m8Xkq%KA+?iG)0gwlB73Z27xstTPUbaG2cJ2e-PFESt<69Kj-F~`z( ziJ9^?kPOtIf^c$vXJn5kvL&%cO6>Pwm4_AK0fP$b1QSU%R8r@>jbBG*eb{HKsprmd zl5KXxjYIKz)Z%o4mP_^9npeBjb11qW;b5vuCLUr$`C znTY+@(WSV*O9lWci2@K7NEQ$a*{dIEy1H3iCJM`B&DTHa4Q=2gKpc-phwNLf0~SIv z>0>|3XCkYKnWc9b^utf93;Lp*rwb4DRp`1y9I$UKbHb^~-;#}ZY!?PVR^ z7L9Fi8x(v322SsG37?EPh+XMbSoj0QoTWa0Jwe@&Fz;|n^GJv@>?9s{PH+UnYlt5_7f(N)~OKTyd+ z9NT8VAifpjlPtMVJq_Qn#|++gIVluI^iD#4=Z26m2P8vJiJaP&^;tzn_D^?zdd-J4 z>_kbw*J%wqcFUBLe5-F>ef5?n$?H%hUFbtB;p32FJBIPIfV59Nk1yHVAAR>0wo@`N zVTVsl?3bsveF?`zhUoStd^R7V=I-=^(XHL6u3ygc%X^=;O?-&BVF4=0GXc;rOz4WB z=Qn@Q7)i#csJ0^Ra><(qA{_$#kr1-8O2eYbMgCEKBQd={bF%QSz&j1BJ>BJo!!Xv)Vu8YwJJ~0XF-zP$aBtwS3z?TUbnKI>BXj#H4_lYMDg~r zI@hh+^>mw=;$|AdL;Ue3Ksp8We}T32H==-&NbW@?p+!j0iF(2Gj9%ExY1YYIKV|rq z%j+w4)1xgfqz=lZp7An$?EY0Y1^Q6s`~rdELQZj*DKKQ)vR1uge~@=M#xEfQ16fU$ zmjrM|{-h{Fe|;6$obTeJfetUmrUUB+vDv8(9^U+GuG5ozqv8Sio=-IIhX=;9G`o=q zi2gKNZ!jbA(0eISfdREEvkKlyStMn}hA&H;F}QD%k_sjtpN>ik#e=j!${Ry}=TN|o z+*1$)n3|K7mG6NoxO-9VZmAs5aUwEh;mh8l;7HJSR2FUU=Xy%ihCfn0IuVhzRL^?on)q>Um&#}XxhtL zR*vI}Goe?rC7h?WW(UP5zsNut=tVWTcf51|FyYX@(TPj)l`Jfo`~;pf#j9|?xqB`b zZasCMD<}%IW9cbKqSW_nxkJF2$U3pD?a^OkaQ_{db=EofdN|l6OG$1l_6t?Bc$y{c z$vxlch-I2jlV=XXRKdt*NYOEa*dDI_T2Y9>@_%RP=0SltF2Lb-Mq16R(9Si*j09f> z@IS`;;{cwZ{pD!3^l=4QWqh)WGg_j~&Q|$$$wOp7dnm*MC!_Oi7BjN-DQp}@neZXg zbAy8y@Qe1`tkL*U40u{CTyo5cyd4MWeVAO~lfFiIq$VV+BXaU(|VNG?n!bd)X1Y%*nHFUt9h{b{PRsu z?vFRlWSeesVV3)@{4agAIwp`Oi21zRrs^W7cJIj&uls4C|J!t_OCy=?X6HwZ&yB<- z5IF{tN5A8V?#E*(tef}C+iA(Px5|I$y{p==sfG|t@n5i3NSm~D&ynC9BT|7jg}Ard z*DFk&P&Sm9)Ym{(eHOO3u304HXeV0@N~K8&Qrevux0 za61riXX&(gS=6G0`T7W`sv(XF8WOp=%dy*nB!`64j2{cJ^c~l44d7}31WvceSOjvC z4nQ2SuwY7e$~8obV?=t{6a{mq?!ojW${z&TJ*$M7tJ*#t$qWF8%n4bsp#2+~nao{T z=^{;!PT@aRlRO5$AoR^%Pvxw|TM;fK(A2Tl7#Y4@5{o!SmGNKjpUki{w)bTkBOqc+ zMlk_~(Tp68R8c-l18GKJkdV-SF(_~rgVbcnD40O>GN}2kfa3x^2r+OG@QU;VaZu{A zG-BwLl4e=&ynosCD3RVgM0Bo8TC01#>a!9kB$HcYVSvP%pn0=Q`y1{@ zp(p4ghfp2XMkyj@!|QbNYS3KD;QY^xh1Z$r1C_g-bEUmDB2B8j%Z_Xn-PZuC=5vE) zjN;AT$BjPWno@#1MtZG*C1)|k%QoSH0!Yhw=JN2T3$ZkS;NZ>dk*<)cH8XBSpahAh za|-+$QWPY?6HFk*XT5pT7eT3qp1Ityjrx;>(F33W3>3NA#en8TaM|8>xykdH*yH^dd?o><@5tTy z!pwo{_C>BkIfy&O^&GJ#W&koTSGC)dNIq<|)R%iZ4tO56n|On8UH5v&GANGO}o!MCj;oJH!ZVM%e9ZkiB57zC}lQj<8&0K56SGnuiU-q z!87{g$7nTi2dly+ABJN47L-`A%$4Yyf0Flr_}#-Zkl;`R(m#sqCTzSv;@In4c9obH zy&BuQDDw|4a2k^Z1K0-qpppwo=ySuiGEiDC>7%Z9q7A2bg=krR8avki7;8Z+nWJOt|0=ir*r(kt`t3i$c@@7(RR(k zO`ElLPAlS9_|SNjKGmI0NbDoI?*mp?J+jOy#M6qoD=o{(G{X_#JPWd)N?j7jZ)$%_5|4SPTRyvmZMSB?UbH z=Iv%$dAZYTd4OT>b4McBe{e}$oiO4?j@#Yb^{Jj)cYNuYyo4z6hpZGewl-`0=ELpa zvxnK733g|7LqeY;Q6g6T8%`xR&F-+Vm9?i`z6+}_0#XFbs~aR=(OXz3>NM%ne&byD zxIubkwXGm#JXyB1tga{C9&29TSm5D9*~~?>gC}>$Xlt!Ozb6wz*?c5k#e$oUHaCd9 zZX^qMa>r6avjp2%h}Zy((3Ij0JkJwBgEJUV>6C`E8Ni1FmbTo#s3f3B3_w+fQX61= zb-86#{-|?EI@~1lN(#d=$!rpS#j$@}5)c%Msi&lw+NH%tN<=#o{xJ!J&kb17l&^RC z>6r3h4x`e;L5nL{g-y@dr_*sMjz|eJ`YeH@5Um&UCl+Vw*E}};8hLH_yWKT z%@J01Z7bWjDd}(XMh+L%?!`&52=sJfMNXl<#T+-OF+~6|pME~dFF$ZgfmZc&rmECP z+@v$iJuz0&@_ef0PUw7yIpKbkH*Pd&b2l?TCWEy-sF_EK`CuD?kyFpQ06$5)TD0@1 zL$+mdH8R(`Aa747ZjO5xWy8DsVVo}izP+);prKYL9M)3 zht8o3VAiY5-e$fHUcWuieY=aXaE>JP693E76rFP2TP7axFuh1~|1Q;gC;>FbMwapw zSp+%?*4p}R=HyNs7n}*|*ow{E(Cj`y8J};*Bns-&dyZ&Pk{|c6oTuoL)HB5}d}xF= z^WIj72Z>3R#L63N3MzeAtS)RmwqaLGnURbHMSYp#-=Oh7-Kr-aogubEKS%(&xi=L_ zAwkdqLwmwGc8PtB14YD>K>r8c1WUQ^Dd~S}b^zHe7$C7WBf|zvBc+nxk~LEYD~$Ip zfX<3+9N&t2vgr02FoF*p%oj+TanhK>B>hbmT|z!aST`iyGtiE($TL6IzAwzn?aScu zTxj~M;lz2P8I#t--ljyo0to(-$OiB05wt5p8XLLHmR>fxe#8InlKWB1#!gl_UX%}g zajNSD?2V?W^+`nC-gIEVaL3NHd61J&+m~B0?K!)Kt(W$l4=1dumFI}4Bo`WV^W^p@2KXWdp6DVKDGqW$rY`XSc5_x$0Z~fj^JiqjWd%t=&g; zeGcCTEPnJKE%y@Jj=Xks50>N(=|S~ukoiC=Oos$gkt3A1&YOQwmZ~=kin1-LN`}Ak zD7`i@g2UsS3EUXEGnZ$+f6qvpv1hFA&nzTUlS(dhUmYFnYPp@~OqBt!9Vl*5rpUxs zQ-3S3?u(Zoi}Lo%WR?D=wMfZYzA-DWRysC8`OP;vFZxSfq2S6lNt-aCPB}R3Sc1T< z*A@3zg_{vt=PT1)isS8(pGCrQwbVa%GVN{)<7g7G&=G|Dc{?JB|tP1s)?UM^lNdSCS z8b;8JTjFIJ5Uo9KfYJ&-h&rxd?2ub}wsEK*vk_bchY?a%fddm>->z+B&jcgcA5q7w zN*WhH3917xfH?@-1Cj9}Q03Jd)P+l_4V zY|QxQ>Z&*dIUYqp!^Vd*lF~Mn!~HRH5>cl!r|d0uvC=TN_Mcy1wk%wZKX!KE%o-x3 z$l#vfTh2s?&zea^4M6Yo1l+~7|M=i)rLv!!?hNc_DPdQTp@ z>s~#UzIjuk`IV2-EI5*?VNL*$gL7Ae?70WZZ*4F2lO?*LDtChi4^Czxw10{7Iy={@ zNL51$SVx-*u)4H9uv0cFK2!^ z>^LL~rO~o|TG~yhIn+2$#7_B~E2-gu`^Ckk!-XxhR;L4;O8w@n9O_BRA4x?*)7Vnr z)qCS({Q_h~AN14YG-EUl-?oAaX(nrX(w+vQ{p z=NJpPV?u<$g?y?OJ}2wU`jXpevOad-p06C%%N6Qu2v^HxYNRQ+4?va9xB&w@rmlTi z9#yXwX1*J8# z=~WY!DHo9+#}yb8Scm??x~PP@#~YrwOOPo5%p>oPw0)|cHJhwDe``L3I@OM+^053# z-wdrXd?n)dvxgM^xN)M=$j|v+_tmHwYF<^<68wyt2xQuK2@Q*lN~3DSx_)VBjoU0T z*U;aNA0XLG&VHA`qUKQpTX-vHw%25Xi}K}O7JRBoUPqy69qwIJVa`tBfDu*Y)tB#W z4vFdQFFhVk-+K$QW&;=|Kw90t|W0Q3SNhXV*XO}sjm1i;rLTpkF8 zCn<7c` z3#3Bru5{LOm4{3u0}HXTsG{G){pfr2m;&At?WN*_VO6OhF}_o1F&?&JXG_2W!EoZZ z$?JtZF7P^EG?(aU{%QvMHRMK@d#r+Rr`1KzTa_zYF`iLUfzx7Y4R&?R2?d%;O*Pjt zjla%UE33+-r+1Wq&>3Y(8DNvjtEW60yTjRb^4I6RdQIogwI7M-$JXe*c?Rg}zz72! zED{fBBf_ctHddN5K_5NAfCh#aOLLdquW{mjNCw7I665Ii23T4I1|@n?kIIa|*^j1Q z{x>YFshB=0kv1n=>zaw9;mW7G(In3}Fr{qN&AcY-E4LN%6FQn40B1FIDkoOsDYoq5zzIAq)$bm7Zo!22u+$u{mfq zwcT?A##kkC;c*!?sd$o5jk+WVyxZ6Aup_b3ikKdqHqe3f#@WMEMAA)e5LtQ| zP$U8y^!-h)R0@(l(*|K{H_FxCSOVM)mAy#rZ8yxcLhp;s4AprBW z0ZQArPa*5p#Ps*=nPP;>YQamQn9)b{{6Wy~G-mlNqT1?2&e&<%tbH(hy z&8&unMO0seaL@Y9MbHT0Q|RvW2zSL%&wP96XRZN7u~f#oGMB?|p>$sYA1Gs>X^foi z-A-d)FOBF|$n10a6lP>ZWNkVxlav|KKgj3ZU%7PXXuDN+p3bnjjFWO6eSU!bRt@=t z1&zI4^;HwQW&!Yb@yYeaof8%;b-7>QxCjJ%GmC|=LxvHlP;({%sQ*;Pon9+vB0k{s z|C8?r&@a}Bs?4B-yiA$LfH*}0S6umL8*>MP?>MK&J`mVz8-Q~BAgiOnW+kF-s9ER$ z@?3yyto7)}1I?BZ+_`E8y+$u9vjdF%OkI^r@-eWfzz$GFd0+?xlwd5a3|jc^H-XMK z#R>)PuPXz-a}eErG)+2Xj!ZNi1-WkW0te|TBM%IzySuENB2zeh+UiTcAy{=^zXAul z7cb4^Cx}lVhw1p1Zs%9qw(LRscoJOQfPZSNn0_xWSvesCh)|9$32s2r2l9q#Fcsl7 z?RHW>ebEN~|tRy?r$Vz54S+IvG5@J9I0Y0W+(|8ch=(b*JMb+>^hqQy>dzI5I zF7qQQ^5J^0W{X|p#`ndl1i)2&T>UV3aOy=!dw{$bByeA&{ zx!ZqNRfG8DPLd0d*(*^7cOtvKosVQ?jrjEN=@PKO@uWSAkG58{roE!sb(fHxJ}i(g*Y$@o;yPzQp9*u(SA?18ldf= z2n(JlL9$Zw)o1uXxI>th(mctm-`wI5-ZZa^Rr4MrYz_6MI?Xg4I5gg!VW3Uf zYdcDzO;@lZ~Do$xf@YK^U=K6WA{mpJ40^F z{e&5ZaRPeI6cOx2>f);gZ1_47Sah66v<6C0fE^3uKDc`c?G!I8MSK}|<}AR$2QZyz z8P#O|D!LEGP|0VG5k(t-Ve#q~Xgp5XFbgHI#hq;n>n6Fg3-a!7d&(WNO~PIxQ8)T3wvxiuh|3B>LfbA3OI+Z<7}` zykq>wsOIUJV}m-kVLegxj9heH71vc_KUxZ~08hx%F8nR#K6VG6WRT4kG@3=HgGQQc z;vk5DY#YL(DEUI1z(Y%&JZn=98f@j^d{5+6NM_~I8dqw+U!%p90`6Y!P%1Lbj{ZDe zU;m7Zy4c35!zjdAb&u!k23A?GNUSux7X{Os472iyN3QE5%pUumhN(W3VopYA*;vtF zRtvX&T}wlFgh<(>X+P2gQN-|`>E`=%n$BnQT-@Epd)ofK(qmHQ^Zng!5q#R$>HVUr z%hJo{+V-q*3o3gh_8fVyn;bR~;c*9Ps*O?Sx&q@8b%O5@H~YPZ0{0>BnUKe^E4O2^ zyF^JLFD&!({|0ilC74<2Q;m9~kCQJbsymtAIeqoKy4be05%L*GS`Xh+B#Io*5wxg_ zrJ7ChES=B4GdC(-)8M&`gx{Bf$9)n|Z9ZZdMx3PFId{57(OU4v-J3iTH2LHd-*tl8 z;F@W^4seEe!FI3iNwYq^X2Qm_qd?lEpIq;_w=&(7NWUcdml^&jmq*_Sx}DK zbYBFtd6_l5k^|ou#$!*nRb!PZg5cz0sI@0)WfRKbSY*5 za(ushv3;P{nlRgX8v#vbabFA>*EdC}9szsZMwhmG27oZ$xet}fB`IE6K_#DHIEZsU zUA6_FdA-Zz5Z%@+9aIWS66v}N$=~i#z&DaR<;5Pxt0`sls4sX1OOfZ9(WFu zNH;K1Hts8Kael*?i{Z|8>^1D_Ri7ui!q8o%ftYZ0yA9)Q>#gWSbcFlTWi1{TWv4&` zSF{NIygm~REXr*AYZ$-Q?L3fEm6mrJ?Z98gI=UG$0g)H;un-Tq zrUl8c_yVkhv5a1~(byK~qAB!|GeH6Wu=qGF>s7*h9rd}=#`6Pj&W=36>SwxZ>aUFY z|J!5;pQ)@{PiT^sG|th;lD_=xJ#z9xn;g&4L*0puaqMnQx9NruOA3-woF}!OsBFn# zZq(K2I~P~pVG8NqR@+Y+35>p14n=6c3ab)(+5B}9-9|s5gWI)2GS?xq?a5PrYwzKkVsnzKR!_t zB#H3%szFAJEz$!lUMT%&%w#xo&G}T7Ug&}IGP}Xn?&0&k1bpqU*sF+unKLwP)a--O zSf&f1|LT4NK=&)e1Fp}OzheKVLQ+IUYXU}^z&FZ!jL8|aHkgl2O5tq#rM2nE7xsnP zO{w`n)wH{v|$uH?@*+U<|-T!7+D z7m$`TD-|#w=r}>grH^-sC_+5xd;Mi$iVL;UfO%o@8vK-*+vHe!F5*QO=Y07KR?$vT z$^O?h;wPP;sOi(Yi%XKL92Y|L7E1ti=_Sj2pN9+k2?E>_H^}BC&GOo`!B5RDiF@W$ z;0xpK1p`mgdM0%7pJUcpzBQeS)*sxgpE!v;w0NqXy&pTCiaj{Q8$nc_IycyFN-`)Z zufPto*cYnbk}>|Ab{>lstdP~iHfFqUa;<?A_ZinL=Ha4AWmv_r6zAEqWJVSI;PO?ot1uXJD`{K5sPve-(VJR0Fi9u0C5=+ z>Qlo3JJ1VPYYyx=&;QZ3eFUOKlJbuOHbh+7|}^iRxC^X5u z#fNQnq5|f2)QqZj#IBNgrxsuNTnf~0IOCsex%J00(Vve@Mu@-Z2vbmSVgv|DUJsU+ zoVA46{v-~LH1Hz!M{`yTl+1|xb(j~HdX7J}mn^H=w{U=QZ#v=r0+MuQx;r7`*RoXL zB%jGVAc|1`Th?q{a?BKZdYV;+$1gt6qmzg!r=lioHDLO8s9Md-tVtfREwa4|x~xg6 zYV$0sl#Qv(pT+4G31@%1$R4TchD7%Cs^*RRZrZ%Cq5>*&&RBO1mBq0So`+3doT$yi zZSyAO+LJDARc4`W65_v8i=jF&wHW%dTnPIUZo&MT*^2_8UOL$pcZEC2HIv9M&Z=XBH>MK+0_ZQ4FHk1YJaj~{OUDw~GI2V5A` z&Q7h^oVJBW5_onrOOYC9>Lad5AoN{#-dxxG zo8<1hne8e7g3oD!Rq?C(ly78zxzz-WeLQt{rAxt&=}!h3JtcXt^s+@nIErC$<4QJf zvdkvKmq}6q@-hCpTx0@`D9ZoG`<+`Tdl)WuTUtDI0YVTIug~(4?d z&2zZi)|^cs)-+-cqvvbqDZ6YZM46>4-SuSr^!xcq!L1!*F_US1=pgk-_ue< za@EtYzFW@F$2hQB`ab#&EZOr*%4V^f{(6z~igD-sy@7 zn7d#o25W^MZT7VaaP@D)|2nG3YIx>m^XStNCSbd3uKd!x`)oED2^A|)a>8F8Bp3SQ zF3dNWsP=^ow7!Be(r-lprth$|q8nu!GpGB*_NPgu{X~XSSg|So+synUhuZqjtdC9K zAw}HNXX=eUsJ$aAK5ZGs1nhMnpqBI&j}Xt&uMJ0T*Ob!#JUo6N4c{z?G76F`zJ^#m z9uDJ`uxdJ4E9}9p4j1%{7*Z5L2lh9R*L*q6?KhMz7=2gcY#bq<$SN5La=JowXyt#5 z3s-CBg>*o`fc2~GnIWyLH&xib#48tU3U8@w7 z=6F;4@Nx`Hbs^Qn!KAq;~MN z`MV!Mz4EoS6u@%>O{W5Sf>EGV9!w)Jt5Tt>b(cTOM#AQ?gm8DB`X9>HFvlRM&wa_joUx^4}(XJo{GsH{F}6 z%q!j1{--Ag?^O)j%_~{B+ImWre79VZ51`&ppO&$TLUCd@ZPx~UG;a05%ij1-Q;*ItCZn|+8QHd)) z)X&v?H~T1B3- z@Fybo;DMjh)^p`k$waF9Jr;y1l`>#OJ>WkZ4`Ktw-cx7!cZ6G80}o3<5#>*%X6>jw zAPhK@U-byY?RGq}=Esx@^nO>oO`bhA$ba$Q7dMyzyn?L_d1g|^$G6pHr1kNJYC4#$ z#2zc(Z;aqzY2aq^bbp$|#+*%RU^D39-vovq#Lmd1pW+b%2((2=0rVu+Qg31{1$kSm zOaXia;BIH{v49T$F_X^L1MaaFrDQn}1$e4!Y;6(_PJ2Wp-y!4l+JON54fHujrj*h@ z(FFoe0;6Qka3SOh$p;bEo{DSWYTcef{T}kd%P1oE0nM{^}3!n1*`JF35&E#sY)I03|9ZVp0 z5THW(@1#R>b_?KNi^q(Ek|(PH_)nP`gbk}tIwrud?R^XMR|>`Xnm>JlrZONIyBVfH z#d?FUiW#u2zNHpV9n1v$m4oD(*`FV4ID4qG=u%@K{S4lRwB#@%)h+?edC2^D@{hlD z5z8#8bp}Q09|P`pjI*TKZ`9_6|Gd=& z7I_7Q)xfKiXBR#OqEL;?wCImRckj!yo&z(>bqhcB^E0j{`v|N%Z>T5hyhN(8cU;tC z{I7r%F58m*J1z}4fNA#?Ic*(AAlvF<;L*WJf{M@C;~rRu>Lg9%cy~5U zl)M9--MFND{#{bP{@I=PzYQ3Y-WLN!e!mfJQB9qK^48z0Nv1*W4FAuAY)FH?^v<*o zIxk6Pd}U^^pG+NnUZo!sdvNVj5N7RH^g0~>LpyqRX1Wo*(xGU1kh8Ar`Du5*TW2}T zH)#6V^Tiqz3Z?1m?Je|Dt7cjn(eidmy z@L2w8>n{J}eJ(z%M7J{Tr}2fMg5CDH3O)4E`22&@i5bt~+NzKejC+N#<=n!%wEa&9 zpNG>*8XHyk(;k`KS(03N2-1A1RyB+;CiLIMem-Bk)Hr?MKe`&tn?mdt(m!2St`cVh>AY0^H!iYC zNlQv@%I;<=VrKF_4H#dZ*9*E+KQO)C5$au3>Q6BJO4u29jQ(WRM1<#N)ek@7{aUU4 zt$kQb(*L(bmT$)N5q@VvhTpl;6*Vy969lV>${5-@HXHo}G8WkX6I^VJPfux^jZ=um zQZe?GsYam=&&Fvd`#Vm$!Ik%VNRV~P3ZC8pJRG@NZb4{ z1%;m`J~ZmCCLJ^i>$kUOT`O=;~9m*saDL3v7buIn-AXA7Pwa!FW zv~JVpNxK85l2;e*)yw}U5N4M+k#%+i?Bug9JJz(Tw89?1?j@6W&U z0zbr`+67O0~BYR1=T4!cEdd;a&<8(~cyL7C?xlq63@Rw*%xg)yd zYf(mZkav~f`T0xEmh+-P52`eRVmh-*wjW$WFzrv>|6lhXuK_jK6Y5shUXMFmeNMr5 z@Vc>-XSK}d##a|%hfx!yx)Z~KDWl0E)lK(N=fD-&e4W$SVg?I=nUcGU!i5^&We)I= zk>zmQ-CtTulD77h4?*4GELZ+?p$T;q;p~keRxA-{Vm;4EsZTctD_wwAiI{^ujSu`P z_Yk}Dhv5>9Ws69=|HIy!2ST~U|KmdxEfR$!lq;3BB*r$%EtNv)O19A=S!zPEn~_^m zp>9QLn3h|Vwe0ImHzCWY?CZ!jwjm8>#w^e8JgDx>=YIeAeZSv7zxPJddCqgr`@G+; z_j=AVj~7MV;&M_{efjEwrGD?v-sr#nBI){BG(oB5zyYWUCV#`LopXZY+X-#eq)#3? zdE(pC{!W)yQR5YrFW#S%$|tBlzcC_S@0esqnBaOP<>|^;)6~PhyztSU`}E?*-+501 zM~9t2LU8bYtc_6%OIuIhqR-tvRP%bn=2GRhc)V0=r^=cnqyBX2bgHSgAkWhs1qFiTvs+rr;n ztpYQC+vsoWewUt<3%acQu|dp4eoGx%;T7VBh~}dHY!;6E15sJSsk-@x2E8?OI5}7= zsYC6oHQjtnjF#myVnfM)WRarUIDX64Z+f3K{fu8zx%T~CXpiz;&LF<;3Hn(0A_bFX zaBcj&>DsFN#L&)}P0nFeUJaZNaeUyrQzqQ2N^fl}b3XIxu-OTcGwpDOd3Xg-i!(eg zLT2gZ(8Ctq;hsq@(zJ@1UG>`{6IES>F#qt;Mu|MTb12WuM}ZC72m z@R3u{m+1Z1a?;sh@J@nx2I*{!@TPd+x6=!V%vQ$olTU5VJt@zuYc9wrJ54wgb-8^q z(yMFk8aX%RgQhj$RI{dTzQR)kVp;9M-}f9(HZMc1jccPu&7K$=q*w6%QA#9k-W3|Vt&`m+nF z%4addK0BeO;_Pf|QIds%jnIPAk$Yf9U5+aNU$CI(%t~>Y8arf~PZ+Ok@i6trW~|Pe zb@4yn-PAu^CoPnvaHhDU9QFNEM|<>0O`i3uE7cs!7$^O15DEMAZ(VePpG6$7D_n=` zP?xiaG|Z)_@He$Rk+%DlYDiV&*QBMsw>c6a=Tl2Q@ zN>{n|xak+wk~z*%)Cn(t`w}}@3ccXZ(P3MmR26cd_yWb}B@cuzeR98!_|^GVY~~IB z!Sr&y9hX)AnP|;Z`a)?=HnE!hP)kmkbyM>X>-2w1`6DG3Qv$w2wVm+Tlm&`OT%P#I zTf>rBH}ur;w5g{%!_!W%J+MYurisJ@P3^~oQgtU5W19!kH|!8EYdGr?K9z;mr{vG} zI1U>)BRg67iMLEl^DvCob)^pNZx}q9k3*|nz>R`I*_yM5T1S%lo8~HSW|1kG89hq2 z^qV6}bKIa=R@u?38>zCq-KQUMmDl0gqvVz?+K2>k5p{&QJ1^nIO5M}CCrWM&nXk`i ziQ0Jv%-NysALi|xxl%3P`n(Ifv+h%7tD#ZP?j>)lQfBk82U3PIOs12h*AVhK6@KH4 zxM@#p-kB=k4XOCgvI$DRif9mhbgC}@J zy0j*)`Pk{;T^RK>->ZB-2c9Rs(apRgF=_ZYKoOaQeQIE3qS%-c#OA#zE-Tf3*|KK{ z({S66y%0;!*BQ(PMYOgf&baf6^;LPh-!})g+9l$4M&@6c8$Eii-5)zbOEbUHk-ww+ zkt{WT)-NL=_Kr!t^$S~e>&vXkpvPle>AoKSE=yxu|8Jcg40{!u%Qah4Wf#I+QZICZ#RdD68MxaBqK$ zRjM{SZ}=Xu?{flSJoN&b_u0pjJ$e`G+>d-9@tBp?H`jnEzx#Iv?ev>ALsZK^J0+zl z!vR7+KK|a%#X{7T{P~0aBC>I$54wm5)~&A~WVqGZ=`ub!iFtfZYp-%VOI_t|V)^=5 zFu`M=YqN|@>9Bx=P1g0^<~}V!y8dZ&J44^G2V6PrjK_zf>NzvHD4@-IORPXzX1K~_ zo_`3D?VBVs5clI*V>RgY$(hyugNn7;DK|?_INMISqCuLT1Tq#%nZH-iw~-N#zt&8! z)J{F>-n<==vtpaXqOa@|dA1JsFnWXjMU4cIYgNQ+QR4{49_hA~J#q@!eu05)*%xPa zZ3($Na3WP|QzMqc@hdy*8TI9HF013&!;3)N1u}J-+9@~v#<^$wgQBT2_ahHq+X+#+ z%9C=H60uS*+qIqv>vVqVlUp#^%7=RojRzq1HXydrS3f?tbl&t`SI#adXw^we;p)ki zFsz5PkNFn>VaB3*7Lf8ngZvg4eY}4QskUvV@oV)X01Fy_#ctu=!0aan!$J zz4oGRtP=jb9A}p%^~7|+O&m5S_0SWRPZAnA`NYkG&q1v~MIv=RTM`nxeMq@T*!2&S zQ067%G}&mfZQILQoaL7s5Z=k!Xz9?yJ?Z$x1j!VM^t4$d{-_= zy(!7-Ee2G~M3t2+H5Tc+xd~*x4{bKB1+(H-3wO~OYof}xry{0RtEUznh%m^kw(6We z0H>=uqCz{NZKB|0-T`?s);qSuwHU|c|8A)thGWUHhw;4EpG&`zw9kDP<(I^0w7 zGfIoo+yT=>?b#y*`bTUNyTh{H6IN{U3URn9IcX6G_dwpNvp#q?Olxl>h!f)sZf9Iw zPHL-YU!u%iyjD3=NY13l-e9hpRcdA^0C#_HpZucOK+VkT#>#$pVWX-bo!&G43UOTWtkYtaY!A{sjWzQC zo4Jj;h?`r^Phxq5a||92qNJiVG?`^Zn%jM1HS>O zpyev!Ds*$c6^DR(L?HfzqTvCq!UNzCI0$DW1o1TqLy!&bfIy=dXasL;2ET92k4}Q% z(ZQH-=lS1@?FhI%0uc!zY<|si6%hgc{U_p2+%kx?aBBnt%z(2&K-U08OG%{p`xeJL z07gaN4&V^c3q*?lm>hB7D&i(?DFXDKpBD^q7qNtdLm;jJmPO-)=V?ONTm}ES3Bhz+ zwLy@sB7{h!C>;0&^Fsvi28W9zA#hQE1imIA9O4>I7_rc}67&NT&HoSDp&#ul{@wm_ z2*A-OQWUf}2M#BL0Q?vHgMjCk11$d^SKt<0Bq)D?Yp_)K|3rY>VBy28jf6jezyC)3 z-$6$#0wCnico;W75Q2!k>V=4n=n^V|BIAESML5^O*hI#|==_Nva1m!C3@+YSXh$sIM<~_{7b|pNp0*z( zTt$ci5)L4st6d0)A4;G%Lij)zph~!?%Z3k7@B|Q;z$OAHkIf>YB!19j11JM9Tm;oT zF+#BiB5Z`=M#NGWTJW-Cg%2Q#z%XEf1(aP!0F>bnHZaP-XVO)h|A#SQ0L%ZhKnoZ< z{lCK4=^p|HG8DuZ|1|`z5XRW))AJbn*EJYpg~2;vjGcxtcKUx{Z09`27TW(O#(oa< zzmKs(7-P6X7&!j|**sA;;5R?WU}|h|JO3Zb0A#??q%%8o5QzTW(Kc2VtCq_zM<5WZ z4j%aZ7y=;zK8hg3mV&>q8`XjB6Z*@;+}!4%xw*29FXo(ww;KYn^={amT1(-hYb#Mz z|46B%%B;~``qobV+~fFH5n@YEFFmO#U*)qF?;~fi{rvh|k4?G5Z$|RYHx}n>bu8U; zROE9e_DSoOvxcpSpKcmnGC-Awkc$}Mh=OhB9o}dnw!VI<_WV@1mPtcNa_@e%;H}F< z-lSiXiZ<9eXF?l?B#|E%L?<_>y?2?h1Mw+YbJH# zHBH^{Zwgz652~tE=vS0Jlzm%~Rbjd#OC3=)8XO}KhjSYYD2Tbq$BzP(hPPyqwRY{1mH+GBU$uic zs`Ojrs%aOYiEF+Wjn8wdrI&Un9ih9)UAiDN^V%a^;n6wnjq6IdN1j3MlmAR@yyLK> zFM%|nsI$2-=@vGy>GQYh*{>AE&MIqzuK~m_`a8gu3c|q6{@}SIM-bb=XEB6Ol*haT zLHL7^2R{ge@Dt%5Eh2~~OMZQZFMeBBt@h(<7XyXHyMuDwTAh`cA(XT|k#96lzW8Fl zz4O#JGeg(NDVv*;m-Ww*uF9DgpNN`B|81pkUz?;%+r`%jcbmmycSNqYOF5Zz*)HBk z;mpc|Pdc|=tJxX3L*%sM%b3AqtB$RDyVUaS@fX39v$kTX;S~BPt=NAuBOq!uWJAn} z%3-(@7{~oXvBb_v7D`xT%a(7?QFG5DW425(*c7T zGV_ZFb+_I^^Uv!#s=_Xa!yot9FXg}R@Nb+f;$D-UzCg2-5Nn;SuVnlVC1GD4wO@e- zBA5Az%v=pcnndI#kxUU%ph^Ay9|SDS^zs;K1@4ux%&pBoXP*DizwVo`YiaViUj)xL z+irWZlyqG2*1r0iX6jTF0BD)W|w&5YCp(Fa; z_Y*2$MlN(5vU6=nHZiANXnTY(Ka%O!poTCO`E?oY=PD#pim=C-=kMburB@W^{)4Q= zSv7DtdBloK)%k%u;pamfEUh)1#-el`_;sW179DRg_TuCPOo*dPP2e5b%@YU=G%*tHZhbLsAP=)TM#R>A`Pj{at`48*bGr{}?Vp zbX_3=3B9j57lY6fB1=w-|M%^(^SAHgUldvLn{e;SmDu0-IZNLTBwCuB9+q?uhll)5 ze*uyA;(R3Rnuq`3p_Y%S;+L-9u}0t{zQzf#)J3!u@v!w?p7swC7w)}u9e~u`m8tS$ zsD&{fo)FSQ49%RSc{vLqp|Q7xASPVw;p!Z*zK(?sP}1Th;;a#YQa>d-|A8bd7ATaB zi1NP0PXK8JNc#9Eu}6SOWP0z&2Ho=I$+D(tNk2Nc+Jjl&->kR85)cnF=x-eah;{*D z!plD1!#{;v zC2Ic`ZiMI>pu~G5I(CcyP!pI$*Ec|D_T%(|kRRjBQ(-R&^KIY>)$K7bAcMcrB7cz4 zyH~85MUxc}@97zet`?gebRW^-lrkKrPM z*4&|^wAGM_VZd0Ob*ew~6Cd**ULFDrdSxhaYtz4%DI|OkUgyrtbE^E!wyLnP+8Fhr zn#EZ8ivtD$00z{HFWj@J(uic?ACoVLA{%UDBQ!{xIydu)2Ivk+mw$8-88fq0I8lQE zkDh0E$isBwFXR4jH<+RE%I2Ir#s8~FqpB-Yq0qtGKaH~e?_i=^fur|2bF2}E$t`sP z67Ym2@aTEAB>y6HkN|*N+`Y~TH0ud_A`aIdt)uQ8;51N+I@bN*0qLyB0LQwrIUT#D z7w}Ak|GxhXo~;@ntidi)RgEnonj089$?!#T+x zG%Z|ys0o(x-`(Zm?w<%Ns#%bqI7Ik4oSCB;8QXav?xQ#W*?@QbVF8fshe3v1zCsXW z(g0+>`R4>YldTE>S(CyCZ;ju{kT?F`A5x1RN$hYGFsLI2%hH&-LIlLO-+mzw?hzph zFy$&F(JsTMoH($`Wd0>81O9r#n2dY-;glb*buP}==nQ<5>t5l=cdmPNAJ4O@a@)83 zg0c(v#>87@Yrcu&{@L_{kj07V+j>Pwp~-2^YxpiiZ0;2``zk3w9c!)45?9lPnbH7N zDpWeM@|V}p$py=L`f;V)9^mZulXUO@WbFKhx|?7HIljkQ4)U{gKfGKKV{`u1lG4Re zg>=-_^q%_Hun3ar9=|T9s{pgQaczRuL*NgbbUgJ1B9zB!U^zqWB?88^&=n}~e|86Q z8fw?BNSXv^iLbS#9Qi3In3Wx(q2M)f*41-A0XhGHBnLD|ZppK40?oNA0)=#FYG=a) z6mBJ${I<~NwF1o@u$!Eferw9FI66xKcq?(|mkTu0z$k~=;wP2(fgl%2ir-Op>gIZx zVFuf6Ci2~r3V!SLa5Vth!#Ka(75oEcKLs+`@csNRAd`&zJ)KXOJe+uq|oI+vIMH<34Rei0r7{8fnY>w z3d^;@FHfDH-!=d=TNU_aqpU*!Qmy;9RbAlVR$<3Ozx`VyNn4g{Xf{JJzW)CH(kJ>` zz}v&0@GjT4_KaWW=eZ;k4lD!L3asFN5h|Ij;t!Q6_Lz{_@%C|5jV5kFLPBjgm;3sXn9N~-ESYiAg#^CIWMEi)Fb*i; zv%3+Zur+=s(RJmQ!GP6x2Y{}9onOJ&wsm*z?S8TB%t@F49b4hVGboy#(7ELSOJyD- zp`w8oFXo65nVFgAWOqaqtxL6rx-K?W3NZ3CQ1a|HDu%(wlx$_dbdBmgom=>{QzIWl zX}7|7SBM{lGw@JZ2;<`S<=qR6J4_%sQs!Eo%IJCN3BivaKAkNXPMR$2k9{gOz*+s_ z1sxCjBK*cwnt&?K03_L4f6(K{mySCOrS^yp2|f}e?X5vXGIQKXCHo+V6!pb>F3h`$ zmm=RodQRBco%7_%7(F6oBcbQr_2-4@s=$}i{gbbl^Q&zOoccM-$ntR(M+y}Oih-tj z=<{*I%+(o$jV*3IcS+aQ$Qe?h7)szNnIWykP7&MIoFC*+Lh1ExFU%qC>)SGt4>7Qj znxy9$@h|Ed8m#r3vH%1AS6)&c_L7Ynz(qW=uIgA2T!gsTSu%ErN!853=HC*R4BQV8 zmHg(L8vjH(1u*w$pF8CExd*zhz`1L1ekDNjK&;CEg7pi@-Tf#fZFcOe)+HP`HAKwdc8iT?bRRBPnyfW4#dETr)*m2`S}s!;Yr>c!SyoYA^rrfz}qLgdaBbZA$<>;kWSTn=>Mwj$n5 z`rlR&5pfE3#rrMM0@8dAOLO?$$=!T(Ny_a9x^OCY`d^E3HIJ~14OgcU!HVkjq?CbM zv_^PWKNrluqhPP)6MJP3-;zXjuLWWA z$)kpz78W6E0b#ipd=`+^5RAGaH7F?2LYSZ1;h1-o<~U7Z#&=>UNQZ`uMuFNg6^dV z1KalmfyLng=57jc%I67;siV0|f83guwa}sm|!{Rdv{~nK=A~kQM3x` zrZU*CHrX)Gp&q_b;2w+&@Lb!)i+I!Xy<#5fg(8vOD%JK?don50~q8JD)R<<*g27JfnV58ncopwU;VMZgkl*$NOK;&X)G z=83%A2ejpgX>`>^V%U2;bi}1clo+P&PRx7K!c1SIhV>Y4M(D58?Jy*T-FLWH7$Ie zkpTLRzyVR?aQ8#L=t<1U0Py}ly91m5&$Ln)yVEijt8Nk2H0X^AEj;Y=y?E@9u{R9L zl}6}T%6Q=*#j|0iz*8)BjpS+HxfKV7Dhhmua>@?x7Tx0&mNa|HON{eP(>B}E5(dUK zS$l^LCN{@wu&uxoky}ZP&B2lhG^7hKNkih^oX)fKmO(NQT z??`c$`Bc-cm82$l*_RYmYT*@{7FOMP#F^2;bD%vA<0Y{vyol3XCyDYxA1r`4ro}Y0 zwXHAj06Psy!<;Q@X0BI6K%RSrTysdkN(I58Nzdh_0*1UDuB`oM_f#Q3182$E>PxJ) zshy|Ys1H=jKkXUfP`Pka)E3w#zXUMV%qo{UzD!q%05 zujtbg{(eO*oEcyG8?dq9;kPYGbkyB_kMDyg>m-4(FEZHw7}kb=nUf80O#UX$PJo57 za1iieM~BG2x&rRE*}H!ALex2uvFgjPT{Kpp8yVY!Y2yK9BFw@hp49Dqvr#`@v&Tg4 zJ~K_R4c&Jt(uc~7dn9c-K1VHw-mphy0$gnS*T*?DSOTj5Vb>Fu=?QIFc`;acg+?}p zQZCw4mLaX2od}?ioj5lkU=putMg?8Jbcz1avu|(@eZX z;6Trj?G=M!v6a+qy`eFReV?pzfO9k|_(QT3l&4?zs^a<542AKdR3$dk&MG*6brH@^ z0-H~rPNY*tQR7VT=9pxuN6mn2?OgtyZfD3;@aWMvoQI`j?7G@7gVlR4198V1nsjgT30R~8%z8& zRTyTGgkjgB?Zm8jC6G`Kif-{wQZscE96TEf8!EM$hPMmqAv~4L#v4+|bEF?h-c(PvNx^i$c*6g)NR~ zl&iSFqQ1b30vUlo^K#hYTs6-YDARMpi zSWz2M-jH2P#Hm)J30@Jw36oFd=0G1Qkp0Np3yf8&io2Qh1kT5u1Af}|+l5{fwT2wL z(C`THIfQd+DAYYRAfLKio|dFAU7LJQ_r3u;q0;}V9aML>fw#T@NZ+sA$=54%7E|Bq ziRsqvr1O#t8jJ`DWL)smnb5eB{kTVnX7uk1YX5%^mUZ)rMMTMY-!L3z=zC*!XSQI9 zUCN>J8{h8g3DAm^uBzokwxO}xh{*EGN~Us6+(8lU#uM?DMde?Zmp^4GW+==lpzNKu zCCvGRzt2?T#%Fe&9GcXd1rCy%=gXsebjj-pTWu^XNS{=43H6A^eoI0f?aRP$EL2_Q zDyl3?<@JPur;KO*DQHYacARi_9GVnCLZ4MYD6+Q;JL0$c!B8{R8El(6aE*|(DSFq2 z@6-ZawAR)>JIF5NaO>FMT#k8e3MJJgV@Av5o9oHXqw5k93jHA$Q;gfR;hyK`%v!{3 zq+K_fCoF(FB2gw4ntL>oVQfmT-~*L#cz`FR?HuAC{g@WRsy%DHEQ1@{(NlD)EIYW}ujX28 zKr*K3^47>!ao_S%wEKayb7oCq)sGNJN}(6n@Bm5MJReDgaB;Zn+0f5@mj$O}3x|Pg z6>q8vgknCxl;~VMN*8F}w)SDMJmUQj2ZK^TR+?{S^oLaEY%xcHxIg4;NNufuB~y`&&$@Ea zA}wl^7oSPYUs-;OgiZxy@o2(iOi+e>7nqqJ)kO=+ubGV`nBA&nnS`?ezpRx33< z1?%3|U~~2Lsl60G{NxINuj!Z36R3MX+#7LZ!Ca+YPwXcuAh}6+=y}zsrb^UqKVL^= zf&bf!_mNaCnR`9N{T`AXRE0xqh(5D&RSuq;YelQHb*1}St?!CU!1+Zj!ucxwaAGek1)nxnj}uqjLT3^Y-}x7vN8 z-EE|t#Ng3@YfT!}@}dV@refGs)*#ck!5hQn)#G^zDDM!UIz7ssBKR8w;>Ia@0<8>0 z$L^s&QdHP}?OzLG$TdQ%1Zo{Q%0O*3@PB~{(7$8Lh&6B)vgXqze(ve45SA@nN;*?O zF)h5K11y~tuZFB%OG}7TRQCbvYOxA&vM=^^FM1nXN~TbbP7)|alp2o){5Rj6JY~NM z>oBHDyIX4EJzK@+y35LBk(n7Ym6yxxBtrA4%%lB#hR!nVYVX(6)q!=}A9HougO-(3 zUj3Ea=`InJkMhTGUFNh+r(8$AFBroH>_CR<#DMo|pa{Xk2NJXLdb}qG@U88^?a9b* ziNLYUCe5CSnHdTS{oe1tuc0KpvYnVeyY#5-Q>Ff8t4*EuPitc@0(-avt35RKfjd_O zF@r|-;lqQ%-QIZZ0r>_~0~kz+_1npKp4|}~-k41dEla=qIaT})J)kncuvLE}pz^dI&QEuto(tq1hsB(}$s;r$(4tls6d%qv@wIZ)uZ4XD z+CeM90SRT`ztv4?-^&tB%poA>+LQYoeZ0znf0<2@=yJUHxdRic9Z8T_s%JrLRFri< zayC+`zhaUo*<&6w?aszDTWMuaoq-^CJauMO31;hQLOAEMl=~fIXA&@6%4~P5AT@Vm z--Zklz*fGr5zI( zFlQ0MkeE4yD)kz3$Ss~~z?iN+*|>@7)ht%60OPak5vIR8qg&HcrD?y*R8^i)FeIEMETa}rj*>HbHB#j zzD%rRT^!_`vkHu*$Rqp8Zs=A)Cm7u)Tc9IZ?06|SoUKSwnEUoRsr8v%$jWN^?ID+B z%q%7^z*FpO%+*b;kH^N0l?WzxoOj=*hw6`)wlKpI!jICv$181{TFqj9YKM!d`l2YMn?&FD00Nq8ueukwYUN?6gdVvh`Lu=m~ufb!@Pn)xPDt;(Ms+T#@vP z+7l)ii)h^x;;u~D3VPE=A=;z_oU^OmtteF z+dUO?OLO*{wTKMoR!wH%u{vjCa4)>F$eP}s8dR(;s~bPB#u|UZRsM<{oxkyUW{qON zuvUQ(%`YkP;S$RZUcX)_;OzuMrC@WQDJb6GT=m{Ir^?(;e zcJA0Sbi2Se-}(b1*PR@ou4Z(R!cG2O9o;?q=!E}ue9%__&!BT{?8Yi3O&@LF36%fG z4==d2<==jfhNhp)IRG%^ypSwydqD zrZo2?`eZw3&s4EvGavL58qTCacWEb8o;>hFO~?y@8c}da0Cuxh z*vS|+;q{vvi>C0Cq}(J?OJ2WG;An}MHw?VT{S%r0Vj@6a?^RF^xU{FJ`!>HV^^PUA zft`{39pI>;S9u+)L0+i6=aF`&BeE;zep6o7E3!sgsksVy>MkAHkYb%6Zpw|0OE8$^ zz1oneNn3rf+o2B?I6fss2<5zyB2rhNw@%3_&N)Tv77k2Z82lpZ?0Yb}0P~85W~EzN zvInhA{s6g$-m;$cib$Sz67y2gbVqBLWwg;ACY5oAO8=|hk#_RAYj*Lmm&4kc2?miD z8Ys?Ms~jUYgGh4=2@XcZ%#}Wk=P&A+z)PE@XwfjeJjIPiRbK?X$v$-U^+p@C~cVftXV} zd30;zlYMsI(zQ!oUtu+UmI~;w^vYr|J;R)KKA$l!b2#Hl_4AULT#?oD$2li%e~G12 zK<60uqpEDeEP=fNn^Q3v46>Upad{+EW*6fAPw*z7`t$&f{YIT?>CF1F@a0Xjd(!p& zcwUn(SL{tEKgh`ls77kau1 z8|U%Jr}nACz2`;w263SdY#$QfCUp`dHxlNRiFCqy-DRjwKUBM^Ctgp&7wVK~p`wrA zj(&()2$gQBWls@hWE$Sb3V3TLxFVZS4$0lJ2^C^F!FNd$i-8zi(u%+jKrgE;H=2FEgrfWLB{y?GIg7NopcBNl!R`KX~WZSKC%J zTFdQ7gzXD|non^lk5`Lld&hk}vpQ$UEO;QivK%437+|hY1CU)2FtD579NdD_$IZ#b zCVcyxq<_HfPWB~>i|_f^nSDbTIQ#6fsWQsF{Yv1C;br?mh)1;Ov&$oC`K>E%_MUvVa?zc%2Zd#%nVhDrw7rlhi*!v2WX zwFgxbm)AbVO2BOyFrTedy5U z6A80*;*-s^2j$kw-Vgm9u;tRJXTllu_4%+@s{XM0u?hhRA<>oXs6%pR89lDlyg>)G zDpZFbZ>Rl_nDZeHxTnL2=KFlS0jIZMKc6rCM)BX?37q>70_BV?IL|`@%@>5t7u0{l z$>PSm54?3JybGU@8Lus@f+Z%i0QBX8ctO+b(zc3Xb#vJm!5uq7H#BP zSdkDuMV4|WL#<&@LHz8>o$jbk5S4;bd=o1K(-wFgJ@*RhXc+pDN^tH&Gp`Y}r%KAl zN-Xj3Mq}rUXZnqo-EBl&2DuVciXG|&xmZ6B8Qv5)HnE{*Eyd=U3#K;HLHDa}0A-`e zZVBtj;Lv^v2X_Zou<)=R(nE^7?`ZDhZ=%IvTqcT+% zz{%A~7@V+K-+FwEoP&jU{#hjlaHIjzQQ~ejEGmF6?Ew~X_a2Z>9x)5BF?-Cc*}5&bUxzTsJOH)7fD2`P#>p4|QMOl>@sdpo} zuwz>PJ>&&yZePQ88qv4cEINzbIb|}Mrgv*P1!54ka@|b=DPN6hWn2QfV^qoVOOy&H zRbFuOJ1?qFL32X|_n8l%UaZzs_uWS5nL&eE0Bt*0+b}S@0tE3fcwYLN?9gfZ#4K6H z<;~Tzv0*JDa>l^(p<57gd1Z&ot?rDCq@Ren?ce0I*{s(I>`*jfwY&^+ zti4P??)hr4L8MY0Xm|h2t_^&lk>tZe0DCXL+iM6Ml)HTbFncQaQ4GJUKl}oA_1-8a zVoG`5*n?^o2AmsUWTjFXd(y=vrLXutQ&|>riFx4m4ISTVT`FX2G&X1YCd@IhH};H$ zW#~uQR{UfZn}^Y)B`!hBQJSWq?duvCdiYbbPfqM0@bSH|l|N!?r0u=urJZ%@|$DT;EwNt2(My ztDM!*dfy;2UHlF$gFVw@V-f0&HGvq(;pvwHxg+im3fCFG@oK&9taZ^u`!1d0_`1Oh zJn7Q8?5OS&;`5gKZSknp0N*VHJ)wLM@Z@4`E0jVhY|9W#)gag%mwQfn}PeOh(J+mxjALKGDY9dHcZX)=*W`?y4ZXl_mZBPH|U#0!hmtw6rap<|DOsdcKu?s^}HJpl}slUOI zeiH?Zy91um$jkr<1Kka3;rgMF1aKPS!@6n(=22A# zuPQS#iO-WLwaGO9%ai)a!LOZIjZDSq228g@M*`Z0s1}y(P^4Q`w$e22$%8Xct%Ygn z*Yw1D1o|Ko2Ag_hvo8^kViye6f-J)3;zCe^)(Z2+X6*Pj7Dv#al?~EV!;c!T=6>lI zGkN26qR4mZskth=MG>8|)J%H_-QnXl0=#4f$nZ=9dn0yI^1J=ZQY4z>m%^rQ8hXGe zBUZ3VQ!GX_lyy!;)IFtK`S#`M#6#p0Ap{h3y`d%$8(U(T*R=05-=1ih3GHTJ zy*!lksukwy-e3l+LA|^$2a10Yqx5u~K)>KoM?i9m2;L3sRnIETdQf3Xy!Q^$eP6Sf zUpfXqIxKmzTSCd-m*;nL|EimHBVb|NRPdtNHF~@ML173!&`tH47xR`4k0Q=T;w3oJ zx#hP@wvY-Le~oQma6q-+^@=Dsr>gs<52&$PEuLcsDG*>sZ_;{?UeK4m9^U_Lk)(;p zzy}RwhEgx^pM{q>2~7Py)36Y}0%XKBcu)OQY{!1S;M(=B=x(cC(`AWptQCA=K52$e zkwq2inRe=0Ac<5CZ01U-Oe+OsQ(4`|SRt0l@aL|Q;bMpW-p|c@uB_jFaj?Rj90In8 zZ#&*98hmu(ffgv#QkhQZ%E5D9dwM|P$Yy;i*-btQ)t#9##<1R&es~F|1Gh#dQyUyp zmYOvkF!1knO+4KR%Dv2iNo;yWCz|&b#5!1F?sBoi31&lG7^A=uQD@g4=xR?_y_n=f zuZWU~;6>jJjrvm%O*6PmjVWn0I^W9mnGy9o0X9?>}PF!Ec3#c z^YOmAXzdtVxw8^HW#1Y{Bok>03Y(Nrn%B*}u?^rr066dhCmCoh?vOS2u@pom7Ufiw z5lx)+5b!=Fcd08q(K%zfORPzM#!q zABhYMST}muuZZ{{)0X4jV1r;YCY4@eL0!EUc;$i647M9&G*S56spb*lg^wnvGPH*` z9?^eb368DoS}s;s1j5`pmQbf6zlH@mz|Xr0Y|w+}-L&E7-7W|mW4!IO#MSZ{V+6md1hp^(TpeEHe+NV-j*y zRn%h+swipMo|Oo#d_kAHdX(BAFP7Mk8s(WzXEH7p*7A;Vhvw3tgoIX}b<3ruRFvHP zZA-bq(1SG3SS&9ToDMk?it6*t@xN-jOrj-iM|kJNhC^(|{#CaLp_m!&agOo*cft#% z#dW)=1CkB++l_A>=$3Yl6J@a_RXm@#jM_wOa{ewKML}QEF{{ICsM+qp84C*mzo-mufY20e!N6 z&2uo|Nc<$qL0hvq;ELsm7I~pa>AcGQ8;yhSqcDyx-}`osD0?D8sR7|9JfLf6CJTgB z^J|FsxFQ!6@{rv2WOec^d|XXSA866_Hww@{D#|)XBj&QAqkC!w_#GKATX4pB^819q zabK+`fE}`uof!fS@tpWBFGSPI**v#OMm+lRu#Iy_C?-(5zoVqpF(Uw^cJ{P2lv-x~tE=wZW2#N(JX4Xw(_RVR2et@n8|9-2qS zmL~D0=sBSju3J}4UTYI`H0@AnX!;N{OEFDPc#cKS&vmMFzw}*~ao@5N&Aci_Fua6` zw&wAw4&mQ*%U;ki|DT?D?h+sdp@zbTW3}1f zWViuV2&;s`8maJ^U{FN@PkHF*TDU#sXK^nFWI_i2)g5pW966sD|L9y&^Wv6-q6WMr zH25HGjPcMNstY2|thB;!HJ>}-aoeK}gU?d|cn;jpMl4d=He{a=EFA|b}c$!#SQ7G$i4(+b78 z;Rs)kR!h&j*JVG@A0v4gg@?;!05$pA6to{FWQsG`VBV5j&DsfS|Cr7{u!>e2jq$ek znccOWhd5K%Z;V46I;gP&d$WK(x>Pl&Ad|6UTYznxyd`hn-cti7{|ee$%v^opgC|Hw zU4dBi73|AAWB=JJfUyBMA;)JV3h=i{tVx9KAK&~jB2Ho0|9X>U3@=H6YFOO*F({S= zc6*S{Lx;2W$3pu~swkH)3-cQI9s17hIdRcvjE2#kV(_Mv9x%T)a6F>5+2n-#21EuA z)H3o;u>s^>gngcu#k-R${<`-1=#TFLm~$L8%6jK{j@G({(gCdZa6)QpXW-?_;fA-V z8N^}-L(P3;Yzx@*m*X;ns#&!IV{aSg`ZoWUb+CNPQFk-iU0JE&C?w#>qy0 zE*K9wvL1>JD1Ba0P(E@*HGKL3+O}_50%7|Un=oe|4Yo@GXk<*NC=*_%5_8sf#C$Rs z14e|N#wl*4wVHT=O@)tG$$f~;brWTlt3fSeinA(y)Tj`YlbS?^n<`S%XfyHpyt`zo z5dpeK$Qav*&unn-xmb&aDt$*#&LJ0~u@ltr{0b92#OtVqT6nrjHmE=N`h#cl;T#-} zFb%v!#ybnNOT6XWt*~iZNZ0QrnfHS*q2Xz(uJiTo23-|yH2B)&CTv(8g*X1Ar2Zpq zvBwla%l%&y01d647Exiq~r)AH8RdvqmaL*kMo z3s5#V@3g%D&ECwA2j!ez=9Ho7T-FhrPL&$`a9!d=MrPBR9nc11+0YXxrK5yFz)}Nh zAB4ErQ{H(OJq@3n!xqrhEg^{7rUYZr)UVf)x?aqI{c*PI%a{DoR`hF7EkyWo0>apk zjn*owgzTy5X+u54=y2ZbU~#!O+SC_awiY~e+i&>!kcNS$@Blq*G`S)EV0>Rt_~<3) zhFNe5W*Q1n;yjQ#L35du9puO=EqMPzNny(vA_|E~d6F>dzXVKY73VKU>j=MG33z@3iQ2WAY zvNWdxSRKDjDE)ouTZgpW^#2p^N;fDakf23h%{P) zIyL#?6pd7PcP#i@KL44}TdMHx*yDPA0~f!SkM)+Fem7sgyHMgq4#d0)&tk6*r`5Yv z#}WHCs+O~kV75(uaWhu7FNFG;xjB$T8 z@VG#5t>o_Ej}1MJS}wUI6Ir10g5k_!v=glM$NFms zXMRN)9P5jtK?kDQz-tgzmyMM@?%+K}&0uP{V1Gf};pR*WnKoSHsI8ggQaomPsH^rj zUNE~OK(l5dNy6upBuWYJSB25M<}-2kY>OhpzPDziL)BCG?2%jd7z(M}GsR*d>PBM? zji{ScmJy1n?r*xdt)=4=0UnKvn^BZC1P7HFodp<*y~*MIuF0TgyObJ~GArzP8I-qtAeo$`C>NOxxgQ|G(Q3z6=2Bw_YzPT|uPQ-RD{M&Xn2VorU>B--z2ig+m9vxF@U$04H>}Pw6?1GO`)O;+Eg!(wn5^@GhGD z+99kN)$oBhFRQuHR}a3F=UynPh-@~*qI{Va7qs;qS15A28{#b!hAHNo_9MF+biQ z5S7=D(kd_(1cgQ9s@XGcaR-$#|A;VJrRODn5>x9a( z;8#P1Ro-PTvkfzYxW*|H+UI2CFw108JC+xKzI?FgyMBCmX$2~1+}e_3VWg-v<(8Go zBXC)(6K1L5`z~Oat5?U*))j$>>`RcQTz(nY&!$f@FPjj@2xvbZc3>Ua_WIuez{!t# zw|CUDCTGt(Ma!=SyKewK0xPE!;oq_$r&__iC$(-kSok=dZh~ejxs}Bfa?D0AIwtS4TcLmBU z!~AyP=XbBnTMikECtD;5Rppbh3QSpxSl-8KU~c;DVxgMm6A%9I_kGzP4j*`|V`1tN zDV^n)o15J#zTagZ3OyPfT&9*)qLtb7ZC{MS6qeaVJiavaw?oRI%)6*9U-wXT6*>3HvG_c1d-+C3zeAyarNo?z6hQG-9 zVF#Ck2MW1=gEQ?DsC5Tq_PAQXH4dxQE%^fBa3YMRS6>?hm}do>!p6uvO+Mx+UwTQZ z)xY=ih#WUJP8?Ka zbckc#2?7|&g#hNExe#*BFEBO#_g>=iT%L)zz&45G!zBPhL%ot0z?Xggn?1PzaOcH6 z`0O5tZIt1<(5^xw-|uJzB!^Y`)K*8i(%otvS&mv1Y;HxQwAvxO9^z0xIFdZg2xwvZ zUsw45SbOtusQ>nDTvFN<#Yc#eR7jsDWo)BV3Q=0fS}CI_naMJSndBpBv1E(JOob%- zmMmk0kY%RqON@Q&gJH((&uhBB&+oo-fB*R%$Ma7|$GlBP-mhypuk$*u>y^Qx2ohR} z4@b#IzKIO295JJ#R;(NX6uvid3hk<8Y9F8)F5I z%7^ABZ2&eC=|)V2G|VjAoa-CNV#RzBwgc>)>2(3vO#uGA#7Q5zqyK<0Q5MPxerivP zrMM&oXgy;uu*Vmjcg>hSOea{K+R(1Q1qiVm{DzCM=rHU@z{aiG_Ww~ETVL-E;<1)D zY4utE8NkGXkYIXvz#(;Ug*X`^LVKH(@u@2+Hsp?Rf_oifhQ$W$wR3ezbe)KutK?3T z(PI`gy|@UaocKLyL@@OWXjwS@l(~&#U&*nykk+*0(|Da#oQugS?&7yBxx;0?@odIR z%D1T1!c&Xd!EhCkJ28)T9kC+^0;ReE;pc7wiA);sv?2m|u>~wt{ZC725>2i^FpuK?ujKB3ss-}t>*ebyG(_DQ zg8DFe)?R1TRUfBot`0{2nKgVReKXvNu{pSTpdOtdmgIymMW*5mQl=^X)ai=@&g^pwfdo-~UbH!Pp6j1yp+Hk|@evtCGsh zj#*ZsqpZTvAYuJ$iW2;9k?OhNuDGz-iR`l3gN&S7YQ%44+;wz2VcVEirv z+o8-8ky9vxyNBDpy4OX^?Nf9{3{=+ouA}^-)CQMjY0=3~%drpL45hk_borMP-jQy* zi<(0IgBu$nqe0hfsQ;~qhWvG{2Rl9*ANPOz`b`y;DM+6E$sEj5#_{R*XDXi<>|Fms zG~BK_FaM`#Lc&$FG_6}#J!3_!rz%S1(uA)oLhLb#eNJE}#S?W^b^d#k(1sWhWE`?Q z|LDX4=;4PigO0H6enjkClTh9FolRN42M$9n0F6De1zDQ9CG#LBR+SE>U@Ss zn3s?}C+aCo6wbu{Vb!u%!LJ`;=&$fc01P@U8n}+K>~;DhI$Xc8=85_KU8`FQsJyX- zD+>hD%;#4rzyd0qM{rEg_iY9&LNKY^pe>uD@7^5b;5qgHzQs>Nl2q`zzMIT!x<+9( zB~X}GaZqNK07be{CnC`3VBSSA0V=g_qiK{51tz!M%Sb!e#ne4wH)!r)1)Fd4q6x&} zngj+ZpV83LKV>L8?-3H;CkV;)=2x^l9*w8sPOijT_pF4j7mt&|FdCwk@#57A^VDn3gVR= zl$xbTZyMa?L(0M}UhEBZv>KbX^yhu#+E>63V~l`gH#ND_ z`tZJ@v8u4uMPnx?0#-c+vtJ7jmkSLLyj(B5RmawP>hZf0n=~>(GxzzPNa$R2zwZ<& zG>cnY3qSuD=(0!8Y|a67X;EBCQf1YKHd5aq&ES_S+@CFK6jx9>XIG#RET|GHga0#9 zfVe4Ze7)6O>|bO_nush39@<6K=htLArm}}jbR>&G38i5((`2sZBnp(o)-?C>ROuqb zm#G0KZ7v+GUZ<~j%QE1oZY58#r=Ez-fj|k@1cfqMbS4k7va^2%b?Pxc&UXxvjF8j9RutC}C$Bmu2ND1-6kM0dZT!fi-{|=A zoe5e}^~@V}fc-7*c*Fk&p8uXwFN?*m2odlr`Hcvn$J$&O|(>6_evaz#&}>Y1}jQ?cr*b)?VPqvJXi>MUW|5DI$h{d_$X zFy;L{&SSX|fyjC8^)}j_>8VDl^Gk)oawA`Qt&Rum1=!SJ7hhHB5{9*sh@xF(b!dNrCHaAxR1_=yK{QqcN zf)Ze)wb=JRlkZmBzk<>;Rz2_?S+3AUa6$uJfU+Ky->kUgQirU+;H4pHpx!8OcP_Lm z)uj0!Nh2=KF6FO1sm+n<+r{v$vh{@X6Oxtr`cq-da%wIg8IYaRYBUnkG)Tw6o8m=< z;hBh+)xYfqM4e4nB~$sA+cp946li}(_^#g&j41x4Q->|_>IY+CH#&PK2rP;s$Ahxo z4ooMv%!}p&j`u1|c_!IpoT;2xrk_aLV^Jt|GccaY6y%@O5f|;U3W7?1naVCZ_Ursu zn`aj)skZ4SOg}`Nr5!_m%lpe-TwpT^HU8rV!QHJO7Bj;2*dq+U#=Gid_2V zgUYSIq&5Ymu4tgYz9M>MbI*#)Q&Uhz9A8c!^gC|9KZ-bm&VSBW=7 zKPg?xg)*V+T#!X;q1f7M5WuT>RX>`Z3fH^{T+_BKy7mC}#eONi?ee~9@cx)zXZM?*1Iu|W>PRv}kjk+8VP};=)N%ey^G67# zVY6Vm(yN%p3a4Qh7M09qL4^Nd6& z1_}nw1I7jO+;?(Q6K$Cw03kULxS;;4!@|RFSxZGd_GRZHI#4OtCMwEkh{Xz5xZ4~u z>PAWY8*q?VOuNL>)mx=i4i|{CsZ?NfOn^0N*SGE@Kv|%1>ovxMqx+rzA8vU8FN`JM zb+tpx@1{-jdgAhrclpl+4Q64I^TY|zX<#X9@gem%fD276?~Xm9Eq~4PCkbNp8)Lvg z4pQ)<@s|6E&&6ZzFM&S(M&wL#Z9=vFbU^hiEO4!Qc)a~sK$4=cox_X$O51kp{3DD3 zh0U063qm(K;{7L_HRiF%?`mp-mN)kg&R2lJX()C~%m?wsg;#%L>@^&Byk3z7fQTSV zm)0oAS~|sTnU_R7kf%h}%og8iAtvJvNOv8r7dCbg)tn zSHSDqVoCHa@4$&D5;h)aw2P&6ZZ5FGz}(Wly~fw?N{AM6ZSH&p<+7=?t7uF7Fz6Xh zQyT`AkI`UU+V70vC=$ZlPhK$<+w>9?7)WHyu@x(Qz^0!ymEHFWSAg`AZLc{y#d7=_ z?adPBlRdHA0Si74PjediMdP`a7b4k<~$AUqx+G?h!;g*D9?9YwP7oOZgdlvEh7X8gf>(b&W!#PAQyfMIeY0g9q zLzS_L@f)oll*axn>WuXp!3q5Y`p^OUA)BjXDaugWj@CvTqo*evQPIIc)Q%INf&?TL zG~nlnS@w)@H8MMXmw!qjJa=)RddYg(r$bI><5e&}rlicJr^09YUfR**rWzB)`qody z0y&H{BYph^BG7?1Ws9~$_af84|5X4aP(ZQ-R&&%sje7rI=HET`8S%*X2c(%efi8hqHZ7>Lo`60;Lqvn!&pPy?a0PIgY2V94^ataPrF_8=YxTAK)L8@ z9}8XqBR$qz1OhD%RK&<{D$zwGa-)V5K{1_8{P4or$fvv}O9j~kMjn0NlR?66TuQP? zGeo>c0=@2!JFtt$Nqy)PAeEni-n=$~3>bHRdn1!#Z7omTy+9^-)qQiw;*@_IW88EL z0?Eruz8%Qd@CDfdm!k~*P8@xS-Ae#9*6juiEMQ3YZY`tdhl!3UN5Qkpaf}-z3MKYf zI?JqFEx=Owd7^xYz+78v7)|l_d5O-eN;bXAjkW3gvg5X;ADFP{fTR(lRh6Nv=6M?j zr>n1_?1W)z=_S-tONo>{*KgJh)rmNJ|jUHeH`EGUZe&lrQH z9V2k`*f{(bz=QzSin=C#XH*0wa~8p{m8CyJ6$BL?E;VUIR4D+Z|AVVLH~)EN*D(^u zEOq<;2{iKWy{C4-Zz~kff2s|{nVCo2#bRoIcen!CXGf00Exl?IK<}gmKXuiNzu(9hfQ1z{84m8cnE#&y}lB9j_inVnVy;oq%D9q<2y7a+_*6^o^>xlPy z&Cx;zXau_RV?T3#(P9MVQl{r0$9{1(px&O-J2BQqqrV|XshYP zXg-Twz^_&CZ2BG8(m=xzr;fYv$C(&kj|1WBb!uz=ik(3Z@S?izfBW$v^E`FZqN!(D z*4|a|0~5WbWb3g-7(n6IM!tpa0TPUGmkLl-+J@6nvm=_G>CkUbBP6FFunP?S0&w;S zj>gdWcG5mG($K6V+pS)-9mwcWzE%yd;ETfF!s+O!%_B^|oa3FK;-Q$WyJ$WiWQo z+OePdbFd4yO1`P^wZjv|oc;0_=}Fm)QP!_cGO<4w%IDYrq|hK(!YJRLfd1$(38Uvr z`(i5fj(_ZfG|&vOgHoVD5KgZ_RczDlyMW!LKWr~I#I`36EgX3-TB{*6AB5gL{|Lb- zy1q0QxMa=aEry$NO)dt%3kSR44xb5%RTdV#bL}Nzg%|i~SquRDk2$m;+HRFF$Q&vi zfL9!Mv%0f8Sl1><{!9lo)5inMncm}hFjZ?4wyFizNEb$rx44u^w|I=Mf zd?z0`m~WMXm5!=|NvzA2dm?;n8 z6UTO%f?!nWSjyv2*#xs+=EC}U3L#C9o;JB0%Q-(C99YdDM&yNy2%sJtx;sED2Wf|EMqcJsN( zPt5K(_EOt*(n#%Co!R)QunGMs;CJQ|at{2g*7S1|hP7l@rqhhx=;TXd#r*LX%+1NkW+Sa!jg zQyr1}lR7sJ35cnqOaA>Po2m~dQ!^uC5gT1-`& z<(0dJFJ98ABeA;VCYS3}G1H79{?DB(tE5b@xhKXc_)Iu|;A`kqK$Hu?i8xJQ0Ys|D zw`bHXpBSlU39-ys19Emj1%rpYf92f4@A=GTyL;;uX@9qs)}Pa z1q(KfJiIJfDA=g6wCVBCAwE0xrFm3eL;?cc&)f9Of=u$h;BeR~d;7FS=uJYuFaZKz zJ41;#F-;*2aK9#qO`3q)yP{>gKHuw2=?(9E@CiA`e-UI>N6#Zkg%_X6-uTMJ|K*aqfwcB zQZhqK5oc85NRC3YmTZ}2cdrhJ$aW)c@#&@J+iZ@Nc4bI*; zFb5GcNTbq~J?TrtU&9XxeL48mN+rURLZ_LQSzpQod0Lp6&>~;}CBi)R%amo9;aLM3 zb~)wpx$s@ly2Dso)}@1l4FQI`dN;@S@VCiM@NwUNQZ{{*EA^Ra*(kf?p3xeZ%-6|? zOuO4Qd)^UtUvH0QBWKLmhaEq_Ki#^^^^=vmYT9ETirHseNM!H07l>~qK%=W_DLjMX zg`1=#d6&@}ge3U^_{lC_RTOq%*VApr*WZg1Dy;5?pB7Z?jx|3~gd8Ud{p%DE_^``# z_Lvf>8z}&*15vDuo+S-K$or#&CTFh+e$(car+jez!>j28f;aLPLSUG-@Xu(W551pX@c9Z`xpDo>U%%4& z>`>GCtzo0n{#zz~ST?hl6tSLksPGN}W2zTd?QEM0EfP4gwBlNo%^!5%hw`57sJax# zn3>YH-S9Hi7VVp$yR^PX;NV6LVhJ|JttQxUr|y?ttmQ2lvd;1>HAt-uF#n}9>GU8g zDpFur2aB%uRI2S!H;*%WZV_G{S9pNr0x3pY17;u~IbCsa^> z?lFEHEHOZz9+B{3OZZ5T{#!@Vz&J-h&a%!ku|=Z;;tLe96n0=H`bp7`x%2{^Q109#j3jq7I?7jYS$~$?eo%7P>#=NvVWi@4xg@8dS8~K7o4zT`d z!J@!q1Z82mh|y3q*z4#asFK@T;oZ6~%#ha4HP;M``orW@R z8=$xZobYUT0nJuDDK6TdbJI)+eCw*BG&j5y>)Us{66{n{YFFfLQ5Z;2dp_C#iMs^5 zOMNGp4ZD#pTsZeKHFx`Vtu*fmHq9&+z6)zTv_{U2JpEptkrLo)Q(V(JZLx-gGJt!t zjSQ=A#3h{=@GR^g1)Qwqz8y`$4rZ67@b+mCD&P?@zSF(hUWci+;U!dOe05F|Euvi5 z#n&%K#&3FMM=s5w&^sTJyITa13^0b+XH#K4WU5U(H5C0>sJ*W=SXH}1WeHL-i*1{9 zpE}%(KDH-|9z~D;wuTDh zvJ;?}Dw!I~1m(}z1O$Qb?VBNb=@~00b+>#QK`y-$_VARw<_|)|M4iC4flniBx7_p5 z2OIrb{QTCBZz@4LoIG}Hwd#O4E@)s6d#L%%ahiK%)(keaxx;NxgHt>s>$Kn8WJQ{L zo3zGn)emwRrDxlpZrO7N7{tATcFpa78U*;lK{8es!<~8c*{~Y%!H|~k@_^tMp=EzC zk2X!yiYJ=|MbH@EM=a3f52O3h!d-C0CoU)D8Eu)ncBGk&y;(ZOGr9$(H)?+|u2tUE zjuR3Tf3lm)Jc`<^p63$>6VD$%iz*7{(o0QC%lD2ah{M$q83FInPujE1AMnkD9vieK~QzzYd2FJh4Qjb}z>>stb4Ota(oCx7~jxPL&^@#esUMHw!-aAL&#SpJ(<0Annt0uLIn-{GX4&7dRKk z&mA_nO}*wsvL>zWzXzRjF<&a{G`iJ~6Iz6mn$;P750rllpCt=_FqK-WkepVd<_U|d z>84%DRCXLVcvrX3xfi1`u)ohEBk9G8<4ETsr_yQrWa#&aj~~i;Z(zdJ>B<|kVYJQG zqi@h8b+62THbjd4M*oeN!B#@Npd5QZb4|6c(cbt{ik|t<`%z8UJyzXn0w<=8bO!`n ztFzlr7LR^RYbOsD3m`1d%wJ<~>;n7vTR#vo;6|Ie8Hw^#4(l*#@QXv~yk~{xd>V#E zJ%{VUJd{Wpd{L6ffIa*Y0Pag`WOtU4jus}pd(cFF*d>VUx0*O&sQUIn(AXE>h)MY! z^d{7qGt;QB*gAY#nGs)po=Lki_B^qg$~qm0hkH*Zhz0v#dCE+Npje-${(6(L)HFs* z(LnRwvyEfsihFW$pZlymF?g2EHPx4T*VUO5KP~uK)gmvy+W&)D>5nn=^2ej|T+)=Y z(ER{OXrlb8E4UoW52@!7u{Zw}m?w8%2*wHhHIr}Dz2GgS-=H=^wGXwV{Xf>pX%seOpLZ`pGdc6?P?Aa-YFvpI+4o^ z{HnQD42I)Or;uclW)*mM+Ocd;G7fvsp@F@KGvksU=G!Ar8cL!X$HC$bbvy$Wm>7d5 z3#Z%7Qv*iY8G8k(QY6!xQU-NhjS7ZL+*pCs9ZN=KJZ8VS-%L-Dv}Yk?bw{s&&Ceu; z9(HHlpP-N~;m;u6>vLFl(Pf026q8)s9TLgFQffMW{)x|`8Llhf60D%AmZ7X7FyOHb zng@kV^#1+BB@rx|U^O#|1=6f?bia8J%E{ZBP^`>n2@h$ViJOv_W;hj}Y3Q9n*|A-A z@W01}ejDc5l%E`el`NQrRV(%hFSH4&@^{!_D+T4b{6>4yb=GqsDl*LbSi;9Ib$A;t zD(X%yg}l`^-{I54dnGnQQRdoFUuexjvzq|!+a8RNd9b!pcfZ3)@QNo@ezdk;3caY{ zTYmuD|3`?9YrWaJP*W$OH{25gN*y#s;`H{8du+bmh2ORT~3UJH=#;)sD=H^MQ zx5_tisys?(^nc=ACZL==MVbYBpkkq*5ZCmOG-eR*iPK8TV;Yp`7A}=Zqr>yJ$B9$I z$T7Vk>K`WJ{K&!~--XVf9NlvlQr}H}hKZBnrcou#H{$%&i<(llulS$hMbdL`=3zS!S zn(U4r|1i#JT0<0vmHfhynWy*Fl~m#CZhg0wKVs;2;U*=BsVJ!W6boYibcbR)+H|RG zSWr944%wLUJk)ZNxxu~BlVRGVQJcL?MZW_cK>!^g3F~uhC=!0hHa%@qVamn3HiUiop8jqbgMbKlFM`1w-AD6 z_4ChLs3Babv*rAsrfN)xSPD47pX9^KqtJrXb{STm`usbn^b>5sIb;tCe{4e}dRbmU z-I~v43Ik@QS_GiA5o3#ve~(?ydm)C#8`Qz3JGoGh!;-cz-5u!l?DW=nhZ`iXzX)VB;*L0PXL8>&j_;laH4VVQ*7&Zv+dYG-m7#=dhGQ zj{h~~mGAoA0pJCnfBDG1T#=sci}G2q5}df=-0mHSe95~n&+>Q@dxIs8D(mCbQC^)cgXpzHM8_|41Si&@~=HTsGxt^i?-!ubwj%~ ze!V7Kd(-sKgP1dq;#^hHf@g8T&bkjz_14ToIUa%@DFkn5y-C@J97`%5sV zMM3e+lmC-Z_8e}93cau0l9Bo()N>mOIqbbM&TQ2!03Ja0Fj>FyP_$IRp~Q8Y$v*z` zP##q#tU0<$(6mIhZRty+5+g=Wogvv9eX*)-z{y{SHd~i$PvHXYBZ2KlPW67!f)JPx z#@_bBq5RI-pSW?YWR9ap^V2PZB_SJc)rcIzAt0n8x@4@H9)%DdD&B5+VgOp-y1{=V zY6~g8?!!1Ahpo42Ie)&Kc#6`r|Lzvw{p0eo>G9@te2}vqq_TnW1pgB^p}oMv@JT%9BO`^r z4l4873kG4Psg%|^52Ev0))b|2hMEggKIWh`3@6tEUM6llVgFY=A=l$HTTr-oxux9s zyPWAPDIh8KE`^YB-iO}N^;p#}cE#icD{4QtIw6;V7 z>9N0Lv*Hx#*c+5u)5?;0l>~V|c=3>y3oF3gBjYJiRp!ln6}y5kQF(A?)%gJ;#k zztJnUqkACle)HdilCwzThzQx#DB2hE!M%@d!--haU!ilj06L|Yn;_@4 z$)jrc?C77h>&t~r35uhaK5c*^bDfR++;Hc3ycYY=#Z51jHItSYRV_kq(Q#xE(ngCN z)P~Os7q)~|k3X&T8T$t$8zDO>J(BUb5BqHmBPFF|mDpH@Ek(IkpaV|^~OE27gniwi2RR21o{Wfa7KD)fzuAZa1! zgi;MeGn4dCh)E}CIyoG(l-d=uV0-u$G%n2m;X>#Ovrc}~jufBY7 zLdNCf(PPX<&q?4JQ&47}BAfiUe~%N^H4T4f;L;+epHSySMREcSon~iD?_mQB2z05> z!c&JFD|#v*hf=#MJ*gg>iLY!e1MfnY@*v_oR7=0f97OyXmvt@{gez$-9*d&5z}dz@L4b`x{*Wcl^LzdTwBquOTSE%th^-YVmDYEh$yM>>N09BMdtucPQTP zXJWgw@_3(`*S=g@9gjUN@44u#09y9q7FGiF76Y}fYRRg9YFmWpB)8>JZ> zE3QmwbeSpwIX!PE+geY}k=F+;_Z3!SnKmCsa>7gwBfYWFaCNH}NT_1qRDt zY@oHOm&-F?vX}jwcG*Y3tfs2>ObiXK)>qqdf+99YQ)4BFb)Yph6^-mFp7Bu^Y)c#_ z<+zf2$r8+fDZ;Vc%L!tt88+r}jy`KEiFHnq3+BoJ7lv#jyC@m9fepV?ch9BkjIm}N zN551kH}-SR#8Bc}q>yDMW07!R&wssIr&Ug3BRi7+3(uYx#jbt7j(+$T5c_xLFm_sX zekIiAIf3qQEUldX9KWs-qCDY#!ajnqr|;3kPz z=WnA^L=h*=2%R%+#rk?9%y7T#()tC+HBl^^Z9T+ex3p}Hn@HGpx{S2JG#vH3;pUWK zVAQt%y9+I6gKQ5|4QO34``~O zkD*1>zg=E~SSHwiF>Wv%*TZHzl#W$*nmODVpt1q(jL=Y`^xE{0XddWrZ0Zz)9;1%0 zzCT|+)$v`L&s>mEGGKCAy7xW~7Z6+Sda$9=p=4ad!*?dV_Az_yW~T}!b)zN9g}vg^fF*ytc>0{YT|Od$omH^9^r0YHWkHcT{UovGMXyMTWgG_!!mw<_V2RF zO$OLs;rBBI7Jt6dAf_xRga6kr1mV_K@7|Q1KI*TA$|97-z-}{~9RG^$m~y z_B_?Ve_!P)eHmlBy49fEqvNM+KAHU3G~p-IcK!ettFiOjQckN!hv#Bx`W@J!#z2e_ zmO!9Tr)+u%Ids5a)u(nPh*7x>!PYPy=k!kd?Tu_$p6koP@%~gO`Fq#vm^3B-(Ax+> zs*l0`EnCi}rd&c6ral0(&bWdr3rW%gPI(=j%~1O%noZA&A}4qIVA=d}RtEDb_hSne z_Ss3BwNx6Kqsuf%+W*2VTG>$G66W&t@f8m3d?u!U!GbJ&r`mIR8WRztzB;gnko5P~ zGPKKR4|LnVaNY1maP@hGd70Dbaj_n6+O^|rC>}gxX7>{0z6V{B$9BuUTtFu(1He?+Jq32y^ulq)&^Np6LlcW}> zz8!ZTkD`tEqmsYjFHJL^k8Vc;&Wn{~g}w6RtX?B&b=g8v=?SZDeno#p^$eE|KT|(2 z3=$yyiXMm6kZJ~iIeDi_m#}MCZzE#~a>mD~*nE;APCFi_k#Wy<6K>K8g{w zAW_O@E6CQZZtGW_|B+eyY7aCTm}0|zrC=^72^(+C-#oyAtV)?91TWB!ejxZ}AC>R_ zsgWl+ai1GrV3XTrrII`Jpn5auP&|IUx*D?*i4c`7m*)`?sR)I&EULFv_Z9V!QwCpaS;xKeAq7Ph^y0b}Kk*Ysj_oVrS%?7xhpajYXPfFxOurHs{?$`qa!5@{Njmhc zhQ+g;l8nOI9idbs=Ho>$g4h(NE4$42%GfT`x=;=Pas<;{5>CXF)Z|^ye9hYa(l#Or z(U`}AMU;DcMc}`0%OGgJR(I@bRlS`iPGM6n4~YNE)-I`BxI@OI&ZJ!ryQg!CjnyjN zvF7<{k+c8Xv5nt)i@51hbYsJRek%GQU`N_wm@{96E1|)UQt?rlC+fMgG8#+zb$w{2 z#oH?h2YsFx`wu+2OvbH$Fz_}`+it&?|AofX2RM}?+}N$yY`Rj%SVe!5|F^N6klh|c z_;Uw4-uz1t3g|h2sl46DFB`)TYrgDNc{;jZ?!z6+GJ3I$x73vCLd*=^zfqof{4T^F zo!S`Rkr@TD44VZUkYw|Es0;ae>7Rclt;Q(*Zz#se^%dS8wk|i8FGO zN=K-e3bRq`w^kYP;WE99zot=3vLPm>Bi26=iyKYD&!PHNpLyt0($H@-%}=kyu9Ba*8zmaqqF^oAuAt!+6Qv;r;9EB6A}Jx zrY|+#t|v#ohWk2)K*RCL*M9g)gN6>D<9J6ni?|CHmpBhqf`=qtN$3fXZag_-S765# zHLB}cIrj5iE-jeqSLdZY<(GqM@YR|jsc-v`g1+J3@sJ+CB%K4@J5$ULjnQ+V{aCtl zI+t(O>r5i@GDZQD*hrR`E=>P-(JQ&3Vgz3v?avo zy!GYS>%Gyi4vg%UbG$gUoY>d2bGiu0SR*Tq4&s?w#pMqI-bT{FZ@ah8tY6?Ze=;>e zJ3*GReo-XW?Fc6vYK7c-^)&!K(#AnG_&r!9GP$=}YYsMd1DCdc-|6*}lar)p`OmwR zE^7SNN5tGEX&J5roj(qX-2HXd^*#T7kN^5xo8{X8@p*|_CA)NJID}~%o;+HKCNsM7 zQ;(R{4H$(HF=G~wR!gQ}^4;FmOneQNu6um)E8=ZkZOZrKX#c$xnCi7*^Z?F*Fl|5f zKQ$C`8~vuRn$I#r4Yp4XLYswO=-bli)CnfeG5wds2@e4M%@10%^34rQiMB==%=mux z^ZwMD#Q9w(+5IP97om#_S-7D##0$W;n(^~SX=fGpK!tWF=_u{PEvIin+jbWz&YtC# ze-pX;QMMGxJE?{>%_T@vw8tZK@#==E$vu?T#mD%+=Q-40D%|-AbDaq+ew3%&-KxEm z3>RPKAHR+j0E&p;&G-{l0Zfwl@P5yqIZI5u85nN9jIHTiu%t$DVEy97&(D?!{^7!* zZ#}?x;c*1q3DbgTNS8{fg8@HRaBd4)ln&8x(mTh6Yme7R}O-fJrs60 zTN@oPN}RtBCEp<{Vqh{VK5LD=9vFATKfG)C84$80QuG!>ldlxb`jK1q{JkIJ&!key zO%WdgF>BBjePt|mQcDWsZ$~VR>#RO%V8wbGDl+LD2kyZM#DGG?IRm;QNjs0K%&?hA zI1-BXJ;!h2(J@_(0`-!-+wcf0pRm(*zt(;l}3N~;;QqH@WvTwT50oDI4Du( zualql;u+ehY2xRlnVgBB;GU}JgGEQ9Wei1CrOU0fv6K&>)GU!~Wp(+cXH{{pP9=y- z8Ku&138wn*wG5Hb65$_5Anu zFtV&n*HJuXVr7pzAWCWi>y|7+h4X>DX_nCbT4*I*+Uu}TT3IQ7-? zMQ+vnNs_Xm=)iMfgbktLZaG)+TvU61eiVzYbCZ$B=_Et#vw2xy7D1GaW)9{8uKAk( zPx9MWRqMgkURGl1VHwNRv^RbSEdCdQN7Rjje1EX=Nsz2GKnff0?K3~IA}bD9h)2Cx zhUjqFOT)gucAr~@a5O`^kSc}(l+Ccfx$f;~muXKL*znRzp&SAd7s`fOp|a4D^8#rT z;XE%SC2BhD8TB<X-3e)l_3XguqDFWo^!;p$_M!Eh4p&)l+#1 zrxRraY@r7-Lz7#mjCixZ`b!t(MyiyYiS|RP zur>nx9?PJc;kO)096~m`_wS!ycylOn*)zLKGtX#dx8iJ{+Gs*09UDOmBCNl@v@vuE zGdGq85qlQMVdx-TL%m;bnxyo$VJal_SHBgtq;?mvNiNK5)`DVZj(gbp-_XO(q!P(- z$=E}K?MoSbbKJ9IBU@FdabB=%va3pnajZ)}d~{_zTGwUJrZAd|IGhM29%3qMecmv`+<4`9~_^>IzODoNH*4^eT*9F$2;WeLvVfT|1 zb~S=T=dkb627@%LU6?UIerJeHz0>U)N>|!nj>2o{R`p3_l3a4ENy!^n7 z%$taKZh|aOfPKHiq&4docFDXioyL5gOvwFml3w@NP0*Dxo65KXsAEJ0> zY4>kN@3nN$W`$!hN@*=PL4H#F2GDo7d1b%nji6^jqmHU$n*Svfi`xb~tkFYl<9~UW zh|JS1*sQiP`4qk|Zl{R-1(JCI#31zeNgDNpvi%3>FC{M1Tnax-hl}~)W*PL%Dc@$3 zNoW7~!K%Xc(h6Tkuac{|xCtt0aP0x1NF_G?wOyJ0)S>hT;;L|2-cV*>Dqiyy2P+(r zQe)!gP&ut^`f?-Pj9(I;6}LQ|Tn0YnrVL!8S{sgNMT{=H(|0QdUPj*6w)MqdW)CT3 zM=$H}IZE^!2eeX+?F}-DZL-S?U0>D|7{G1JGL*MVN~W~d%tlF>6ybiy zk5)&I(Wu+V-Rs0xNNmMS%M-C;g zh@qALy#5IEqJJEvF;bM(N>~xy|CQBtud?dKT}W=#P$CU);s0Pxgro`yKjF|?{P1{Q zQ4TXf3`G$;tCdDYPDXz-_o&_3&mLHf82oVl&0gkPP1kgUM>XES+?~f<)jThil&I=7 z-r+}cHcYwnY-HJe^xP?CpBMez;jBxCnr)BR4>{XqQbUAu-*RFXmZG@sPezx`hc5+< zZc39y^8ww0IX5H%Y142!i85+Hz#WGTEy0pY))$fEp+2*(7UbP2(SB|jeahB$rBuB| z!JOi}mZP0uWGW|emyuUz+TLAw7bs`7&xfxYIZCWHM1J+@oEX88ATEmR_aVq>xn1~? z0{0w@ylgvH=K0ERPT%UR!|PO*`;RW~UvK%uvU!@fBY&qtxA zzR8)tY$HoVf~1%LG1>Ry$-&=e;uZ8#;ka4qdtu-yGk4`khI79kpdLpxYRn;6m$2h^ za66gBIkgFYK~{RHSkR=1r|^$k{IBD!-T)rlD1H*QlBU04xaz!Z(kT)?+IC8@I{fR2 zq}0*Keb1N51||f2YuL5?%QpdVyEIF6bpCR-2Tf*n9hnibJinZnRF9(95^Phc7g_Wc zu7ZMBoD#P$WWr8(KH_dTSGk;ZJhg(hjJ6bp>A0t0SlN!!q+6o}d*I@G<61}I;4PeGE^v0&F$4>*+)G$kdX6-CImL z-w;Y8$Lh*-F%rAv#liwZiC<1pF4Tiwf(J=9tA$>u4AeS-*f}BZ+2Vs~N#Wl4UU~;) zv*kX2?3NvisHbDgw5IO(?-nY4>}`(JL>-!WhH^Q5wKO4c##@>~aAn1#WTypDwZm(i zs2B`9@f4!}`Npwx(T{0eXl{Li3ZCIS$IWr3WJZ3qT5}993|M!Jnr*5af5`d`LC8KB z`>%}p!J-n$3%rgHIR5h`Y7LJX{nEf@?8yp01v2mLz=QV=x~+U-3=y4ug3t4km8HYs zbF0ja$yD=w@UGH19P>VxoJX@*+ZeQn|6Z}HN!;O*9n)wFOU%_S*ehPm488&~S! zuGUK%ugWf!(HV8FX58${$PUkdrHs@7{+oah>*+G(BT!)!PLP0Ro()Z>jhNp#RzI?c z-a)6#%H_;Lg&1KfmxYoE3;j%w)Sb9MedtSw;rcf7H$_}5gPkGknfFLJK8&h?`S%t{ z!^Nj4gwCPI?4DZ|$jRzQV}+rkiLJ^UUw5=Vq>^M#a%;Yu?wK4?l7lA32>COFSl#Jf zjrnFSNn^g=T-%&iUtGj<`|A|~29V4$?O}$n`+59XuBl)Kt+oYQeqtz3$9?aynE`m> zaw`ogoSlHdZslJ3>J->twQ$Am8_UYvB$t-{VEk!EE)2#Kv@~3Kx^^11Fdw)MmR#95 z!~VjV%pg9gL4jh4X0NCEo5aygHYS2IzG-M^hza{EX#K`zlAQXl$Y+0qV$q5JFc4LH zc;d|uD<4_d0jL!HA$j+o@f%cossjh`J1D$mCExncA+`NWcqlm9kwEbToPW;NJA_%P zwieIgkuACCsL_s7h%XSh>~!n=^XIZ=@q(oBc$>_~g)ZL-zCN?%%XYW5eiM*(r`^(Z z_aoCZ;W{mjUk<-gRe0mFbosc-}2kKG5;kP)STBX*eR6&z6U#FU>SP{&7v9znDP#iQTpA zr)M_@*(#fr4_T8b__&m2ceP~wNdk$sTt;67GuhJ)ft~z`zfKbJEkajgK0JTd4cLxd z9UCy%<;R6S`+?p=IwZC+>&X)*DqSv1>Ew}*aK#kNnV_t+MsfhE*TZmlP$b8Y+Wj|N zY@OsP(M!%3AK}^fx*zxKceoQ8Me@4b6L_z8iaP7AFH2mR1|JzGNq~E{)cu~Uzy5w;$w(`$1E~ptE(J4{9#T#eU^GMmT=kb$MdHL3zg*`et*YMN+GF4M(3in=WMG zu+9-V)ZsQ{WZ8pYY>w%Qxuukv*+tl zLZfNUD)R;Lj{D}NfC^9dMflxcx1l^iIcKvM@5^U`zLg6hH_KEbevfuBO>2`I*(VnO zOMTYHt5fo;LQYZNg`)V-+8Ov@0MiKxD>fC_&qV#~0vf{c=)C{!2soR^TD?|Ps@qg{WC?ARE&E|Ni2YsNh7sDRs~={sN-3)bzik69EblR>C@rje(Wa0xB|rliY99b=jg7i|9^^m6KE)- z_i=nIA<;smB5P9irG+e`6cte+LMYjn5wgr+XfHy^Rv0Z3g_JeRs4SIbWY01q+t>$# z!I+ufecO%C=bZoNobNgR&cWOJzW2S)eV*q&+kKvU?aI9;HHif8IlBQohB)c?B}j80 zWBO4Xwi(P}wB}khu(U|ULFyr$2m}XOV`V|*vy7PbU{_kY%PzR>=FGL9!|g+i#L7G zt}Qfs4J{=59?=2W_W`-S8q=UM%G|jtm5&Dn_4^4 zC(z(@x0l%i7V&WDiLbL4>)D4yKDDJModqUP#&}&pO}#-t=eM_cT0bJ4+Lm1Nm^L~o zHDBBI-erEU6gQ%aD_9 zq}5TM7euz0Y_G{_{;+h9Xp4&QeXdt?dp7Y>Hc71ytk%~Np1RsEhJ2w8jC8vNo@2+}ZSjIdT<=Qi~i5XsDmoOGuQ%Dj!sjBpf##wBqUPB@7zmdTr8hZpptjywR6rSqG=x$uSJ%S zX!ygu&4V)6e?~`6NUX0}APo;YKg?77Iw;V9P1?&qnnUtw`Lc32lyG$EWZ??a?j@x6 zTYMkPGBprYjDScmsdT}S)%-@<{&n>2K5+hWK_8xpCjI25QMFnN^}`?xSw>ussxLGH z;v}0ifY*wCI=V@APH54fKCgw+&`CwoYGEXT_fn~bx9QfkCh)Z#(<`^Vzq+18`DnNZ5Zz3$GvBhmM`Y_;!TP zbtZ@qhY~h}B!i$U!g_NxBm@FKoilDW^m_Yvayq-zEYEGlQp+#VR|dw69*GSM$0w~; zeC5cq_6{tBAs_W{@s`67j{NF1_{wt0>I{Yx-;3n%;~!nPLfq%f%6q!ipDj!)pA^7 z_6$!nB@RZg)U1w$LOd)n$*XOpM*-vFk(^d^YreK zl7Zwt>FC|7@HUF;6fpMGN5k+&t^DKI@8ITumB|5<(rkagBNRe3P%8*bG0*u-tj)+pcMjZ3w#uxNhY=i2Y9)@|+#yhB?oahwoIIstu# z{76{im8N;X>jkHQ^=01VI86R2Xw zR4R4FvdcCj@ZfHNRP7IE^`GcnXvP`?;CjDh3`Op^O{QYzuU)*CMG-n)v#{Or-Qf+g z#C9Cm%xm>)1U8>CrIBXr3M8Yv?78QA-Lw*f>@AIU>a_sp*aov!_)s;z)GNKvfJjuE zsPvwW(I@h*uW0QnvxZ0aiF{+!2EPj>+3Wz)diyZUy<)g&XgKcjNl46xvh{A7Xf9 zk_IfcDboUqGI3!lm+*@TYcm4D$~4teA~qUrLXn!nVC?KVK7KwQrnkdTchB0}rO}4t zHxwd{Q+vzUKz32q^;DJP9ADrfIdhz3$0^ubgqAXmDwDTW0!sZX0uNJD7lg`gXuR2c`^{cGxp#3b1wwY?3%f`3gLA={CsVkBe;9joTfblKj3V&-c?(;O!XdlJxB4l*ZgtNmrZT zOA*K6B0vKDmvKFaORcYjn-w|SDN6XfRx9O@Xua>ku=&S>KfEee5{=Htu5 z>{7v4O`(98>6T%3=D1`Plu2PnTK9HE^^i1clId{joutHBJ@gK>O$0`T)DB+n(t&UX zF9S`zPA@}n2t@4F3ALrKLQ|qmxKGchG=tD1r>m)ysnluJgLqIu8+`V)dR z?{Up>_~QpJ!c}OU!6-lB>XIfl&b-?cgmsP(W0;sEL*u1P+*jQ=;Ja>Exb76mJY8+f z8IV??Y&^4(LBmo(@;k7;tdrIEVYfT?X!N2Mtqy@t@YTgP~zsux=}AxBYcyjq0IrYOXt6xz8w~|7*SLuVl42 z1>{0z;mcR6nefZP-?J(tbUm{t+i-_9;lXEJn~RX&@m|)v{=E`gxW zq!7cvkg>LAxNR_1g?Hu(anjZKIr8WjPY4z1cRbp0vm7{4K_TcEsNoq`e-+%ylsPffQ{sNKC+f{6H1Wk<#N`N5UKz(oqzOzhn1!!sgEZtb#w1B#Kl{M?)*jk&nu@*q4f@y zpEik5OK)8`dpf#qhBdhU$XCG)W+Qmud+y@>NQ zQ6~1S_3K0rk?ca-Wa~Hdr?|JoC0B%4#h21xe0#m@)Q9!^O07&v4mO6C_<8cbLd(1<-PV+pd%qLa%2T8H4j@Pv=~Nu3-J zs)KmALnM<>Ex*S8aDoSBV+sn2r9f<|!mHk=Y?E}`5+FKR>{v3xCQ zEQY>RJayWf`!op~1rFp>5ece}*0j_19t+a?mPoZ|qp0xu=q9MFtCi{_2Hr;cN1!KF zHp=SxJ9X+D5Q`k6PgCE&6euYhC&cD#aGuUh+Hk49GCOv<4Ly04kI|9q%!joHw%NKn z3T4mYK*f6@sE56+nPvkL?srxb+FW@{um-4?q_X6CYSnF9x4{OFHKxZeKtS*u++#6*-~5pii9X((nc^%Xj7uXE61fa^1jR`jj@ zrNuz+wt~cSxW|U;hPJN$roz6b8s3d?zvzeN{ZvVe8S{igj3AIL$>X)nGdEfFhVMFs8Z2v z!c)^i6eI??H30=eG=qf=>MCN0dhAGS#IptrXU^18fNcGvKF#C6|I4A5mf?&Jz&Eu6 zTYBpdS$|t~GR`~#n@0+qxirkM%WhTK^DOF*apZK6C73N`)&3Ys=8$ak`ubI@T^ztfPb7TzarZ1y% zkvs?%+;&G=eF`VedS^*_Kfju(&{R4wpXU4g8VW`2%1J6}C_)wZOeH-+#1^Kd>4AeZ ze=%1|%c^vIDWJ8?-`yO3g!0MMxR}gSRsez&~^*Uo^P+-;ZCLP z?-F%n)o>>`GkPhEn?6MzPUgMvz?LI?M(TcdE2R8pj*lI5Q7by=V4QI-YWPNTnKArT zW$NN$grh%EUa*nlR)3TcoMh#i{g~Ka4Qi|1`f2tq?TgQ|&&rvC?BBELYNHczpNsP8 zN&BZ%INd(d&(A!ol>*|k;0&m`v?%hqQ1J*q7MHP&n!pmgvs{WXC1PKKlB>4hu3o*w z!;V`p9Oq$S$OrCp?5g^dC}vBI`Fyru?)oO;r%lZrb#3A6rUz%LpRcz>JTI-2 zG8QiCp^m~aB>~%t32s^h6b|()ELv)OA^P-RY|_|gY;KMh1fN-v%4`YMVaVkt9AVPl zxy2AZX=_)MnYoKK%sIm5<Lq#hvDz%;GL=?M!kbZ=GQVE>gADQ~)I_KKs zOZhFXI{+Vq9@@c)_r7SS)*$9+SYnX1@nXHuB=-i9?Brow2eIxug|2Bh7Pacz7&=R~ zb9;XHh+idt%>o+v_0ZPdqODDmhJ?VFinxxgd_ao{2TmR=>Q}23-0$(gYh6iM9PuvA zAO!w;t=8G$tt|P3;OC(ey2H14;5wpt+d#QlbN#EyxqDu4e(^l|-KT?(3EBCJL-TmN zpg%fc@!l-4ehThy{=DH^o79w_N7>n47XqPC?N1z};R-8Ac3$Hlt^Z?b`=6Z1au9y) z5wBoIWNr#zHw#bWvn!OjJiwVe-)*SCVZxDp-tRSf24p$y#C2|EF)Cep^1w!QpZJsl zn0`~Y1~gEHU^fH8*|^r!axZ@sHQ-M=j;U3sJ<@xLitvAaFekpqXYu-#1&p=t2%`W< zb84VWBOdIuTQVfRwU>1BrlfDSIVgj)I*@&^2c+Y&YPs0q6DZ*@SCC5^ClicyoNz>G z-4CKQYViXL%=&Q^E^J-g{yC~jE8csCpUfK@jX?&u!4wMU7u4wZ5xCLxqi;P?qtA8w3HEB$OcnG_);_uJH4HHjIIcloq0Ib?=KNekl-0D5FXc}1CDGEo z!BN!kkT~o6M=onE7FIlcdFI&I!FQ0wC*%V+)|PRUAYk0?rkCFDKq{*(-5d4~A}Pe% z#4S_@CoffvT1%<;6JpGckFluH#C#Q4aUPAj!|$OexI(!z$xACZ^UtDt@l48 zB%!mw)(q$>+?J@u^%{=d)i&^b;$ZEC1=J3!7QHpgGK3U^aNx@{J^2Nsam^IkVM;t* z#A|RKTLsMH5}jC(H?hZG2*oC~|7LxOqy$`|2kv|M^8r2G8Tz}yiQ?3*tEaF%INW0i zYaKgOnKCuUv#gc!iCO?wdL}5w4jKsCzBH}mIsyr+h|ZevAAfb0kKk%85eL$o-q(xz zPcDw;b%}c|@m^d1+wY3M5ZaD~KleYt!>k>__BGHhHF74y{J&rRHTgn0fS0Cy)t#$} zc_BJwGixHt$u%w9iy9iQ)D~aX!?A9NR2BATOA~Oa%54#p74{MR)q~h8SIXFstzI|Q z_&yKW4^po4vn|9-0ixjE+F&afv&1d;^>HMB>)y-O9(@7zJ{Lx(rf2HRjxk#5r{e1M zLy7(l&@?3UO6wtTpL#( zKf*&hq(V&Nn=oT$dxw zYnqIVK)+f4>5f>odiYl?6F z%pb}4+iCmA<;kJ_(QOs~FP08WSi!TxV4;CIagw2FyTYt)wgQaeVpt3N#X%=sS#T`bv;H$bU2AO>ZZN*O zLRXOGv3!J~i2#+KR_m@P(tZd zg36;ls(tvdh?jy=AqjiyrIdjD>y!AKrL zVoS8Z+UuSyFy4kj)W_Q2B>fG;i-*8a$k08e$2`+P69w2dKScai<`J9n0}BF_P@K|a z-{;mY`f+Y%=4h8oXm&wMYc&#lKQx_B^kzWDGpYR%q)1|lQI?s-57i6^-o?h;&3|{l zN?<+0D-goVuF3`s%pFTA;c(D*I|9y~c`%5U4UxU&a{?`fw71&OL zBS(Ht8W*V^HJoLEM`pLJdjpwmokj!4OSdG+MVifcjC)sMPRF@?A2g6_GjneW_d$}S zV~N9dfeF9k(E7$)yW^SL%i(Jn1f1_g77Q6+V*T8kK-cD0YZcTsoCDXwEm|sKB=XlGt?_;E zGCP8YdOh;T-i=Ef|8orhu)9s}Aen~4wI>IFw`XclX?FeepoW=CYg3cNIfL1GW&hpr zBU5MLRP>^zY72!hY)6JdyXC_`@?)~zGoVpAZU#vDUpJuu3fw{PI5RstZDpy4IVEIX z6#EHaZgx4e1x%QTpkVa85o5+ka;K9Aix>S7iV?5L%GC_5^}WDoN-!Z?RM8%gAzs;q zgV`HP35F!oe{KPkuYEJm?*(jQ$%e0A#dO@e-2Do& zFbm-kXl?7=R~1F(DQ7GN9{iUUTVa=wiwVh94Th(nCG$PlVuS*G~JP4m%^>S}*S~G#_LEYX9d3 zfWCkBgy9uCIiAR9f1=7Sy7REwPpoAslp|odbm6y$mVc9lomBx=_%j#rpMg8EK_I-} z`SvjL>mX2}xkB&%_dvxO*u-z$@<)1iXalY4{`#}*2Bt@$hFrg3upL=NA4%<$7M%H% z`=z64+piZp3;}0470WrkXPRl_P>sEB*X33wYo`IKRr~*|LBqF*Fo(LIkTzSU%xBms zU;hy8y(7!_WMEUMi{CNyuTeByglvIm_bpA#nF+QKi^Yd;bN`1nKk(?J3<$L6+YP02 z%mmsg0rW!jsi(X@32(aj1xVHgDQ^K+ht~c;W9a7fK(bia@}K=xg!&hkO5mdv*LE>g zmTRZ10-iww>!VM6%wXJF4Qxq+TV6kb7!d{Gv*z>MJio=a+ye)0V;D@7bnNg!lbsL; zw%>Ro#0+s2@F>gurL9)1s#ZeXUJ(4^#oX-{D7Bz3-E&1P!)C}i4RhaB!|blvYJj1I zr+wJV+_{ATWa8yNmgQt-#wpOdVlsCdbLUPFmj2HMlHy$wW~GyImK_Q9hsqG#=N47i zaWIpLQ@3d)NLSc1 zgs72OkoIatqDMHemXvo`{h9f{P?<6d5f+L1vSM-a6Nq^JUv+W75^?MoNTFX=RaI3< zldcK>CT1uHAD9H&oK)hunbk@jRB@Jhaae$vAwU!0@40grGc#Ap8OW`ZIlK5{`Z`I6 zc6t@t}%9J-4Lw42>Y;Ly~>2BC~Iy}CQ{c=y^Y zO}lei`w#GcGJ8ao!Nj#y;f_d$P1O?HJgnDg&YYA_xsVh8QY$9y%nzKbjW_8ysFIgG zW`nBBJw3>@*(iwdL%#Ig{g_lHV=Ffj5C?3jdzQ(?1PyXc%XB0rymvcFW?r-g5@T0q zNn>I#NdpmqE*^ML6jxn0_?=Ag&%m*lYrd1iVKreJs)*}XEss?c;YgO`q&l`Jx`x9Tz z6^&%PeC9ven#srCY!;Hp7+E9>{(>kSi|>;l;l_6dREe1%KmhtCw7>|kJ9SK*=djidQI^!pFaJFQ0nE_3^v2bfAkRn z&Vz}=ugG!cf>eCPKE>6{g2F`xaCgUIqxuTAhoTRr_!}0)B?R!fGE_YB6B!xu!K_IG zb?IT3i+sD^naAvwW0YEYBs5M*&${i0mrQpj`+tuyN_o@Kg@{=QaMd{X><7zu(QBxC zEOx6gjEg0JL)45^*~Z-6Whhc{u6--h*2uu+hZg_;bBm)R$}VeoJ3!sX-LjYf?=CpG z2)B3fzVt&I>&SN7iP;zhbdg&$nu@2y${}Vxq|bfSC*5kN-4L*rj#9YOZG#u2Ji60A z+te!7lP<1gRPqIN&Xc}iA;vd5GjrI*5OTvlPgkfa$jgWhGo5UsBy_lWIR0BlHPaRJGZoy*i#w1sU|cs zFFUu(n>9!?W=_PF)JL5CWC`DgDH+gWAgPsuk!EEol9L}~<_waoC&0QZ9v(1?(em9( zClGB&7{?f-Nk`e~CS7uPW?FaY1+BdL&)Jt5IkS5$)Bu|D0Q$A<#yQ`vP&+%pgnY4D zCTWEUU=GdHS2Wvw%rmw5uxR?RY`JFV;(;Yb|2M~)32PuSD(hh{3T`4|iMx;idEVLz z*j{dtL%r>Rlg99p{<+WW!PxIHV)xhhuh!e+semY_4T^88Udr|5@_%=$YT|a>qQ4I* zh_WDg+chcLW|VHPbYeY7>~DWm0rbEeT~VExeKW)X`(`LMuGn7jE|hRng%@#PUXB1! z_yaE+_19cJRFCy=csk%TI(BGMh~`2pr27A}1~|J3%%?KC)&Vt!d}F&32=4rs_&f;i zd^jq_jGR6BK#pxgq2sqRGrH*pCn~UzG>Hr;oR;NRuqVod+mWQmrovXowetxqeFkD} zsTS1c4vDr4`Z46-IMr5kCM|FYiF${@DQq^%Gjr3*ldqP+C|Vnj4m_O-e8+W3E!2TZ zy_IdB!O)Nd*`Fz8N@|SR*=!#lpsY_H>{uau*&&i%IdNe{*^r4eK-%$D&df)@6MIb|qh^6~|wW6Z`gdk}byJA{OH$i85@3pDcnb*lW{Y_G3NZ|WfG^*v zxWevrfq=JI(*$Q`7hcf@FGm=t;p|Lgq?b8raw?GK^Xk)U)G^0Li$N}?(iyyy+MSri zes>Xa_`ST9E010~rcPZN>4sK-nx>ao;jO*F#E}M*F^{Z<@!+kwm>ne~tYS{ZmHU7rcm!*PSq5B*IoH~1zPY}cQgS-JDpvM zYa?U*R#m+#lY&)c+;m!gMOj5Q#%_6d6;U#LCS~j$~r}Ab0 z4QCoTtG~lC(UQ8bffzSem_0|EpRNphX|IXFeV(crxF7DyiKH7J)MTXJJSE+;I;8pI ztz|%Q37szIC>N`d-u)Z5Kam{8-3~jd8NPgA@^U`)WuH~4|8xnGZIf_qH)f)GH05igK=vrByoXAZ#q=&hPPMZ)i_N+N!p`#!$P3yW~0 zQ4cxan4*N?N$k7sBId}mOOd7kads_s`A!<(e9y`X{pFMs7PDpR+2Hh?>0rrk>~65y zGfGo@;84-OxDM6ha-&0Zj(l;tdUp;n`*Nhs*yoogB&#fotrH0c7=^*Zg)^jmaaq`o z1&z)#iH=E9SY@n5HXb8l|7`|d-1-uIElcrDNHQZQ<0%pS3Rx?BR|@8koifjKMm8^) z8y?zT+<#`vkBj(ofX-u^Ho}+REREb5G4Gj0S28y2&-4nT&N-9!k+ij z*LsY7RTvM2BaQ4`Bh4c_gzLU71#AwYIv5GpHPPlHpE;xw2zun2fwzmekNpls=TDBt zysYLGb3-1VAX>^}hBjS|#4;-Sp5FBqF7o%bR0*zedEz)MG~ib9hai6=Yz zkn~QZMW$gnKkRa_!>@_`>p;uU-2mwZr*l+?zRf&04hc9Z9uy4UK($2_sZ0p!|99}Dj=sUXfl!O;nO2+qDkW}G#Txp+(J8kIH zHk(B3L&sW-O+vX_Fp5#KeVm;3s-qL5*-2}$e34hJ0BWgu&*B)S$%CA;OZ%nrZ1q@- zU_KRjdzNv+`YlI*B-s_S9u#8#3-Hh`TecL5tW+jxw2KuNfhWVcXI@ss=sosMiIdrv(Oj+`RP@C$V- zR0+K8q|(EtDlU<582?gLe5X_^Vw8ky(eMK3*lxyH=!-mRvR5m~(3Bjx4-Dn2^t&@! z$uRSm_&1WvX5o=lZZKI3f9GXhxXKO}*+p;0po(gr$B$r{ahLh}674)q$dTR{8gWb5>lP=^A#|8!y#I+l*||TY7Tzn<~*PzXR!5jVU-~>qFRr z9#?1SMZOH^N78Xb??X?B@b6Aq4P-)M^A&Y&e^y()z_?|Sf`!#`bvvy6c*kWXtrh{G z^sVr7UWR?q*D>0&>adw5ik#`#LYQVrj-LEnSIgXMN}WeZOTb+-{tZ74Mh<*(`+k!DZp7p#&>KE5~4 zZuAqch+@#lxGDV;)o&N}ouI1#IFcik6hZq%n7 z+L+8h(ku%aRd-~WG|FUu zc5)otb;|^a6!yG2nepVa;a`#{CX_d&8D;ARYGJa4u~zbCk;Jtl3r5#}bndzuQ1Jh= zcm#UkKX7Dn%iwm@{fUXO-OUdl8vT~2o>rkGYwX0s#AL<;GaP#4d~SXS!@{PR{zhs! zM*|Tjd)mo)nTRXzfH*n}JGPvoH-wJ(!49X*8;1CIfe`aA+>{?@C6bGFox>UlT%wI% z)MTI~rdF|vtkPhay!Qdl#Dtf?1QII9S7tiDR0P}(d^WjmIl93Z21&3_r)YpFKJO+3 zl20h_`)eF2zA5i4K-}ae`5fTgglm02v_P=vnstE4S=++D{6y&Wg{Oe_M zd;DA)yF6)WZC9Iw{sQvWdTg5AxWEvn=CISSS*VX!gb#CRBf1Daj}LyL)YY7EOlS-kP>XvW;=&@hQTzY+1XdBbs_MrDqTGC>r&s)Wt9rfe-mCq~x2J2@_)%&2^|M)fu<`1ii`-ir>1R8!0Ad_8#<#kLh zGfdk7md0+88khHLD+BtqJXXARdB5$a05z8D0Z_=bfGNGwYjX@(K{BS6S<623`V|1w zUSHwTGW?hy0~6|aORUVYugl8xY=_mvTKE3_!k1MuOL3194%%)6Rzdjb)t8tM3aO<7 zy%rDu;Pb~txHzyI9~{4Rb@^?djeuz*3S<8fuf<>jev{c1%!&cXnf&|#`-jVZT$G;& z$PvoVgFt|`)AUpSZU+XMG0Hk9e@#5E*rxqwQR)e zU#x%4ax&CWdimXW$k_Q$F9Z0wHH`lfw^lxdh@RuVgDD>e+*#QDCE+jXpaIxg04g@c z8ul!|-Qx>x7g(xAFUOC8%w+$>#02i)kV2e(osak5e%8lZ_I&R89+q5w0Q6&?)~ftR z!a&m~^g2M3tW{w8a?9obqzBUT4F35J0O@?F;~Jv;<$qB3hsa!j$ULVw4l)tB418yC z(IRO%v^>BOw!Njyb!GYOnN0vmWo2jn3T4GVL}my~vWHlPE^iw zIwm+)v4h#W>`m=Zz(1_AX?*bz^Q)NZzhXl4Jpj7!YR7F%^o7{ppoMQa`>*$ZR*q(| zNL8*cYujH41OJX4F+7}g$o7h}ostp^#@>7Tq@f-!_cm_ui1*mh!>7StQRs(@1N`MSOu^Cz$fuy^9DJNH)pmvJc>;Z z<>I)&aaL|y^`(u8m$v9hJ8jK%7Rw#V8P0QRdY3QX!Ex{u``0XVO54th2ig)E?i}z` zg_oh~izvacg56FQIdZUF8IPr&o)4DS#1$v^=t?1XakA&Uy3Ti7bywL4#UFe9YKtqp zbC$Y982WPDeuL*^Mf8*Bf))A|IyE<{{F4fe()2cv6l3MI>=SbeTZfKGN>uExD2W$% zQ;}VvrIalLtDZx>Js#`h@#R9yrQ}P`?az3ePc`2#?)OFnx#P0$jalQh;&-+@zXyxt zk=~WU#TJ|)z1x1ru!h@F84kgS2f3!DqC{S;!)uQP8f?-F3RGM##1>D02f4YVvf1|X zdY*Y?;UK6=fGv_9J@gY9+L>K1zvrO9w)@fdYX(Ay{BP8FXRKK!u6ucCIMF`wb99KD zAlq;8bZ42(a1IuF=s>%5LnP#(OMoNk!_@XD3%1_4@(E!@@us9Ow14y0$xn0N3BsM# zMylWau#Nkb(g2ZE?ahxloHzlK2G?9LmYdEnc5uZ4ezt)h7>qTA_0JvA6t=(D(8EYW z?a$y9ER+#rzPi#(-J?sJC-sWZ$E2D<^Ji}a<8H|4bQ1YqDl7KvoSo2Ye0BV6s-PK* z)idsr6H%yLfhxVXRCvHM_*dXoQ|F zLRDNTiM^I@PoK^i@$fwUll^VoxLy4d4am}Q$&8)-OS&7{Wj+oo-ha(M^pq<=ADx)` zEjaZK=G~~m;r6d@E?U*U$x5G~i7V|G;6HZ%*8cPT!<(Y^r`b&C?H6QwzglUb_nwLC z8`iL^@+^zT=cRc}Kaa6&n!Hi}!WoOwuTiJi+z^jdJl|CKbeEvM`-gW+vgT6Vi+1Do zG?c8upojo3!t`{-TegD*LW#V zzNTBQ>yDz6^3Z4P>n>5a9=`qZuFnMy_e*5woZnk?HC)aq(s#o);{Pp4{FZ@8sI zQQ%D7R>Yz4uI%i6pUICXSH5=2cojul*O*~7xr3fS^-MSV?dKSeB(RTMJc22~_dPv! zW_nZ4F|qxqgWGOj7Hjk8RHrL8;P)iJL>t!#36NN?tw|K$+*DkHEh#^? zrdR37M~J2WNH`A%1ega}7d+jZy?qoFn^{=d*jI6Ia+~k)wfFLNMtGdvao)?$$r=35 zWQPyJ(|iZwf{VSKk2fETaa7 zoOidkS-%-PviGq&?{nS_;V9>2?_lp`?_pA8@BD(t-Sx3!6{?Q^G=?qE7xz{4v&bs hANM-1q_nKOvfU{{xu1b@%`P literal 0 HcmV?d00001 From 47284831880de010571d680c71d4ca48453de813 Mon Sep 17 00:00:00 2001 From: dob205 Date: Wed, 10 Nov 2021 10:01:37 +0100 Subject: [PATCH 043/159] Updating the CMakeLists.txt to create macOS app bundles Changes the CMakeLists.txt to enable the creation of macOS app bundles via cmake --build build --target install including all necessary dylibs for a functioning macOS compile. --- src/CMakeLists.txt | 70 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 49025d4dd..db085ceec 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,15 +9,32 @@ # CMake build script. # # Authors: David Hrdlička, +# dob205 # # Copyright 2020,2021 David Hrdlička. +# Copyright 2021 dob205. # -# WIN32 marks us as a GUI app on Windows -add_executable(86Box WIN32 86box.c config.c random.c timer.c io.c acpi.c apm.c - dma.c ddma.c nmi.c pic.c pit.c port_92.c ppi.c pci.c mca.c usb.c - device.c nvr.c nvr_at.c nvr_ps2.c) +# Prepare the macOS app bundle icon depending on the release channel +if(RELEASE_BUILD) + set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/mac/icons/release/86Box.icns) +elseif(BETA_BUILD) + set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/mac/icons/beta/86Box.icns) +elseif(ALPHA_BUILD) + set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/mac/icons/dev/86Box.icns) +else() + set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/mac/icons/branch/86Box.icns) +endif() +set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources") + +# WIN32 marks us as a GUI app on Windows +# MACOSX_BUNDLE prepares a macOS application bundle including with the app icon +add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c random.c timer.c io.c acpi.c apm.c + dma.c ddma.c nmi.c pic.c pit.c port_92.c ppi.c pci.c mca.c usb.c + device.c nvr.c nvr_at.c nvr_ps2.c ${APP_ICON_MACOSX}) + if(NEW_DYNAREC) add_compile_definitions(USE_NEW_DYNAREC) endif() @@ -36,6 +53,7 @@ endif() if(DEV_BRANCH) add_compile_definitions(DEV_BRANCH) + set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/mac/icons/branch/86Box.icns) endif() if(VNC) @@ -63,13 +81,41 @@ if(MINGW) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".dll.a") endif() +#some macOS specific configuration steps if(APPLE) - # Force using the newest library if it's installed by homebrew - set(CMAKE_FIND_FRAMEWORK LAST) + # Force using the newest library if it's installed by homebrew + set(CMAKE_FIND_FRAMEWORK LAST) + + # prepare stuff for macOS app bundles + set(CMAKE_MACOSX_BUNDLE 1) + + # setting our compilation target to macOS Mojave (macOS version 10.14), can be eventually changed to macOS 10.13 High Sierra + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14") + + # set the Info.plist properly + set_target_properties(86Box PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/mac/Info.plist.in) + set(MACOSX_BUNDLE_GUI_IDENTIFIER net.86Box.86Box) + set(MACOSX_BUNDLE_BUNDLE_NAME 86Box) + set(MACOSX_BUNDLE_BUNDLE_VERSION 3.0) + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "3.0") + set(MACOSX_BUNDLE_LONG_VERSION_STRING "3.0.0") + set(MACOSX_BUNDLE_ICON_FILE 86Box.icns) + set(MACOSX_BUNDLE_INFO_STRING "A emulator of old computers") + set(MACOSX_BUNDLE_COPYRIGHT "© 2007-2021 Sarah Walker, Miran Grča, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others") + + + # preparing the code signing for easier distribution, Apple dev certificate needed at one point + #set(XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "YES") + #set(XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "-") + #set(XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/mac/codesign/dev/app.entitlements) + endif() find_package(Freetype REQUIRED) include_directories(${FREETYPE_INCLUDE_DIRS}) +if(APPLE) + target_link_libraries(86Box Freetype::Freetype) # bundles freetype for the macOS app bundle +endif() find_package(OpenAL REQUIRED) include_directories(${OPENAL_INCLUDE_DIR}) @@ -120,6 +166,18 @@ if(MINITRACE) endif() install(TARGETS 86Box) + + +# adjustments for macOS app bundles +if(APPLE) + set(APPS ${CMAKE_CURRENT_BINARY_DIR}/86Box.app) + install(CODE " + include(InstallRequiredSystemLibraries) + include(BundleUtilities) + fixup_bundle(\"${APPS}\" \"\" \"\")" + COMPONENT Runtime) +endif() + if(VCPKG_TOOLCHAIN) x_vcpkg_install_local_dependencies(TARGETS 86Box DESTINATION "bin") endif() From 9f78c37f37517b7e1f0fac44a7fec1814fcb5cb2 Mon Sep 17 00:00:00 2001 From: dob205 Date: Wed, 10 Nov 2021 10:26:00 +0100 Subject: [PATCH 044/159] Tweaking things to fix potential compile errors Should hopefully make GitHub Actions happy --- src/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index db085ceec..d09b4ed34 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -53,7 +53,6 @@ endif() if(DEV_BRANCH) add_compile_definitions(DEV_BRANCH) - set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/mac/icons/branch/86Box.icns) endif() if(VNC) @@ -170,6 +169,10 @@ install(TARGETS 86Box) # adjustments for macOS app bundles if(APPLE) + install(TARGETS 86Box + BUNDLE DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION bin COMPONENT Runtime + ) set(APPS ${CMAKE_CURRENT_BINARY_DIR}/86Box.app) install(CODE " include(InstallRequiredSystemLibraries) From 99097d5555aa1d591300049658a879f39dd6ac0f Mon Sep 17 00:00:00 2001 From: dob205 Date: Wed, 10 Nov 2021 10:40:51 +0100 Subject: [PATCH 045/159] Adjusting the install command This change should hopefully make the GitHub Actions instance happy for CMake. --- src/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d09b4ed34..8d2ba286f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -164,7 +164,11 @@ if(MINITRACE) target_link_libraries(86Box minitrace) endif() -install(TARGETS 86Box) +if(APPLE) + install(TARGETS 86Box DESTINATION "bin") +else() + install(TARGETS 86Box) +endif() # adjustments for macOS app bundles From 23b01383e07062a3182b7f5a46bd39544d117ae0 Mon Sep 17 00:00:00 2001 From: dob205 Date: Wed, 10 Nov 2021 11:13:10 +0100 Subject: [PATCH 046/159] Fixing compiling with normal user permissions This should enable compiling things on macOS without resorting to use sudo before cmake --build build --target install. --- src/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8d2ba286f..3e82eabe0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -173,10 +173,6 @@ endif() # adjustments for macOS app bundles if(APPLE) - install(TARGETS 86Box - BUNDLE DESTINATION . COMPONENT Runtime - RUNTIME DESTINATION bin COMPONENT Runtime - ) set(APPS ${CMAKE_CURRENT_BINARY_DIR}/86Box.app) install(CODE " include(InstallRequiredSystemLibraries) From 38feb548ba88ba3e4d615f8002be6037e691970a Mon Sep 17 00:00:00 2001 From: mariuszkurek Date: Wed, 10 Nov 2021 14:38:16 +0100 Subject: [PATCH 047/159] Fix build on case-sensitive filesystems --- src/mac/icons/branch/{86box.icns => 86Box.icns} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename src/mac/icons/branch/{86box.icns => 86Box.icns} (100%) diff --git a/src/mac/icons/branch/86box.icns b/src/mac/icons/branch/86Box.icns similarity index 100% rename from src/mac/icons/branch/86box.icns rename to src/mac/icons/branch/86Box.icns From 485403ac65c70a9baf8324feae0472117fd112a9 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 10 Nov 2021 15:37:12 -0300 Subject: [PATCH 048/159] Fix TGUI DDC read bug --- src/video/vid_tgui9440.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 6c4faf170..04ff8b1d5 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -606,15 +606,17 @@ tgui_in(uint16_t addr, void *p) return svga->crtcreg; case 0x3D5: temp = svga->crtc[svga->crtcreg]; - if (!(svga->crtc[0x37] & 0x04)) { - temp &= 0xfd; - if (i2c_gpio_get_scl(tgui->i2c)) - temp |= 0x02; - } - if (!(svga->crtc[0x37] & 0x08)) { - temp &= 0xfe; - if (i2c_gpio_get_sda(tgui->i2c)) - temp |= 0x01; + if (svga->crtcreg == 0x37) { + if (!(temp & 0x04)) { + temp &= ~0x02; + if (i2c_gpio_get_scl(tgui->i2c)) + temp |= 0x02; + } + if (!(temp & 0x08)) { + temp &= ~0x01; + if (i2c_gpio_get_sda(tgui->i2c)) + temp |= 0x01; + } } return temp; case 0x3d8: From ab0a8fa4f864a3a3064361d10b984262a904ca1b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 10 Nov 2021 15:40:19 -0300 Subject: [PATCH 049/159] Rename .jenkins to a more generic .ci --- {.jenkins => .ci}/Jenkinsfile | 4 ++-- {.jenkins => .ci}/build.sh | 12 ++++++------ {.jenkins => .ci}/static2dll.sh | 0 3 files changed, 8 insertions(+), 8 deletions(-) rename {.jenkins => .ci}/Jenkinsfile (93%) rename {.jenkins => .ci}/build.sh (98%) rename {.jenkins => .ci}/static2dll.sh (100%) diff --git a/.jenkins/Jenkinsfile b/.ci/Jenkinsfile similarity index 93% rename from .jenkins/Jenkinsfile rename to .ci/Jenkinsfile index a1b24438d..106fdfffd 100644 --- a/.jenkins/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -23,11 +23,11 @@ def gitClone() { } def windowsBuild() { - bat 'C:\\msys64\\msys2_shell.cmd -msys2 -defterm -here -no-start -c "exec .jenkins/build.sh"' + bat 'C:\\msys64\\msys2_shell.cmd -msys2 -defterm -here -no-start -c "exec .ci/build.sh"' } def unixBuild() { - sh 'chmod u+x .jenkins/build.sh && .jenkins/build.sh' + sh 'chmod u+x .ci/build.sh && .ci/build.sh' } def saveArtifacts() { diff --git a/.jenkins/build.sh b/.ci/build.sh similarity index 98% rename from .jenkins/build.sh rename to .ci/build.sh index db71e3e98..ddd90d6b8 100644 --- a/.jenkins/build.sh +++ b/.ci/build.sh @@ -259,7 +259,7 @@ EOF [ "$arch" = "32" -a -d "/c/Program Files (x86)" ] && pf="/c/Program Files (x86)" # Archive freetype from local MSYS installation. - ./.jenkins/static2dll.sh -p freetype2 /$MSYSTEM/lib/libfreetype.a archive_tmp/libfreetype-6.dll + .ci/static2dll.sh -p freetype2 /$MSYSTEM/lib/libfreetype.a archive_tmp/libfreetype-6.dll # Archive Ghostscript DLL from local official distribution installation. for gs in "$pf"/gs/gs*.*.* @@ -268,9 +268,9 @@ EOF done # Archive Discord Game SDK DLL from their CDN. - discordarch= - [ "$arch" = "32" ] && discordarch=x86 - [ "$arch" = "64" ] && discordarch=x86_64 + local discordarch= + [ "$arch" = "32" ] && local discordarch=x86 + [ "$arch" = "64" ] && local discordarch=x86_64 if [ ! -z "$discordarch" ] then [ ! -e "discord_game_sdk.zip" ] && wget -qOdiscord_game_sdk.zip https://dl-game-sdk.discordapp.net/2.5.6/discord_game_sdk.zip @@ -282,7 +282,7 @@ EOF # Archive executable. mv "$build_dir"/src/$project.exe archive_tmp/ - status=$? + local status=$? elif is_mac then # TBD @@ -301,7 +301,7 @@ EOF # Archive executable. mv "$build_dir"/src/$project archive_tmp/ - status=$? + local status=$? fi # Check if the executable move succeeded. diff --git a/.jenkins/static2dll.sh b/.ci/static2dll.sh similarity index 100% rename from .jenkins/static2dll.sh rename to .ci/static2dll.sh From d65cfe1f502483e97ab0c2981ea9c8bf90365c23 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 10 Nov 2021 19:03:13 -0300 Subject: [PATCH 050/159] Machine fixes, renames and such --- src/config.c | 8 ++++ src/include/86box/machine.h | 22 ++++----- src/machine/m_at_slot1.c | 6 +-- src/machine/m_at_socket370.c | 6 +-- src/machine/m_at_socket4_5.c | 65 ------------------------- src/machine/m_at_socket7.c | 92 +++++++++++++++++++++++++++++------- src/machine/m_at_socket8.c | 2 +- src/machine/machine_table.c | 26 +++++----- 8 files changed, 115 insertions(+), 112 deletions(-) diff --git a/src/config.c b/src/config.c index 7323b6a81..ce6b1a33c 100644 --- a/src/config.c +++ b/src/config.c @@ -638,6 +638,14 @@ load_machine(void) machine = machine_get_machine_from_internal_name("m30015"); else if (! strcmp(p, "cbm_sl386sx25")) machine = machine_get_machine_from_internal_name("cmdsl386sx25"); + else if (! strcmp(p, "mr586")) + machine = machine_get_machine_from_internal_name("p54tp4xe_mr"); + else if (! strcmp(p, "pcv240")) + machine = machine_get_machine_from_internal_name("pcv90"); + else if (! strcmp(p, "tsunamiatx")) + machine = machine_get_machine_from_internal_name("s1846"); + else if (! strcmp(p, "trinity371")) + machine = machine_get_machine_from_internal_name("s1857"); else if (! strcmp(p, "award386dx")) /* ...merged machines... */ machine = machine_get_machine_from_internal_name("award486"); else if (! strcmp(p, "ami386dx")) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 50cedccca..f87dc277b 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -404,12 +404,10 @@ extern int machine_at_plato_init(const machine_t *); extern int machine_at_ambradp90_init(const machine_t *); extern int machine_at_430nx_init(const machine_t *); -extern int machine_at_p54tp4xe_init(const machine_t *); extern int machine_at_endeavor_init(const machine_t *); extern int machine_at_zappa_init(const machine_t *); extern int machine_at_mb500n_init(const machine_t *); extern int machine_at_apollo_init(const machine_t *); -extern int machine_at_vectra54_init(const machine_t *); extern int machine_at_powermatev_init(const machine_t *); extern int machine_at_acerv30_init(const machine_t *); @@ -421,7 +419,6 @@ extern int machine_at_hot539_init(const machine_t *); #ifdef EMU_DEVICE_H extern const device_t *at_endeavor_get_device(void); -#define at_vectra54_get_device at_endeavor_get_device extern const device_t *at_pb520r_get_device(void); extern const device_t *at_thor_get_device(void); #endif @@ -430,7 +427,8 @@ extern const device_t *at_thor_get_device(void); extern int machine_at_ap5s_init(const machine_t *); extern int machine_at_chariot_init(const machine_t *); -extern int machine_at_mr586_init(const machine_t *); +extern int machine_at_p54tp4xe_init(const machine_t *); +extern int machine_at_p54tp4xe_mr_init(const machine_t *); extern int machine_at_thor_init(const machine_t *); extern int machine_at_gw2katx_init(const machine_t *); extern int machine_at_mrthor_init(const machine_t *); @@ -445,7 +443,7 @@ extern int machine_at_8500tuc_init(const machine_t *); extern int machine_at_m7shi_init(const machine_t *); extern int machine_at_tc430hx_init(const machine_t *); extern int machine_at_equium5200_init(const machine_t *); -extern int machine_at_pcv240_init(const machine_t *); +extern int machine_at_pcv90_init(const machine_t *); extern int machine_at_p65up5_cp55t2d_init(const machine_t *); extern int machine_at_mb520n_init(const machine_t *); @@ -478,12 +476,14 @@ extern int machine_at_ms5164_init(const machine_t *); #endif extern int machine_at_ficva502_init(const machine_t *); - extern int machine_at_ficpa2012_init(const machine_t *); +extern int machine_at_vectra54_init(const machine_t *); + #ifdef EMU_DEVICE_H extern const device_t *at_thor_get_device(void); extern const device_t *at_pb640_get_device(void); +#define at_vectra54_get_device at_endeavor_get_device #endif /* m_at_super7_ss7.c */ @@ -501,7 +501,7 @@ extern int machine_at_v60n_init(const machine_t *); extern int machine_at_vs440fx_init(const machine_t *); extern int machine_at_ap440fx_init(const machine_t *); extern int machine_at_mb600n_init(const machine_t *); -extern int machine_at_8500ttc_init(const machine_t *); +extern int machine_at_8600ttc_init(const machine_t *); extern int machine_at_m6mi_init(const machine_t *); #ifdef EMU_DEVICE_H extern void machine_at_p65up5_common_init(const machine_t *, const device_t *northbridge); @@ -523,7 +523,7 @@ extern int machine_at_bf6_init(const machine_t *); extern int machine_at_ax6bc_init(const machine_t *); extern int machine_at_atc6310bxii_init(const machine_t *); extern int machine_at_686bx_init(const machine_t *); -extern int machine_at_tsunamiatx_init(const machine_t *); +extern int machine_at_s1846_init(const machine_t *); extern int machine_at_p6sba_init(const machine_t *); #if defined(DEV_BRANCH) && defined(NO_SIO) extern int machine_at_ergox365_init(const machine_t *); @@ -538,7 +538,7 @@ extern int machine_at_borapro_init(const machine_t *); extern int machine_at_ms6168_init(const machine_t *); #ifdef EMU_DEVICE_H -extern const device_t *at_tsunamiatx_get_device(void); +extern const device_t *at_s1846_get_device(void); #endif /* m_at_slot2.c */ @@ -553,13 +553,13 @@ extern int machine_at_cubx_init(const machine_t *); extern int machine_at_atc7020bxii_init(const machine_t *); extern int machine_at_ambx133_init(const machine_t *); extern int machine_at_awo671r_init(const machine_t *); -extern int machine_at_63a_init(const machine_t *); +extern int machine_at_63a1_init(const machine_t *); extern int machine_at_s370sba_init(const machine_t *); extern int machine_at_apas3_init(const machine_t *); extern int machine_at_gt694va_init(const machine_t *); extern int machine_at_cuv4xls_init(const machine_t *); extern int machine_at_6via90ap_init(const machine_t *); -extern int machine_at_trinity371_init(const machine_t *); +extern int machine_at_s1857_init(const machine_t *); extern int machine_at_p6bap_init(const machine_t *); /* m_at_misc.c */ diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index c69226ebc..050ea233c 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -444,11 +444,11 @@ machine_at_p6sba_init(const machine_t *model) int -machine_at_tsunamiatx_init(const machine_t *model) +machine_at_s1846_init(const machine_t *model) { int ret; - ret = bios_load_linear("roms/machines/tsunamiatx/bx46200f.rom", + ret = bios_load_linear("roms/machines/s1846/bx46200f.rom", 0x000c0000, 262144, 0); if (bios_only || !ret) @@ -484,7 +484,7 @@ machine_at_tsunamiatx_init(const machine_t *model) const device_t * -at_tsunamiatx_get_device(void) +at_s1846_get_device(void) { return &es1371_onboard_device; } diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 4d8b5c5a5..8a2605145 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -76,11 +76,11 @@ machine_at_s370slm_init(const machine_t *model) int -machine_at_trinity371_init(const machine_t *model) +machine_at_s1857_init(const machine_t *model) { int ret; - ret = bios_load_linear("roms/machines/trinity371/BX57200A.ROM", + ret = bios_load_linear("roms/machines/s1857/BX57200A.ROM", 0x000c0000, 262144, 0); if (bios_only || !ret) @@ -278,7 +278,7 @@ machine_at_awo671r_init(const machine_t *model) int -machine_at_63a_init(const machine_t *model) +machine_at_63a1_init(const machine_t *model) { int ret; diff --git a/src/machine/m_at_socket4_5.c b/src/machine/m_at_socket4_5.c index 00dc7274e..c876844ad 100644 --- a/src/machine/m_at_socket4_5.c +++ b/src/machine/m_at_socket4_5.c @@ -468,37 +468,6 @@ machine_at_430nx_init(const machine_t *model) } -int -machine_at_p54tp4xe_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/p54tp4xe/t15i0302.awd", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init(model); - - /* Award BIOS, SMC FDC37C665. */ - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&keyboard_ps2_pci_device); - device_add(&i430fx_device); - device_add(&piix_device); - device_add(&fdc37c665_device); - device_add(&intel_flash_bxt_device); - - return ret; -} - - int machine_at_endeavor_init(const machine_t *model) { @@ -631,40 +600,6 @@ machine_at_apollo_init(const machine_t *model) } -int -machine_at_vectra54_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/vectra54/GT0724.22", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); - - if (gfxcard == VID_INTERNAL) - device_add(&s3_phoenix_trio64_onboard_pci_device); - - device_add(&keyboard_ps2_ami_pci_device); - device_add(&i430fx_device); - device_add(&piix_device); - device_add(&fdc37c931apm_device); - device_add(&sst_flash_29ee010_device); - - return ret; -} - - int machine_at_powermatev_init(const machine_t *model) { diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 2edf96595..967aa024e 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -104,17 +104,10 @@ machine_at_chariot_init(const machine_t *model) return ret; } -int -machine_at_mr586_init(const machine_t *model) + +static void +machine_at_p54tp4xe_common_init(const machine_t *model) { - int ret; - - ret = bios_load_linear("roms/machines/mr586/TRITON.BIO", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); @@ -130,10 +123,43 @@ machine_at_mr586_init(const machine_t *model) device_add(&keyboard_ps2_ami_pci_device); device_add(&fdc37c665_device); device_add(&intel_flash_bxt_device); +} + + +int +machine_at_p54tp4xe_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p54tp4xe/t15i0302.awd", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_p54tp4xe_common_init(model); return ret; } + +int +machine_at_p54tp4xe_mr_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p54tp4xe_mr/TRITON.BIO", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_p54tp4xe_common_init(model); + + return ret; +} + + static void machine_at_thor_common_init(const machine_t *model, int mr) { @@ -531,15 +557,15 @@ machine_at_equium5200_init(const machine_t *model) // Information about that mac } int -machine_at_pcv240_init(const machine_t *model) +machine_at_pcv90_init(const machine_t *model) { int ret; - ret = bios_load_linear_combined2("roms/machines/pcv240/1010DD04.BIO", - "roms/machines/pcv240/1010DD04.BI1", - "roms/machines/pcv240/1010DD04.BI2", - "roms/machines/pcv240/1010DD04.BI3", - "roms/machines/pcv240/1010DD04.RCV", + ret = bios_load_linear_combined2("roms/machines/pcv90/1010DD04.BIO", + "roms/machines/pcv90/1010DD04.BI1", + "roms/machines/pcv90/1010DD04.BI2", + "roms/machines/pcv90/1010DD04.BI3", + "roms/machines/pcv90/1010DD04.RCV", 0x3a000, 128); if (bios_only || !ret) @@ -1312,3 +1338,37 @@ machine_at_ficpa2012_init(const machine_t *model) return ret; } + + +int +machine_at_vectra54_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/vectra54/GT0724.22", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + + if (gfxcard == VID_INTERNAL) + device_add(&s3_phoenix_trio64_onboard_pci_device); + + device_add(&keyboard_ps2_ami_pci_device); + device_add(&i430fx_device); + device_add(&piix_device); + device_add(&fdc37c931apm_device); + device_add(&sst_flash_29ee010_device); + + return ret; +} diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 318e8dfea..659608078 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -228,7 +228,7 @@ machine_at_ap440fx_init(const machine_t *model) } int -machine_at_8500ttc_init(const machine_t *model) +machine_at_8600ttc_init(const machine_t *model) { int ret; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 9dd5db1fa..03a3e01d6 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -268,8 +268,8 @@ const machine_t machines[] = { /* OPTi 596/597 */ { "[OPTi 597] AMI Excalibur VLB", "excalibur", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_VLB | MACHINE_IDE, 2048, 65536, 2048, 127, machine_at_excalibur_init, NULL }, - /* SiS 85C50x */ - { "[SiS 85C50x] ASUS PCI/I-P5SP4", "p5sp4", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p5sp4_init, NULL }, + /* SiS 85C501/503 */ + { "[SiS 501] ASUS PCI/I-P5SP4", "p5sp4", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p5sp4_init, NULL }, /* Socket 5 machines */ /* 430NX */ @@ -280,7 +280,6 @@ const machine_t machines[] = { /* 430FX */ { "[i430FX] Acer V30", "acerv30", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_acerv30_init, NULL }, { "[i430FX] AMI Apollo", "apollo", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_apollo_init, NULL }, - { "[i430FX] HP Vectra VL 5 Series 4", "vectra54", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 511, machine_at_vectra54_init, at_vectra54_get_device }, { "[i430FX] Intel Advanced/ZP", "zappa", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_zappa_init, NULL }, { "[i430FX] NEC PowerMate V", "powermatev", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_powermatev_init, NULL }, { "[i430FX] PC Partner MB500N", "mb500n", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_mb500n_init, NULL }, @@ -292,18 +291,19 @@ const machine_t machines[] = { { "[OPTi 597] Shuttle HOT-543", "hot543", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_hot543_init, NULL }, { "[OPTi 597] Supermicro P54VL-PCI", "p54vl", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 60000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_p54vl_init, NULL }, - /* SiS 85C50x */ - { "[SiS 85C50x] ASUS PCI/I-P54SP4", "p54sp4", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54sp4_init, NULL }, - { "[SiS 85C50x] BCM SQ-588", "sq588", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_PENTIUMMMX), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_sq588_init, NULL }, + /* SiS 85C501/503 */ + { "[SiS 501] ASUS PCI/I-P54SP4", "p54sp4", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54sp4_init, NULL }, + { "[SiS 501] BCM SQ-588", "sq588", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_PENTIUMMMX), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_sq588_init, NULL }, /* UMC 889x */ - { "[UMC 889x] Shuttle HOT-539", "hot539", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3600, 1.5, 2.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 262144, 8192, 127, machine_at_hot539_init, NULL }, + { "[UMC 8890] Shuttle HOT-539", "hot539", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3600, 1.5, 2.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 262144, 8192, 127, machine_at_hot539_init, NULL }, /* Socket 7 (Single Voltage) machines */ /* 430FX */ { "[i430FX] ASUS P/I-P54TP4XE", "p54tp4xe", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3600, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54tp4xe_init, NULL }, - { "[i430FX] ASUS P/I-P54TP4XE (MR BIOS)", "mr586", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3600, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_mr586_init, NULL }, + { "[i430FX] ASUS P/I-P54TP4XE (MR BIOS)", "p54tp4xe_mr", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3600, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54tp4xe_mr_init, NULL }, { "[i430FX] Gateway 2000 Thor", "gw2katx", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_gw2katx_init, NULL }, + { "[i430FX] HP Vectra VL 5 Series 4", "vectra54", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 511, machine_at_vectra54_init, at_vectra54_get_device }, { "[i430FX] Intel Advanced/ATX", "thor", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_thor_init, NULL }, { "[i430FX] Intel Advanced/ATX (MR BIOS)", "mrthor", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_mrthor_init, NULL }, { "[i430FX] Intel Advanced/EV", "endeavor", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_endeavor_init, at_endeavor_get_device }, @@ -329,7 +329,7 @@ const machine_t machines[] = { { "[i430HX] Micronics M7S-Hi", "m7shi", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 511, machine_at_m7shi_init, NULL }, { "[i430HX] Intel TC430HX", "tc430hx", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 255, machine_at_tc430hx_init, NULL }, { "[i430HX] Toshiba Equium 5200D", "equium5200", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 196608, 8192, 127, machine_at_equium5200_init, NULL }, - { "[i430HX] Sony Vaio PCV-240", "pcv240", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 196608, 8192, 127, machine_at_pcv240_init, NULL }, + { "[i430HX] Sony Vaio PCV-90", "pcv90", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 196608, 8192, 127, machine_at_pcv90_init, NULL }, { "[i430HX] ASUS P/I-P65UP5 (C-P55T2D)", "p65up5_cp55t2d", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2500, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_p65up5_cp55t2d_init, NULL }, /* 430VX */ @@ -385,7 +385,7 @@ const machine_t machines[] = { /* 440FX */ { "[i440FX] Acer V60N", "v60n", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 60000000, 66666667, 2500, 3500, 1.5, 8.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_v60n_init, NULL }, { "[i440FX] ASUS P/I-P65UP5 (C-P6ND)", "p65up5_cp6nd", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 60000000, 66666667, 2100, 3500, 1.5, 8.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 127, machine_at_p65up5_cp6nd_init, NULL }, - { "[i440FX] Biostar MB-8600TTC", "8600ttc", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 50000000, 66666667, 2900, 3300, 2.0, 5.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 127, machine_at_8500ttc_init, NULL }, + { "[i440FX] Biostar MB-8600TTC", "8600ttc", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 50000000, 66666667, 2900, 3300, 2.0, 5.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 127, machine_at_8600ttc_init, NULL }, { "[i440FX] Gigabyte GA-686NX", "686nx", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 60000000, 66666667, 2100, 3500, 2.0, 5.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_686nx_init, NULL }, { "[i440FX] Intel AP440FX", "ap440fx", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 60000000, 66666667, 2100, 3500, 2.0, 3.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_ap440fx_init, NULL }, { "[i440FX] Intel VS440FX", "vs440fx", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 60000000, 66666667, 2100, 3500, 2.0, 3.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_vs440fx_init, NULL }, @@ -411,7 +411,7 @@ const machine_t machines[] = { { "[i440BX] AOpen AX6BC", "ax6bc", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 112121212, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_ax6bc_init, NULL }, { "[i440BX] Gigabyte GA-686BX", "686bx", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_686bx_init, NULL }, { "[i440BX] HP Vectra VEi 8", "vei8", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_vei8_init, NULL }, - { "[i440BX] Tyan Tsunami ATX", "tsunamiatx", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 112121212, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SOUND, 8192,1048576, 8192, 255, machine_at_tsunamiatx_init, at_tsunamiatx_get_device }, + { "[i440BX] Tyan Tsunami ATX", "s1846", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 112121212, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SOUND, 8192,1048576, 8192, 255, machine_at_s1846_init, at_s1846_get_device }, { "[i440BX] SuperMicro Super P6SBA", "p6sba", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_p6sba_init, NULL }, #if defined(DEV_BRANCH) && defined(NO_SIO) { "[i440BX] Fujitsu ErgoPro x365", "ergox365", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 393216, 8192, 511, machine_at_ergox365_init, NULL }, @@ -446,10 +446,10 @@ const machine_t machines[] = { { "[i440BX] AEWIN AW-O671R", "awo671r", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, /* limits assumed */ MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_awo671r_init, NULL }, { "[i440BX] ASUS CUBX", "cubx", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_cubx_init, NULL }, { "[i440BX] AmazePC AM-BX133", "ambx133", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, /* limits assumed */ MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_ambx133_init, NULL }, - { "[i440BX] Tyan Trinity 371", "trinity371", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_trinity371_init, NULL }, + { "[i440BX] Tyan Trinity 371", "s1857", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_s1857_init, NULL }, /* 440ZX */ - { "[i440ZX] Soltek SL-63A1", "63a", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_63a_init, NULL }, + { "[i440ZX] Soltek SL-63A1", "63a1", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_63a1_init, NULL }, /* SMSC VictoryBX-66 */ { "[SMSC VictoryBX-66] A-Trend ATC7020BXII","atc7020bxii", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_atc7020bxii_init, NULL }, From 724accd16717697def5bd14499cfbbc337488c3a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 10 Nov 2021 21:14:54 -0300 Subject: [PATCH 051/159] Add AGP GART implementation --- src/chipset/intel_4x0.c | 34 +++++- src/chipset/via_apollo.c | 39 ++++++- src/include/86box/video.h | 6 + src/video/CMakeLists.txt | 2 +- src/video/agpgart.c | 193 +++++++++++++++++++++++++++++++++ src/video/vid_voodoo_banshee.c | 114 +++++++++---------- src/win/Makefile.mingw | 2 +- 7 files changed, 322 insertions(+), 68 deletions(-) create mode 100644 src/video/agpgart.c diff --git a/src/chipset/intel_4x0.c b/src/chipset/intel_4x0.c index 83eabb5e8..327e89b90 100644 --- a/src/chipset/intel_4x0.c +++ b/src/chipset/intel_4x0.c @@ -29,6 +29,7 @@ #include <86box/chipset.h> #include <86box/spd.h> #include <86box/machine.h> +#include <86box/video.h> enum @@ -57,6 +58,7 @@ typedef struct uint8_t regs[256], regs_locked[256]; int type; smram_t *smram_low, *smram_high; + void *agpgart; } i4x0_t; @@ -208,14 +210,25 @@ i4x0_smram_handler_phase1(i4x0_t *dev) static void -i4x0_mask_bar(uint8_t *regs) +i4x0_mask_bar(uint8_t *regs, void *agpgart) { uint32_t bar; + /* Make sure the aperture's base is aligned to its size. */ bar = (regs[0x13] << 24) | (regs[0x12] << 16); bar &= (((uint32_t) regs[0xb4] << 22) | 0xf0000000); regs[0x12] = (bar >> 16) & 0xff; regs[0x13] = (bar >> 24) & 0xff; + + if (!agpgart) + return; + + /* Map aperture and GART. */ + agpgart_set_aperture(agpgart, + bar, + ((uint32_t) (uint8_t) (~regs[0xb4] & 0x3f) + 1) << 22, + !!(regs[0x51] & 0x02)); + agpgart_set_gart(agpgart, (regs[0xb9] << 8) | (regs[0xba] << 16) | (regs[0xbb] << 24)); } @@ -323,7 +336,7 @@ i4x0_write(int func, int addr, uint8_t val, void *priv) case INTEL_440BX: case INTEL_440ZX: case INTEL_440GX: regs[0x12] = (val & 0xc0); - i4x0_mask_bar(regs); + i4x0_mask_bar(regs, dev->agpgart); break; } break; @@ -333,7 +346,7 @@ i4x0_write(int func, int addr, uint8_t val, void *priv) case INTEL_440BX: case INTEL_440ZX: case INTEL_440GX: regs[0x13] = val; - i4x0_mask_bar(regs); + i4x0_mask_bar(regs, dev->agpgart); break; } break; @@ -411,15 +424,19 @@ i4x0_write(int func, int addr, uint8_t val, void *priv) break; case INTEL_440LX: regs[0x51] = (regs[0x51] & 0x40) | (val & 0x87); + i4x0_mask_bar(regs, dev->agpgart); break; case INTEL_440EX: regs[0x51] = (val & 0x86); + i4x0_mask_bar(regs, dev->agpgart); break; case INTEL_440BX: case INTEL_440ZX: regs[0x51] = (regs[0x51] & 0x70) | (val & 0x8f); + i4x0_mask_bar(regs, dev->agpgart); break; case INTEL_440GX: regs[0x51] = (regs[0x51] & 0xb0) | (val & 0x4f); + i4x0_mask_bar(regs, dev->agpgart); break; } break; @@ -1074,7 +1091,7 @@ i4x0_write(int func, int addr, uint8_t val, void *priv) case INTEL_440BX: case INTEL_440ZX: case INTEL_440GX: regs[0xb4] = (val & 0x3f); - i4x0_mask_bar(regs); + i4x0_mask_bar(regs, dev->agpgart); break; } break; @@ -1084,6 +1101,7 @@ i4x0_write(int func, int addr, uint8_t val, void *priv) case INTEL_440BX: case INTEL_440ZX: case INTEL_440GX: regs[0xb9] = (val & 0xf0); + i4x0_mask_bar(regs, dev->agpgart); break; } break; @@ -1094,6 +1112,7 @@ i4x0_write(int func, int addr, uint8_t val, void *priv) case INTEL_440BX: case INTEL_440ZX: case INTEL_440GX: regs[addr] = val; + i4x0_mask_bar(regs, dev->agpgart); break; } break; @@ -1593,10 +1612,13 @@ static void pci_add_card(PCI_ADD_NORTHBRIDGE, i4x0_read, i4x0_write, dev); - if ((dev->type >= INTEL_440BX) && !(regs[0x7a] & 0x02)) + if ((dev->type >= INTEL_440BX) && !(regs[0x7a] & 0x02)) { device_add((dev->type == INTEL_440GX) ? &i440gx_agp_device : &i440bx_agp_device); - else if (dev->type >= INTEL_440LX) + dev->agpgart = device_add(&agpgart_device); + } else if (dev->type >= INTEL_440LX) { device_add(&i440lx_agp_device); + dev->agpgart = device_add(&agpgart_device); + } return dev; } diff --git a/src/chipset/via_apollo.c b/src/chipset/via_apollo.c index e2adf3657..e3475d9b8 100644 --- a/src/chipset/via_apollo.c +++ b/src/chipset/via_apollo.c @@ -33,6 +33,7 @@ #include <86box/pci.h> #include <86box/chipset.h> #include <86box/spd.h> +#include <86box/video.h> #define VIA_585 0x05851000 #define VIA_595 0x05950000 @@ -50,6 +51,7 @@ typedef struct via_apollo_t uint8_t pci_conf[256]; smram_t *smram; + void *agpgart; } via_apollo_t; @@ -86,6 +88,25 @@ apollo_smram_map(via_apollo_t *dev, int smm, uint32_t host_base, uint32_t size, } +static void +apollo_agp_map(via_apollo_t *dev) +{ + /* Make sure the aperture's base is aligned to its size. */ + dev->pci_conf[0x12] &= dev->pci_conf[0x84] << 4; + dev->pci_conf[0x13] &= 0xf0 | (dev->pci_conf[0x84] >> 4); + + if (!dev->agpgart) + return; + + /* Map aperture and GART. */ + agpgart_set_aperture(dev->agpgart, + (dev->pci_conf[0x12] << 16) | (dev->pci_conf[0x13] << 24), + ((uint32_t) (uint8_t) ~dev->pci_conf[0x84] + 1) << 20, + !!(dev->pci_conf[0x88] & 0x02)); + agpgart_set_gart(dev->agpgart, (dev->pci_conf[0x89] << 8) | (dev->pci_conf[0x8a] << 16) | (dev->pci_conf[0x8b] << 24)); +} + + static void via_apollo_setup(via_apollo_t *dev) { @@ -221,6 +242,8 @@ via_apollo_host_bridge_write(int func, int addr, uint8_t val, void *priv) ((addr >= 0xad) && (addr < 0xf0)) || ((addr >= 0xf8) && (addr < 0xfc)) || (addr == 0xfd)) return; + if (((addr == 0x12) || (addr == 0x13)) && (dev->id < VIA_597)) + return; if (((addr == 0x78) || (addr >= 0xad)) && (dev->id == VIA_597)) return; if (((addr == 0x67) || ((addr >= 0xf0) && (addr < 0xfc))) && (dev->id < VIA_691)) @@ -260,9 +283,11 @@ via_apollo_host_bridge_write(int func, int addr, uint8_t val, void *priv) break; case 0x12: /* Graphics Aperture Base */ dev->pci_conf[0x12] = (val & 0xf0); + apollo_agp_map(dev); break; case 0x13: /* Graphics Aperture Base */ dev->pci_conf[0x13] = val; + apollo_agp_map(dev); break; case 0x50: /* Cache Control 1 */ @@ -580,20 +605,23 @@ via_apollo_host_bridge_write(int func, int addr, uint8_t val, void *priv) dev->pci_conf[0x84] = val; else dev->pci_conf[0x84] = (dev->pci_conf[0x84] & ~0xf0) | (val & 0xf0); + apollo_agp_map(dev); break; case 0x88: if((dev->id == VIA_693A) || (dev->id == VIA_8601)) dev->pci_conf[0x88] = (dev->pci_conf[0x88] & ~0x06) | (val & 0x06); else dev->pci_conf[0x88] = (dev->pci_conf[0x88] & ~0x07) | (val & 0x07); + apollo_agp_map(dev); break; case 0x89: + dev->pci_conf[0x89] = val & 0xf0; + apollo_agp_map(dev); + break; case 0x8a: case 0x8b: - if((dev->id == VIA_693A) || (dev->id == VIA_8601)) - dev->pci_conf[addr] = val; - else - dev->pci_conf[0x89] = (dev->pci_conf[0x89] & ~0xf0) | (val & 0xf0); + dev->pci_conf[addr] = val; + apollo_agp_map(dev); break; case 0xa8: @@ -706,6 +734,9 @@ via_apollo_init(const device_t *info) break; } + if (dev->id >= VIA_597) + dev->agpgart = device_add(&agpgart_device); + if ((dev->id >= VIA_694) && (dev->id != VIA_8601)) dev->drb_unit = 16; else if (dev->id >= VIA_597) diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 63f854fb9..263b3ff9b 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -193,6 +193,9 @@ extern void svga_dump_vram(void); extern uint32_t video_color_transform(uint32_t color); +extern void agpgart_set_aperture(void *handle, uint32_t base, uint32_t size, int enable); +extern void agpgart_set_gart(void *handle, uint32_t base); + #ifdef __cplusplus } #endif @@ -426,6 +429,9 @@ extern const device_t velocity_100_agp_device; /* Wyse 700 */ extern const device_t wy700_device; + +/* AGP GART */ +extern const device_t agpgart_device; #endif diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index c8cbdef62..0c3befa62 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -13,7 +13,7 @@ # Copyright 2020,2021 David Hrdlička. # -add_library(vid OBJECT video.c vid_table.c vid_cga.c vid_cga_comp.c +add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c vid_compaq_cga.c vid_mda.c vid_hercules.c vid_herculesplus.c vid_incolor.c vid_colorplus.c vid_genius.c vid_pgc.c vid_im1024.c vid_sigma.c vid_wy700.c vid_ega.c vid_ega_render.c vid_svga.c diff --git a/src/video/agpgart.c b/src/video/agpgart.c new file mode 100644 index 000000000..0bd71fa60 --- /dev/null +++ b/src/video/agpgart.c @@ -0,0 +1,193 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * AGP Graphics Address Remapping Table remapping emulation. + * + * + * + * Authors: RichardG, + * + * Copyright 2021 RichardG. + */ +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/mem.h> + + +typedef struct { + int aperture_enable; + uint32_t aperture_base, aperture_size, aperture_mask, gart_base; + mem_mapping_t aperture_mapping; +} agpgart_t; + +#define ENABLE_AGPGART_LOG 1 +#ifdef ENABLE_AGPGART_LOG +int agpgart_do_log = ENABLE_AGPGART_LOG; + +static void +agpgart_log(const char *fmt, ...) +{ + va_list ap; + + if (agpgart_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +#define agpgart_log(fmt, ...) +#endif + + +void +agpgart_set_aperture(void *handle, uint32_t base, uint32_t size, int enable) +{ + agpgart_t *dev = (agpgart_t *) handle; + + agpgart_log("AGP GART: set_aperture(%08X, %d, %d)\n", base, size, enable); + + /* Disable old aperture mapping. */ + mem_mapping_disable(&dev->aperture_mapping); + + /* Set new aperture base address, size and mask. */ + dev->aperture_base = base; + dev->aperture_size = size; + dev->aperture_mask = size - 1; + + /* Enable new aperture mapping if requested. */ + if (dev->aperture_base && dev->aperture_size && dev->aperture_enable) { + mem_mapping_set_addr(&dev->aperture_mapping, dev->aperture_base, dev->aperture_size); + mem_mapping_enable(&dev->aperture_mapping); + } +} + + +void +agpgart_set_gart(void *handle, uint32_t base) +{ + agpgart_t *dev = (agpgart_t *) handle; + + agpgart_log("AGP GART: set_gart(%08X)\n", base); + + /* Set GART base address. */ + dev->gart_base = base; +} + + +static uint32_t +agpgart_translate(uint32_t addr, agpgart_t *dev) +{ + /* Extract the bits we care about. */ + addr &= dev->aperture_mask; + + /* Get the GART pointer for this page. */ + register uint32_t gart_ptr = mem_readl_phys(dev->gart_base + ((addr >> 10) & 0xfffffffc)) & 0xfffff000; + + /* Return remapped address with the page offset. */ + return gart_ptr + (addr & 0x00000fff); +} + + +static uint8_t +agpgart_aperture_readb(uint32_t addr, void *priv) +{ + agpgart_t *dev = (agpgart_t *) priv; + return mem_readb_phys(agpgart_translate(addr, dev)); +} + + +static uint16_t +agpgart_aperture_readw(uint32_t addr, void *priv) +{ + agpgart_t *dev = (agpgart_t *) priv; + return mem_readw_phys(agpgart_translate(addr, dev)); +} + + +static uint32_t +agpgart_aperture_readl(uint32_t addr, void *priv) +{ + agpgart_t *dev = (agpgart_t *) priv; + return mem_readl_phys(agpgart_translate(addr, dev)); +} + + +static void +agpgart_aperture_writeb(uint32_t addr, uint8_t val, void *priv) +{ + agpgart_t *dev = (agpgart_t *) priv; + mem_writeb_phys(agpgart_translate(addr, dev), val); +} + + +static void +agpgart_aperture_writew(uint32_t addr, uint16_t val, void *priv) +{ + agpgart_t *dev = (agpgart_t *) priv; + mem_writew_phys(agpgart_translate(addr, dev), val); +} + + +static void +agpgart_aperture_writel(uint32_t addr, uint32_t val, void *priv) +{ + agpgart_t *dev = (agpgart_t *) priv; + mem_writel_phys(agpgart_translate(addr, dev), val); +} + + +static void * +agpgart_init(const device_t *info) +{ + agpgart_t *dev = malloc(sizeof(agpgart_t)); + memset(dev, 0, sizeof(agpgart_t)); + + agpgart_log("AGP GART: init()\n"); + + /* Create aperture mapping. */ + mem_mapping_add(&dev->aperture_mapping, 0, 0, + agpgart_aperture_readb, agpgart_aperture_readw, agpgart_aperture_readl, + agpgart_aperture_writeb, agpgart_aperture_writew, agpgart_aperture_writel, + NULL, MEM_MAPPING_EXTERNAL, dev); + + return dev; +} + + +static void +agpgart_close(void *priv) +{ + agpgart_t *dev = (agpgart_t *) priv; + + agpgart_log("AGP GART: close()\n"); + + /* Disable aperture. */ + mem_mapping_disable(&dev->aperture_mapping); + + free(dev); +} + + +const device_t agpgart_device = +{ + "AGP Graphics Address Remapping Table", + DEVICE_PCI, + 0, + agpgart_init, agpgart_close, NULL, + { NULL }, + NULL, + NULL, + NULL +}; diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index c77b2368e..88e2d0382 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -14,11 +14,13 @@ * * Copyright 2008-2020 Sarah Walker. */ +#include #include #include #include #include #include +#define HAVE_STDARG_H #include #include #include <86box/86box.h> @@ -244,7 +246,7 @@ enum #define MISCINIT0_Y_ORIGIN_SWAP_SHIFT (18) #define MISCINIT0_Y_ORIGIN_SWAP_MASK (0xfff << MISCINIT0_Y_ORIGIN_SWAP_SHIFT) - +#define ENABLE_BANSHEE_LOG 1 #ifdef ENABLE_BANSHEE_LOG int banshee_do_log = ENABLE_BANSHEE_LOG; @@ -385,7 +387,7 @@ static void banshee_updatemapping(banshee_t *banshee) if (!(banshee->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_MEM)) { -// banshee_log("Update mapping - PCI disabled\n"); + banshee_log("Update mapping - PCI disabled\n"); mem_mapping_disable(&svga->mapping); mem_mapping_disable(&banshee->linear_mapping); mem_mapping_disable(&banshee->reg_mapping_low); @@ -492,7 +494,7 @@ static void banshee_recalctimings(svga_t *svga) if (svga->crtc[0x1b] & 0x04) svga->dispend += 0x400; if (svga->crtc[0x1b] & 0x10) svga->vblankstart += 0x400; if (svga->crtc[0x1b] & 0x40) svga->vsyncstart += 0x400; -// banshee_log("svga->hdisp=%i\n", svga->hdisp); + banshee_log("svga->hdisp=%i\n", svga->hdisp); svga->interlace = 0; @@ -529,7 +531,7 @@ static void banshee_recalctimings(svga_t *svga) svga->rowoffset = (banshee->vidDesktopOverlayStride & 0x3fff) >> 3; svga->ma_latch = banshee->vidDesktopStartAddr >> 2; banshee->desktop_stride_tiled = (banshee->vidDesktopOverlayStride & 0x3fff) * 128 * 32; -// banshee_log("Extended shift out %i rowoffset=%i %02x\n", VIDPROCCFG_DESKTOP_PIX_FORMAT, svga->rowoffset, svga->crtc[1]); + banshee_log("Extended shift out %i rowoffset=%i %02x\n", VIDPROCCFG_DESKTOP_PIX_FORMAT, svga->rowoffset, svga->crtc[1]); svga->char_width = 8; svga->split = 99999; @@ -572,7 +574,7 @@ static void banshee_recalctimings(svga_t *svga) } else { -// banshee_log("Normal shift out\n"); + banshee_log("Normal shift out\n"); svga->bpp = 8; } @@ -588,7 +590,7 @@ static void banshee_recalctimings(svga_t *svga) svga->clock = (cpuclock * (float)(1ull << 32)) / freq; // svga->clock = cpuclock / freq; -// banshee_log("svga->clock = %g %g m=%i k=%i n=%i\n", freq, freq / 1000000.0, m, k, n); + banshee_log("svga->clock = %g %g m=%i k=%i n=%i\n", freq, freq / 1000000.0, m, k, n); } } @@ -597,7 +599,7 @@ static void banshee_ext_out(uint16_t addr, uint8_t val, void *p) // banshee_t *banshee = (banshee_t *)p; // svga_t *svga = &banshee->svga; -// banshee_log("banshee_ext_out: addr=%04x val=%02x\n", addr, val); + banshee_log("banshee_ext_out: addr=%04x val=%02x\n", addr, val); switch (addr & 0xff) { @@ -626,7 +628,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) voodoo_t *voodoo = banshee->voodoo; svga_t *svga = &banshee->svga; -// banshee_log("banshee_ext_outl: addr=%04x val=%08x %04x(%08x):%08x\n", addr, val, CS,cs,cpu_state.pc); + banshee_log("banshee_ext_outl: addr=%04x val=%08x %04x(%08x):%08x\n", addr, val, CS,cs,cpu_state.pc); switch (addr & 0xff) { @@ -639,7 +641,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Init_lfbMemoryConfig: banshee->lfbMemoryConfig = val; -// banshee_log("lfbMemoryConfig=%08x\n", val); + banshee_log("lfbMemoryConfig=%08x\n", val); voodoo->tile_base = (val & 0x1fff) << 12; voodoo->tile_stride = 1024 << ((val >> 13) & 7); voodoo->tile_stride_shift = 10 + ((val >> 13) & 7); @@ -705,7 +707,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Video_vidProcCfg: banshee->vidProcCfg = val; -// banshee_log("vidProcCfg=%08x\n", val); + banshee_log("vidProcCfg=%08x\n", val); banshee->overlay_pix_fmt = (val & VIDPROCCFG_OVERLAY_PIX_FORMAT_MASK) >> VIDPROCCFG_OVERLAY_PIX_FORMAT_SHIFT; svga->hwcursor.ena = val & VIDPROCCFG_HWCURSOR_ENA; svga->fullchange = changeframecount; @@ -740,7 +742,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) svga->hwcursor.addr = (banshee->hwCurPatAddr & 0xfffff0) + (svga->hwcursor.yoff * 16); svga->hwcursor.xsize = 64; svga->hwcursor.ysize = 64; -// banshee_log("hwCurLoc %08x %i\n", val, svga->hwcursor.y); + banshee_log("hwCurLoc %08x %i\n", val, svga->hwcursor.y); break; case Video_hwCurC0: banshee->hwCurC0 = val; @@ -751,7 +753,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Video_vidSerialParallelPort: banshee->vidSerialParallelPort = val; -// banshee_log("vidSerialParallelPort: write %08x %08x %04x(%08x):%08x\n", val, val & (VIDSERIAL_DDC_DCK_W | VIDSERIAL_DDC_DDA_W), CS,cs,cpu_state.pc); + banshee_log("vidSerialParallelPort: write %08x %08x %04x(%08x):%08x\n", val, val & (VIDSERIAL_DDC_DCK_W | VIDSERIAL_DDC_DDA_W), CS,cs,cpu_state.pc); i2c_gpio_set(banshee->i2c_ddc, !!(val & VIDSERIAL_DDC_DCK_W), !!(val & VIDSERIAL_DDC_DDA_W)); i2c_gpio_set(banshee->i2c, !!(val & VIDSERIAL_I2C_SCK_W), !!(val & VIDSERIAL_I2C_SDA_W)); break; @@ -779,16 +781,16 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) break; case Video_vidOverlayDudx: voodoo->overlay.vidOverlayDudx = val & VID_DUDX_MASK; -// banshee_log("vidOverlayDudx=%08x\n", val); + banshee_log("vidOverlayDudx=%08x\n", val); break; case Video_vidOverlayDudxOffsetSrcWidth: voodoo->overlay.vidOverlayDudxOffsetSrcWidth = val; voodoo->overlay.overlay_bytes = (val & OVERLAY_SRC_WIDTH_MASK) >> OVERLAY_SRC_WIDTH_SHIFT; -// banshee_log("vidOverlayDudxOffsetSrcWidth=%08x\n", val); + banshee_log("vidOverlayDudxOffsetSrcWidth=%08x\n", val); break; case Video_vidOverlayDvdy: voodoo->overlay.vidOverlayDvdy = val & VID_DVDY_MASK; -// banshee_log("vidOverlayDvdy=%08x\n", val); + banshee_log("vidOverlayDvdy=%08x\n", val); break; case Video_vidOverlayDvdyOffset: voodoo->overlay.vidOverlayDvdyOffset = val; @@ -797,13 +799,13 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Video_vidDesktopStartAddr: banshee->vidDesktopStartAddr = val & 0xffffff; -// banshee_log("vidDesktopStartAddr=%08x\n", val); + banshee_log("vidDesktopStartAddr=%08x\n", val); svga->fullchange = changeframecount; svga_recalctimings(svga); break; case Video_vidDesktopOverlayStride: banshee->vidDesktopOverlayStride = val; -// banshee_log("vidDesktopOverlayStride=%08x\n", val); + banshee_log("vidDesktopOverlayStride=%08x\n", val); svga->fullchange = changeframecount; svga_recalctimings(svga); break; @@ -822,7 +824,7 @@ static uint8_t banshee_ext_in(uint16_t addr, void *p) { case Init_status: case Init_status+1: case Init_status+2: case Init_status+3: ret = (banshee_status(banshee) >> ((addr & 3) * 8)) & 0xff; -// banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); + banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); break; case 0xb0: case 0xb1: case 0xb2: case 0xb3: @@ -845,7 +847,7 @@ static uint8_t banshee_ext_in(uint16_t addr, void *p) break; } -// banshee_log("banshee_ext_in: addr=%04x val=%02x\n", addr, ret); + banshee_log("banshee_ext_in: addr=%04x val=%02x\n", addr, ret); return ret; } @@ -886,7 +888,7 @@ static uint32_t banshee_status(banshee_t *banshee) if (!voodoo->voodoo_busy) voodoo_wake_fifo_thread(voodoo); -// banshee_log("banshee_status: busy %i %i (%i %i) %i %i %i %04x(%08x):%08x %08x\n", busy, written, voodoo->cmd_written, voodoo->cmd_written_fifo, voodoo->cmd_read, voodoo->cmdfifo_depth_rd, voodoo->cmdfifo_depth_wr, CS,cs,cpu_state.pc, ret); + banshee_log("banshee_status: busy %i %i (%i %i) %i %i %i %04x(%08x):%08x %08x\n", busy, written, voodoo->cmd_written, voodoo->cmd_written_fifo, voodoo->cmd_read, voodoo->cmdfifo_depth_rd, voodoo->cmdfifo_depth_wr, CS,cs,cpu_state.pc, ret); return ret; } @@ -904,7 +906,7 @@ static uint32_t banshee_ext_inl(uint16_t addr, void *p) { case Init_status: ret = banshee_status(banshee); -// banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); + banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); break; case Init_pciInit0: ret = banshee->pciInit0; @@ -997,7 +999,7 @@ static uint32_t banshee_ext_inl(uint16_t addr, void *p) if (i2c_gpio_get_sda(banshee->i2c)) ret |= VIDSERIAL_I2C_SDA_R; } -// banshee_log("vidSerialParallelPort: read %08x %08x %04x(%08x):%08x\n", ret, ret & (VIDSERIAL_DDC_DCK_R | VIDSERIAL_DDC_DDA_R), CS,cs,cpu_state.pc); + banshee_log("vidSerialParallelPort: read %08x %08x %04x(%08x):%08x\n", ret, ret & (VIDSERIAL_DDC_DCK_R | VIDSERIAL_DDC_DDA_R), CS,cs,cpu_state.pc); break; case Video_vidScreenSize: @@ -1044,13 +1046,13 @@ static uint32_t banshee_reg_readl(uint32_t addr, void *p); static uint8_t banshee_reg_read(uint32_t addr, void *p) { -// banshee_log("banshee_reg_read: addr=%08x\n", addr); + banshee_log("banshee_reg_read: addr=%08x\n", addr); return banshee_reg_readl(addr & ~3, p) >> (8*(addr & 3)); } static uint16_t banshee_reg_readw(uint32_t addr, void *p) { -// banshee_log("banshee_reg_readw: addr=%08x\n", addr); + banshee_log("banshee_reg_readw: addr=%08x\n", addr); return banshee_reg_readl(addr & ~3, p) >> (8*(addr & 2)); } @@ -1063,17 +1065,17 @@ static uint32_t banshee_cmd_read(banshee_t *banshee, uint32_t addr) { case cmdBaseAddr0: ret = voodoo->cmdfifo_base >> 12; -// banshee_log("Read cmdfifo_base %08x\n", ret); + banshee_log("Read cmdfifo_base %08x\n", ret); break; case cmdRdPtrL0: ret = voodoo->cmdfifo_rp; -// banshee_log("Read cmdfifo_rp %08x\n", ret); + banshee_log("Read cmdfifo_rp %08x\n", ret); break; case cmdFifoDepth0: ret = voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd; -// banshee_log("Read cmdfifo_depth %08x\n", ret); + banshee_log("Read cmdfifo_depth %08x\n", ret); break; case 0x108: @@ -1244,7 +1246,7 @@ static uint32_t banshee_reg_readl(uint32_t addr, void *p) static void banshee_reg_write(uint32_t addr, uint8_t val, void *p) { -// banshee_log("banshee_reg_writeb: addr=%08x val=%02x\n", addr, val); + banshee_log("banshee_reg_writeb: addr=%08x val=%02x\n", addr, val); } static void banshee_reg_writew(uint32_t addr, uint16_t val, void *p) @@ -1254,7 +1256,7 @@ static void banshee_reg_writew(uint32_t addr, uint16_t val, void *p) cycles -= voodoo->write_time; -// banshee_log("banshee_reg_writew: addr=%08x val=%04x\n", addr, val); + banshee_log("banshee_reg_writew: addr=%08x val=%04x\n", addr, val); switch (addr & 0x1f00000) { case 0x1000000: case 0x1100000: case 0x1200000: case 0x1300000: /*3D LFB*/ @@ -1269,13 +1271,13 @@ static void banshee_reg_writew(uint32_t addr, uint16_t val, void *p) static void banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) { voodoo_t *voodoo = banshee->voodoo; -// banshee_log("banshee_cmd_write: addr=%03x val=%08x\n", addr & 0x1fc, val); + banshee_log("banshee_cmd_write: addr=%03x val=%08x\n", addr & 0x1fc, val); switch (addr & 0x1fc) { case cmdBaseAddr0: voodoo->cmdfifo_base = (val & 0xfff) << 12; voodoo->cmdfifo_end = voodoo->cmdfifo_base + (((voodoo->cmdfifo_size & 0xff) + 1) << 12); -// banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x %08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end, val); + banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x %08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end, val); break; case cmdBaseSize0: @@ -1284,11 +1286,11 @@ static void banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) voodoo->cmdfifo_enabled = val & 0x100; if (!voodoo->cmdfifo_enabled) voodoo->cmdfifo_in_sub = 0; /*Not sure exactly when this should be reset*/ -// banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); + banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); break; // voodoo->cmdfifo_end = ((val >> 16) & 0x3ff) << 12; -// banshee_log("CMDFIFO base=%08x end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); + banshee_log("CMDFIFO base=%08x end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); // break; case cmdRdPtrL0: @@ -1332,7 +1334,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) cycles -= voodoo->write_time; voodoo->last_write_addr = addr; -// banshee_log("banshee_reg_writel: addr=%08x val=%08x\n", addr, val); + banshee_log("banshee_reg_writel: addr=%08x val=%08x\n", addr, val); switch (addr & 0x1f00000) { @@ -1341,7 +1343,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) banshee_ext_outl(addr & 0xff, val, banshee); else banshee_cmd_write(banshee, addr, val); -// banshee_log("CMD!!! write %08x %08x\n", addr, val); + banshee_log("CMD!!! write %08x %08x\n", addr, val); break; case 0x0100000: /*2D registers*/ @@ -1357,7 +1359,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) { case SST_intrCtrl: banshee->intrCtrl = val & 0x0030003f; -// banshee_log("intrCtrl=%08x\n", val); + banshee_log("intrCtrl=%08x\n", val); break; case SST_userIntrCMD: @@ -1369,7 +1371,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) voodoo_queue_command(voodoo, (addr & 0x3fc) | FIFO_WRITEL_REG, val); if (!voodoo->voodoo_busy) voodoo_wake_fifo_threads(voodoo->set, voodoo); -// banshee_log("SST_swapbufferCMD write: %i %i\n", voodoo->cmd_written, voodoo->cmd_written_fifo); + banshee_log("SST_swapbufferCMD write: %i %i\n", voodoo->cmd_written, voodoo->cmd_written_fifo); break; case SST_triangleCMD: voodoo->cmd_written++; @@ -1441,14 +1443,14 @@ static uint8_t banshee_read_linear(uint32_t addr, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; -// banshee_log(" Tile rb %08x->%08x %i %i\n", old_addr, addr, x, y); + banshee_log(" Tile rb %08x->%08x %i %i\n", 0, addr, x, y); } if (addr >= svga->vram_max) return 0xff; cycles -= video_timing_read_b; -// banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); + banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); return svga->vram[addr & svga->vram_mask]; } @@ -1473,14 +1475,14 @@ static uint16_t banshee_read_linear_w(uint32_t addr, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; -// banshee_log(" Tile rb %08x->%08x %i %i\n", old_addr, addr, x, y); + banshee_log(" Tile rb %08x->%08x %i %i\n", 0, addr, x, y); } if (addr >= svga->vram_max) return 0xff; cycles -= video_timing_read_w; -// banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); + banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); return *(uint16_t *)&svga->vram[addr & svga->vram_mask]; } @@ -1506,14 +1508,14 @@ static uint32_t banshee_read_linear_l(uint32_t addr, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; -// banshee_log(" Tile rb %08x->%08x %i %i\n", old_addr, addr, x, y); + banshee_log(" Tile rb %08x->%08x %i %i\n", 0, addr, x, y); } if (addr >= svga->vram_max) return 0xff; cycles -= video_timing_read_l; -// banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); + banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); return *(uint32_t *)&svga->vram[addr & svga->vram_mask]; } @@ -1526,7 +1528,7 @@ static void banshee_write_linear(uint32_t addr, uint8_t val, void *p) cycles -= voodoo->write_time; -// banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); + banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { @@ -1537,7 +1539,7 @@ static void banshee_write_linear(uint32_t addr, uint8_t val, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; -// banshee_log(" Tile b %08x->%08x %i %i\n", old_addr, addr, x, y); + banshee_log(" Tile b %08x->%08x %i %i\n", 0, addr, x, y); } if (addr >= svga->vram_max) return; @@ -1562,7 +1564,7 @@ static void banshee_write_linear_w(uint32_t addr, uint16_t val, void *p) } cycles -= voodoo->write_time; -// banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); + banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { @@ -1573,7 +1575,7 @@ static void banshee_write_linear_w(uint32_t addr, uint16_t val, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; -// banshee_log(" Tile b %08x->%08x %i %i\n", old_addr, addr, x, y); + banshee_log(" Tile b %08x->%08x %i %i\n", 0, addr, x, y); } if (addr >= svga->vram_max) return; @@ -1616,7 +1618,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; -// banshee_log(" Tile %08x->%08x->%08x->%08x %i %i tile_x=%i\n", old_addr, addr_off, addr2, addr, x, y, voodoo->tile_x_real); + banshee_log(" Tile %08x->%08x->%08x->%08x %i %i tile_x=%i\n", 0, 0, 0, addr, x, y, voodoo->tile_x_real); } if (addr >= svga->vram_max) @@ -1628,7 +1630,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) *(uint32_t *)&svga->vram[addr & svga->vram_mask] = val; if (voodoo->cmdfifo_enabled && addr >= voodoo->cmdfifo_base && addr < voodoo->cmdfifo_end) { -// banshee_log("CMDFIFO write %08x %08x old amin=%08x amax=%08x hlcnt=%i depth_wr=%i rp=%08x\n", addr, val, voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount, voodoo->cmdfifo_depth_wr, voodoo->cmdfifo_rp); + banshee_log("CMDFIFO write %08x %08x old amin=%08x amax=%08x hlcnt=%i depth_wr=%i rp=%08x\n", addr, val, voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount, voodoo->cmdfifo_depth_wr, voodoo->cmdfifo_rp); if (addr == voodoo->cmdfifo_base && !voodoo->cmdfifo_holecount) { // if (voodoo->cmdfifo_holecount) @@ -1643,7 +1645,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) { // if ((addr <= voodoo->cmdfifo_amin && voodoo->cmdfifo_amin != -4) || addr >= voodoo->cmdfifo_amax) // fatal("CMDFIFO holecount write outside of amin/amax - amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); -// banshee_log("holecount %i\n", voodoo->cmdfifo_holecount); + banshee_log("holecount %i\n", voodoo->cmdfifo_holecount); voodoo->cmdfifo_holecount--; if (!voodoo->cmdfifo_holecount) { @@ -1651,7 +1653,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) voodoo->cmdfifo_depth_wr += ((voodoo->cmdfifo_amax - voodoo->cmdfifo_amin) >> 2); voodoo->cmdfifo_amin = voodoo->cmdfifo_amax; voodoo_wake_fifo_thread(voodoo); -// banshee_log("hole filled! amin=%08x amax=%08x added %i words\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, words_to_add); + banshee_log("hole filled! amin=%08x amax=%08x added %i words\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, 0); } } else if (addr == voodoo->cmdfifo_amax+4) @@ -1675,7 +1677,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) // fatal("Out-of-order write really out of order\n"); voodoo->cmdfifo_amax = addr; voodoo->cmdfifo_holecount = ((voodoo->cmdfifo_amax - voodoo->cmdfifo_amin) >> 2) - 1; -// banshee_log("CMDFIFO out of order: amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); + banshee_log("CMDFIFO out of order: amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); } } } @@ -2401,7 +2403,7 @@ static uint8_t banshee_pci_read(int func, int addr, void *p) if (func) return 0xff; -// banshee_log("Banshee PCI read %08X ", addr); + banshee_log("Banshee PCI read %08X ", addr); switch (addr) { case 0x00: ret = 0x1a; break; /*3DFX*/ @@ -2482,7 +2484,7 @@ static uint8_t banshee_pci_read(int func, int addr, void *p) case 0x66: ret = banshee->pci_regs[0x66]; break; case 0x67: ret = banshee->pci_regs[0x67]; break; } -// banshee_log("%02X\n", ret); + banshee_log("%02X\n", ret); return ret; } @@ -2493,7 +2495,7 @@ static void banshee_pci_write(int func, int addr, uint8_t val, void *p) if (func) return; -// banshee_log("Banshee write %08X %02X %04X:%08X\n", addr, val, CS, cpu_state.pc); + banshee_log("Banshee write %08X %02X %04X:%08X\n", addr, val, CS, cpu_state.pc); switch (addr) { case 0x00: case 0x01: case 0x02: case 0x03: @@ -2874,7 +2876,7 @@ static void *banshee_init_common(const device_t *info, char *fn, int has_sgram, static void *banshee_init(const device_t *info) { - return banshee_init_common(info, "roms/video/voodoo/Pci_sg.rom", 1, TYPE_BANSHEE, VOODOO_BANSHEE, 0); + return banshee_init_common(info, "roms/video/voodoo/Pci_sg.rom", 1, TYPE_BANSHEE, VOODOO_BANSHEE, 1); } static void *creative_banshee_init(const device_t *info) { diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 90ef6136a..74eb7d0b5 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -734,7 +734,7 @@ SNDOBJ := sound.o \ snd_wss.o \ snd_ym7128.o -VIDOBJ := video.o \ +VIDOBJ := agpgart.o video.o \ vid_table.o \ vid_cga.o vid_cga_comp.o \ vid_compaq_cga.o \ From c38e8138ba08f7e8fa6010ed2ba00b31bb4b231b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 10 Nov 2021 21:16:12 -0300 Subject: [PATCH 052/159] Give the Apollo Pro variants the space they should have --- src/machine/machine_table.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 03a3e01d6..33e6ceedf 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -456,10 +456,10 @@ const machine_t machines[] = { /* VIA Apollo Pro */ { "[VIA Apollo Pro] PC Partner APAS3", "apas3", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_apas3_init, NULL }, - { "[VIA Apollo Pro133] ECS P6BAP", "p6bap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1572864, 8192, 255, machine_at_p6bap_init, NULL }, - { "[VIA Apollo Pro133A] BCM GT694VA", "gt694va", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,3145728, 8192, 255, machine_at_gt694va_init, NULL }, - { "[VIA Apollo Pro133A] ASUS CUV4X-LS", "cuv4xls", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, (MACHINE_AGP & ~MACHINE_AT) | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL,16384,4194304, 8192, 255, machine_at_cuv4xls_init, NULL }, - { "[VIA Apollo Pro133A] Acorp 6VIA90AP", "6via90ap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_GAMEPORT, 16384,3145728, 8192, 255, machine_at_6via90ap_init, NULL }, + { "[VIA Apollo Pro 133] ECS P6BAP", "p6bap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1572864, 8192, 255, machine_at_p6bap_init, NULL }, + { "[VIA Apollo Pro 133A] BCM GT694VA", "gt694va", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,3145728, 8192, 255, machine_at_gt694va_init, NULL }, + { "[VIA Apollo Pro 133A] ASUS CUV4X-LS", "cuv4xls", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, (MACHINE_AGP & ~MACHINE_AT) | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL,16384,4194304, 8192, 255, machine_at_cuv4xls_init, NULL }, + { "[VIA Apollo Pro 133A] Acorp 6VIA90AP", "6via90ap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_GAMEPORT, 16384,3145728, 8192, 255, machine_at_6via90ap_init, NULL }, /* Miscellaneous/Fake/Hypervisor machines */ { "[i440BX] Microsoft Virtual PC 2007", "vpc2007", MACHINE_TYPE_MISC, CPU_PKG_SLOT1, CPU_BLOCK(CPU_PENTIUM2, CPU_CYRIX3S), 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_vpc2007_init, NULL }, From 6a7a215f342aa1a28ebde040da84ada6b70f67a1 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 11 Nov 2021 15:55:59 -0300 Subject: [PATCH 053/159] Port the correct QDI FMB from machine_and_kb and apply misc machine table fixes --- src/include/86box/machine.h | 2 +- src/machine/m_at_socket7.c | 10 ++++++---- src/machine/machine_table.c | 18 +++++++++--------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index f87dc277b..335773db7 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -426,7 +426,7 @@ extern const device_t *at_thor_get_device(void); /* m_at_socket7_s7.c */ extern int machine_at_ap5s_init(const machine_t *); -extern int machine_at_chariot_init(const machine_t *); +extern int machine_at_fmb_init(const machine_t *); extern int machine_at_p54tp4xe_init(const machine_t *); extern int machine_at_p54tp4xe_mr_init(const machine_t *); extern int machine_at_thor_init(const machine_t *); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 967aa024e..6545cbebb 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -45,6 +45,7 @@ #include <86box/fdc.h> #include <86box/nvr.h> + int machine_at_ap5s_init(const machine_t *model) { @@ -74,12 +75,13 @@ machine_at_ap5s_init(const machine_t *model) return ret; } + int -machine_at_chariot_init(const machine_t *model) +machine_at_fmb_init(const machine_t *model) { int ret; - ret = bios_load_linear("roms/machines/chariot/P5IV183.ROM", + ret = bios_load_linear("roms/machines/fmb/P5IV183.ROM", 0x000e0000, 131072, 0); if (bios_only || !ret) @@ -94,11 +96,11 @@ machine_at_chariot_init(const machine_t *model) pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 2, 1); pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 3, 2, 1); - + device_add(&i430fx_device); device_add(&piix_device); device_add(&keyboard_ps2_ami_pci_device); - device_add(&pc87306_device); + device_add(&w83787f_device); device_add(&intel_flash_bxt_device); return ret; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 33e6ceedf..889d4ce85 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -266,7 +266,7 @@ const machine_t machines[] = { { "[i430LX] Packard Bell PB520R", "pb520r", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 139264, 2048, 127, machine_at_pb520r_init, at_pb520r_get_device }, /* OPTi 596/597 */ - { "[OPTi 597] AMI Excalibur VLB", "excalibur", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_VLB | MACHINE_IDE, 2048, 65536, 2048, 127, machine_at_excalibur_init, NULL }, + { "[OPTi 597] AMI Excalibur VLB", "excalibur", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 60000000, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_VLB | MACHINE_IDE, 2048, 65536, 2048, 127, machine_at_excalibur_init, NULL }, /* SiS 85C501/503 */ { "[SiS 501] ASUS PCI/I-P5SP4", "p5sp4", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p5sp4_init, NULL }, @@ -288,7 +288,7 @@ const machine_t machines[] = { { "[OPTi 597] TMC PAT54PV", "pat54pv", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_VLB, 2048, 65536, 2048, 127, machine_at_pat54pv_init, NULL }, /* OPTi 596/597/822 */ - { "[OPTi 597] Shuttle HOT-543", "hot543", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_hot543_init, NULL }, + { "[OPTi 597] Shuttle HOT-543", "hot543", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3520, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_hot543_init, NULL }, { "[OPTi 597] Supermicro P54VL-PCI", "p54vl", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 60000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_p54vl_init, NULL }, /* SiS 85C501/503 */ @@ -296,7 +296,7 @@ const machine_t machines[] = { { "[SiS 501] BCM SQ-588", "sq588", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_PENTIUMMMX), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_sq588_init, NULL }, /* UMC 889x */ - { "[UMC 8890] Shuttle HOT-539", "hot539", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3600, 1.5, 2.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 262144, 8192, 127, machine_at_hot539_init, NULL }, + { "[UMC 8890] Shuttle HOT-539", "hot539", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_WINCHIP, CPU_WINCHIP2, CPU_K5, CPU_5K86), 50000000, 66666667, 3380, 3600, 1.5, 3.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 262144, 8192, 127, machine_at_hot539_init, NULL }, /* Socket 7 (Single Voltage) machines */ /* 430FX */ @@ -308,13 +308,13 @@ const machine_t machines[] = { { "[i430FX] Intel Advanced/ATX (MR BIOS)", "mrthor", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_mrthor_init, NULL }, { "[i430FX] Intel Advanced/EV", "endeavor", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_endeavor_init, at_endeavor_get_device }, { "[i430FX] Packard Bell PB640", "pb640", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 127, machine_at_pb640_init, at_pb640_get_device }, - { "[i430FX] QDI Chariot", "chariot", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_WINCHIP, CPU_WINCHIP2, CPU_Cx6x86, CPU_Cx6x86L, CPU_Cx6x86MX), 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_chariot_init, NULL }, + { "[i430FX] QDI FMB", "fmb", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_WINCHIP, CPU_WINCHIP2), 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_fmb_init, NULL }, /* 430HX */ { "[i430HX] Acer M3A", "acerm3a", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3300, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 196608, 8192, 127, machine_at_acerm3a_init, NULL }, { "[i430HX] AOpen AP53", "ap53", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3450, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_ap53_init, NULL }, { "[i430HX] Biostar MB-8500TUC", "8500tuc", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_8500tuc_init, NULL }, - { "[i430HX] SuperMicro Super P55T2S", "p55t2s", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3300, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 127, machine_at_p55t2s_init, NULL }, + { "[i430HX] Supermicro P55T2S", "p55t2s", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3300, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 127, machine_at_p55t2s_init, NULL }, /* 430VX */ { "[i430VX] Gateway 2000 Tigereye", "gw2kte", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_gw2kte_init, NULL }, @@ -352,7 +352,7 @@ const machine_t machines[] = { #endif { "[i430TX] Intel YM430TX", "ym430tx", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 60000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 255, machine_at_ym430tx_init, NULL }, { "[i430TX] PC Partner MB540N", "mb540n", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 60000000, 66666667, 2700, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 255, machine_at_mb540n_init, NULL }, - { "[i430TX] SuperMicro Super P5MMS98", "p5mms98", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2100, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 255, machine_at_p5mms98_init, NULL }, + { "[i430TX] Supermicro P5MMS98", "p5mms98", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2100, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 255, machine_at_p5mms98_init, NULL }, /* Apollo VPX */ { "[VIA VPX] FIC VA-502", "ficva502", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 75000000, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_ficva502_init, NULL }, @@ -412,7 +412,7 @@ const machine_t machines[] = { { "[i440BX] Gigabyte GA-686BX", "686bx", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_686bx_init, NULL }, { "[i440BX] HP Vectra VEi 8", "vei8", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_vei8_init, NULL }, { "[i440BX] Tyan Tsunami ATX", "s1846", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 112121212, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SOUND, 8192,1048576, 8192, 255, machine_at_s1846_init, at_s1846_get_device }, - { "[i440BX] SuperMicro Super P6SBA", "p6sba", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_p6sba_init, NULL }, + { "[i440BX] Supermicro P6SBA", "p6sba", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_p6sba_init, NULL }, #if defined(DEV_BRANCH) && defined(NO_SIO) { "[i440BX] Fujitsu ErgoPro x365", "ergox365", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 393216, 8192, 511, machine_at_ergox365_init, NULL }, #endif @@ -436,11 +436,11 @@ const machine_t machines[] = { /* Slot 2 machines */ /* 440GX */ { "[i440GX] Gigabyte GA-6GXU", "6gxu", MACHINE_TYPE_SLOT2, CPU_PKG_SLOT2, 0, 100000000, 133333333, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,2097152,16384, 511, machine_at_6gxu_init, NULL }, - { "[i440GX] SuperMicro Super S2DGE", "s2dge", MACHINE_TYPE_SLOT2, CPU_PKG_SLOT2, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,2097152,16384, 511, machine_at_s2dge_init, NULL }, + { "[i440GX] Supermicro S2DGE", "s2dge", MACHINE_TYPE_SLOT2, CPU_PKG_SLOT2, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,2097152,16384, 511, machine_at_s2dge_init, NULL }, /* PGA370 machines */ /* 440LX */ - { "[i440LX] SuperMicro Super 370SLM", "s370slm", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_s370slm_init, NULL }, + { "[i440LX] Supermicro 370SLM", "s370slm", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_s370slm_init, NULL }, /* 440BX */ { "[i440BX] AEWIN AW-O671R", "awo671r", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, /* limits assumed */ MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_awo671r_init, NULL }, From 64d428606101744f3a582313d02d46fb1d061a52 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 12 Nov 2021 01:30:31 +0600 Subject: [PATCH 054/159] Fix startup crash on macOS when loading floppy images --- src/floppy/fdd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index f8016793a..72f79940b 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -497,7 +497,7 @@ fdd_load(int drive, char *fn) while (loaders[c].ext) { if (!strcasecmp(p, (char *) loaders[c].ext) && (size == loaders[c].size || loaders[c].size == -1)) { driveloaders[drive] = c; - strcpy(floppyfns[drive], fn); + if (floppyfns[drive] != fn) strcpy(floppyfns[drive], fn); d86f_setup(drive); loaders[c].load(drive, floppyfns[drive]); drive_empty[drive] = 0; From 6ed9e52e0f3ce2aaac3a1704d601e9d6facbbeab Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 11 Nov 2021 22:01:41 -0300 Subject: [PATCH 055/159] Revert some Voodoo Banshee stuff that shouldn't have shipped --- src/video/vid_voodoo_banshee.c | 114 ++++++++++++++++----------------- 1 file changed, 56 insertions(+), 58 deletions(-) diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 88e2d0382..c77b2368e 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -14,13 +14,11 @@ * * Copyright 2008-2020 Sarah Walker. */ -#include #include #include #include #include #include -#define HAVE_STDARG_H #include #include #include <86box/86box.h> @@ -246,7 +244,7 @@ enum #define MISCINIT0_Y_ORIGIN_SWAP_SHIFT (18) #define MISCINIT0_Y_ORIGIN_SWAP_MASK (0xfff << MISCINIT0_Y_ORIGIN_SWAP_SHIFT) -#define ENABLE_BANSHEE_LOG 1 + #ifdef ENABLE_BANSHEE_LOG int banshee_do_log = ENABLE_BANSHEE_LOG; @@ -387,7 +385,7 @@ static void banshee_updatemapping(banshee_t *banshee) if (!(banshee->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_MEM)) { - banshee_log("Update mapping - PCI disabled\n"); +// banshee_log("Update mapping - PCI disabled\n"); mem_mapping_disable(&svga->mapping); mem_mapping_disable(&banshee->linear_mapping); mem_mapping_disable(&banshee->reg_mapping_low); @@ -494,7 +492,7 @@ static void banshee_recalctimings(svga_t *svga) if (svga->crtc[0x1b] & 0x04) svga->dispend += 0x400; if (svga->crtc[0x1b] & 0x10) svga->vblankstart += 0x400; if (svga->crtc[0x1b] & 0x40) svga->vsyncstart += 0x400; - banshee_log("svga->hdisp=%i\n", svga->hdisp); +// banshee_log("svga->hdisp=%i\n", svga->hdisp); svga->interlace = 0; @@ -531,7 +529,7 @@ static void banshee_recalctimings(svga_t *svga) svga->rowoffset = (banshee->vidDesktopOverlayStride & 0x3fff) >> 3; svga->ma_latch = banshee->vidDesktopStartAddr >> 2; banshee->desktop_stride_tiled = (banshee->vidDesktopOverlayStride & 0x3fff) * 128 * 32; - banshee_log("Extended shift out %i rowoffset=%i %02x\n", VIDPROCCFG_DESKTOP_PIX_FORMAT, svga->rowoffset, svga->crtc[1]); +// banshee_log("Extended shift out %i rowoffset=%i %02x\n", VIDPROCCFG_DESKTOP_PIX_FORMAT, svga->rowoffset, svga->crtc[1]); svga->char_width = 8; svga->split = 99999; @@ -574,7 +572,7 @@ static void banshee_recalctimings(svga_t *svga) } else { - banshee_log("Normal shift out\n"); +// banshee_log("Normal shift out\n"); svga->bpp = 8; } @@ -590,7 +588,7 @@ static void banshee_recalctimings(svga_t *svga) svga->clock = (cpuclock * (float)(1ull << 32)) / freq; // svga->clock = cpuclock / freq; - banshee_log("svga->clock = %g %g m=%i k=%i n=%i\n", freq, freq / 1000000.0, m, k, n); +// banshee_log("svga->clock = %g %g m=%i k=%i n=%i\n", freq, freq / 1000000.0, m, k, n); } } @@ -599,7 +597,7 @@ static void banshee_ext_out(uint16_t addr, uint8_t val, void *p) // banshee_t *banshee = (banshee_t *)p; // svga_t *svga = &banshee->svga; - banshee_log("banshee_ext_out: addr=%04x val=%02x\n", addr, val); +// banshee_log("banshee_ext_out: addr=%04x val=%02x\n", addr, val); switch (addr & 0xff) { @@ -628,7 +626,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) voodoo_t *voodoo = banshee->voodoo; svga_t *svga = &banshee->svga; - banshee_log("banshee_ext_outl: addr=%04x val=%08x %04x(%08x):%08x\n", addr, val, CS,cs,cpu_state.pc); +// banshee_log("banshee_ext_outl: addr=%04x val=%08x %04x(%08x):%08x\n", addr, val, CS,cs,cpu_state.pc); switch (addr & 0xff) { @@ -641,7 +639,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Init_lfbMemoryConfig: banshee->lfbMemoryConfig = val; - banshee_log("lfbMemoryConfig=%08x\n", val); +// banshee_log("lfbMemoryConfig=%08x\n", val); voodoo->tile_base = (val & 0x1fff) << 12; voodoo->tile_stride = 1024 << ((val >> 13) & 7); voodoo->tile_stride_shift = 10 + ((val >> 13) & 7); @@ -707,7 +705,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Video_vidProcCfg: banshee->vidProcCfg = val; - banshee_log("vidProcCfg=%08x\n", val); +// banshee_log("vidProcCfg=%08x\n", val); banshee->overlay_pix_fmt = (val & VIDPROCCFG_OVERLAY_PIX_FORMAT_MASK) >> VIDPROCCFG_OVERLAY_PIX_FORMAT_SHIFT; svga->hwcursor.ena = val & VIDPROCCFG_HWCURSOR_ENA; svga->fullchange = changeframecount; @@ -742,7 +740,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) svga->hwcursor.addr = (banshee->hwCurPatAddr & 0xfffff0) + (svga->hwcursor.yoff * 16); svga->hwcursor.xsize = 64; svga->hwcursor.ysize = 64; - banshee_log("hwCurLoc %08x %i\n", val, svga->hwcursor.y); +// banshee_log("hwCurLoc %08x %i\n", val, svga->hwcursor.y); break; case Video_hwCurC0: banshee->hwCurC0 = val; @@ -753,7 +751,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Video_vidSerialParallelPort: banshee->vidSerialParallelPort = val; - banshee_log("vidSerialParallelPort: write %08x %08x %04x(%08x):%08x\n", val, val & (VIDSERIAL_DDC_DCK_W | VIDSERIAL_DDC_DDA_W), CS,cs,cpu_state.pc); +// banshee_log("vidSerialParallelPort: write %08x %08x %04x(%08x):%08x\n", val, val & (VIDSERIAL_DDC_DCK_W | VIDSERIAL_DDC_DDA_W), CS,cs,cpu_state.pc); i2c_gpio_set(banshee->i2c_ddc, !!(val & VIDSERIAL_DDC_DCK_W), !!(val & VIDSERIAL_DDC_DDA_W)); i2c_gpio_set(banshee->i2c, !!(val & VIDSERIAL_I2C_SCK_W), !!(val & VIDSERIAL_I2C_SDA_W)); break; @@ -781,16 +779,16 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) break; case Video_vidOverlayDudx: voodoo->overlay.vidOverlayDudx = val & VID_DUDX_MASK; - banshee_log("vidOverlayDudx=%08x\n", val); +// banshee_log("vidOverlayDudx=%08x\n", val); break; case Video_vidOverlayDudxOffsetSrcWidth: voodoo->overlay.vidOverlayDudxOffsetSrcWidth = val; voodoo->overlay.overlay_bytes = (val & OVERLAY_SRC_WIDTH_MASK) >> OVERLAY_SRC_WIDTH_SHIFT; - banshee_log("vidOverlayDudxOffsetSrcWidth=%08x\n", val); +// banshee_log("vidOverlayDudxOffsetSrcWidth=%08x\n", val); break; case Video_vidOverlayDvdy: voodoo->overlay.vidOverlayDvdy = val & VID_DVDY_MASK; - banshee_log("vidOverlayDvdy=%08x\n", val); +// banshee_log("vidOverlayDvdy=%08x\n", val); break; case Video_vidOverlayDvdyOffset: voodoo->overlay.vidOverlayDvdyOffset = val; @@ -799,13 +797,13 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) case Video_vidDesktopStartAddr: banshee->vidDesktopStartAddr = val & 0xffffff; - banshee_log("vidDesktopStartAddr=%08x\n", val); +// banshee_log("vidDesktopStartAddr=%08x\n", val); svga->fullchange = changeframecount; svga_recalctimings(svga); break; case Video_vidDesktopOverlayStride: banshee->vidDesktopOverlayStride = val; - banshee_log("vidDesktopOverlayStride=%08x\n", val); +// banshee_log("vidDesktopOverlayStride=%08x\n", val); svga->fullchange = changeframecount; svga_recalctimings(svga); break; @@ -824,7 +822,7 @@ static uint8_t banshee_ext_in(uint16_t addr, void *p) { case Init_status: case Init_status+1: case Init_status+2: case Init_status+3: ret = (banshee_status(banshee) >> ((addr & 3) * 8)) & 0xff; - banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); +// banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); break; case 0xb0: case 0xb1: case 0xb2: case 0xb3: @@ -847,7 +845,7 @@ static uint8_t banshee_ext_in(uint16_t addr, void *p) break; } - banshee_log("banshee_ext_in: addr=%04x val=%02x\n", addr, ret); +// banshee_log("banshee_ext_in: addr=%04x val=%02x\n", addr, ret); return ret; } @@ -888,7 +886,7 @@ static uint32_t banshee_status(banshee_t *banshee) if (!voodoo->voodoo_busy) voodoo_wake_fifo_thread(voodoo); - banshee_log("banshee_status: busy %i %i (%i %i) %i %i %i %04x(%08x):%08x %08x\n", busy, written, voodoo->cmd_written, voodoo->cmd_written_fifo, voodoo->cmd_read, voodoo->cmdfifo_depth_rd, voodoo->cmdfifo_depth_wr, CS,cs,cpu_state.pc, ret); +// banshee_log("banshee_status: busy %i %i (%i %i) %i %i %i %04x(%08x):%08x %08x\n", busy, written, voodoo->cmd_written, voodoo->cmd_written_fifo, voodoo->cmd_read, voodoo->cmdfifo_depth_rd, voodoo->cmdfifo_depth_wr, CS,cs,cpu_state.pc, ret); return ret; } @@ -906,7 +904,7 @@ static uint32_t banshee_ext_inl(uint16_t addr, void *p) { case Init_status: ret = banshee_status(banshee); - banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); +// banshee_log("Read status reg! %04x(%08x):%08x\n", CS, cs, cpu_state.pc); break; case Init_pciInit0: ret = banshee->pciInit0; @@ -999,7 +997,7 @@ static uint32_t banshee_ext_inl(uint16_t addr, void *p) if (i2c_gpio_get_sda(banshee->i2c)) ret |= VIDSERIAL_I2C_SDA_R; } - banshee_log("vidSerialParallelPort: read %08x %08x %04x(%08x):%08x\n", ret, ret & (VIDSERIAL_DDC_DCK_R | VIDSERIAL_DDC_DDA_R), CS,cs,cpu_state.pc); +// banshee_log("vidSerialParallelPort: read %08x %08x %04x(%08x):%08x\n", ret, ret & (VIDSERIAL_DDC_DCK_R | VIDSERIAL_DDC_DDA_R), CS,cs,cpu_state.pc); break; case Video_vidScreenSize: @@ -1046,13 +1044,13 @@ static uint32_t banshee_reg_readl(uint32_t addr, void *p); static uint8_t banshee_reg_read(uint32_t addr, void *p) { - banshee_log("banshee_reg_read: addr=%08x\n", addr); +// banshee_log("banshee_reg_read: addr=%08x\n", addr); return banshee_reg_readl(addr & ~3, p) >> (8*(addr & 3)); } static uint16_t banshee_reg_readw(uint32_t addr, void *p) { - banshee_log("banshee_reg_readw: addr=%08x\n", addr); +// banshee_log("banshee_reg_readw: addr=%08x\n", addr); return banshee_reg_readl(addr & ~3, p) >> (8*(addr & 2)); } @@ -1065,17 +1063,17 @@ static uint32_t banshee_cmd_read(banshee_t *banshee, uint32_t addr) { case cmdBaseAddr0: ret = voodoo->cmdfifo_base >> 12; - banshee_log("Read cmdfifo_base %08x\n", ret); +// banshee_log("Read cmdfifo_base %08x\n", ret); break; case cmdRdPtrL0: ret = voodoo->cmdfifo_rp; - banshee_log("Read cmdfifo_rp %08x\n", ret); +// banshee_log("Read cmdfifo_rp %08x\n", ret); break; case cmdFifoDepth0: ret = voodoo->cmdfifo_depth_wr - voodoo->cmdfifo_depth_rd; - banshee_log("Read cmdfifo_depth %08x\n", ret); +// banshee_log("Read cmdfifo_depth %08x\n", ret); break; case 0x108: @@ -1246,7 +1244,7 @@ static uint32_t banshee_reg_readl(uint32_t addr, void *p) static void banshee_reg_write(uint32_t addr, uint8_t val, void *p) { - banshee_log("banshee_reg_writeb: addr=%08x val=%02x\n", addr, val); +// banshee_log("banshee_reg_writeb: addr=%08x val=%02x\n", addr, val); } static void banshee_reg_writew(uint32_t addr, uint16_t val, void *p) @@ -1256,7 +1254,7 @@ static void banshee_reg_writew(uint32_t addr, uint16_t val, void *p) cycles -= voodoo->write_time; - banshee_log("banshee_reg_writew: addr=%08x val=%04x\n", addr, val); +// banshee_log("banshee_reg_writew: addr=%08x val=%04x\n", addr, val); switch (addr & 0x1f00000) { case 0x1000000: case 0x1100000: case 0x1200000: case 0x1300000: /*3D LFB*/ @@ -1271,13 +1269,13 @@ static void banshee_reg_writew(uint32_t addr, uint16_t val, void *p) static void banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) { voodoo_t *voodoo = banshee->voodoo; - banshee_log("banshee_cmd_write: addr=%03x val=%08x\n", addr & 0x1fc, val); +// banshee_log("banshee_cmd_write: addr=%03x val=%08x\n", addr & 0x1fc, val); switch (addr & 0x1fc) { case cmdBaseAddr0: voodoo->cmdfifo_base = (val & 0xfff) << 12; voodoo->cmdfifo_end = voodoo->cmdfifo_base + (((voodoo->cmdfifo_size & 0xff) + 1) << 12); - banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x %08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end, val); +// banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x %08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end, val); break; case cmdBaseSize0: @@ -1286,11 +1284,11 @@ static void banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) voodoo->cmdfifo_enabled = val & 0x100; if (!voodoo->cmdfifo_enabled) voodoo->cmdfifo_in_sub = 0; /*Not sure exactly when this should be reset*/ - banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); +// banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); break; // voodoo->cmdfifo_end = ((val >> 16) & 0x3ff) << 12; - banshee_log("CMDFIFO base=%08x end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); +// banshee_log("CMDFIFO base=%08x end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); // break; case cmdRdPtrL0: @@ -1334,7 +1332,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) cycles -= voodoo->write_time; voodoo->last_write_addr = addr; - banshee_log("banshee_reg_writel: addr=%08x val=%08x\n", addr, val); +// banshee_log("banshee_reg_writel: addr=%08x val=%08x\n", addr, val); switch (addr & 0x1f00000) { @@ -1343,7 +1341,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) banshee_ext_outl(addr & 0xff, val, banshee); else banshee_cmd_write(banshee, addr, val); - banshee_log("CMD!!! write %08x %08x\n", addr, val); +// banshee_log("CMD!!! write %08x %08x\n", addr, val); break; case 0x0100000: /*2D registers*/ @@ -1359,7 +1357,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) { case SST_intrCtrl: banshee->intrCtrl = val & 0x0030003f; - banshee_log("intrCtrl=%08x\n", val); +// banshee_log("intrCtrl=%08x\n", val); break; case SST_userIntrCMD: @@ -1371,7 +1369,7 @@ static void banshee_reg_writel(uint32_t addr, uint32_t val, void *p) voodoo_queue_command(voodoo, (addr & 0x3fc) | FIFO_WRITEL_REG, val); if (!voodoo->voodoo_busy) voodoo_wake_fifo_threads(voodoo->set, voodoo); - banshee_log("SST_swapbufferCMD write: %i %i\n", voodoo->cmd_written, voodoo->cmd_written_fifo); +// banshee_log("SST_swapbufferCMD write: %i %i\n", voodoo->cmd_written, voodoo->cmd_written_fifo); break; case SST_triangleCMD: voodoo->cmd_written++; @@ -1443,14 +1441,14 @@ static uint8_t banshee_read_linear(uint32_t addr, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; - banshee_log(" Tile rb %08x->%08x %i %i\n", 0, addr, x, y); +// banshee_log(" Tile rb %08x->%08x %i %i\n", old_addr, addr, x, y); } if (addr >= svga->vram_max) return 0xff; cycles -= video_timing_read_b; - banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); +// banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); return svga->vram[addr & svga->vram_mask]; } @@ -1475,14 +1473,14 @@ static uint16_t banshee_read_linear_w(uint32_t addr, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; - banshee_log(" Tile rb %08x->%08x %i %i\n", 0, addr, x, y); +// banshee_log(" Tile rb %08x->%08x %i %i\n", old_addr, addr, x, y); } if (addr >= svga->vram_max) return 0xff; cycles -= video_timing_read_w; - banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); +// banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); return *(uint16_t *)&svga->vram[addr & svga->vram_mask]; } @@ -1508,14 +1506,14 @@ static uint32_t banshee_read_linear_l(uint32_t addr, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; - banshee_log(" Tile rb %08x->%08x %i %i\n", 0, addr, x, y); +// banshee_log(" Tile rb %08x->%08x %i %i\n", old_addr, addr, x, y); } if (addr >= svga->vram_max) return 0xff; cycles -= video_timing_read_l; - banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); +// banshee_log("read_linear: addr=%08x val=%02x\n", addr, svga->vram[addr & svga->vram_mask]); return *(uint32_t *)&svga->vram[addr & svga->vram_mask]; } @@ -1528,7 +1526,7 @@ static void banshee_write_linear(uint32_t addr, uint8_t val, void *p) cycles -= voodoo->write_time; - banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); +// banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { @@ -1539,7 +1537,7 @@ static void banshee_write_linear(uint32_t addr, uint8_t val, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; - banshee_log(" Tile b %08x->%08x %i %i\n", 0, addr, x, y); +// banshee_log(" Tile b %08x->%08x %i %i\n", old_addr, addr, x, y); } if (addr >= svga->vram_max) return; @@ -1564,7 +1562,7 @@ static void banshee_write_linear_w(uint32_t addr, uint16_t val, void *p) } cycles -= voodoo->write_time; - banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); +// banshee_log("write_linear: addr=%08x val=%02x\n", addr, val); addr &= svga->decode_mask; if (addr >= voodoo->tile_base) { @@ -1575,7 +1573,7 @@ static void banshee_write_linear_w(uint32_t addr, uint16_t val, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; - banshee_log(" Tile b %08x->%08x %i %i\n", 0, addr, x, y); +// banshee_log(" Tile b %08x->%08x %i %i\n", old_addr, addr, x, y); } if (addr >= svga->vram_max) return; @@ -1618,7 +1616,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) y = addr >> voodoo->tile_stride_shift; addr = voodoo->tile_base + (x & 127) + ((x >> 7) * 128*32) + ((y & 31) * 128) + (y >> 5)*voodoo->tile_x_real; - banshee_log(" Tile %08x->%08x->%08x->%08x %i %i tile_x=%i\n", 0, 0, 0, addr, x, y, voodoo->tile_x_real); +// banshee_log(" Tile %08x->%08x->%08x->%08x %i %i tile_x=%i\n", old_addr, addr_off, addr2, addr, x, y, voodoo->tile_x_real); } if (addr >= svga->vram_max) @@ -1630,7 +1628,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) *(uint32_t *)&svga->vram[addr & svga->vram_mask] = val; if (voodoo->cmdfifo_enabled && addr >= voodoo->cmdfifo_base && addr < voodoo->cmdfifo_end) { - banshee_log("CMDFIFO write %08x %08x old amin=%08x amax=%08x hlcnt=%i depth_wr=%i rp=%08x\n", addr, val, voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount, voodoo->cmdfifo_depth_wr, voodoo->cmdfifo_rp); +// banshee_log("CMDFIFO write %08x %08x old amin=%08x amax=%08x hlcnt=%i depth_wr=%i rp=%08x\n", addr, val, voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount, voodoo->cmdfifo_depth_wr, voodoo->cmdfifo_rp); if (addr == voodoo->cmdfifo_base && !voodoo->cmdfifo_holecount) { // if (voodoo->cmdfifo_holecount) @@ -1645,7 +1643,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) { // if ((addr <= voodoo->cmdfifo_amin && voodoo->cmdfifo_amin != -4) || addr >= voodoo->cmdfifo_amax) // fatal("CMDFIFO holecount write outside of amin/amax - amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); - banshee_log("holecount %i\n", voodoo->cmdfifo_holecount); +// banshee_log("holecount %i\n", voodoo->cmdfifo_holecount); voodoo->cmdfifo_holecount--; if (!voodoo->cmdfifo_holecount) { @@ -1653,7 +1651,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) voodoo->cmdfifo_depth_wr += ((voodoo->cmdfifo_amax - voodoo->cmdfifo_amin) >> 2); voodoo->cmdfifo_amin = voodoo->cmdfifo_amax; voodoo_wake_fifo_thread(voodoo); - banshee_log("hole filled! amin=%08x amax=%08x added %i words\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, 0); +// banshee_log("hole filled! amin=%08x amax=%08x added %i words\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, words_to_add); } } else if (addr == voodoo->cmdfifo_amax+4) @@ -1677,7 +1675,7 @@ static void banshee_write_linear_l(uint32_t addr, uint32_t val, void *p) // fatal("Out-of-order write really out of order\n"); voodoo->cmdfifo_amax = addr; voodoo->cmdfifo_holecount = ((voodoo->cmdfifo_amax - voodoo->cmdfifo_amin) >> 2) - 1; - banshee_log("CMDFIFO out of order: amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); +// banshee_log("CMDFIFO out of order: amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); } } } @@ -2403,7 +2401,7 @@ static uint8_t banshee_pci_read(int func, int addr, void *p) if (func) return 0xff; - banshee_log("Banshee PCI read %08X ", addr); +// banshee_log("Banshee PCI read %08X ", addr); switch (addr) { case 0x00: ret = 0x1a; break; /*3DFX*/ @@ -2484,7 +2482,7 @@ static uint8_t banshee_pci_read(int func, int addr, void *p) case 0x66: ret = banshee->pci_regs[0x66]; break; case 0x67: ret = banshee->pci_regs[0x67]; break; } - banshee_log("%02X\n", ret); +// banshee_log("%02X\n", ret); return ret; } @@ -2495,7 +2493,7 @@ static void banshee_pci_write(int func, int addr, uint8_t val, void *p) if (func) return; - banshee_log("Banshee write %08X %02X %04X:%08X\n", addr, val, CS, cpu_state.pc); +// banshee_log("Banshee write %08X %02X %04X:%08X\n", addr, val, CS, cpu_state.pc); switch (addr) { case 0x00: case 0x01: case 0x02: case 0x03: @@ -2876,7 +2874,7 @@ static void *banshee_init_common(const device_t *info, char *fn, int has_sgram, static void *banshee_init(const device_t *info) { - return banshee_init_common(info, "roms/video/voodoo/Pci_sg.rom", 1, TYPE_BANSHEE, VOODOO_BANSHEE, 1); + return banshee_init_common(info, "roms/video/voodoo/Pci_sg.rom", 1, TYPE_BANSHEE, VOODOO_BANSHEE, 0); } static void *creative_banshee_init(const device_t *info) { From d95f7cb8d270c3fc3bc9aa8c7f6d47a9fe43c417 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 11 Nov 2021 22:48:21 -0300 Subject: [PATCH 056/159] Disable AGP GART logging --- src/video/agpgart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video/agpgart.c b/src/video/agpgart.c index 0bd71fa60..731cc3f71 100644 --- a/src/video/agpgart.c +++ b/src/video/agpgart.c @@ -31,7 +31,7 @@ typedef struct { mem_mapping_t aperture_mapping; } agpgart_t; -#define ENABLE_AGPGART_LOG 1 + #ifdef ENABLE_AGPGART_LOG int agpgart_do_log = ENABLE_AGPGART_LOG; @@ -96,7 +96,7 @@ agpgart_translate(uint32_t addr, agpgart_t *dev) register uint32_t gart_ptr = mem_readl_phys(dev->gart_base + ((addr >> 10) & 0xfffffffc)) & 0xfffff000; /* Return remapped address with the page offset. */ - return gart_ptr + (addr & 0x00000fff); + return gart_ptr | (addr & 0x00000fff); } From 6527fe99939ce9acd7dd8e0260685e60e8d7f0fc Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 12 Nov 2021 00:43:03 -0300 Subject: [PATCH 057/159] AC97 codec overhaul, now with proper enabling through settings and proper codec features --- src/include/86box/snd_ac97.h | 91 +++++- src/machine/m_at_socket370.c | 4 +- src/machine/m_at_sockets7.c | 4 +- src/machine/machine_table.c | 4 +- src/sound/snd_ac97_codec.c | 537 ++++++++++++++++++++++++++--------- src/sound/snd_ac97_via.c | 13 +- src/sound/snd_audiopci.c | 7 +- src/sound/sound.c | 1 + 8 files changed, 502 insertions(+), 159 deletions(-) diff --git a/src/include/86box/snd_ac97.h b/src/include/86box/snd_ac97.h index 08f5747f6..7eb2d1cc5 100644 --- a/src/include/86box/snd_ac97.h +++ b/src/include/86box/snd_ac97.h @@ -18,14 +18,97 @@ # define EMU_SND_AC97_H +#define AC97_VENDOR_ID(f, s, t, dev) ((((f) & 0xff) << 24) | (((s) & 0xff) << 16) | (((t) & 0xff) << 8) | ((dev) & 0xff)) + +/* Misc support bits (misc_flags). Most of these are not part of any + registers, but control enabling/disabling of registers and bits. */ +#define AC97_MASTER_6B (1 << 0) /* register 02 bits [13,5] (ML5/MR5) */ +#define AC97_AUXOUT (1 << 1) /* register 04 */ +#define AC97_AUXOUT_6B (1 << 2) /* register 04 bits [13,5] (ML5/MR5) */ +#define AC97_MONOOUT (1 << 3) /* register 06 */ +#define AC97_MONOOUT_6B (1 << 4) /* register 06 bit 5 (MM5) */ +#define AC97_PCBEEP (1 << 5) /* register 0A */ +#define AC97_PCBEEP_GEN (1 << 6) /* register 0A bits [12:5] (F[7:0]) */ +#define AC97_PHONE (1 << 9) /* register 0C */ +#define AC97_VIDEO (1 << 10) /* register 14 */ +#define AC97_AUXIN (1 << 11) /* register 16 */ +#define AC97_POP (1 << 15) /* register 20 bit 15 (POP) - definition shared with General Purpose bits */ +#define AC97_MS (1 << 8) /* register 20 bit 8 (MS) - definition shared with General Purpose bits */ +#define AC97_LPBK (1 << 7) /* register 20 bit 7 (LPBK) - definition shared with General Purpose bits */ +#define AC97_DSA (1 << 12) /* register 28 bits [5:4] (DSA[1:0]) */ +#define AC97_LFE_6B (1 << 13) /* register 36 bit 13 (LFE5) */ +#define AC97_CENTER_6B (1 << 14) /* register 36 bit 5 (CNT5) */ +#define AC97_SURR_6B (1 << 16) /* register 38 bits [13,5] (LSR5/RSR5) */ + +/* Reset bits (reset_flags), register 00. */ +#define AC97_MICPCM (1 << 0) +#define AC97_MODEMLINE (1 << 1) +#define AC97_TONECTL (1 << 2) +#define AC97_SIMSTEREO (1 << 3) +#define AC97_HPOUT (1 << 4) +#define AC97_LOUDNESS (1 << 5) +#define AC97_DAC_18B (1 << 6) +#define AC97_DAC_20B (1 << 7) +#define AC97_ADC_18B (1 << 8) +#define AC97_ADC_20B (1 << 9) +#define AC97_3D_SHIFT 10 + +/* Extended Audio ID bits (extid_flags), register 28. */ +#define AC97_VRA (1 << 0) +#define AC97_DRA (1 << 1) +#define AC97_SPDIF (1 << 2) +#define AC97_VRM (1 << 3) +#define AC97_CDAC (1 << 6) +#define AC97_SDAC (1 << 7) +#define AC97_LDAC (1 << 8) +#define AC97_AMAP (1 << 9) +#define AC97_REV_2_1 (0 << 10) +#define AC97_REV_2_2 (1 << 10) +#define AC97_REV_2_3 (2 << 10) +#define AC97_REV_MASK (3 << 10) + +/* Volume bits. */ +#define AC97_MUTE (1 << 15) +#define AC97_MUTE_L (1 << 15) +#define AC97_MUTE_R (1 << 7) + +/* General Purpose bits, register 20. */ +/* POP already defined */ +#define AC97_ST (1 << 14) +#define AC97_3D (1 << 13) +#define AC97_LD (1 << 12) +#define AC97_DRSS_MASK (3 << 10) +#define AC97_MIX (1 << 9) +/* MS already defined */ +/* LPBK already defined */ + +/* Extended Audio Status/Control bits, register 2A. */ +#define AC97_SPSA_SHIFT 4 +#define AC97_SPSA_MASK 3 +#define AC97_MADC (1 << 9) +#define AC97_SPCV (1 << 10) +#define AC97_PRI (1 << 11) +#define AC97_PRJ (1 << 12) +#define AC97_PRK (1 << 13) +#define AC97_PRL (1 << 14) + + typedef struct { - uint32_t vendor_id; - uint8_t codec_id, regs[128]; + const uint16_t index, value, write_mask; +} ac97_vendor_reg_t; + +typedef struct { + uint32_t vendor_id, max_rate, misc_flags; + uint16_t reset_flags, extid_flags, + powerdown_mask, regs[64]; + uint8_t codec_id, vendor_reg_page_max; + const ac97_vendor_reg_t *vendor_regs; + uint16_t *vendor_reg_pages; } ac97_codec_t; -extern uint8_t ac97_codec_read(ac97_codec_t *dev, uint8_t reg); -extern void ac97_codec_write(ac97_codec_t *dev, uint8_t reg, uint8_t val); +extern uint16_t ac97_codec_readw(ac97_codec_t *dev, uint8_t reg); +extern void ac97_codec_writew(ac97_codec_t *dev, uint8_t reg, uint16_t val); extern void ac97_codec_reset(void *priv); extern void ac97_codec_getattn(void *priv, uint8_t reg, int *l, int *r); extern uint32_t ac97_codec_getrate(void *priv, uint8_t reg); diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 8a2605145..4475ee984 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -37,6 +37,7 @@ #include "cpu.h" #include <86box/machine.h> #include <86box/clock.h> +#include <86box/sound.h> #include <86box/snd_ac97.h> @@ -452,7 +453,8 @@ machine_at_6via90ap_init(const machine_t *model) hwm_values.temperatures[1] += 2; /* System offset */ hwm_values.temperatures[2] = 0; /* unused */ - device_add(&alc100_device); /* ALC100P identified on similar Acorp boards (694TA, 6VIA90A1) */ + if (sound_card_current == SOUND_INTERNAL) + device_add(&alc100_device); /* ALC100P identified on similar Acorp boards (694TA, 6VIA90A1) */ return ret; } diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index ca6c957e2..05c0e4644 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -40,6 +40,7 @@ #include <86box/video.h> #include "cpu.h" #include <86box/machine.h> +#include <86box/sound.h> #include <86box/snd_ac97.h> @@ -141,7 +142,8 @@ machine_at_ficva503a_init(const machine_t *model) hwm_values.temperatures[1] += 2; /* System offset */ hwm_values.temperatures[2] = 0; /* unused */ - device_add(&wm9701a_device); /* on daughtercard */ + if (sound_card_current == SOUND_INTERNAL) + device_add(&wm9701a_device); /* on daughtercard */ return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 889d4ce85..731400de0 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -374,7 +374,7 @@ const machine_t machines[] = { /* Apollo MVP3 */ { "[VIA MVP3] AOpen AX59 Pro", "ax59pro", MACHINE_TYPE_SOCKETS7, CPU_PKG_SOCKET5_7, 0, 66666667, 124242424, 1300, 3520, 1.5, 5.5, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_ax59pro_init, NULL }, { "[VIA MVP3] FIC VA-503+", "ficva503p", MACHINE_TYPE_SOCKETS7, CPU_PKG_SOCKET5_7, 0, 66666667, 124242424, 2000, 3200, 1.5, 5.5, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_mvp3_init, NULL }, - { "[VIA MVP3] FIC VA-503A", "ficva503a", MACHINE_TYPE_SOCKETS7, CPU_PKG_SOCKET5_7, 0, 66666667, 124242424, 1800, 3100, 1.5, 5.5, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_ficva503a_init, NULL }, + { "[VIA MVP3] FIC VA-503A", "ficva503a", MACHINE_TYPE_SOCKETS7, CPU_PKG_SOCKET5_7, 0, 66666667, 124242424, 1800, 3100, 1.5, 5.5, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_ficva503a_init, NULL }, /* Socket 8 machines */ /* 450KX */ @@ -459,7 +459,7 @@ const machine_t machines[] = { { "[VIA Apollo Pro 133] ECS P6BAP", "p6bap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1572864, 8192, 255, machine_at_p6bap_init, NULL }, { "[VIA Apollo Pro 133A] BCM GT694VA", "gt694va", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,3145728, 8192, 255, machine_at_gt694va_init, NULL }, { "[VIA Apollo Pro 133A] ASUS CUV4X-LS", "cuv4xls", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, (MACHINE_AGP & ~MACHINE_AT) | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL,16384,4194304, 8192, 255, machine_at_cuv4xls_init, NULL }, - { "[VIA Apollo Pro 133A] Acorp 6VIA90AP", "6via90ap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_GAMEPORT, 16384,3145728, 8192, 255, machine_at_6via90ap_init, NULL }, + { "[VIA Apollo Pro 133A] Acorp 6VIA90AP", "6via90ap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_GAMEPORT,16384,3145728, 8192, 255, machine_at_6via90ap_init, NULL }, /* Miscellaneous/Fake/Hypervisor machines */ { "[i440BX] Microsoft Virtual PC 2007", "vpc2007", MACHINE_TYPE_MISC, CPU_PKG_SLOT1, CPU_BLOCK(CPU_PENTIUM2, CPU_CYRIX3S), 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_vpc2007_init, NULL }, diff --git a/src/sound/snd_ac97_codec.c b/src/sound/snd_ac97_codec.c index e0a27a4e5..b992b0e6a 100644 --- a/src/sound/snd_ac97_codec.c +++ b/src/sound/snd_ac97_codec.c @@ -25,15 +25,63 @@ #include <86box/io.h> #include <86box/snd_ac97.h> -#define AC97_VENDOR_ID(f, s, t, dev) ((((f) & 0xff) << 24) | (((s) & 0xff) << 16) | (((t) & 0xff) << 8) | ((dev) & 0xff)) - enum { - AC97_CODEC_AD1881 = AC97_VENDOR_ID('A', 'D', 'S', 0x40), - AC97_CODEC_ALC100 = AC97_VENDOR_ID('A', 'L', 'C', 0x20), - AC97_CODEC_CS4297 = AC97_VENDOR_ID('C', 'R', 'Y', 0x03), - AC97_CODEC_CS4297A = AC97_VENDOR_ID('C', 'R', 'Y', 0x11), - AC97_CODEC_WM9701A = AC97_VENDOR_ID('W', 'M', 'L', 0x00) + AC97_CODEC_AD1881, + AC97_CODEC_ALC100, + AC97_CODEC_CS4297, + AC97_CODEC_CS4297A, + AC97_CODEC_WM9701A +}; + +static const struct { + const uint32_t vendor_id, max_rate, misc_flags; /* definitions for misc_flags in snd_ac97.h */ + const uint16_t reset_flags, extid_flags, /* definitions in snd_ac97.h */ + powerdown_mask; /* bits [7:0] => register 26 bits [15:8]; bits [11:8] => register 2A bits [14:11] */ + const ac97_vendor_reg_t *vendor_regs; /* bits [11:8] of index are the page number if applicable (registers [60:6F]) */ +} ac97_codecs[] = { + [AC97_CODEC_AD1881] = { + .vendor_id = AC97_VENDOR_ID('A', 'D', 'S', 0x40), + .max_rate = 48000, + .misc_flags = AC97_MASTER_6B | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_POP | AC97_MS | AC97_LPBK, + .reset_flags = (1 << AC97_3D_SHIFT), /* datasheet contradicts itself on AC97_HPOUT */ + .extid_flags = AC97_VRA, + .powerdown_mask = 0x0bf + }, + [AC97_CODEC_ALC100] = { + .vendor_id = AC97_VENDOR_ID('A', 'L', 'C', 0x20), + .max_rate = 48000, + .misc_flags = AC97_AUXOUT | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_POP | AC97_MS | AC97_LPBK, + .reset_flags = (22 << AC97_3D_SHIFT), + .extid_flags = AC97_AMAP, + .powerdown_mask = 0x0bf + }, + [AC97_CODEC_CS4297] = { + .vendor_id = AC97_VENDOR_ID('C', 'R', 'Y', 0x03), + .max_rate = 48000, + .misc_flags = AC97_MASTER_6B | AC97_AUXOUT | AC97_AUXOUT_6B | AC97_MONOOUT | AC97_MONOOUT_6B | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_MS | AC97_LPBK, + .reset_flags = AC97_HPOUT | AC97_DAC_18B | AC97_ADC_18B, + .extid_flags = 0, + .powerdown_mask = 0x07f, + .vendor_regs = (const ac97_vendor_reg_t[]) {{0x05a, 0x0301, 0x0000}, {0}} + }, + [AC97_CODEC_CS4297A] = { + .vendor_id = AC97_VENDOR_ID('C', 'R', 'Y', 0x11), + .max_rate = 48000, + .misc_flags = AC97_MASTER_6B | AC97_AUXOUT | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_MS | AC97_LPBK, + .reset_flags = AC97_HPOUT | AC97_DAC_20B | AC97_ADC_18B | (6 << AC97_3D_SHIFT), + .extid_flags = AC97_AMAP, + .powerdown_mask = 0x0ff, + .vendor_regs = (const ac97_vendor_reg_t[]) {{0x05e, 0x0000, 0x01b0}, {0x060, 0x0023, 0x0001}, {0x068, 0x0000, 0xdfff}, {0}} + }, + [AC97_CODEC_WM9701A] = { + .vendor_id = AC97_VENDOR_ID('W', 'M', 'L', 0x00), + .max_rate = 48000, + .misc_flags = AC97_AUXOUT | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_MS | AC97_LPBK, + .reset_flags = AC97_DAC_18B | AC97_ADC_18B, + .extid_flags = 0, + .powerdown_mask = 0x03f + } }; @@ -56,6 +104,8 @@ ac97_codec_log(const char *fmt, ...) #endif static const int32_t codec_attn[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 25, 32, 41, 51, 65, 82, 103, 130, 164, 206, 260, 327, 412, 519, 653, 822, 1036, 1304, 1641, 2067, 2602, 3276, 4125, 5192, 6537, 8230, 10362, 13044, 16422, 20674, 26027, 32767, 41305, 52068, 65636, 82739, 104299, 131477, 165737, 208925 @@ -66,147 +116,296 @@ int ac97_codec_count = 0, ac97_modem_codec_count = 0, ac97_codec_id = 0, ac97_modem_codec_id = 0; -uint8_t -ac97_codec_read(ac97_codec_t *dev, uint8_t reg) +uint16_t +ac97_codec_readw(ac97_codec_t *dev, uint8_t reg) { - uint8_t ret = dev->regs[reg & 0x7f]; + /* Redirect a read from extended pages 1+ to the right array. */ + reg &= 0x7e; + uint16_t ret = dev->regs[0x24 >> 1] & 0x000f; + if ((ret > 0) && (reg >= 0x60) && (reg < 0x6f)) + ret = (ret <= dev->vendor_reg_page_max) ? dev->vendor_reg_pages[(ret << 3) | ((reg & 0x0e) >> 1)] : 0; + else + ret = dev->regs[reg >> 1]; - ac97_codec_log("AC97 Codec %d: read(%02X) = %02X\n", dev->codec_id, reg, ret); + ac97_codec_log("AC97 Codec %d: readw(%02X) = %04X\n", dev->codec_id, reg, ret); return ret; } void -ac97_codec_write(ac97_codec_t *dev, uint8_t reg, uint8_t val) +ac97_codec_writew(ac97_codec_t *dev, uint8_t reg, uint16_t val) { - uint8_t i; + ac97_codec_log("AC97 Codec %d: writew(%02X, %04X)\n", dev->codec_id, reg, val); - ac97_codec_log("AC97 Codec %d: write(%02X, %02X)\n", dev->codec_id, reg, val); - - reg &= 0x7f; + reg &= 0x7e; + uint16_t i = 0, prev = dev->regs[reg >> 1]; + int j; switch (reg) { - case 0x00: case 0x01: /* Reset / ID code */ + case 0x00: /* Reset / ID code */ ac97_codec_reset(dev); return; - case 0x08: case 0x09: /* Master Tone Control (optional) */ - case 0x0d: /* Phone Volume MSB */ - case 0x0f: /* Mic Volume MSB */ - case 0x1e: case 0x1f: /* Record Gain Mic (optional) */ - case 0x22: case 0x23: /* 3D Control (optional) */ - case 0x24: case 0x25: /* Audio Interrupt and Paging Mechanism (optional) */ - case 0x26: /* Powerdown Ctrl/Stat LSB */ - case 0x28: case 0x29: /* Extended Audio ID */ - case 0x2b: /* Extended Audio Status/Control MSB */ - //case 0x36 ... 0x59: /* Linux tests for audio capability by writing to 38-39 */ - case 0x5a ... 0x5f: /* Vendor Reserved */ - //case 0x60 ... 0x6f: - case 0x70 ... 0x7f: /* Vendor Reserved */ - /* Read-only registers. */ - return; + case 0x02: /* Master Volume */ + val &= 0xbf3f; - case 0x02: /* Master Volume LSB */ - case 0x04: /* Aux Out Volume LSB */ - case 0x06: /* Mono Volume LSB */ - val &= 0x3f; - /* fall-through */ - - case 0x03: /* Master Volume MSB */ - case 0x05: /* Aux Out Volume MSB */ - val &= 0xbf; - - /* Limit level to a maximum of 011111. */ - if (val & 0x20) { - val &= ~0x20; - val |= 0x1f; + /* Convert 1xxxxx to 011111 where unsupported, per specification. */ + if (!(dev->misc_flags & AC97_MASTER_6B)) { +clamp_5b: if (val & 0x2000) + val = (val & ~0x2000) | 0x1f00; +clamp_5b_r: if (val & 0x0020) + val = (val & ~0x0020) | 0x001f; } break; - case 0x07: /* Mono Volume MSB */ - case 0x0b: /* PC Beep Volume MSB */ - case 0x20: /* General Purpose LSB */ - val &= 0x80; + case 0x04: /* Aux Out Volume */ + if (!(dev->misc_flags & AC97_AUXOUT)) + return; + val &= 0xbf3f; + + /* Convert 1xxxxx to 011111 where unsupported, per specification. */ + if (!(dev->misc_flags & AC97_AUXOUT_6B)) + goto clamp_5b; break; - case 0x0a: /* PC Beep Volume LSB */ - val &= 0x1e; + case 0x06: /* Mono Out Volume */ + if (!(dev->misc_flags & AC97_MONOOUT)) + return; + val &= 0x803f; + + /* Convert 1xxxxx to 011111 where unsupported, per specification. */ + if (!(dev->misc_flags & AC97_MONOOUT_6B)) + goto clamp_5b_r; break; - case 0x0c: /* Phone Volume LSB */ - case 0x10: /* Line In Volume LSB */ - case 0x12: /* CD Volume LSB */ - case 0x14: /* Video Volume LSB */ - case 0x16: /* Aux In Volume LSB */ - case 0x18: /* PCM Out Volume LSB */ - val &= 0x1f; + case 0x08: /* Master Tone Control */ + if (!(dev->reset_flags & AC97_TONECTL)) + return; + val &= 0x0f0f; break; - case 0x0e: /* Mic Volume LSB */ - val &= 0x5f; + case 0x0a: /* PC Beep Volume */ + if (dev->misc_flags & AC97_PCBEEP) + i |= 0x801e; + if (dev->misc_flags & AC97_PCBEEP_GEN) + i |= 0x1fe0; + val &= i; break; - case 0x11: /* Line In Volume MSB */ - case 0x13: /* CD Volume MSB */ - case 0x15: /* Video Volume MSB */ - case 0x17: /* Aux In Volume MSB */ - case 0x19: /* PCM Out Volume MSB */ - val &= 0x9f; + case 0x0c: /* Phone Volume */ + if (!(dev->misc_flags & AC97_PHONE)) + return; + val &= 0x801f; break; - case 0x1a: case 0x1b: /* Record Select */ - val &= 0x07; + case 0x0e: /* Mic Volume */ + val &= 0x805f; break; - case 0x1c: /* Record Gain LSB */ - val &= 0x0f; + case 0x10: /* Line In Volume */ + case 0x12: /* CD Volume */ + case 0x18: /* PCM Out Volume */ +line_gain: val &= 0x9f1f; break; - case 0x1d: /* Record Gain MSB */ - val &= 0x8f; + case 0x14: /* Video Volume */ + if (!(dev->misc_flags & AC97_VIDEO)) + return; + goto line_gain; + + case 0x16: /* Aux In Volume */ + if (!(dev->misc_flags & AC97_AUXIN)) + return; + goto line_gain; + + case 0x1a: /* Record Select Control */ + val &= 0x0707; break; - case 0x21: /* General Purpose MSB */ - val &= 0x83; + case 0x1c: /* Record Gain */ + val &= 0x8f0f; break; - case 0x2a: /* Extended Audio Status/Control LSB */ -#ifdef AC97_CODEC_FULL_RATE_RANGE /* enable DRA (double rate) support */ - val &= 0x0b; -#else - val &= 0x09; -#endif + case 0x1e: /* Record Gain Mic */ + if (!(dev->reset_flags & AC97_MICPCM)) + return; + val &= 0x800f; + break; + + case 0x20: /* General Purpose */ + i = AC97_MIX | (dev->misc_flags & (AC97_POP | AC97_MS | AC97_LPBK)); + if (dev->reset_flags >> AC97_3D_SHIFT) + i |= AC97_3D; + if (dev->reset_flags & AC97_SIMSTEREO) + i |= AC97_ST; + if (dev->reset_flags & AC97_LOUDNESS) + i |= AC97_LD; + if (dev->extid_flags & AC97_DRA) + i |= AC97_DRSS_MASK; + val &= i; + break; + + case 0x22: /* 3D Control */ + switch (dev->reset_flags >> AC97_3D_SHIFT) { + case 1: /* Analog Devices */ + case 6: /* Crystal */ + val &= 0x000f; + break; + + case 22: /* Avance Logic / Realtek */ + val &= 0x0003; + break; + + default: + return; + } + break; + + case 0x24: /* Audio Interrupt and Paging Mechanism */ + if ((dev->extid_flags & AC97_REV_MASK) < AC97_REV_2_3) + return; + val &= 0x000f; + break; + + case 0x26: /* Powerdown Control/Status */ + i = dev->powerdown_mask << 8; + val = (val & i) | (prev & ~i); + break; + + case 0x28: /* Extended Audio ID */ + if (dev->misc_flags & AC97_DSA) + i |= 0x0030; + val = (val & i) | (prev & ~i); + break; + + case 0x2a: /* Extended Audio Status/Control */ + i = dev->extid_flags & (AC97_VRA | AC97_DRA | AC97_SPDIF | AC97_VRM); + if (dev->extid_flags & AC97_SPDIF) + i |= AC97_SPSA_MASK << AC97_SPSA_SHIFT; + i |= (dev->powerdown_mask << 3) & 0x7800; /* multichannel powerdowns */ + val = (val & i) | (prev & ~i); + /* Reset DAC sample rates to 48 KHz (96 KHz with DRA) if VRA is being cleared. */ - if (!(val & 0x01)) { + if (!(val & AC97_VRA)) { for (i = 0x2c; i <= 0x30; i += 2) - *((uint16_t *) &dev->regs[i]) = 48000; + dev->regs[i >> 1] = 48000; } /* Reset ADC sample rates to 48 KHz if VRM is being cleared. */ - if (!(val & 0x08)) { + if (!(val & AC97_VRM)) { for (i = 0x32; i <= 0x34; i += 2) - *((uint16_t *) &dev->regs[i]) = 48000; + dev->regs[i >> 1] = 48000; } break; - case 0x2c ... 0x35: /* DAC/ADC Rates */ - /* Writable only if VRA/VRM is set. */ - i = (reg >= 0x32) ? 0x08 : 0x01; - if (!(dev->regs[0x2a] & i)) + case 0x2c: /* PCM Front DAC Rate */ + case 0x32: /* PCM L/R ADC Rate */ +rate: /* Writable only if VRA/VRM is set. */ + i = (reg >= 0x32) ? AC97_VRM : AC97_VRA; + if (!(dev->extid_flags & i)) return; -#ifndef AC97_CODEC_FULL_RATE_RANGE - /* Limit to 48 KHz on MSB write. */ - if ((reg & 1) && (((val << 8) | dev->regs[reg & 0x7e]) > 48000)) { - *((uint16_t *) &dev->regs[reg & 0x7e]) = 48000; + /* Limit to maximum rate. */ + if (val > dev->max_rate) + val = dev->max_rate; + break; + + case 0x2e: /* PCM Surround DAC Rate */ + if (!(dev->extid_flags & AC97_SDAC)) + return; + goto rate; + + case 0x30: /* PCM LFE DAC Rate */ + if (!(dev->extid_flags & AC97_LDAC)) + return; + goto rate; + + case 0x34: /* Mic ADC Rate */ + if (!(dev->reset_flags & AC97_MICPCM)) + return; + goto rate; + + case 0x36: /* Center/LFE Volume */ + if (dev->extid_flags & AC97_LDAC) + i |= 0xbf00; + if (dev->extid_flags & AC97_CDAC) + i |= 0x00bf; + val &= i; + + /* Convert 1xxxxx to 011111 where unsupported, per specification. */ + if (!(dev->misc_flags & AC97_LFE_6B) && (val & 0x2000)) + val = (val & ~0x2000) | 0x1f00; + if (!(dev->misc_flags & AC97_CENTER_6B)) + goto clamp_5b_r; + break; + + case 0x38: /* Surround Volume */ + if (!(dev->extid_flags & AC97_SDAC)) + return; + val &= 0xbfbf; + + /* Convert 1xxxxx to 011111 where unsupported, per specification. */ + if (!(dev->misc_flags & AC97_SURR_6B)) + goto clamp_5b; + break; + + case 0x3a: /* S/PDIF Control */ + if (!(dev->extid_flags & AC97_SPDIF)) + return; + break; + + case 0x60 ... 0x6e: /* Extended */ + /* Get extended register page. */ + i = dev->regs[0x24 >> 1] & 0x000f; + + /* Redirect a write to page 1+ to the right array, part 1. */ + if (i > 0) { + /* Don't overflow the pages. */ + if (i > dev->vendor_reg_page_max) + return; + + /* Get actual previous value. */ + prev = dev->vendor_reg_pages[(i << 3) | ((reg & 0x0e) >> 1)]; + } + + i <<= 8; + /* fall-through */ + + case 0x5a ... 0x5e: /* Vendor Reserved */ + case 0x70 ... 0x7a: + /* Stop if no vendor-specific registers are defined. */ + if (!dev->vendor_regs) + return; + + /* Look for a matching vendor-specific register. */ + i |= reg; + for (j = 0; dev->vendor_regs[j].index; j++) { + /* If a match was found, inject written bits. */ + if (dev->vendor_regs[j].index == i) { + val = (val & dev->vendor_regs[j].write_mask) | (prev & ~dev->vendor_regs[j].write_mask); + break; + } + } + + /* No match found. */ + if (!dev->vendor_regs[j].index) + return; + + /* Redirect a write to page 1+ to the right array, part 2. */ + i >>= 8; + if (i > 0) { + dev->vendor_reg_pages[(i << 3) | ((reg & 0x0e) >> 1)] = val; return; } -#endif break; + + case 0x7c: /* Vendor ID1 */ + case 0x7e: /* Vendor ID2 */ + return; } - dev->regs[reg] = val; + dev->regs[reg >> 1] = val; } @@ -214,38 +413,59 @@ void ac97_codec_reset(void *priv) { ac97_codec_t *dev = (ac97_codec_t *) priv; - uint8_t i; + uint16_t i, j; ac97_codec_log("AC97 Codec %d: reset()\n", dev->codec_id); memset(dev->regs, 0, sizeof(dev->regs)); /* Set default level and gain values. */ - for (i = 0x02; i <= 0x18; i += 2) { - if (i == 0x08) - continue; - if (i >= 0x0c) - dev->regs[i] = 0x08; - dev->regs[i | 1] = (i >= 0x10) ? 0x88 : 0x80; + dev->regs[0x02 >> 1] = AC97_MUTE; + if (dev->misc_flags & AC97_AUXOUT) + dev->regs[0x04 >> 1] = AC97_MUTE; + if (dev->misc_flags & AC97_MONOOUT) + dev->regs[0x06 >> 1] = AC97_MUTE; + if (dev->misc_flags & AC97_PHONE) + dev->regs[0x0c >> 1] = AC97_MUTE | 0x0008; + dev->regs[0x0e >> 1] = AC97_MUTE | 0x0008; /* mic */ + dev->regs[0x10 >> 1] = dev->regs[0x12 >> 1] = dev->regs[0x18 >> 1] = AC97_MUTE | 0x0808; /* line in, CD, PCM out */ + if (dev->misc_flags & AC97_VIDEO) + dev->regs[0x14 >> 1] = AC97_MUTE | 0x0808; + if (dev->misc_flags & AC97_AUXIN) + dev->regs[0x14 >> 1] = AC97_MUTE | 0x0808; + if (dev->misc_flags & AC97_LDAC) + dev->regs[0x36 >> 1] = AC97_MUTE_L; + if (dev->misc_flags & AC97_CDAC) + dev->regs[0x36 >> 1] |= AC97_MUTE_R; + if (dev->misc_flags & AC97_SDAC) + dev->regs[0x38 >> 1] = AC97_MUTE_L | AC97_MUTE_R; + + /* Set flags. */ + dev->regs[0x00 >> 1] = dev->reset_flags; + dev->regs[0x26 >> 1] = 0x000f; /* codec ready */ + dev->regs[0x28 >> 1] = (dev->codec_id << 14) | dev->extid_flags; + ac97_codec_writew(dev, 0x2a, 0x0000); /* reset variable DAC/ADC sample rates */ + i = dev->extid_flags & (AC97_CDAC | AC97_SDAC | AC97_LDAC); + dev->regs[0x2a >> 1] |= i | (i << 5); /* any additional DACs are ready but powered down */ + if (dev->extid_flags & AC97_SPDIF) + dev->regs[0x2a >> 1] |= AC97_SPCV; + if (dev->reset_flags & AC97_MICPCM) + dev->regs[0x2a >> 1] |= AC97_MADC | AC97_PRL; + + /* Set vendor ID. */ + dev->regs[0x7c >> 1] = dev->vendor_id >> 16; + dev->regs[0x7e >> 1] = dev->vendor_id; + + /* Set vendor-specific registers. */ + if (dev->vendor_regs) { + for (j = 0; dev->vendor_regs[j].index; j++) { + i = (dev->vendor_regs[j].index >> 8) & 0x000f; + if (i > 0) + dev->vendor_reg_pages[(i << 3) | (dev->vendor_regs[j].index >> 1)] = dev->vendor_regs[j].value; + else + dev->regs[dev->vendor_regs[j].index >> 1] = dev->vendor_regs[j].value; + } } - - /* Flag codec as ready. */ - dev->regs[0x26] = 0x0f; - - /* Set up variable sample rate support. */ -#ifdef AC97_CODEC_FULL_RATE_RANGE /* enable DRA (double rate) support */ - dev->regs[0x28] = 0x0b; -#else - dev->regs[0x28] = 0x09; -#endif - ac97_codec_write(dev, 0x2a, 0x00); /* reset DAC/ADC sample rates */ - - /* Set codec and vendor IDs. */ - dev->regs[0x29] = (dev->codec_id << 6) | 0x02; - dev->regs[0x7c] = dev->vendor_id >> 16; - dev->regs[0x7d] = dev->vendor_id >> 24; - dev->regs[0x7e] = dev->vendor_id; - dev->regs[0x7f] = dev->vendor_id >> 8; } @@ -253,24 +473,38 @@ void ac97_codec_getattn(void *priv, uint8_t reg, int *l, int *r) { ac97_codec_t *dev = (ac97_codec_t *) priv; - uint8_t r_val = dev->regs[reg], - l_val = dev->regs[reg | 1]; + uint16_t val = dev->regs[reg >> 1]; - if (l_val & 0x80) { /* mute */ + /* Apply full mute and powerdowns. */ + int full_mute = (reg < 0x36); + if ((full_mute && (val & AC97_MUTE)) || /* full mute */ + (dev->regs[0x26 >> 1] & 0x3e00) || /* DAC powerdown */ + ((reg == 0x38) && (dev->regs[0x2a >> 1] & AC97_PRJ))) { /* surround DAC powerdown */ *l = 0; *r = 0; - return; + } else { /* per-channel mute */ + /* Determine attenuation value. */ + uint8_t l_val = val >> 8, r_val = val; + if (reg <= 0x06) { /* 6-bit level */ + *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)]; + } + + /* Apply per-channel mute and center/LFE powerdowns where applicable. */ + if (!full_mute) { + if ((val & AC97_MUTE_L) || /* left mute */ + ((reg == 0x36) && (dev->regs[0x2a >> 1] & AC97_PRK))) /* LFE DAC powerdown */ + *l = 0; + if ((val & AC97_MUTE_R) || /* right mute */ + ((reg == 0x36) && (dev->regs[0x2a >> 1] & AC97_PRI))) /* center DAC powerdown */ + *r = 0; + } } - l_val &= 0x1f; - r_val &= 0x1f; - if (reg < 0x10) { /* 5-bit level (converted from 6-bit on register write) */ - *l = codec_attn[0x1f - l_val]; - *r = codec_attn[0x1f - r_val]; - } else { /* 5-bit gain */ - *l = codec_attn[0x27 - l_val]; - *r = codec_attn[0x27 - r_val]; - } + ac97_codec_log("AC97 Codec %d: getattn(%02X) = %d %d\n", dev->codec_id, reg, *l, *r); } @@ -280,13 +514,11 @@ ac97_codec_getrate(void *priv, uint8_t reg) ac97_codec_t *dev = (ac97_codec_t *) priv; /* Get configured sample rate, which is always 48000 if VRA/VRM is not set. */ - uint32_t ret = *((uint16_t *) &dev->regs[reg]); + uint32_t ret = dev->regs[reg >> 1]; -#ifdef AC97_CODEC_FULL_RATE_RANGE - /* If this is a DAC, double sample rate if DRA is set. */ - if ((reg < 0x32) && (dev->regs[0x2a] & 0x02)) + /* If this is the PCM DAC, double sample rate if DRA is set. */ + if ((reg == 0x2c) && (dev->regs[0x2a >> 1] & AC97_DRA)) ret <<= 1; -#endif ac97_codec_log("AC97 Codec %d: getrate(%02X) = %d\n", dev->codec_id, reg, ret); @@ -300,7 +532,12 @@ ac97_codec_init(const device_t *info) ac97_codec_t *dev = malloc(sizeof(ac97_codec_t)); memset(dev, 0, sizeof(ac97_codec_t)); - dev->vendor_id = info->local; + dev->vendor_id = ac97_codecs[info->local].vendor_id; + dev->max_rate = ac97_codecs[info->local].max_rate; + dev->extid_flags = ac97_codecs[info->local].extid_flags; + dev->misc_flags = ac97_codecs[info->local].misc_flags; + dev->powerdown_mask = ac97_codecs[info->local].powerdown_mask; + dev->vendor_regs = ac97_codecs[info->local].vendor_regs; ac97_codec_log("AC97 Codec %d: init(%c%c%c%02X)\n", ac97_codec_id, (dev->vendor_id >> 24) & 0xff, (dev->vendor_id >> 16) & 0xff, (dev->vendor_id >> 8) & 0xff, dev->vendor_id & 0xff); /* Associate this codec to the current controller. */ @@ -315,6 +552,26 @@ ac97_codec_init(const device_t *info) ac97_codec += sizeof(ac97_codec_t *); dev->codec_id = ac97_codec_id++; + /* Allocate vendor-specific register pages if required. */ + if (dev->vendor_regs) { + /* Get the highest vendor-specific register page number. */ + int i, j; + dev->vendor_reg_page_max = 0; + for (j = 0; dev->vendor_regs[j].index; j++) { + i = (dev->vendor_regs[j].index >> 8) & 0x000f; + if (i > dev->vendor_reg_page_max) + dev->vendor_reg_page_max = i; + } + + /* Allocate pages 1+. */ + if (dev->vendor_reg_page_max > 0) { + ac97_codec_log("AC97 Codec %d: Allocating %d vendor-specific register pages\n", dev->codec_id, dev->vendor_reg_page_max); + i = 16 * dev->vendor_reg_page_max; + dev->vendor_reg_pages = (uint16_t *) malloc(i); + memset(dev->vendor_reg_pages, 0, i); + } + } + /* Initialize codec registers. */ ac97_codec_reset(dev); @@ -329,6 +586,8 @@ ac97_codec_close(void *priv) ac97_codec_log("AC97 Codec %d: close()\n", dev->codec_id); + if (dev->vendor_reg_pages) + free(dev->vendor_reg_pages); free(dev); } diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index 2ca80e538..b44ac9c7c 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -376,19 +376,18 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) if (codec) { /* Read from or write to codec. */ if (val & 0x80) { - if (val & 1) { /* return 0x00 on unaligned reads */ + if (val & 1) { /* return 0x0000 on unaligned reads (real 686B behavior) */ dev->sgd_regs[0x80] = dev->sgd_regs[0x81] = 0x00; } else { - dev->sgd_regs[0x80] = dev->codec_shadow[modem].regs_codec[i][(val & 0x7f)] = ac97_codec_read(codec, val); - dev->sgd_regs[0x81] = dev->codec_shadow[modem].regs_codec[i][(val & 0x7f) | 1] = ac97_codec_read(codec, val | 1); + *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[0x80]) = + ac97_codec_readw(codec, val); } /* Flag data/status/index for this codec as valid. */ - if (val & 0x80) - dev->sgd_regs[0x83] |= 0x02 << (i << 1); + dev->sgd_regs[0x83] |= 0x02 << (i << 1); } else if (!(val & 1)) { /* do nothing on unaligned writes */ - ac97_codec_write(codec, val, dev->codec_shadow[modem].regs_codec[i][(val & 0x7f)] = dev->sgd_regs[0x80]); - ac97_codec_write(codec, val | 1, dev->codec_shadow[modem].regs_codec[i][(val & 0x7f) | 1] = dev->sgd_regs[0x81]); + ac97_codec_writew(codec, val, + *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[0x80])); /* Update primary audio codec state if that codec was written to. */ if (!modem && !i) diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index 4956f7742..49dc2df4f 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -1013,13 +1013,10 @@ es1371_outl(uint16_t port, uint32_t val, void *p) case 0x14: if (val & CODEC_READ) { dev->codec_ctrl &= 0x00ff0000; - val = (val >> 16) & 0x7e; - dev->codec_ctrl |= ac97_codec_read(dev->codec, val); - dev->codec_ctrl |= ac97_codec_read(dev->codec, val | 1) << 8; + dev->codec_ctrl |= ac97_codec_readw(dev->codec, val >> 16); } else { dev->codec_ctrl = val & 0x00ffffff; - ac97_codec_write(dev->codec, (val >> 16) & 0x7e, val & 0xff); - ac97_codec_write(dev->codec, ((val >> 16) & 0x7e) | 1, val >> 8); + ac97_codec_writew(dev->codec, val >> 16, val); ac97_codec_getattn(dev->codec, 0x02, &dev->master_vol_l, &dev->master_vol_r); ac97_codec_getattn(dev->codec, 0x12, &dev->cd_vol_l, &dev->cd_vol_r); diff --git a/src/sound/sound.c b/src/sound/sound.c index 663983738..b223e706a 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -110,6 +110,7 @@ static const SOUND_CARD sound_cards[] = { "sbmcv", &sb_mcv_device }, { "sbpromcv", &sb_pro_mcv_device }, { "es1371", &es1371_device }, + { "ad1881", &ad1881_device }, { "cs4297a", &cs4297a_device }, { "", NULL } }; From c4bb7e79a7367e08bfbc60f1d64bef82d9ac9c56 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 12 Nov 2021 15:16:19 -0300 Subject: [PATCH 058/159] Upgrade build script to 8-character git hashes per the old system --- .ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/build.sh b/.ci/build.sh index ddd90d6b8..14028d556 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -67,7 +67,7 @@ build() { local job_name=$JOB_BASE_NAME local build_type=$BUILD_TYPE local build_number=$BUILD_NUMBER - local git_hash=$(echo $GIT_COMMIT | cut -c1-7) + local git_hash=$(echo $GIT_COMMIT | cut -c1-8) local arch=$1 shift local cmake_flags=$* From b4f5ff7ad156ef450aed1ad0293fe59e226dcd7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Fri, 12 Nov 2021 22:41:01 +0100 Subject: [PATCH 059/159] Separate language dialog, and minor language fixes --- src/include/86box/resource.h | 9 ++- src/include/86box/win.h | 3 + src/win/CMakeLists.txt | 2 +- src/win/Makefile.mingw | 2 +- src/win/languages/en-US.rc | 24 +++++- src/win/languages/hu-HU.rc | 67 ++++++++++------- src/win/win_lang.c | 142 +++++++++++++++++++++++++++++++++++ src/win/win_ui.c | 4 + 8 files changed, 221 insertions(+), 32 deletions(-) create mode 100644 src/win/win_lang.c diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index eaadaccd6..306a9c839 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -29,6 +29,7 @@ #define DLG_SND_GAIN 103 /* top-level dialog */ #define DLG_NEW_FLOPPY 104 /* top-level dialog */ #define DLG_SPECIFY_DIM 105 /* top-level dialog */ +#define DLG_PROG_SETT 106 /* top-level dialog */ #define DLG_CONFIG 110 /* top-level dialog */ #define DLG_CFG_MACHINE 111 /* sub-dialog of config */ #define DLG_CFG_VIDEO 112 /* sub-dialog of config */ @@ -122,7 +123,6 @@ #define IDC_RADIO_TS_DISABLED 1006 #define IDC_RADIO_TS_LOCAL 1007 #define IDC_RADIO_TS_UTC 1008 -#define IDC_COMBO_LANG 1009 #define IDC_COMBO_MACHINE_TYPE 1010 #define IDC_COMBO_MACHINE 1011 /* machine/cpu config */ @@ -264,6 +264,11 @@ #define IDC_COMBO_DISK_SIZE 1201 #define IDC_COMBO_RPM_MODE 1202 +#define IDC_COMBO_LANG 1009 /* change language dialog */ +#define IDC_CHECKBOX_GLOBAL 1300 +#define IDC_BUTTON_SYSTEM 1301 +#define IDC_BUTTON_DEFAULT 1302 + /* For the DeviceConfig code, re-do later. */ #define IDC_CONFIG_BASE 1300 #define IDC_CONFIGURE_VID 1300 @@ -351,6 +356,8 @@ #define IDM_DISCORD 40090 #endif +#define IDM_VID_PROG_SETT 40091 + #if defined(DEV_BRANCH) && defined(USE_OPENGL) #define IDM_VID_GL_FPS_BLITTER 40100 #define IDM_VID_GL_FPS_25 40101 diff --git a/src/include/86box/win.h b/src/include/86box/win.h index da4d9fb05..33e55f1d4 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -184,6 +184,9 @@ extern void NewFloppyDialogCreate(HWND hwnd, int id, int part); /* Functions in win_specify_dim.c: */ extern void SpecifyDimensionsDialogCreate(HWND hwnd); +/* Functions in win_lang.c: */ +extern void ProgSettDlgCreate(HWND hwnd); + /* Functions in win_settings.c: */ #define SETTINGS_PAGE_MACHINE 0 diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index e1b3fd942..727644f7b 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -20,7 +20,7 @@ add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_thread.c add_library(ui OBJECT win_ui.c win_stbar.c win_sdl.c win_dialog.c win_about.c win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.c win_new_floppy.c - win_jsconf.c win_media_menu.c 86Box.rc) + win_jsconf.c win_media_menu.c win_lang.c 86Box.rc) if(MSVC) # MSVC complains when we include the manifest from 86Box.rc... diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 90ef6136a..ddafd98d0 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -444,7 +444,7 @@ else UIOBJ := win_ui.o win_stbar.o \ win_sdl.o \ win_dialog.o win_about.o \ - win_settings.o win_devconf.o win_snd_gain.o win_specify_dim.o \ + win_settings.o win_devconf.o win_snd_gain.o win_specify_dim.o win_lang.o \ win_new_floppy.o win_jsconf.o win_media_menu.o endif diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index e08aad513..4c7460213 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -18,14 +18,14 @@ BEGIN MENUITEM "&Keyboard requires capture", IDM_ACTION_KBD_REQ_CAPTURE MENUITEM "&Right CTRL is left ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR - MENUITEM "&Hard Reset", IDM_ACTION_HRESET + MENUITEM "&Hard Reset...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Pause", IDM_ACTION_PAUSE MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_ACTION_EXIT + MENUITEM "E&xit...", IDM_ACTION_EXIT END POPUP "&View" BEGIN @@ -47,7 +47,7 @@ BEGIN #endif END MENUITEM SEPARATOR - MENUITEM "Specify dimensions", IDM_VID_SPECIFY_DIM + MENUITEM "Specify dimensions...", IDM_VID_SPECIFY_DIM MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 POPUP "&Window scale factor" BEGIN @@ -62,6 +62,7 @@ BEGIN MENUITEM "&Linear", IDM_VID_FILTER_LINEAR END MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI + MENUITEM "Dis&play language...", IDM_VID_PROG_SETT MENUITEM SEPARATOR MENUITEM "&Fullscreen\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN POPUP "Fullscreen &stretch mode" @@ -268,6 +269,23 @@ END // // Dialog // + +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 286, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Change Display Language" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK", IDOK, 166, 64, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 222, 64, 50, 14 + COMBOBOX IDC_COMBO_LANG, 10, 18, 266, 16, CBS_DROPDOWNLIST | CBS_HASSTRINGS +#if 0 + AUTOCHECKBOX "Use these settings as global &defaults", IDC_CHECKBOX_GLOBAL, 8, 67, 152, 8 +#endif + PUSHBUTTON "&System Language", IDC_BUTTON_SYSTEM, 120, 35, 82, 14 + PUSHBUTTON "&Default", IDC_BUTTON_DEFAULT, 206, 35, 60, 14 + LTEXT "Language:", 0, 9, 8, 34, 8 +END + DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Status" diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index bd9e7425a..4604fcb91 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -21,14 +21,14 @@ BEGIN MENUITEM "A &billentyűzet elfogást igényel", IDM_ACTION_KBD_REQ_CAPTURE MENUITEM "A &jobb oldali CTRL a bal ALT", IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR - MENUITEM "Hardveres &újraindítás", IDM_ACTION_HRESET + MENUITEM "Hardveres &újraindítás...", IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR MENUITEM "&Szüneteltetés", IDM_ACTION_PAUSE MENUITEM SEPARATOR - MENUITEM "&Kilépés", IDM_ACTION_EXIT + MENUITEM "&Kilépés...", IDM_ACTION_EXIT END POPUP "&Nézet" BEGIN @@ -50,7 +50,7 @@ BEGIN #endif END MENUITEM SEPARATOR - MENUITEM "Méretek kézi megadása", IDM_VID_SPECIFY_DIM + MENUITEM "Méretek kézi megadása...", IDM_VID_SPECIFY_DIM MENUITEM "&Rögzített 4:3 képarány", IDM_VID_FORCE43 POPUP "&Ablak méretezési tényező" BEGIN @@ -65,6 +65,7 @@ BEGIN MENUITEM "&Lineáris", IDM_VID_FILTER_LINEAR END MENUITEM "Hi&DPI méretezés", IDM_VID_HIDPI + MENUITEM "&Nyelvi beállítások...", IDM_VID_PROG_SETT MENUITEM SEPARATOR MENUITEM "&Teljes képernyő\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN POPUP "Teljes képernyős &méretezés" @@ -271,6 +272,22 @@ END // // Dialog // +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 286, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Nyelvi beállítások" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK", IDOK, 166, 64, 50, 14 + PUSHBUTTON "Mégse", IDCANCEL, 222, 64, 50, 14 + COMBOBOX IDC_COMBO_LANG, 10, 18, 266, 16, CBS_DROPDOWNLIST | CBS_HASSTRINGS +#if 0 + AUTOCHECKBOX "Ezen beállítások használata mint alapérték", IDC_CHECKBOX_GLOBAL, 8, 67, 152, 8 +#endif + PUSHBUTTON "A &rendszer nyelve", IDC_BUTTON_SYSTEM, 120, 35, 82, 14 + PUSHBUTTON "&Alapértelmezett", IDC_BUTTON_DEFAULT, 206, 35, 60, 14 + LTEXT "Nyelv:", 0, 9, 8, 34, 8 +END + DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Status" @@ -328,25 +345,23 @@ BEGIN WS_TABSTOP END -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 203, 66 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Főablak méreteinek megadása" FONT 9, "Segoe UI" BEGIN - LTEXT "Szél.:",IDT_1709,7,9,24,12 - EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Szélesség:",IDT_1709,7, 9, 34, 12 + EDITTEXT IDC_EDIT_WIDTH,44, 7, 45, 12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, - 12,12 - LTEXT "Mag.:",IDT_1710,97,9,24,12 - EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS, 87, 6, 10, 12 + LTEXT "Magasság:",IDT_1710,103, 8, 35, 12 + EDITTEXT IDC_EDIT_HEIGHT, 140, 7, 45, 12 ,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, - 12,12 - CONTROL "Rögzítés erre a méretre",IDC_CHECK_LOCK_SIZE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 - DEFPUSHBUTTON "OK",IDOK,30,45,50,14 - PUSHBUTTON "Mégse",IDCANCEL,99,45,50,14 + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,183, 6, 10, 12 + CONTROL "Rögzítés a megadott méretre",IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7, 26, 123, 10 + DEFPUSHBUTTON "OK",IDOK,42, 45, 50, 14 + PUSHBUTTON "Mégse",IDCANCEL,112, 45, 50, 14 END DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 @@ -371,20 +386,20 @@ BEGIN LTEXT "FPU-egység:",IDT_1707,7,66,59,10 COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Várakozási cikl.:",IDT_1703,7,85,60,10 + LTEXT "Várak. ciklusok:",IDT_1703,7,85,60,10 EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, 12,12 LTEXT "MB",IDT_1705,123,104,10,10 LTEXT "Memória:",IDT_1706,7,104,30,10 - GROUPBOX "Idő szinkronizáció",IDC_TIME_SYNC,7,135,100,56 + GROUPBOX "Idő szinkronizáció",IDC_TIME_SYNC,7,135,114,56 CONTROL "Letiltva",IDC_RADIO_TS_DISABLED,"Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 - CONTROL "Engedély. (helyi idő)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 - CONTROL "Engedély. (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 + CONTROL "Engedélyezve (helyi idő)", IDC_RADIO_TS_LOCAL,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,102,10 + CONTROL "Engedélyezve (UTC)", IDC_RADIO_TS_UTC,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,102,10 #ifdef USE_DYNAREC CONTROL "Dinamikus újrafordítás",IDC_CHECK_DYNAREC,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 @@ -594,9 +609,9 @@ BEGIN EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Szektorok:",IDT_1726,154,35,27,10 - LTEXT "Fejek:",IDT_1727,81,35,29,8 - LTEXT "Cilinderek:",IDT_1728,7,35,32,12 + LTEXT "Szektor:",IDT_1726,154,35,27,10 + LTEXT "Fej:",IDT_1727,81,35,29,8 + LTEXT "Cilinder:",IDT_1728,7,35,32,12 LTEXT "Méret (MB):",IDT_1729,7,54,33,8 LTEXT "Típus:",IDT_1730,86,54,24,8 LTEXT "Fájlnév:",IDT_1731,7,7,204,9 @@ -682,7 +697,7 @@ BEGIN LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,137,253,60 LTEXT "ZIP-meghajtók:",IDT_1759,7,127,253,8 - COMBOBOX IDC_COMBO_ZIP_BUS,33,205,90,12,CBS_DROPDOWNLIST | + COMBOBOX IDC_COMBO_ZIP_BUS,33, 205, 84, 14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Busz:",IDT_1753,7,207,24,8 COMBOBOX IDC_COMBO_ZIP_ID,170,205,90,12,CBS_DROPDOWNLIST | diff --git a/src/win/win_lang.c b/src/win/win_lang.c new file mode 100644 index 000000000..8c69048ab --- /dev/null +++ b/src/win/win_lang.c @@ -0,0 +1,142 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Handle the dialog for specifying the dimensions of the main window. + * + * + * + * Authors: Laci bá' + * + * Copyright 2021 Laci bá' + */ +#define UNICODE +#define BITMAP WINDOWS_BITMAP +#include +#include +#undef BITMAP +#include +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/config.h> +#include <86box/plat.h> +#include <86box/sound.h> +#include <86box/win.h> + +/* Language */ +static LCID temp_language; + +int enum_helper, c; + +BOOL CALLBACK +EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam) +{ + wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1]; + LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0); + wchar_t dispname[MAX_PATH + 1]; + GetLocaleInfoEx(temp, LOCALE_SENGLISHDISPLAYNAME, dispname, MAX_PATH); + SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)dispname); + SendMessage((HWND)lParam, CB_SETITEMDATA, c, (LPARAM)wIDLanguage); + + pclog("widl: %u, langid: %u, c: %u\n", wIDLanguage, lang_id, c); + if (wIDLanguage == lang_id) + enum_helper = c; + c++; + + return 1; +} + +/* Load available languages */ +static void +progsett_fill_languages(HWND hdlg) +{ + temp_language = GetThreadUILanguage(); + HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG); + + SendMessage(lang_combo, CB_RESETCONTENT, 0, 0); + + enum_helper = -1; c = 0; + EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo); + pclog("enum_helper is %d\n", enum_helper); + + SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0); + pclog("win_fill_languages\n"); +} + +/* This returns 1 if any variable has changed, 0 if not. */ +static int +progsett_settings_changed(void) +{ + int i = 0; + + /* Language */ + i = i || has_language_changed(temp_language); + + return i; +} + +/* This saves the settings back to the global variables. */ +static void +progsett_settings_save(void) +{ + /* Language */ + set_language(temp_language); +} + +#if defined(__amd64__) || defined(__aarch64__) +static LRESULT CALLBACK +#else +static BOOL CALLBACK +#endif +ProgSettDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + case WM_INITDIALOG: + /* Language */ + temp_language = lang_id; + pclog("temp_language is %u\n", lang_id); + progsett_fill_languages(hdlg); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + if (progsett_settings_changed()) + progsett_settings_save(); + EndDialog(hdlg, 0); + return TRUE; + + case IDCANCEL: + EndDialog(hdlg, 0); + return TRUE; + + case IDC_COMBO_LANG: + if (HIWORD(wParam) == CBN_SELCHANGE) { + HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG); + int index = SendMessage(combo, CB_GETCURSEL, 0, 0); + temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0); + pclog("combobox changed -> temp_language = %u", temp_language); + } + default: + break; + } + break; + } + + return(FALSE); +} + + +void +ProgSettDlgCreate(HWND hwnd) +{ + DialogBox(hinstance, (LPCTSTR)DLG_PROG_SETT, hwnd, ProgSettDlgProcedure); +} diff --git a/src/win/win_ui.c b/src/win/win_ui.c index a099489aa..57ef417a2 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -810,6 +810,10 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) doresize = 1; config_save(); break; + + case IDM_VID_PROG_SETT: + ProgSettDlgCreate(hwnd); + break; case IDM_VID_SPECIFY_DIM: SpecifyDimensionsDialogCreate(hwnd); From 0bab2e144ac17d08117a5ded552ac3e49e0c840f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Fri, 12 Nov 2021 22:41:30 +0100 Subject: [PATCH 060/159] Reinit media menu, and store the system language too --- src/include/86box/86box.h | 2 ++ src/win/win.c | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index a49fb198f..abfaf5d21 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -65,6 +65,8 @@ extern "C" { #endif /* Global variables. */ +extern uint32_t lang_sys; /* (-) system language code */ + extern int dump_on_exit; /* (O) dump regs on exit*/ extern int do_dump_config; /* (O) dump cfg after load */ extern int start_in_fullscreen; /* (O) start in fullscreen */ diff --git a/src/win/win.c b/src/win/win.c index 1aa25a8c9..88f48b958 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -67,7 +67,7 @@ typedef struct { /* Platform Public data, specific. */ HINSTANCE hinstance; /* application instance */ HANDLE ghMutex; -uint32_t lang_id; /* current language ID used */ +uint32_t lang_id, lang_sys; /* current and system language ID */ DWORD dwSubLangID; int acp_utf8; /* Windows supports UTF-8 codepage */ volatile int cpu_thread_run = 1; @@ -260,10 +260,14 @@ set_language(uint32_t id) lang_id = id; SetThreadUILanguage(lang_id); - SetMenu(hwndMain, LoadMenu(hinstance, L"MainMenu")); - /* Load the strings table for this ID. */ LoadCommonStrings(); + + /* Reload main menu */ + SetMenu(hwndMain, LoadMenu(hinstance, L"MainMenu")); + + /* Re-init media menu */ + media_menu_init(); } } @@ -466,7 +470,8 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) sprintf(emu_version, "%s v%s", EMU_NAME, EMU_VERSION); /* First, set our (default) language. */ - set_language(GetThreadUILanguage()); + lang_sys = GetThreadUILanguage(); + set_language(lang_sys); /* Process the command line for options. */ argc = ProcessCommandLine(&argv); From 80c01b9bfed353182e4177f6f1854177181d2b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Fri, 12 Nov 2021 22:43:18 +0100 Subject: [PATCH 061/159] Settings dialog cleanup --- src/win/languages/en-US.rc | 3 --- src/win/languages/hu-HU.rc | 3 --- src/win/win_settings.c | 55 -------------------------------------- 3 files changed, 61 deletions(-) diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 4c7460213..cf5956691 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -338,9 +338,6 @@ BEGIN CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 - LTEXT "Language:",IDT_1700,7,237,41,10 - COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP END DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 4604fcb91..84f4b4ecf 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -340,9 +340,6 @@ BEGIN CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 - LTEXT "Nyelv:",IDT_1700,7,237,41,10 - COMBOBOX IDC_COMBO_LANG,48,236,108,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP END DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 203, 66 diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 1a1aa12a1..3f3b4511d 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -78,9 +78,6 @@ static int first_cat = 0; static int dpi = 96; -/* Language */ -static LCID temp_language; - /* Machine category */ static int temp_machine_type, temp_machine, temp_cpu, temp_wait_states, temp_fpu, temp_sync; static cpu_family_t *temp_cpu_f; @@ -319,40 +316,6 @@ settings_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn return(i); } -int enum_helper, c; - -BOOL CALLBACK -EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam) -{ - wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1]; - LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0); - SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)temp); - SendMessage((HWND)lParam, CB_SETITEMDATA, c, (LPARAM)wIDLanguage); - - pclog("widl: %u, langid: %u, c: %u\n", wIDLanguage, lang_id, c); - if (wIDLanguage == lang_id) - enum_helper = c; - c++; - - return 1; -} - -/* Load available languages */ -static void -win_fill_languages(HWND hdlg) -{ - temp_language = GetThreadUILanguage(); - HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG); - - SendMessage(lang_combo, CB_RESETCONTENT, 0, 0); - - enum_helper = -1; c = 0; - EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo); - pclog("enum_helper is %d\n", enum_helper); - - SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0); - pclog("win_fill_languages\n"); -} /* This does the initial read of global variables into the temporary ones. */ static void @@ -360,11 +323,6 @@ win_settings_init(void) { int i = 0; - /* Language */ - temp_language = lang_id; - pclog("temp_language is %u\n", lang_id); - win_fill_languages(hwndParentDialog); - /* Machine category */ temp_machine_type = machines[machine].type; temp_machine = machine; @@ -490,9 +448,6 @@ win_settings_changed(void) { int i = 0, j = 0; - /* Language */ - i = i || has_language_changed(temp_language); - /* Machine category */ i = i || (machine != temp_machine); i = i || (cpu_f != temp_cpu_f); @@ -583,9 +538,6 @@ win_settings_save(void) pc_reset_hard_close(); - /* Language */ - set_language(temp_language); - /* Machine category */ machine = temp_machine; cpu_f = temp_cpu_f; @@ -5238,13 +5190,6 @@ win_settings_main_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) EndDialog(hdlg, 0); win_notify_dlg_closed(); return TRUE; - case IDC_COMBO_LANG: - if (HIWORD(wParam) == CBN_SELCHANGE) { - HWND combo = GetDlgItem(hwndParentDialog, IDC_COMBO_LANG); - int index = SendMessage(combo, CB_GETCURSEL, 0, 0); - temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0); - pclog("combobox changed -> temp_language = %u", temp_language); - } } break; From a6493147981a3097a18ee57f7ac3f7f8d8730a4c Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 12 Nov 2021 20:33:43 -0300 Subject: [PATCH 062/159] VIA AC97: Move some variables to SGD structure to ease future expansion --- src/sound/snd_ac97_via.c | 102 ++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 54 deletions(-) diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index b44ac9c7c..de12edf75 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -39,7 +39,12 @@ typedef struct { int32_t sample_count; uint8_t entry_flags, fifo[32], restart; - pc_timer_t timer; + int16_t out_l, out_r; + int vol_l, vol_r, pos; + int32_t buffer[SOUNDBUFLEN * 2]; + uint64_t timer_latch; + + pc_timer_t dma_timer, poll_timer; } ac97_via_sgd_t; typedef struct _ac97_via_ { @@ -56,12 +61,7 @@ typedef struct _ac97_via_ { ac97_codec_t *codec[2][2]; ac97_via_sgd_t sgd[6]; - pc_timer_t timer_count, timer_count_fm; - uint64_t timer_latch, timer_latch_fm; - int16_t out_l, out_r, fm_out_l, fm_out_r; - int master_vol_l, master_vol_r, pcm_vol_l, pcm_vol_r, cd_vol_l, cd_vol_r; - int32_t buffer[SOUNDBUFLEN * 2], fm_buffer[SOUNDBUFLEN * 2]; - int pos, fm_pos; + int master_vol_l, master_vol_r, cd_vol_l, cd_vol_r; } ac97_via_t; @@ -142,13 +142,13 @@ 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->timer_count, dev->timer_latch); + timer_advance_u64(&dev->sgd[0].poll_timer, dev->sgd[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->timer_count_fm, dev->timer_latch); + timer_advance_u64(&dev->sgd[2].poll_timer, dev->sgd[2].timer_latch); dev->fm_enabled = i; /* Update primary audio codec state. */ @@ -183,7 +183,7 @@ ac97_via_update_codec(ac97_via_t *dev) /* 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->pcm_vol_l, &dev->pcm_vol_r); + ac97_codec_getattn(codec, 0x18, &dev->sgd[0].vol_l, &dev->sgd[0].vol_r); 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. */ @@ -503,10 +503,10 @@ ac97_via_remap_modem_codec(void *priv, uint16_t new_io_base, uint8_t enable) static void -ac97_via_update(ac97_via_t *dev) +ac97_via_update_stereo(ac97_via_t *dev, ac97_via_sgd_t *sgd) { - int32_t l = (((dev->out_l * dev->pcm_vol_l) >> 15) * dev->master_vol_l) >> 15, - r = (((dev->out_r * dev->pcm_vol_r) >> 15) * dev->master_vol_r) >> 15; + int32_t l = (((sgd->out_l * sgd->vol_l) >> 15) * dev->master_vol_l) >> 15, + r = (((sgd->out_r * sgd->vol_r) >> 15) * dev->master_vol_r) >> 15; if (l < -32768) l = -32768; @@ -517,19 +517,9 @@ ac97_via_update(ac97_via_t *dev) else if (r > 32767) r = 32767; - for (; dev->pos < sound_pos_global; dev->pos++) { - dev->buffer[dev->pos*2] = l; - dev->buffer[dev->pos*2 + 1] = r; - } -} - - -static void -ac97_via_update_fm(ac97_via_t *dev) -{ - for (; dev->fm_pos < sound_pos_global; dev->fm_pos++) { - dev->fm_buffer[dev->fm_pos*2] = dev->fm_out_l; - dev->fm_buffer[dev->fm_pos*2 + 1] = dev->fm_out_r; + for (; sgd->pos < sound_pos_global; sgd->pos++) { + sgd->buffer[sgd->pos*2] = l; + sgd->buffer[sgd->pos*2 + 1] = r; } } @@ -546,7 +536,7 @@ ac97_via_sgd_process(void *priv) return; /* Schedule next run. */ - timer_on_auto(&sgd->timer, 10.0); + timer_on_auto(&sgd->dma_timer, 10.0); /* Process SGD if it's active, and the FIFO has room or is disabled. */ if ((sgd_status == 0x80) && (sgd->always_run || ((sgd->fifo_end - sgd->fifo_pos) <= (sizeof(sgd->fifo) - 4)))) { @@ -652,38 +642,38 @@ ac97_via_sgd_process(void *priv) static void -ac97_via_poll(void *priv) +ac97_via_poll_stereo(void *priv) { ac97_via_t *dev = (ac97_via_t *) priv; ac97_via_sgd_t *sgd = &dev->sgd[0]; /* Audio Read */ /* Schedule next run if PCM playback is enabled. */ if (dev->pcm_enabled) - timer_advance_u64(&dev->timer_count, dev->timer_latch); + timer_advance_u64(&sgd->poll_timer, sgd->timer_latch); - /* Update audio buffer. */ - ac97_via_update(dev); + /* Update stereo audio buffer. */ + ac97_via_update_stereo(dev, sgd); /* Feed next sample from the FIFO. */ - switch (dev->sgd_regs[0x02] & 0x30) { + switch (dev->sgd_regs[sgd->id | 0x2] & 0x30) { case 0x00: /* Mono, 8-bit PCM */ if ((sgd->fifo_end - sgd->fifo_pos) >= 1) { - dev->out_l = dev->out_r = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8; + sgd->out_l = sgd->out_r = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8; return; } break; case 0x10: /* Stereo, 8-bit PCM */ if ((sgd->fifo_end - sgd->fifo_pos) >= 2) { - dev->out_l = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8; - dev->out_r = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8; + sgd->out_l = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8; + sgd->out_r = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8; return; } break; case 0x20: /* Mono, 16-bit PCM */ if ((sgd->fifo_end - sgd->fifo_pos) >= 2) { - dev->out_l = dev->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_l = sgd->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; return; } @@ -691,9 +681,9 @@ ac97_via_poll(void *priv) case 0x30: /* Stereo, 16-bit PCM */ if ((sgd->fifo_end - sgd->fifo_pos) >= 4) { - dev->out_l = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_l = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; - dev->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; return; } @@ -701,7 +691,7 @@ ac97_via_poll(void *priv) } /* Feed silence if the FIFO is empty. */ - dev->out_l = dev->out_r = 0; + sgd->out_l = sgd->out_r = 0; } @@ -713,23 +703,23 @@ ac97_via_poll_fm(void *priv) /* Schedule next run if FM playback is enabled. */ if (dev->fm_enabled) - timer_advance_u64(&dev->timer_count_fm, dev->timer_latch_fm); + timer_advance_u64(&sgd->poll_timer, sgd->timer_latch); /* Update FM audio buffer. */ - ac97_via_update_fm(dev); + ac97_via_update_stereo(dev, sgd); /* Feed next sample from the FIFO. The data format is not documented, but it probes as 16-bit stereo at 24 KHz. */ if ((sgd->fifo_end - sgd->fifo_pos) >= 4) { - dev->out_l = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_l = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; - dev->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; return; } /* Feed silence if the FIFO is empty. */ - dev->fm_out_l = dev->fm_out_r = 0; + sgd->out_l = sgd->out_r = 0; } @@ -738,15 +728,15 @@ ac97_via_get_buffer(int32_t *buffer, int len, void *priv) { ac97_via_t *dev = (ac97_via_t *) priv; - ac97_via_update(dev); - ac97_via_update_fm(dev); + ac97_via_update_stereo(dev, &dev->sgd[0]); + ac97_via_update_stereo(dev, &dev->sgd[2]); for (int c = 0; c < len * 2; c++) { - buffer[c] += dev->buffer[c] / 2; - buffer[c] += dev->fm_buffer[c] / 2; + buffer[c] += dev->sgd[0].buffer[c] / 2; + buffer[c] += dev->sgd[2].buffer[c] / 2; } - dev->pos = dev->fm_pos = 0; + dev->sgd[0].pos = dev->sgd[2].pos = 0; } @@ -773,8 +763,8 @@ ac97_via_speed_changed(void *priv) else freq = 48000.0; - dev->timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / freq)); - dev->timer_latch_fm = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 24000.0)); + 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)); } @@ -801,12 +791,16 @@ ac97_via_init(const device_t *info) if ((i != 0) && (i != 2)) dev->sgd[i].always_run = 1; - timer_add(&dev->sgd[i].timer, ac97_via_sgd_process, &dev->sgd[i], 0); + /* No volume control on FM SGD that I know of. */ + if (i == 2) + dev->sgd[i].vol_l = dev->sgd[i].vol_r = 32767; + + timer_add(&dev->sgd[i].dma_timer, ac97_via_sgd_process, &dev->sgd[i], 0); } /* Set up playback pollers. */ - timer_add(&dev->timer_count, ac97_via_poll, dev, 0); - timer_add(&dev->timer_count_fm, ac97_via_poll_fm, dev, 0); + 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); ac97_via_speed_changed(dev); /* Set up playback handler. */ From f237e470228c6315b1c5c7ce9877da9d31243e93 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 12 Nov 2021 20:48:49 -0300 Subject: [PATCH 063/159] Add onboard ES1371 to two machines where it was missed --- src/machine/m_at_slot1.c | 13 ++++--------- src/machine/m_at_socket370.c | 10 ++++++++++ src/machine/machine_table.c | 4 ++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 050ea233c..7f41ea380 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -468,17 +468,16 @@ machine_at_s1846_init(const machine_t *model) pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&piix4e_device); + device_add(&pc87309_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&intel_flash_bxt_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 256); if (sound_card_current == SOUND_INTERNAL) { device_add(&es1371_onboard_device); device_add(&cs4297_device); /* found on other Tyan boards around the same time */ } - device_add(&pc87309_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&intel_flash_bxt_device); - spd_register(SPD_TYPE_SDRAM, 0x7, 256); - return ret; } @@ -691,10 +690,6 @@ machine_at_ms6168_common_init(const machine_t *model) int machine_at_borapro_init(const machine_t *model) { - /* AMI 440ZX Board. Packard Bell OEM of the MSI MS-6168 - MIGHT REQUIRE MORE EXCESSIVE TESTING! - Reports emmersive amounts of RAM like few Intel OEM boards - we have. */ int ret; ret = bios_load_linear("roms/machines/borapro/MS6168V2.50", diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index 4475ee984..69b54540f 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -105,6 +105,11 @@ machine_at_s1857_init(const machine_t *model) device_add(&w83977f_370_device); device_add(&intel_flash_bxt_device); + if (sound_card_current == SOUND_INTERNAL) { + device_add(&es1371_onboard_device); + device_add(&cs4297_device); /* found on other Tyan boards around the same time */ + } + return ret; } @@ -377,6 +382,11 @@ machine_at_gt694va_init(const machine_t *model) hwm_values.fans[2] = 0; /* unused */ hwm_values.temperatures[2] = 0; /* unused */ + if (sound_card_current == SOUND_INTERNAL) { + device_add(&es1371_onboard_device); + device_add(&cs4297_device); /* assumed */ + } + return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 731400de0..6e7c1fb00 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -446,7 +446,7 @@ const machine_t machines[] = { { "[i440BX] AEWIN AW-O671R", "awo671r", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, /* limits assumed */ MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_awo671r_init, NULL }, { "[i440BX] ASUS CUBX", "cubx", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_cubx_init, NULL }, { "[i440BX] AmazePC AM-BX133", "ambx133", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, /* limits assumed */ MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_ambx133_init, NULL }, - { "[i440BX] Tyan Trinity 371", "s1857", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_s1857_init, NULL }, + { "[i440BX] Tyan Trinity 371", "s1857", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SOUND, 8192, 786432, 8192, 255, machine_at_s1857_init, NULL }, /* 440ZX */ { "[i440ZX] Soltek SL-63A1", "63a1", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_63a1_init, NULL }, @@ -457,7 +457,7 @@ const machine_t machines[] = { /* VIA Apollo Pro */ { "[VIA Apollo Pro] PC Partner APAS3", "apas3", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_apas3_init, NULL }, { "[VIA Apollo Pro 133] ECS P6BAP", "p6bap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1572864, 8192, 255, machine_at_p6bap_init, NULL }, - { "[VIA Apollo Pro 133A] BCM GT694VA", "gt694va", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,3145728, 8192, 255, machine_at_gt694va_init, NULL }, + { "[VIA Apollo Pro 133A] BCM GT694VA", "gt694va", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SOUND, 16384,3145728, 8192, 255, machine_at_gt694va_init, NULL }, { "[VIA Apollo Pro 133A] ASUS CUV4X-LS", "cuv4xls", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, (MACHINE_AGP & ~MACHINE_AT) | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL,16384,4194304, 8192, 255, machine_at_cuv4xls_init, NULL }, { "[VIA Apollo Pro 133A] Acorp 6VIA90AP", "6via90ap", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_GAMEPORT,16384,3145728, 8192, 255, machine_at_6via90ap_init, NULL }, From e152eee822fe2394806cefc609c0cafe904df0b1 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 12 Nov 2021 20:52:07 -0300 Subject: [PATCH 064/159] ci: Make some build script variables local as they should be --- .ci/build.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 14028d556..d73a89af0 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -108,8 +108,8 @@ build() { if is_windows then # Switch into the correct MSYSTEM if required. - msys=MINGW$arch - [ ! -d "/$msys" ] && msys=CLANG$arch + local msys=MINGW$arch + [ ! -d "/$msys" ] && local msys=CLANG$arch if [ -d "/$msys" ] then if [ "$MSYSTEM" != "$msys" ] @@ -133,10 +133,10 @@ build() { else # Determine Debian architecture. case $arch in - x86) arch_deb="i386";; - x86_64) arch_deb="amd64";; - arm32) arch_deb="armhf";; - *) arch_deb="$arch";; + x86) local arch_deb="i386";; + x86_64) local arch_deb="amd64";; + arm32) local arch_deb="armhf";; + *) local arch_deb="$arch";; esac # Establish general and architecture-specific dependencies. @@ -153,16 +153,16 @@ build() { for pkg in libc6-dev linux-libc-dev libopenal-dev libfreetype6-dev libsdl2-dev libpng-dev do local libpkgs="$libpkgs $pkg:$arch_deb" - length=$(echo -n $pkg | sed 's/-dev$//g' | wc -c) + local length=$(echo -n $pkg | sed 's/-dev$//g' | wc -c) [ $length -gt $longest_libpkg ] && longest_libpkg=$length done # Determine GNU toolchain architecture. case $arch in - x86) arch_gnu="i686-linux-gnu";; - arm32) arch_gnu="arm-linux-gnueabihf";; - arm64) arch_gnu="aarch64-linux-gnu";; - *) arch_gnu="$arch-linux-gnu";; + x86) local arch_gnu="i686-linux-gnu";; + arm32) local arch_gnu="arm-linux-gnueabihf";; + arm64) local arch_gnu="aarch64-linux-gnu";; + *) local arch_gnu="$arch-linux-gnu";; esac # Create CMake toolchain file. @@ -254,8 +254,8 @@ EOF then # Determine Program Files directory for Ghostscript and 7-Zip. # Manual checks because MSYS is bad at passing the ProgramFiles variables. - pf="/c/Program Files" - sevenzip="$pf/7-Zip/7z.exe" + local pf="/c/Program Files" + local sevenzip="$pf/7-Zip/7z.exe" [ "$arch" = "32" -a -d "/c/Program Files (x86)" ] && pf="/c/Program Files (x86)" # Archive freetype from local MSYS installation. From bfe19db5b472b89c393e152c779b3930176d75cf Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 12 Nov 2021 21:53:12 -0300 Subject: [PATCH 065/159] Shuffle around and improve build number injection --- .ci/build.sh | 61 +++++++++++++++++--------------- src/CMakeLists.txt | 9 +++++ src/include/86box/version.h.in | 6 ++-- src/include_make/86box/version.h | 3 ++ src/win/86Box.rc | 6 ++-- 5 files changed, 52 insertions(+), 33 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index d73a89af0..7e3a58ab3 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -66,7 +66,6 @@ build() { # Set argument and environment variables. local job_name=$JOB_BASE_NAME local build_type=$BUILD_TYPE - local build_number=$BUILD_NUMBER local git_hash=$(echo $GIT_COMMIT | cut -c1-8) local arch=$1 shift @@ -76,29 +75,11 @@ build() { # Check if at least the job name was received. if [ -z "$job_name" ] then - echo [!] Missing environment variables: received JOB_BASE_NAME=[$job_name] BUILD_NUMBER=[$build_number] GIT_COMMIT=[$git_hash] + echo [!] Missing environment variables: received JOB_BASE_NAME=[$JOB_BASE_NAME] BUILD_TYPE=[$BUILD_TYPE] BUILD_NUMBER=[$BUILD_NUMBER] GIT_COMMIT=[$GIT_COMMIT] return 1 fi - # Generate the build qualifier and filename. - if echo $build_number | grep -q " " - then - # Full build qualifier. - build_qualifier="$build_number" - build_fn="-"$(echo "$build_number" | rev | cut -f1 -d" " | rev | tr '\\/:*?"<>|' '_') - elif [ ! -z "$build_number" ] - then - # Build number. - build_number=$(echo "$build_number" | sed "s/[^0-9]//g") # remove non-numeric characters - build_qualifier="build $build_number" - build_fn="-b$build_number" - else - # No build information. - build_qualifier= - build_fn= - fi - - echo [-] Building [$job_name] [$build_number] [$git_hash] for [$arch] with flags [$cmake_flags] + echo [-] Building [$job_name] [$build_type] [$build_qualifier] [$git_hash] for [$arch] with flags [$cmake_flags] # Switch to the correct directory. cd "$cwd" @@ -117,8 +98,8 @@ build() { # Call build with the correct MSYSTEM. echo [-] Switching to MSYSTEM [$msys] cd "$cwd" - CHERE_INVOKING=yes MSYSTEM=$msys JOB_BASE_NAME=$JOB_BASE_NAME BUILD_TYPE=$BUILD_TYPE BUILD_NUMBER=$BUILD_NUMBER GIT_COMMIT=$GIT_COMMIT \ - bash -lc 'exec "'$0'" -b "'$arch'" '$cmake_flags && job_exit=0 # make sure the main script exits cleanly on any success + CHERE_INVOKING=yes MSYSTEM="$msys" JOB_BASE_NAME="$JOB_BASE_NAME" BUILD_TYPE="$BUILD_TYPE" BUILD_NUMBER="$BUILD_NUMBER" GIT_COMMIT="$GIT_COMMIT" \ + bash -lc 'exec "'$0'" -b "'$arch'" '$cmake_flags && job_status=0 # make sure the main script exits cleanly on any success return $? fi else @@ -215,7 +196,9 @@ EOF # Determine additional CMake flags. [ ! -z "$build_type" ] && local cmake_flags_extra="$cmake_flags_extra -D BUILD_TYPE=\"$build_type\"" [ ! -z "$build_qualifier" ] && local cmake_flags_extra="$cmake_flags_extra -D EMU_BUILD=\"$build_qualifier\"" + [ ! -z "$build_number" ] && local cmake_flags_extra="$cmake_flags_extra -D EMU_BUILD_NUM=\"$build_number\"" [ ! -z "$git_hash" ] && local cmake_flags_extra="$cmake_flags_extra -D EMU_GIT_HASH=\"$git_hash\"" + local cmake_flags_extra="$cmake_flags_extra -D EMU_COPYRIGHT_YEAR=\"$(date +%Y)\"" # Run CMake. echo [-] Running CMake with flags [$cmake_flags $cmake_flags_extra] @@ -338,15 +321,15 @@ EOF fi # All good. - echo [-] Build of [$job_name] [$build_number] [$git_hash] for [$arch] with flags [$cmake_flags] successful - job_exit=0 + echo [-] Build of [$job_name] [$build_type] [$build_qualifier] [$git_hash] for [$arch] with flags [$cmake_flags] successful + job_status=0 } # Set common variables. project=86Box cwd=$(pwd) first_build=1 -job_exit=1 +job_status=1 # Parse arguments. single_build=0 @@ -393,6 +376,27 @@ then exit 100 fi +# Generate build information. Note that variable names are case sensitive. +build_number=$BUILD_NUMBER +if echo $build_number | grep -q " " +then + # A full build qualifier was specified. + build_qualifier="$build_number" + build_fn="-"$(echo "$build_number" | rev | cut -f1 -d" " | rev | tr '\\/:*?"<>|' '_') + build_number= # no build number +elif [ ! -z "$build_number" ] +then + # A build number was specified. + build_qualifier="build $build_number" + build_fn="-b$build_number" + build_number=$(echo "$build_number" | sed "s/[^0-9]//g") # remove non-numeric characters from build number +else + # No build data was specified. + build_number= + build_qualifier= + build_fn= +fi + # Run single build if requested. if [ $single_build -ne 0 ] then @@ -406,6 +410,7 @@ case $JOB_BASE_NAME in if is_windows then build 32 --preset=regular + build 64 --preset=regular elif is_mac then build Universal --preset=regular @@ -456,5 +461,5 @@ case $JOB_BASE_NAME in esac echo -echo [-] Exiting with code [$job_exit] -exit $job_exit +echo [-] Exiting with status [$job_status] +exit $job_status diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 49025d4dd..232942773 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -93,6 +93,15 @@ find_package(PNG REQUIRED) include_directories(${PNG_INCLUDE_DIRS}) target_link_libraries(86Box PNG::PNG) +if(NOT CMAKE_PROJECT_VERSION_PATCH) + set(CMAKE_PROJECT_VERSION_PATCH 0) +endif() +if(NOT EMU_BUILD_NUM) + set(EMU_BUILD_NUM 0) +endif() +if(NOT EMU_COPYRIGHT_YEAR) + set(EMU_COPYRIGHT_YEAR 2021) +endif() configure_file(include/86box/version.h.in include/86box/version.h @ONLY) include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) diff --git a/src/include/86box/version.h.in b/src/include/86box/version.h.in index f0a92a008..bbd751e77 100644 --- a/src/include/86box/version.h.in +++ b/src/include/86box/version.h.in @@ -22,11 +22,13 @@ #define EMU_VERSION "@CMAKE_PROJECT_VERSION@" #define EMU_VERSION_W LSTR(EMU_VERSION) -#define EMU_VERSION_EX "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@0" +#define EMU_VERSION_EX "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@@CMAKE_PROJECT_VERSION_PATCH@" #define EMU_VERSION_MAJ @CMAKE_PROJECT_VERSION_MAJOR@ #define EMU_VERSION_MIN @CMAKE_PROJECT_VERSION_MINOR@ +#define EMU_VERSION_PATCH @CMAKE_PROJECT_VERSION_PATCH@ #cmakedefine EMU_BUILD "@EMU_BUILD@" +#define EMU_BUILD_NUM @EMU_BUILD_NUM@ #cmakedefine EMU_GIT_HASH "@EMU_GIT_HASH@" #ifdef EMU_BUILD @@ -41,7 +43,7 @@ # define EMU_GIT_HASH_W LSTR(EMU_GIT_HASH) #endif -#define COPYRIGHT_YEAR "2021" +#define COPYRIGHT_YEAR "@EMU_COPYRIGHT_YEAR@" /* Web URL info. */ #define EMU_SITE L"86box.net" diff --git a/src/include_make/86box/version.h b/src/include_make/86box/version.h index 6574d0049..76db25017 100644 --- a/src/include_make/86box/version.h +++ b/src/include_make/86box/version.h @@ -25,6 +25,9 @@ #define EMU_VERSION_EX "3.00" #define EMU_VERSION_MAJ 3 #define EMU_VERSION_MIN 0 +#define EMU_VERSION_PATCH 0 + +#define EMU_BUILD_NUM 0 #define EMU_VERSION_FULL EMU_VERSION #define EMU_VERSION_FULL_W EMU_VERSION_W diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 05990324f..15b73567d 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -1283,8 +1283,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION EMU_VERSION_MAJ,EMU_VERSION_MIN,0,0 - PRODUCTVERSION EMU_VERSION_MAJ,EMU_VERSION_MIN,0,0 + FILEVERSION EMU_VERSION_MAJ,EMU_VERSION_MIN,EMU_VERSION_PATCH,EMU_BUILD_NUM + PRODUCTVERSION EMU_VERSION_MAJ,EMU_VERSION_MIN,EMU_VERSION_PATCH,EMU_BUILD_NUM FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -1303,7 +1303,7 @@ BEGIN VALUE "FileDescription", EMU_NAME "\0" VALUE "FileVersion", EMU_VERSION "\0" VALUE "InternalName", EMU_NAME "\0" - VALUE "LegalCopyright", "Copyright \xc2\xa9 2007-2020 " EMU_NAME " contributors\0" + VALUE "LegalCopyright", "Copyright \xc2\xa9 2007-" COPYRIGHT_YEAR " " EMU_NAME " contributors\0" VALUE "OriginalFilename", "86box.exe\0" VALUE "ProductName", EMU_NAME "\0" VALUE "ProductVersion", EMU_VERSION "\0" From e6fddf9823d46917a69aef6f638b90ed2022604c Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 12 Nov 2021 21:54:05 -0300 Subject: [PATCH 066/159] Flip freetype back to the old name on Windows to ease upgrading (at least on 32-bit builds) --- .ci/build.sh | 2 +- src/printer/prt_escp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 7e3a58ab3..afaba3c2e 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -242,7 +242,7 @@ EOF [ "$arch" = "32" -a -d "/c/Program Files (x86)" ] && pf="/c/Program Files (x86)" # Archive freetype from local MSYS installation. - .ci/static2dll.sh -p freetype2 /$MSYSTEM/lib/libfreetype.a archive_tmp/libfreetype-6.dll + .ci/static2dll.sh -p freetype2 /$MSYSTEM/lib/libfreetype.a archive_tmp/libfreetype.dll # Archive Ghostscript DLL from local official distribution installation. for gs in "$pf"/gs/gs*.*.* diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index 1cd3b8ebe..08b6cd58e 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -87,7 +87,7 @@ #ifdef _WIN32 -# define PATH_FREETYPE_DLL "libfreetype-6.dll" +# define PATH_FREETYPE_DLL "libfreetype.dll" #else # define PATH_FREETYPE_DLL "libfreetype.so.6" #endif From 5021457017b05b694a6396aaed3312ecbff1c0c7 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 00:30:42 -0300 Subject: [PATCH 067/159] Optimize static2dll script --- .ci/static2dll.sh | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/.ci/static2dll.sh b/.ci/static2dll.sh index 2148537d1..82b996f9a 100644 --- a/.ci/static2dll.sh +++ b/.ci/static2dll.sh @@ -37,11 +37,12 @@ find_lib() { add_lib() { # Always make sure this lib is listed after the last lib that depends on it. - if grep -q -- '^'"$*"'$' "$libs_file" - then - cp "$libs_file" "$libs_file.tmp" - grep -v -- '^'"$*"'$' "$libs_file.tmp" > "$libs_file" - fi + old_libs=$(cat "$libs_file") + rm -f "$libs_file" + for lib in $old_libs + do + [ "$lib" != "$*" ] && echo "$lib" >> "$libs_file" + done echo "$*" >> "$libs_file" # Add libstdc++ in the end if required. @@ -63,6 +64,16 @@ add_lib() { fi } +run_pkgconfig() { + local cache_file="static2dll.$1.cache" + if [ -e "$cache_file" ] + then + cat "$cache_file" + else + pkg-config --static --libs "$1" 2> /dev/null | tee "$cache_file" + fi +} + parse_pkgconfig() { # Parse arguments. local layers=$1 @@ -80,6 +91,7 @@ parse_pkgconfig() { for arg in $* do local arg_base="$(echo $arg | cut -c1-2)" + echo $arg if [ "x$arg_base" = "x-l" ] then # Don't process the same lib again. @@ -90,7 +102,7 @@ parse_pkgconfig() { add_lib "$(find_lib $lib_name)" # Get this lib's dependencies through pkg-config. - local pkgconfig="$(pkg-config --static --libs "$lib_name" 2>/dev/null)" + local pkgconfig="$(run_pkgconfig "$lib_name")" [ $? -eq 0 ] && parse_pkgconfig "$layers"'>' "$lib_name" $pkgconfig || echo $lib_name >> "$seen_file" elif [ "x$(echo $arg_base | cut -c1)" = "x-" ] then @@ -107,7 +119,7 @@ parse_pkgconfig() { case $1 in -p) # -p pkg_config_name static_lib_path out_dll shift - base_pkgconfig=$(pkg-config --static --libs "$1") + base_pkgconfig=$(run_pkgconfig "$1") base_path="$2" base_name="$1" ;; @@ -141,6 +153,7 @@ parse_pkgconfig '>' $base_name $base_pkgconfig # Produce final DLL. dllwrap --def "$def_file" -o "$3" -Wl,--allow-multiple-definition "$base_path" $(cat "$libs_file") status=$? +[ $status -eq 0 ] && rm -f "$def_file" "$seen_file" "$libs_file" "static2dll.*.cache" # Update final DLL timestamp. touch -r "$base_path" "$3" From 54e9f3dd9811493105e94063256bcb93c4b504f3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 01:06:53 -0300 Subject: [PATCH 068/159] Use version-specific docs URL for release builds --- src/include/86box/version.h.in | 6 +++++- src/include_make/86box/version.h | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/include/86box/version.h.in b/src/include/86box/version.h.in index bbd751e77..170154423 100644 --- a/src/include/86box/version.h.in +++ b/src/include/86box/version.h.in @@ -48,4 +48,8 @@ /* Web URL info. */ #define EMU_SITE L"86box.net" #define EMU_ROMS_URL L"https://github.com/86Box/roms/releases/latest" -#define EMU_DOCS_URL L"https://86box.readthedocs.io" +#ifdef RELEASE_BUILD +# define EMU_DOCS_URL L"https://86box.readthedocs.io/en/v@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@/" +#else +# define EMU_DOCS_URL L"https://86box.readthedocs.io" +#endif diff --git a/src/include_make/86box/version.h b/src/include_make/86box/version.h index 76db25017..b52c362f8 100644 --- a/src/include_make/86box/version.h +++ b/src/include_make/86box/version.h @@ -37,4 +37,8 @@ /* Web URL info. */ #define EMU_SITE L"86box.net" #define EMU_ROMS_URL L"https://github.com/86Box/roms/releases/latest" -#define EMU_DOCS_URL L"https://86box.readthedocs.io" +#ifdef RELEASE_BUILD +# define EMU_DOCS_URL L"https://86box.readthedocs.io/en/v3.0/" +#else +# define EMU_DOCS_URL L"https://86box.readthedocs.io" +#endif From 6101ceff18ebcdbed3142082c058205f9f60cdd5 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 01:09:05 -0300 Subject: [PATCH 069/159] Remove debug print from static2dll --- .ci/Jenkinsfile | 2 +- .ci/static2dll.sh | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 106fdfffd..bd2bd37b0 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -18,7 +18,7 @@ def gitClone() { cleanWs() def scmVars = git url: 'https://github.com/richardg867/86Box.git', - branch: 'cleanup30' + branch: 'cleanup30' env.GIT_COMMIT = scmVars.GIT_COMMIT } diff --git a/.ci/static2dll.sh b/.ci/static2dll.sh index 82b996f9a..f6e5b63b9 100644 --- a/.ci/static2dll.sh +++ b/.ci/static2dll.sh @@ -91,7 +91,6 @@ parse_pkgconfig() { for arg in $* do local arg_base="$(echo $arg | cut -c1-2)" - echo $arg if [ "x$arg_base" = "x-l" ] then # Don't process the same lib again. From 697827d70a2e80865156d67ebfb9a97228d88858 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 01:53:00 -0300 Subject: [PATCH 070/159] Add source tarball generation to build script --- .ci/build.sh | 105 +++++++++++++++++++++++++++++++++++++++++++++++++-- .gitignore | 4 +- 2 files changed, 104 insertions(+), 5 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index afaba3c2e..a43ace764 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -58,6 +58,46 @@ try_make() { fi } +make_tar() { + # Determine the best supported compression type. + local compression_flag= + local compression_ext= + if which xz > /dev/null 2>&1 + then + local compression_flag=-J + local compression_ext=.xz + elif which bzip2 > /dev/null 2>&1 + then + local compression_flag=-j + local compression_ext=.bz2 + elif which gzip > /dev/null 2>&1 + then + local compression_flag=-z + local compression_ext=.gz + fi + + # Make tar verbose if requested. + [ ! -z "$VERBOSE" ] && local compression_flag="$compression_flag -v" + + # tar is notorious for having many diverging implementations. For instance, + # the flags we use to strip UID/GID metadata can be --owner/group (GNU), + # --uid/gid (bsdtar) or even none at all (MSYS2 bsdtar). Account for such + # flag differences by checking if they're mentioned on the help text. + local ownership_flags= + local tar_help=$(tar --help 2>&1) + if echo $tar_help | grep -q -- --owner + then + local ownership_flags="--owner=0 --group=0" + elif echo $tar_help | grep -q -- --uid + then + local ownership_flags="--uid 0 --gid 0" + fi + + # Run tar. + tar -c $compression_flag -f "$1$compression_ext" $ownership_flags * + return $? +} + build() { # Create a line gap between builds. [ $first_build -eq 0 ] && echo @@ -307,8 +347,8 @@ EOF # TBD : else - # Create tarball. - tar Jcvf ../$job_name-Linux-$arch$build_fn.tar.xz --owner=0 --group=0 * # strip UID/GID metadata + # Create binary tarball. + make_tar ../$job_name-Linux-$arch$build_fn.tar local status=$? fi cd .. @@ -325,6 +365,46 @@ EOF job_status=0 } +tarball() { + # Create a line gap between builds. + [ $first_build -eq 0 ] && echo + first_build=0 + + # Set argument and environment variables. + local job_name=$JOB_BASE_NAME + + # Check if the job name was received. + if [ -z "$job_name" ] + then + echo [!] Missing environment variable: received JOB_BASE_NAME=[$JOB_BASE_NAME] + return 1 + fi + + echo [-] Making source tarball for [$job_name] + + # Switch to the correct directory. + cd "$cwd" + [ -e "build.sh" ] && cd .. + + # Clean local tree of gitignored files. + git clean -dfX + + # Save current HEAD commit to VERSION. + git log -1 > VERSION || rm -f VERSION + + # Archive source. + make_tar $job_name-Source$build_fn.tar + + # Check if the archival succeeded. + if [ $? -gt 0 ] + then + echo [!] Tarball creation failed with status [$status] + return 2 + fi + + echo [-] Source tarball for [$job_name] created successfully +} + # Set common variables. project=86Box cwd=$(pwd) @@ -333,18 +413,26 @@ job_status=1 # Parse arguments. single_build=0 +tarball=0 args=0 while [ $# -gt 0 ] do case $1 in -b) # Execute single build. - shift [ -z "$JOB_BASE_NAME" ] && JOB_BASE_NAME=$project-Custom single_build=1 + shift break ;; + -t) + # Create tarball. + [ -z "$JOB_BASE_NAME" ] && JOB_BASE_NAME=$project + tarball=1 + shift + ;; + *) # Allow for manually specifying Jenkins variables. if [ $args -eq 0 ] @@ -372,7 +460,7 @@ done # Check if at least the job name was specified. if [ -z "$JOB_BASE_NAME" ] then - echo [!] Manual usage: build.sh [{job_name} [{build_type} [{build_number|build_qualifier} [git_hash]]]] [-b {architecture} [cmake_flags...]] + echo [!] Manual usage: build.sh [{job_name} [{build_type} [{build_number'|"'build_qualifier'"'} [git_hash]]]] [-t] [-b {architecture} [cmake_flags...]] exit 100 fi @@ -397,6 +485,14 @@ else build_fn= fi +# Make tarball if requested. +if [ $tarball -ne 0 ] +then + tarball + status=$? + [ $single_build -eq 0 ] && exit $status +fi + # Run single build if requested. if [ $single_build -ne 0 ] then @@ -415,6 +511,7 @@ case $JOB_BASE_NAME in then build Universal --preset=regular else + tarball build x86 --preset=regular build x86_64 --preset=regular build arm32 --preset=regular diff --git a/.gitignore b/.gitignore index 4103ce839..641660680 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,9 @@ Makefile /archive_tmp /static2dll.* /*.zip -/*.tar.xz +/*.tar +/*.tar.* +/VERSION # Visual Studio Code /.vs From 874f64a0be93f15ca35bad21e462d79d832ff1ff Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 02:37:47 -0300 Subject: [PATCH 071/159] Install source tarball dependencies first --- .ci/build.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.ci/build.sh b/.ci/build.sh index a43ace764..4808af571 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -59,6 +59,12 @@ try_make() { } make_tar() { + # Install dependencies. + if ! which tar xz > /dev/null 2>&1 + then + which apt-get > /dev/null 2>&1 && DEBIAN_FRONTEND=noninteractive sudo apt-get install -y tar xz-utils + fi + # Determine the best supported compression type. local compression_flag= local compression_ext= From 95c5a52856f1bd3604782120037310ff5cabd84a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 13:48:00 -0300 Subject: [PATCH 072/159] Attempt Jenkins pipeline improvements including delegating builds --- .ci/Jenkinsfile | 38 +++++++++++++++++++++++++++++++++++--- .ci/build.sh | 2 ++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index bd2bd37b0..d88b823c7 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -17,8 +17,10 @@ def gitClone() { cleanWs() + if (env.GIT_COMMIT == null) + env.GIT_COMMIT = BRANCH def scmVars = git url: 'https://github.com/richardg867/86Box.git', - branch: 'cleanup30' + branch: env.GIT_COMMIT env.GIT_COMMIT = scmVars.GIT_COMMIT } @@ -38,9 +40,12 @@ pipeline { agent any parameters { - choice(name: 'BUILD_TYPE', - choices: ['beta', 'none', 'alpha', 'beta', 'release'], // duplicated on purpose, first is default + string(name: 'BUILD_TYPE', + defaultValue: 'beta', /* !!! CHANGE HERE !!! for build type */ description: 'Build type to pass on to CMake. This may affect the UI icon and feature set.') + string(name: 'BRANCH', + defaultValue: 'master', + description: 'Used internally to make sure all downstream builds use the same commit.') } stages { @@ -63,5 +68,32 @@ pipeline { } } } + + /* If we're on the main jobs, trigger each of the downstream jobs. */ + stage('Trigger downstream jobs') { + when { + expression { + return env.JOB_BASE_NAME == '86Box-TestBuildPleaseIgnore'; + } + } + + steps { + ["${env.JOB_BASE_NAME}2"].each { + /* Set next build number for this job. */ + def job = Jenkins.instance.getItem(it) + job.nextBuildNumber = env.BUILD_NUMBER + job.saveNextBuildNumber() + + /* Trigger this job. */ + build propagate: false, + wait: false, + job: it, + parameters: [ + string(name: 'BUILD_TYPE', value: BUILD_TYPE) + string(name: 'BRANCH', value: env.GIT_COMMIT) + ] + } + } + } } } diff --git a/.ci/build.sh b/.ci/build.sh index 4808af571..621369d08 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -507,6 +507,8 @@ then fi # Run builds according to the Jenkins job name. +echo Temporarily disabled [$JOB_BASE_NAME] +exit 0 case $JOB_BASE_NAME in $project | $project-TestBuildPleaseIgnore) if is_windows From 5b634031952506b0976dd4fb9244caeb96d632bb Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 13:48:43 -0300 Subject: [PATCH 073/159] Fix Jenkins pipeline typo --- .ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index d88b823c7..4ab57bd29 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -89,7 +89,7 @@ pipeline { wait: false, job: it, parameters: [ - string(name: 'BUILD_TYPE', value: BUILD_TYPE) + string(name: 'BUILD_TYPE', value: BUILD_TYPE), string(name: 'BRANCH', value: env.GIT_COMMIT) ] } From 89fb9ca91299290379e3be1d0bdba81fe951b351 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 13:51:34 -0300 Subject: [PATCH 074/159] Fix pipeline delegation context --- .ci/Jenkinsfile | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 4ab57bd29..d0a2b7ba2 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -78,20 +78,22 @@ pipeline { } steps { - ["${env.JOB_BASE_NAME}2"].each { - /* Set next build number for this job. */ - def job = Jenkins.instance.getItem(it) - job.nextBuildNumber = env.BUILD_NUMBER - job.saveNextBuildNumber() + script { + ["${env.JOB_BASE_NAME}2"].each { + /* Set next build number for this job. */ + def job = Jenkins.instance.getItem(it) + job.nextBuildNumber = env.BUILD_NUMBER + job.saveNextBuildNumber() - /* Trigger this job. */ - build propagate: false, - wait: false, - job: it, - parameters: [ - string(name: 'BUILD_TYPE', value: BUILD_TYPE), - string(name: 'BRANCH', value: env.GIT_COMMIT) - ] + /* Trigger this job. */ + build propagate: false, + wait: false, + job: it, + parameters: [ + string(name: 'BUILD_TYPE', value: BUILD_TYPE), + string(name: 'BRANCH', value: env.GIT_COMMIT) + ] + } } } } From 630ea25922fb322dfaf23b3566ef8e2ff90b20c5 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 13:53:53 -0300 Subject: [PATCH 075/159] Some Jenkins troubleshooting in production... --- .ci/Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index d0a2b7ba2..56e8140bd 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -17,6 +17,7 @@ def gitClone() { cleanWs() + println env.GIT_COMMIT if (env.GIT_COMMIT == null) env.GIT_COMMIT = BRANCH def scmVars = git url: 'https://github.com/richardg867/86Box.git', From 185c34e88521a713220dbab5b6954f871017e1fd Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 14:00:41 -0300 Subject: [PATCH 076/159] Some more Jenkins troubleshooting in production... --- .ci/Jenkinsfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 56e8140bd..5f5431639 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -17,11 +17,12 @@ def gitClone() { cleanWs() - println env.GIT_COMMIT if (env.GIT_COMMIT == null) env.GIT_COMMIT = BRANCH - def scmVars = git url: 'https://github.com/richardg867/86Box.git', - branch: env.GIT_COMMIT + println "[-] Building git tag [${env.GIT_COMMIT}]" + def scmVars = checkout scm: [$class: 'GitSCM', + branches: [[name: env.GIT_COMMIT]], + userRemoteConfigs: [[url: 'http://git-server/user/repository.git']]] env.GIT_COMMIT = scmVars.GIT_COMMIT } From e8881f6f25ce7a514b1383d3f900140419f546d7 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 14:02:17 -0300 Subject: [PATCH 077/159] Add per-stage failure to Jenkins pipeline --- .ci/Jenkinsfile | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 5f5431639..9a3f67472 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -53,20 +53,24 @@ pipeline { stages { stage('Build Windows') { steps { - node('windows') { - gitClone() - windowsBuild() - saveArtifacts() + catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { + node('windows') { + gitClone() + windowsBuild() + saveArtifacts() + } } } } stage('Build Linux') { steps { - node('debian') { - gitClone() - unixBuild() - saveArtifacts() + catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { + node('debian') { + gitClone() + unixBuild() + saveArtifacts() + } } } } From 941a1b20cf3623fb6c317fffab3e1182a987f6b9 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 14:06:49 -0300 Subject: [PATCH 078/159] Fix bad copypaste in Jenkins pipeline --- .ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 9a3f67472..be954259e 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -22,7 +22,7 @@ def gitClone() { println "[-] Building git tag [${env.GIT_COMMIT}]" def scmVars = checkout scm: [$class: 'GitSCM', branches: [[name: env.GIT_COMMIT]], - userRemoteConfigs: [[url: 'http://git-server/user/repository.git']]] + userRemoteConfigs: [[url: 'https://github.com/richardg867/86Box.git']]] env.GIT_COMMIT = scmVars.GIT_COMMIT } From ed4fd684fade970cd479cd44bd6df438921a82bf Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 14:40:38 -0300 Subject: [PATCH 079/159] Handle Jenkins script approvals for build number setting --- .ci/Jenkinsfile | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index be954259e..ee3c3eecd 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -15,6 +15,16 @@ * Copyright 2021 RichardG. */ +/* Run this on /script to get all the approvals necessary to sync build numbers across jobs: + +def approval = org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.get() +approval.approveSignature('staticMethod jenkins.model.Jenkins getInstance') +approval.approveSignature('method hudson.model.ItemGroup getItem java.lang.String') +approval.approveSignature('field hudson.model.Job nextBuildNumber') +approval.approveSignature('method hudson.model.Job saveNextBuildNumber') + +*/ + def gitClone() { cleanWs() if (env.GIT_COMMIT == null) @@ -86,10 +96,14 @@ pipeline { steps { script { ["${env.JOB_BASE_NAME}2"].each { - /* Set next build number for this job. */ - def job = Jenkins.instance.getItem(it) - job.nextBuildNumber = env.BUILD_NUMBER - job.saveNextBuildNumber() + try { + /* Set next build number for this job. */ + def job = Jenkins.instance.getItem(it) + job.nextBuildNumber = env.BUILD_NUMBER as Integer + job.saveNextBuildNumber() + } catch (Exception e) { + println "[!] Failed to set next build number for [$it], make sure the script approvals are in place" + } /* Trigger this job. */ build propagate: false, From ae4ec8d98a12a93c1ef7a25436eab29a9ede623f Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 14:42:30 -0300 Subject: [PATCH 080/159] Re-enable Jenkins builds as the pipeline is mostly figured out --- .ci/build.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 621369d08..4808af571 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -507,8 +507,6 @@ then fi # Run builds according to the Jenkins job name. -echo Temporarily disabled [$JOB_BASE_NAME] -exit 0 case $JOB_BASE_NAME in $project | $project-TestBuildPleaseIgnore) if is_windows From b3972d11aa3d7d132d724490597b4640001ab81a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 14:57:32 -0300 Subject: [PATCH 081/159] Fix small issue with the build chaining test --- .ci/Jenkinsfile | 2 +- .ci/build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index ee3c3eecd..3209d4800 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -102,7 +102,7 @@ pipeline { job.nextBuildNumber = env.BUILD_NUMBER as Integer job.saveNextBuildNumber() } catch (Exception e) { - println "[!] Failed to set next build number for [$it], make sure the script approvals are in place" + println "[!] Could not set next build number for [$it], make sure all the script approvals are in place" } /* Trigger this job. */ diff --git a/.ci/build.sh b/.ci/build.sh index 4808af571..94f84706e 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -508,7 +508,7 @@ fi # Run builds according to the Jenkins job name. case $JOB_BASE_NAME in - $project | $project-TestBuildPleaseIgnore) + $project | $project-TestBuildPleaseIgnore*) if is_windows then build 32 --preset=regular From d63461c712cf466b82cf97e2b0573c346839bae8 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 15:15:07 -0300 Subject: [PATCH 082/159] Add failure mode to Jenkins pipeline --- .ci/Jenkinsfile | 65 ++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 3209d4800..f7f7ca76e 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -48,6 +48,8 @@ def saveArtifacts() { archiveArtifacts artifacts: "${env.JOB_BASE_NAME}-*" } +def anySuccess = false + pipeline { agent any @@ -69,6 +71,10 @@ pipeline { windowsBuild() saveArtifacts() } + + script { + anySuccess = true + } } } } @@ -81,38 +87,47 @@ pipeline { unixBuild() saveArtifacts() } + + script { + anySuccess = true + } } } } - /* If we're on the main jobs, trigger each of the downstream jobs. */ - stage('Trigger downstream jobs') { - when { - expression { - return env.JOB_BASE_NAME == '86Box-TestBuildPleaseIgnore'; - } - } - + /* This stage has two tasks: + - Fail the build if all build stages failed + - Trigger downstream jobs if we're on the main job + This could be done with two stages and when{} blocks, but then they + would show up separately in the UI (unless JENKINS-44094 happens). */ + stage('Finish build') { steps { script { - ["${env.JOB_BASE_NAME}2"].each { - try { - /* Set next build number for this job. */ - def job = Jenkins.instance.getItem(it) - job.nextBuildNumber = env.BUILD_NUMBER as Integer - job.saveNextBuildNumber() - } catch (Exception e) { - println "[!] Could not set next build number for [$it], make sure all the script approvals are in place" - } + if (env.JOB_BASE_NAME == '86Box-TestBuildPleaseIgnore') { + ["${env.JOB_BASE_NAME}2"].each { + try { + /* Set next build number for this job. */ + def job = Jenkins.instance.getItem(it) + job.nextBuildNumber = env.BUILD_NUMBER as Integer + job.saveNextBuildNumber() + } catch (Exception e) { + println "[!] Could not set next build number for [$it], make sure all the script approvals are in place" + } - /* Trigger this job. */ - build propagate: false, - wait: false, - job: it, - parameters: [ - string(name: 'BUILD_TYPE', value: BUILD_TYPE), - string(name: 'BRANCH', value: env.GIT_COMMIT) - ] + /* Trigger this job. */ + build propagate: false, + wait: false, + job: it, + parameters: [ + string(name: 'BUILD_TYPE', value: BUILD_TYPE), + string(name: 'BRANCH', value: env.GIT_COMMIT) + ] + } + } + + if (!anySuccess) { + println "[!] Failing build because all build stages failed" + currentBuild.result = 'FAILURE' } } } From c7accb26fd9cd978d1df8b33404118a2a9d6b55c Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 15:32:02 -0300 Subject: [PATCH 083/159] Change description for Jenkins internal BRANCH parameter --- .ci/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index f7f7ca76e..8d7068a2d 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -59,7 +59,7 @@ pipeline { description: 'Build type to pass on to CMake. This may affect the UI icon and feature set.') string(name: 'BRANCH', defaultValue: 'master', - description: 'Used internally to make sure all downstream builds use the same commit.') + description: "Used internally to make sure all downstream builds use the same commit. Don't change this.") } stages { @@ -96,8 +96,8 @@ pipeline { } /* This stage has two tasks: - - Fail the build if all build stages failed - Trigger downstream jobs if we're on the main job + - Fail this build if all build stages failed This could be done with two stages and when{} blocks, but then they would show up separately in the UI (unless JENKINS-44094 happens). */ stage('Finish build') { From 94d9ec141408dabdd32642b39a5a55775eb32805 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 15:37:39 -0300 Subject: [PATCH 084/159] Another comment about Jenkins parameters for good measure --- .ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 8d7068a2d..e97830f05 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -56,7 +56,7 @@ pipeline { parameters { string(name: 'BUILD_TYPE', defaultValue: 'beta', /* !!! CHANGE HERE !!! for build type */ - description: 'Build type to pass on to CMake. This may affect the UI icon and feature set.') + description: "Build type to pass on to CMake. Don't change this, you should instead change the default value on .ci/Jenkinsfile") string(name: 'BRANCH', defaultValue: 'master', description: "Used internally to make sure all downstream builds use the same commit. Don't change this.") From 913b695073572869c941f81d1d7c8def9b7b62a6 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 15:59:22 -0300 Subject: [PATCH 085/159] Move Jenkins post-build tasks to a post{} block --- .ci/Jenkinsfile | 59 ++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index e97830f05..f6f0f11f1 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -51,7 +51,7 @@ def saveArtifacts() { def anySuccess = false pipeline { - agent any + agent none parameters { string(name: 'BUILD_TYPE', @@ -94,42 +94,37 @@ pipeline { } } } + } - /* This stage has two tasks: - - Trigger downstream jobs if we're on the main job - - Fail this build if all build stages failed - This could be done with two stages and when{} blocks, but then they - would show up separately in the UI (unless JENKINS-44094 happens). */ - stage('Finish build') { - steps { - script { - if (env.JOB_BASE_NAME == '86Box-TestBuildPleaseIgnore') { - ["${env.JOB_BASE_NAME}2"].each { - try { - /* Set next build number for this job. */ - def job = Jenkins.instance.getItem(it) - job.nextBuildNumber = env.BUILD_NUMBER as Integer - job.saveNextBuildNumber() - } catch (Exception e) { - println "[!] Could not set next build number for [$it], make sure all the script approvals are in place" - } - - /* Trigger this job. */ - build propagate: false, - wait: false, - job: it, - parameters: [ - string(name: 'BUILD_TYPE', value: BUILD_TYPE), - string(name: 'BRANCH', value: env.GIT_COMMIT) - ] + post { + always { + script { + if (env.JOB_BASE_NAME == '86Box-TestBuildPleaseIgnore') { + ["${env.JOB_BASE_NAME}2"].each { + try { + /* Set next build number for this job. */ + def job = Jenkins.instance.getItem(it) + job.nextBuildNumber = env.BUILD_NUMBER as Integer + job.saveNextBuildNumber() + } catch (Exception e) { + println "[!] Could not set next build number for [$it], make sure all the script approvals are in place" } - } - if (!anySuccess) { - println "[!] Failing build because all build stages failed" - currentBuild.result = 'FAILURE' + /* Trigger this job. */ + build propagate: false, + wait: false, + job: it, + parameters: [ + string(name: 'BUILD_TYPE', value: BUILD_TYPE), + string(name: 'BRANCH', value: env.GIT_COMMIT) + ] } } + + if (!anySuccess) { + println "[!] Failing build because all build stages failed" + currentBuild.result = 'FAILURE' + } } } } From 6119e3a0192df90c6fa720758537ba5e9fe4a3d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 20:05:48 +0100 Subject: [PATCH 086/159] Adjustments in config to write explicitly the mem_size This will help manager developers to decide the VM's memory size without knowing the actual machine table. --- src/config.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 7323b6a81..0bd8dbfe3 100644 --- a/src/config.c +++ b/src/config.c @@ -2327,9 +2327,8 @@ save_machine(void) else config_set_string(cat, "fpu_type", (char *) fpu_get_internal_name(cpu_f, cpu, fpu_type)); - if (mem_size == 4096) + //Write the mem_size explicitly to the setttings in order to help managers to display it without having the actual machine table config_delete_var(cat, "mem_size"); - else config_set_int(cat, "mem_size", mem_size); config_set_int(cat, "cpu_use_dynarec", cpu_use_dynarec); From 918dae0683b2713b464da93271e3864b01ef3d73 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 16:19:26 -0300 Subject: [PATCH 087/159] Dummy commit to test build chaining --- .ci/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index f6f0f11f1..f45bdbec5 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -31,8 +31,8 @@ def gitClone() { env.GIT_COMMIT = BRANCH println "[-] Building git tag [${env.GIT_COMMIT}]" def scmVars = checkout scm: [$class: 'GitSCM', - branches: [[name: env.GIT_COMMIT]], - userRemoteConfigs: [[url: 'https://github.com/richardg867/86Box.git']]] + branches: [[name: env.GIT_COMMIT]], + userRemoteConfigs: [[url: 'https://github.com/richardg867/86Box.git']]] env.GIT_COMMIT = scmVars.GIT_COMMIT } From 2d30052238154a15470d03da65d126e93f7d6bbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 21:35:43 +0100 Subject: [PATCH 088/159] Remove ifdef, add default language constant, and separate text filler code from pc_init --- src/86box.c | 17 +++++++++++------ src/include/86box/86box.h | 4 ++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/86box.c b/src/86box.c index c67d01ff8..16c4ab4ce 100644 --- a/src/86box.c +++ b/src/86box.c @@ -434,8 +434,8 @@ usage: printf("-E or --nographic - forces the old behavior\n"); #endif printf("-F or --fullscreen - start in fullscreen mode\n"); -#ifdef _WIN32 printf("-G or --lang langid - start the application with the specified language\n"); +#ifdef _WIN32 printf("-H or --hwnd id,hwnd - sends back the main dialog's hwnd\n"); #endif printf("-L or --logfile path - set 'path' to be the logfile\n"); @@ -519,7 +519,8 @@ usage: !strcasecmp(argv[c], "-G")) { - //This function is currently unimplemented for *nix. +#endif + //This function is currently unimplemented for *nix but has placeholders. lang_init = plat_language_code(argv[++c]); if (!lang_init) @@ -528,7 +529,6 @@ usage: //The return value of 0 only means that the code is invalid, // not related to that translation is exists or not for the // selected language. -#endif } else if (!strcasecmp(argv[c], "--test")) { /* some (undocumented) test function here.. */ @@ -922,8 +922,6 @@ pc_reset_hard_close(void) void pc_reset_hard_init(void) { - wchar_t wcpufamily[2048], wcpu[2048], wmachine[2048], *wcp; - /* * First, we reset the modules that are not part of * the actual machine, but which support some of the @@ -1025,7 +1023,14 @@ pc_reset_hard_init(void) pc_full_speed(); cycles = cycles_main = 0; + + update_mouse_msg(); +} +void update_mouse_msg() +{ + wchar_t wcpufamily[2048], wcpu[2048], wmachine[2048], *wcp; + mbstowcs(wmachine, machine_getname(), strlen(machine_getname())+1); if (!cpu_override) @@ -1037,6 +1042,7 @@ pc_reset_hard_init(void) if (wcp) /* remove parentheses */ *(wcp - 1) = L'\0'; mbstowcs(wcpu, cpu_s->name, strlen(cpu_s->name)+1); + swprintf(mouse_msg[0], sizeof_w(mouse_msg[0]), L"%ls v%ls - %%i%%%% - %ls - %ls/%ls - %ls", EMU_NAME_W, EMU_VERSION_W, wmachine, wcpufamily, wcpu, plat_get_string(IDS_2077)); @@ -1045,7 +1051,6 @@ pc_reset_hard_init(void) (mouse_get_buttons() > 2) ? plat_get_string(IDS_2078) : plat_get_string(IDS_2079)); } - void pc_reset_hard(void) { diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index abfaf5d21..c27f1d93e 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -33,6 +33,9 @@ #define SCREENSHOT_PATH "screenshots" +/* Default language 0xFFFF = from system, 0x409 = en-US */ +#define DEFAULT_LANGUAGE 0x0409 + #if defined(ENABLE_BUSLOGIC_LOG) || \ defined(ENABLE_CDROM_LOG) || \ defined(ENABLE_D86F_LOG) || \ @@ -173,6 +176,7 @@ extern void fatal(const char *fmt, ...); extern void set_screen_size(int x, int y); extern void reset_screen_size(void); extern void set_screen_size_natural(void); +extern void update_mouse_msg(); #if 0 extern void pc_reload(wchar_t *fn); #endif From dddff5a89289d319caa3145bb91f36f5fb5f995c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 21:36:20 +0100 Subject: [PATCH 089/159] Adjustments in Hungarian translation --- src/win/languages/hu-HU.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 84f4b4ecf..0f7a06259 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -752,7 +752,7 @@ BEGIN IDS_2049 "Hiba" IDS_2050 "Végzetes hiba" IDS_2051 "" - IDS_2052 "Használja a CTRL+ALT+PAGE DOWN kombinációt az ablakhoz való visszatéréshez." + IDS_2052 "Használja a CTRL+ALT+PAGE DOWN gombokat az ablakhoz való visszatéréshez." IDS_2053 "Sebesség" IDS_2054 "ZIP %03i %i (%s): %ls" IDS_2055 "ZIP-lemezképek (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" @@ -781,7 +781,7 @@ BEGIN IDS_2074 "Egyéb cserélhető tárolók" IDS_2075 "Egyéb perifériák" IDS_2076 "Felületi képfájlok (*.86F)\0*.86F\0" - IDS_2077 "Az egér elfogásához kattintson az ablakba" + IDS_2077 "Kattintson az egér elfogásához" IDS_2078 "Nyomja meg az F8+F12-t az egér elengédéséhez" IDS_2079 "Nyomja meg az F8+F12-t vagy a középső gombot az egér elengédéséhez" END From 87cbbdf992f7e65da20254d77447fa8e66c29cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 21:37:27 +0100 Subject: [PATCH 090/159] Implement language local config saving --- src/config.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/config.c b/src/config.c index 7323b6a81..499624f50 100644 --- a/src/config.c +++ b/src/config.c @@ -567,15 +567,8 @@ load_general(void) confirm_exit = config_get_int(cat, "confirm_exit", 1); confirm_save = config_get_int(cat, "confirm_save", 1); -#ifdef USE_LANGUAGE - /* - * Currently, 86Box is English (US) only, but in the future - * (version 3.0 at the earliest) other languages will be - * added, therefore it is better to future-proof the code. - */ - plat_langid = config_get_hex16(cat, "language", 0x0409); -#endif - + lang_id = config_get_hex16(cat, "language", DEFAULT_LANGUAGE); + #if USE_DISCORD enable_discord = !!config_get_int(cat, "enable_discord", 0); #endif @@ -2211,12 +2204,10 @@ save_general(void) else config_delete_var(cat, "confirm_save"); -#ifdef USE_LANGUAGE - if (plat_langid == 0x0409) + if (lang_id == DEFAULT_LANGUAGE) config_delete_var(cat, "language"); else - config_set_hex16(cat, "language", plat_langid); -#endif + config_set_hex16(cat, "language", lang_id); #if USE_DISCORD if (enable_discord) @@ -2941,7 +2932,9 @@ save_other_removable_devices(void) void config_save(void) -{ +{ + pclog("config_save"); + save_general(); /* General */ save_machine(); /* Machine */ save_video(); /* Video */ From 7e4abcbfbd364e2da7321b3b8fcc8cb6b04aee84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 21:37:51 +0100 Subject: [PATCH 091/159] Implement system language as 0xFFFF --- src/win/win.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/win/win.c b/src/win/win.c index 88f48b958..4c8e7ac27 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -255,6 +255,13 @@ void set_language(uint32_t id) { pclog("set_language %u, lang_id %u\n", id, lang_id); + if (id == 0xFFFF) + { + set_language(lang_sys); + lang_id = id; + return; + } + if (lang_id != id) { /* Set our new language ID. */ lang_id = id; @@ -471,7 +478,7 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) /* First, set our (default) language. */ lang_sys = GetThreadUILanguage(); - set_language(lang_sys); + set_language(DEFAULT_LANGUAGE); /* Process the command line for options. */ argc = ProcessCommandLine(&argv); @@ -1201,6 +1208,9 @@ plat_vid_reload_options(void) uint32_t plat_language_code(char* langcode) { + if (!strcmp(langcode, "system")) + return 0xFFFF; + int len = mbstoc16s(NULL, langcode, 0) + 1; wchar_t *temp = malloc(len * sizeof(wchar_t)); mbstoc16s(temp, langcode, len); From 3fa1e88d7d79549191b49aa8d8510cf333464f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 21:39:07 +0100 Subject: [PATCH 092/159] Initial addition of system language to the dialog Also update everything and save the config without hard reset. --- src/win/win_lang.c | 56 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/win/win_lang.c b/src/win/win_lang.c index 8c69048ab..cc7882840 100644 --- a/src/win/win_lang.c +++ b/src/win/win_lang.c @@ -30,12 +30,16 @@ #include <86box/plat.h> #include <86box/sound.h> #include <86box/win.h> +#include <86box/ui.h> +#include <86box/resource.h> /* Language */ static LCID temp_language; int enum_helper, c; +HWND hwndProgSett; + BOOL CALLBACK EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam) { @@ -62,8 +66,12 @@ progsett_fill_languages(HWND hdlg) HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG); SendMessage(lang_combo, CB_RESETCONTENT, 0, 0); + SendMessage(lang_combo, CB_ADDSTRING, 0, (LPARAM)L"(System Default)"); + SendMessage(lang_combo, CB_SETITEMDATA, 0, 0xFFFF); - enum_helper = -1; c = 0; + enum_helper = 0; c = 1; + //if no one is selected, then it was 0xFFFF or unsupported language, in either case go with index enum_helper=0 + //also start enum index from c=1 EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo); pclog("enum_helper is %d\n", enum_helper); @@ -83,12 +91,37 @@ progsett_settings_changed(void) return i; } +/* IndexOf by ItemData */ +static int +progsett_indexof(HWND combo, LPARAM itemdata) +{ + int i; + for (i = 0; i < SendMessage(combo, CB_GETCOUNT, 0, 0); i++) + if (SendMessage(combo, CB_GETITEMDATA, i, 0) == itemdata) + return i; + + return -1; +} + /* This saves the settings back to the global variables. */ static void progsett_settings_save(void) -{ +{ /* Language */ set_language(temp_language); + + pclog("done"); + + /* Update title bar */ + update_mouse_msg(); + + /* Update status bar */ + config_changed = 1; + ui_sb_set_ready(0); + ui_sb_update_panes(); + + /* Save the language changes */ + config_save(); } #if defined(__amd64__) || defined(__aarch64__) @@ -100,6 +133,7 @@ ProgSettDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: + hwndProgSett = hdlg; /* Language */ temp_language = lang_id; pclog("temp_language is %u\n", lang_id); @@ -107,10 +141,10 @@ ProgSettDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - if (progsett_settings_changed()) - progsett_settings_save(); + switch (LOWORD(wParam)) { + case IDOK: + if (progsett_settings_changed()) + progsett_settings_save(); EndDialog(hdlg, 0); return TRUE; @@ -125,6 +159,16 @@ ProgSettDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0); pclog("combobox changed -> temp_language = %u", temp_language); } + break; + + case IDC_BUTTON_DEFAULT: { + HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG); + int index = progsett_indexof(combo, DEFAULT_LANGUAGE); + SendMessage(combo, CB_SETCURSEL, index, 0); + temp_language = DEFAULT_LANGUAGE; + pclog("combobox changed -> temp_language = %u", temp_language); + break; + } default: break; } From 7ae10144adac28ff3c1561a95c899be69adfc13e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 22:36:13 +0100 Subject: [PATCH 093/159] Cumulative changes Move to translateable (System Default) message Move change language to Tools menu Redesign the language dialog Add the translators' name to the About dialog, to make the translation process more attractive --- src/include/86box/language.h | 2 +- src/include/86box/resource.h | 1 - src/win/languages/en-US.rc | 37 +++++++++++++++++++++++------------- src/win/languages/hu-HU.rc | 37 +++++++++++++++++++++++------------- src/win/win_lang.c | 2 +- 5 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 7e096fbf4..a1f3ce3aa 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -229,7 +229,7 @@ #define IDS_6146 6146 // "1.5%% below perfect RPM" #define IDS_6147 6147 // "2%% below perfect RPM" -#define IDS_7168 7168 // "English (United States)" +#define IDS_7168 7168 // "(System Default)" #define IDS_LANG_ENUS IDS_7168 diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 306a9c839..2a13b01f1 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -266,7 +266,6 @@ #define IDC_COMBO_LANG 1009 /* change language dialog */ #define IDC_CHECKBOX_GLOBAL 1300 -#define IDC_BUTTON_SYSTEM 1301 #define IDC_BUTTON_DEFAULT 1302 /* For the DeviceConfig code, re-do later. */ diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index cf5956691..a171fe941 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -62,7 +62,6 @@ BEGIN MENUITEM "&Linear", IDM_VID_FILTER_LINEAR END MENUITEM "Hi&DPI scaling", IDM_VID_HIDPI - MENUITEM "Dis&play language...", IDM_VID_PROG_SETT MENUITEM SEPARATOR MENUITEM "&Fullscreen\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN POPUP "Fullscreen &stretch mode" @@ -99,6 +98,8 @@ BEGIN BEGIN MENUITEM "&Settings...", IDM_CONFIG MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "Change dis&play language...", IDM_VID_PROG_SETT # ifdef USE_DISCORD MENUITEM SEPARATOR MENUITEM "Enable &Discord integration", IDM_DISCORD @@ -270,20 +271,17 @@ END // Dialog // -DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 286, 86 +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Change Display Language" FONT 9, "Segoe UI" BEGIN - DEFPUSHBUTTON "OK", IDOK, 166, 64, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 222, 64, 50, 14 - COMBOBOX IDC_COMBO_LANG, 10, 18, 266, 16, CBS_DROPDOWNLIST | CBS_HASSTRINGS -#if 0 - AUTOCHECKBOX "Use these settings as global &defaults", IDC_CHECKBOX_GLOBAL, 8, 67, 152, 8 -#endif - PUSHBUTTON "&System Language", IDC_BUTTON_SYSTEM, 120, 35, 82, 14 - PUSHBUTTON "&Default", IDC_BUTTON_DEFAULT, 206, 35, 60, 14 - LTEXT "Language:", 0, 9, 8, 34, 8 + DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 + PUSHBUTTON "Cancel", IDCANCEL, 179, 65, 50, 14 + COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS + AUTOCHECKBOX "Save these settings as &global defaults", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8 , WS_DISABLED + PUSHBUTTON "&Default", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 + LTEXT "Language:", 0, 13, 8, 34, 8 END DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 @@ -834,7 +832,20 @@ BEGIN IDS_2123 "Save" IDS_2124 "About 86Box" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information." + + IDS_2126 "An emulator of old computers\n\n" + + "Authors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\n" + + /* + Translate the following line as "Translated by: \n\n". + If there were previous translators, don't erase their name, just add yours to the end of line. + */ + + "This is the program's base language.\n\n" + + "Released under the GNU General Public License version 2 or later. See LICENSE for more information." + IDS_2127 "OK" IDS_2128 "Hardware not available" #ifdef _WIN32 @@ -979,7 +990,7 @@ BEGIN IDS_6146 "1.5%% below perfect RPM" IDS_6147 "2%% below perfect RPM" - IDS_7168 "English (United States)" + IDS_7168 "(System Default)" END #define IDS_LANG_ENUS IDS_7168 diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 0f7a06259..4abbdb43d 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -4,6 +4,8 @@ // Translated by Laci bá', 2021 // +#define TRANSLATORS_NAME "Laci bá'" + #ifdef _WIN32 LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT #pragma code_page(65001) @@ -65,7 +67,6 @@ BEGIN MENUITEM "&Lineáris", IDM_VID_FILTER_LINEAR END MENUITEM "Hi&DPI méretezés", IDM_VID_HIDPI - MENUITEM "&Nyelvi beállítások...", IDM_VID_PROG_SETT MENUITEM SEPARATOR MENUITEM "&Teljes képernyő\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN POPUP "Teljes képernyős &méretezés" @@ -102,6 +103,8 @@ BEGIN BEGIN MENUITEM "&Beállítások...", IDM_CONFIG MENUITEM "Állapotsori ikonok &frissítése", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "A &program nyelvének módosítása...", IDM_VID_PROG_SETT # ifdef USE_DISCORD MENUITEM SEPARATOR MENUITEM "&Discord integráció engedélyezése", IDM_DISCORD @@ -272,20 +275,17 @@ END // // Dialog // -DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 286, 86 +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Nyelvi beállítások" FONT 9, "Segoe UI" BEGIN - DEFPUSHBUTTON "OK", IDOK, 166, 64, 50, 14 - PUSHBUTTON "Mégse", IDCANCEL, 222, 64, 50, 14 - COMBOBOX IDC_COMBO_LANG, 10, 18, 266, 16, CBS_DROPDOWNLIST | CBS_HASSTRINGS -#if 0 - AUTOCHECKBOX "Ezen beállítások használata mint alapérték", IDC_CHECKBOX_GLOBAL, 8, 67, 152, 8 -#endif - PUSHBUTTON "A &rendszer nyelve", IDC_BUTTON_SYSTEM, 120, 35, 82, 14 - PUSHBUTTON "&Alapértelmezett", IDC_BUTTON_DEFAULT, 206, 35, 60, 14 - LTEXT "Nyelv:", 0, 9, 8, 34, 8 + DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 + PUSHBUTTON "Mégse", IDCANCEL, 179, 65, 50, 14 + COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS + AUTOCHECKBOX "Beállítások mentése &globális alapértékként", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8, WS_DISABLED + PUSHBUTTON "&Alapértelmezett", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 + LTEXT "Nyelv:", 0, 13, 8, 34, 8 END DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 @@ -834,7 +834,18 @@ BEGIN IDS_2123 "Mentés" IDS_2124 "A 86Box névjegye" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "Régi számítógépek emulátora\n\nFejlesztők: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, és mások.\n\nMegjelent a GNU General Public License v2 alatt. További információért lásd a LICENSE fájlt. " + IDS_2126 "Régi számítógépek emulátora\n\n" + + "Fejlesztők: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\n" + + /* + Translate the following line as "Translated by: \n\n". + If there were previous translators, don't erase their name, just add yours to the end of line. + */ + + "Fordította: Laci bá'\n\n" + + "Megjelent a GNU General Public License v2 vagy újabb alatt. További információért lásd a LICENSE fájlt." IDS_2127 "OK" IDS_2128 "Hardver nem elérhető" #ifdef _WIN32 @@ -979,7 +990,7 @@ BEGIN IDS_6146 "1.5%%-kal a tökéletes RPM alatt" IDS_6147 "2%%-kal a tökéletes RPM alatt" - IDS_7168 "magyar (Magyarország)" + IDS_7168 "(A rendszer nyelve)" END #define IDS_LANG_ENUS IDS_7168 diff --git a/src/win/win_lang.c b/src/win/win_lang.c index cc7882840..805856b6d 100644 --- a/src/win/win_lang.c +++ b/src/win/win_lang.c @@ -66,7 +66,7 @@ progsett_fill_languages(HWND hdlg) HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG); SendMessage(lang_combo, CB_RESETCONTENT, 0, 0); - SendMessage(lang_combo, CB_ADDSTRING, 0, (LPARAM)L"(System Default)"); + SendMessage(lang_combo, CB_ADDSTRING, 0, win_get_string(IDS_7168)); SendMessage(lang_combo, CB_SETITEMDATA, 0, 0xFFFF); enum_helper = 0; c = 1; From c0fb42b75678abe591ebb5bc71b382be26d07b84 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Nov 2021 18:38:27 -0300 Subject: [PATCH 094/159] Disable VNC on Jenkins dev builds --- .ci/build.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 94f84706e..e441d2242 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -544,16 +544,16 @@ case $JOB_BASE_NAME in $project-Dev) if is_windows then - build 32 --preset=experimental - build 64 --preset=experimental + build 32 --preset=experimental -D VNC=OFF + build 64 --preset=experimental -D VNC=OFF elif is_mac then - build Universal --preset=experimental + build Universal --preset=experimental -D VNC=OFF else - build x86 --preset=experimental - build x86_64 --preset=experimental - build arm32 --preset=experimental - build arm64 --preset=experimental + build x86 --preset=experimental -D VNC=OFF + build x86_64 --preset=experimental -D VNC=OFF + build arm32 --preset=experimental -D VNC=OFF + build arm64 --preset=experimental -D VNC=OFF fi ;; From c705803c1d7373e54a11fa6beaf9e41b836b2119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 22:54:31 +0100 Subject: [PATCH 095/159] Remove translators text from en-US about --- src/win/languages/en-US.rc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index a171fe941..f21f91de5 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -838,11 +838,11 @@ BEGIN "Authors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\n" /* - Translate the following line as "Translated by: \n\n". - If there were previous translators, don't erase their name, just add yours to the end of line. + Here uncomment following line and add your name like "Translated by: \n\n". + If such a line exists with name of previous translators, don't erase their name, just add yours to the end of line. */ - - "This is the program's base language.\n\n" + + //"Translated by: \n\n" "Released under the GNU General Public License version 2 or later. See LICENSE for more information." From 758d8acb63bf5bf9d41c66fc00ee4ec35dfa358e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 13 Nov 2021 22:57:01 +0100 Subject: [PATCH 096/159] Temporarily reverted all keyboard changes. --- src/device/kbc_at.c | 2324 ------------------------------- src/device/kbd_at.c | 1162 ---------------- src/device/keyboard_at.c | 2834 ++++++++++++++------------------------ src/device/mouse_ps2.c | 55 +- 4 files changed, 1074 insertions(+), 5301 deletions(-) delete mode 100644 src/device/kbc_at.c delete mode 100644 src/device/kbd_at.c diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c deleted file mode 100644 index bb756f67d..000000000 --- a/src/device/kbc_at.c +++ /dev/null @@ -1,2324 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box distribution. - * - * Intel 8042 (AT keyboard controller) emulation. - * - * - * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd - * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2020 EngiNerd. - */ -#include -#include -#include -#include -#include -#define HAVE_STDARG_H -#include -#include <86box/86box.h> -#include "cpu.h" -#include <86box/timer.h> -#include <86box/io.h> -#include <86box/pic.h> -#include <86box/pit.h> -#include <86box/ppi.h> -#include <86box/mem.h> -#include <86box/device.h> -#include <86box/machine.h> -#include <86box/m_xt_xi8088.h> -#include <86box/m_at_t3100e.h> -#include <86box/fdd.h> -#include <86box/fdc.h> -#include <86box/sound.h> -#include <86box/snd_speaker.h> -#include <86box/video.h> -#include <86box/keyboard.h> - - -#define STAT_PARITY 0x80 -#define STAT_RTIMEOUT 0x40 -#define STAT_TTIMEOUT 0x20 -#define STAT_MFULL 0x20 -#define STAT_UNLOCKED 0x10 -#define STAT_CD 0x08 -#define STAT_SYSFLAG 0x04 -#define STAT_IFULL 0x02 -#define STAT_OFULL 0x01 - -#define RESET_DELAY_TIME 1000 /* 100 ms */ - -#define CCB_UNUSED 0x80 -#define CCB_TRANSLATE 0x40 -#define CCB_PCMODE 0x20 -#define CCB_ENABLEKBD 0x10 -#define CCB_IGNORELOCK 0x08 -#define CCB_SYSTEM 0x04 -#define CCB_ENABLEMINT 0x02 -#define CCB_ENABLEKINT 0x01 - -#define CCB_MASK 0x68 -#define MODE_MASK 0x6c - -#define KBC_TYPE_ISA 0x00 /* AT ISA-based chips */ -#define KBC_TYPE_PS2_1 0x04 /* PS2 type, no refresh */ -/* This only differs in that translation is forced off. */ -#define KBC_TYPE_PS2_2 0x05 /* PS2 on PS/2, type 2 */ -#define KBC_TYPE_MASK 0x07 - -#define KBC_FLAG_PS2 0x04 - -/* We need to redefine this: - Currently, we use bits 3-7 for vendor, we should instead use bits 4-7 - for vendor, 0-3 for revision/variant, and have a dev->ps2 flag controlling - controller mode, normally set according to the flags, but togglable on - AMIKey: - 0000 0000 0x00 IBM, AT - 0000 0001 0x01 MR - 0000 0010 0x02 Xi8088, clone of IBM PS/2 type 1 - 0001 0000 0x10 Olivetti - 0010 0000 0x20 Toshiba - 0011 0000 0x30 Quadtel - 0100 0000 0x40 Phoenix MultiKey/42 - 0101 0000 0x50 AMI KF - 0101 0001 0x51 AMI KH - 0101 0010 0x52 AMIKey - 0101 0011 0x53 AMIKey-2 - 0101 0100 0x54 JetKey (clone of AMI KF/AMIKey) - 0110 0000 0x60 Award - 0110 0001 0x61 Award 286 (has some AMI commands apparently) - 0111 0000 0x70 Siemens -*/ - -/* Standard IBM controller */ -#define KBC_VEN_GENERIC 0x00 -/* All commands are standard PS/2 */ -#define KBC_VEN_IBM_MCA 0x08 -/* Standard IBM commands, differs in input port bits */ -#define KBC_VEN_IBM_PS1 0x10 -/* Olivetti - proprietary commands and port 62h with switches - readout */ -#define KBC_VEN_OLIVETTI 0x20 -/* Toshiba T3100e - has a bunch of proprietary commands, also sets - IFULL on command AA */ -#define KBC_VEN_TOSHIBA 0x28 -/* Standard IBM commands, uses input port as a switches readout */ -#define KBC_VEN_NCR 0x30 -/* Xi8088 - standard IBM commands, has a turbo bit on port 61h, and the - polarity of the video type bit in the input port is inverted */ -#define KBC_VEN_XI8088 0x38 -/* QuadtelKey - currently guesswork */ -#define KBC_VEN_QUADTEL 0x40 -/* Phoenix MultiKey/42 - not yet implemented */ -#define KBC_VEN_PHOENIX 0x48 -/* Generic commands, XI8088-like input port handling of video type, - maybe we just need a flag for that? */ -#define KBC_VEN_ACER 0x50 -/* AMI KF/KH/AMIKey/AMIKey-2 */ -#define KBC_VEN_AMI 0xf0 -/* Standard AMI commands, differs in input port bits */ -#define KBC_VEN_INTEL_AMI 0xf8 -#define KBC_VEN_MASK 0xf8 - - -/* Flags should be fully 32-bit: - Bits 7- 0: Vendor and revision/variant; - Bits 15- 8: Input port mask; - Bits 23-16: Input port bits that are always on; - Bits 31-24: Flags: - Bit 0: Invert P1 video type bit polarity; - Bit 1: Is PS/2; - Bit 2: Translation forced always off. - - So for example, the IBM PS/2 type 1 controller flags would be: 00000010 00000000 11111111 00000000 = 0200ff00 . */ - - -typedef struct { - uint8_t *c_in, *c_data, /* Data to controller */ - *d_in, *d_data, /* Data to device */ - *inhibit; - - void (*process)(void *priv); - void *priv; -} kbc_dev_t; - -typedef struct { - uint8_t status, ib, ob, p1, p2, old_p2, p2_locked, fast_a20_phase, - secr_phase, mem_index, ami_stat, ami_mode, - kbc_in, kbc_cmd, kbc_in_cmd, kbc_poll_phase, kbc_to_send, - kbc_send_pending, kbc_channel, kbc_stat_hi, kbc_wait_for_response, inhibit; - - uint8_t mem_int[0x40], mem[0x240]; - - uint16_t last_irq, kbc_phase; - - uint32_t flags; - - kbc_dev_t * kbc_devs[2]; - - pc_timer_t pulse_cb, send_delay_timer; - - uint8_t (*write60_ven)(void *p, uint8_t val); - uint8_t (*write64_ven)(void *p, uint8_t val); - - void * log; -} atkbc_t; - - -enum -{ - CHANNEL_KBC = 0, - CHANNEL_KBD, - CHANNEL_MOUSE -}; - -enum -{ - KBD_MAIN_LOOP = 0, - KBD_CMD_PROCESS -}; - -enum -{ - MOUSE_MAIN_LOOP_1 = 0, - MOUSE_CMD_PROCESS, - MOUSE_CMD_END, - MOUSE_MAIN_LOOP_2 -}; - -enum { - KBC_MAIN_LOOP = 0, - KBC_RESET = 1, - KBC_WAIT = 4, - KBC_WAIT_FOR_KBD, - KBC_WAIT_FOR_MOUSE, - KBC_WAIT_FOR_BOTH -}; - - -static void kbc_wait(atkbc_t *dev, uint8_t flags); - - -/* Bits 0 - 1 = scan code set, bit 6 = translate or not. */ -uint8_t keyboard_mode = 0x42; - -uint8_t * ami_copr = (uint8_t *) "(C)1994 AMI"; - - -uint8_t mouse_queue[16]; -int mouse_queue_start = 0, mouse_queue_end = 0; -static void (*mouse_write)(uint8_t val, void *priv) = NULL; -static void *mouse_p = NULL; -static uint8_t sc_or = 0; -static atkbc_t *saved_kbc = NULL; - - -/* Non-translated to translated scan codes. */ -static const uint8_t nont_to_t[256] = { - 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, - 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59, - 0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, - 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b, - 0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, - 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d, - 0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, - 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f, - 0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, - 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61, - 0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, - 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76, - 0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, - 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f, - 0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, - 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54, - 0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff -}; - - -#define UISTR_LEN 256 -static char kbc_str[UISTR_LEN]; /* UI output string */ - - -extern void ui_sb_bugui(char *__str); - - -static void -kbc_status(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vsprintf(kbc_str, fmt, ap); - ui_sb_bugui(kbc_str); - va_end(ap); -} - - -#define ENABLE_KBC_AT_LOG 1 -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBC_AT_LOG)) -int kbc_at_do_log = ENABLE_KBC_AT_LOG; - - -static void -kbc_log(atkbc_t *dev, const char *fmt, ...) -{ - va_list ap; - - if ((dev == NULL) || (dev->log == NULL)) - return; - - if (kbc_at_do_log) { - va_start(ap, fmt); - log_out(dev->log, fmt, ap); - va_end(ap); - } -} -#else -#define kbc_log(dev, fmt, ...) -#endif - - -static void -kbc_send_to_ob(atkbc_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) -{ - uint8_t ch = (channel > 0) ? channel : 1; - uint8_t do_irq = (dev->mem[0x20] & ch); - int translate = (channel == 1) && (keyboard_mode & 0x60); - - if ((channel == 2) && !(dev->flags & KBC_FLAG_PS2)) - return; - - stat_hi |= dev->inhibit; - - if (!dev->kbc_send_pending) { - dev->kbc_send_pending = 1; - dev->kbc_to_send = val; - dev->kbc_channel = channel; - dev->kbc_stat_hi = stat_hi; - return; - } - - if (translate) { - /* Allow for scan code translation. */ - if (val == 0xf0) { - kbc_log(dev, "Translate is on, F0 prefix detected\n"); - sc_or = 0x80; - return; - } - - /* Skip break code if translated make code has bit 7 set. */ - if ((sc_or == 0x80) && (val & 0x80)) { - kbc_log(dev, "Translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); - sc_or = 0; - return; - } - } - - dev->last_irq = (ch == 2) ? 0x1000 : 0x0002; - if (do_irq) { - kbc_log(dev, "[%04X:%08X] IRQ %i\n", CS, cpu_state.pc, (ch == 2) ? 12 : 1); - picint(dev->last_irq); - } - kbc_log(dev, "%02X coming from channel %i (%i)\n", val, channel, do_irq); - dev->ob = translate ? (nont_to_t[val] | sc_or) : val; - - dev->status = (dev->status & 0x0f) | (stat_hi | (dev->mem[0x20] & STAT_SYSFLAG) | STAT_OFULL); - if (ch == 2) - dev->status |= STAT_MFULL; - - if (translate && (sc_or == 0x80)) - sc_or = 0; -} - - -static void -write_output(atkbc_t *dev, uint8_t val) -{ - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - kbc_log(dev, "Write output port: %02X (old: %02X)\n", val, dev->p2); - - if ((kbc_ven == KBC_VEN_AMI) || (dev->flags & KBC_FLAG_PS2)) - val |= ((dev->mem[0x20] << 4) & 0x30); - - dev->kbc_devs[0]->inhibit = (val & 0x40); - dev->kbc_devs[1]->inhibit = (val & 0x08); - - if ((dev->p2 ^ val) & 0x20) { /*IRQ 12*/ - if (val & 0x20) { - kbc_log(dev, "write_output(): IRQ 12\n"); - picint(1 << 12); - } else - picintc(1 << 12); - } - if ((dev->p2 ^ val) & 0x10) { /*IRQ 1*/ - if (val & 0x10) { - kbc_log(dev, "write_output(): IRQ 1\n"); - picint(1 << 1); - } else - picintc(1 << 1); - } - if ((dev->p2 ^ val) & 0x02) { /*A20 enable change*/ - mem_a20_key = val & 0x02; - mem_a20_recalc(); - flushmmucache(); - } - if ((dev->p2 ^ val) & 0x01) { /*Reset*/ - if (! (val & 0x01)) { - /* Pin 0 selected. */ - softresetx86(); /*Pulse reset!*/ - cpu_set_edx(); - smbase = is_am486dxl ? 0x00060000 : 0x00030000; - } - } - /* Mask off the A20 stuff because we use mem_a20_key directly for that. */ - dev->p2 = val; -} - - -static void -write_cmd(atkbc_t *dev, uint8_t val) -{ - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - kbc_log(dev, "Write command byte: %02X (old: %02X)\n", val, dev->mem[0x20]); - - /* PS/2 type 2 keyboard controllers always force the XLAT bit to 0. */ - if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) - val &= ~CCB_TRANSLATE; - - dev->mem[0x20] = val; - - /* Scan code translate ON/OFF. */ - keyboard_mode &= 0x93; - keyboard_mode |= (val & MODE_MASK); - - kbc_log(dev, "Keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); - - /* ISA AT keyboard controllers use bit 5 for keyboard mode (1 = PC/XT, 2 = AT); - PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. - The AMIKEY firmware apparently uses this bit for something else. */ - if ((kbc_ven == KBC_VEN_AMI) || (dev->flags & KBC_FLAG_PS2)) { - keyboard_mode &= ~CCB_PCMODE; - /* Update the output port to mirror the KBD DIS and AUX DIS bits, if active. */ - write_output(dev, dev->p2); - - kbc_log(dev, "Mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); - } - - kbc_log(dev, "Command byte now: %02X (%02X)\n", dev->mem[0x20], val); - - dev->status = (dev->status & ~STAT_SYSFLAG) | (val & STAT_SYSFLAG); -} - - -static void -pulse_output(atkbc_t *dev, uint8_t mask) -{ - if (mask != 0x0f) { - dev->old_p2 = dev->p2 & ~(0xf0 | mask); - kbc_log(dev, "pulse_output(): Output port now: %02X\n", dev->p2 & (0xf0 | mask | (dev->mem[0x20] & 0x30))); - write_output(dev, dev->p2 & (0xf0 | mask | (dev->mem[0x20] & 0x30))); - timer_set_delay_u64(&dev->pulse_cb, 6ULL * TIMER_USEC); - } -} - - -static void -set_enable_kbd(atkbc_t *dev, uint8_t enable) -{ - dev->mem[0x20] &= 0xef; - dev->mem[0x20] |= (enable ? 0x00 : 0x10); -} - - -static void -set_enable_mouse(atkbc_t *dev, uint8_t enable) -{ - dev->mem[0x20] &= 0xdf; - dev->mem[0x20] |= (enable ? 0x00 : 0x20); -} - - -static void -kbc_transmit(atkbc_t *dev, uint8_t val) -{ - kbc_send_to_ob(dev, val, 0, 0x00); -} - - -static void -kbc_command(atkbc_t *dev) -{ - uint8_t mask, val = dev->ib; - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - int bad = 1; - - if ((dev->kbc_phase > 0) && (dev->kbc_cmd == 0xac)) { - if (dev-> kbc_phase < 16) - kbc_transmit(dev, dev->mem[dev->kbc_phase]); - else if (dev-> kbc_phase == 16) - kbc_transmit(dev, (dev->p1 & 0xf0) | 0x80); - else if (dev-> kbc_phase == 17) - kbc_transmit(dev, dev->p2); - else if (dev-> kbc_phase == 18) - kbc_transmit(dev, dev->status); - - dev->kbc_phase++; - if (dev->kbc_phase == 19) { - dev->kbc_phase = 0; - dev->kbc_cmd = 0x00; - } - return; - } else if ((dev->kbc_phase > 0) && (dev->kbc_cmd == 0xa0) && (kbc_ven >= KBC_VEN_AMI)) { - val = ami_copr[dev->kbc_phase]; - kbc_transmit(dev, val); - if (val == 0x00) { - dev->kbc_phase = 0; - dev->kbc_cmd = 0x00; - } else - dev->kbc_phase++; - return; - } else if ((dev->kbc_in > 0) && (dev->kbc_cmd == 0xa5) && (dev->flags & KBC_FLAG_PS2)) { - /* load security */ - kbc_log(dev, "Load security\n"); - dev->mem[0x50 + dev->kbc_in - 0x01] = val; - if ((dev->kbc_in == 0x80) && (val != 0x00)) { - /* Security string too long, set it to 0x00. */ - dev->mem[0x50] = 0x00; - dev->kbc_in = 0; - dev->kbc_cmd = 0; - } else if (val == 0x00) { - /* Security string finished. */ - dev->kbc_in = 0; - dev->kbc_cmd = 0; - } else /* Increase pointer and request another byte. */ - dev->kbc_in++; - return; - } - - /* If the written port is 64, go straight to the beginning of the command. */ - if (!(dev->status & STAT_CD) && dev->kbc_in) { - /* Write data to controller. */ - dev->kbc_in = 0; - dev->kbc_phase = 0; - - switch (dev->kbc_cmd) { - case 0x60 ... 0x7f: - if (dev->kbc_cmd == 0x60) - write_cmd(dev, val); - else - dev->mem[(dev->kbc_cmd & 0x1f) + 0x20] = val; - break; - - case 0xc7: /* or input port with system data */ - dev->p1 |= val; - break; - - case 0xcb: /* set keyboard mode */ - kbc_log(dev, "New AMIKey mode: %02X\n", val); - dev->ami_mode = val; - dev->flags &= ~KBC_FLAG_PS2; - if (val & 1) - dev->flags |= KBC_FLAG_PS2; -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBD_AT_LOG)) - log_set_dev_name(dev->kbc_log, (dev->flags & KBC_FLAG_PS2) ? "AT KBC" : "PS/2 KBC"); -#endif - break; - - case 0xd1: /* write output port */ - if (dev->p2_locked) { - /*If keyboard controller lines P22-P23 are blocked, - we force them to remain unchanged.*/ - val &= ~0x0c; - val |= (dev->p2 & 0x0c); - } - kbc_log(dev, "Write %02X to output port\n", val); - write_output(dev, val); - break; - - case 0xd2: /* write to keyboard output buffer */ - kbc_log(dev, "Write %02X to keyboard output buffer\n", val); - /* Should be channel 1, but we send to 0 to avoid translation, - since bytes output using this command do *NOT* get translated. */ - kbc_send_to_ob(dev, val, 0, 0x00); - break; - - case 0xd3: /* write to mouse output buffer */ - kbc_log(dev, "Write %02X to mouse output buffer\n", val); - if (dev->flags & KBC_FLAG_PS2) - kbc_send_to_ob(dev, val, 2, 0x00); - break; - - case 0xd4: /* write to mouse */ - kbc_log(dev, "Write %02X to mouse\n", val); - - if (dev->flags & KBC_FLAG_PS2) { - set_enable_mouse(dev, 1); - dev->mem[0x20] &= ~0x20; - if (dev->kbc_devs[1] && !dev->kbc_devs[1]->c_in) { - kbc_log(dev, "Transmitting %02X to mouse...\n", dev->ib); - dev->kbc_devs[1]->d_data = val; - dev->kbc_devs[1]->d_in = 1; - dev->kbc_wait_for_response = 2; - } else - kbc_send_to_ob(dev, 0xfe, 2, 0x40); - } - break; - - default: - /* - * Run the vendor-specific handler - * if we have one. Otherwise, or if - * it returns an error, log a bad - * controller command. - */ - if (dev->write60_ven) - bad = dev->write60_ven(dev, val); - - if (bad) - kbc_log(dev, "Bad controller command %02x data %02x\n", dev->kbc_cmd, val); - } - } else { - /* Controller command. */ - kbc_log(dev, "Controller command: %02X\n", val); - dev->kbc_in = 0; - dev->kbc_phase = 0; - - switch (val) { - /* Read data from KBC memory. */ - case 0x20 ... 0x3f: - kbc_transmit(dev, dev->mem[(val & 0x1f) + 0x20]); - break; - - /* Write data to KBC memory. */ - case 0x60 ... 0x7f: - dev->kbc_in = 1; - break; - - case 0xaa: /* self-test */ - kbc_log(dev, "Self-test\n"); - write_output(dev, (dev->flags & KBC_FLAG_PS2) ? 0x4b : 0xcf); - - /* Always reinitialize all queues - the real hardware pulls keyboard and mouse - clocks high, which stops keyboard scanning. */ - dev->in_cmd = dev->mouse_in_cmd = 0; - dev->status &= ~STAT_OFULL; - dev->last_irq = 0; - dev->kbc_phase = 0; - - /* Phoenix MultiKey should have 0x60 | STAT_SYSFLAG. */ - if (dev->flags & KBC_FLAG_PS2) - write_cmd(dev, 0x30 | STAT_SYSFLAG); - else - write_cmd(dev, 0x10 | STAT_SYSFLAG); - kbc_transmit(dev, 0x55); - break; - - case 0xab: /* interface test */ - kbc_log(dev, "Interface test\n"); - /* No error. */ - kbc_transmit(dev, 0x00); - break; - - case 0xac: /* diagnostic dump */ - kbc_log(dev, "Diagnostic dump\n"); - kbc_transmit(dev, dev->mem[0x20]); - dev->kbc_phase = 1; - break; - - case 0xad: /* disable keyboard */ - kbc_log(dev, "Disable keyboard\n"); - set_enable_kbd(dev, 0); - break; - - case 0xae: /* enable keyboard */ - kbc_log(dev, "Enable keyboard\n"); - set_enable_kbd(dev, 1); - break; - - case 0xc7: /* or input port with system data */ - kbc_log(dev, "Phoenix - or input port with system data\n"); - dev->kbc_in = 1; - break; - - case 0xca: /* read keyboard mode */ - kbc_log(dev, "AMI - Read keyboard mode\n"); - kbc_transmit(dev, dev->ami_mode); - break; - - case 0xcb: /* set keyboard mode */ - kbc_log(dev, "ATkbc: AMI - Set keyboard mode\n"); - dev->kbc_in = 1; - break; - - case 0xd0: /* read output port */ - kbc_log(dev, "Read output port\n"); - mask = 0xff; - if (dev->mem[0x20] & 0x10) - mask &= 0xbf; - if ((dev->flags & KBC_FLAG_PS2) && (dev->mem[0x20] & 0x20)) - mask &= 0xf7; - kbc_transmit(dev, dev->p2 & mask); - break; - - case 0xd1: /* write output port */ - kbc_log(dev, "Write output port\n"); - dev->kbc_in = 1; - break; - - case 0xd2: /* write keyboard output buffer */ - kbc_log(dev, "Write keyboard output buffer\n"); - if (dev->flags & KBC_FLAG_PS2) - dev->kbc_in = 1; - else - kbc_transmit(dev, 0x00); /* NCR */ - break; - - case 0xdd: /* disable A20 address line */ - case 0xdf: /* enable A20 address line */ - kbc_log(dev, "%sable A20\n", (val == 0xdd) ? "Dis": "En"); - write_output(dev, (dev->p2 & 0xfd) | (val & 0x02)); - break; - - case 0xe0: /* read test inputs */ - kbc_log(dev, "Read test inputs\n"); - kbc_transmit(dev, 0x00); - break; - - default: - /* - * Unrecognized controller command. - * - * If we have a vendor-specific handler, run - * that. Otherwise, or if that handler fails, - * log a bad command. - */ - if (dev->write64_ven) - bad = dev->write64_ven(dev, val); - - if (bad) - kbc_log(dev, "Bad controller command %02X\n", val); - } - - /* If the command needs data, remember the command. */ - if (dev->kbc_in || (dev->kbc_phase > 0)) - dev->kbc_cmd = val; - } -} - - -static void -kbc_dev_data_to_ob(atkbc_t *dev, uint8_t channel) -{ - if (channel == 0) - return; - - dev->kbc_devs[channel - 1]->c_in = 0; - kbc_log(dev, "Forwarding %02X from channel %i...\n", dev->kbc_devs[channel - 1]->c_data, channel); - kbc_send_to_ob(dev, dev->kbc_devs[channel - 1]->c_data, channel, 0x00); -} - - -static void -kbc_main_loop_scan(atkbc_t *dev) -{ - uint8_t port_dis = dev->mem[0x20] & 0x30; - uint8_t ps2 = (dev->flags & KBC_FLAG_PS2); - - if (!ps2) - port_dis |= 0x20; - - if (!(dev->status & STAT_OFULL)) { - if (port_dis & 0x20) { - if (!(port_dis & 0x10)) { - kbc_log(dev, "kbc_process(): Main loop, Scan: AUX DIS, KBD EN\n"); - /* Enable communication with keyboard. */ - dev->p2 &= 0xbf; - dev->kbc_devs[0]->inhibit = 0; - kbc_wait(dev, 1); - } else - kbc_log(dev, "kbc_process(): Main loop, Scan: AUX DIS, KBD DIS\n"); - } else { - /* Enable communication with mouse. */ - dev->p2 &= 0xf7; - dev->kbc_devs[1]->inhibit = 0; - if (dev->mem[0x20] & 0x10) { - kbc_log(dev, "kbc_process(): Main loop, Scan: AUX EN , KBD DIS\n"); - kbc_wait(dev, 2); - } else { - /* Enable communication with keyboard. */ - kbc_log(dev, "kbc_process(): Main loop, Scan: AUX EN , KBD EN\n"); - dev->p2 &= 0xbf; - dev->kbc_devs[0]->inhibit = 0; - kbc_wait(dev, 3); - } - } - } else - kbc_log(dev, "kbc_process(): Main loop, Scan: IBF not full and OBF full, do nothing\n"); -} - - -static uint8_t -kbc_reset_cmd(atkbc_t *dev) -{ - uint8_t ret = 0; - - if ((dev->status & STAT_CD) || (dev->kbc_poll_phase == KBC_WAIT_FOR_NOBF)) { - kbc_log(dev, " Resetting command\n"); - dev->kbc_phase = 0; - dev->kbc_in = 0; - dev->kbc_in_cmd = 0; - dev->kbc_poll_phase = KBC_MAIN_LOOP; - ret = 1; - } - - return ret; -} - - -static uint8_t -kbc_process_cmd(atkbdt_t *dev, uint8_t restart) -{ - uint8_t ret = 0; - - if (restart) - dev->kbc_in_cmd = 1; - kbc_command(dev); - - if ((dev->kbc_phase == 0) && !dev->kbc_in) - dev->kbc_in_cmd = 0; - else - ret = 1; - - dev->kbc_poll_phase = KBC_MAIN_LOOP; - if (!dev->kbc_wait_for_response && !(dev->status & STAT_OFULL)) - kbc_main_loop_scan(dev); - - return ret; -} - - -static void -kbc_process_ib(atkbc_t *dev) -{ - if ((dev->status & STAT_CD) || (kbc->flags & KBC_FLAG_PS2) || !(dev->status & STAT_OFULL)) - dev->status &= ~STAT_IFULL; - - if (dev->status & STAT_CD) - (void) kbc_process_cmd(dev, 1); - else if ((kbc->flags & KBC_FLAG_PS2) || !(dev->status & STAT_OFULL)) - /* The AT KBC does *NOT* send data to the keyboard if OBF. */ - set_enable_mouse(dev, 1); - dev->mem[0x20] &= ~0x10; - if (dev->kbc_devs[0] && !dev->kbc_devs[0]->c_in) { - dev->kbc_devs[0]->d_data = val; - dev->kbc_devs[0]->d_in = 1; - dev->kbc_wait_for_response = 1; - } else - kbc_send_to_ob(dev, 0xfe, 1, 0x40); - - dev->kbc_poll_phase = KBC_MAIN_LOOP; - if (!dev->kbc_wait_for_response && !(dev->status & STAT_OFULL)) - kbc_main_loop_scan(dev); - } -} - - -static void -kbc_wait(atkbc_t *dev, uint8_t flags) -{ - if ((flags & 1) && dev->kbc_devs[0]->c_in) { - /* Disable communication with mouse. */ - dev->p2 |= 0x08; - dev->kbc_devs[1]->inhibit = 1; - /* Send keyboard byte to host. */ - kbc_dev_data_to_ob(dev, CHANNEL_KBD); - dev->kbc_poll_phase = KBC_MAIN_LOOP; - } else if ((flags & 2) && dev->kbc_devs[1]->c_in) { - /* Disable communication with keyboard. */ - dev->p2 |= 0x40; - dev->kbc_devs[0]->inhibit = 1; - /* Send mouse byte to host. */ - kbc_dev_data_to_ob(dev, CHANNEL_MOUSE); - dev->kbc_poll_phase = KBC_MAIN_LOOP; - } else if (dev->status & STAT_IFULL) { - /* Disable communication with keyboard and mouse. */ - dev->p2 |= 0x48; - dev->kbc_devs[0]->inhibit = dev->kbc_devs[1]->inhibit = 1; - kbc_process_ib(dev); - } else - dev->kbc_poll_phase = KBC_WAIT | flags; -} - - -/* Controller processing */ -static void -kbc_process(atkbc_t *dev) -{ - /* If we're waiting for the response from the keyboard or mouse, do nothing - until the device has repsonded back. */ - if (dev->kbc_wait_for_response > 0) { - if (dev->kbc_devs[dev->kbc_wait_for_response - 1]->c_in) - dev->kbc_wait_for_response = 0; - else - return; - } - - if (dev->kbc_send_pending) { - kbc_log(dev, "Sending delayed %02X on channel %i with high status %02X\n", - dev->kbc_to_send, dev->kbc_channel, dev->kbc_stat_hi); - kbc_send_to_ob(dev, dev->kbc_to_send, dev->kbc_channel, dev->kbc_stat_hi); - dev->kbc_send_pending = 0; - } - - /* Make absolutely sure to do nothing if OBF is full and IBF is empty. */ - if ((dev->kbc_poll_phase == KBC_RESET) || (dev->kbc_poll_phase >= KBC_WAIT_FOR_NIBF) || - !(dev->status & STAT_OFULL) || (dev->status & STAT_IFULL)) switch (dev->kbc_poll_phase) { - case KBC_RESET: - kbc_log(dev, "kbc_process(): Reset loop()\n"); - - if (dev->status & STAT_IFULL) { - dev->status &= ~STAT_IFULL; - - if ((dev->status & STAT_CD) && (dev->ib == 0xaa)) { - (void) kbc_process_cmd(dev, 1); - dev->kbc_poll_phase = KBC_MAIN_LOOP; - } - } - break; - case KBC_MAIN_LOOP: - if (dev->status & STAT_IFULL) { - kbc_log(dev, "kbc_process(): Main loop, IBF full, process\n"); - kbc_process_ib(dev); - } else - kbc_main_loop_scan(dev); - break; - case KBC_SCAN_KBD: - case KBC_SCAN_MOUSE: - case KBC_SCAN_BOTH: - kbc_log(dev, "kbc_process(): Scan: Phase %i\n", dev->kbc_poll_phase); - kbc_wait(dev, dev->kbc_poll_phase & 3); - break; - case KBC_WAIT_FOR_NOBF: - kbc_log(dev, "kbc_process(): Waiting for !OBF\n"); - - if (dev->status & STAT_IFULL) { - /* Host writing a command aborts the current command. */ - (void) !kbc_reset_cmd(dev); - - /* Process the input buffer. */ - kbc_process_ib(dev); - } else if (!dev->status & STAT_OFULL) { - /* Not aborted and OBF cleared - process command. */ - kbc_log(dev, " Continuing commmand\n"); - - if (kbc_process_cmd(dev, 0)) - return; - } - break; - case KBC_WAIT_FOR_IBF: - kbc_log(dev, "kbc_process(): Waiting for IBF\n"); - - if (dev->status & STAT_IFULL) { - /* IBF, process if port 60h, otherwise abort the current command. */ - dev->status &= ~STAT_IFULL; - - if (!kbc_reset_cmd(dev)) - kbc_log(dev, " Continuing commmand\n"); - - /* Process command. */ - if (kbc_process_cmd(dev, 0)) - return; - } - break; - default: - kbc_log(dev, "kbc_process(): Invalid phase %i\n", dev->kbc_poll_phase); - break; - } -} - - -static void -kbd_poll(void *priv) -{ - atkbc_t *dev = (atkbc_t *) priv; - uint8_t i; - - if (dev == NULL) - return; - - timer_advance_u64(&dev->send_delay_timer, (100ULL * TIMER_USEC)); - - /* Device processing */ - for (i = 0; i < 2; i++) { - if (dev->kbc_devs[i] && dev->kbd_devs[i]->priv && dev->kbd_devs[i]->process) - dev->kbc_devs[i]->process(dev->kbc_devs[i]->priv); - } - - /* Controller processing */ - kbc_process(dev); -} - - -static void -pulse_poll(void *priv) -{ - atkbc_t *dev = (atkbc_t *)priv; - - kbc_log(dev, "pulse_poll(): Output port now: %02X\n", dev->p2 | dev->old_p2); - write_output(dev, dev->p2 | dev->old_p2); -} - - -static uint8_t -write64_generic(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - uint8_t current_drive, fixed_bits; - uint8_t kbc_ven = 0x0; - kbc_ven = dev->flags & KBC_VEN_MASK; - - switch (val) { - case 0xa4: /* check if password installed */ - if (dev->flags & KBC_FLAG_PS2) { - kbc_log(dev, "Check if password installed\n"); - kbc_transmit(dev, (dev->mem[0x50] == 0x00) ? 0xf1 : 0xfa); - return 0; - } - break; - - case 0xa5: /* load security */ - if (dev->flags & KBC_FLAG_PS2) { - kbc_log(dev, "Load security\n"); - dev->kbc_in = 1; - return 0; - } - break; - - case 0xa7: /* disable mouse port */ - if (dev->flags & KBC_FLAG_PS2) { - kbc_log(dev, "Disable mouse port\n"); - return 0; - } - break; - - case 0xa8: /*Enable mouse port*/ - if (dev->flags & KBC_FLAG_PS2) { - kbc_log(dev, "Enable mouse port\n"); - return 0; - } - break; - - case 0xa9: /*Test mouse port*/ - kbc_log(dev, "Test mouse port\n"); - if (dev->flags & KBC_FLAG_PS2) { - /* No error, this is testing the channel 2 interface. */ - kbc_transmit(dev, 0x00); - return 0; - } - break; - - case 0xaf: /* read keyboard version */ - kbc_log(dev, "Read keyboard version\n"); - kbc_transmit(dev, 0x00); - return 0; - - case 0xc0: /* read input port */ - /* IBM PS/1: - Bit 2 and 4 ignored (we return always 0), - Bit 6 must 1 for 5.25" floppy drive, 0 for 3.5". - Intel AMI: - Bit 2 ignored (we return always 1), - Bit 4 must be 1, - Bit 6 must be 1 or else error in SMM. - Acer: - Bit 2 must be 0, - Bit 4 must be 0, - Bit 6 ignored. - P6RP4: - Bit 2 must be 1 or CMOS setup is disabled. */ - kbc_log(dev, "Read input port\n"); - fixed_bits = 4; - /* The SMM handlers of Intel AMI Pentium BIOS'es expect bit 6 to be set. */ - if (kbc_ven == KBC_VEN_INTEL_AMI) - fixed_bits |= 0x40; - if (kbc_ven == KBC_VEN_IBM_PS1) { - current_drive = fdc_get_current_drive(); - kbc_transmit(dev, dev->p1 | fixed_bits | (fdd_is_525(current_drive) ? 0x40 : 0x00)); - dev->p1 = ((dev->p1 + 1) & 3) | (dev->p1 & 0xfc) | (fdd_is_525(current_drive) ? 0x40 : 0x00); - } else if (kbc_ven == KBC_VEN_NCR) { - /* switch settings - * bit 7: keyboard disable - * bit 6: display type (0 color, 1 mono) - * bit 5: power-on default speed (0 high, 1 low) - * bit 4: sense RAM size (0 unsupported, 1 512k on system board) - * bit 3: coprocessor detect - * bit 2: unused - * bit 1: high/auto speed - * bit 0: dma mode - */ - kbc_transmit(dev, (dev->p1 | fixed_bits | (video_is_mda() ? 0x40 : 0x00) | (hasfpu ? 0x08 : 0x00)) & 0xdf); - dev->p1 = ((dev->p1 + 1) & 3) | (dev->p1 & 0xfc); - } else { - if ((dev->flags & KBC_FLAG_PS2) && ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) - kbc_transmit(dev, (dev->p1 | fixed_bits) & (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef)); - else - kbc_transmit(dev, dev->p1 | fixed_bits); - dev->p1 = ((dev->p1 + 1) & 3) | (dev->p1 & 0xfc); - } - return 0; - - case 0xd3: /* write mouse output buffer */ - if (dev->flags & KBC_FLAG_PS2) { - kbc_log(dev, "Write mouse output buffer\n"); - dev->kbc_in = 1; - return 0; - } - break; - - case 0xd4: /* write to mouse */ - kbc_log(dev, "Write to mouse\n"); - dev->kbc_in = 1; - return 0; - - case 0xf0 ... 0xff: - kbc_log(dev, "Pulse %01X\n", val & 0x0f); - pulse_output(dev, val & 0x0f); - return 0; - } - - kbc_log(dev, "Bad command %02X\n", val); - return 1; -} - - -static uint8_t -write60_ami(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - uint16_t index = 0x00c0; - - switch(dev->kbc_cmd) { - /* 0x40 - 0x5F are aliases for 0x60 - 0x7F */ - case 0x40 ... 0x5f: - kbc_log(dev, "AMI - Alias write to %08X\n", dev->kbc_cmd); - if (dev->kbc_cmd == 0x40) - write_cmd(dev, val); - else - dev->mem[(dev->kbc_cmd & 0x1f) + 0x20] = val; - return 0; - - case 0xaf: /* set extended controller RAM */ - kbc_log(dev, "AMI - Set extended controller RAM, input phase %i\n", dev->secr_phase); - if (dev->secr_phase == 0) { - dev->mem_index = val; - dev->kbc_in = 1; - dev->secr_phase++; - } else if (dev->secr_phase == 1) { - if (dev->mem_index == 0x20) - write_cmd(dev, val); - else - dev->mem[dev->mem_index] = val; - dev->secr_phase = 0; - } - return 0; - - case 0xb8: - kbc_log(dev, "AMIKey-3 - Memory index %02X\n", val); - dev->mem_index = val; - return 0; - - case 0xbb: - kbc_log(dev, "AMIKey-3 - write %02X to memory index %02X\n", val, dev->mem_index); - if (dev->mem_index >= 0x80) { - switch (dev->mem[0x9b] & 0xc0) { - case 0x00: - index = 0x0080; - break; - case 0x40: case 0x80: - index = 0x0000; - break; - case 0xc0: - index = 0x0100; - break; - } - dev->mem[index + dev->mem_index] = val; - } else if (dev->mem_index == 0x60) - write_cmd(dev, val); - else if (dev->mem_index == 0x42) - dev->status = val; - else if (dev->mem_index >= 0x40) - dev->mem[dev->mem_index - 0x40] = val; - else - dev->mem_int[dev->mem_index] = val; - return 0; - - case 0xbd: - kbc_log(dev, "AMIKey-3 - write %02X to config index %02X\n", val, dev->mem_index); - switch (dev->mem_index) { - case 0x00: /* STAT8042 */ - dev->status = val; - break; - case 0x01: /* Password_ptr */ - dev->mem[0x1c] = val; - break; - case 0x02: /* Wakeup_Tsk_Reg */ - dev->mem[0x1e] = val; - break; - case 0x03: /* CCB */ - write_cmd(dev, val); - break; - case 0x04: /* Debounce_time */ - dev->mem[0x4d] = val; - break; - case 0x05: /* Pulse_Width */ - dev->mem[0x4e] = val; - break; - case 0x06: /* Pk_sel_byte */ - dev->mem[0x4c] = val; - break; - case 0x07: /* Func_Tsk_Reg */ - dev->mem[0x7e] = val; - break; - case 0x08: /* TypematicRate */ - dev->mem[0x80] = val; - break; - case 0x09: /* Led_Flag_Byte */ - dev->mem[0x81] = val; - break; - case 0x0a: /* Kbms_Command_St */ - dev->mem[0x87] = val; - break; - case 0x0b: /* Delay_Count_Byte */ - dev->mem[0x86] = val; - break; - case 0x0c: /* KBC_Flags */ - dev->mem[0x9b] = val; - break; - case 0x0d: /* SCODE_HK1 */ - dev->mem[0x50] = val; - break; - case 0x0e: /* SCODE_HK2 */ - dev->mem[0x51] = val; - break; - case 0x0f: /* SCODE_HK3 */ - dev->mem[0x52] = val; - break; - case 0x10: /* SCODE_HK4 */ - dev->mem[0x53] = val; - break; - case 0x11: /* SCODE_HK5 */ - dev->mem[0x54] = val; - break; - case 0x12: /* SCODE_HK6 */ - dev->mem[0x55] = val; - break; - case 0x13: /* TASK_HK1 */ - dev->mem[0x56] = val; - break; - case 0x14: /* TASK_HK2 */ - dev->mem[0x57] = val; - break; - case 0x15: /* TASK_HK3 */ - dev->mem[0x58] = val; - break; - case 0x16: /* TASK_HK4 */ - dev->mem[0x59] = val; - break; - case 0x17: /* TASK_HK5 */ - dev->mem[0x5a] = val; - break; - /* The next 4 bytes have uncertain correspondences. */ - case 0x18: /* Batt_Poll_delay_Time */ - dev->mem[0x5b] = val; - break; - case 0x19: /* Batt_Alarm_Reg1 */ - dev->mem[0x5c] = val; - break; - case 0x1a: /* Batt_Alarm_Reg2 */ - dev->mem[0x5d] = val; - break; - case 0x1b: /* Batt_Alarm_Tsk_Reg */ - dev->mem[0x5e] = val; - break; - case 0x1c: /* Kbc_State1 */ - dev->mem[0x9d] = val; - break; - case 0x1d: /* Aux_Config */ - dev->mem[0x75] = val; - break; - case 0x1e: /* Kbc_State3 */ - dev->mem[0x73] = val; - break; - } - return 0; - - case 0xc1: /* write input port */ - kbc_log(dev, "AMI MegaKey - write %02X to input port\n", val); - dev->p1 = val; - return 0; - - case 0xcb: /* set keyboard mode */ - kbc_log(dev, "AMI - Set keyboard mode\n"); - return 0; - } - - return 1; -} - - -static uint8_t -write64_ami(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - uint16_t index = 0x00c0; - - switch (val) { - case 0x00 ... 0x1f: - kbc_log(dev, "AMI - Alias read from %08X\n", val); - kbc_transmit(dev, dev->mem[val + 0x20]); - return 0; - - case 0x40 ... 0x5f: - kbc_log(dev, "AMI - Alias write to %08X\n", dev->kbc_cmd); - dev->kbc_in = 1; - return 0; - - case 0xa0: /* copyright message */ - kbc_log(dev, "AMI - Get copyright message\n"); - kbc_transmit(dev, ami_copr[0]); - dev->kbc_phase = 1; - return 0; - - case 0xa1: /* get controller version */ - kbc_log(dev, "AMI - Get controller version\n"); - // kbc_transmit(dev, 'H'); - kbc_transmit(dev, '5'); - return 0; - - case 0xa2: /* clear keyboard controller lines P22/P23 */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Clear KBC lines P22 and P23\n"); - write_output(dev, dev->p2 & 0xf3); - kbc_transmit(dev, 0x00); - return 0; - } - break; - - case 0xa3: /* set keyboard controller lines P22/P23 */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Set KBC lines P22 and P23\n"); - write_output(dev, dev->p2 | 0x0c); - kbc_transmit(dev, 0x00); - return 0; - } - break; - - case 0xa4: /* write clock = low */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Write clock = low\n"); - dev->ami_stat &= 0xfe; - return 0; - } - break; - - case 0xa5: /* write clock = high */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Write clock = high\n"); - dev->ami_stat |= 0x01; - return 0; - } - break; - - case 0xa6: /* read clock */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Read clock\n"); - kbc_transmit(dev, !!(dev->ami_stat & 1)); - return 0; - } - break; - - case 0xa7: /* write cache bad */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Write cache bad\n"); - dev->ami_stat &= 0xfd; - return 0; - } - break; - - case 0xa8: /* write cache good */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Write cache good\n"); - dev->ami_stat |= 0x02; - return 0; - } - break; - - case 0xa9: /* read cache */ - if (!(dev->flags & KBC_FLAG_PS2)) { - kbc_log(dev, "AMI - Read cache\n"); - kbc_transmit(dev, !!(dev->ami_stat & 2)); - return 0; - } - break; - - case 0xaf: /* set extended controller RAM */ - kbc_log(dev, "AMI - Set extended controller RAM\n"); - dev->kbc_in = 1; - return 0; - - case 0xb0 ... 0xb3: - /* set KBC lines P10-P13 (input port bits 0-3) low */ - kbc_log(dev, "AMI - Set KBC lines P10-P13 (input port bits 0-3) low\n"); - if (!(dev->flags & KBC_FLAG_PS2) || (val > 0xb1)) { - dev->p1 &= ~(1 << (val & 0x03)); - } - kbc_transmit(dev, 0x00); - return 0; - - case 0xb4: case 0xb5: - /* set KBC lines P22-P23 (output port bits 2-3) low */ - kbc_log(dev, "AMI - Set KBC lines P22-P23 (output port bits 2-3) low\n"); - if (!(dev->flags & KBC_FLAG_PS2)) - write_output(dev, dev->p2 & ~(4 << (val & 0x01))); - kbc_transmit(dev, 0x00); - return 0; - -#if 0 - case 0xb8 ... 0xbb: -#else - case 0xb9: -#endif - /* set KBC lines P10-P13 (input port bits 0-3) high */ - kbc_log(dev, "AMI - Set KBC lines P10-P13 (input port bits 0-3) high\n"); - if (!(dev->flags & KBC_FLAG_PS2) || (val > 0xb9)) { - dev->p1 |= (1 << (val & 0x03)); - kbc_transmit(dev, 0x00); - } - return 0; - - case 0xb8: - kbc_log(dev, "AMIKey-3 - memory index\n"); - dev->kbc_in = 1; - return 0; - - case 0xba: - kbc_log(dev, "AMIKey-3 - read %02X memory from index %02X\n", dev->mem[dev->mem_index], dev->mem_index); - if (dev->mem_index >= 0x80) { - switch (dev->mem[0x9b] & 0xc0) { - case 0x00: - index = 0x0080; - break; - case 0x40: case 0x80: - index = 0x0000; - break; - case 0xc0: - index = 0x0100; - break; - } - kbc_transmit(dev, dev->mem[index + dev->mem_index]); - } else if (dev->mem_index == 0x42) - kbc_transmit(dev, dev->status); - else if (dev->mem_index >= 0x40) - kbc_transmit(dev, dev->mem[dev->mem_index - 0x40]); - else - kbc_transmit(dev, dev->mem_int[dev->mem_index]); - return 0; - - case 0xbb: - kbc_log(dev, "AMIKey-3 - write to memory index %02X\n", dev->mem_index); - dev->kbc_in = 1; - return 0; - -#if 0 - case 0xbc: case 0xbd: - /* set KBC lines P22-P23 (output port bits 2-3) high */ - kbc_log(dev, "AMI - Set KBC lines P22-P23 (output port bits 2-3) high\n"); - if (!(dev->flags & KBC_FLAG_PS2)) - write_output(dev, dev->p2 | (4 << (val & 0x01))); - kbc_transmit(dev, 0x00); - return 0; -#endif - - case 0xbc: - switch (dev->mem_index) { - case 0x00: /* STAT8042 */ - kbc_transmit(dev, dev->status); - break; - case 0x01: /* Password_ptr */ - kbc_transmit(dev, dev->mem[0x1c]); - break; - case 0x02: /* Wakeup_Tsk_Reg */ - kbc_transmit(dev, dev->mem[0x1e]); - break; - case 0x03: /* CCB */ - kbc_transmit(dev, dev->mem[0x20]); - break; - case 0x04: /* Debounce_time */ - kbc_transmit(dev, dev->mem[0x4d]); - break; - case 0x05: /* Pulse_Width */ - kbc_transmit(dev, dev->mem[0x4e]); - break; - case 0x06: /* Pk_sel_byte */ - kbc_transmit(dev, dev->mem[0x4c]); - break; - case 0x07: /* Func_Tsk_Reg */ - kbc_transmit(dev, dev->mem[0x7e]); - break; - case 0x08: /* TypematicRate */ - kbc_transmit(dev, dev->mem[0x80]); - break; - case 0x09: /* Led_Flag_Byte */ - kbc_transmit(dev, dev->mem[0x81]); - break; - case 0x0a: /* Kbms_Command_St */ - kbc_transmit(dev, dev->mem[0x87]); - break; - case 0x0b: /* Delay_Count_Byte */ - kbc_transmit(dev, dev->mem[0x86]); - break; - case 0x0c: /* KBC_Flags */ - kbc_transmit(dev, dev->mem[0x9b]); - break; - case 0x0d: /* SCODE_HK1 */ - kbc_transmit(dev, dev->mem[0x50]); - break; - case 0x0e: /* SCODE_HK2 */ - kbc_transmit(dev, dev->mem[0x51]); - break; - case 0x0f: /* SCODE_HK3 */ - kbc_transmit(dev, dev->mem[0x52]); - break; - case 0x10: /* SCODE_HK4 */ - kbc_transmit(dev, dev->mem[0x53]); - break; - case 0x11: /* SCODE_HK5 */ - kbc_transmit(dev, dev->mem[0x54]); - break; - case 0x12: /* SCODE_HK6 */ - kbc_transmit(dev, dev->mem[0x55]); - break; - case 0x13: /* TASK_HK1 */ - kbc_transmit(dev, dev->mem[0x56]); - break; - case 0x14: /* TASK_HK2 */ - kbc_transmit(dev, dev->mem[0x57]); - break; - case 0x15: /* TASK_HK3 */ - kbc_transmit(dev, dev->mem[0x58]); - break; - case 0x16: /* TASK_HK4 */ - kbc_transmit(dev, dev->mem[0x59]); - break; - case 0x17: /* TASK_HK5 */ - kbc_transmit(dev, dev->mem[0x5a]); - break; - /* The next 4 bytes have uncertain correspondences. */ - case 0x18: /* Batt_Poll_delay_Time */ - kbc_transmit(dev, dev->mem[0x5b]); - break; - case 0x19: /* Batt_Alarm_Reg1 */ - kbc_transmit(dev, dev->mem[0x5c]); - break; - case 0x1a: /* Batt_Alarm_Reg2 */ - kbc_transmit(dev, dev->mem[0x5d]); - break; - case 0x1b: /* Batt_Alarm_Tsk_Reg */ - kbc_transmit(dev, dev->mem[0x5e]); - break; - case 0x1c: /* Kbc_State1 */ - kbc_transmit(dev, dev->mem[0x9d]); - break; - case 0x1d: /* Aux_Config */ - kbc_transmit(dev, dev->mem[0x75]); - break; - case 0x1e: /* Kbc_State3 */ - kbc_transmit(dev, dev->mem[0x73]); - break; - default: - kbc_transmit(dev, 0x00); - break; - } - kbc_log(dev, "AMIKey-3 - read from config index %02X\n", dev->mem_index); - return 0; - - case 0xbd: - kbc_log(dev, "AMIKey-3 - write to config index %02X\n", dev->mem_index); - dev->kbc_in = 1; - return 0; - - case 0xc1: /* write input port */ - kbc_log(dev, "AMIKey-3 - write input port\n"); - dev->kbc_in = 1; - return 0; - - case 0xc8: case 0xc9: - /* - * (un)block KBC lines P22/P23 - * (allow command D1 to change bits 2/3 of the output port) - */ - kbc_log(dev, "AMI - %slock KBC lines P22 and P23\n", (val & 1) ? "B" : "Unb"); - dev->p2_locked = (val & 1); - return 0; - - case 0xef: /* ??? - sent by AMI486 */ - kbc_log(dev, "??? - sent by AMI486\n"); - return 0; - } - - return write64_generic(dev, val); -} - - -static uint8_t -write64_ibm_mca(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - - switch (val) { - case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/ - kbc_log(dev, "Copy bits 0 to 3 of input port to status bits 4 to 7\n"); - dev->status &= 0x0f; - dev->status |= ((((dev->p1 & 0xfc) | 0x84) & 0x0f) << 4); - return 0; - - case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/ - kbc_log(dev, "Copy bits 4 to 7 of input port to status bits 4 to 7\n"); - dev->status &= 0x0f; - dev->status |= (((dev->p1 & 0xfc) | 0x84) & 0xf0); - return 0; - - case 0xaf: - kbc_log(dev, "Bad KBC command AF\n"); - return 1; - - case 0xf0 ... 0xff: - kbc_log(dev, "Pulse: %01X\n", (val & 0x03) | 0x0c); - pulse_output(dev, (val & 0x03) | 0x0c); - return 0; - } - - return write64_generic(dev, val); -} - - -static uint8_t -write60_quadtel(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - - switch(dev->kbc_cmd) { - case 0xcf: /*??? - sent by MegaPC BIOS*/ - kbc_log(dev, "??? - sent by MegaPC BIOS\n"); - return 0; - } - - return 1; -} - - -static uint8_t -write64_olivetti(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - - switch (val) { - /* This appears to be a clone of "Read input port", in which case, the bis would be: - 7: M290 (AT KBC): - Keyboard lock (1 = unlocked, 0 = locked); - M300 (PS/2 KBC): - Bus expansion board present (1 = present, 0 = not present); - 6: Usually: - Display (1 = MDA, 0 = CGA, but can have its polarity inverted); - 5: Manufacturing jumper (1 = not installed, 0 = installed (infinite loop)); - 4: RAM on motherboard (1 = 256 kB, 0 = 512 kB - which machine actually uses this?); - 3: Fast Ram check (if inactive keyboard works erratically); - 2: Keyboard fuse present - This appears to be in-line with PS/2: 1 = no power, 0 = keyboard power normal; - 1: M290 (AT KBC): - Unused; - M300 (PS/2 KBC): - Mouse data in; - 0: M290 (AT KBC): - Unused; - M300 (PS/2 KBC): - Key data in. - */ - case 0x80: /* Olivetti-specific command */ - /* - * bit 7: bus expansion board present (M300) / keyboard unlocked (M290) - * bits 4-6: ??? - * bit 3: fast ram check (if inactive keyboard works erratically) - * bit 2: keyboard fuse present - * bits 0-1: ??? - */ - kbc_transmit(dev, 0x0c | (is386 ? 0x00 : 0x80)); - return 0; - } - - return write64_generic(dev, val); -} - - -static uint8_t -write64_quadtel(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - - switch (val) { - case 0xaf: - kbc_log(dev, "Bad KBC command AF\n"); - return 1; - - case 0xcf: /*??? - sent by MegaPC BIOS*/ - kbc_log(dev, "??? - sent by MegaPC BIOS\n"); - dev->kbc_in = 1; - return 0; - } - - return write64_generic(dev, val); -} - - -static uint8_t -write60_toshiba(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - - switch(dev->kbc_cmd) { - case 0xb6: /* T3100e - set color/mono switch */ - kbc_log(dev, "T3100e - Set color/mono switch\n"); - t3100e_mono_set(val); - return 0; - } - - return 1; -} - - -static uint8_t -write64_toshiba(void *priv, uint8_t val) -{ - atkbc_t *dev = (atkbc_t *)priv; - - switch (val) { - case 0xaf: - kbc_log(dev, "Bad KBC command AF\n"); - return 1; - - case 0xb0: /* T3100e: Turbo on */ - kbc_log(dev, "T3100e: Turbo on\n"); - t3100e_turbo_set(1); - return 0; - - case 0xb1: /* T3100e: Turbo off */ - kbc_log(dev, "T3100e: Turbo off\n"); - t3100e_turbo_set(0); - return 0; - - case 0xb2: /* T3100e: Select external display */ - kbc_log(dev, "T3100e: Select external display\n"); - t3100e_display_set(0x00); - return 0; - - case 0xb3: /* T3100e: Select internal display */ - kcd_log("T3100e: Select internal display\n"); - t3100e_display_set(0x01); - return 0; - - case 0xb4: /* T3100e: Get configuration / status */ - kbc_log(dev, "T3100e: Get configuration / status\n"); - kbc_transmit(dev, t3100e_config_get()); - return 0; - - case 0xb5: /* T3100e: Get colour / mono byte */ - kbc_log(dev, "T3100e: Get colour / mono byte\n"); - kbc_transmit(dev, t3100e_mono_get()); - return 0; - - case 0xb6: /* T3100e: Set colour / mono byte */ - kbc_log(dev, "T3100e: Set colour / mono byte\n"); - dev->kbc_in = 1; - return 0; - - case 0xb7: /* T3100e: Emulate PS/2 keyboard */ - case 0xb8: /* T3100e: Emulate AT keyboard */ - dev->flags &= ~KBC_FLAG_PS2; - if (val == 0xb7) { - kbc_log(dev, "T3100e: Emulate PS/2 keyboard\n"); - dev->flags |= KBC_FLAG_PS2; - } else - kbc_log(dev, "T3100e: Emulate AT keyboard\n"); -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBD_AT_LOG)) - log_set_dev_name(dev->kbc_log, (dev->flags & KBC_FLAG_PS2) ? "AT KBC" : "PS/2 KBC"); -#endif - return 0; - - case 0xbb: /* T3100e: Read 'Fn' key. - Return it for right Ctrl and right Alt; on the real - T3100e, these keystrokes could only be generated - using 'Fn'. */ - kbc_log(dev, "T3100e: Read 'Fn' key\n"); - if (keyboard_recv(0xb8) || /* Right Alt */ - keyboard_recv(0x9d)) /* Right Ctrl */ - kbc_transmit(dev, 0x04); - else - kbc_transmit(dev, 0x00); - return 0; - - case 0xbc: /* T3100e: Reset Fn+Key notification */ - kbc_log(dev, "T3100e: Reset Fn+Key notification\n"); - t3100e_notify_set(0x00); - return 0; - - case 0xc0: /*Read input port*/ - kbc_log(dev, "Read input port\n"); - - /* The T3100e returns all bits set except bit 6 which - * is set by t3100e_mono_set() */ - dev->p1 = (t3100e_mono_get() & 1) ? 0xff : 0xbf; - kbc_transmit(dev, dev->p1); - return 0; - - } - - return write64_generic(dev, val); -} - - -static void -kbc_write(uint16_t port, uint8_t val, void *priv) -{ - atkbc_t *dev = (atkbc_t *)priv; - - kbc_log(dev, "[%04X:%08X] write(%04X, %02X)\n", CS, cpu_state.pc, port, val); - - switch (port) { - case 0x60: - dev->status = (dev->status & ~STAT_CD) | STAT_IFULL; - dev->ib = val; - // kbd_status("Write %02X: %02X, Status = %02X\n", port, val, dev->status); - -#if 0 - if ((dev->fast_a20_phase == 1)/* && ((val == 0xdd) || (val == 0xdf))*/) { - dev->status &= ~STAT_IFULL; - write_output(dev, val); - dev->fast_a20_phase = 0; - } -#endif - break; - case 0x64: - dev->status |= (STAT_CD | STAT_IFULL); - dev->ib = val; - // kbd_status("Write %02X: %02X, Status = %02X\n", port, val, dev->status); - -#if 0 - if (val == 0xd1) { - dev->status &= ~STAT_IFULL; - dev->fast_a20_phase = 1; - } else if (val == 0xfe) { - dev->status &= ~STAT_IFULL; - pulse_output(dev, 0x0e); - } else if ((val == 0xad) || (val == 0xae)) { - dev->status &= ~STAT_IFULL; - if (val & 0x01) - dev->mem[0x20] |= 0x10; - else - dev->mem[0x20] &= ~0x10; - } else if (val == 0xa1) { - dev->status &= ~STAT_IFULL; - kbc_send_to_ob(dev, 'H', 0, 0x00); - } -#endif - break; - } -} - - -static uint8_t -kbc_read(uint16_t port, void *priv) -{ - atkbc_t *dev = (atkbc_t *)priv; - uint8_t ret = 0xff; - - // if (dev->flags & KBC_FLAG_PS2) - // cycles -= ISA_CYCLES(8); - - switch (port) { - case 0x60: - ret = dev->ob; - dev->status &= ~STAT_OFULL; - picintc(dev->last_irq); - dev->last_irq = 0; - break; - - case 0x64: - ret = dev->status; - break; - - default: - kbc_log(dev, "Reading unknown port %02X\n", port); - break; - } - - kbc_log(dev, "[%04X:%08X] read(%04X) = %02X\n",CS, cpu_state.pc, port, ret); - - return(ret); -} - - -static void -kbc_reset(void *priv) -{ - atkbc_t *dev = (atkbc_t *)priv; - int i; - uint8_t kbc_ven = 0x0; - kbc_ven = dev->flags & KBC_VEN_MASK; - - dev->status = STAT_UNLOCKED; - dev->mem[0x20] = 0x01; - dev->mem[0x20] |= CCB_TRANSLATE; - write_output(dev, 0xcf); - dev->last_irq = 0; - dev->secr_phase = 0; - dev->in = 0; - dev->ami_mode = !!(dev->flags & KBC_FLAG_PS2); - - /* Set up the correct Video Type bits. */ - dev->p1 = video_is_mda() ? 0xf0 : 0xb0; - if ((kbc_ven == KBC_VEN_XI8088) || (kbc_ven == KBC_VEN_ACER)) - dev->p1 ^= 0x40; - if ((kbc_ven == KBC_VEN_AMI) || (dev->flags & KBC_FLAG_PS2)) - dev->inhibit = ((dev->p1 & 0x80) >> 3); - else - dev->inhibit = 0x10; - kbc_log(dev, "Input port = %02x\n", dev->p1); - - keyboard_mode = 0x02 | (dev->mem[0x20] & CCB_TRANSLATE); - - /* Enable keyboard, disable mouse. */ - set_enable_kbd(dev, 1); - keyboard_scan = 1; - set_enable_mouse(dev, 0); - mouse_scan = 0; - - dev->ob = 0xff; - - sc_or = 0; - - dev->mem[0x31] = 0xfe; -} - - -/* Reset the AT keyboard - this is needed for the PCI TRC and is done - until a better solution is found. */ -void -keyboard_at_reset(void) -{ - kbc_reset(SavedKbd); -} - - -void -kbc_dev_attach(kbc_dev_t *kbc_dev, int channel) -{ - if ((channel < 1) || (channel > 2)) - log_fatal(saved_kbc->log, "Attaching device to invalid channel %i\n", channel); - else { - kbc_log(saved_kbc, "Attaching device to channel %i\n", channel); - saved_kbc->kbc_devs[channel - 1] = kbc_dev; - } -} - - -static void -kbc_close(void *priv) -{ - atkbc_t *dev = (atkbc_t *)priv; - - kbc_reset(dev); - - /* Stop timers. */ - timer_disable(&dev->send_delay_timer); - -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBC_AT_LOG)) - log_close(dev->log); -#endif - - free(dev); -} - - -static void * -kbc_init(const device_t *info) -{ - atkbc_t *dev; - - dev = (atkbc_t *)malloc(sizeof(atkbc_t)); - memset(dev, 0x00, sizeof(atkbc_t)); - - dev->flags = info->local; - - video_reset(gfxcard); - dev->kbc_poll_phase = KBC_RESET; - - io_sethandler(0x0060, 1, kbc_read, NULL, NULL, kbc_write, NULL, NULL, dev); - io_sethandler(0x0064, 1, kbc_read, NULL, NULL, kbc_write, NULL, NULL, dev); - - timer_add(&dev->send_delay_timer, kbd_poll, dev, 1); - timer_add(&dev->pulse_cb, pulse_poll, dev, 0); - -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBC_AT_LOG)) - dev->kbc_log = log_open((dev->flags & KBC_FLAG_PS2) ? "AT KBC" : "PS/2 KBC"); -#endif - - dev->write60_ven = NULL; - dev->write64_ven = NULL; - - switch(dev->flags & KBC_VEN_MASK) { - case KBC_VEN_ACER: - case KBC_VEN_GENERIC: - case KBC_VEN_NCR: - case KBC_VEN_IBM_PS1: - case KBC_VEN_XI8088: - dev->write64_ven = write64_generic; - break; - - case KBC_VEN_OLIVETTI: - /* The Olivetti controller is a special case - starts directly in the - main loop instead of the reset loop. */ - dev->kbc_poll_phase = KBC_MAIN_LOOP; - dev->write64_ven = write64_olivetti; - break; - - case KBC_VEN_AMI: - case KBC_VEN_INTEL_AMI: - dev->write60_ven = write60_ami; - dev->write64_ven = write64_ami; - break; - - case KBC_VEN_IBM_MCA: - dev->write64_ven = write64_ibm_mca; - break; - - case KBC_VEN_QUADTEL: - dev->write60_ven = write60_quadtel; - dev->write64_ven = write64_quadtel; - break; - - case KBC_VEN_TOSHIBA: - dev->write60_ven = write60_toshiba; - dev->write64_ven = write64_toshiba; - break; - } - - kbc_reset(dev); - - /* Local variable, needed for device attaching. */ - saved_kbc = dev; - - /* Add the actual keyboard. */ - device_add(&keyboard_at_kbd_device); - - return(dev); -} - - -const device_t keyboard_at_device = { - "PC/AT Keyboard", - 0, - KBC_TYPE_ISA | KBC_VEN_GENERIC, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_at_ami_device = { - "PC/AT Keyboard (AMI)", - 0, - KBC_TYPE_ISA | KBC_VEN_AMI, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_at_toshiba_device = { - "PC/AT Keyboard (Toshiba)", - 0, - KBC_TYPE_ISA | KBC_VEN_TOSHIBA, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_at_olivetti_device = { - "PC/AT Keyboard (Olivetti)", - 0, - KBC_TYPE_ISA | KBC_VEN_OLIVETTI, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_at_ncr_device = { - "PC/AT Keyboard (NCR)", - 0, - KBC_TYPE_ISA | KBC_VEN_NCR, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_device = { - "PS/2 Keyboard", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_ps1_device = { - "PS/2 Keyboard (IBM PS/1)", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_IBM_PS1, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_ps1_pci_device = { - "PS/2 Keyboard (IBM PS/1)", - DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_IBM_PS1, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_xi8088_device = { - "PS/2 Keyboard (Xi8088)", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_XI8088, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_ami_device = { - "PS/2 Keyboard (AMI)", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_AMI, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_olivetti_device = { - "PS/2 Keyboard (Olivetti)", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_OLIVETTI, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_mca_device = { - "PS/2 Keyboard", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_IBM_MCA, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_mca_2_device = { - "PS/2 Keyboard", - 0, - KBC_TYPE_PS2_2 | KBC_VEN_IBM_MCA, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_quadtel_device = { - "PS/2 Keyboard (Quadtel/MegaPC)", - 0, - KBC_TYPE_PS2_1 | KBC_VEN_QUADTEL, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_pci_device = { - "PS/2 Keyboard", - DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_ami_pci_device = { - "PS/2 Keyboard (AMI)", - DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_AMI, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_intel_ami_pci_device = { - "PS/2 Keyboard (AMI)", - DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_INTEL_AMI, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - -const device_t keyboard_ps2_acer_pci_device = { - "PS/2 Keyboard (Acer 90M002A)", - DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_ACER, - kbc_init, - kbc_close, - kbc_reset, - { NULL }, NULL, NULL, NULL -}; - - -void -keyboard_at_set_mouse(void (*func)(uint8_t val, void *priv), void *priv) -{ -} - - -void -keyboard_at_adddata_mouse(uint8_t val) -{ - return; -} - - -void -keyboard_at_adddata_mouse_direct(uint8_t val) -{ - return; -} - - -void -keyboard_at_adddata_mouse_cmd(uint8_t val) -{ - return; -} - - -void -keyboard_at_mouse_reset(void) -{ - return; -} - - -uint8_t -keyboard_at_mouse_pos(void) -{ - return ((mouse_queue_end - mouse_queue_start) & 0xf); -} - - -int -keyboard_at_fixed_channel(void) -{ - return 0x000; -} - - -void -keyboard_at_set_mouse_scan(uint8_t val) -{ - atkbc_t *dev = SavedKbd; - uint8_t temp_mouse_scan = val ? 1 : 0; - - if (temp_mouse_scan == !(dev->mem[0x20] & 0x20)) - return; - - set_enable_mouse(dev, val ? 1 : 0); - - kbc_log(dev, "Mouse scan %sabled via PCI\n", mouse_scan ? "en" : "dis"); -} - - -uint8_t -keyboard_at_get_mouse_scan(void) -{ - atkbc_t *dev = SavedKbd; - - return((dev->mem[0x20] & 0x20) ? 0x00 : 0x10); -} - - -void -keyboard_at_set_a20_key(int state) -{ - atkbc_t *dev = SavedKbd; - - write_output(dev, (dev->p2 & 0xfd) | ((!!state) << 1)); -} - - -void -keyboard_at_set_mode(int ps2) -{ - atkbc_t *dev = SavedKbd; - - if (ps2) - dev->flags |= KBC_FLAG_PS2; - else - dev->flags &= ~KBC_FLAG_PS2; -} diff --git a/src/device/kbd_at.c b/src/device/kbd_at.c deleted file mode 100644 index f24177d37..000000000 --- a/src/device/kbd_at.c +++ /dev/null @@ -1,1162 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box distribution. - * - * Intel 8042 (AT keyboard controller) emulation. - * - * - * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, - * EngiNerd - * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. - * Copyright 2017-2020 Fred N. van Kempen. - * Copyright 2020 EngiNerd. - */ -#include -#include -#include -#include -#include -#define HAVE_STDARG_H -#include -#include <86box/86box.h> -#include <86box/timer.h> -#include <86box/device.h> -#include <86box/log.h> -#include <86box/keyboard.h> - - -// static uint8_t key_queue[16]; -// static int key_queue_start = 0, key_queue_end = 0; -// static uint8_t kbd_last_scan_code; - -typedef struct { - uint8_t in, cmd, in_cmd, state, last_byte; - - uint8_t queue[16]; - - uint16_t phase; - - int quueue_start, queue_end; - - void * log; - - kbc_dev_t kd; -} atkbd_t; - - -enum -{ - CHANNEL_KBC = 0, - CHANNEL_KBD, - CHANNEL_MOUSE -}; - -enum -{ - KBD_MAIN_LOOP = 0, - KBD_CMD_PROCESS -}; - -enum -{ - MOUSE_MAIN_LOOP_1 = 0, - MOUSE_CMD_PROCESS, - MOUSE_CMD_END, - MOUSE_MAIN_LOOP_2 -}; - -enum { - KBC_MAIN_LOOP = 0, - KBC_RESET = 1, - KBC_WAIT = 4, - KBC_WAIT_FOR_KBD, - KBC_WAIT_FOR_MOUSE, - KBC_WAIT_FOR_BOTH -}; - - -static void kbd_cmd_process(atkbd_t *dev); - - -/* bit 0 = repeat, bit 1 = makes break code? */ -uint8_t keyboard_set3_flags[512]; -uint8_t keyboard_set3_all_repeat; -uint8_t keyboard_set3_all_break; - - -static atkbd_t *SavedKbd = NULL; // FIXME: remove!!! --FvK - - -#ifdef USE_SET1 -static const scancode scancode_set1[512] = { - { { 0},{ 0} }, { { 0x01,0},{ 0x81,0} }, { { 0x02,0},{ 0x82,0} }, { { 0x03,0},{ 0x83,0} }, /*000*/ - { { 0x04,0},{ 0x84,0} }, { { 0x05,0},{ 0x85,0} }, { { 0x06,0},{ 0x86,0} }, { { 0x07,0},{ 0x87,0} }, /*004*/ - { { 0x08,0},{ 0x88,0} }, { { 0x09,0},{ 0x89,0} }, { { 0x0a,0},{ 0x8a,0} }, { { 0x0b,0},{ 0x8b,0} }, /*008*/ - { { 0x0c,0},{ 0x8c,0} }, { { 0x0d,0},{ 0x8d,0} }, { { 0x0e,0},{ 0x8e,0} }, { { 0x0f,0},{ 0x8f,0} }, /*00c*/ - { { 0x10,0},{ 0x90,0} }, { { 0x11,0},{ 0x91,0} }, { { 0x12,0},{ 0x92,0} }, { { 0x13,0},{ 0x93,0} }, /*010*/ - { { 0x14,0},{ 0x94,0} }, { { 0x15,0},{ 0x95,0} }, { { 0x16,0},{ 0x96,0} }, { { 0x17,0},{ 0x97,0} }, /*014*/ - { { 0x18,0},{ 0x98,0} }, { { 0x19,0},{ 0x99,0} }, { { 0x1a,0},{ 0x9a,0} }, { { 0x1b,0},{ 0x9b,0} }, /*018*/ - { { 0x1c,0},{ 0x9c,0} }, { { 0x1d,0},{ 0x9d,0} }, { { 0x1e,0},{ 0x9e,0} }, { { 0x1f,0},{ 0x9f,0} }, /*01c*/ - { { 0x20,0},{ 0xa0,0} }, { { 0x21,0},{ 0xa1,0} }, { { 0x22,0},{ 0xa2,0} }, { { 0x23,0},{ 0xa3,0} }, /*020*/ - { { 0x24,0},{ 0xa4,0} }, { { 0x25,0},{ 0xa5,0} }, { { 0x26,0},{ 0xa6,0} }, { { 0x27,0},{ 0xa7,0} }, /*024*/ - { { 0x28,0},{ 0xa8,0} }, { { 0x29,0},{ 0xa9,0} }, { { 0x2a,0},{ 0xaa,0} }, { { 0x2b,0},{ 0xab,0} }, /*028*/ - { { 0x2c,0},{ 0xac,0} }, { { 0x2d,0},{ 0xad,0} }, { { 0x2e,0},{ 0xae,0} }, { { 0x2f,0},{ 0xaf,0} }, /*02c*/ - { { 0x30,0},{ 0xb0,0} }, { { 0x31,0},{ 0xb1,0} }, { { 0x32,0},{ 0xb2,0} }, { { 0x33,0},{ 0xb3,0} }, /*030*/ - { { 0x34,0},{ 0xb4,0} }, { { 0x35,0},{ 0xb5,0} }, { { 0x36,0},{ 0xb6,0} }, { { 0x37,0},{ 0xb7,0} }, /*034*/ - { { 0x38,0},{ 0xb8,0} }, { { 0x39,0},{ 0xb9,0} }, { { 0x3a,0},{ 0xba,0} }, { { 0x3b,0},{ 0xbb,0} }, /*038*/ - { { 0x3c,0},{ 0xbc,0} }, { { 0x3d,0},{ 0xbd,0} }, { { 0x3e,0},{ 0xbe,0} }, { { 0x3f,0},{ 0xbf,0} }, /*03c*/ - { { 0x40,0},{ 0xc0,0} }, { { 0x41,0},{ 0xc1,0} }, { { 0x42,0},{ 0xc2,0} }, { { 0x43,0},{ 0xc3,0} }, /*040*/ - { { 0x44,0},{ 0xc4,0} }, { { 0x45,0},{ 0xc5,0} }, { { 0x46,0},{ 0xc6,0} }, { { 0x47,0},{ 0xc7,0} }, /*044*/ - { { 0x48,0},{ 0xc8,0} }, { { 0x49,0},{ 0xc9,0} }, { { 0x4a,0},{ 0xca,0} }, { { 0x4b,0},{ 0xcb,0} }, /*048*/ - { { 0x4c,0},{ 0xcc,0} }, { { 0x4d,0},{ 0xcd,0} }, { { 0x4e,0},{ 0xce,0} }, { { 0x4f,0},{ 0xcf,0} }, /*04c*/ - { { 0x50,0},{ 0xd0,0} }, { { 0x51,0},{ 0xd1,0} }, { { 0x52,0},{ 0xd2,0} }, { { 0x53,0},{ 0xd3,0} }, /*050*/ - { { 0x54,0},{ 0xd4,0} }, { { 0x55,0},{ 0xd5,0} }, { { 0x56,0},{ 0xd6,0} }, { { 0x57,0},{ 0xd7,0} }, /*054*/ - { { 0x58,0},{ 0xd8,0} }, { { 0x59,0},{ 0xd9,0} }, { { 0x5a,0},{ 0xda,0} }, { { 0x5b,0},{ 0xdb,0} }, /*058*/ - { { 0x5c,0},{ 0xdc,0} }, { { 0x5d,0},{ 0xdd,0} }, { { 0x5e,0},{ 0xde,0} }, { { 0x5f,0},{ 0xdf,0} }, /*05c*/ - { { 0x60,0},{ 0xe0,0} }, { { 0x61,0},{ 0xe1,0} }, { { 0x62,0},{ 0xe2,0} }, { { 0x63,0},{ 0xe3,0} }, /*060*/ - { { 0x64,0},{ 0xe4,0} }, { { 0x65,0},{ 0xe5,0} }, { { 0x66,0},{ 0xe6,0} }, { { 0x67,0},{ 0xe7,0} }, /*064*/ - { { 0x68,0},{ 0xe8,0} }, { { 0x69,0},{ 0xe9,0} }, { { 0x6a,0},{ 0xea,0} }, { { 0x6b,0},{ 0xeb,0} }, /*068*/ - { { 0x6c,0},{ 0xec,0} }, { { 0x6d,0},{ 0xed,0} }, { { 0x6e,0},{ 0xee,0} }, { { 0x6f,0},{ 0xef,0} }, /*06c*/ - { { 0x70,0},{ 0xf0,0} }, { { 0x71,0},{ 0xf1,0} }, { { 0x72,0},{ 0xf2,0} }, { { 0x73,0},{ 0xf3,0} }, /*070*/ - { { 0x74,0},{ 0xf4,0} }, { { 0x75,0},{ 0xf5,0} }, { { 0x76,0},{ 0xf6,0} }, { { 0x77,0},{ 0xf7,0} }, /*074*/ - { { 0x78,0},{ 0xf8,0} }, { { 0x79,0},{ 0xf9,0} }, { { 0x7a,0},{ 0xfa,0} }, { { 0x7b,0},{ 0xfb,0} }, /*078*/ - { { 0x7c,0},{ 0xfc,0} }, { { 0x7d,0},{ 0xfd,0} }, { { 0x7e,0},{ 0xfe,0} }, { { 0x7f,0},{ 0xff,0} }, /*07c*/ - - { { 0x80,0},{ 0} }, { { 0x81,0},{ 0} }, { { 0x82,0},{ 0} }, { { 0},{ 0} }, /*080*/ - { { 0},{ 0} }, { { 0x85,0},{ 0} }, { { 0x86,0},{ 0} }, { { 0x87,0},{ 0} }, /*084*/ - { { 0x88,0},{ 0} }, { { 0x89,0},{ 0} }, { { 0x8a,0},{ 0} }, { { 0x8b,0},{ 0} }, /*088*/ - { { 0x8c,0},{ 0} }, { { 0x8d,0},{ 0} }, { { 0x8e,0},{ 0} }, { { 0x8f,0},{ 0} }, /*08c*/ - { { 0x90,0},{ 0} }, { { 0x91,0},{ 0} }, { { 0x92,0},{ 0} }, { { 0x93,0},{ 0} }, /*090*/ - { { 0x94,0},{ 0} }, { { 0x95,0},{ 0} }, { { 0x96,0},{ 0} }, { { 0x97,0},{ 0} }, /*094*/ - { { 0x98,0},{ 0} }, { { 0x99,0},{ 0} }, { { 0x9a,0},{ 0} }, { { 0x9b,0},{ 0} }, /*098*/ - { { 0x9c,0},{ 0} }, { { 0x9d,0},{ 0} }, { { 0x9e,0},{ 0} }, { { 0x9f,0},{ 0} }, /*09c*/ - { { 0xa0,0},{ 0} }, { { 0xa1,0},{ 0} }, { { 0xa2,0},{ 0} }, { { 0xa3,0},{ 0} }, /*0a0*/ - { { 0xa4,0},{ 0} }, { { 0xa5,0},{ 0} }, { { 0xa6,0},{ 0} }, { { 0xa7,0},{ 0} }, /*0a4*/ - { { 0xa8,0},{ 0} }, { { 0xa9,0},{ 0} }, { { 0xaa,0},{ 0} }, { { 0xab,0},{ 0} }, /*0a8*/ - { { 0xac,0},{ 0} }, { { 0xad,0},{ 0} }, { { 0xae,0},{ 0} }, { { 0xaf,0},{ 0} }, /*0ac*/ - { { 0xb0,0},{ 0} }, { { 0xb1,0},{ 0} }, { { 0xb2,0},{ 0} }, { { 0xb3,0},{ 0} }, /*0b0*/ - { { 0xb4,0},{ 0} }, { { 0xb5,0},{ 0} }, { { 0xb6,0},{ 0} }, { { 0xb7,0},{ 0} }, /*0b4*/ - { { 0xb8,0},{ 0} }, { { 0xb9,0},{ 0} }, { { 0xba,0},{ 0} }, { { 0xbb,0},{ 0} }, /*0b8*/ - { { 0xbc,0},{ 0} }, { { 0xbd,0},{ 0} }, { { 0xbe,0},{ 0} }, { { 0xbf,0},{ 0} }, /*0bc*/ - { { 0xc0,0},{ 0} }, { { 0xc1,0},{ 0} }, { { 0xc2,0},{ 0} }, { { 0xc3,0},{ 0} }, /*0c0*/ - { { 0xc4,0},{ 0} }, { { 0xc5,0},{ 0} }, { { 0xc6,0},{ 0} }, { { 0xc7,0},{ 0} }, /*0c4*/ - { { 0xc8,0},{ 0} }, { { 0xc9,0},{ 0} }, { { 0xca,0},{ 0} }, { { 0xcb,0},{ 0} }, /*0c8*/ - { { 0xcc,0},{ 0} }, { { 0xcd,0},{ 0} }, { { 0xce,0},{ 0} }, { { 0xcf,0},{ 0} }, /*0cc*/ - { { 0xd0,0},{ 0} }, { { 0xd1,0},{ 0} }, { { 0xd2,0},{ 0} }, { { 0xd3,0},{ 0} }, /*0d0*/ - { { 0xd4,0},{ 0} }, { { 0xd5,0},{ 0} }, { { 0xd6,0},{ 0} }, { { 0xd7,0},{ 0} }, /*0d4*/ - { { 0xd8,0},{ 0} }, { { 0xd9,0},{ 0} }, { { 0xda,0},{ 0} }, { { 0xdb,0},{ 0} }, /*0d8*/ - { { 0xdc,0},{ 0} }, { { 0xdd,0},{ 0} }, { { 0xde,0},{ 0} }, { { 0xdf,0},{ 0} }, /*0dc*/ - { { 0xe0,0},{ 0} }, { { 0xe1,0},{ 0} }, { { 0xe2,0},{ 0} }, { { 0xe3,0},{ 0} }, /*0e0*/ - { { 0xe4,0},{ 0} }, { { 0xe5,0},{ 0} }, { { 0xe6,0},{ 0} }, { { 0xe7,0},{ 0} }, /*0e4*/ - { { 0xe8,0},{ 0} }, { { 0xe9,0},{ 0} }, { { 0xea,0},{ 0} }, { { 0xeb,0},{ 0} }, /*0e8*/ - { { 0xec,0},{ 0} }, { { 0xed,0},{ 0} }, { { 0xee,0},{ 0} }, { { 0xef,0},{ 0} }, /*0ec*/ - { { 0},{ 0} }, { { 0xf1,0},{ 0} }, { { 0xf2,0},{ 0} }, { { 0xf3,0},{ 0} }, /*0f0*/ - { { 0xf4,0},{ 0} }, { { 0xf5,0},{ 0} }, { { 0xf6,0},{ 0} }, { { 0xf7,0},{ 0} }, /*0f4*/ - { { 0xf8,0},{ 0} }, { { 0xf9,0},{ 0} }, { { 0xfa,0},{ 0} }, { { 0xfb,0},{ 0} }, /*0f8*/ - { { 0xfc,0},{ 0} }, { { 0xfd,0},{ 0} }, { { 0xfe,0},{ 0} }, { { 0xff,0},{ 0} }, /*0fc*/ - - { {0xe1,0x1d,0},{0xe1, 0x9d,0} }, { {0xe0,0x01,0},{0xe0, 0x81,0} }, { {0xe0,0x02,0},{0xe0, 0x82,0} }, { {0xe0,0x03,0},{0xe0, 0x83,0} }, /*100*/ - { {0xe0,0x04,0},{0xe0, 0x84,0} }, { {0xe0,0x05,0},{0xe0, 0x85,0} }, { {0xe0,0x06,0},{0xe0, 0x86,0} }, { {0xe0,0x07,0},{0xe0, 0x87,0} }, /*104*/ - { {0xe0,0x08,0},{0xe0, 0x88,0} }, { {0xe0,0x09,0},{0xe0, 0x89,0} }, { {0xe0,0x0a,0},{0xe0, 0x8a,0} }, { {0xe0,0x0b,0},{0xe0, 0x8b,0} }, /*108*/ - { {0xe0,0x0c,0},{0xe0, 0x8c,0} }, { { 0},{ 0} }, { {0xe0,0x0e,0},{0xe0, 0x8e,0} }, { {0xe0,0x0f,0},{0xe0, 0x8f,0} }, /*10c*/ - { {0xe0,0x10,0},{0xe0, 0x90,0} }, { {0xe0,0x11,0},{0xe0, 0x91,0} }, { {0xe0,0x12,0},{0xe0, 0x92,0} }, { {0xe0,0x13,0},{0xe0, 0x93,0} }, /*110*/ - { {0xe0,0x14,0},{0xe0, 0x94,0} }, { {0xe0,0x15,0},{0xe0, 0x95,0} }, { {0xe0,0x16,0},{0xe0, 0x96,0} }, { {0xe0,0x17,0},{0xe0, 0x97,0} }, /*114*/ - { {0xe0,0x18,0},{0xe0, 0x98,0} }, { {0xe0,0x19,0},{0xe0, 0x99,0} }, { {0xe0,0x1a,0},{0xe0, 0x9a,0} }, { {0xe0,0x1b,0},{0xe0, 0x9b,0} }, /*118*/ - { {0xe0,0x1c,0},{0xe0, 0x9c,0} }, { {0xe0,0x1d,0},{0xe0, 0x9d,0} }, { {0xe0,0x1e,0},{0xe0, 0x9e,0} }, { {0xe0,0x1f,0},{0xe0, 0x9f,0} }, /*11c*/ - { {0xe0,0x20,0},{0xe0, 0xa0,0} }, { {0xe0,0x21,0},{0xe0, 0xa1,0} }, { {0xe0,0x22,0},{0xe0, 0xa2,0} }, { {0xe0,0x23,0},{0xe0, 0xa3,0} }, /*120*/ - { {0xe0,0x24,0},{0xe0, 0xa4,0} }, { {0xe0,0x25,0},{0xe0, 0xa5,0} }, { {0xe0,0x26,0},{0xe0, 0xa6,0} }, { { 0},{ 0} }, /*124*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*128*/ - { {0xe0,0x2c,0},{0xe0, 0xac,0} }, { {0xe0,0x2d,0},{0xe0, 0xad,0} }, { {0xe0,0x2e,0},{0xe0, 0xae,0} }, { {0xe0,0x2f,0},{0xe0, 0xaf,0} }, /*12c*/ - { {0xe0,0x30,0},{0xe0, 0xb0,0} }, { {0xe0,0x31,0},{0xe0, 0xb1,0} }, { {0xe0,0x32,0},{0xe0, 0xb2,0} }, { { 0},{ 0} }, /*130*/ - { {0xe0,0x34,0},{0xe0, 0xb4,0} }, { {0xe0,0x35,0},{0xe0, 0xb5,0} }, { { 0},{ 0} }, { {0xe0,0x37,0},{0xe0, 0xb7,0} }, /*134*/ - { {0xe0,0x38,0},{0xe0, 0xb8,0} }, { { 0},{ 0} }, { {0xe0,0x3a,0},{0xe0, 0xba,0} }, { {0xe0,0x3b,0},{0xe0, 0xbb,0} }, /*138*/ - { {0xe0,0x3c,0},{0xe0, 0xbc,0} }, { {0xe0,0x3d,0},{0xe0, 0xbd,0} }, { {0xe0,0x3e,0},{0xe0, 0xbe,0} }, { {0xe0,0x3f,0},{0xe0, 0xbf,0} }, /*13c*/ - { {0xe0,0x40,0},{0xe0, 0xc0,0} }, { {0xe0,0x41,0},{0xe0, 0xc1,0} }, { {0xe0,0x42,0},{0xe0, 0xc2,0} }, { {0xe0,0x43,0},{0xe0, 0xc3,0} }, /*140*/ - { {0xe0,0x44,0},{0xe0, 0xc4,0} }, { { 0},{ 0} }, { {0xe0,0x46,0},{0xe0, 0xc6,0} }, { {0xe0,0x47,0},{0xe0, 0xc7,0} }, /*144*/ - { {0xe0,0x48,0},{0xe0, 0xc8,0} }, { {0xe0,0x49,0},{0xe0, 0xc9,0} }, { { 0},{ 0} }, { {0xe0,0x4b,0},{0xe0, 0xcb,0} }, /*148*/ - { {0xe0,0x4c,0},{0xe0, 0xcc,0} }, { {0xe0,0x4d,0},{0xe0, 0xcd,0} }, { {0xe0,0x4e,0},{0xe0, 0xce,0} }, { {0xe0,0x4f,0},{0xe0, 0xcf,0} }, /*14c*/ - { {0xe0,0x50,0},{0xe0, 0xd0,0} }, { {0xe0,0x51,0},{0xe0, 0xd1,0} }, { {0xe0,0x52,0},{0xe0, 0xd2,0} }, { {0xe0,0x53,0},{0xe0, 0xd3,0} }, /*150*/ - { { 0},{ 0} }, { {0xe0,0x55,0},{0xe0, 0xd5,0} }, { { 0},{ 0} }, { {0xe0,0x57,0},{0xe0, 0xd7,0} }, /*154*/ - { {0xe0,0x58,0},{0xe0, 0xd8,0} }, { {0xe0,0x59,0},{0xe0, 0xd9,0} }, { {0xe0,0x5a,0},{0xe0, 0xaa,0} }, { {0xe0,0x5b,0},{0xe0, 0xdb,0} }, /*158*/ - { {0xe0,0x5c,0},{0xe0, 0xdc,0} }, { {0xe0,0x5d,0},{0xe0, 0xdd,0} }, { {0xe0,0x5e,0},{0xe0, 0xee,0} }, { {0xe0,0x5f,0},{0xe0, 0xdf,0} }, /*15c*/ - { { 0},{ 0} }, { {0xe0,0x61,0},{0xe0, 0xe1,0} }, { {0xe0,0x62,0},{0xe0, 0xe2,0} }, { {0xe0,0x63,0},{0xe0, 0xe3,0} }, /*160*/ - { {0xe0,0x64,0},{0xe0, 0xe4,0} }, { {0xe0,0x65,0},{0xe0, 0xe5,0} }, { {0xe0,0x66,0},{0xe0, 0xe6,0} }, { {0xe0,0x67,0},{0xe0, 0xe7,0} }, /*164*/ - { {0xe0,0x68,0},{0xe0, 0xe8,0} }, { {0xe0,0x69,0},{0xe0, 0xe9,0} }, { {0xe0,0x6a,0},{0xe0, 0xea,0} }, { {0xe0,0x6b,0},{0xe0, 0xeb,0} }, /*168*/ - { {0xe0,0x6c,0},{0xe0, 0xec,0} }, { {0xe0,0x6d,0},{0xe0, 0xed,0} }, { {0xe0,0x6e,0},{0xe0, 0xee,0} }, { { 0},{ 0} }, /*16c*/ - { {0xe0,0x70,0},{0xe0, 0xf0,0} }, { {0xe0,0x71,0},{0xe0, 0xf1,0} }, { {0xe0,0x72,0},{0xe0, 0xf2,0} }, { {0xe0,0x73,0},{0xe0, 0xf3,0} }, /*170*/ - { {0xe0,0x74,0},{0xe0, 0xf4,0} }, { {0xe0,0x75,0},{0xe0, 0xf5,0} }, { { 0},{ 0} }, { {0xe0,0x77,0},{0xe0, 0xf7,0} }, /*174*/ - { {0xe0,0x78,0},{0xe0, 0xf8,0} }, { {0xe0,0x79,0},{0xe0, 0xf9,0} }, { {0xe0,0x7a,0},{0xe0, 0xfa,0} }, { {0xe0,0x7b,0},{0xe0, 0xfb,0} }, /*178*/ - { {0xe0,0x7c,0},{0xe0, 0xfc,0} }, { {0xe0,0x7d,0},{0xe0, 0xfd,0} }, { {0xe0,0x7e,0},{0xe0, 0xfe,0} }, { {0xe0,0x7f,0},{0xe0, 0xff,0} }, /*17c*/ - - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*180*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*184*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*188*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*18c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*190*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*194*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*198*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*19c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1ac*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1cc*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1dc*/ - { { 0},{ 0} }, { {0xe0,0xe1,0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xee,0},{ 0} }, { { 0},{ 0} }, /*1ec*/ - { { 0},{ 0} }, { {0xe0,0xf1,0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{ 0} }, { {0xe0,0xff,0},{ 0} } /*1fc*/ -}; -#endif - -static const scancode scancode_set2[512] = { - { { 0},{ 0} }, { { 0x76,0},{ 0xF0,0x76,0} }, { { 0x16,0},{ 0xF0,0x16,0} }, { { 0x1E,0},{ 0xF0,0x1E,0} }, /*000*/ - { { 0x26,0},{ 0xF0,0x26,0} }, { { 0x25,0},{ 0xF0,0x25,0} }, { { 0x2E,0},{ 0xF0,0x2E,0} }, { { 0x36,0},{ 0xF0,0x36,0} }, /*004*/ - { { 0x3D,0},{ 0xF0,0x3D,0} }, { { 0x3E,0},{ 0xF0,0x3E,0} }, { { 0x46,0},{ 0xF0,0x46,0} }, { { 0x45,0},{ 0xF0,0x45,0} }, /*008*/ - { { 0x4E,0},{ 0xF0,0x4E,0} }, { { 0x55,0},{ 0xF0,0x55,0} }, { { 0x66,0},{ 0xF0,0x66,0} }, { { 0x0D,0},{ 0xF0,0x0D,0} }, /*00c*/ - { { 0x15,0},{ 0xF0,0x15,0} }, { { 0x1D,0},{ 0xF0,0x1D,0} }, { { 0x24,0},{ 0xF0,0x24,0} }, { { 0x2D,0},{ 0xF0,0x2D,0} }, /*010*/ - { { 0x2C,0},{ 0xF0,0x2C,0} }, { { 0x35,0},{ 0xF0,0x35,0} }, { { 0x3C,0},{ 0xF0,0x3C,0} }, { { 0x43,0},{ 0xF0,0x43,0} }, /*014*/ - { { 0x44,0},{ 0xF0,0x44,0} }, { { 0x4D,0},{ 0xF0,0x4D,0} }, { { 0x54,0},{ 0xF0,0x54,0} }, { { 0x5B,0},{ 0xF0,0x5B,0} }, /*018*/ - { { 0x5A,0},{ 0xF0,0x5A,0} }, { { 0x14,0},{ 0xF0,0x14,0} }, { { 0x1C,0},{ 0xF0,0x1C,0} }, { { 0x1B,0},{ 0xF0,0x1B,0} }, /*01c*/ - { { 0x23,0},{ 0xF0,0x23,0} }, { { 0x2B,0},{ 0xF0,0x2B,0} }, { { 0x34,0},{ 0xF0,0x34,0} }, { { 0x33,0},{ 0xF0,0x33,0} }, /*020*/ - { { 0x3B,0},{ 0xF0,0x3B,0} }, { { 0x42,0},{ 0xF0,0x42,0} }, { { 0x4B,0},{ 0xF0,0x4B,0} }, { { 0x4C,0},{ 0xF0,0x4C,0} }, /*024*/ - { { 0x52,0},{ 0xF0,0x52,0} }, { { 0x0E,0},{ 0xF0,0x0E,0} }, { { 0x12,0},{ 0xF0,0x12,0} }, { { 0x5D,0},{ 0xF0,0x5D,0} }, /*028*/ - { { 0x1A,0},{ 0xF0,0x1A,0} }, { { 0x22,0},{ 0xF0,0x22,0} }, { { 0x21,0},{ 0xF0,0x21,0} }, { { 0x2A,0},{ 0xF0,0x2A,0} }, /*02c*/ - { { 0x32,0},{ 0xF0,0x32,0} }, { { 0x31,0},{ 0xF0,0x31,0} }, { { 0x3A,0},{ 0xF0,0x3A,0} }, { { 0x41,0},{ 0xF0,0x41,0} }, /*030*/ - { { 0x49,0},{ 0xF0,0x49,0} }, { { 0x4A,0},{ 0xF0,0x4A,0} }, { { 0x59,0},{ 0xF0,0x59,0} }, { { 0x7C,0},{ 0xF0,0x7C,0} }, /*034*/ - { { 0x11,0},{ 0xF0,0x11,0} }, { { 0x29,0},{ 0xF0,0x29,0} }, { { 0x58,0},{ 0xF0,0x58,0} }, { { 0x05,0},{ 0xF0,0x05,0} }, /*038*/ - { { 0x06,0},{ 0xF0,0x06,0} }, { { 0x04,0},{ 0xF0,0x04,0} }, { { 0x0C,0},{ 0xF0,0x0C,0} }, { { 0x03,0},{ 0xF0,0x03,0} }, /*03c*/ - { { 0x0B,0},{ 0xF0,0x0B,0} }, { { 0x83,0},{ 0xF0,0x83,0} }, { { 0x0A,0},{ 0xF0,0x0A,0} }, { { 0x01,0},{ 0xF0,0x01,0} }, /*040*/ - { { 0x09,0},{ 0xF0,0x09,0} }, { { 0x77,0},{ 0xF0,0x77,0} }, { { 0x7E,0},{ 0xF0,0x7E,0} }, { { 0x6C,0},{ 0xF0,0x6C,0} }, /*044*/ - { { 0x75,0},{ 0xF0,0x75,0} }, { { 0x7D,0},{ 0xF0,0x7D,0} }, { { 0x7B,0},{ 0xF0,0x7B,0} }, { { 0x6B,0},{ 0xF0,0x6B,0} }, /*048*/ - { { 0x73,0},{ 0xF0,0x73,0} }, { { 0x74,0},{ 0xF0,0x74,0} }, { { 0x79,0},{ 0xF0,0x79,0} }, { { 0x69,0},{ 0xF0,0x69,0} }, /*04c*/ - { { 0x72,0},{ 0xF0,0x72,0} }, { { 0x7A,0},{ 0xF0,0x7A,0} }, { { 0x70,0},{ 0xF0,0x70,0} }, { { 0x71,0},{ 0xF0,0x71,0} }, /*050*/ - { { 0x84,0},{ 0xF0,0x84,0} }, { { 0x60,0},{ 0xF0,0x60,0} }, { { 0x61,0},{ 0xF0,0x61,0} }, { { 0x78,0},{ 0xF0,0x78,0} }, /*054*/ - { { 0x07,0},{ 0xF0,0x07,0} }, { { 0x0F,0},{ 0xF0,0x0F,0} }, { { 0x17,0},{ 0xF0,0x17,0} }, { { 0x1F,0},{ 0xF0,0x1F,0} }, /*058*/ - { { 0x27,0},{ 0xF0,0x27,0} }, { { 0x2F,0},{ 0xF0,0x2F,0} }, { { 0x37,0},{ 0xF0,0x37,0} }, { { 0x3F,0},{ 0xF0,0x3F,0} }, /*05c*/ - { { 0x47,0},{ 0xF0,0x47,0} }, { { 0x4F,0},{ 0xF0,0x4F,0} }, { { 0x56,0},{ 0xF0,0x56,0} }, { { 0x5E,0},{ 0xF0,0x5E,0} }, /*060*/ - { { 0x08,0},{ 0xF0,0x08,0} }, { { 0x10,0},{ 0xF0,0x10,0} }, { { 0x18,0},{ 0xF0,0x18,0} }, { { 0x20,0},{ 0xF0,0x20,0} }, /*064*/ - { { 0x28,0},{ 0xF0,0x28,0} }, { { 0x30,0},{ 0xF0,0x30,0} }, { { 0x38,0},{ 0xF0,0x38,0} }, { { 0x40,0},{ 0xF0,0x40,0} }, /*068*/ - { { 0x48,0},{ 0xF0,0x48,0} }, { { 0x50,0},{ 0xF0,0x50,0} }, { { 0x57,0},{ 0xF0,0x57,0} }, { { 0x6F,0},{ 0xF0,0x6F,0} }, /*06c*/ - { { 0x13,0},{ 0xF0,0x13,0} }, { { 0x19,0},{ 0xF0,0x19,0} }, { { 0x39,0},{ 0xF0,0x39,0} }, { { 0x51,0},{ 0xF0,0x51,0} }, /*070*/ - { { 0x53,0},{ 0xF0,0x53,0} }, { { 0x5C,0},{ 0xF0,0x5C,0} }, { { 0x5F,0},{ 0xF0,0x5F,0} }, { { 0x62,0},{ 0xF0,0x62,0} }, /*074*/ - { { 0x63,0},{ 0xF0,0x63,0} }, { { 0x64,0},{ 0xF0,0x64,0} }, { { 0x65,0},{ 0xF0,0x65,0} }, { { 0x67,0},{ 0xF0,0x67,0} }, /*078*/ - { { 0x68,0},{ 0xF0,0x68,0} }, { { 0x6A,0},{ 0xF0,0x6A,0} }, { { 0x6D,0},{ 0xF0,0x6D,0} }, { { 0x6E,0},{ 0xF0,0x6E,0} }, /*07c*/ - - { { 0x80,0},{ 0xf0,0x80,0} }, { { 0x81,0},{ 0xf0,0x81,0} }, { { 0x82,0},{ 0xf0,0x82,0} }, { { 0},{ 0} }, /*080*/ - { { 0},{ 0} }, { { 0x85,0},{ 0xf0,0x54,0} }, { { 0x86,0},{ 0xf0,0x86,0} }, { { 0x87,0},{ 0xf0,0x87,0} }, /*084*/ - { { 0x88,0},{ 0xf0,0x88,0} }, { { 0x89,0},{ 0xf0,0x89,0} }, { { 0x8a,0},{ 0xf0,0x8a,0} }, { { 0x8b,0},{ 0xf0,0x8b,0} }, /*088*/ - { { 0x8c,0},{ 0xf0,0x8c,0} }, { { 0x8d,0},{ 0xf0,0x8d,0} }, { { 0x8e,0},{ 0xf0,0x8e,0} }, { { 0x8f,0},{ 0xf0,0x8f,0} }, /*08c*/ - { { 0x90,0},{ 0xf0,0x90,0} }, { { 0x91,0},{ 0xf0,0x91,0} }, { { 0x92,0},{ 0xf0,0x92,0} }, { { 0x93,0},{ 0xf0,0x93,0} }, /*090*/ - { { 0x94,0},{ 0xf0,0x94,0} }, { { 0x95,0},{ 0xf0,0x95,0} }, { { 0x96,0},{ 0xf0,0x96,0} }, { { 0x97,0},{ 0xf0,0x97,0} }, /*094*/ - { { 0x98,0},{ 0xf0,0x98,0} }, { { 0x99,0},{ 0xf0,0x99,0} }, { { 0x9a,0},{ 0xf0,0x9a,0} }, { { 0x9b,0},{ 0xf0,0x9b,0} }, /*098*/ - { { 0x9c,0},{ 0xf0,0x9c,0} }, { { 0x9d,0},{ 0xf0,0x9d,0} }, { { 0x9e,0},{ 0xf0,0x9e,0} }, { { 0x9f,0},{ 0xf0,0x9f,0} }, /*09c*/ - { { 0xa0,0},{ 0xf0,0xa0,0} }, { { 0xa1,0},{ 0xf0,0xa1,0} }, { { 0xa2,0},{ 0xf0,0xa2,0} }, { { 0xa3,0},{ 0xf0,0xa3,0} }, /*0a0*/ - { { 0xa4,0},{ 0xf0,0xa4,0} }, { { 0xa5,0},{ 0xf0,0xa5,0} }, { { 0xa6,0},{ 0xf0,0xa6,0} }, { { 0xa7,0},{ 0xf0,0xa7,0} }, /*0a4*/ - { { 0xa8,0},{ 0xf0,0xa8,0} }, { { 0xa9,0},{ 0xf0,0xa9,0} }, { { 0xaa,0},{ 0xf0,0xaa,0} }, { { 0xab,0},{ 0xf0,0xab,0} }, /*0a8*/ - { { 0xac,0},{ 0xf0,0xac,0} }, { { 0xad,0},{ 0xf0,0xad,0} }, { { 0xae,0},{ 0xf0,0xae,0} }, { { 0xaf,0},{ 0xf0,0xaf,0} }, /*0ac*/ - { { 0xb0,0},{ 0xf0,0xb0,0} }, { { 0xb1,0},{ 0xf0,0xb1,0} }, { { 0xb2,0},{ 0xf0,0xb2,0} }, { { 0xb3,0},{ 0xf0,0xb3,0} }, /*0b0*/ - { { 0xb4,0},{ 0xf0,0xb4,0} }, { { 0xb5,0},{ 0xf0,0xb5,0} }, { { 0xb6,0},{ 0xf0,0xb6,0} }, { { 0xb7,0},{ 0xf0,0xb7,0} }, /*0b4*/ - { { 0xb8,0},{ 0xf0,0xb8,0} }, { { 0xb9,0},{ 0xf0,0xb9,0} }, { { 0xba,0},{ 0xf0,0xba,0} }, { { 0xbb,0},{ 0xf0,0xbb,0} }, /*0b8*/ - { { 0xbc,0},{ 0xf0,0xbc,0} }, { { 0xbd,0},{ 0xf0,0xbd,0} }, { { 0xbe,0},{ 0xf0,0xbe,0} }, { { 0xbf,0},{ 0xf0,0xbf,0} }, /*0bc*/ - { { 0xc0,0},{ 0xf0,0xc0,0} }, { { 0xc1,0},{ 0xf0,0xc1,0} }, { { 0xc2,0},{ 0xf0,0xc2,0} }, { { 0xc3,0},{ 0xf0,0xc3,0} }, /*0c0*/ - { { 0xc4,0},{ 0xf0,0xc4,0} }, { { 0xc5,0},{ 0xf0,0xc5,0} }, { { 0xc6,0},{ 0xf0,0xc6,0} }, { { 0xc7,0},{ 0xf0,0xc7,0} }, /*0c4*/ - { { 0xc8,0},{ 0xf0,0xc8,0} }, { { 0xc9,0},{ 0xf0,0xc9,0} }, { { 0xca,0},{ 0xf0,0xca,0} }, { { 0xcb,0},{ 0xf0,0xcb,0} }, /*0c8*/ - { { 0xcc,0},{ 0xf0,0xcc,0} }, { { 0xcd,0},{ 0xf0,0xcd,0} }, { { 0xce,0},{ 0xf0,0xce,0} }, { { 0xcf,0},{ 0xf0,0xcf,0} }, /*0cc*/ - { { 0xd0,0},{ 0xf0,0xd0,0} }, { { 0xd1,0},{ 0xf0,0xd0,0} }, { { 0xd2,0},{ 0xf0,0xd2,0} }, { { 0xd3,0},{ 0xf0,0xd3,0} }, /*0d0*/ - { { 0xd4,0},{ 0xf0,0xd4,0} }, { { 0xd5,0},{ 0xf0,0xd5,0} }, { { 0xd6,0},{ 0xf0,0xd6,0} }, { { 0xd7,0},{ 0xf0,0xd7,0} }, /*0d4*/ - { { 0xd8,0},{ 0xf0,0xd8,0} }, { { 0xd9,0},{ 0xf0,0xd9,0} }, { { 0xda,0},{ 0xf0,0xda,0} }, { { 0xdb,0},{ 0xf0,0xdb,0} }, /*0d8*/ - { { 0xdc,0},{ 0xf0,0xdc,0} }, { { 0xdd,0},{ 0xf0,0xdd,0} }, { { 0xde,0},{ 0xf0,0xde,0} }, { { 0xdf,0},{ 0xf0,0xdf,0} }, /*0dc*/ - { { 0xe0,0},{ 0xf0,0xe0,0} }, { { 0xe1,0},{ 0xf0,0xe1,0} }, { { 0xe2,0},{ 0xf0,0xe2,0} }, { { 0xe3,0},{ 0xf0,0xe3,0} }, /*0e0*/ - { { 0xe4,0},{ 0xf0,0xe4,0} }, { { 0xe5,0},{ 0xf0,0xe5,0} }, { { 0xe6,0},{ 0xf0,0xe6,0} }, { { 0xe7,0},{ 0xf0,0xe7,0} }, /*0e4*/ - { { 0xe8,0},{ 0xf0,0xe8,0} }, { { 0xe9,0},{ 0xf0,0xe9,0} }, { { 0xea,0},{ 0xf0,0xea,0} }, { { 0xeb,0},{ 0xf0,0xeb,0} }, /*0e8*/ - { { 0xec,0},{ 0xf0,0xec,0} }, { { 0xed,0},{ 0xf0,0xed,0} }, { { 0xee,0},{ 0xf0,0xee,0} }, { { 0xef,0},{ 0xf0,0xef,0} }, /*0ec*/ - { { 0},{ 0} }, { { 0xf1,0},{ 0xf0,0xf1,0} }, { { 0xf2,0},{ 0xf0,0xf2,0} }, { { 0xf3,0},{ 0xf0,0xf3,0} }, /*0f0*/ - { { 0xf4,0},{ 0xf0,0xf4,0} }, { { 0xf5,0},{ 0xf0,0xf5,0} }, { { 0xf6,0},{ 0xf0,0xf6,0} }, { { 0xf7,0},{ 0xf0,0xf7,0} }, /*0f4*/ - { { 0xf8,0},{ 0xf0,0xf8,0} }, { { 0xf9,0},{ 0xf0,0xf9,0} }, { { 0xfa,0},{ 0xf0,0xfa,0} }, { { 0xfb,0},{ 0xf0,0xfb,0} }, /*0f8*/ - { { 0xfc,0},{ 0xf0,0xfc,0} }, { { 0xfd,0},{ 0xf0,0xfd,0} }, { { 0xfe,0},{ 0xf0,0xfe,0} }, { { 0xff,0},{ 0xf0,0xff,0} }, /*0fc*/ - - { {0xe1,0x14,0},{0xe1,0xf0,0x14,0} }, { {0xe0,0x76,0},{0xe0,0xF0,0x76,0} }, { {0xe0,0x16,0},{0xe0,0xF0,0x16,0} }, { {0xe0,0x1E,0},{0xe0,0xF0,0x1E,0} }, /*100*/ - { {0xe0,0x26,0},{0xe0,0xF0,0x26,0} }, { {0xe0,0x25,0},{0xe0,0xF0,0x25,0} }, { {0xe0,0x2E,0},{0xe0,0xF0,0x2E,0} }, { {0xe0,0x36,0},{0xe0,0xF0,0x36,0} }, /*104*/ - { {0xe0,0x3D,0},{0xe0,0xF0,0x3D,0} }, { {0xe0,0x3E,0},{0xe0,0xF0,0x3E,0} }, { {0xe0,0x46,0},{0xe0,0xF0,0x46,0} }, { {0xe0,0x45,0},{0xe0,0xF0,0x45,0} }, /*108*/ - { {0xe0,0x4E,0},{0xe0,0xF0,0x4E,0} }, { { 0},{ 0} }, { {0xe0,0x66,0},{0xe0,0xF0,0x66,0} }, { {0xe0,0x0D,0},{0xe0,0xF0,0x0D,0} }, /*10c*/ - { {0xe0,0x15,0},{0xe0,0xF0,0x15,0} }, { {0xe0,0x1D,0},{0xe0,0xF0,0x1D,0} }, { {0xe0,0x24,0},{0xe0,0xF0,0x24,0} }, { {0xe0,0x2D,0},{0xe0,0xF0,0x2D,0} }, /*110*/ - { {0xe0,0x2C,0},{0xe0,0xF0,0x2C,0} }, { {0xe0,0x35,0},{0xe0,0xF0,0x35,0} }, { {0xe0,0x3C,0},{0xe0,0xF0,0x3C,0} }, { {0xe0,0x43,0},{0xe0,0xF0,0x43,0} }, /*114*/ - { {0xe0,0x44,0},{0xe0,0xF0,0x44,0} }, { {0xe0,0x4D,0},{0xe0,0xF0,0x4D,0} }, { {0xe0,0x54,0},{0xe0,0xF0,0x54,0} }, { {0xe0,0x5B,0},{0xe0,0xF0,0x5B,0} }, /*118*/ - { {0xe0,0x5A,0},{0xe0,0xF0,0x5A,0} }, { {0xe0,0x14,0},{0xe0,0xF0,0x14,0} }, { {0xe0,0x1C,0},{0xe0,0xF0,0x1C,0} }, { {0xe0,0x1B,0},{0xe0,0xF0,0x1B,0} }, /*11c*/ - { {0xe0,0x23,0},{0xe0,0xF0,0x23,0} }, { {0xe0,0x2B,0},{0xe0,0xF0,0x2B,0} }, { {0xe0,0x34,0},{0xe0,0xF0,0x34,0} }, { {0xe0,0x33,0},{0xe0,0xF0,0x33,0} }, /*120*/ - { {0xe0,0x3B,0},{0xe0,0xF0,0x3B,0} }, { {0xe0,0x42,0},{0xe0,0xF0,0x42,0} }, { {0xe0,0x4B,0},{0xe0,0xF0,0x4B,0} }, { { 0},{ 0} }, /*124*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*128*/ - { {0xe0,0x1A,0},{0xe0,0xF0,0x1A,0} }, { {0xe0,0x22,0},{0xe0,0xF0,0x22,0} }, { {0xe0,0x21,0},{0xe0,0xF0,0x21,0} }, { {0xe0,0x2A,0},{0xe0,0xF0,0x2A,0} }, /*12c*/ - { {0xe0,0x32,0},{0xe0,0xF0,0x32,0} }, { {0xe0,0x31,0},{0xe0,0xF0,0x31,0} }, { {0xe0,0x3A,0},{0xe0,0xF0,0x3A,0} }, { { 0},{ 0} }, /*130*/ - { {0xe0,0x49,0},{0xe0,0xF0,0x49,0} }, { {0xe0,0x4A,0},{0xe0,0xF0,0x4A,0} }, { { 0},{ 0} }, { {0xe0,0x7C,0},{0xe0,0xF0,0x7C,0} }, /*134*/ - { {0xe0,0x11,0},{0xe0,0xF0,0x11,0} }, { { 0},{ 0} }, { {0xe0,0x58,0},{0xe0,0xF0,0x58,0} }, { {0xe0,0x05,0},{0xe0,0xF0,0x05,0} }, /*138*/ - { {0xe0,0x06,0},{0xe0,0xF0,0x06,0} }, { {0xe0,0x04,0},{0xe0,0xF0,0x04,0} }, { {0xe0,0x0C,0},{0xe0,0xF0,0x0C,0} }, { {0xe0,0x03,0},{0xe0,0xF0,0x03,0} }, /*13c*/ - { {0xe0,0x0B,0},{0xe0,0xF0,0x0B,0} }, { {0xe0,0x02,0},{0xe0,0xF0,0x02,0} }, { {0xe0,0x0A,0},{0xe0,0xF0,0x0A,0} }, { {0xe0,0x01,0},{0xe0,0xF0,0x01,0} }, /*140*/ - { {0xe0,0x09,0},{0xe0,0xF0,0x09,0} }, { { 0},{ 0} }, { {0xe0,0x7E,0},{0xe0,0xF0,0x7E,0} }, { {0xe0,0x6C,0},{0xe0,0xF0,0x6C,0} }, /*144*/ - { {0xe0,0x75,0},{0xe0,0xF0,0x75,0} }, { {0xe0,0x7D,0},{0xe0,0xF0,0x7D,0} }, { { 0},{ 0} }, { {0xe0,0x6B,0},{0xe0,0xF0,0x6B,0} }, /*148*/ - { {0xe0,0x73,0},{0xe0,0xF0,0x73,0} }, { {0xe0,0x74,0},{0xe0,0xF0,0x74,0} }, { {0xe0,0x79,0},{0xe0,0xF0,0x79,0} }, { {0xe0,0x69,0},{0xe0,0xF0,0x69,0} }, /*14c*/ - { {0xe0,0x72,0},{0xe0,0xF0,0x72,0} }, { {0xe0,0x7A,0},{0xe0,0xF0,0x7A,0} }, { {0xe0,0x70,0},{0xe0,0xF0,0x70,0} }, { {0xe0,0x71,0},{0xe0,0xF0,0x71,0} }, /*150*/ - { { 0},{ 0} }, { {0xe0,0x60,0},{0xe0,0xF0,0x60,0} }, { { 0},{ 0} }, { {0xe0,0x78,0},{0xe0,0xF0,0x78,0} }, /*154*/ - { {0xe0,0x07,0},{0xe0,0xF0,0x07,0} }, { {0xe0,0x0F,0},{0xe0,0xF0,0x0F,0} }, { {0xe0,0x17,0},{0xe0,0xF0,0x17,0} }, { {0xe0,0x1F,0},{0xe0,0xF0,0x1F,0} }, /*158*/ - { {0xe0,0x27,0},{0xe0,0xF0,0x27,0} }, { {0xe0,0x2F,0},{0xe0,0xF0,0x2F,0} }, { {0xe0,0x37,0},{0xe0,0xF0,0x37,0} }, { {0xe0,0x3F,0},{0xe0,0xF0,0x3F,0} }, /*15c*/ - { { 0},{ 0} }, { {0xe0,0x4F,0},{0xe0,0xF0,0x4F,0} }, { {0xe0,0x56,0},{0xe0,0xF0,0x56,0} }, { {0xe0,0x5E,0},{0xe0,0xF0,0x5E,0} }, /*160*/ - { {0xe0,0x08,0},{0xe0,0xF0,0x08,0} }, { {0xe0,0x10,0},{0xe0,0xF0,0x10,0} }, { {0xe0,0x18,0},{0xe0,0xF0,0x18,0} }, { {0xe0,0x20,0},{0xe0,0xF0,0x20,0} }, /*164*/ - { {0xe0,0x28,0},{0xe0,0xF0,0x28,0} }, { {0xe0,0x30,0},{0xe0,0xF0,0x30,0} }, { {0xe0,0x38,0},{0xe0,0xF0,0x38,0} }, { {0xe0,0x40,0},{0xe0,0xF0,0x40,0} }, /*168*/ - { {0xe0,0x48,0},{0xe0,0xF0,0x48,0} }, { {0xe0,0x50,0},{0xe0,0xF0,0x50,0} }, { {0xe0,0x57,0},{0xe0,0xF0,0x57,0} }, { { 0},{ 0} }, /*16c*/ - { {0xe0,0x13,0},{0xe0,0xF0,0x13,0} }, { {0xe0,0x19,0},{0xe0,0xF0,0x19,0} }, { {0xe0,0x39,0},{0xe0,0xF0,0x39,0} }, { {0xe0,0x51,0},{0xe0,0xF0,0x51,0} }, /*170*/ - { {0xe0,0x53,0},{0xe0,0xF0,0x53,0} }, { {0xe0,0x5C,0},{0xe0,0xF0,0x5C,0} }, { { 0},{ 0} }, { {0xe0,0x62,0},{0xe0,0xF0,0x62,0} }, /*174*/ - { {0xe0,0x63,0},{0xe0,0xF0,0x63,0} }, { {0xe0,0x64,0},{0xe0,0xF0,0x64,0} }, { {0xe0,0x65,0},{0xe0,0xF0,0x65,0} }, { {0xe0,0x67,0},{0xe0,0xF0,0x67,0} }, /*178*/ - { {0xe0,0x68,0},{0xe0,0xF0,0x68,0} }, { {0xe0,0x6A,0},{0xe0,0xF0,0x6A,0} }, { {0xe0,0x6D,0},{0xe0,0xF0,0x6D,0} }, { {0xe0,0x6E,0},{0xe0,0xF0,0x6E,0} }, /*17c*/ - - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*180*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*184*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*188*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*18c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*190*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*194*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*198*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*19c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1ac*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1cc*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1dc*/ - { { 0},{ 0} }, { {0xe0,0xe1,0},{0xe0,0xF0,0xE1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xee,0},{0xe0,0xF0,0xEE,0} }, { { 0},{ 0} }, /*1ec*/ - { { 0},{ 0} }, { {0xe0,0xf1,0},{0xe0,0xF0,0xF1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{0xe0,0xF0,0xFE,0} }, { {0xe0,0xff,0},{0xe0,0xF0,0xFF,0} } /*1fc*/ -}; - -static const scancode scancode_set3[512] = { - { { 0},{ 0} }, { { 0x08,0},{ 0xf0,0x08,0} }, { { 0x16,0},{ 0xf0,0x16,0} }, { { 0x1E,0},{ 0xf0,0x1E,0} }, /*000*/ - { { 0x26,0},{ 0xf0,0x26,0} }, { { 0x25,0},{ 0xf0,0x25,0} }, { { 0x2E,0},{ 0xf0,0x2E,0} }, { { 0x36,0},{ 0xf0,0x36,0} }, /*004*/ - { { 0x3D,0},{ 0xf0,0x3D,0} }, { { 0x3E,0},{ 0xf0,0x3E,0} }, { { 0x46,0},{ 0xf0,0x46,0} }, { { 0x45,0},{ 0xf0,0x45,0} }, /*008*/ - { { 0x4E,0},{ 0xf0,0x4E,0} }, { { 0x55,0},{ 0xf0,0x55,0} }, { { 0x66,0},{ 0xf0,0x66,0} }, { { 0x0D,0},{ 0xf0,0x0D,0} }, /*00c*/ - { { 0x15,0},{ 0xf0,0x15,0} }, { { 0x1D,0},{ 0xf0,0x1D,0} }, { { 0x24,0},{ 0xf0,0x24,0} }, { { 0x2D,0},{ 0xf0,0x2D,0} }, /*010*/ - { { 0x2C,0},{ 0xf0,0x2C,0} }, { { 0x35,0},{ 0xf0,0x35,0} }, { { 0x3C,0},{ 0xf0,0x3C,0} }, { { 0x43,0},{ 0xf0,0x43,0} }, /*014*/ - { { 0x44,0},{ 0xf0,0x44,0} }, { { 0x4D,0},{ 0xf0,0x4D,0} }, { { 0x54,0},{ 0xf0,0x54,0} }, { { 0x5B,0},{ 0xf0,0x5B,0} }, /*018*/ - { { 0x5A,0},{ 0xf0,0x5A,0} }, { { 0x11,0},{ 0xf0,0x11,0} }, { { 0x1C,0},{ 0xf0,0x1C,0} }, { { 0x1B,0},{ 0xf0,0x1B,0} }, /*01c*/ - { { 0x23,0},{ 0xf0,0x23,0} }, { { 0x2B,0},{ 0xf0,0x2B,0} }, { { 0x34,0},{ 0xf0,0x34,0} }, { { 0x33,0},{ 0xf0,0x33,0} }, /*020*/ - { { 0x3B,0},{ 0xf0,0x3B,0} }, { { 0x42,0},{ 0xf0,0x42,0} }, { { 0x4B,0},{ 0xf0,0x4B,0} }, { { 0x4C,0},{ 0xf0,0x4C,0} }, /*024*/ - { { 0x52,0},{ 0xf0,0x52,0} }, { { 0x0E,0},{ 0xf0,0x0E,0} }, { { 0x12,0},{ 0xf0,0x12,0} }, { { 0x5C,0},{ 0xf0,0x5C,0} }, /*028*/ - { { 0x1A,0},{ 0xf0,0x1A,0} }, { { 0x22,0},{ 0xf0,0x22,0} }, { { 0x21,0},{ 0xf0,0x21,0} }, { { 0x2A,0},{ 0xf0,0x2A,0} }, /*02c*/ - { { 0x32,0},{ 0xf0,0x32,0} }, { { 0x31,0},{ 0xf0,0x31,0} }, { { 0x3A,0},{ 0xf0,0x3A,0} }, { { 0x41,0},{ 0xf0,0x41,0} }, /*030*/ - { { 0x49,0},{ 0xf0,0x49,0} }, { { 0x4A,0},{ 0xf0,0x4A,0} }, { { 0x59,0},{ 0xf0,0x59,0} }, { { 0x7E,0},{ 0xf0,0x7E,0} }, /*034*/ - { { 0x19,0},{ 0xf0,0x19,0} }, { { 0x29,0},{ 0xf0,0x29,0} }, { { 0x14,0},{ 0xf0,0x14,0} }, { { 0x07,0},{ 0xf0,0x07,0} }, /*038*/ - { { 0x0F,0},{ 0xf0,0x0F,0} }, { { 0x17,0},{ 0xf0,0x17,0} }, { { 0x1F,0},{ 0xf0,0x1F,0} }, { { 0x27,0},{ 0xf0,0x27,0} }, /*03c*/ - { { 0x2F,0},{ 0xf0,0x2F,0} }, { { 0x37,0},{ 0xf0,0x37,0} }, { { 0x3F,0},{ 0xf0,0x3F,0} }, { { 0x47,0},{ 0xf0,0x47,0} }, /*040*/ - { { 0x4F,0},{ 0xf0,0x4F,0} }, { { 0x76,0},{ 0xf0,0x76,0} }, { { 0x5F,0},{ 0xf0,0x5F,0} }, { { 0x6C,0},{ 0xf0,0x6C,0} }, /*044*/ - { { 0x75,0},{ 0xf0,0x75,0} }, { { 0x7D,0},{ 0xf0,0x7D,0} }, { { 0x84,0},{ 0xf0,0x84,0} }, { { 0x6B,0},{ 0xf0,0x6B,0} }, /*048*/ - { { 0x73,0},{ 0xf0,0x73,0} }, { { 0x74,0},{ 0xf0,0x74,0} }, { { 0x7C,0},{ 0xf0,0x7C,0} }, { { 0x69,0},{ 0xf0,0x69,0} }, /*04c*/ - { { 0x72,0},{ 0xf0,0x72,0} }, { { 0x7A,0},{ 0xf0,0x7A,0} }, { { 0x70,0},{ 0xf0,0x70,0} }, { { 0x71,0},{ 0xf0,0x71,0} }, /*050*/ - { { 0x57,0},{ 0xf0,0x57,0} }, { { 0x60,0},{ 0xf0,0x60,0} }, { { 0},{ 0} }, { { 0x56,0},{ 0xf0,0x56,0} }, /*054*/ - { { 0x5E,0},{ 0xf0,0x5E,0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*058*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*05c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*060*/ - { { 0},{ 0} }, { { 0x10,0},{ 0xf0,0x10,0} }, { { 0x18,0},{ 0xf0,0x18,0} }, { { 0x20,0},{ 0xf0,0x20,0} }, /*064*/ - { { 0x28,0},{ 0xf0,0x28,0} }, { { 0x30,0},{ 0xf0,0x30,0} }, { { 0x38,0},{ 0xf0,0x38,0} }, { { 0x40,0},{ 0xf0,0x40,0} }, /*068*/ - { { 0x48,0},{ 0xf0,0x48,0} }, { { 0x50,0},{ 0xf0,0x50,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*06c*/ - { { 0x87,0},{ 0xf0,0x87,0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0x51,0},{ 0xf0,0x51,0} }, /*070*/ - { { 0x53,0},{ 0xf0,0x53,0} }, { { 0x5C,0},{ 0xf0,0x5C,0} }, { { 0},{ 0} }, { { 0x62,0},{ 0xf0,0x62,0} }, /*074*/ - { { 0x63,0},{ 0xf0,0x63,0} }, { { 0x86,0},{ 0xf0,0x86,0} }, { { 0},{ 0} }, { { 0x85,0},{ 0xf0,0x85,0} }, /*078*/ - { { 0x68,0},{ 0xf0,0x68,0} }, { { 0x13,0},{ 0xf0,0x13,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*07c*/ - - { { 0x80,0},{ 0xf0,0x80,0} }, { { 0x81,0},{ 0xf0,0x81,0} }, { { 0x82,0},{ 0xf0,0x82,0} }, { { 0},{ 0} }, /*080*/ - { { 0},{ 0} }, { { 0x85,0},{ 0xf0,0x54,0} }, { { 0x86,0},{ 0xf0,0x86,0} }, { { 0x87,0},{ 0xf0,0x87,0} }, /*084*/ - { { 0x88,0},{ 0xf0,0x88,0} }, { { 0x89,0},{ 0xf0,0x89,0} }, { { 0x8a,0},{ 0xf0,0x8a,0} }, { { 0x8b,0},{ 0xf0,0x8b,0} }, /*088*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0x8e,0},{ 0xf0,0x8e,0} }, { { 0x8f,0},{ 0xf0,0x8f,0} }, /*08c*/ - { { 0x90,0},{ 0xf0,0x90,0} }, { { 0x91,0},{ 0xf0,0x91,0} }, { { 0x92,0},{ 0xf0,0x92,0} }, { { 0x93,0},{ 0xf0,0x93,0} }, /*090*/ - { { 0x94,0},{ 0xf0,0x94,0} }, { { 0x95,0},{ 0xf0,0x95,0} }, { { 0x96,0},{ 0xf0,0x96,0} }, { { 0x97,0},{ 0xf0,0x97,0} }, /*094*/ - { { 0x98,0},{ 0xf0,0x98,0} }, { { 0x99,0},{ 0xf0,0x99,0} }, { { 0x9a,0},{ 0xf0,0x9a,0} }, { { 0x9b,0},{ 0xf0,0x9b,0} }, /*098*/ - { { 0x9c,0},{ 0xf0,0x9c,0} }, { { 0x9d,0},{ 0xf0,0x9d,0} }, { { 0x9e,0},{ 0xf0,0x9e,0} }, { { 0x9f,0},{ 0xf0,0x9f,0} }, /*09c*/ - { { 0xa0,0},{ 0xf0,0xa0,0} }, { { 0xa1,0},{ 0xf0,0xa1,0} }, { { 0xa2,0},{ 0xf0,0xa2,0} }, { { 0xa3,0},{ 0xf0,0xa3,0} }, /*0a0*/ - { { 0xa4,0},{ 0xf0,0xa4,0} }, { { 0xa5,0},{ 0xf0,0xa5,0} }, { { 0xa6,0},{ 0xf0,0xa6,0} }, { { 0xa7,0},{ 0xf0,0xa7,0} }, /*0a4*/ - { { 0xa8,0},{ 0xf0,0xa8,0} }, { { 0xa9,0},{ 0xf0,0xa9,0} }, { { 0xaa,0},{ 0xf0,0xaa,0} }, { { 0xab,0},{ 0xf0,0xab,0} }, /*0a8*/ - { { 0xac,0},{ 0xf0,0xac,0} }, { { 0xad,0},{ 0xf0,0xad,0} }, { { 0xae,0},{ 0xf0,0xae,0} }, { { 0xaf,0},{ 0xf0,0xaf,0} }, /*0ac*/ - { { 0xb0,0},{ 0xf0,0xb0,0} }, { { 0xb1,0},{ 0xf0,0xb1,0} }, { { 0xb2,0},{ 0xf0,0xb2,0} }, { { 0xb3,0},{ 0xf0,0xb3,0} }, /*0b0*/ - { { 0xb4,0},{ 0xf0,0xb4,0} }, { { 0xb5,0},{ 0xf0,0xb5,0} }, { { 0xb6,0},{ 0xf0,0xb6,0} }, { { 0xb7,0},{ 0xf0,0xb7,0} }, /*0b4*/ - { { 0xb8,0},{ 0xf0,0xb8,0} }, { { 0xb9,0},{ 0xf0,0xb9,0} }, { { 0xba,0},{ 0xf0,0xba,0} }, { { 0xbb,0},{ 0xf0,0xbb,0} }, /*0b8*/ - { { 0xbc,0},{ 0xf0,0xbc,0} }, { { 0xbd,0},{ 0xf0,0xbd,0} }, { { 0xbe,0},{ 0xf0,0xbe,0} }, { { 0xbf,0},{ 0xf0,0xbf,0} }, /*0bc*/ - { { 0xc0,0},{ 0xf0,0xc0,0} }, { { 0xc1,0},{ 0xf0,0xc1,0} }, { { 0xc2,0},{ 0xf0,0xc2,0} }, { { 0xc3,0},{ 0xf0,0xc3,0} }, /*0c0*/ - { { 0xc4,0},{ 0xf0,0xc4,0} }, { { 0xc5,0},{ 0xf0,0xc5,0} }, { { 0xc6,0},{ 0xf0,0xc6,0} }, { { 0xc7,0},{ 0xf0,0xc7,0} }, /*0c4*/ - { { 0xc8,0},{ 0xf0,0xc8,0} }, { { 0xc9,0},{ 0xf0,0xc9,0} }, { { 0xca,0},{ 0xf0,0xca,0} }, { { 0xcb,0},{ 0xf0,0xcb,0} }, /*0c8*/ - { { 0xcc,0},{ 0xf0,0xcc,0} }, { { 0xcd,0},{ 0xf0,0xcd,0} }, { { 0xce,0},{ 0xf0,0xce,0} }, { { 0xcf,0},{ 0xf0,0xcf,0} }, /*0cc*/ - { { 0xd0,0},{ 0xf0,0xd0,0} }, { { 0xd1,0},{ 0xf0,0xd0,0} }, { { 0xd2,0},{ 0xf0,0xd2,0} }, { { 0xd3,0},{ 0xf0,0xd3,0} }, /*0d0*/ - { { 0xd4,0},{ 0xf0,0xd4,0} }, { { 0xd5,0},{ 0xf0,0xd5,0} }, { { 0xd6,0},{ 0xf0,0xd6,0} }, { { 0xd7,0},{ 0xf0,0xd7,0} }, /*0d4*/ - { { 0xd8,0},{ 0xf0,0xd8,0} }, { { 0xd9,0},{ 0xf0,0xd9,0} }, { { 0xda,0},{ 0xf0,0xda,0} }, { { 0xdb,0},{ 0xf0,0xdb,0} }, /*0d8*/ - { { 0xdc,0},{ 0xf0,0xdc,0} }, { { 0xdd,0},{ 0xf0,0xdd,0} }, { { 0xde,0},{ 0xf0,0xde,0} }, { { 0xdf,0},{ 0xf0,0xdf,0} }, /*0dc*/ - { { 0xe0,0},{ 0xf0,0xe0,0} }, { { 0xe1,0},{ 0xf0,0xe1,0} }, { { 0xe2,0},{ 0xf0,0xe2,0} }, { { 0xe3,0},{ 0xf0,0xe3,0} }, /*0e0*/ - { { 0xe4,0},{ 0xf0,0xe4,0} }, { { 0xe5,0},{ 0xf0,0xe5,0} }, { { 0xe6,0},{ 0xf0,0xe6,0} }, { { 0xe7,0},{ 0xf0,0xe7,0} }, /*0e4*/ - { { 0xe8,0},{ 0xf0,0xe8,0} }, { { 0xe9,0},{ 0xf0,0xe9,0} }, { { 0xea,0},{ 0xf0,0xea,0} }, { { 0xeb,0},{ 0xf0,0xeb,0} }, /*0e8*/ - { { 0xec,0},{ 0xf0,0xec,0} }, { { 0xed,0},{ 0xf0,0xed,0} }, { { 0xee,0},{ 0xf0,0xee,0} }, { { 0xef,0},{ 0xf0,0xef,0} }, /*0ec*/ - { { 0},{ 0} }, { { 0xf1,0},{ 0xf0,0xf1,0} }, { { 0xf2,0},{ 0xf0,0xf2,0} }, { { 0xf3,0},{ 0xf0,0xf3,0} }, /*0f0*/ - { { 0xf4,0},{ 0xf0,0xf4,0} }, { { 0xf5,0},{ 0xf0,0xf5,0} }, { { 0xf6,0},{ 0xf0,0xf6,0} }, { { 0xf7,0},{ 0xf0,0xf7,0} }, /*0f4*/ - { { 0xf8,0},{ 0xf0,0xf8,0} }, { { 0xf9,0},{ 0xf0,0xf9,0} }, { { 0xfa,0},{ 0xf0,0xfa,0} }, { { 0xfb,0},{ 0xf0,0xfb,0} }, /*0f8*/ - { { 0xfc,0},{ 0xf0,0xfc,0} }, { { 0xfd,0},{ 0xf0,0xfd,0} }, { { 0xfe,0},{ 0xf0,0xfe,0} }, { { 0xff,0},{ 0xf0,0xff,0} }, /*0fc*/ - - { { 0x62,0},{ 0xF0,0x62,0} }, { {0xe0,0x76,0},{0xe0,0xF0,0x76,0} }, { {0xe0,0x16,0},{0xe0,0xF0,0x16,0} }, { {0xe0,0x1E,0},{0xe0,0xF0,0x1E,0} }, /*100*/ - { {0xe0,0x26,0},{0xe0,0xF0,0x26,0} }, { {0xe0,0x25,0},{0xe0,0xF0,0x25,0} }, { {0xe0,0x2E,0},{0xe0,0xF0,0x2E,0} }, { {0xe0,0x36,0},{0xe0,0xF0,0x36,0} }, /*104*/ - { {0xe0,0x3D,0},{0xe0,0xF0,0x3D,0} }, { {0xe0,0x3E,0},{0xe0,0xF0,0x3E,0} }, { {0xe0,0x46,0},{0xe0,0xF0,0x46,0} }, { {0xe0,0x45,0},{0xe0,0xF0,0x45,0} }, /*108*/ - { {0xe0,0x4E,0},{0xe0,0xF0,0x4E,0} }, { { 0},{ 0} }, { {0xe0,0x66,0},{0xe0,0xF0,0x66,0} }, { {0xe0,0x0D,0},{0xe0,0xF0,0x0D,0} }, /*10c*/ - { {0xe0,0x15,0},{0xe0,0xF0,0x15,0} }, { {0xe0,0x1D,0},{0xe0,0xF0,0x1D,0} }, { {0xe0,0x24,0},{0xe0,0xF0,0x24,0} }, { {0xe0,0x2D,0},{0xe0,0xF0,0x2D,0} }, /*110*/ - { {0xe0,0x2C,0},{0xe0,0xF0,0x2C,0} }, { {0xe0,0x35,0},{0xe0,0xF0,0x35,0} }, { {0xe0,0x3C,0},{0xe0,0xF0,0x3C,0} }, { {0xe0,0x43,0},{0xe0,0xF0,0x43,0} }, /*114*/ - { {0xe0,0x44,0},{0xe0,0xF0,0x44,0} }, { {0xe0,0x4D,0},{0xe0,0xF0,0x4D,0} }, { {0xe0,0x54,0},{0xe0,0xF0,0x54,0} }, { {0xe0,0x5B,0},{0xe0,0xF0,0x5B,0} }, /*118*/ - { { 0x79,0},{ 0xf0,0x79,0} }, { { 0x58,0},{ 0xf0,0x58,0} }, { {0xe0,0x1C,0},{0xe0,0xF0,0x1C,0} }, { {0xe0,0x1B,0},{0xe0,0xF0,0x1B,0} }, /*11c*/ - { {0xe0,0x23,0},{0xe0,0xF0,0x23,0} }, { {0xe0,0x2B,0},{0xe0,0xF0,0x2B,0} }, { {0xe0,0x34,0},{0xe0,0xF0,0x34,0} }, { {0xe0,0x33,0},{0xe0,0xF0,0x33,0} }, /*120*/ - { {0xe0,0x3B,0},{0xe0,0xF0,0x3B,0} }, { {0xe0,0x42,0},{0xe0,0xF0,0x42,0} }, { {0xe0,0x4B,0},{0xe0,0xF0,0x4B,0} }, { { 0},{ 0} }, /*124*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*128*/ - { {0xe0,0x1A,0},{0xe0,0xF0,0x1A,0} }, { {0xe0,0x22,0},{0xe0,0xF0,0x22,0} }, { {0xe0,0x21,0},{0xe0,0xF0,0x21,0} }, { {0xe0,0x2A,0},{0xe0,0xF0,0x2A,0} }, /*12c*/ - { {0xe0,0x32,0},{0xe0,0xF0,0x32,0} }, { {0xe0,0x31,0},{0xe0,0xF0,0x31,0} }, { {0xe0,0x3A,0},{0xe0,0xF0,0x3A,0} }, { { 0},{ 0} }, /*130*/ - { {0xe0,0x49,0},{0xe0,0xF0,0x49,0} }, { { 0x77,0},{ 0xf0,0x77,0} }, { { 0},{ 0} }, { { 0x57,0},{ 0xf0,0x57,0} }, /*134*/ - { { 0x39,0},{ 0xf0,0x39,0} }, { { 0},{ 0} }, { {0xe0,0x58,0},{0xe0,0xF0,0x58,0} }, { {0xe0,0x05,0},{0xe0,0xF0,0x05,0} }, /*138*/ - { {0xe0,0x06,0},{0xe0,0xF0,0x06,0} }, { {0xe0,0x04,0},{0xe0,0xF0,0x04,0} }, { {0xe0,0x0C,0},{0xe0,0xF0,0x0C,0} }, { {0xe0,0x03,0},{0xe0,0xF0,0x03,0} }, /*13c*/ - { {0xe0,0x0B,0},{0xe0,0xF0,0x0B,0} }, { {0xe0,0x02,0},{0xe0,0xF0,0x02,0} }, { {0xe0,0x0A,0},{0xe0,0xF0,0x0A,0} }, { {0xe0,0x01,0},{0xe0,0xF0,0x01,0} }, /*140*/ - { {0xe0,0x09,0},{0xe0,0xF0,0x09,0} }, { { 0},{ 0} }, { {0xe0,0x7E,0},{0xe0,0xF0,0x7E,0} }, { { 0x6E,0},{ 0xf0,0x6E,0} }, /*144*/ - { { 0x63,0},{ 0xf0,0x63,0} }, { { 0x6F,0},{ 0xf0,0x6F,0} }, { { 0},{ 0} }, { { 0x61,0},{ 0xf0,0x61,0} }, /*148*/ - { {0xe0,0x73,0},{0xe0,0xF0,0x73,0} }, { { 0x6A,0},{ 0xf0,0x6A,0} }, { {0xe0,0x79,0},{0xe0,0xF0,0x79,0} }, { { 0x65,0},{ 0xf0,0x65,0} }, /*14c*/ - { { 0x60,0},{ 0xf0,0x60,0} }, { { 0x6D,0},{ 0xf0,0x6D,0} }, { { 0x67,0},{ 0xf0,0x67,0} }, { { 0x64,0},{ 0xf0,0x64,0} }, /*150*/ - { { 0xd4,0},{ 0xf0,0xD4,0} }, { {0xe0,0x60,0},{0xe0,0xF0,0x60,0} }, { { 0},{ 0} }, { {0xe0,0x78,0},{0xe0,0xF0,0x78,0} }, /*154*/ - { {0xe0,0x07,0},{0xe0,0xF0,0x07,0} }, { {0xe0,0x0F,0},{0xe0,0xF0,0x0F,0} }, { {0xe0,0x17,0},{0xe0,0xF0,0x17,0} }, { { 0x8B,0},{ 0xf0,0x8B,0} }, /*158*/ - { { 0x8C,0},{ 0xf0,0x8C,0} }, { { 0x8D,0},{ 0xf0,0x8D,0} }, { { 0},{ 0} }, { { 0x7F,0},{ 0xf0,0x7F,0} }, /*15c*/ - { { 0},{ 0} }, { {0xe0,0x4F,0},{0xe0,0xF0,0x4F,0} }, { {0xe0,0x56,0},{0xe0,0xF0,0x56,0} }, { { 0},{ 0} }, /*160*/ - { {0xe0,0x08,0},{0xe0,0xF0,0x08,0} }, { {0xe0,0x10,0},{0xe0,0xF0,0x10,0} }, { {0xe0,0x18,0},{0xe0,0xF0,0x18,0} }, { {0xe0,0x20,0},{0xe0,0xF0,0x20,0} }, /*164*/ - { {0xe0,0x28,0},{0xe0,0xF0,0x28,0} }, { {0xe0,0x30,0},{0xe0,0xF0,0x30,0} }, { {0xe0,0x38,0},{0xe0,0xF0,0x38,0} }, { {0xe0,0x40,0},{0xe0,0xF0,0x40,0} }, /*168*/ - { {0xe0,0x48,0},{0xe0,0xF0,0x48,0} }, { {0xe0,0x50,0},{0xe0,0xF0,0x50,0} }, { {0xe0,0x57,0},{0xe0,0xF0,0x57,0} }, { { 0},{ 0} }, /*16c*/ - { {0xe0,0x13,0},{0xe0,0xF0,0x13,0} }, { {0xe0,0x19,0},{0xe0,0xF0,0x19,0} }, { {0xe0,0x39,0},{0xe0,0xF0,0x39,0} }, { {0xe0,0x51,0},{0xe0,0xF0,0x51,0} }, /*170*/ - { {0xe0,0x53,0},{0xe0,0xF0,0x53,0} }, { {0xe0,0x5C,0},{0xe0,0xF0,0x5C,0} }, { { 0},{ 0} }, { {0xe0,0x62,0},{0xe0,0xF0,0x62,0} }, /*174*/ - { {0xe0,0x63,0},{0xe0,0xF0,0x63,0} }, { {0xe0,0x64,0},{0xe0,0xF0,0x64,0} }, { {0xe0,0x65,0},{0xe0,0xF0,0x65,0} }, { {0xe0,0x67,0},{0xe0,0xF0,0x67,0} }, /*178*/ - { {0xe0,0x68,0},{0xe0,0xF0,0x68,0} }, { {0xe0,0x6A,0},{0xe0,0xF0,0x6A,0} }, { {0xe0,0x6D,0},{0xe0,0xF0,0x6D,0} }, { {0xe0,0x6E,0},{0xe0,0xF0,0x6E,0} }, /*17c*/ - - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*180*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*184*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*188*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*18c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*190*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*194*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*198*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*19c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1ac*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1cc*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1dc*/ - { { 0},{ 0} }, { {0xe0,0xe1,0},{0xe0,0xF0,0xE1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xee,0},{0xe0,0xF0,0xEE,0} }, { { 0},{ 0} }, /*1ec*/ - { { 0},{ 0} }, { {0xe0,0xf1,0},{0xe0,0xF0,0xF1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{0xe0,0xF0,0xFE,0} }, { {0xe0,0xff,0},{0xe0,0xF0,0xFF,0} } /*1fc*/ -}; - - -static void add_data_kbd(uint16_t val); - - -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBD_AT_LOG)) -int kbd_at_do_log = ENABLE_KBD_AT_LOG; - - -static void -kbd_log(atkbd_t *dev, const char *fmt, ...) -{ - va_list ap; - - if ((dev == NULL) || (dev->log == NULL)) - return; - - if (kbd_at_do_log) { - va_start(ap, fmt); - log_out(dev->log, fmt, ap); - va_end(ap); - } -} -#else -#define kbd_log(dev, fmt, ...) -#endif - - -/* TODO: Get rid of keyboard_mode entirely - keyboard.c just need to know which scan codes to - send break codes for and which to repeat. - The break code stuff, though, might also be doable on the AT keyboard side, if F0 F0 - is never sent. */ -static void -set_scancode_map(atkbd_t *dev) -{ - switch (keyboard_mode & 3) { -#ifdef USE_SET1 - case 1: - default: - keyboard_set_table(scancode_set1); - break; -#else - default: -#endif - case 2: - keyboard_set_table(scancode_set2); - break; - - case 3: - keyboard_set_table(scancode_set3); - break; - } - - if (keyboard_mode & 0x20) -#ifdef USE_SET1 - keyboard_set_table(scancode_set1); -#else - keyboard_set_table(scancode_set2); -#endif -} - - - -/* TODO: Move the queues to the device. */ -static void -kbc_queue_reset(uint8_t channel) -{ - if (channel == 2) { - mouse_queue_start = mouse_queue_end = 0; - memset(mouse_queue, 0x00, sizeof(mouse_queue)); - } else if (channel == 1) { - dev->queue_start = dev->queue_end = 0; - memset(dev->queue, 0x00, sizeof(dev->queue)); - } -} - - -static void -add_data_kbd_queue(atkbd_t *dev, uint8_t val) -{ - if (!keyboard_scan || (dev->queue_end >= 16)) { - kbd_log(dev, "Unable to add to queue, conditions: %i, %i\n", !keyboard_scan, (dev->queue_end >= 16)); - return; - } - - kbd_log(dev, "dev->queue[%02X] = %02X;\n", dev->queue_end, val); - dev->queue[dev->queue_end] = val; - dev->queue_end = (dev->queue_end + 1) & 0xf; -} - - -static void -kbd_send_to_host(atkbd_t *dev, uint8_t val) -{ - dev->kd.c_in = 1; - dev->kd.c_data = val; - - dev->last_byte = val; -} - - -static void -kbd_reset(atkbd_t *dev) -{ - kbc_queue_reset(1); - dev->kd.c_in = 0x00; - /* TODO: Move this to the keyboard struct. */ - dev->last_byte = 0x00; - - /* Set scan code set to 2. */ - keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - set_scancode_map(dev); - - dev->phase = 0; - dev->in = 0; - - memset(keyboard_set3_flags, 0, 512); -} - - -static void -kbd_command(atkbd_t *dev) -{ - uint8_t val = dev->kd.d_data; - - if ((dev->phase > 0) && (dev->cmd == 0xff)) { - dev->phase++; - if (dev->phase == RESET_DELAY_TIME) { - kbd_send_to_host(dev, 0xaa); - dev->phase = 0; - dev->cmd = 0x00; - } - return; - } - - if (dev->phase == 2) { - dev->phase = 0; - - switch (dev->cmd) { - case 0xf2: - kbd_send_to_host(dev, 0x83); - break; - default: - log_fatal(dev->log, "Invalid command for phase 2: %02X\n", dev->cmd); - break; - } - - /* Keyboard command is now done. */ - if (dev->phase == 0) - dev->cmd = 0x00; - return; - } else if (dev->phase == 1) { - dev->phase = 0; - - switch (dev->cmd) { - case 0xf0: - kbd_log(dev, "Get scan code set: %02X\n", keyboard_mode & 3); - kbd_send_to_host(dev, keyboard_mode & 3); - break; - case 0xf2: - kbd_send_to_host(dev, 0xab); - dev->phase = 2; - break; - default: - log_fatal(dev->log, "Invalid command for phase 1: %02X\n", dev->cmd); - break; - } - - /* Keyboard command is now done. */ - if (dev->phase == 0) - dev->cmd = 0x00; - return; - } - - if (dev->in && (val < 0xed)) { - dev->in = 0; - dev->phase = 0; - - switch (dev->cmd) { - case 0xed: /* set/reset LEDs */ - kbd_log(dev, "Set LEDs: %02X\n", val); - kbd_send_to_host(dev, 0xfa); - break; - - case 0xf0: /* get/set scancode set */ - kbd_send_to_host(dev, 0xfa); - if (val == 0) - dev->phase = 1; - else { - if ((val <= 3) && (val != 1)) { - keyboard_mode &= 0xfc; - keyboard_mode |= (val & 3); - kbd_log(dev, "Scan code set now: %02X\n", val); - } - set_scancode_map(dev); - } - break; - - case 0xf3: /* set typematic rate/delay */ - kbd_send_to_host(dev, 0xfa); - break; - - default: - kbd_log(dev, "Bad keyboard 0060 write %02X command %02X\n", val, dev->cmd); - kbd_send_to_host(dev, 0xfe); - break; - } - - /* Keyboard command is now done. */ - if (dev->phase == 0) - dev->cmd = 0x00; - } else { - /* No keyboard command in progress. */ - dev->in = 0; - dev->cmd = 0x00; - dev->phase = 0; - - switch (val) { - case 0x00: - kbd_log(dev, "Command 00\n"); - kbd_send_to_host(dev, 0xfa); - break; - - case 0x05: /*??? - sent by NT 4.0*/ - kbd_log(dev, "Command 05 (NT 4.0)\n"); - kbd_send_to_host(dev, 0xfe); - break; - - case 0xed: /* set/reset LEDs */ - kbd_log(dev, "Set/reset LEDs\n"); - kbd_send_to_host(dev, 0xfa); - - dev->in = 1; - break; - - case 0xee: /* diagnostic echo */ - kbd_log(dev, "Diagnostic echo\n"); - kbd_send_to_host(dev, 0xee); - break; - - case 0xef: /* NOP (reserved for future use) */ - kbd_log(dev, "NOP (reserved for future use)\n"); - break; - - case 0xf0: /* get/set scan code set */ - kbd_log(dev, "Get/set scan code set\n"); - kbd_send_to_host(dev, 0xfa); - dev->in = 1; - break; - - case 0xf2: /* read ID */ - /* Fixed as translation will be done in add_data_kbd(). */ - kbd_log(dev, "Read keyboard ID\n"); - /* TODO: After keyboard type selection is implemented, make this - return the correct keyboard ID for the selected type. */ - kbd_send_to_host(dev, 0xfa); - dev->phase = 1; - break; - - case 0xf3: /* set typematic rate/delay */ - kbd_log(dev, "Set typematic rate/delay\n"); - kbd_send_to_host(dev, 0xfa); - dev->in = 1; - break; - - case 0xf4: /* enable keyboard */ - kbd_log(dev, "Enable keyboard\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_scan = 1; - break; - - case 0xf5: /* set defaults and disable keyboard */ - case 0xf6: /* set defaults */ - kbd_log(dev, "Set defaults%s\n", (val == 0xf6) ? "" : " and disable keyboard"); - keyboard_scan = (val == 0xf6); - kbd_log(dev, "val = %02X, keyboard_scan = %i, dev->mem[0x20] = %02X\n", - val, keyboard_scan, dev->mem[0x20]); - kbd_send_to_host(dev, 0xfa); - - keyboard_set3_all_break = 0; - keyboard_set3_all_repeat = 0; - memset(keyboard_set3_flags, 0, 512); - keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - set_scancode_map(dev); - break; - - case 0xf7: /* set all keys to repeat */ - kbd_log(dev, "Set all keys to repeat\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_break = 1; - break; - - case 0xf8: /* set all keys to give make/break codes */ - kbd_log(dev, "Set all keys to give make/break codes\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_break = 1; - break; - - case 0xf9: /* set all keys to give make codes only */ - kbd_log(dev, "Set all keys to give make codes only\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_break = 0; - break; - - case 0xfa: /* set all keys to repeat and give make/break codes */ - kbd_log(dev, "Set all keys to repeat and give make/break codes\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_repeat = 1; - keyboard_set3_all_break = 1; - break; - - case 0xfe: /* resend last scan code */ - kbd_log(dev, "Reset last scan code\n"); - kbd_send_to_host(dev, dev->last_byte); - break; - - case 0xff: /* reset */ - kbd_log(dev, "Reset\n"); - kbd_reset(dev); - kbd_send_to_host(dev, 0xfa); - dev->phase = 1; - break; - - default: - kbd_log(dev, "Bad keyboard command %02X\n", val); - kbd_send_to_host(dev, 0xfe); - } - - /* If command needs data, remember command. */ - if ((dev->in == 1) || (dev->phase > 0)) - dev->cmd = val; - } -} - - -static void -kbd_do_command(atkbd_t *dev) -{ - kbd_command(dev); - if (dev->kd.d_in) - dev->state = KBD_CMD_PROCESS; - else if ((dev->phase == 0) && !dev->in) { - dev->in_cmd = 0; - if (dev->kd.d_data != 0xf5) - keyboard_scan = 1; - dev->state = KBD_MAIN_LOOP; - } else { - keyboard_scan = 0; - dev->in_cmd = 1; - dev->state = KBD_CMD_PROCESS; - } -} - - -static void -kbd_nack(atkbd_t *dev) -{ - kbd_send_to_host(dev, 0xfe); - dev->state = KBD_MAIN_LOOP; -} - - -static void -kbd_main_loop(atkbd_t *dev) -{ - uint8_t scan = !dev->kd.inhibit && keyboard_scan; - - if (dev->kd.d_in) { - dev->kd.d_in = 0; - kbd_cmd_process(dev); - } else if (scan && (dev->queue_start != dev->queue_end)) { - /* Scan here. */ - kbd_log(dev, "Get %02X from FIFO\n", dev->queue[dev->queue_start]); - kbd_send_to_host(dev, dev->queue[dev->queue_start]); - dev->queue_start = (dev->queue_start + 1) & 0xf; - } -} - - -static void -kbd_cmd_process(atkbd_t *dev) -{ - uint8_t written = dev->kd.d_in; - - /* We want data, nothing has been written yet, return. */ - if (dev->in && !dev->kd.d_in) - return; - - dev->kd.d_in = 0; - - if (!written && !keyboard_scan && dev->in_cmd && (dev->phase > 0)) { - kbd_log(dev, "Keyboard not written, not scanning, in command, and phase > 0\n"); - kbd_do_command(dev); - } else if (dev->kd.d_data == 0xfe) { - kbd_log(dev, "Send last byte: %02X\n", dev->last_byte); - kbd_send_to_host(dev, dev->last_byte); - dev->state = KBD_MAIN_LOOP; - } else if (dev->kd.d_data == 0xee) { - kbd_log(dev, "Diagnostic echo: EE\n"); - kbd_send_to_host(dev, 0xee); - dev->state = KBD_MAIN_LOOP; - } else if (dev->kd.d_data >= 0xed) { - kbd_log(dev, "Command %02X\n", dev->kd.d_data); - if (!keyboard_scan && dev->in_cmd && (dev->cmd == 0xed)) { - kbd_log(dev, "Not scanning, in command, old command is ED\n"); - keyboard_scan = 1; - dev->in_cmd = 0; - } - kbd_do_command(dev); - } else { - if (!keyboard_scan && dev->in_cmd) { - if ((dev->cmd == 0xf3) && (dev->kd.d_data & 0x80)) { - kbd_log(dev, "Command F3 data %02X has bit 7 set\n", dev->kd.d_data); - kbd_nack(dev); - } else { - kbd_log(dev, "Command %02X data %02X\n", dev->cmd, dev->kd.d_data); - kbd_do_command(dev); - } - } else { - kbd_log(dev, "Scanning or not in command, NACK\n"); - kbd_nack(dev); - } - } -} - - -/* Keyboard processing */ -static void -kbd_process(atkbd_t *dev) -{ - /* The real 8048 keyboard firmware stops transmitting if host wants to transmit. */ - if (dev->kd.c_in && dev->kd.d_in) - dev->kd.c_in = 0; - - /* The host has either acknowledged the transmitted byte or we have not transmitted anything (yet). */ - if (!dev->kd.c_in) switch (dev->state) { - case KBD_MAIN_LOOP: - kbd_main_loop(dev); - break; - case KBD_CMD_PROCESS: - kbd_cmd_process(dev); - break; - } -} - - -static void -add_data_vals(atkbd_t *dev, uint8_t *val, uint8_t len) -{ - int i; - - for (i = 0; i < len; i++) - add_data_kbd_queue(dev, val[i]); -} - - -static void -add_data_kbd(uint16_t val) -{ - atkbd_t *dev = SavedKbd; - uint8_t fake_shift[4]; - uint8_t num_lock = 0, shift_states = 0; - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - - if (dev->in || (dev->phase > 0)) - return; - - keyboard_get_states(NULL, &num_lock, NULL); - shift_states = keyboard_get_shift() & STATE_SHIFT_MASK; - - /* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */ - if ((dev != NULL) && (kbc_ven == KBC_VEN_TOSHIBA) && (keyboard_recv(0xb8) || keyboard_recv(0x9d)) && - (val >= 0x4f) && (val <= 0x54) && (val != 0x4e)) - t3100e_notify_set((val + 2) & 0x0f); - - switch(val) { - case FAKE_LSHIFT_ON: - kbd_log(dev, "Fake left shift on, scan code: "); - if (num_lock) { - if (shift_states) { - kbd_log(dev, "N/A (one or both shifts on)\n"); - break; - } else { - /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0x2a; - add_data_vals(dev, fake_shift, 2); - break; - - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0x12; - add_data_vals(dev, fake_shift, 2); - break; - - default: - kbd_log(dev, "N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - } else { - if (shift_states & STATE_LSHIFT) { - /* Num lock off and left shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0xaa; - add_data_vals(dev, fake_shift, 2); - break; - - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x12; - add_data_vals(dev, fake_shift, 3); - break; - - default: - kbd_log(dev, "N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - if (shift_states & STATE_RSHIFT) { - /* Num lock off and right shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0xb6; - add_data_vals(dev, fake_shift, 2); - break; - - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x59; - add_data_vals(dev, fake_shift, 3); - break; - - default: - kbd_log(dev, "N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - kbd_log(dev, shift_states ? "" : "N/A (both shifts off)\n"); - } - break; - - case FAKE_LSHIFT_OFF: - kbd_log(dev, "Fake left shift off, scan code: "); - if (num_lock) { - if (shift_states) { - kbd_log(dev, "N/A (one or both shifts on)\n"); - break; - } else { - /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0xaa; - add_data_vals(dev, fake_shift, 2); - break; - - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0xf0; fake_shift[2] = 0x12; - add_data_vals(dev, fake_shift, 3); - break; - - default: - kbd_log(dev, "N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - } else { - if (shift_states & STATE_LSHIFT) { - /* Num lock off and left shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0x2a; - add_data_vals(dev, fake_shift, 2); - break; - - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0x12; - add_data_vals(dev, fake_shift, 2); - break; - - default: - kbd_log(dev, "N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - if (shift_states & STATE_RSHIFT) { - /* Num lock off and right shift pressed. */ - switch(keyboard_mode & 0x02) { - case 1: - fake_shift[0] = 0xe0; fake_shift[1] = 0x36; - add_data_vals(dev, fake_shift, 2); - break; - - case 2: - fake_shift[0] = 0xe0; fake_shift[1] = 0x59; - add_data_vals(dev, fake_shift, 2); - break; - - default: - kbd_log(dev, "N/A (scan code set %i)\n", keyboard_mode & 0x02); - break; - } - } - kbd_log(dev, shift_states ? "" : "N/A (both shifts off)\n"); - } - break; - - default: - add_data_kbd_queue(dev, val); - break; - } -} - - -static void -kbd_close(void *priv) -{ - atkbd_t *dev = (atkbd_t *)priv; - - kbd_reset(dev); - - keyboard_scan = 0; - keyboard_send = NULL; - - /* Disable the scancode maps. */ - keyboard_set_table(NULL); - -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBD_AT_LOG)) - log_close(dev->log); -#endif - - kbc_dev_attach(NULL, 1); - - SavedKbd = NULL; - free(dev); -} - - -static void * -kbd_init(const device_t *info) -{ - atkbd_t *dev; - - dev = (atkbd_t *)malloc(sizeof(atkbd_t)); - memset(dev, 0x00, sizeof(atkbd_t)); - - kbc_dev_attach(&(dev->kd), 1); - - kbd_send_to_host(dev, 0xaa); - - keyboard_send = add_data_kbd; - -#if (!defined(RELEASE_BUILD) && defined(ENABLE_KBD_AT_LOG)) - dev->kbd_log = log_open("AT KBD"); -#endif - - kbd_reset(dev); - - /* We need this, sadly. */ - SavedKbd = dev; - - return(dev); -} - - -const device_t keyboard_at_kbd_device = { - "PC/AT Keyboard (Actual keyboard!)", - 0, - 0, - kbd_init, - kbd_close, - kbd_reset, - { NULL }, NULL, NULL, NULL -}; diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 6a3d9c370..81455f5a6 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -57,7 +57,9 @@ #define STAT_IFULL 0x02 #define STAT_OFULL 0x01 -#define RESET_DELAY_TIME 1000 /* 100 ms */ +#define PS2_REFRESH_TIME (16 * TIMER_USEC) + +#define RESET_DELAY_TIME (100 * 10) /* 600ms */ #define CCB_UNUSED 0x80 #define CCB_TRANSLATE 0x40 @@ -72,136 +74,50 @@ #define MODE_MASK 0x6c #define KBC_TYPE_ISA 0x00 /* AT ISA-based chips */ -#define KBC_TYPE_PS2_1 0x04 /* PS2 type, no refresh */ -/* This only differs in that translation is forced off. */ -#define KBC_TYPE_PS2_2 0x05 /* PS2 on PS/2, type 2 */ -#define KBC_TYPE_MASK 0x07 +#define KBC_TYPE_PS2_NOREF 0x01 /* PS2 type, no refresh */ +#define KBC_TYPE_PS2_1 0x02 /* PS2 on PS/2, type 1 */ +#define KBC_TYPE_PS2_2 0x03 /* PS2 on PS/2, type 2 */ +#define KBC_TYPE_MASK 0x03 -#define KBC_FLAG_PS2 0x04 - -/* We need to redefine this: - Currently, we use bits 3-7 for vendor, we should instead use bits 4-7 - for vendor, 0-3 for revision/variant, and have a dev->ps2 flag controlling - controller mode, normally set according to the flags, but togglable on - AMIKey: - 0000 0000 0x00 IBM, AT - 0000 0001 0x01 MR - 0000 0010 0x02 Xi8088, clone of IBM PS/2 type 1 - 0001 0000 0x10 Olivetti - 0010 0000 0x20 Toshiba - 0011 0000 0x30 Quadtel - 0100 0000 0x40 Phoenix MultiKey/42 - 0101 0000 0x50 AMI KF - 0101 0001 0x51 AMI KH - 0101 0010 0x52 AMIKey - 0101 0011 0x53 AMIKey-2 - 0101 0100 0x54 JetKey (clone of AMI KF/AMIKey) - 0110 0000 0x60 Award - 0110 0001 0x61 Award 286 (has some AMI commands apparently) - 0111 0000 0x70 Siemens -*/ - -/* Standard IBM controller */ #define KBC_VEN_GENERIC 0x00 -/* All commands are standard PS/2 */ +#define KBC_VEN_AMI 0x04 #define KBC_VEN_IBM_MCA 0x08 -/* Standard IBM commands, differs in input port bits */ -#define KBC_VEN_IBM_PS1 0x10 -/* Olivetti - proprietary commands and port 62h with switches - readout */ -#define KBC_VEN_OLIVETTI 0x20 -/* Toshiba T3100e - has a bunch of proprietary commands, also sets - IFULL on command AA */ -#define KBC_VEN_TOSHIBA 0x28 -/* Standard IBM commands, uses input port as a switches readout */ -#define KBC_VEN_NCR 0x30 -/* Xi8088 - standard IBM commands, has a turbo bit on port 61h, and the - polarity of the video type bit in the input port is inverted */ -#define KBC_VEN_XI8088 0x38 -/* QuadtelKey - currently guesswork */ -#define KBC_VEN_QUADTEL 0x40 -/* Phoenix MultiKey/42 - not yet implemented */ -#define KBC_VEN_PHOENIX 0x48 -/* Generic commands, XI8088-like input port handling of video type, - maybe we just need a flag for that? */ -#define KBC_VEN_ACER 0x50 -/* AMI KF/KH/AMIKey/AMIKey-2 */ -#define KBC_VEN_AMI 0xf0 -/* Standard AMI commands, differs in input port bits */ -#define KBC_VEN_INTEL_AMI 0xf8 -#define KBC_VEN_MASK 0xf8 - - -/* Flags should be fully 32-bit: - Bits 7- 0: Vendor and revision/variant; - Bits 15- 8: Input port mask; - Bits 23-16: Input port bits that are always on; - Bits 31-24: Flags: - Bit 0: Invert P1 video type bit polarity; - Bit 1: Is PS/2; - Bit 2: Translation forced always off. - - So for example, the IBM PS/2 type 1 controller flags would be: 00000010 00000000 11111111 00000000 = 0200ff00 . */ +#define KBC_VEN_QUADTEL 0x0c +#define KBC_VEN_TOSHIBA 0x10 +#define KBC_VEN_XI8088 0x14 +#define KBC_VEN_IBM_PS1 0x18 +#define KBC_VEN_ACER 0x1c +#define KBC_VEN_INTEL_AMI 0x20 +#define KBC_VEN_OLIVETTI 0x24 +#define KBC_VEN_NCR 0x28 +#define KBC_VEN_SAMSUNG 0x2c +#define KBC_VEN_MASK 0x3c typedef struct { - uint8_t status, ib, ob, p1, p2, old_p2, p2_locked, fast_a20_phase, - secr_phase, mem_index, ami_stat, ami_mode, - kbc_in, kbc_cmd, kbc_in_cmd, kbc_poll_phase, kbc_to_send, - kbc_send_pending, kbc_channel, kbc_stat_hi, kbc_wait_for_response, inhibit, - kbd_in, kbd_cmd, kbd_in_cmd, kbd_written, kbd_data, kbd_poll_phase, kbd_inhibit, - mouse_in, mouse_cmd, mouse_in_cmd, mouse_written, mouse_data, mouse_poll_phase, mouse_inhibit, - kbc_written[3], kbc_data[3]; + uint8_t command, status, old_status, out, old_out, secr_phase, + mem_addr, input_port, output_port, old_output_port, + key_command, output_locked, ami_stat, want60, + wantirq, key_wantdata, refresh, first_write, + ami_flags, pad[7]; - uint8_t mem_int[0x40], mem[0x240]; + uint8_t mem[0x100]; - uint16_t last_irq, kbc_phase, kbd_phase, mouse_phase; + int last_irq, old_last_irq, + reset_delay, + out_new, out_delayed; uint32_t flags; - pc_timer_t pulse_cb, send_delay_timer; + pc_timer_t refresh_time, pulse_cb; uint8_t (*write60_ven)(void *p, uint8_t val); uint8_t (*write64_ven)(void *p, uint8_t val); + + pc_timer_t send_delay_timer; } atkbd_t; -enum -{ - CHANNEL_KBC = 0, - CHANNEL_KBD, - CHANNEL_MOUSE -}; - -enum -{ - KBD_MAIN_LOOP = 0, - KBD_CMD_PROCESS -}; - -enum -{ - MOUSE_MAIN_LOOP_1 = 0, - MOUSE_CMD_PROCESS, - MOUSE_CMD_END, - MOUSE_MAIN_LOOP_2 -}; - -enum { - KBC_MAIN_LOOP = 0, - KBC_RESET = 1, - KBC_WAIT = 4, - KBC_WAIT_FOR_KBD, - KBC_WAIT_FOR_MOUSE, - KBC_WAIT_FOR_BOTH -}; - - -static void kbd_cmd_process(atkbd_t *dev); - -static void kbc_wait(atkbd_t *dev, uint8_t flags); - - /* bit 0 = repeat, bit 1 = makes break code? */ uint8_t keyboard_set3_flags[512]; uint8_t keyboard_set3_all_repeat; @@ -210,9 +126,9 @@ uint8_t keyboard_set3_all_break; /* Bits 0 - 1 = scan code set, bit 6 = translate or not. */ uint8_t keyboard_mode = 0x42; -uint8_t * ami_copr = (uint8_t *) "(C)1994 AMI"; - +static uint8_t key_ctrl_queue[16]; +static int key_ctrl_queue_start = 0, key_ctrl_queue_end = 0; static uint8_t key_queue[16]; static int key_queue_start = 0, key_queue_end = 0; uint8_t mouse_queue[16]; @@ -653,27 +569,9 @@ static const scancode scancode_set3[512] = { }; -#define UISTR_LEN 256 -static char kbd_str[UISTR_LEN]; /* UI output string */ static void add_data_kbd(uint16_t val); -extern void ui_sb_bugui(char *__str); - - -static void -kbd_status(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vsprintf(kbd_str, fmt, ap); - ui_sb_bugui(kbd_str); - va_end(ap); -} - - -// #define ENABLE_KEYBOARD_AT_LOG 1 #ifdef ENABLE_KEYBOARD_AT_LOG int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG; @@ -734,6 +632,9 @@ kbc_queue_reset(uint8_t channel) } else if (channel == 1) { key_queue_start = key_queue_end = 0; memset(key_queue, 0x00, sizeof(key_queue)); + } else { + key_ctrl_queue_start = key_ctrl_queue_end = 0; + memset(key_ctrl_queue, 0x00, sizeof(key_ctrl_queue)); } } @@ -741,6 +642,15 @@ kbc_queue_reset(uint8_t channel) static void kbc_queue_add(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) { + uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; + + if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) + stat_hi |= ((dev->input_port & 0x80) ? 0x10 : 0x00); + else + stat_hi |= 0x10; + + dev->status = (dev->status & 0x0f) | stat_hi; + if (channel == 2) { kbd_log("ATkbc: mouse_queue[%02X] = %02X;\n", mouse_queue_end, val); mouse_queue[mouse_queue_end] = val; @@ -749,1054 +659,83 @@ kbc_queue_add(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) kbd_log("ATkbc: key_queue[%02X] = %02X;\n", key_queue_end, val); key_queue[key_queue_end] = val; key_queue_end = (key_queue_end + 1) & 0xf; - } else - fatal("Adding %02X to invalid channel %02X\n", val, channel); + } else { + kbd_log("ATkbc: key_ctrl_queue[%02X] = %02X;\n", key_ctrl_queue_end, val); + key_ctrl_queue[key_ctrl_queue_end] = val; + key_ctrl_queue_end = (key_ctrl_queue_end + 1) & 0xf; + } +} + + +static void +add_to_kbc_queue_front(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) +{ + uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; + + if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) + stat_hi |= ((dev->input_port & 0x80) ? 0x10 : 0x00); + else + stat_hi |= 0x10; + + kbd_log("ATkbc: Adding %02X to front...\n", val); + dev->wantirq = 0; + if (channel == 2) { + if (dev->mem[0] & 0x02) + picint(0x1000); + dev->last_irq = 0x1000; + } else { + if (dev->mem[0] & 0x01) + picint(2); + dev->last_irq = 2; + } + dev->out = val; + if (channel == 2) + dev->status = (dev->status & ~STAT_IFULL) | (STAT_OFULL | STAT_MFULL) | stat_hi; + else + dev->status = (dev->status & ~(STAT_IFULL | STAT_MFULL)) | STAT_OFULL | stat_hi; } static void add_data_kbd_queue(atkbd_t *dev, int direct, uint8_t val) { - if ((!keyboard_scan && !direct) || (key_queue_end >= 16)) { - kbd_log("ATkbc: Unable to add to queue, conditions: %i, %i\n", !keyboard_scan, (key_queue_end >= 16)); + if ((!keyboard_scan && !direct) || (dev->reset_delay > 0) || (key_queue_end >= 16)) { + kbd_log("ATkbc: Unable to add to queue, conditions: %i, %i, %i\n", !keyboard_scan, (dev->reset_delay > 0), (key_queue_end >= 16)); return; } - - kbd_log("ATkbc: key_queue[%02X] = %02X;\n", key_queue_end, val); + kbd_log("ATkbc: key_queue[%02X] = %02X;\n", key_queue_end, val); kbc_queue_add(dev, val, 1, 0x00); kbd_last_scan_code = val; } -static void -kbc_send(atkbd_t *dev, uint8_t val, uint8_t channel) -{ - dev->kbc_written[channel] = 1; - dev->kbc_data[channel] = val; -} - static void -kbd_send_to_host(atkbd_t *dev, uint8_t val) +add_data_kbd_direct(atkbd_t *dev, uint8_t val) { - kbc_send(dev, val, CHANNEL_KBD); -} + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); + int translate = (keyboard_mode & 0x40); + uint8_t send; - -static void -kbd_chip_reset(atkbd_t *dev) -{ - kbc_queue_reset(1); - dev->kbc_written[1] = 0x00; - kbd_last_scan_code = 0x00; - - /* Set scan code set to 2. */ - keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - set_scancode_map(dev); - - dev->kbd_phase = 0; - dev->kbd_in = 0; -} - - -static void -kbd_command(atkbd_t *dev) -{ - uint8_t val = dev->kbd_data; - - if ((dev->kbd_phase > 0) && (dev->kbd_cmd == 0xff)) { - dev->kbd_phase++; - if (dev->kbd_phase == RESET_DELAY_TIME) { - kbd_send_to_host(dev, 0xaa); - dev->kbd_phase = 0; - dev->kbd_cmd = 0x00; - } - return; - } - - if (dev->kbd_phase == 2) { - dev->kbd_phase = 0; - - switch (dev->kbd_cmd) { - case 0xf2: - kbd_send_to_host(dev, 0x83); - break; - default: - fatal("Invalid command for phase 2: %02X\n", dev->kbd_cmd); - break; - } - - /* Keyboard command is now done. */ - if (dev->kbd_phase == 0) - dev->kbd_cmd = 0x00; - return; - } else if (dev->kbd_phase == 1) { - dev->kbd_phase = 0; - - switch (dev->kbd_cmd) { - case 0xf0: - kbd_log("Get scan code set: %02X\n", keyboard_mode & 3); - kbd_send_to_host(dev, keyboard_mode & 3); - break; - case 0xf2: - kbd_send_to_host(dev, 0xab); - dev->kbd_phase = 2; - break; - default: - fatal("Invalid command for phase 1: %02X\n", dev->kbd_cmd); - break; - } - - /* Keyboard command is now done. */ - if (dev->kbd_phase == 0) - dev->kbd_cmd = 0x00; - return; - } - - if (dev->kbd_in && (val < 0xed)) { - dev->kbd_in = 0; - dev->kbd_phase = 0; - - switch (dev->kbd_cmd) { - case 0xed: /* set/reset LEDs */ - kbd_log("ATkbd: set LEDs [%02x]\n", val); - kbd_send_to_host(dev, 0xfa); - break; - - case 0xf0: /* get/set scancode set */ - kbd_send_to_host(dev, 0xfa); - if (val == 0) - dev->kbd_phase = 1; - else { - if ((val <= 3) && (val != 1)) { - keyboard_mode &= 0xfc; - keyboard_mode |= (val & 3); - kbd_log("Scan code set now: %02X\n", val); - } - set_scancode_map(dev); - } - break; - - case 0xf3: /* set typematic rate/delay */ - kbd_send_to_host(dev, 0xfa); - break; - - default: - kbd_log("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, dev->kbd_cmd); - kbd_send_to_host(dev, 0xfe); - break; - } - - /* Keyboard command is now done. */ - if (dev->kbd_phase == 0) - dev->kbd_cmd = 0x00; - } else { - /* No keyboard command in progress. */ - dev->kbd_in = 0; - dev->kbd_cmd = 0x00; - dev->kbd_phase = 0; - - switch (val) { - case 0x00: - kbd_log("ATkbd: command 00\n"); - kbd_send_to_host(dev, 0xfa); - break; - - case 0x05: /*??? - sent by NT 4.0*/ - kbd_log("ATkbd: command 05 (NT 4.0)\n"); - kbd_send_to_host(dev, 0xfe); - break; - - case 0xed: /* set/reset LEDs */ - kbd_log("ATkbd: set/reset leds\n"); - kbd_send_to_host(dev, 0xfa); - - dev->kbd_in = 1; - break; - - case 0xee: /* diagnostic echo */ - kbd_log("ATkbd: ECHO\n"); - kbd_send_to_host(dev, 0xee); - break; - - case 0xef: /* NOP (reserved for future use) */ - kbd_log("ATkbd: NOP\n"); - break; - - case 0xf0: /* get/set scan code set */ - kbd_log("ATkbd: scan code set\n"); - kbd_send_to_host(dev, 0xfa); - dev->kbd_in = 1; - break; - - case 0xf2: /* read ID */ - /* Fixed as translation will be done in add_data_kbd(). */ - kbd_log("ATkbd: read keyboard id\n"); - /* TODO: After keyboard type selection is implemented, make this - return the correct keyboard ID for the selected type. */ - kbd_send_to_host(dev, 0xfa); - dev->kbd_phase = 1; - break; - - case 0xf3: /* set typematic rate/delay */ - kbd_log("ATkbd: set typematic rate/delay\n"); - kbd_send_to_host(dev, 0xfa); - dev->kbd_in = 1; - break; - - case 0xf4: /* enable keyboard */ - kbd_log("ATkbd: enable keyboard\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_scan = 1; - break; - - case 0xf5: /* set defaults and disable keyboard */ - case 0xf6: /* set defaults */ - kbd_log("ATkbd: set defaults%s\n", (val == 0xf6) ? "" : " and disable keyboard"); - keyboard_scan = (val == 0xf6); - kbd_log("val = %02X, keyboard_scan = %i, dev->mem[0x20] = %02X\n", - val, keyboard_scan, dev->mem[0x20]); - kbd_send_to_host(dev, 0xfa); - - keyboard_set3_all_break = 0; - keyboard_set3_all_repeat = 0; - memset(keyboard_set3_flags, 0, 512); - keyboard_mode = (keyboard_mode & 0xfc) | 0x02; - set_scancode_map(dev); - break; - - case 0xf7: /* set all keys to repeat */ - kbd_log("ATkbd: set all keys to repeat\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_break = 1; - break; - - case 0xf8: /* set all keys to give make/break codes */ - kbd_log("ATkbd: set all keys to give make/break codes\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_break = 1; - break; - - case 0xf9: /* set all keys to give make codes only */ - kbd_log("ATkbd: set all keys to give make codes only\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_break = 0; - break; - - case 0xfa: /* set all keys to repeat and give make/break codes */ - kbd_log("ATkbd: set all keys to repeat and give make/break codes\n"); - kbd_send_to_host(dev, 0xfa); - keyboard_set3_all_repeat = 1; - keyboard_set3_all_break = 1; - break; - - case 0xfe: /* resend last scan code */ - kbd_log("ATkbd: reset last scan code\n"); - kbd_send_to_host(dev, kbd_last_scan_code); - break; - - case 0xff: /* reset */ - kbd_log("ATkbd: kbd reset\n"); - kbd_chip_reset(dev); - kbd_send_to_host(dev, 0xfa); - dev->kbd_phase = 1; - break; - - default: - kbd_log("ATkbd: bad keyboard command %02X\n", val); - kbd_send_to_host(dev, 0xfe); - } - - /* If command needs data, remember command. */ - if ((dev->kbd_in == 1) || (dev->kbd_phase > 0)) - dev->kbd_cmd = val; - } -} - - -static void -kbd_do_command(atkbd_t *dev) -{ - kbd_command(dev); - if (dev->kbd_written) - dev->kbd_poll_phase = KBD_CMD_PROCESS; - else if ((dev->kbd_phase == 0) && !dev->kbd_in) { - dev->kbd_in_cmd = 0; - if (dev->kbd_data != 0xf5) - keyboard_scan = 1; - dev->kbd_poll_phase = KBD_MAIN_LOOP; - } else { - keyboard_scan = 0; - dev->kbd_in_cmd = 1; - dev->kbd_poll_phase = KBD_CMD_PROCESS; - } -} - - -static void -kbd_nack(atkbd_t *dev) -{ - kbd_send_to_host(dev, 0xfe); - dev->kbd_poll_phase = KBD_MAIN_LOOP; -} - - -static void -kbd_main_loop(atkbd_t *dev) -{ - uint8_t scan = !dev->kbd_inhibit && keyboard_scan; - - if (dev->kbd_written) { - dev->kbd_written = 0; - kbd_cmd_process(dev); - } else if (scan && (key_queue_start != key_queue_end)) { - /* Scan here. */ - kbd_log("ATkbd: Get %02X from FIFO\n", key_queue[key_queue_start]); - kbd_send_to_host(dev, key_queue[key_queue_start]); - key_queue_start = (key_queue_start + 1) & 0xf; - } -} - - -static void -kbd_cmd_process(atkbd_t *dev) -{ - uint8_t written = dev->kbd_written; - - /* We want data, nothing has been written yet, return. */ - if (dev->kbd_in && !dev->kbd_written) + if (dev->reset_delay) return; - dev->kbd_written = 0; + translate = translate || (keyboard_mode & 0x40) || xt_mode; + translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); - if (!written && !keyboard_scan && dev->kbd_in_cmd && (dev->kbd_phase > 0)) { - kbd_log("ATkbd: Keyboard not written, not scanning, in command, and phase > 0\n"); - kbd_do_command(dev); - } else if (dev->kbd_data == 0xfe) { - kbd_log("ATkbd: Send last byte %02X\n", kbd_last_scan_code); - kbd_send_to_host(dev, kbd_last_scan_code); - dev->kbd_poll_phase = KBD_MAIN_LOOP; - } else if (dev->kbd_data == 0xee) { - kbd_log("ATkbd: Echo EE\n"); - kbd_send_to_host(dev, 0xee); - dev->kbd_poll_phase = KBD_MAIN_LOOP; - } else if (dev->kbd_data >= 0xed) { - kbd_log("ATkbd: Command %02X\n", dev->kbd_data); - if (!keyboard_scan && dev->kbd_in_cmd && (dev->kbd_cmd == 0xed)) { - kbd_log("ATkbd: Not scanning, in command, old command is ED\n"); - keyboard_scan = 1; - dev->kbd_in_cmd = 0; - } - kbd_do_command(dev); - } else { - if (!keyboard_scan && dev->kbd_in_cmd) { - if ((dev->kbd_cmd == 0xf3) && (dev->kbd_data & 0x80)) { - kbd_log("ATkbd: Command F3 data %02X has bit 7 set\n", dev->kbd_data); - kbd_nack(dev); - } else { - kbd_log("ATkbd: Command %02X data %02X\n", dev->kbd_cmd, dev->kbd_data); - kbd_do_command(dev); - } - } else { - kbd_log("ATkbd: Scanning or not in command, NACK\n"); - kbd_nack(dev); - } - } -} + if (translate) + send = nont_to_t[val]; + else + send = val; - -/* Keyboard processing */ -static void -kbd_process(atkbd_t *dev) -{ - /* The real 8048 keyboard firmware stops transmitting if host wants to transmit. */ - if (dev->kbc_written[1] && dev->kbd_written) - dev->kbc_written[1] = 0; - - /* The host has either acknowledged the transmitted byte or we have not transmitted anything (yet). */ - if (!dev->kbc_written[1]) switch (dev->kbd_poll_phase) { - case KBD_MAIN_LOOP: - kbd_main_loop(dev); - break; - case KBD_CMD_PROCESS: - kbd_cmd_process(dev); - break; - } + add_data_kbd_queue(dev, 1, send); } static void -kbc_send_to_ob(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) +add_data_kbd_raw(atkbd_t *dev, uint8_t val) { - uint8_t ch = (channel > 0) ? channel : 1; - uint8_t do_irq = (dev->mem[0x20] & ch); - int translate = (channel == 1) && (keyboard_mode & 0x60); - - if ((channel == 2) && !(dev->flags & KBC_FLAG_PS2)) - return; - - stat_hi |= dev->inhibit; - - if (!dev->kbc_send_pending) { - dev->kbc_send_pending = 1; - dev->kbc_to_send = val; - dev->kbc_channel = channel; - dev->kbc_stat_hi = stat_hi; - return; - } - - if (translate) { - /* Allow for scan code translation. */ - if (val == 0xf0) { - kbd_log("ATkbd: translate is on, F0 prefix detected\n"); - sc_or = 0x80; - return; - } - - /* Skip break code if translated make code has bit 7 set. */ - if ((sc_or == 0x80) && (val & 0x80)) { - kbd_log("ATkbd: translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); - sc_or = 0; - return; - } - } - - dev->last_irq = (ch == 2) ? 0x1000 : 0x0002; - if (do_irq) { - kbd_log("[%04X:%08X] ATKbc: IRQ %i\n", CS, cpu_state.pc, (ch == 2) ? 12 : 1); - picint(dev->last_irq); - } - kbd_log("ATkbc: %02X coming from channel %i (%i)\n", val, channel, do_irq); - dev->ob = translate ? (nont_to_t[val] | sc_or) : val; - - dev->status = (dev->status & 0x0f) | (stat_hi | (dev->mem[0x20] & STAT_SYSFLAG) | STAT_OFULL); - if (ch == 2) - dev->status |= STAT_MFULL; - - if (translate && (sc_or == 0x80)) - sc_or = 0; -} - - -static void -write_output(atkbd_t *dev, uint8_t val) -{ - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - uint8_t old = dev->p2; - - kbd_log("ATkbc: write output port: %02X (old: %02X)\n", val, dev->p2); - - if (!(dev->flags & KBC_FLAG_PS2)) - val |= ((dev->mem[0x20] << 4) & 0x10); - - dev->kbd_inhibit = (val & 0x40); - dev->mouse_inhibit = (val & 0x08); - - /* IRQ 12 */ - if ((old ^ val) & 0x20) { - if (val & 0x20) { - kbd_log("ATkbc: write_output(): IRQ 12\n"); - picint(1 << 12); - } else - picintc(1 << 12); - } - - /* IRQ 1 */ - if ((old ^ val) & 0x10) { - if (val & 0x10) { - kbd_log("ATkbc: write_output(): IRQ 1\n"); - picint(1 << 1); - } else - picintc(1 << 1); - } - - /* A20 enable change */ - if ((old ^ val) & 0x02) { - mem_a20_key = val & 0x02; - mem_a20_recalc(); - flushmmucache(); - } - - /* Do this here to avoid an infinite reset loop. */ - dev->p2 = val; - - /* 0 holds the CPU in the RESET state, 1 releases it. To simplify this, - we just do everything on release. */ - if ((val & 0x01) && !(old & 0x01)) { - if (val & 0x01) { - /* Pin 0 selected. */ - pclog("write_output(): Pulse reset!\n"); - softresetx86(); /*Pulse reset!*/ - cpu_set_edx(); - } - } -} - - -static void -write_cmd(atkbd_t *dev, uint8_t val) -{ - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - kbd_log("ATkbc: write command byte: %02X (old: %02X)\n", val, dev->mem[0x20]); - - /* PS/2 type 2 keyboard controllers always force the XLAT bit to 0. */ - if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) - val &= ~CCB_TRANSLATE; - - dev->mem[0x20] = val; - - /* Scan code translate ON/OFF. */ - keyboard_mode &= 0x93; - keyboard_mode |= (val & MODE_MASK); - - kbd_log("ATkbc: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); - - /* ISA AT keyboard controllers use bit 5 for keyboard mode (1 = PC/XT, 2 = AT); - PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. - The AMIKEY firmware apparently uses this bit for something else. */ - if ((kbc_ven == KBC_VEN_AMI) || (dev->flags & KBC_FLAG_PS2)) { - keyboard_mode &= ~CCB_PCMODE; - - kbd_log("ATkbc: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); - } - - if (!(dev->flags & KBC_FLAG_PS2)) { - /* Update the output port to mirror the KBD DIS and AUX DIS bits, if active. */ - write_output(dev, dev->p2); - } - - kbd_log("Command byte now: %02X (%02X)\n", dev->mem[0x20], val); - - dev->status = (dev->status & ~STAT_SYSFLAG) | (val & STAT_SYSFLAG); -} - - -static void -pulse_output(atkbd_t *dev, uint8_t mask) -{ - if (mask != 0x0f) { - dev->old_p2 = dev->p2 & ~(0xf0 | mask); - kbd_log("pulse_output(): Output port now: %02X\n", dev->p2 & (0xf0 | mask | (dev->mem[0x20] & 0x30))); - write_output(dev, dev->p2 & (0xf0 | mask | (dev->mem[0x20] & 0x30))); - timer_set_delay_u64(&dev->pulse_cb, 6ULL * TIMER_USEC); - } -} - - -static void -set_enable_kbd(atkbd_t *dev, uint8_t enable) -{ - dev->mem[0x20] &= 0xef; - dev->mem[0x20] |= (enable ? 0x00 : 0x10); -} - - -static void -set_enable_mouse(atkbd_t *dev, uint8_t enable) -{ - dev->mem[0x20] &= 0xdf; - dev->mem[0x20] |= (enable ? 0x00 : 0x20); -} - - -static void -kbc_transmit(atkbd_t *dev, uint8_t val) -{ - kbc_send_to_ob(dev, val, 0, 0x00); -} - - -static void -kbc_command(atkbd_t *dev) -{ - uint8_t mask, val = dev->ib; - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - int bad = 1; - - if ((dev->kbc_phase > 0) && (dev->kbc_cmd == 0xac)) { - if (dev-> kbc_phase < 16) - kbc_transmit(dev, dev->mem[dev->kbc_phase]); - else if (dev-> kbc_phase == 16) - kbc_transmit(dev, (dev->p1 & 0xf0) | 0x80); - else if (dev-> kbc_phase == 17) - kbc_transmit(dev, dev->p2); - else if (dev-> kbc_phase == 18) - kbc_transmit(dev, dev->status); - - dev->kbc_phase++; - if (dev->kbc_phase == 19) { - dev->kbc_phase = 0; - dev->kbc_cmd = 0x00; - } - return; - } else if ((dev->kbc_phase > 0) && (dev->kbc_cmd == 0xa0) && (kbc_ven >= KBC_VEN_AMI)) { - val = ami_copr[dev->kbc_phase]; - kbc_transmit(dev, val); - if (val == 0x00) { - dev->kbc_phase = 0; - dev->kbc_cmd = 0x00; - } else - dev->kbc_phase++; - return; - } else if ((dev->kbc_in > 0) && (dev->kbc_cmd == 0xa5) && (dev->flags & KBC_FLAG_PS2)) { - /* load security */ - kbd_log("ATkbc: load security\n"); - dev->mem[0x50 + dev->kbc_in - 0x01] = val; - if ((dev->kbc_in == 0x80) && (val != 0x00)) { - /* Security string too long, set it to 0x00. */ - dev->mem[0x50] = 0x00; - dev->kbc_in = 0; - dev->kbc_cmd = 0; - } else if (val == 0x00) { - /* Security string finished. */ - dev->kbc_in = 0; - dev->kbc_cmd = 0; - } else /* Increase pointer and request another byte. */ - dev->kbc_in++; - return; - } - - /* If the written port is 64, go straight to the beginning of the command. */ - if (!(dev->status & STAT_CD) && dev->kbc_in) { - /* Write data to controller. */ - dev->kbc_in = 0; - dev->kbc_phase = 0; - - switch (dev->kbc_cmd) { - case 0x60 ... 0x7f: - if (dev->kbc_cmd == 0x60) - write_cmd(dev, val); - else - dev->mem[(dev->kbc_cmd & 0x1f) + 0x20] = val; - break; - - case 0xc7: /* or input port with system data */ - dev->p1 |= val; - break; - - case 0xcb: /* set keyboard mode */ - kbd_log("New AMIKey mode: %02X\n", val); - dev->ami_mode = val; - dev->flags &= ~KBC_FLAG_PS2; - if (val & 1) - dev->flags |= KBC_FLAG_PS2; - break; - - case 0xd1: /* write output port */ - kbd_log("ATkbc: write output port\n"); - if (dev->p2_locked) { - /*If keyboard controller lines P22-P23 are blocked, - we force them to remain unchanged.*/ - val &= ~0x0c; - val |= (dev->p2 & 0x0c); - } - write_output(dev, val); - break; - - case 0xd2: /* write to keyboard output buffer */ - kbd_log("ATkbc: write to keyboard output buffer\n"); - // kbc_send_to_ob(dev, val, 1, 0x00); - /* Should be channel 1, but we send to 0 to avoid translation, - since bytes output using this command do *NOT* get translated. */ - kbc_send_to_ob(dev, val, 0, 0x00); - break; - - case 0xd3: /* write to mouse output buffer */ - kbd_log("ATkbc: write to mouse output buffer\n"); - if (dev->flags & KBC_FLAG_PS2) - kbc_send_to_ob(dev, val, 2, 0x00); - break; - - case 0xd4: /* write to mouse */ - kbd_log("ATkbc: write to mouse (%02X)\n", val); - - if (dev->flags & KBC_FLAG_PS2) { - set_enable_mouse(dev, 1); - dev->mem[0x20] &= ~0x20; - if (mouse_write && !dev->kbc_written[2]) { - kbd_log("ATkbc: Sending %02X to mouse...\n", dev->ib); - dev->mouse_data = val; - dev->mouse_written = 1; - dev->kbc_wait_for_response = 2; - } else - kbc_send_to_ob(dev, 0xfe, 2, 0x40); - } - break; - - default: - /* - * Run the vendor-specific handler - * if we have one. Otherwise, or if - * it returns an error, log a bad - * controller command. - */ - if (dev->write60_ven) - bad = dev->write60_ven(dev, val); - -#ifdef ENABLE_KEYBOARD_AT_LOG - if (bad) - kbd_log("ATkbc: bad controller command %02x data %02x\n", dev->kbc_cmd, val); -#endif - } - } else { - /* Controller command. */ - kbd_log("ATkbc: Controller command: %02X\n", val); - dev->kbc_in = 0; - dev->kbc_phase = 0; - - switch (val) { - /* Read data from KBC memory. */ - case 0x20 ... 0x3f: - kbc_transmit(dev, dev->mem[(val & 0x1f) + 0x20]); - break; - - /* Write data to KBC memory. */ - case 0x60 ... 0x7f: - dev->kbc_in = 1; - break; - - case 0xaa: /* self-test */ - kbd_log("ATkbc: self-test\n"); - write_output(dev, (dev->flags & KBC_FLAG_PS2) ? 0x4b : 0xcf); - - /* Always reinitialize all queues - the real hardware pulls keyboard and mouse - clocks high, which stops keyboard scanning. */ - kbd_log("ATkbc: self-test reinitialization\n"); - dev->kbd_in_cmd = dev->mouse_in_cmd = 0; - dev->status &= ~STAT_OFULL; - dev->last_irq = 0; - dev->kbc_phase = 0; - - /* Phoenix MultiKey should have 0x60 | STAT_SYSFLAG. */ - if (dev->flags & KBC_FLAG_PS2) - write_cmd(dev, 0x30 | STAT_SYSFLAG); - else - write_cmd(dev, 0x10 | STAT_SYSFLAG); - kbc_transmit(dev, 0x55); - break; - - case 0xab: /* interface test */ - kbd_log("ATkbc: interface test\n"); - /* No error. */ - kbc_transmit(dev, 0x00); - break; - - case 0xac: /* diagnostic dump */ - kbd_log("ATkbc: diagnostic dump\n"); - kbc_transmit(dev, dev->mem[0x20]); - dev->kbc_phase = 1; - break; - - case 0xad: /* disable keyboard */ - kbd_log("ATkbc: disable keyboard\n"); - set_enable_kbd(dev, 0); - break; - - case 0xae: /* enable keyboard */ - kbd_log("ATkbc: enable keyboard\n"); - set_enable_kbd(dev, 1); - break; - - case 0xc7: /* or input port with system data */ - kbd_log("ATkbc: Phoenix - or input port with system data\n"); - dev->kbc_in = 1; - break; - - case 0xca: /* read keyboard mode */ - kbd_log("ATkbc: AMI - read keyboard mode\n"); - kbc_transmit(dev, dev->ami_mode); - break; - - case 0xcb: /* set keyboard mode */ - kbd_log("ATkbc: AMI - set keyboard mode\n"); - dev->kbc_in = 1; - break; - - case 0xd0: /* read output port */ - kbd_log("ATkbc: read output port\n"); - mask = 0xff; - if (!(dev->flags & KBC_FLAG_PS2) && (dev->mem[0x20] & 0x10)) - mask &= 0xbf; - kbc_transmit(dev, dev->p2 & mask); - break; - - case 0xd1: /* write output port */ - kbd_log("ATkbc: write output port\n"); - dev->kbc_in = 1; - break; - - case 0xd2: /* write keyboard output buffer */ - kbd_log("ATkbc: write keyboard output buffer\n"); - if (dev->flags & KBC_FLAG_PS2) - dev->kbc_in = 1; - else - kbc_transmit(dev, 0x00); /* NCR */ - break; - - case 0xdd: /* disable A20 address line */ - case 0xdf: /* enable A20 address line */ - kbd_log("ATkbc: %sable A20\n", (val == 0xdd) ? "dis": "en"); - write_output(dev, (dev->p2 & 0xfd) | (val & 0x02)); - break; - - case 0xe0: /* read test inputs */ - kbd_log("ATkbc: read test inputs\n"); - kbc_transmit(dev, 0x00); - break; - - case 0xe1: case 0xea: - kbd_log("ATkbc: setting P23-P21 to %01X\n", val & 0x0e); - write_output(dev, (dev->p2 & 0xf1) | (val & 0x0e)); - break; - - default: - /* - * Unrecognized controller command. - * - * If we have a vendor-specific handler, run - * that. Otherwise, or if that handler fails, - * log a bad command. - */ - if (dev->write64_ven) - bad = dev->write64_ven(dev, val); - - kbd_log(bad ? "ATkbc: bad controller command %02X\n" : "", val); - } - - /* If the command needs data, remember the command. */ - if (dev->kbc_in || (dev->kbc_phase > 0)) - dev->kbc_cmd = val; - } -} - - -static void -kbc_dev_data_to_ob(atkbd_t *dev, uint8_t channel) -{ - dev->kbc_written[channel] = 0; - kbd_log("ATkbd: Forwarding %02X from channel %i...\n", dev->kbc_data[channel], channel); - kbc_send_to_ob(dev, dev->kbc_data[channel], channel, 0x00); -} - - -static void -kbc_main_loop_scan(atkbd_t *dev) -{ - uint8_t port_dis = dev->mem[0x20] & 0x30; - uint8_t ps2 = (dev->flags & KBC_FLAG_PS2); - - if (!ps2) - port_dis |= 0x20; - - if (!(dev->status & STAT_OFULL)) { - if (port_dis & 0x20) { - if (!(port_dis & 0x10)) { - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Main loop\n" - "ATkbc: Scan: AUX DIS, KBD EN\n"); - // kbd_log("ATkbc: Scan: AUX DIS, KBD EN\n"); - /* Enable communication with keyboard. */ - dev->p2 &= 0xbf; - dev->kbd_inhibit = 0; - kbc_wait(dev, 1); - } -#ifdef ENABLE_KEYBOARD_AT_LOG - else { - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Main loop\n" - "ATkbc: Scan: AUX DIS, KBD DIS\n"); - // kbd_log("ATkbc: Scan: AUX DIS, KBD DIS\n"); - } -#endif - } else { - /* Enable communication with mouse. */ - dev->p2 &= 0xf7; - dev->mouse_inhibit = 0; - if (dev->mem[0x20] & 0x10) { - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Main loop\n" - "ATkbc: Scan: AUX EN , KBD DIS\n"); - // kbd_log("ATkbc: Scan: AUX EN , KBD DIS\n"); - kbc_wait(dev, 2); - } else { - /* Enable communication with keyboard. */ - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Main loop\n" - "ATkbc: Scan: AUX EN , KBD EN\n"); - // kbd_log("ATkbc: Scan: AUX EN , KBD EN\n"); - dev->p2 &= 0xbf; - dev->kbd_inhibit = 0; - kbc_wait(dev, 3); - } - } - } -#ifdef ENABLE_KEYBOARD_AT_LOG - else { - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Main loop\n" - "ATkbc: Scan: IBF not full and OBF full, do nothing\n"); - // kbd_log("ATkbc: Scan: IBF not full and OBF full, do nothing\n"); - } -#endif -} - - -static void -kbc_process_ib(atkbd_t *dev) -{ - dev->status &= ~STAT_IFULL; - - if (dev->status & STAT_CD) { - dev->kbc_in_cmd = 1; - kbc_command(dev); - - if ((dev->kbc_phase == 0) && !dev->kbc_in) - dev->kbc_in_cmd = 0; - else - return; - } else { - dev->mem[0x20] &= ~0x10; - dev->kbd_data = dev->ib; - dev->kbd_written = 1; - dev->kbc_wait_for_response = 1; - } - - dev->kbc_poll_phase = KBC_MAIN_LOOP; - if (!dev->kbc_wait_for_response) - kbc_main_loop_scan(dev); -} - - -static void -kbc_wait(atkbd_t *dev, uint8_t flags) -{ - if ((flags & 1) && dev->kbc_written[1]) { - /* Disable communication with mouse. */ - dev->p2 |= 0x08; - dev->mouse_inhibit = 1; - /* Send keyboard byte to host. */ - kbc_dev_data_to_ob(dev, CHANNEL_KBD); - dev->kbc_poll_phase = KBC_MAIN_LOOP; - } else if ((flags & 2) && dev->kbc_written[2]) { - /* Disable communication with keyboard. */ - dev->p2 |= 0x40; - dev->kbd_inhibit = 1; - /* Send mouse byte to host. */ - kbc_dev_data_to_ob(dev, CHANNEL_MOUSE); - dev->kbc_poll_phase = KBC_MAIN_LOOP; - } else if (dev->status & STAT_IFULL) { - /* Disable communication with keyboard and mouse. */ - dev->p2 |= 0x48; - dev->kbd_inhibit = dev->mouse_inhibit = 1; - kbc_process_ib(dev); - } else - dev->kbc_poll_phase = KBC_WAIT | flags; -} - - -/* Controller processing */ -static void -kbc_process(atkbd_t *dev) -{ - // kbd_log("ATkbc: kbc_process()\n"); - - /* If we're waiting for the response from the keyboard or mouse, do nothing - until the device has repsonded back. */ - if (dev->kbc_wait_for_response > 0) { - if (dev->kbc_written[dev->kbc_wait_for_response]) - dev->kbc_wait_for_response = 0; - else - return; - } - - if (dev->kbc_send_pending) { - kbd_log("ATkbc: Sending delayed %02X on channel %i with high status %02X\n", - dev->kbc_to_send, dev->kbc_channel, dev->kbc_stat_hi); - kbc_send_to_ob(dev, dev->kbc_to_send, dev->kbc_channel, dev->kbc_stat_hi); - dev->kbc_send_pending = 0; - } - - if (dev->kbc_poll_phase == KBC_RESET) { - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Reset loop()\n"); - - if (dev->status & STAT_IFULL) { - dev->status &= ~STAT_IFULL; - - if ((dev->status & STAT_CD) && (dev->ib == 0xaa)) { - dev->kbc_in_cmd = 1; - kbc_command(dev); - - if ((dev->kbc_phase == 0) && !dev->kbc_in) - dev->kbc_in_cmd = 0; - - dev->kbc_poll_phase = KBC_MAIN_LOOP; - } - } - - return; - } - - if (dev->kbc_in_cmd || (dev->kbc_phase > 0) || dev->kbc_in) { - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: In a command\n"); - if (!dev->kbc_in && (dev->status & STAT_OFULL)) { - kbd_log("ATkbc: !dev->kbc_in && (dev->status & STAT_OFULL)\n"); - return; /* We do not want input and we're waiting for the host to read the data - we transmitted, but it has not done that yet, do nothing. */ - } else if (dev->kbc_in && !(dev->status & STAT_IFULL)) { - kbd_log("ATkbc: dev->kbc_in && !(dev->status & STAT_IFULL)\n"); - return; /* We want input and the host has not provided us with any yet, do nothing. */ - } -#ifdef ENABLE_KEYBOARD_AT_LOG - else - kbd_log("ATkbc: Normal condition\n"); -#endif - - if (dev->status & STAT_IFULL) { - dev->status &= ~STAT_IFULL; - - if (dev->status & STAT_CD) { - kbd_log("ATkbc: Resetting command\n"); - dev->kbc_phase = 0; - dev->kbc_in = 0; - } - } - - /* Process command. */ - kbc_command(dev); - - if ((dev->kbc_phase == 0) && !dev->kbc_in) - dev->kbc_in_cmd = 0; - else - return; - - if (!(dev->status & STAT_OFULL)) - kbc_main_loop_scan(dev); - /* Make absolutely sure to do nothing if OBF is full and IBF is empty. */ - } else if (!(dev->status & STAT_OFULL) || (dev->status & STAT_IFULL)) switch (dev->kbc_poll_phase) { - case KBC_MAIN_LOOP: - // kbd_log("ATkbc: Main loop\n"); - if (dev->status & STAT_IFULL) { - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Main loop\n" - "ATkbc: IBF full, process\n"); - kbc_process_ib(dev); - } else - kbc_main_loop_scan(dev); - break; - case KBC_WAIT_FOR_KBD: - case KBC_WAIT_FOR_MOUSE: - case KBC_WAIT_FOR_BOTH: - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Scan: Phase %i\n", dev->kbc_poll_phase); - kbc_wait(dev, dev->kbc_poll_phase & 3); - break; - default: - kbd_log("ATkbc: kbc_process()\n" - "ATkbc: Scan: Invalid phase %i\n", dev->kbc_poll_phase); - break; - } + add_data_kbd_queue(dev, 1, val); } @@ -1804,29 +743,105 @@ static void kbd_poll(void *priv) { atkbd_t *dev = (atkbd_t *)priv; +#ifdef ENABLE_KEYBOARD_AT_LOG + const uint8_t channels[4] = { 1, 2, 0, 0 }; +#endif timer_advance_u64(&dev->send_delay_timer, (100ULL * TIMER_USEC)); - /* We process all three devices at the same time, in an arbitrary order. */ + if (dev->out_new != -1 && !dev->last_irq) { + dev->wantirq = 0; + if (dev->out_new & 0x100) { + if (dev->mem[0] & 0x02) + picint(0x1000); + kbd_log("ATkbc: %02X coming from channel 2\n"); + dev->out = dev->out_new & 0xff; + dev->out_new = -1; + dev->status = (dev->status & ~STAT_IFULL) | (STAT_OFULL | STAT_MFULL); + dev->last_irq = 0x1000; + } else { + if (dev->mem[0] & 0x01) + picint(2); + kbd_log("ATkbc: %02X coming from channel %i\n", dev->out_new & 0xff, channels[(dev->out_new >> 8) & 0x03]); + dev->out = dev->out_new & 0xff; + dev->out_new = -1; + dev->status = (dev->status & ~(STAT_IFULL | STAT_MFULL)) | STAT_OFULL; + dev->last_irq = 2; + } + } - /* Keyboard processing */ - kbd_process(dev); + if (dev->out_new == -1 && !(dev->status & STAT_OFULL) && key_ctrl_queue_start != key_ctrl_queue_end) { + kbd_log("ATkbc: %02X on channel 0\n", key_ctrl_queue[key_ctrl_queue_start]); + dev->out_new = key_ctrl_queue[key_ctrl_queue_start] | 0x200; + key_ctrl_queue_start = (key_ctrl_queue_start + 1) & 0xf; + } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && dev->out_delayed != -1) { + kbd_log("ATkbc: %02X delayed on channel %i\n", dev->out_delayed & 0xff, channels[(dev->out_delayed >> 8) & 0x03]); + dev->out_new = dev->out_delayed; + dev->out_delayed = -1; + } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && mouse_queue_start != mouse_queue_end) { + kbd_log("ATkbc: %02X on channel 2\n", mouse_queue[mouse_queue_start]); + dev->out_new = mouse_queue[mouse_queue_start] | 0x100; + mouse_queue_start = (mouse_queue_start + 1) & 0xf; + } else if (!(dev->status & STAT_OFULL) && dev->out_new == -1 && !(dev->mem[0] & 0x10) && key_queue_start != key_queue_end) { + kbd_log("ATkbc: %02X on channel 1\n", key_queue[key_queue_start]); + dev->out_new = key_queue[key_queue_start]; + key_queue_start = (key_queue_start + 1) & 0xf; + } - /* TODO: Mouse processing */ - // mouse_process(dev); + if (dev->reset_delay) { + dev->reset_delay--; + if (!dev->reset_delay) { + kbd_log("ATkbc: Sending AA on keyboard reset...\n"); + add_data_kbd_direct(dev, 0xaa); + } + } +} - /* Controller processing */ - kbc_process(dev); + +static void +add_data(atkbd_t *dev, uint8_t val) +{ + kbd_log("ATkbc: add to queue\n"); + + kbd_log("ATkbc: key_ctrl_queue[%02X] = %02X;\n", key_ctrl_queue_end, val); + kbc_queue_add(dev, val, 0, 0x00); + + if (!(dev->out_new & 0x300)) { + dev->out_delayed = dev->out_new; + dev->out_new = -1; + } } static void add_data_vals(atkbd_t *dev, uint8_t *val, uint8_t len) { + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); + int translate = (keyboard_mode & 0x40); int i; + uint8_t or = 0; + uint8_t send; - for (i = 0; i < len; i++) - add_data_kbd_queue(dev, 0, val[i]); + if (dev->reset_delay) + return; + + translate = translate || (keyboard_mode & 0x40) || xt_mode; + translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); + + for (i = 0; i < len; i++) { + if (translate) { + if (val[i] == 0xf0) { + or = 0x80; + continue; + } + send = nont_to_t[val[i]] | or; + if (or == 0x80) + or = 0; + } else + send = val[i]; + + add_data_kbd_queue(dev, 0, send); + } } @@ -1834,21 +849,56 @@ static void add_data_kbd(uint16_t val) { atkbd_t *dev = SavedKbd; + int xt_mode = (keyboard_mode & 0x20) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF); + int translate = (keyboard_mode & 0x40); uint8_t fake_shift[4]; uint8_t num_lock = 0, shift_states = 0; uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - if (dev->kbd_in || (dev->kbd_phase > 0)) + if (dev->reset_delay) return; + translate = translate || (keyboard_mode & 0x40) || xt_mode; + translate = translate || ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2); + keyboard_get_states(NULL, &num_lock, NULL); shift_states = keyboard_get_shift() & STATE_SHIFT_MASK; - /* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */ - if ((dev != NULL) && (kbc_ven == KBC_VEN_TOSHIBA) && (keyboard_recv(0xb8) || keyboard_recv(0x9d)) && - (val >= 0x4f) && (val <= 0x54) && (val != 0x4e)) - t3100e_notify_set((val + 2) & 0x0f); + /* Allow for scan code translation. */ + if (translate && (val == 0xf0)) { + kbd_log("ATkbd: translate is on, F0 prefix detected\n"); + sc_or = 0x80; + return; + } + /* Skip break code if translated make code has bit 7 set. */ + if (translate && (sc_or == 0x80) && (val & 0x80)) { + kbd_log("ATkbd: translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); + sc_or = 0; + return; + } + + /* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */ + if ((dev != NULL) && (kbc_ven == KBC_VEN_TOSHIBA) && + (keyboard_recv(0xb8) || keyboard_recv(0x9d))) switch (val) { + case 0x4f: t3100e_notify_set(0x01); break; /* End */ + case 0x50: t3100e_notify_set(0x02); break; /* Down */ + case 0x51: t3100e_notify_set(0x03); break; /* PgDn */ + case 0x52: t3100e_notify_set(0x04); break; /* Ins */ + case 0x53: t3100e_notify_set(0x05); break; /* Del */ + case 0x54: t3100e_notify_set(0x06); break; /* SysRQ */ + case 0x45: t3100e_notify_set(0x07); break; /* NumLock */ + case 0x46: t3100e_notify_set(0x08); break; /* ScrLock */ + case 0x47: t3100e_notify_set(0x09); break; /* Home */ + case 0x48: t3100e_notify_set(0x0a); break; /* Up */ + case 0x49: t3100e_notify_set(0x0b); break; /* PgUp */ + case 0x4A: t3100e_notify_set(0x0c); break; /* Keypad -*/ + case 0x4B: t3100e_notify_set(0x0d); break; /* Left */ + case 0x4C: t3100e_notify_set(0x0e); break; /* KP 5 */ + case 0x4D: t3100e_notify_set(0x0f); break; /* Right */ + } + + kbd_log("ATkbd: translate is %s, ", translate ? "on" : "off"); switch(val) { case FAKE_LSHIFT_ON: kbd_log("fake left shift on, scan code: "); @@ -1981,7 +1031,18 @@ add_data_kbd(uint16_t val) break; default: - add_data_kbd_queue(dev, 0, val); +#ifdef ENABLE_KEYBOARD_AT_LOG + kbd_log("scan code: "); + if (translate) { + kbd_log("%02X (original: ", (nont_to_t[val] | sc_or)); + if (sc_or == 0x80) + kbd_log("F0 "); + kbd_log("%02X)\n", val); + } else + kbd_log("%02X\n", val); +#endif + + add_data_kbd_queue(dev, 0, translate ? (nont_to_t[val] | sc_or) : val); break; } @@ -1990,13 +1051,124 @@ add_data_kbd(uint16_t val) } +static void +write_output(atkbd_t *dev, uint8_t val) +{ + uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; + kbd_log("ATkbc: write output port: %02X (old: %02X)\n", val, dev->output_port); + + if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF)) + val |= ((dev->mem[0] << 4) & 0x10); + + if ((dev->output_port ^ val) & 0x20) { /*IRQ 12*/ + if (val & 0x20) + picint(1 << 12); + else + picintc(1 << 12); + } + if ((dev->output_port ^ val) & 0x10) { /*IRQ 1*/ + if (val & 0x10) + picint(1 << 1); + else + picintc(1 << 1); + } + if ((dev->output_port ^ val) & 0x02) { /*A20 enable change*/ + mem_a20_key = val & 0x02; + mem_a20_recalc(); + flushmmucache(); + } + if ((dev->output_port ^ val) & 0x01) { /*Reset*/ + if (! (val & 0x01)) { + /* Pin 0 selected. */ + softresetx86(); /*Pulse reset!*/ + cpu_set_edx(); + smbase = is_am486dxl ? 0x00060000 : 0x00030000; + } + } + /* Mask off the A20 stuff because we use mem_a20_key directly for that. */ + dev->output_port = val; +} + + +static void +write_cmd(atkbd_t *dev, uint8_t val) +{ + uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; + kbd_log("ATkbc: write command byte: %02X (old: %02X)\n", val, dev->mem[0]); + + if ((val & 1) && (dev->status & STAT_OFULL)) + dev->wantirq = 1; + if (!(val & 1) && dev->wantirq) + dev->wantirq = 0; + + /* PS/2 type 2 keyboard controllers always force the XLAT bit to 0. */ + if ((dev->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) { + val &= ~CCB_TRANSLATE; + dev->mem[0] &= ~CCB_TRANSLATE; + } + + /* Scan code translate ON/OFF. */ + keyboard_mode &= 0x93; + keyboard_mode |= (val & MODE_MASK); + + kbd_log("ATkbc: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); + + /* ISA AT keyboard controllers use bit 5 for keyboard mode (1 = PC/XT, 2 = AT); + PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. + The AMIKEY firmware apparently uses this bit for something else. */ + if ((kbc_ven == KBC_VEN_AMI) || + ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) { + keyboard_mode &= ~CCB_PCMODE; + + kbd_log("ATkbc: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); + } + + if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF)) { + /* Update the output port to mirror the KBD DIS and AUX DIS bits, if active. */ + write_output(dev, dev->output_port); + } + + kbd_log("Command byte now: %02X (%02X)\n", dev->mem[0], val); + + dev->status = (dev->status & ~STAT_SYSFLAG) | (val & STAT_SYSFLAG); +} + + +static void +pulse_output(atkbd_t *dev, uint8_t mask) +{ + if (mask != 0x0f) { + dev->old_output_port = dev->output_port & ~(0xf0 | mask); + kbd_log("pulse_output(): Output port now: %02X\n", dev->output_port & (0xf0 | mask)); + write_output(dev, dev->output_port & (0xf0 | mask)); + timer_set_delay_u64(&dev->pulse_cb, 6ULL * TIMER_USEC); + } +} + + static void pulse_poll(void *priv) { atkbd_t *dev = (atkbd_t *)priv; - kbd_log("pulse_poll(): Output port now: %02X\n", dev->p2 | dev->old_p2); - write_output(dev, dev->p2 | dev->old_p2); + kbd_log("pulse_poll(): Output port now: %02X\n", dev->output_port | dev->old_output_port); + write_output(dev, dev->output_port | dev->old_output_port); +} + + +static void +set_enable_kbd(atkbd_t *dev, uint8_t enable) +{ + dev->mem[0] &= 0xef; + dev->mem[0] |= (enable ? 0x00 : 0x10); +} + + +static void +set_enable_mouse(atkbd_t *dev, uint8_t enable) +{ + dev->mem[0] &= 0xdf; + dev->mem[0] |= (enable ? 0x00 : 0x20); } @@ -2005,72 +1177,49 @@ write64_generic(void *priv, uint8_t val) { atkbd_t *dev = (atkbd_t *)priv; uint8_t current_drive, fixed_bits; - uint8_t kbc_ven = 0x0; - kbc_ven = dev->flags & KBC_VEN_MASK; + uint8_t kbc_ven = 0x0; + kbc_ven = dev->flags & KBC_VEN_MASK; + switch (val) { case 0xa4: /* check if password installed */ - if (dev->flags & KBC_FLAG_PS2) { + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: check if password installed\n"); - kbc_transmit(dev, (dev->mem[0x50] == 0x00) ? 0xf1 : 0xfa); - return 0; - } - break; - - case 0xa5: /* load security */ - if (dev->flags & KBC_FLAG_PS2) { - kbd_log("ATkbc: load security\n"); - dev->kbc_in = 1; + add_data(dev, 0xf1); return 0; } break; case 0xa7: /* disable mouse port */ - if (dev->flags & KBC_FLAG_PS2) { + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: disable mouse port\n"); - // kbc_transmit(dev, 0); + set_enable_mouse(dev, 0); return 0; } break; case 0xa8: /*Enable mouse port*/ - if (dev->flags & KBC_FLAG_PS2) { + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: enable mouse port\n"); - // kbc_transmit(dev, 1); + set_enable_mouse(dev, 1); return 0; } break; case 0xa9: /*Test mouse port*/ kbd_log("ATkbc: test mouse port\n"); - if (dev->flags & KBC_FLAG_PS2) { - /* No error, this is testing the channel 2 interface. */ - kbc_transmit(dev, 0x00); + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + add_data(dev, 0x00); /* no error, this is testing the channel 2 interface */ return 0; } break; case 0xaf: /* read keyboard version */ kbd_log("ATkbc: read keyboard version\n"); - kbc_transmit(dev, 0x00); + add_data(dev, 0x00); return 0; case 0xc0: /* read input port */ - /* IBM PS/1: - Bit 2 and 4 ignored (we return always 0), - Bit 6 must 1 for 5.25" floppy drive, 0 for 3.5". - Intel AMI: - Bit 2 ignored (we return always 1), - Bit 4 must be 1, - Bit 6 must be 1 or else error in SMM. - Acer: - Bit 2 must be 0 (and Acer V10 disables CMOS setup if it's 1), - Bit 4 must be 0, - Bit 6 ignored. - Packard Bell PB450: - Bit 2 must be 1. - P6RP4: - Bit 2 must be 1 or CMOS setup is disabled. */ kbd_log("ATkbc: read input port\n"); fixed_bits = 4; /* The SMM handlers of Intel AMI Pentium BIOS'es expect bit 6 to be set. */ @@ -2078,8 +1227,11 @@ write64_generic(void *priv, uint8_t val) fixed_bits |= 0x40; if (kbc_ven == KBC_VEN_IBM_PS1) { current_drive = fdc_get_current_drive(); - kbc_transmit(dev, dev->p1 | fixed_bits | (fdd_is_525(current_drive) ? 0x40 : 0x00)); - dev->p1 = ((dev->p1 + 1) & 3) | (dev->p1 & 0xfc) | (fdd_is_525(current_drive) ? 0x40 : 0x00); + add_to_kbc_queue_front(dev, dev->input_port | fixed_bits | (fdd_is_525(current_drive) ? 0x40 : 0x00), + 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | + (dev->input_port & 0xfc) | + (fdd_is_525(current_drive) ? 0x40 : 0x00); } else if (kbc_ven == KBC_VEN_NCR) { /* switch settings * bit 7: keyboard disable @@ -2091,34 +1243,39 @@ write64_generic(void *priv, uint8_t val) * bit 1: high/auto speed * bit 0: dma mode */ - kbc_transmit(dev, (dev->p1 | fixed_bits | (video_is_mda() ? 0x40 : 0x00) | (hasfpu ? 0x08 : 0x00)) & 0xdf); - dev->p1 = ((dev->p1 + 1) & 3) | (dev->p1 & 0xfc); + add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits | (video_is_mda() ? 0x40 : 0x00) | (hasfpu ? 0x08 : 0x00)) & 0xdf, + 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | + (dev->input_port & 0xfc); } else { - pclog("[%04X:%08X] Reading %02X from input port\n", CS, cpu_state.pc, ((dev->p1 | fixed_bits) & 0xf0) | 0x0c); - if ((dev->flags & KBC_FLAG_PS2) && ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) - // kbc_transmit(dev, ((dev->p1 | fixed_bits) & 0xf0) | 0x0c); - kbc_transmit(dev, ((dev->p1 | fixed_bits) & 0xf0) | 0x08); - // kbc_transmit(dev, (dev->p1 | fixed_bits) & (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef)); + if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && + ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) + add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits) & + (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef), 0, 0x00); else - kbc_transmit(dev, dev->p1 | fixed_bits); - dev->p1 = ((dev->p1 + 1) & 3) | (dev->p1 & 0xfc); + add_to_kbc_queue_front(dev, dev->input_port | fixed_bits, 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | + (dev->input_port & 0xfc); } return 0; case 0xd3: /* write mouse output buffer */ - if (dev->flags & KBC_FLAG_PS2) { + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: write mouse output buffer\n"); - dev->kbc_in = 1; + dev->want60 = 1; return 0; } break; case 0xd4: /* write to mouse */ kbd_log("ATkbc: write to mouse\n"); - dev->kbc_in = 1; + dev->want60 = 1; return 0; - case 0xf0 ... 0xff: + case 0xf0: case 0xf1: case 0xf2: case 0xf3: + case 0xf4: case 0xf5: case 0xf6: case 0xf7: + case 0xf8: case 0xf9: case 0xfa: case 0xfb: + case 0xfc: case 0xfd: case 0xfe: case 0xff: kbd_log("ATkbc: pulse %01X\n", val & 0x0f); pulse_output(dev, val & 0x0f); return 0; @@ -2133,170 +1290,38 @@ static uint8_t write60_ami(void *priv, uint8_t val) { atkbd_t *dev = (atkbd_t *)priv; - uint16_t index = 0x00c0; - switch(dev->kbc_cmd) { - /* 0x40 - 0x5F are aliases for 0x60 - 0x7F */ - case 0x40 ... 0x5f: - kbd_log("ATkbc: AMI - alias write to %08X\n", dev->kbc_cmd); - if (dev->kbc_cmd == 0x40) + switch(dev->command) { + /* 0x40 - 0x5F are aliases for 0x60-0x7F */ + case 0x40: case 0x41: case 0x42: case 0x43: + case 0x44: case 0x45: case 0x46: case 0x47: + case 0x48: case 0x49: case 0x4a: case 0x4b: + case 0x4c: case 0x4d: case 0x4e: case 0x4f: + case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: case 0x56: case 0x57: + case 0x58: case 0x59: case 0x5a: case 0x5b: + case 0x5c: case 0x5d: case 0x5e: case 0x5f: + kbd_log("ATkbc: AMI - alias write to %08X\n", dev->command); + dev->mem[dev->command & 0x1f] = val; + if (dev->command == 0x60) write_cmd(dev, val); - else - dev->mem[(dev->kbc_cmd & 0x1f) + 0x20] = val; return 0; case 0xaf: /* set extended controller RAM */ - kbd_log("ATkbc: AMI - set extended controller RAM, input phase %i\n", dev->secr_phase); - if (dev->secr_phase == 0) { - dev->mem_index = val; - dev->kbc_in = 1; - dev->secr_phase++; - } else if (dev->secr_phase == 1) { - if (dev->mem_index == 0x20) - write_cmd(dev, val); - else - dev->mem[dev->mem_index] = val; + kbd_log("ATkbc: AMI - set extended controller RAM\n"); + if (dev->secr_phase == 1) { + dev->mem_addr = val; + dev->want60 = 1; + dev->secr_phase = 2; + } else if (dev->secr_phase == 2) { + dev->mem[dev->mem_addr] = val; dev->secr_phase = 0; } return 0; - case 0xb8: - kbd_log("ATkbc: AMI MegaKey - memory index %02X\n", val); - dev->mem_index = val; - return 0; - - case 0xbb: - kbd_log("ATkbc: AMI MegaKey - write %02X to memory index %02X\n", val, dev->mem_index); - if (dev->mem_index >= 0x80) { - switch (dev->mem[0x9b] & 0xc0) { - case 0x00: - index = 0x0080; - break; - case 0x40: case 0x80: - index = 0x0000; - break; - case 0xc0: - index = 0x0100; - break; - } - dev->mem[index + dev->mem_index] = val; - } else if (dev->mem_index == 0x60) - write_cmd(dev, val); - else if (dev->mem_index == 0x42) - dev->status = val; - else if (dev->mem_index >= 0x40) - dev->mem[dev->mem_index - 0x40] = val; - else - dev->mem_int[dev->mem_index] = val; - return 0; - - case 0xbd: - kbd_log("ATkbc: AMI MegaKey - write %02X to config index %02X\n", val, dev->mem_index); - switch (dev->mem_index) { - case 0x00: /* STAT8042 */ - dev->status = val; - break; - case 0x01: /* Password_ptr */ - dev->mem[0x1c] = val; - break; - case 0x02: /* Wakeup_Tsk_Reg */ - dev->mem[0x1e] = val; - break; - case 0x03: /* CCB */ - write_cmd(dev, val); - break; - case 0x04: /* Debounce_time */ - dev->mem[0x4d] = val; - break; - case 0x05: /* Pulse_Width */ - dev->mem[0x4e] = val; - break; - case 0x06: /* Pk_sel_byte */ - dev->mem[0x4c] = val; - break; - case 0x07: /* Func_Tsk_Reg */ - dev->mem[0x7e] = val; - break; - case 0x08: /* TypematicRate */ - dev->mem[0x80] = val; - break; - case 0x09: /* Led_Flag_Byte */ - dev->mem[0x81] = val; - break; - case 0x0a: /* Kbms_Command_St */ - dev->mem[0x87] = val; - break; - case 0x0b: /* Delay_Count_Byte */ - dev->mem[0x86] = val; - break; - case 0x0c: /* KBC_Flags */ - dev->mem[0x9b] = val; - break; - case 0x0d: /* SCODE_HK1 */ - dev->mem[0x50] = val; - break; - case 0x0e: /* SCODE_HK2 */ - dev->mem[0x51] = val; - break; - case 0x0f: /* SCODE_HK3 */ - dev->mem[0x52] = val; - break; - case 0x10: /* SCODE_HK4 */ - dev->mem[0x53] = val; - break; - case 0x11: /* SCODE_HK5 */ - dev->mem[0x54] = val; - break; - case 0x12: /* SCODE_HK6 */ - dev->mem[0x55] = val; - break; - case 0x13: /* TASK_HK1 */ - dev->mem[0x56] = val; - break; - case 0x14: /* TASK_HK2 */ - dev->mem[0x57] = val; - break; - case 0x15: /* TASK_HK3 */ - dev->mem[0x58] = val; - break; - case 0x16: /* TASK_HK4 */ - dev->mem[0x59] = val; - break; - case 0x17: /* TASK_HK5 */ - dev->mem[0x5a] = val; - break; - /* The next 4 bytes have uncertain correspondences. */ - case 0x18: /* Batt_Poll_delay_Time */ - dev->mem[0x5b] = val; - break; - case 0x19: /* Batt_Alarm_Reg1 */ - dev->mem[0x5c] = val; - break; - case 0x1a: /* Batt_Alarm_Reg2 */ - dev->mem[0x5d] = val; - break; - case 0x1b: /* Batt_Alarm_Tsk_Reg */ - dev->mem[0x5e] = val; - break; - case 0x1c: /* Kbc_State1 */ - dev->mem[0x9d] = val; - break; - case 0x1d: /* Aux_Config */ - dev->mem[0x75] = val; - break; - case 0x1e: /* Kbc_State3 */ - dev->mem[0x73] = val; - break; - } - return 0; - - case 0xc1: /* write input port */ - kbd_log("ATkbc: AMI MegaKey - write %02X to input port\n", val); - dev->p1 = val; - return 0; - case 0xcb: /* set keyboard mode */ kbd_log("ATkbc: AMI - set keyboard mode\n"); + dev->ami_flags = val; return 0; } @@ -2308,50 +1333,62 @@ static uint8_t write64_ami(void *priv, uint8_t val) { atkbd_t *dev = (atkbd_t *)priv; - uint16_t index = 0x00c0; switch (val) { - case 0x00 ... 0x1f: + case 0x00: case 0x01: case 0x02: case 0x03: + case 0x04: case 0x05: case 0x06: case 0x07: + case 0x08: case 0x09: case 0x0a: case 0x0b: + case 0x0c: case 0x0d: case 0x0e: case 0x0f: + case 0x10: case 0x11: case 0x12: case 0x13: + case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: + case 0x1c: case 0x1d: case 0x1e: case 0x1f: kbd_log("ATkbc: AMI - alias read from %08X\n", val); - kbc_transmit(dev, dev->mem[val + 0x20]); + add_data(dev, dev->mem[val]); return 0; - case 0x40 ... 0x5f: - kbd_log("ATkbc: AMI - alias write to %08X\n", dev->kbc_cmd); - dev->kbc_in = 1; + case 0x40: case 0x41: case 0x42: case 0x43: + case 0x44: case 0x45: case 0x46: case 0x47: + case 0x48: case 0x49: case 0x4a: case 0x4b: + case 0x4c: case 0x4d: case 0x4e: case 0x4f: + case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: case 0x56: case 0x57: + case 0x58: case 0x59: case 0x5a: case 0x5b: + case 0x5c: case 0x5d: case 0x5e: case 0x5f: + kbd_log("ATkbc: AMI - alias write to %08X\n", dev->command); + dev->want60 = 1; return 0; case 0xa0: /* copyright message */ - kbc_transmit(dev, ami_copr[0]); - dev->kbc_phase = 1; - return 0; + add_data(dev, 0x28); + add_data(dev, 0x00); + break; case 0xa1: /* get controller version */ kbd_log("ATkbc: AMI - get controller version\n"); - kbc_transmit(dev, 'H'); - // kbc_transmit(dev, 'Z'); + add_data(dev, 'H'); return 0; case 0xa2: /* clear keyboard controller lines P22/P23 */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - clear KBC lines P22 and P23\n"); - write_output(dev, dev->p2 & 0xf3); - kbc_transmit(dev, 0x00); + write_output(dev, dev->output_port & 0xf3); + add_data(dev, 0x00); return 0; } break; case 0xa3: /* set keyboard controller lines P22/P23 */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - set KBC lines P22 and P23\n"); - write_output(dev, dev->p2 | 0x0c); - kbc_transmit(dev, 0x00); + write_output(dev, dev->output_port | 0x0c); + add_data(dev, 0x00); return 0; } break; case 0xa4: /* write clock = low */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - write clock = low\n"); dev->ami_stat &= 0xfe; return 0; @@ -2359,7 +1396,7 @@ write64_ami(void *priv, uint8_t val) break; case 0xa5: /* write clock = high */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - write clock = high\n"); dev->ami_stat |= 0x01; return 0; @@ -2367,15 +1404,15 @@ write64_ami(void *priv, uint8_t val) break; case 0xa6: /* read clock */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - read clock\n"); - kbc_transmit(dev, !!(dev->ami_stat & 1)); + add_data(dev, !!(dev->ami_stat & 1)); return 0; } break; case 0xa7: /* write cache bad */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - write cache bad\n"); dev->ami_stat &= 0xfd; return 0; @@ -2383,7 +1420,7 @@ write64_ami(void *priv, uint8_t val) break; case 0xa8: /* write cache good */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - write cache good\n"); dev->ami_stat |= 0x02; return 0; @@ -2391,237 +1428,68 @@ write64_ami(void *priv, uint8_t val) break; case 0xa9: /* read cache */ - if (!(dev->flags & KBC_FLAG_PS2)) { + if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { kbd_log("ATkbc: AMI - read cache\n"); - kbc_transmit(dev, !!(dev->ami_stat & 2)); + add_data(dev, !!(dev->ami_stat & 2)); return 0; } break; case 0xaf: /* set extended controller RAM */ kbd_log("ATkbc: set extended controller RAM\n"); - dev->kbc_in = 1; + dev->want60 = 1; + dev->secr_phase = 1; return 0; - case 0xb0 ... 0xb3: + case 0xb0: case 0xb1: case 0xb2: case 0xb3: /* set KBC lines P10-P13 (input port bits 0-3) low */ kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) low\n"); - if (!(dev->flags & KBC_FLAG_PS2) || (val > 0xb1)) { - dev->p1 &= ~(1 << (val & 0x03)); - } - kbc_transmit(dev, 0x00); + if (!PCI || (val > 0xb1)) + dev->input_port &= ~(1 << (val & 0x03)); + add_data(dev, 0x00); return 0; case 0xb4: case 0xb5: /* set KBC lines P22-P23 (output port bits 2-3) low */ kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) low\n"); - if (!(dev->flags & KBC_FLAG_PS2)) - write_output(dev, dev->p2 & ~(4 << (val & 0x01))); - kbc_transmit(dev, 0x00); + if (! PCI) + write_output(dev, dev->output_port & ~(4 << (val & 0x01))); + add_data(dev, 0x00); return 0; -#if 0 - case 0xb8 ... 0xbb: -#else - case 0xb9: -#endif + case 0xb8: case 0xb9: case 0xba: case 0xbb: /* set KBC lines P10-P13 (input port bits 0-3) high */ kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) high\n"); - if (!(dev->flags & KBC_FLAG_PS2) || (val > 0xb9)) { - dev->p1 |= (1 << (val & 0x03)); - kbc_transmit(dev, 0x00); + if (!PCI || (val > 0xb9)) { + dev->input_port |= (1 << (val & 0x03)); + add_data(dev, 0x00); } return 0; - case 0xb8: - kbd_log("ATkbc: AMI MegaKey - memory index\n"); - dev->kbc_in = 1; - return 0; - - case 0xba: - kbd_log("ATkbc: AMI MegaKey - read %02X memory from index %02X\n", dev->mem[dev->mem_index], dev->mem_index); - if (dev->mem_index >= 0x80) { - switch (dev->mem[0x9b] & 0xc0) { - case 0x00: - index = 0x0080; - break; - case 0x40: case 0x80: - index = 0x0000; - break; - case 0xc0: - index = 0x0100; - break; - } - kbc_transmit(dev, dev->mem[index + dev->mem_index]); - } else if (dev->mem_index == 0x42) - kbc_transmit(dev, dev->status); - else if (dev->mem_index >= 0x40) - kbc_transmit(dev, dev->mem[dev->mem_index - 0x40]); - else - kbc_transmit(dev, dev->mem_int[dev->mem_index]); - return 0; - - case 0xbb: - kbd_log("ATkbc: AMI MegaKey - write to memory index %02X\n", dev->mem_index); - dev->kbc_in = 1; - return 0; - -#if 0 case 0xbc: case 0xbd: /* set KBC lines P22-P23 (output port bits 2-3) high */ kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) high\n"); - if (!(dev->flags & KBC_FLAG_PS2)) - write_output(dev, dev->p2 | (4 << (val & 0x01))); - kbc_transmit(dev, 0x00); - return 0; -#endif - - case 0xbc: - switch (dev->mem_index) { - case 0x00: /* STAT8042 */ - kbc_transmit(dev, dev->status); - break; - case 0x01: /* Password_ptr */ - kbc_transmit(dev, dev->mem[0x1c]); - break; - case 0x02: /* Wakeup_Tsk_Reg */ - kbc_transmit(dev, dev->mem[0x1e]); - break; - case 0x03: /* CCB */ - kbc_transmit(dev, dev->mem[0x20]); - break; - case 0x04: /* Debounce_time */ - kbc_transmit(dev, dev->mem[0x4d]); - break; - case 0x05: /* Pulse_Width */ - kbc_transmit(dev, dev->mem[0x4e]); - break; - case 0x06: /* Pk_sel_byte */ - kbc_transmit(dev, dev->mem[0x4c]); - break; - case 0x07: /* Func_Tsk_Reg */ - kbc_transmit(dev, dev->mem[0x7e]); - break; - case 0x08: /* TypematicRate */ - kbc_transmit(dev, dev->mem[0x80]); - break; - case 0x09: /* Led_Flag_Byte */ - kbc_transmit(dev, dev->mem[0x81]); - break; - case 0x0a: /* Kbms_Command_St */ - kbc_transmit(dev, dev->mem[0x87]); - break; - case 0x0b: /* Delay_Count_Byte */ - kbc_transmit(dev, dev->mem[0x86]); - break; - case 0x0c: /* KBC_Flags */ - kbc_transmit(dev, dev->mem[0x9b]); - break; - case 0x0d: /* SCODE_HK1 */ - kbc_transmit(dev, dev->mem[0x50]); - break; - case 0x0e: /* SCODE_HK2 */ - kbc_transmit(dev, dev->mem[0x51]); - break; - case 0x0f: /* SCODE_HK3 */ - kbc_transmit(dev, dev->mem[0x52]); - break; - case 0x10: /* SCODE_HK4 */ - kbc_transmit(dev, dev->mem[0x53]); - break; - case 0x11: /* SCODE_HK5 */ - kbc_transmit(dev, dev->mem[0x54]); - break; - case 0x12: /* SCODE_HK6 */ - kbc_transmit(dev, dev->mem[0x55]); - break; - case 0x13: /* TASK_HK1 */ - kbc_transmit(dev, dev->mem[0x56]); - break; - case 0x14: /* TASK_HK2 */ - kbc_transmit(dev, dev->mem[0x57]); - break; - case 0x15: /* TASK_HK3 */ - kbc_transmit(dev, dev->mem[0x58]); - break; - case 0x16: /* TASK_HK4 */ - kbc_transmit(dev, dev->mem[0x59]); - break; - case 0x17: /* TASK_HK5 */ - kbc_transmit(dev, dev->mem[0x5a]); - break; - /* The next 4 bytes have uncertain correspondences. */ - case 0x18: /* Batt_Poll_delay_Time */ - kbc_transmit(dev, dev->mem[0x5b]); - break; - case 0x19: /* Batt_Alarm_Reg1 */ - kbc_transmit(dev, dev->mem[0x5c]); - break; - case 0x1a: /* Batt_Alarm_Reg2 */ - kbc_transmit(dev, dev->mem[0x5d]); - break; - case 0x1b: /* Batt_Alarm_Tsk_Reg */ - kbc_transmit(dev, dev->mem[0x5e]); - break; - case 0x1c: /* Kbc_State1 */ - kbc_transmit(dev, dev->mem[0x9d]); - break; - case 0x1d: /* Aux_Config */ - kbc_transmit(dev, dev->mem[0x75]); - break; - case 0x1e: /* Kbc_State3 */ - kbc_transmit(dev, dev->mem[0x73]); - break; - default: - kbc_transmit(dev, 0x00); - break; - } - kbd_log("ATkbc: AMI MegaKey - read from config index %02X\n", dev->mem_index); + if (! PCI) + write_output(dev, dev->output_port | (4 << (val & 0x01))); + add_data(dev, 0x00); return 0; - case 0xbd: - kbd_log("ATkbc: AMI MegaKey - write to config index %02X\n", dev->mem_index); - dev->kbc_in = 1; - return 0; - - case 0xc1: /* write input port */ - kbd_log("ATkbc: AMI MegaKey - write input port\n"); - dev->kbc_in = 1; - return 0; - - case 0xc4: - /* set KBC line P14 low */ - kbd_log("ATkbc: set KBC line P14 (input port bit 4) low\n"); - dev->p1 &= 0xef; - kbc_transmit(dev, 0x00); - return 0; - case 0xc5: - /* set KBC line P15 low */ - kbd_log("ATkbc: set KBC line P15 (input port bit 5) low\n"); - dev->p1 &= 0xdf; - kbc_transmit(dev, 0x00); - return 0; - - case 0xc8: case 0xc9: + case 0xc8: /* - * (un)block KBC lines P22/P23 + * unblock KBC lines P22/P23 * (allow command D1 to change bits 2/3 of the output port) */ - kbd_log("ATkbc: AMI - %sblock KBC lines P22 and P23\n", (val & 1) ? "" : "un"); - dev->p2_locked = (val & 1); + kbd_log("ATkbc: AMI - unblock KBC lines P22 and P23\n"); + dev->output_locked = 1; return 0; - case 0xcc: - /* set KBC line P14 high */ - kbd_log("ATkbc: set KBC line P14 (input port bit 4) high\n"); - dev->p1 |= 0x10; - kbc_transmit(dev, 0x00); - return 0; - case 0xcd: - /* set KBC line P15 high */ - kbd_log("ATkbc: set KBC line P15 (input port bit 5) high\n"); - dev->p1 |= 0x20; - kbc_transmit(dev, 0x00); + case 0xc9: + /* + * block KBC lines P22/P23 + * (disallow command D1 from changing bits 2/3 of the port) + */ + kbd_log("ATkbc: AMI - block KBC lines P22 and P23\n"); + dev->output_locked = 1; return 0; case 0xef: /* ??? - sent by AMI486 */ @@ -2642,20 +1510,23 @@ write64_ibm_mca(void *priv, uint8_t val) case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/ kbd_log("ATkbc: copy bits 0 to 3 of input port to status bits 4 to 7\n"); dev->status &= 0x0f; - dev->status |= ((((dev->p1 & 0xfc) | 0x84) & 0x0f) << 4); + dev->status |= ((((dev->input_port & 0xfc) | 0x84) & 0x0f) << 4); return 0; case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/ kbd_log("ATkbc: copy bits 4 to 7 of input port to status bits 4 to 7\n"); dev->status &= 0x0f; - dev->status |= (((dev->p1 & 0xfc) | 0x84) & 0xf0); + dev->status |= (((dev->input_port & 0xfc) | 0x84) & 0xf0); return 0; case 0xaf: kbd_log("ATkbc: bad KBC command AF\n"); return 1; - case 0xf0 ... 0xff: + case 0xf0: case 0xf1: case 0xf2: case 0xf3: + case 0xf4: case 0xf5: case 0xf6: case 0xf7: + case 0xf8: case 0xf9: case 0xfa: case 0xfb: + case 0xfc: case 0xfd: case 0xfe: case 0xff: kbd_log("ATkbc: pulse: %01X\n", (val & 0x03) | 0x0c); pulse_output(dev, (val & 0x03) | 0x0c); return 0; @@ -2670,7 +1541,7 @@ write60_quadtel(void *priv, uint8_t val) { atkbd_t *dev = (atkbd_t *)priv; - switch(dev->kbc_cmd) { + switch(dev->command) { case 0xcf: /*??? - sent by MegaPC BIOS*/ kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); return 0; @@ -2679,34 +1550,12 @@ write60_quadtel(void *priv, uint8_t val) return 1; } - static uint8_t write64_olivetti(void *priv, uint8_t val) { atkbd_t *dev = (atkbd_t *)priv; switch (val) { - /* This appears to be a clone of "Read input port", in which case, the bis would be: - 7: M290 (AT KBC): - Keyboard lock (1 = unlocked, 0 = locked); - M300 (PS/2 KBC): - Bus expansion board present (1 = present, 0 = not present); - 6: Usually: - Display (1 = MDA, 0 = CGA, but can have its polarity inverted); - 5: Manufacturing jumper (1 = not installed, 0 = installed (infinite loop)); - 4: RAM on motherboard (1 = 256 kB, 0 = 512 kB - which machine actually uses this?); - 3: Fast Ram check (if inactive keyboard works erratically); - 2: Keyboard fuse present - This appears to be in-line with PS/2: 1 = no power, 0 = keyboard power normal; - 1: M290 (AT KBC): - Unused; - M300 (PS/2 KBC): - Mouse data in; - 0: M290 (AT KBC): - Unused; - M300 (PS/2 KBC): - Key data in. - */ case 0x80: /* Olivetti-specific command */ /* * bit 7: bus expansion board present (M300) / keyboard unlocked (M290) @@ -2715,9 +1564,11 @@ write64_olivetti(void *priv, uint8_t val) * bit 2: keyboard fuse present * bits 0-1: ??? */ - kbc_transmit(dev, 0x0c | (is386 ? 0x00 : 0x80)); + add_to_kbc_queue_front(dev, (0x0c | ((is386) ? 0x00 : 0x80)) & 0xdf, 0, 0x00); + dev->input_port = ((dev->input_port + 1) & 3) | + (dev->input_port & 0xfc); return 0; - } + } return write64_generic(dev, val); } @@ -2735,7 +1586,7 @@ write64_quadtel(void *priv, uint8_t val) case 0xcf: /*??? - sent by MegaPC BIOS*/ kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); - dev->kbc_in = 1; + dev->want60 = 1; return 0; } @@ -2748,7 +1599,7 @@ write60_toshiba(void *priv, uint8_t val) { atkbd_t *dev = (atkbd_t *)priv; - switch(dev->kbc_cmd) { + switch(dev->command) { case 0xb6: /* T3100e - set color/mono switch */ kbd_log("ATkbc: T3100e - set color/mono switch\n"); t3100e_mono_set(val); @@ -2791,30 +1642,29 @@ write64_toshiba(void *priv, uint8_t val) case 0xb4: /* T3100e: Get configuration / status */ kbd_log("ATkbc: T3100e: Get configuration / status\n"); - kbc_transmit(dev, t3100e_config_get()); + add_data(dev, t3100e_config_get()); return 0; case 0xb5: /* T3100e: Get colour / mono byte */ kbd_log("ATkbc: T3100e: Get colour / mono byte\n"); - kbc_transmit(dev, t3100e_mono_get()); + add_data(dev, t3100e_mono_get()); return 0; case 0xb6: /* T3100e: Set colour / mono byte */ kbd_log("ATkbc: T3100e: Set colour / mono byte\n"); - dev->kbc_in = 1; + dev->want60 = 1; return 0; case 0xb7: /* T3100e: Emulate PS/2 keyboard */ case 0xb8: /* T3100e: Emulate AT keyboard */ - dev->flags &= ~KBC_FLAG_PS2; + dev->flags &= ~KBC_TYPE_MASK; if (val == 0xb7) { kbd_log("ATkbc: T3100e: Emulate PS/2 keyboard\n"); - dev->flags |= KBC_FLAG_PS2; - } -#ifdef ENABLE_KEYBOARD_AT_LOG - else + dev->flags |= KBC_TYPE_PS2_NOREF; + } else { kbd_log("ATkbc: T3100e: Emulate AT keyboard\n"); -#endif + dev->flags |= KBC_TYPE_ISA; + } return 0; case 0xbb: /* T3100e: Read 'Fn' key. @@ -2824,9 +1674,8 @@ write64_toshiba(void *priv, uint8_t val) kbd_log("ATkbc: T3100e: Read 'Fn' key\n"); if (keyboard_recv(0xb8) || /* Right Alt */ keyboard_recv(0x9d)) /* Right Ctrl */ - kbc_transmit(dev, 0x04); - else - kbc_transmit(dev, 0x00); + add_data(dev, 0x04); + else add_data(dev, 0x00); return 0; case 0xbc: /* T3100e: Reset Fn+Key notification */ @@ -2839,8 +1688,8 @@ write64_toshiba(void *priv, uint8_t val) /* The T3100e returns all bits set except bit 6 which * is set by t3100e_mono_set() */ - dev->p1 = (t3100e_mono_get() & 1) ? 0xff : 0xbf; - kbc_transmit(dev, dev->p1); + dev->input_port = (t3100e_mono_get() & 1) ? 0xff : 0xbf; + add_data(dev, dev->input_port); return 0; } @@ -2853,52 +1702,423 @@ static void kbd_write(uint16_t port, uint8_t val, void *priv) { atkbd_t *dev = (atkbd_t *)priv; + int i = 0, bad = 1; + uint8_t mask, kbc_ven = 0x0; + kbc_ven = dev->flags & KBC_VEN_MASK; - kbd_log("[%04X:%08X] ATkbc: write(%04X, %02X)\n", CS, cpu_state.pc, port, val); + if ((kbc_ven == KBC_VEN_XI8088) && (port == 0x63)) + port = 0x61; + + kbd_log((port == 0x61) ? "" : "ATkbc: write(%04X, %02X)\n", port, val); switch (port) { case 0x60: - dev->status = (dev->status & ~STAT_CD) | STAT_IFULL; - dev->ib = val; - // kbd_status("Write %02X: %02X, Status = %02X\n", port, val, dev->status); + dev->status &= ~STAT_CD; + if (dev->want60) { + /* Write data to controller. */ + dev->want60 = 0; -#if 0 - if ((dev->fast_a20_phase == 1)/* && ((val == 0xdd) || (val == 0xdf))*/) { - dev->status &= ~STAT_IFULL; - write_output(dev, val); - dev->fast_a20_phase = 0; + switch (dev->command) { + case 0x60: case 0x61: case 0x62: case 0x63: + case 0x64: case 0x65: case 0x66: case 0x67: + case 0x68: case 0x69: case 0x6a: case 0x6b: + case 0x6c: case 0x6d: case 0x6e: case 0x6f: + case 0x70: case 0x71: case 0x72: case 0x73: + case 0x74: case 0x75: case 0x76: case 0x77: + case 0x78: case 0x79: case 0x7a: case 0x7b: + case 0x7c: case 0x7d: case 0x7e: case 0x7f: + dev->mem[dev->command & 0x1f] = val; + if (dev->command == 0x60) + write_cmd(dev, val); + break; + + case 0xd1: /* write output port */ + kbd_log("ATkbc: write output port\n"); + if (dev->output_locked) { + /*If keyboard controller lines P22-P23 are blocked, + we force them to remain unchanged.*/ + val &= ~0x0c; + val |= (dev->output_port & 0x0c); + } + write_output(dev, val); + break; + + case 0xd2: /* write to keyboard output buffer */ + kbd_log("ATkbc: write to keyboard output buffer\n"); + add_to_kbc_queue_front(dev, val, 0, 0x00); + break; + + case 0xd3: /* write to mouse output buffer */ + kbd_log("ATkbc: write to mouse output buffer\n"); + if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) + keyboard_at_adddata_mouse(val); + break; + + case 0xd4: /* write to mouse */ + kbd_log("ATkbc: write to mouse (%02X)\n", val); + + if (val == 0xbb) + break; + + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + set_enable_mouse(dev, 1); + if (mouse_write) + mouse_write(val, mouse_p); + else + add_to_kbc_queue_front(dev, 0xfe, 2, 0x40); + } + break; + + default: + /* + * Run the vendor-specific handler + * if we have one. Otherwise, or if + * it returns an error, log a bad + * controller command. + */ + if (dev->write60_ven) + bad = dev->write60_ven(dev, val); + + if (bad) { + kbd_log("ATkbc: bad controller command %02x data %02x\n", dev->command, val); + add_data_kbd(0xfe); + } + } + } else { + /* Write data to keyboard. */ + dev->mem[0] &= ~0x10; + + if (dev->key_wantdata) { + dev->key_wantdata = 0; + + /* + * Several system BIOSes and OS device drivers + * mess up with this, and repeat the command + * code many times. Fun! + */ + if (val == dev->key_command) { + /* Respond NAK and ignore it. */ + add_data_kbd(0xfe); + dev->key_command = 0x00; + break; + } + + switch (dev->key_command) { + case 0xed: /* set/reset LEDs */ + add_data_kbd_direct(dev, 0xfa); + kbd_log("ATkbd: set LEDs [%02x]\n", val); + break; + + case 0xf0: /* get/set scancode set */ + add_data_kbd_direct(dev, 0xfa); + if (val == 0) { + kbd_log("Get scan code set: %02X\n", keyboard_mode & 3); + add_data_kbd_direct(dev, keyboard_mode & 3); + } else { + if ((val <= 3) && (val != 1)) { + keyboard_mode &= 0xfc; + keyboard_mode |= (val & 3); + kbd_log("Scan code set now: %02X\n", val); + } + set_scancode_map(dev); + } + break; + + case 0xf3: /* set typematic rate/delay */ + add_data_kbd_direct(dev, 0xfa); + break; + + default: + kbd_log("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, dev->key_command); + add_data_kbd_direct(dev, 0xfe); + break; + } + + /* Keyboard command is now done. */ + dev->key_command = 0x00; + } else { + /* No keyboard command in progress. */ + dev->key_command = 0x00; + + set_enable_kbd(dev, 1); + + switch (val) { + case 0x00: + kbd_log("ATkbd: command 00\n"); + add_data_kbd_direct(dev, 0xfa); + break; + + case 0x05: /*??? - sent by NT 4.0*/ + kbd_log("ATkbd: command 05 (NT 4.0)\n"); + add_data_kbd_direct(dev, 0xfe); + break; + + /* Sent by Pentium-era AMI BIOS'es.*/ + case 0x71: case 0x82: + kbd_log("ATkbd: Pentium-era AMI BIOS command %02X\n", val); + break; + + case 0xed: /* set/reset LEDs */ + kbd_log("ATkbd: set/reset leds\n"); + add_data_kbd_direct(dev, 0xfa); + + dev->key_wantdata = 1; + break; + + case 0xee: /* diagnostic echo */ + kbd_log("ATkbd: ECHO\n"); + add_data_kbd_direct(dev, 0xee); + break; + + case 0xef: /* NOP (reserved for future use) */ + kbd_log("ATkbd: NOP\n"); + break; + + case 0xf0: /* get/set scan code set */ + kbd_log("ATkbd: scan code set\n"); + add_data_kbd_direct(dev, 0xfa); + dev->key_wantdata = 1; + break; + + case 0xf2: /* read ID */ + /* Fixed as translation will be done in add_data_kbd(). */ + kbd_log("ATkbd: read keyboard id\n"); + /* TODO: After keyboard type selection is implemented, make this + return the correct keyboard ID for the selected type. */ + add_data_kbd_direct(dev, 0xfa); + add_data_kbd_direct(dev, 0xab); + add_data_kbd_direct(dev, 0x83); + break; + + case 0xf3: /* set typematic rate/delay */ + kbd_log("ATkbd: set typematic rate/delay\n"); + add_data_kbd_direct(dev, 0xfa); + dev->key_wantdata = 1; + break; + + case 0xf4: /* enable keyboard */ + kbd_log("ATkbd: enable keyboard\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_scan = 1; + break; + + case 0xf5: /* set defaults and disable keyboard */ + case 0xf6: /* set defaults */ + kbd_log("ATkbd: set defaults%s\n", (val == 0xf6) ? "" : " and disable keyboard"); + keyboard_scan = (val == 0xf6); + kbd_log("val = %02X, keyboard_scan = %i, dev->mem[0] = %02X\n", + val, keyboard_scan, dev->mem[0]); + add_data_kbd_direct(dev, 0xfa); + + keyboard_set3_all_break = 0; + keyboard_set3_all_repeat = 0; + memset(keyboard_set3_flags, 0, 512); + keyboard_mode = (keyboard_mode & 0xfc) | 0x02; + set_scancode_map(dev); + break; + + case 0xf7: /* set all keys to repeat */ + kbd_log("ATkbd: set all keys to repeat\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_break = 1; + break; + + case 0xf8: /* set all keys to give make/break codes */ + kbd_log("ATkbd: set all keys to give make/break codes\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_break = 1; + break; + + case 0xf9: /* set all keys to give make codes only */ + kbd_log("ATkbd: set all keys to give make codes only\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_break = 0; + break; + + case 0xfa: /* set all keys to repeat and give make/break codes */ + kbd_log("ATkbd: set all keys to repeat and give make/break codes\n"); + add_data_kbd_direct(dev, 0xfa); + keyboard_set3_all_repeat = 1; + keyboard_set3_all_break = 1; + break; + + case 0xfe: /* resend last scan code */ + kbd_log("ATkbd: reset last scan code\n"); + add_data_kbd_raw(dev, kbd_last_scan_code); + break; + + case 0xff: /* reset */ + kbd_log("ATkbd: kbd reset\n"); + kbc_queue_reset(1); + kbd_last_scan_code = 0x00; + add_data_kbd_direct(dev, 0xfa); + + /* Set scan code set to 2. */ + keyboard_mode = (keyboard_mode & 0xfc) | 0x02; + set_scancode_map(dev); + + dev->reset_delay = RESET_DELAY_TIME; + break; + + default: + kbd_log("ATkbd: bad keyboard command %02X\n", val); + add_data_kbd_direct(dev, 0xfe); + } + + /* If command needs data, remember command. */ + if (dev->key_wantdata == 1) + dev->key_command = val; + } } -#endif break; - case 0x64: - dev->status |= (STAT_CD | STAT_IFULL); - dev->ib = val; - // kbd_status("Write %02X: %02X, Status = %02X\n", port, val, dev->status); -#if 0 - if (val == 0xd1) { - dev->status &= ~STAT_IFULL; - dev->fast_a20_phase = 1; - } else if (val == 0xfe) { - dev->status &= ~STAT_IFULL; - pulse_output(dev, 0x0e); - } else if ((val == 0xad) || (val == 0xae)) { - dev->status &= ~STAT_IFULL; - if (val & 0x01) - dev->mem[0x20] |= 0x10; - else - dev->mem[0x20] &= ~0x10; - } else if (val == 0xa1) { - dev->status &= ~STAT_IFULL; - kbc_send_to_ob(dev, 'H', 0, 0x00); + case 0x61: + ppi.pb = (ppi.pb & 0x10) | (val & 0x0f); + + speaker_update(); + speaker_gated = val & 1; + speaker_enable = val & 2; + if (speaker_enable) + was_speaker_enable = 1; + pit_ctr_set_gate(&pit->counters[2], val & 1); + + if (kbc_ven == KBC_VEN_XI8088) + xi8088_turbo_set(!!(val & 0x04)); + break; + + case 0x64: + /* Controller command. */ + dev->want60 = 0; + dev->status |= STAT_CD; + + switch (val) { + /* Read data from KBC memory. */ + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2a: case 0x2b: + case 0x2c: case 0x2d: case 0x2e: case 0x2f: + case 0x30: case 0x31: case 0x32: case 0x33: + case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3a: case 0x3b: + case 0x3c: case 0x3d: case 0x3e: case 0x3f: + add_data(dev, dev->mem[val & 0x1f]); + break; + + /* Write data to KBC memory. */ + case 0x60: case 0x61: case 0x62: case 0x63: + case 0x64: case 0x65: case 0x66: case 0x67: + case 0x68: case 0x69: case 0x6a: case 0x6b: + case 0x6c: case 0x6d: case 0x6e: case 0x6f: + case 0x70: case 0x71: case 0x72: case 0x73: + case 0x74: case 0x75: case 0x76: case 0x77: + case 0x78: case 0x79: case 0x7a: case 0x7b: + case 0x7c: case 0x7d: case 0x7e: case 0x7f: + dev->want60 = 1; + break; + + case 0xaa: /* self-test */ + kbd_log("ATkbc: self-test\n"); + if ((kbc_ven == KBC_VEN_TOSHIBA) || (kbc_ven == KBC_VEN_SAMSUNG)) + dev->status |= STAT_IFULL; + write_output(dev, ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x4b : 0xcf); + + /* Always reinitialize all queues - the real hardware pulls keyboard and mouse + clocks high, which stops keyboard scanning. */ + kbd_log("ATkbc: self-test reinitialization\n"); + dev->out_new = dev->out_delayed = -1; + for (i = 0; i < 3; i++) + kbc_queue_reset(i); + kbd_last_scan_code = 0x00; + dev->status &= ~STAT_OFULL; + dev->last_irq = dev->old_last_irq = 0; + + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) + write_cmd(dev, 0x30 | STAT_SYSFLAG); + else + write_cmd(dev, 0x10 | STAT_SYSFLAG); + add_data(dev, 0x55); + break; + + case 0xab: /* interface test */ + kbd_log("ATkbc: interface test\n"); + add_data(dev, 0x00); /*no error*/ + break; + + case 0xac: /* diagnostic dump */ + kbd_log("ATkbc: diagnostic dump\n"); + for (i = 0; i < 16; i++) + add_data(dev, dev->mem[i]); + add_data(dev, (dev->input_port & 0xf0) | 0x80); + add_data(dev, dev->output_port); + add_data(dev, dev->status); + break; + + case 0xad: /* disable keyboard */ + kbd_log("ATkbc: disable keyboard\n"); + set_enable_kbd(dev, 0); + break; + + case 0xae: /* enable keyboard */ + kbd_log("ATkbc: enable keyboard\n"); + set_enable_kbd(dev, 1); + break; + + case 0xca: /* read keyboard mode */ + kbd_log("ATkbc: AMI - read keyboard mode\n"); + add_data(dev, dev->ami_flags); + break; + + case 0xcb: /* set keyboard mode */ + kbd_log("ATkbc: AMI - set keyboard mode\n"); + dev->want60 = 1; + break; + + case 0xd0: /* read output port */ + kbd_log("ATkbc: read output port\n"); + mask = 0xff; + if (((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) && (dev->mem[0] & 0x10)) + mask &= 0xbf; + add_to_kbc_queue_front(dev, dev->output_port & mask, 0, 0x00); + break; + + case 0xd1: /* write output port */ + kbd_log("ATkbc: write output port\n"); + dev->want60 = 1; + break; + + case 0xd2: /* write keyboard output buffer */ + kbd_log("ATkbc: write keyboard output buffer\n"); + dev->want60 = 1; + break; + + case 0xdd: /* disable A20 address line */ + case 0xdf: /* enable A20 address line */ + kbd_log("ATkbc: %sable A20\n", (val == 0xdd) ? "dis": "en"); + write_output(dev, (dev->output_port & 0xfd) | (val & 0x02)); + break; + + case 0xe0: /* read test inputs */ + kbd_log("ATkbc: read test inputs\n"); + add_data(dev, 0x00); + break; + + default: + /* + * Unrecognized controller command. + * + * If we have a vendor-specific handler, run + * that. Otherwise, or if that handler fails, + * log a bad command. + */ + if (dev->write64_ven) + bad = dev->write64_ven(dev, val); + + kbd_log(bad ? "ATkbc: bad controller command %02X\n" : "", val); } -#else - /* if (val == 0xa1) { - dev->status &= ~STAT_IFULL; - kbc_send_to_ob(dev, 'H', 0, 0x00); - } */ - // kbc_process(dev); -#endif + + /* If the command needs data, remember the command. */ + if (dev->want60) + dev->command = val; break; } } @@ -2909,20 +2129,83 @@ kbd_read(uint16_t port, void *priv) { atkbd_t *dev = (atkbd_t *)priv; uint8_t ret = 0xff; + uint8_t kbc_ven = 0x0; + kbc_ven = dev->flags & KBC_VEN_MASK; - // if (dev->flags & KBC_FLAG_PS2) - // cycles -= ISA_CYCLES(8); + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) + cycles -= ISA_CYCLES(8); + + if ((kbc_ven == KBC_VEN_XI8088) && (port == 0x63)) + port = 0x61; switch (port) { case 0x60: - ret = dev->ob; + ret = dev->out; dev->status &= ~STAT_OFULL; picintc(dev->last_irq); dev->last_irq = 0; break; + case 0x61: + ret = ppi.pb & ~0xe0; + if (ppispeakon) + ret |= 0x20; + if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) { + if (dev->refresh) + ret |= 0x10; + else + ret &= ~0x10; + } + if (kbc_ven == KBC_VEN_XI8088) { + if (xi8088_turbo_get()) + ret |= 0x04; + else + ret &= ~0x04; + } + break; + + case 0x62: + ret = 0xff; + if (kbc_ven == KBC_VEN_OLIVETTI) { + /* SWA on Olivetti M240 mainboard (off=1) */ + ret = 0x00; + if (ppi.pb & 0x8) { + /* Switches 4, 5 - floppy drives (number) */ + int i, fdd_count = 0; + for (i = 0; i < FDD_NUM; i++) { + if (fdd_get_flags(i)) + fdd_count++; + } + if (!fdd_count) + ret |= 0x00; + else + ret |= ((fdd_count - 1) << 2); + /* Switches 6, 7 - monitor type */ + if (video_is_mda()) + ret |= 0x3; + else if (video_is_cga()) + ret |= 0x2; /* 0x10 would be 40x25 */ + else + ret |= 0x0; + } else { + /* bit 2 always on */ + ret |= 0x4; + /* Switch 8 - 8087 FPU. */ + if (hasfpu) + ret |= 0x02; + } + } + break; case 0x64: - ret = dev->status; + ret = (dev->status & 0xfb); + if (dev->mem[0] & STAT_SYSFLAG) + ret |= STAT_SYSFLAG; + /* Only clear the transmit timeout flag on non-PS/2 controllers, as on + PS/2 controller, it is the keyboard/mouse output source bit. */ + // dev->status &= ~STAT_RTIMEOUT; + if (((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) && + (kbc_ven != KBC_VEN_IBM_MCA)) + dev->status &= ~STAT_TTIMEOUT; break; default: @@ -2930,57 +2213,48 @@ kbd_read(uint16_t port, void *priv) break; } - kbd_log("[%04X:%08X] ATkbc: read(%04X) = %02X\n",CS, cpu_state.pc, port, ret); + kbd_log((port == 0x61) ? "" : "ATkbc: read(%04X) = %02X\n", port, ret); return(ret); } +static void +kbd_refresh(void *priv) +{ + atkbd_t *dev = (atkbd_t *)priv; + + dev->refresh = !dev->refresh; + timer_advance_u64(&dev->refresh_time, PS2_REFRESH_TIME); +} + + static void kbd_reset(void *priv) { atkbd_t *dev = (atkbd_t *)priv; - - if (dev == NULL) - return; - - dev->status &= ~(STAT_IFULL | STAT_OFULL | STAT_CD); - dev->last_irq = 0; - picintc(1 << 1); - picintc(1 << 12); - dev->secr_phase = 0; - dev->kbd_in = 0; - dev->ob = 0xff; - - sc_or = 0; -} - - -static void -kbd_power_on(atkbd_t *dev) -{ int i; uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; - kbd_reset(dev); - + dev->first_write = 1; + // dev->status = STAT_UNLOCKED | STAT_CD; dev->status = STAT_UNLOCKED; - /* Write the value here first, so that we don't hit a pulse reset. */ - dev->p2 = 0xcf; + dev->mem[0] = 0x01; + dev->mem[0] |= CCB_TRANSLATE; + dev->wantirq = 0; write_output(dev, 0xcf); - dev->mem[0x20] = 0x01; - dev->mem[0x20] |= CCB_TRANSLATE; - dev->ami_mode = !!(dev->flags & KBC_FLAG_PS2); + dev->last_irq = dev->old_last_irq = 0; + dev->secr_phase = 0; + dev->key_wantdata = 0; /* Set up the correct Video Type bits. */ - dev->p1 = video_is_mda() ? 0xf0 : 0xb0; if ((kbc_ven == KBC_VEN_XI8088) || (kbc_ven == KBC_VEN_ACER)) - dev->p1 ^= 0x40; - if ((kbc_ven == KBC_VEN_AMI) || (dev->flags & KBC_FLAG_PS2)) - dev->inhibit = ((dev->p1 & 0x80) >> 3); + dev->input_port = video_is_mda() ? 0xb0 : 0xf0; else - dev->inhibit = 0x10; - kbd_log("ATkbc: input port = %02x\n", dev->p1); + dev->input_port = video_is_mda() ? 0xf0 : 0xb0; + kbd_log("ATkbc: input port = %02x\n", dev->input_port); + + keyboard_mode = 0x02 | (dev->mem[0] & CCB_TRANSLATE); /* Enable keyboard, disable mouse. */ set_enable_kbd(dev, 1); @@ -2988,16 +2262,18 @@ kbd_power_on(atkbd_t *dev) set_enable_mouse(dev, 0); mouse_scan = 0; - dev->mem[0x31] = 0xfe; - - keyboard_mode = 0x02 | (dev->mem[0x20] & CCB_TRANSLATE); - - for (i = 1; i <= 2; i++) + dev->out_new = dev->out_delayed = -1; + for (i = 0; i < 3; i++) kbc_queue_reset(i); + kbd_last_scan_code = 0; + + sc_or = 0; memset(keyboard_set3_flags, 0, 512); set_scancode_map(dev); + + dev->ami_flags = ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x01 : 0x00); } @@ -3019,6 +2295,7 @@ kbd_close(void *priv) /* Stop timers. */ timer_disable(&dev->send_delay_timer); + timer_disable(&dev->refresh_time); keyboard_scan = 0; keyboard_send = NULL; @@ -3042,14 +2319,17 @@ kbd_init(const device_t *info) dev->flags = info->local; video_reset(gfxcard); - dev->kbc_poll_phase = KBC_RESET; - kbd_send_to_host(dev, 0xaa); + kbd_reset(dev); - io_sethandler(0x0060, 1, kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); - io_sethandler(0x0064, 1, kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); + io_sethandler(0x0060, 5, + kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); keyboard_send = add_data_kbd; timer_add(&dev->send_delay_timer, kbd_poll, dev, 1); + + if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) + timer_add(&dev->refresh_time, kbd_refresh, dev, 1); + timer_add(&dev->pulse_cb, pulse_poll, dev, 0); dev->write60_ven = NULL; @@ -3065,14 +2345,12 @@ kbd_init(const device_t *info) break; case KBC_VEN_OLIVETTI: - /* The Olivetti controller is a special case - starts directly in the - main loop instead of the reset loop. */ - dev->kbc_poll_phase = KBC_MAIN_LOOP; dev->write64_ven = write64_olivetti; break; case KBC_VEN_AMI: case KBC_VEN_INTEL_AMI: + case KBC_VEN_SAMSUNG: dev->write60_ven = write60_ami; dev->write64_ven = write64_ami; break; @@ -3092,8 +2370,6 @@ kbd_init(const device_t *info) break; } - kbd_power_on(dev); - /* We need this, sadly. */ SavedKbd = dev; @@ -3121,6 +2397,16 @@ const device_t keyboard_at_ami_device = { { NULL }, NULL, NULL, NULL }; +const device_t keyboard_at_samsung_device = { + "PC/AT Keyboard (Samsung)", + 0, + KBC_TYPE_ISA | KBC_VEN_SAMSUNG, + kbd_init, + kbd_close, + kbd_reset, + { NULL }, NULL, NULL, NULL +}; + const device_t keyboard_at_toshiba_device = { "PC/AT Keyboard (Toshiba)", 0, @@ -3152,6 +2438,16 @@ const device_t keyboard_at_ncr_device = { }; const device_t keyboard_ps2_device = { + "PS/2 Keyboard", + 0, + KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, + kbd_init, + kbd_close, + kbd_reset, + { NULL }, NULL, NULL, NULL +}; + +const device_t keyboard_ps2_ps2_device = { "PS/2 Keyboard", 0, KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, @@ -3164,7 +2460,7 @@ const device_t keyboard_ps2_device = { const device_t keyboard_ps2_ps1_device = { "PS/2 Keyboard (IBM PS/1)", 0, - KBC_TYPE_PS2_1 | KBC_VEN_IBM_PS1, + KBC_TYPE_PS2_NOREF | KBC_VEN_IBM_PS1, kbd_init, kbd_close, kbd_reset, @@ -3174,7 +2470,7 @@ const device_t keyboard_ps2_ps1_device = { const device_t keyboard_ps2_ps1_pci_device = { "PS/2 Keyboard (IBM PS/1)", DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_IBM_PS1, + KBC_TYPE_PS2_NOREF | KBC_VEN_IBM_PS1, kbd_init, kbd_close, kbd_reset, @@ -3194,7 +2490,7 @@ const device_t keyboard_ps2_xi8088_device = { const device_t keyboard_ps2_ami_device = { "PS/2 Keyboard (AMI)", 0, - KBC_TYPE_PS2_1 | KBC_VEN_AMI, + KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, kbd_init, kbd_close, kbd_reset, @@ -3204,7 +2500,7 @@ const device_t keyboard_ps2_ami_device = { const device_t keyboard_ps2_olivetti_device = { "PS/2 Keyboard (Olivetti)", 0, - KBC_TYPE_PS2_1 | KBC_VEN_OLIVETTI, + KBC_TYPE_PS2_NOREF | KBC_VEN_OLIVETTI, kbd_init, kbd_close, kbd_reset, @@ -3234,7 +2530,7 @@ const device_t keyboard_ps2_mca_2_device = { const device_t keyboard_ps2_quadtel_device = { "PS/2 Keyboard (Quadtel/MegaPC)", 0, - KBC_TYPE_PS2_1 | KBC_VEN_QUADTEL, + KBC_TYPE_PS2_NOREF | KBC_VEN_QUADTEL, kbd_init, kbd_close, kbd_reset, @@ -3244,7 +2540,7 @@ const device_t keyboard_ps2_quadtel_device = { const device_t keyboard_ps2_pci_device = { "PS/2 Keyboard", DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_GENERIC, + KBC_TYPE_PS2_NOREF | KBC_VEN_GENERIC, kbd_init, kbd_close, kbd_reset, @@ -3254,7 +2550,7 @@ const device_t keyboard_ps2_pci_device = { const device_t keyboard_ps2_ami_pci_device = { "PS/2 Keyboard (AMI)", DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_AMI, + KBC_TYPE_PS2_NOREF | KBC_VEN_AMI, kbd_init, kbd_close, kbd_reset, @@ -3264,7 +2560,7 @@ const device_t keyboard_ps2_ami_pci_device = { const device_t keyboard_ps2_intel_ami_pci_device = { "PS/2 Keyboard (AMI)", DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_INTEL_AMI, + KBC_TYPE_PS2_NOREF | KBC_VEN_INTEL_AMI, kbd_init, kbd_close, kbd_reset, @@ -3274,7 +2570,7 @@ const device_t keyboard_ps2_intel_ami_pci_device = { const device_t keyboard_ps2_acer_pci_device = { "PS/2 Keyboard (Acer 90M002A)", DEVICE_PCI, - KBC_TYPE_PS2_1 | KBC_VEN_ACER, + KBC_TYPE_PS2_NOREF | KBC_VEN_ACER, kbd_init, kbd_close, kbd_reset, @@ -3285,8 +2581,17 @@ const device_t keyboard_ps2_acer_pci_device = { void keyboard_at_set_mouse(void (*func)(uint8_t val, void *priv), void *priv) { - // mouse_write = func; - // mouse_p = priv; + mouse_write = func; + mouse_p = priv; +} + + +void +keyboard_at_adddata_keyboard_raw(uint8_t val) +{ + atkbd_t *dev = SavedKbd; + + add_data_kbd_queue(dev, 0, val); } @@ -3299,30 +2604,10 @@ keyboard_at_adddata_mouse(uint8_t val) } -void -keyboard_at_adddata_mouse_direct(uint8_t val) -{ - // atkbd_t *dev = SavedKbd; - - return; -} - - -void -keyboard_at_adddata_mouse_cmd(uint8_t val) -{ - // atkbd_t *dev = SavedKbd; - - return; -} - - void keyboard_at_mouse_reset(void) { - // atkbd_t *dev = SavedKbd; - - return; + kbc_queue_reset(2); } @@ -3333,22 +2618,13 @@ keyboard_at_mouse_pos(void) } -int -keyboard_at_fixed_channel(void) -{ - // atkbd_t *dev = SavedKbd; - - return 0x000; -} - - void keyboard_at_set_mouse_scan(uint8_t val) { atkbd_t *dev = SavedKbd; uint8_t temp_mouse_scan = val ? 1 : 0; - if (temp_mouse_scan == !(dev->mem[0x20] & 0x20)) + if (temp_mouse_scan == !(dev->mem[0] & 0x20)) return; set_enable_mouse(dev, val ? 1 : 0); @@ -3362,7 +2638,7 @@ keyboard_at_get_mouse_scan(void) { atkbd_t *dev = SavedKbd; - return((dev->mem[0x20] & 0x20) ? 0x00 : 0x10); + return((dev->mem[0] & 0x20) ? 0x00 : 0x10); } @@ -3371,17 +2647,5 @@ keyboard_at_set_a20_key(int state) { atkbd_t *dev = SavedKbd; - write_output(dev, (dev->p2 & 0xfd) | ((!!state) << 1)); -} - - -void -keyboard_at_set_mode(int ps2) -{ - atkbd_t *dev = SavedKbd; - - if (ps2) - dev->flags |= KBC_FLAG_PS2; - else - dev->flags &= ~KBC_FLAG_PS2; + write_output(dev, (dev->output_port & 0xfd) | ((!!state) << 1)); } diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index 649182ca5..a28a085ff 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -93,8 +93,6 @@ ps2_write(uint8_t val, void *priv) mouse_t *dev = (mouse_t *)priv; uint8_t temp; - pclog("ps2_write(%02X)\n", val); - if (dev->flags & FLAG_CTRLDAT) { dev->flags &= ~FLAG_CTRLDAT; @@ -104,16 +102,16 @@ ps2_write(uint8_t val, void *priv) switch (dev->command) { case 0xe8: /* set mouse resolution */ dev->resolution = val; - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); break; case 0xf3: /* set sample rate */ dev->sample_rate = val; - keyboard_at_adddata_mouse_cmd(0xfa); /* Command response */ + keyboard_at_adddata_mouse(0xfa); /* Command response */ break; default: - keyboard_at_adddata_mouse_cmd(0xfc); + keyboard_at_adddata_mouse(0xfc); } } else { dev->command = val; @@ -121,21 +119,21 @@ ps2_write(uint8_t val, void *priv) switch (dev->command) { case 0xe6: /* set scaling to 1:1 */ dev->flags &= ~FLAG_SCALED; - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); break; case 0xe7: /* set scaling to 2:1 */ dev->flags |= FLAG_SCALED; - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); break; case 0xe8: /* set mouse resolution */ dev->flags |= FLAG_CTRLDAT; - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); break; case 0xe9: /* status request */ - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); temp = (dev->flags & 0x30); if (mouse_buttons & 0x01) temp |= 0x01; @@ -143,13 +141,13 @@ ps2_write(uint8_t val, void *priv) temp |= 0x02; if (mouse_buttons & 0x04) temp |= 0x03; - keyboard_at_adddata_mouse_cmd(temp); - keyboard_at_adddata_mouse_cmd(dev->resolution); - keyboard_at_adddata_mouse_cmd(dev->sample_rate); + keyboard_at_adddata_mouse(temp); + keyboard_at_adddata_mouse(dev->resolution); + keyboard_at_adddata_mouse(dev->sample_rate); break; case 0xeb: /* Get mouse data */ - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); temp = 0; if (dev->x < 0) @@ -162,36 +160,36 @@ ps2_write(uint8_t val, void *priv) temp |= 2; if ((mouse_buttons & 4) && (dev->flags & FLAG_INTELLI)) temp |= 4; - keyboard_at_adddata_mouse_cmd(temp); - keyboard_at_adddata_mouse_cmd(dev->x & 0xff); - keyboard_at_adddata_mouse_cmd(dev->y & 0xff); + keyboard_at_adddata_mouse(temp); + keyboard_at_adddata_mouse(dev->x & 0xff); + keyboard_at_adddata_mouse(dev->y & 0xff); if (dev->flags & FLAG_INTMODE) - keyboard_at_adddata_mouse_cmd(dev->z); + keyboard_at_adddata_mouse(dev->z); break; case 0xf2: /* read ID */ - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); if (dev->flags & FLAG_INTMODE) - keyboard_at_adddata_mouse_cmd(0x03); + keyboard_at_adddata_mouse(0x03); else - keyboard_at_adddata_mouse_cmd(0x00); + keyboard_at_adddata_mouse(0x00); break; case 0xf3: /* set command mode */ dev->flags |= FLAG_CTRLDAT; - keyboard_at_adddata_mouse_cmd(0xfa); /* ACK for command byte */ + keyboard_at_adddata_mouse(0xfa); /* ACK for command byte */ break; case 0xf4: /* enable */ dev->flags |= FLAG_ENABLED; mouse_scan = 1; - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); break; case 0xf5: /* disable */ dev->flags &= ~FLAG_ENABLED; mouse_scan = 0; - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); break; case 0xf6: /* set defaults */ @@ -201,15 +199,15 @@ mouse_reset: dev->flags &= 0x88; mouse_scan = 1; keyboard_at_mouse_reset(); - keyboard_at_adddata_mouse_cmd(0xfa); + keyboard_at_adddata_mouse(0xfa); if (dev->command == 0xff) { - keyboard_at_adddata_mouse_cmd(0xaa); - keyboard_at_adddata_mouse_cmd(0x00); + keyboard_at_adddata_mouse(0xaa); + keyboard_at_adddata_mouse(0x00); } break; default: - keyboard_at_adddata_mouse_cmd(0xfe); + keyboard_at_adddata_mouse(0xfe); } } @@ -241,9 +239,6 @@ ps2_poll(int x, int y, int z, int b, void *priv) return(0xff); #endif - if ((keyboard_at_fixed_channel() & 0xf00) == 0x200) - return(0xff); - if (!mouse_scan) return(0xff); From bfb3c0c324bd3fbdf1cdc4c3183e14a679226809 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 13 Nov 2021 23:15:28 +0100 Subject: [PATCH 097/159] Fixed the intendation mess in cpu/x86seg.c, removed port 61h handling from keyboard/keyboard_at.c, and fixed a function with undeclared type in win/win.c. --- src/cpu/x86seg.c | 284 +++++++++++++++++++-------------------- src/device/keyboard_at.c | 100 +------------- src/win/win.c | 1 + 3 files changed, 148 insertions(+), 237 deletions(-) diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index 8f5798ddb..bd1d1b864 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -942,173 +942,173 @@ void loadcscall(uint16_t seg) segdat[2] = (segdat[2] & ~(3 << (5+8))) | (CPL << (5+8)); } else /* On non-conforming segments, set RPL = CPL */ seg = (seg & 0xfffc) | CPL; - CS = seg; - do_seg_load(&cpu_state.seg_cs, segdat); - if ((CPL == 3) && (oldcpl != 3)) - flushmmucache_cr3(); + CS = seg; + do_seg_load(&cpu_state.seg_cs, segdat); + if ((CPL == 3) && (oldcpl != 3)) + flushmmucache_cr3(); #ifdef USE_NEW_DYNAREC - oldcpl = CPL; + oldcpl = CPL; #endif #ifdef ENABLE_X86SEG_LOG - x86seg_log("Complete\n"); + x86seg_log("Complete\n"); #endif - cycles -= timing_call_pm; - } else { - type = segdat[2] & 0x0f00; - x86seg_log("Type %03X\n", type); - switch (type) { - case 0x0400: /* Call gate */ - case 0x0c00: /* 386 Call gate */ - x86seg_log("Callgate %08X\n", cpu_state.pc); - cgate32 = (type & 0x0800); - cgate16 = !cgate32; + cycles -= timing_call_pm; + } else { + type = segdat[2] & 0x0f00; + x86seg_log("Type %03X\n", type); + switch (type) { + case 0x0400: /* Call gate */ + case 0x0c00: /* 386 Call gate */ + x86seg_log("Callgate %08X\n", cpu_state.pc); + cgate32 = (type & 0x0800); + cgate16 = !cgate32; #ifndef USE_NEW_DYNAREC - oldcs = CS; + oldcs = CS; #endif - count = segdat[2] & 0x001f; - if (DPL < CPL) { - x86gpf("loadcscall(): ex DPL < CPL",seg & 0xfffc); - return; - } - if (DPL < (seg & 0x0003)) { - x86gpf("loadcscall(): ex DPL < RPL", seg & 0xfffc); - return; - } - if (!(segdat[2] & 0x8000)) { - x86np("Call gate not present", seg & 0xfffc); - return; - } - seg2 = segdat[1]; + count = segdat[2] & 0x001f; + if (DPL < CPL) { + x86gpf("loadcscall(): ex DPL < CPL",seg & 0xfffc); + return; + } + if (DPL < (seg & 0x0003)) { + x86gpf("loadcscall(): ex DPL < RPL", seg & 0xfffc); + return; + } + if (!(segdat[2] & 0x8000)) { + x86np("Call gate not present", seg & 0xfffc); + return; + } + seg2 = segdat[1]; - x86seg_log("New address : %04X:%08X\n", seg2, newpc); + x86seg_log("New address : %04X:%08X\n", seg2, newpc); - if (!(seg2 & 0xfffc)) { - x86gpf("loadcscall(): ex selector is NULL", 0); - return; - } - addr = seg2 & 0xfff8; - dt = (seg2 & 0x0004) ? &ldt : &gdt; - if ((addr + 7) > dt->limit) { - x86gpf("loadcscall(): ex Selector > DT limit", seg2 & 0xfff8); - return; - } - addr += dt->base; - read_descriptor(addr, segdat, segdat32, 1); - if (cpu_state.abrt) - return; + if (!(seg2 & 0xfffc)) { + x86gpf("loadcscall(): ex selector is NULL", 0); + return; + } + addr = seg2 & 0xfff8; + dt = (seg2 & 0x0004) ? &ldt : &gdt; + if ((addr + 7) > dt->limit) { + x86gpf("loadcscall(): ex Selector > DT limit", seg2 & 0xfff8); + return; + } + addr += dt->base; + read_descriptor(addr, segdat, segdat32, 1); + if (cpu_state.abrt) + return; x86seg_log("Code seg2 call - %04X - %04X %04X %04X\n", seg2, segdat[0], segdat[1], segdat[2]); - if (DPL > CPL) { - x86gpf("loadcscall(): ex DPL > CPL", seg2 & 0xfffc); - return; - } - if (!(segdat[2] & 0x8000)) { - x86seg_log("Call gate CS not present %04X\n", seg2); - x86np("Call gate CS not present", seg2 & 0xfffc); - return; - } + if (DPL > CPL) { + x86gpf("loadcscall(): ex DPL > CPL", seg2 & 0xfffc); + return; + } + if (!(segdat[2] & 0x8000)) { + x86seg_log("Call gate CS not present %04X\n", seg2); + x86np("Call gate CS not present", seg2 & 0xfffc); + return; + } - switch (segdat[2] & 0x1f00) { - case 0x1800: case 0x1900: case 0x1a00: case 0x1b00: /* Non-conforming code */ - if (DPL < CPL) { + switch (segdat[2] & 0x1f00) { + case 0x1800: case 0x1900: case 0x1a00: case 0x1b00: /* Non-conforming code */ + if (DPL < CPL) { #ifdef USE_NEW_DYNAREC - uint16_t oldcs = CS; + uint16_t oldcs = CS; #endif - oaddr = addr; - /* Load new stack */ - oldss = SS; - oldsp = oldsp2 = ESP; - cpl_override = 1; - if (tr.access & 8) { - addr = 4 + tr.base + (DPL << 3); - newss = readmemw(0, addr + 4); - if (cpu_16bitbus) { - newsp = readmemw(0, addr); - newsp |= (readmemw(0, addr + 2) << 16); - } else - newsp = readmeml(0, addr); - } else { - addr = 2 + tr.base + (DPL * 4); - newss = readmemw(0, addr + 2); + oaddr = addr; + /* Load new stack */ + oldss = SS; + oldsp = oldsp2 = ESP; + cpl_override = 1; + if (tr.access & 8) { + addr = 4 + tr.base + (DPL << 3); + newss = readmemw(0, addr + 4); + if (cpu_16bitbus) { newsp = readmemw(0, addr); - } - cpl_override = 0; - if (cpu_state.abrt) - return; - x86seg_log("New stack %04X:%08X\n", newss, newsp); - if (!(newss & 0xfffc)) { - x86ts(NULL, newss & 0xfffc); - return; - } - addr = newss & 0xfff8; - dt = (newss & 0x0004) ? &ldt : &gdt; - if ((addr + 7) > dt->limit) { - fatal("Bigger than DT limit %04X %08X %04X CSC SS\n", newss, addr, dt->limit); - x86ts(NULL, newss & ~3); - return; - } - addr += dt->base; - x86seg_log("Read stack seg\n"); - read_descriptor(addr, segdat2, segdat232, 1); - if (cpu_state.abrt) - return; - x86seg_log("Read stack seg done!\n"); - if (((newss & 0x0003) != DPL) || (DPL2 != DPL)) { - x86ts(NULL, newss & 0xfffc); - return; - } - if ((segdat2[2] & 0x1a00) != 0x1200) { - x86ts("Call gate loading SS unknown type", newss & 0xfffc); - return; - } - if (!(segdat2[2] & 0x8000)) { - x86ss("Call gate loading SS not present", newss & 0xfffc); - return; - } - if (!stack32) - oldsp &= 0xffff; - SS = newss; - set_stack32((segdat2[3] & 0x0040) ? 1 : 0); - if (stack32) - ESP = newsp; - else - SP = newsp; + newsp |= (readmemw(0, addr + 2) << 16); + } else + newsp = readmeml(0, addr); + } else { + addr = 2 + tr.base + (DPL * 4); + newss = readmemw(0, addr + 2); + newsp = readmemw(0, addr); + } + cpl_override = 0; + if (cpu_state.abrt) + return; + x86seg_log("New stack %04X:%08X\n", newss, newsp); + if (!(newss & 0xfffc)) { + x86ts(NULL, newss & 0xfffc); + return; + } + addr = newss & 0xfff8; + dt = (newss & 0x0004) ? &ldt : &gdt; + if ((addr + 7) > dt->limit) { + fatal("Bigger than DT limit %04X %08X %04X CSC SS\n", newss, addr, dt->limit); + x86ts(NULL, newss & ~3); + return; + } + addr += dt->base; + x86seg_log("Read stack seg\n"); + read_descriptor(addr, segdat2, segdat232, 1); + if (cpu_state.abrt) + return; + x86seg_log("Read stack seg done!\n"); + if (((newss & 0x0003) != DPL) || (DPL2 != DPL)) { + x86ts(NULL, newss & 0xfffc); + return; + } + if ((segdat2[2] & 0x1a00) != 0x1200) { + x86ts("Call gate loading SS unknown type", newss & 0xfffc); + return; + } + if (!(segdat2[2] & 0x8000)) { + x86ss("Call gate loading SS not present", newss & 0xfffc); + return; + } + if (!stack32) + oldsp &= 0xffff; + SS = newss; + set_stack32((segdat2[3] & 0x0040) ? 1 : 0); + if (stack32) + ESP = newsp; + else + SP = newsp; - do_seg_load(&cpu_state.seg_ss, segdat2); + do_seg_load(&cpu_state.seg_ss, segdat2); - x86seg_log("Set access 1\n"); - cpl_override = 1; - writememw(0, addr + 4, segdat2[2] | 0x100); /* Set accessed bit */ - cpl_override = 0; + x86seg_log("Set access 1\n"); + cpl_override = 1; + writememw(0, addr + 4, segdat2[2] | 0x100); /* Set accessed bit */ + cpl_override = 0; - CS = seg2; - do_seg_load(&cpu_state.seg_cs, segdat); - if ((CPL == 3) && (oldcpl != 3)) - flushmmucache_cr3(); + CS = seg2; + do_seg_load(&cpu_state.seg_cs, segdat); + if ((CPL == 3) && (oldcpl != 3)) + flushmmucache_cr3(); #ifdef USE_NEW_DYNAREC - oldcpl = CPL; + oldcpl = CPL; #endif - set_use32(segdat[3] & 0x0040); - cpu_state.pc = newpc; + set_use32(segdat[3] & 0x0040); + cpu_state.pc = newpc; - x86seg_log("Set access 2\n"); + x86seg_log("Set access 2\n"); - cpl_override = 1; - writememw(0, oaddr + 4, segdat[2] | 0x100); /* Set accessed bit */ - cpl_override = 0; + cpl_override = 1; + writememw(0, oaddr + 4, segdat[2] | 0x100); /* Set accessed bit */ + cpl_override = 0; - x86seg_log("Type %04X\n", type); - if (type == 0x0c00) { - PUSHL(oldss); - PUSHL(oldsp2); - if (cpu_state.abrt) { - SS = oldss; - ESP = oldsp2; + x86seg_log("Type %04X\n", type); + if (type == 0x0c00) { + PUSHL(oldss); + PUSHL(oldsp2); + if (cpu_state.abrt) { + SS = oldss; + ESP = oldsp2; #ifdef USE_NEW_DYNAREC - CS = oldcs; + CS = oldcs; #endif - return; + return; } if (count) { while (count--) { diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 81455f5a6..2969ca82d 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -57,8 +57,6 @@ #define STAT_IFULL 0x02 #define STAT_OFULL 0x01 -#define PS2_REFRESH_TIME (16 * TIMER_USEC) - #define RESET_DELAY_TIME (100 * 10) /* 600ms */ #define CCB_UNUSED 0x80 @@ -98,8 +96,7 @@ typedef struct { uint8_t command, status, old_status, out, old_out, secr_phase, mem_addr, input_port, output_port, old_output_port, key_command, output_locked, ami_stat, want60, - wantirq, key_wantdata, refresh, first_write, - ami_flags, pad[7]; + wantirq, key_wantdata, ami_flags, first_write; uint8_t mem[0x100]; @@ -109,7 +106,7 @@ typedef struct { uint32_t flags; - pc_timer_t refresh_time, pulse_cb; + pc_timer_t pulse_cb; uint8_t (*write60_ven)(void *p, uint8_t val); uint8_t (*write64_ven)(void *p, uint8_t val); @@ -1706,11 +1703,6 @@ kbd_write(uint16_t port, uint8_t val, void *priv) uint8_t mask, kbc_ven = 0x0; kbc_ven = dev->flags & KBC_VEN_MASK; - if ((kbc_ven == KBC_VEN_XI8088) && (port == 0x63)) - port = 0x61; - - kbd_log((port == 0x61) ? "" : "ATkbc: write(%04X, %02X)\n", port, val); - switch (port) { case 0x60: dev->status &= ~STAT_CD; @@ -1972,20 +1964,6 @@ kbd_write(uint16_t port, uint8_t val, void *priv) } break; - case 0x61: - ppi.pb = (ppi.pb & 0x10) | (val & 0x0f); - - speaker_update(); - speaker_gated = val & 1; - speaker_enable = val & 2; - if (speaker_enable) - was_speaker_enable = 1; - pit_ctr_set_gate(&pit->counters[2], val & 1); - - if (kbc_ven == KBC_VEN_XI8088) - xi8088_turbo_set(!!(val & 0x04)); - break; - case 0x64: /* Controller command. */ dev->want60 = 0; @@ -2135,9 +2113,6 @@ kbd_read(uint16_t port, void *priv) if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) cycles -= ISA_CYCLES(8); - if ((kbc_ven == KBC_VEN_XI8088) && (port == 0x63)) - port = 0x61; - switch (port) { case 0x60: ret = dev->out; @@ -2146,56 +2121,6 @@ kbd_read(uint16_t port, void *priv) dev->last_irq = 0; break; - case 0x61: - ret = ppi.pb & ~0xe0; - if (ppispeakon) - ret |= 0x20; - if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) { - if (dev->refresh) - ret |= 0x10; - else - ret &= ~0x10; - } - if (kbc_ven == KBC_VEN_XI8088) { - if (xi8088_turbo_get()) - ret |= 0x04; - else - ret &= ~0x04; - } - break; - - case 0x62: - ret = 0xff; - if (kbc_ven == KBC_VEN_OLIVETTI) { - /* SWA on Olivetti M240 mainboard (off=1) */ - ret = 0x00; - if (ppi.pb & 0x8) { - /* Switches 4, 5 - floppy drives (number) */ - int i, fdd_count = 0; - for (i = 0; i < FDD_NUM; i++) { - if (fdd_get_flags(i)) - fdd_count++; - } - if (!fdd_count) - ret |= 0x00; - else - ret |= ((fdd_count - 1) << 2); - /* Switches 6, 7 - monitor type */ - if (video_is_mda()) - ret |= 0x3; - else if (video_is_cga()) - ret |= 0x2; /* 0x10 would be 40x25 */ - else - ret |= 0x0; - } else { - /* bit 2 always on */ - ret |= 0x4; - /* Switch 8 - 8087 FPU. */ - if (hasfpu) - ret |= 0x02; - } - } - break; case 0x64: ret = (dev->status & 0xfb); if (dev->mem[0] & STAT_SYSFLAG) @@ -2219,16 +2144,6 @@ kbd_read(uint16_t port, void *priv) } -static void -kbd_refresh(void *priv) -{ - atkbd_t *dev = (atkbd_t *)priv; - - dev->refresh = !dev->refresh; - timer_advance_u64(&dev->refresh_time, PS2_REFRESH_TIME); -} - - static void kbd_reset(void *priv) { @@ -2273,7 +2188,7 @@ kbd_reset(void *priv) set_scancode_map(dev); - dev->ami_flags = ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x01 : 0x00); + dev->ami_flags = ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x01 : 0x00; } @@ -2295,7 +2210,6 @@ kbd_close(void *priv) /* Stop timers. */ timer_disable(&dev->send_delay_timer); - timer_disable(&dev->refresh_time); keyboard_scan = 0; keyboard_send = NULL; @@ -2321,15 +2235,11 @@ kbd_init(const device_t *info) video_reset(gfxcard); kbd_reset(dev); - io_sethandler(0x0060, 5, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); + io_sethandler(0x0060, 1, kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); + io_sethandler(0x0064, 1, kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); keyboard_send = add_data_kbd; timer_add(&dev->send_delay_timer, kbd_poll, dev, 1); - - if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) - timer_add(&dev->refresh_time, kbd_refresh, dev, 1); - timer_add(&dev->pulse_cb, pulse_poll, dev, 0); dev->write60_ven = NULL; diff --git a/src/win/win.c b/src/win/win.c index ee2fe4063..54aab11eb 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -139,6 +139,7 @@ win_log(const char *fmt, ...) #endif +void free_string(rc_str_t **str) { if (*str != NULL) { From 11431213eda6cc2a27c99b15162473a173f61c31 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 13 Nov 2021 23:25:07 +0100 Subject: [PATCH 098/159] Also reverted all the video changes. --- src/video/CMakeLists.txt | 4 +- src/video/vid_cl54xx.c | 22 --- src/video/vid_et3000.c | 308 -------------------------------------- src/video/vid_et4000.c | 162 ++++---------------- src/video/vid_et4000w32.c | 7 +- src/video/vid_oak_oti.c | 38 ++++- src/video/vid_s3.c | 32 +--- src/video/vid_svga.c | 152 +++---------------- src/video/vid_table.c | 2 - src/win/Makefile.mingw | 1 - 10 files changed, 92 insertions(+), 636 deletions(-) delete mode 100644 src/video/vid_et3000.c diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index edfab1864..c8cbdef62 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -20,8 +20,8 @@ add_library(vid OBJECT video.c vid_table.c vid_cga.c vid_cga_comp.c vid_svga_render.c vid_ddc.c vid_vga.c vid_ati_eeprom.c vid_ati18800.c vid_ati28800.c vid_ati_mach64.c vid_ati68860_ramdac.c vid_bt48x_ramdac.c vid_av9194.c vid_icd2061.c vid_ics2494.c vid_ics2595.c vid_cl54xx.c - vid_et3000.c vid_et4000.c vid_sc1148x_ramdac.c vid_sc1502x_ramdac.c - vid_et4000w32.c vid_stg_ramdac.c vid_ht216.c vid_oak_oti.c vid_paradise.c vid_rtg310x.c + vid_et4000.c vid_sc1148x_ramdac.c vid_sc1502x_ramdac.c vid_et4000w32.c + vid_stg_ramdac.c vid_ht216.c vid_oak_oti.c vid_paradise.c vid_rtg310x.c vid_f82c425.c vid_ti_cf62011.c vid_tvga.c vid_tgui9440.c vid_tkd8001_ramdac.c vid_att20c49x_ramdac.c vid_s3.c vid_s3_virge.c vid_ibm_rgb528_ramdac.c vid_sdac_ramdac.c vid_ogc.c vid_nga.c vid_tvp3026_ramdac.c) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 21ddeca83..7ba2efb3c 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -1780,28 +1780,6 @@ gd54xx_recalctimings(svga_t *svga) } svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd54xx->vram_mask : 0x3ffff; - - pclog("svga->crtc[0x1a] = %02X\n", svga->crtc[0x1a]); - pclog("svga->crtc[0x1b] = %02X\n", svga->crtc[0x1b]); - pclog("svga->crtc[0x1c] = %02X\n", svga->crtc[0x1c]); - - if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5430) - svga->htotal += ((svga->crtc[0x1c] >> 3) & 0x07); - - if (svga->crtc[0x1b] & ((svga->crtc[0x27] >= CIRRUS_ID_CLGD5424) ? 0xa0 : 0x20)) { - /* Special blanking mode: the blank start and end become components of the window generator, - and the actual blanking comes from the display enable signal. */ - /* Start blanking at the first character clock after the last active one. */ - svga->hblankstart = svga->crtc[1] + 1; - svga->hblank_end_val = (svga->htotal + 6) & 0x3f; - /* In this mode, the dots per clock are always 8 or 16, never 9 or 18. */ - if (!svga->scrblank && svga->attr_palette_enable) - svga->dots_per_clock = (svga->seqregs[1] & 8) ? 16 : 8; - /* No overscan in this mode. */ - svga->hblank_overscan = 0; - /* Also make sure vertical blanking starts on display end. */ - svga->vblankstart = svga->dispend; - } } diff --git a/src/video/vid_et3000.c b/src/video/vid_et3000.c deleted file mode 100644 index 70a383bfa..000000000 --- a/src/video/vid_et3000.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box distribution. - * - * Emulation of the Tseng Labs ET3000. - * - * Authors: Miran Grca, - * - * Copyright 2016-2018 Miran Grca. - */ -#include -#include -#include -#include -#include -#include <86box/86box.h> -#include <86box/io.h> -#include <86box/mca.h> -#include <86box/mem.h> -#include <86box/rom.h> -#include <86box/device.h> -#include <86box/timer.h> -#include <86box/video.h> -#include <86box/vid_svga.h> -#include <86box/vid_svga_render.h> - - -#define BIOS_ROM_PATH "roms/video/et3000/Tseng ET3000AX ISA VGA-VGA ULTRA.bin" - -typedef struct { - const char *name; - int type; - - svga_t svga; - - rom_t bios_rom; - - uint8_t banking; -} et3000_t; - - -static video_timings_t timing_et3000_isa = {VIDEO_ISA, 3, 3, 6, 5, 5, 10}; - -static uint8_t et3000_in(uint16_t addr, void *priv); -static void et3000_out(uint16_t addr, uint8_t val, void *priv); - - -static uint8_t -et3000_in(uint16_t addr, void *priv) -{ - et3000_t *dev = (et3000_t *)priv; - svga_t *svga = &dev->svga; - - if (((addr & 0xfff0) == 0x3d0 || - (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; - - switch (addr) { - case 0x3cd: /*Banking*/ - return dev->banking; - - case 0x3d4: - return svga->crtcreg; - - case 0x3d5: - return svga->crtc[svga->crtcreg]; - } - - return svga_in(addr, svga); -} - -static void -et3000_out(uint16_t addr, uint8_t val, void *priv) -{ - et3000_t *dev = (et3000_t *)priv; - svga_t *svga = &dev->svga; - uint8_t old; - - if (((addr & 0xfff0) == 0x3d0 || - (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; - - switch (addr) { - case 0x3c0: - case 0x3c1: - if (svga->attrff && (svga->attraddr == 0x16)) { - svga->attrregs[0x16] = val; - svga->chain4 &= ~0x10; - if (svga->gdcreg[5] & 0x40) - svga->chain4 |= (svga->attrregs[0x16] & 0x10); - svga_recalctimings(svga); - } - break; - - case 0x3c5: - if (svga->seqaddr == 4) { - svga->seqregs[4] = val; - - svga->chain2_write = !(val & 4); - svga->chain4 = (svga->chain4 & ~8) | (val & 8); - svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && - !svga->gdcreg[1]) && svga->chain4 && !(svga->adv_flags & FLAG_ADDR_BY8); - return; - } - break; - - case 0x3cf: - if ((svga->gdcaddr & 15) == 5) { - svga->chain4 &= ~0x10; - if (val & 0x40) - svga->chain4 |= (svga->attrregs[0x16] & 0x10); - } - break; - - case 0x3cd: /*Banking*/ - dev->banking = val; - if (!(svga->crtc[0x23] & 0x80) && !(svga->gdcreg[6] & 0x08)) { - switch ((val >> 6) & 3) { - case 0: /*128K segments*/ - svga->write_bank = (val & 7) << 17; - svga->read_bank = ((val >> 3) & 7) << 17; - break; - case 1: /*64K segments*/ - svga->write_bank = (val & 7) << 16; - svga->read_bank = ((val >> 3) & 7) << 16; - break; - } - } - return; - - case 0x3d4: - svga->crtcreg = val & 0x3f; - return; - - case 0x3d5: - if ((svga->crtcreg < 7) && (svga->crtc[0x11] & 0x80)) - return; - if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80)) - val = (svga->crtc[7] & ~0x10) | (val & 0x10); - old = svga->crtc[svga->crtcreg]; - svga->crtc[svga->crtcreg] = val; - - if (old != val) { - if (svga->crtcreg < 0x0e || svga->crtcreg > 0x10) { - svga->fullchange = changeframecount; - svga_recalctimings(svga); - } - } - break; - } - - svga_out(addr, val, svga); -} - - -static void -et3000_recalctimings(svga_t *svga) -{ - svga->ma_latch |= (svga->crtc[0x23] & 2) << 15; - if (svga->crtc[0x25] & 1) svga->vblankstart |= 0x400; - if (svga->crtc[0x25] & 2) svga->vtotal |= 0x400; - if (svga->crtc[0x25] & 4) svga->dispend |= 0x400; - if (svga->crtc[0x25] & 8) svga->vsyncstart |= 0x400; - if (svga->crtc[0x25] & 0x10) svga->split |= 0x400; - - svga->interlace = !!(svga->crtc[0x25] & 0x80); - - if (svga->attrregs[0x16] & 0x10) { - svga->ma_latch <<= (1 << 0); - svga->rowoffset <<= (1 << 0); - switch (svga->gdcreg[5] & 0x60) { - case 0x00: - svga->render = svga_render_4bpp_highres; - svga->hdisp *= 2; - break; - case 0x20: - svga->render = svga_render_2bpp_highres; - break; - case 0x40: case 0x60: - svga->render = svga_render_8bpp_highres; - break; - } - } - - /* pclog("HDISP = %i, HTOTAL = %i, ROWOFFSET = %i, INTERLACE = %i\n", - svga->hdisp, svga->htotal, svga->rowoffset, svga->interlace); */ - - switch (((svga->miscout >> 2) & 3) | ((svga->crtc[0x24] << 1) & 4)) { - case 0: - case 1: - break; - case 3: - svga->clock = (cpuclock * (double)(1ull << 32)) / 40000000.0; - break; - case 5: - svga->clock = (cpuclock * (double)(1ull << 32)) / 65000000.0; - break; - default: - svga->clock = (cpuclock * (double)(1ull << 32)) / 36000000.0; - break; - } -} - - -static void * -et3000_init(const device_t *info) -{ - const char *fn; - et3000_t *dev; - - dev = (et3000_t *)malloc(sizeof(et3000_t)); - memset(dev, 0x00, sizeof(et3000_t)); - dev->name = info->name; - dev->type = info->local; - fn = BIOS_ROM_PATH; - - switch(dev->type) { - case 0: /* ISA ET3000AX */ - video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et3000_isa); - svga_init(info, &dev->svga, dev, device_get_config_int("memory") << 10, - et3000_recalctimings, et3000_in, et3000_out, - NULL, NULL); - io_sethandler(0x03c0, 32, - et3000_in,NULL,NULL, et3000_out,NULL,NULL, dev); - break; - } - - rom_init(&dev->bios_rom, (char *) fn, - 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - - dev->svga.bpp = 8; - dev->svga.miscout = 1; - - return(dev); -} - - -static void -et3000_close(void *priv) -{ - et3000_t *dev = (et3000_t *)priv; - - svga_close(&dev->svga); - - free(dev); -} - - -static void -et3000_speed_changed(void *priv) -{ - et3000_t *dev = (et3000_t *)priv; - - svga_recalctimings(&dev->svga); -} - - -static void -et3000_force_redraw(void *priv) -{ - et3000_t *dev = (et3000_t *)priv; - - dev->svga.fullchange = changeframecount; -} - - -static int -et3000_available(void) -{ - return rom_present(BIOS_ROM_PATH); -} - -static const device_config_t et3000_config[] = -{ - { - "memory", "Memory size", CONFIG_SELECTION, "", 512, "", { 0 }, - { - { - "256 KB", 256 - }, - { - "512 KB", 512 - }, - { - "1 MB", 1024 - }, - { - "" - } - } - }, - { - "", "", -1 - } -}; - -const device_t et3000_isa_device = { - "Tseng Labs ET3000AX (ISA)", - DEVICE_ISA, - 0, - et3000_init, et3000_close, NULL, - { et3000_available }, - et3000_speed_changed, - et3000_force_redraw, - et3000_config -}; diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index dd24a5b09..740be207e 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -55,7 +55,6 @@ #define BIOS_ROM_PATH "roms/video/et4000/et4000.bin" -#define TC6058AF_BIOS_ROM_PATH "roms/video/et4000/Tseng_Labs_VGA-4000_BIOS_V1.1.bin" #define KOREAN_BIOS_ROM_PATH "roms/video/et4000/tgkorvga.bin" #define KOREAN_FONT_ROM_PATH "roms/video/et4000/tg_ksc5601.rom" #define KASAN_BIOS_ROM_PATH "roms/video/et4000/et4000_kasan16.bin" @@ -110,14 +109,13 @@ et4000_in(uint16_t addr, void *priv) { et4000_t *dev = (et4000_t *)priv; svga_t *svga = &dev->svga; - uint8_t ret; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; switch (addr) { case 0x3c2: - if (dev->type == 2) { + if (dev->type == 1) { if ((svga->vgapal[0].r + svga->vgapal[0].g + svga->vgapal[0].b) >= 0x4e) return 0; else @@ -134,9 +132,7 @@ et4000_in(uint16_t addr, void *priv) case 0x3c7: case 0x3c8: case 0x3c9: - if (dev->type >= 1) - return sc1502x_ramdac_in(addr, svga->ramdac, svga); - break; + return sc1502x_ramdac_in(addr, svga->ramdac, svga); case 0x3cd: /*Banking*/ return dev->banking; @@ -146,26 +142,6 @@ et4000_in(uint16_t addr, void *priv) case 0x3d5: return svga->crtc[svga->crtcreg]; - - case 0x3da: - svga->attrff = 0; - - if (svga->cgastat & 0x01) - svga->cgastat &= ~0x30; - else - svga->cgastat ^= 0x30; - - ret = svga->cgastat; - - if ((svga->fcr & 0x08) && svga->dispon) - ret |= 0x08; - - if (ret & 0x08) - ret &= 0x7f; - else - ret |= 0x80; - - return ret; } return svga_in(addr, svga); @@ -247,34 +223,12 @@ et4000_out(uint16_t addr, uint8_t val, void *priv) (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; switch (addr) { - case 0x3c5: - if (svga->seqaddr == 4) { - svga->seqregs[4] = val; - - svga->chain2_write = !(val & 4); - svga->chain4 = (svga->chain4 & ~8) | (val & 8); - svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && - !svga->gdcreg[1]) && svga->chain4 && !(svga->adv_flags & FLAG_ADDR_BY8); - return; - } else if (svga->seqaddr == 0x0e) { - svga->seqregs[0x0e] = val; - svga->chain4 &= ~0x02; - if (svga->gdcreg[5] & 0x40) - svga->chain4 |= (svga->seqregs[0x0e] & 0x02); - svga_recalctimings(svga); - return; - } - break; - case 0x3c6: case 0x3c7: case 0x3c8: case 0x3c9: - if (dev->type >= 1) { - sc1502x_ramdac_out(addr, val, svga->ramdac, svga); - return; - } - break; + sc1502x_ramdac_out(addr, val, svga->ramdac, svga); + return; case 0x3cd: /*Banking*/ if (!(svga->crtc[0x36] & 0x10) && !(svga->gdcreg[6] & 0x08)) { @@ -285,11 +239,7 @@ et4000_out(uint16_t addr, uint8_t val, void *priv) return; case 0x3cf: - if ((svga->gdcaddr & 15) == 5) { - svga->chain4 &= ~0x02; - if (val & 0x40) - svga->chain4 |= (svga->seqregs[0x0e] & 0x02); - } else if ((svga->gdcaddr & 15) == 6) { + if ((svga->gdcaddr & 15) == 6) { if (!(svga->crtc[0x36] & 0x10) && !(val & 0x08)) { svga->write_bank = (dev->banking & 0x0f) * 0x10000; svga->read_bank = ((dev->banking >> 4) & 0x0f) * 0x10000; @@ -470,8 +420,7 @@ et4000_kasan_out(uint16_t addr, uint8_t val, void *priv) break; case 1: case 2: - if ((et4000->kasan_cfg_index - 0xF0) <= 16) - et4000->kasan_cfg_regs[et4000->kasan_cfg_index - 0xF0] = val; + et4000->kasan_cfg_regs[et4000->kasan_cfg_index - 0xF0] = val; io_removehandler(et4000->kasan_access_addr, 0x0008, et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, et4000); et4000->kasan_access_addr = (et4000->kasan_cfg_regs[2] << 8) | et4000->kasan_cfg_regs[1]; io_sethandler(et4000->kasan_access_addr, 0x0008, et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, et4000); @@ -514,10 +463,8 @@ et4000_kasan_out(uint16_t addr, uint8_t val, void *priv) case 3: case 4: case 5: - if (et4000->kasan_cfg_regs[0] & 1) { - if ((addr - (((et4000->kasan_cfg_regs[2] << 8) | (et4000->kasan_cfg_regs[1])) + 3)) <= 4) - et4000->kasan_font_data[addr - (((et4000->kasan_cfg_regs[2] << 8) | (et4000->kasan_cfg_regs[1])) + 3)] = val; - } + if (et4000->kasan_cfg_regs[0] & 1) + et4000->kasan_font_data[addr - (((et4000->kasan_cfg_regs[2] << 8) | (et4000->kasan_cfg_regs[1])) + 3)] = val; break; case 6: if ((et4000->kasan_cfg_regs[0] & 1) && (et4000->kasan_font_data[3] & !(val & 0x80)) && (et4000->get_korean_font_base & 0x7F) >= 0x20 && (et4000->get_korean_font_base & 0x7F) < 0x7F) { @@ -601,13 +548,13 @@ et4000_recalctimings(svga_t *svga) et4000_t *dev = (et4000_t *)svga->p; svga->ma_latch |= (svga->crtc[0x33] & 3) << 16; - if (svga->crtc[0x35] & 1) svga->vblankstart |= 0x400; - if (svga->crtc[0x35] & 2) svga->vtotal |= 0x400; - if (svga->crtc[0x35] & 4) svga->dispend |= 0x400; - if (svga->crtc[0x35] & 8) svga->vsyncstart |= 0x400; - if (svga->crtc[0x35] & 0x10) svga->split |= 0x400; + if (svga->crtc[0x35] & 1) svga->vblankstart += 0x400; + if (svga->crtc[0x35] & 2) svga->vtotal += 0x400; + if (svga->crtc[0x35] & 4) svga->dispend += 0x400; + if (svga->crtc[0x35] & 8) svga->vsyncstart += 0x400; + if (svga->crtc[0x35] & 0x10) svga->split += 0x400; if (!svga->rowoffset) svga->rowoffset = 0x100; - if (svga->crtc[0x3f] & 1) svga->htotal |= 0x100; + if (svga->crtc[0x3f] & 1) svga->htotal += 256; if (svga->attrregs[0x16] & 0x20) svga->hdisp <<= 1; switch (((svga->miscout >> 2) & 3) | ((svga->crtc[0x34] << 1) & 4)) { @@ -636,7 +583,7 @@ et4000_recalctimings(svga_t *svga) break; } - if (dev->type == 3 || dev->type == 4 || dev->type == 5) { + if (dev->type == 2 || dev->type == 3 || dev->type == 4) { if ((svga->render == svga_render_text_80) && ((svga->crtc[0x37] & 0x0A) == 0x0A)) { if (dev->port_32cb_val & 0x80) { svga->ma_latch -= 2; @@ -647,19 +594,6 @@ et4000_recalctimings(svga_t *svga) } } } - - if ((svga->seqregs[0x0e] & 0x02) && ((svga->gdcreg[5] & 0x60) >= 0x40)) { - svga->ma_latch <<= (1 << 0); - svga->rowoffset <<= (1 << 0); - svga->render = svga_render_8bpp_highres; - } - - if (dev->type == 0) { - if (svga->render == svga_render_8bpp_lowres) - svga->render = svga_render_8bpp_tseng_lowres; - else if (svga->render == svga_render_8bpp_highres) - svga->render = svga_render_8bpp_tseng_highres; - } } static void @@ -673,7 +607,6 @@ et4000_kasan_recalctimings(svga_t *svga) svga->ma_latch -= 3; svga->ca_adj = (et4000->kasan_cfg_regs[0] >> 6) - 3; svga->ksc5601_sbyte_mask = (et4000->kasan_cfg_regs[0] & 4) << 5; - /* TODO: Are we sure this doesn't use Attribute register 16h bit 6 (two-byte character code enable)? */ if((et4000->kasan_cfg_regs[0] & 0x23) == 0x20 && (et4000->kasan_cfg_regs[4] & 0x80) && ((svga->crtc[0x37] & 0x0B) == 0x0A)) svga->render = svga_render_text_80_ksc5601; } @@ -722,8 +655,7 @@ et4000_init(const device_t *info) fn = BIOS_ROM_PATH; switch(dev->type) { - case 0: /* ISA ET4000AX (TC6058AF) */ - case 1: /* ISA ET4000AX */ + case 0: /* ISA ET4000AX */ dev->vram_size = device_get_config_int("memory") << 10; video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000_isa); svga_init(info, &dev->svga, dev, dev->vram_size, @@ -731,11 +663,9 @@ et4000_init(const device_t *info) NULL, NULL); io_sethandler(0x03c0, 32, et4000_in,NULL,NULL, et4000_out,NULL,NULL, dev); - if (dev->type == 0) - fn = TC6058AF_BIOS_ROM_PATH; break; - case 2: /* MCA ET4000AX */ + case 1: /* MCA ET4000AX */ dev->vram_size = 1024 << 10; video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000_mca); svga_init(info, &dev->svga, dev, dev->vram_size, @@ -748,8 +678,8 @@ et4000_init(const device_t *info) mca_add(et4000_mca_read, et4000_mca_write, et4000_mca_feedb, NULL, dev); break; - case 3: /* Korean ET4000 */ - case 4: /* Trigem 286M ET4000 */ + case 2: /* Korean ET4000 */ + case 3: /* Trigem 286M ET4000 */ dev->vram_size = device_get_config_int("memory") << 10; dev->port_22cb_val = 0x60; dev->port_32cb_val = 0; @@ -773,7 +703,7 @@ et4000_init(const device_t *info) loadfont(KOREAN_FONT_ROM_PATH, 6); fn = KOREAN_BIOS_ROM_PATH; break; - case 5: /* Kasan ET4000 */ + case 4: /* Kasan ET4000 */ dev->vram_size = device_get_config_int("memory") << 10; dev->svga.ksc5601_sbyte_mask = 0; dev->svga.ksc5601_udc_area_msb[0] = 0xC9; @@ -809,8 +739,7 @@ et4000_init(const device_t *info) } - if (dev->type >= 1) - dev->svga.ramdac = device_add(&sc1502x_ramdac_device); + dev->svga.ramdac = device_add(&sc1502x_ramdac_device); dev->vram_mask = dev->vram_size - 1; @@ -854,13 +783,6 @@ et4000_force_redraw(void *priv) } -static int -et4000_tc6058af_available(void) -{ - return rom_present(TC6058AF_BIOS_ROM_PATH); -} - - static int et4000_available(void) { @@ -882,27 +804,6 @@ et4000_kasan_available(void) rom_present(KASAN_FONT_ROM_PATH); } -static const device_config_t et4000_tc6058af_config[] = -{ - { - "memory", "Memory size", CONFIG_SELECTION, "", 1024, "", { 0 }, - { - { - "256 KB", 256 - }, - { - "512 KB", 512 - }, - { - "" - } - } - }, - { - "", "", -1 - } -}; - static const device_config_t et4000_config[] = { { @@ -927,21 +828,10 @@ static const device_config_t et4000_config[] = } }; -const device_t et4000_tc6058af_isa_device = { - "Tseng Labs ET4000AX (TC6058AF) (ISA)", - DEVICE_ISA, - 0, - et4000_init, et4000_close, NULL, - { et4000_tc6058af_available }, - et4000_speed_changed, - et4000_force_redraw, - et4000_tc6058af_config -}; - const device_t et4000_isa_device = { "Tseng Labs ET4000AX (ISA)", DEVICE_ISA, - 1, + 0, et4000_init, et4000_close, NULL, { et4000_available }, et4000_speed_changed, @@ -952,7 +842,7 @@ const device_t et4000_isa_device = { const device_t et4000_mca_device = { "Tseng Labs ET4000AX (MCA)", DEVICE_MCA, - 2, + 1, et4000_init, et4000_close, NULL, { et4000_available }, et4000_speed_changed, @@ -963,7 +853,7 @@ const device_t et4000_mca_device = { const device_t et4000k_isa_device = { "Trigem Korean VGA (Tseng Labs ET4000AX Korean)", DEVICE_ISA, - 3, + 2, et4000_init, et4000_close, NULL, { et4000k_available }, et4000_speed_changed, @@ -974,7 +864,7 @@ const device_t et4000k_isa_device = { const device_t et4000k_tg286_isa_device = { "Trigem Korean VGA (Trigem 286M)", DEVICE_ISA, - 4, + 3, et4000_init, et4000_close, NULL, { et4000k_available }, et4000_speed_changed, @@ -985,7 +875,7 @@ const device_t et4000k_tg286_isa_device = { const device_t et4000_kasan_isa_device = { "Kasan Hangulmadang-16 VGA (Tseng Labs ET4000AX Korean)", DEVICE_ISA, - 5, + 4, et4000_init, et4000_close, NULL, { et4000_kasan_available }, et4000_speed_changed, diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index f4384b459..65dced875 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -397,7 +397,6 @@ et4000w32p_recalctimings(svga_t *svga) svga->clock = (cpuclock * (double)(1ull << 32)) / svga->getclock((svga->miscout >> 2) & 3, svga->clock_gen); -#if 0 if (svga->adv_flags & FLAG_NOSKEW) { /* On the Cardex ET4000/W32p-based cards, adjust text mode clocks by 1. */ if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /* Text mode */ @@ -414,10 +413,10 @@ et4000w32p_recalctimings(svga_t *svga) svga->hdisp += (svga->seqregs[1] & 1) ? 16 : 18; else svga->hdisp += (svga->seqregs[1] & 1) ? 8 : 9; - } + } else if ((svga->gdcreg[5] & 0x40) == 0) + svga->hdisp += (svga->seqregs[1] & 1) ? 8 : 9; } } -#endif if (et4000->type == ET4000W32) { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { @@ -464,10 +463,8 @@ et4000w32p_recalctimings(svga_t *svga) else svga->render = svga_render_text_80; } else { -#if 0 if (svga->adv_flags & FLAG_NOSKEW) svga->ma_latch--; -#endif switch (svga->gdcreg[5] & 0x60) { case 0x00: diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index 31e49794a..941359987 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -31,7 +31,9 @@ #include <86box/vid_svga_render.h> #define BIOS_037C_PATH "roms/video/oti/bios.bin" -#define BIOS_067_AMA932J_PATH "roms/machines/ama932j/oti067.bin" +#define BIOS_067_AMA932J_PATH "roms/machines/ama932j/oti067.bin" +#define BIOS_067_M300_08_PATH "roms/machines/olivetti_m300_08/EVC_BIOS.ROM" +#define BIOS_067_M300_15_PATH "roms/machines/olivetti_m300_15/EVC_BIOS.ROM" #define BIOS_077_PATH "roms/video/oti/oti077.vbi" @@ -39,6 +41,7 @@ enum { OTI_037C, OTI_067 = 2, OTI_067_AMA932J, + OTI_067_M300 = 4, OTI_077 = 5 }; @@ -394,6 +397,16 @@ oti_init(const device_t *info) io_sethandler(0x46e8, 1, oti_pos_in, NULL, NULL, oti_pos_out, NULL, NULL, oti); break; + case OTI_067_M300: + if (rom_present(BIOS_067_M300_15_PATH)) + romfn = BIOS_067_M300_15_PATH; + else + romfn = BIOS_067_M300_08_PATH; + oti->vram_size = device_get_config_int("memory"); + oti->pos = 0x08; /* Tell the BIOS the I/O ports are already enabled to avoid a double I/O handler mess. */ + io_sethandler(0x46e8, 1, oti_pos_in, NULL, NULL, oti_pos_out, NULL, NULL, oti); + break; + case OTI_067: case OTI_077: romfn = BIOS_077_PATH; @@ -463,20 +476,27 @@ oti037c_available(void) return(rom_present(BIOS_037C_PATH)); } - static int oti067_ama932j_available(void) { return(rom_present(BIOS_067_AMA932J_PATH)); } - static int oti067_077_available(void) { return(rom_present(BIOS_077_PATH)); } +static int +oti067_m300_available(void) +{ + if (rom_present(BIOS_067_M300_15_PATH)) + return(rom_present(BIOS_067_M300_15_PATH)); + else + return(rom_present(BIOS_067_M300_08_PATH)); +} + static const device_config_t oti067_config[] = { @@ -569,6 +589,18 @@ const device_t oti067_device = oti067_config }; +const device_t oti067_m300_device = +{ + "Oak OTI-067 (Olivetti M300-08/15)", + DEVICE_ISA, + 4, + oti_init, oti_close, NULL, + { oti067_m300_available }, + oti_speed_changed, + oti_force_redraw, + oti067_config +}; + const device_t oti067_ama932j_device = { "Oak OTI-067 (AMA-932J)", diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index f64b30fd3..7dff04e4a 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -2801,8 +2801,6 @@ static void s3_recalctimings(svga_t *svga) s3_t *s3 = (s3_t *)svga->p; int clk_sel = (svga->miscout >> 2) & 3; - svga->hdisp = svga->hdisp_old; - if (!svga->scrblank && svga->attr_palette_enable) { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { if (svga->crtc[0x3a] & 0x10) { /*256+ color register*/ @@ -2812,12 +2810,13 @@ static void s3_recalctimings(svga_t *svga) } svga->ma_latch |= (s3->ma_ext << 16); - if (s3->chip >= S3_86C928) { + svga->hdisp = svga->hdisp_old; + if (svga->crtc[0x5d] & 0x01) svga->htotal |= 0x100; if (svga->crtc[0x5d] & 0x02) { svga->hdisp_time |= 0x100; - svga->hdisp |= 0x100 * svga->dots_per_clock; + svga->hdisp |= 0x100 * ((svga->seqregs[1] & 8) ? 16 : 8); } if (svga->crtc[0x5e] & 0x01) svga->vtotal |= 0x400; if (svga->crtc[0x5e] & 0x02) svga->dispend |= 0x400; @@ -2826,7 +2825,7 @@ static void s3_recalctimings(svga_t *svga) if (svga->crtc[0x5e] & 0x40) svga->split |= 0x400; if (svga->crtc[0x51] & 0x30) svga->rowoffset |= (svga->crtc[0x51] & 0x30) << 4; else if (svga->crtc[0x43] & 0x04) svga->rowoffset |= 0x100; - } else if (svga->crtc[0x43] & 0x04) svga->rowoffset |= 0x100; + } if (!svga->rowoffset) svga->rowoffset = 256; if ((s3->chip == S3_VISION964) || (s3->chip == S3_86C928)) { @@ -3066,28 +3065,6 @@ static void s3_recalctimings(svga_t *svga) } } } - - if (s3->chip >= S3_86C801) { - if (!svga->scrblank && svga->attr_palette_enable && (svga->crtc[0x43] & 0x80)) { - /* TODO: In case of bug reports, disable 9-dots-wide character clocks in graphics modes. */ - svga->dots_per_clock = ((svga->seqregs[1] & 1) ? 16 : 18); - } - - if (svga->crtc[0x5d] & 0x04) - svga->hblankstart += 0x100; - if (s3->chip >= S3_VISION964) { - /* NOTE: The S3 Trio64V+ datasheet says this is bit 7, but then where is bit 6? - The datasheets for the pre-Trio64V+ cards say +64, which implies bit 6, - and, contrary to VGADOC, it also exists on Trio32, Trio64, Vision868, - and Vision968. */ - // pclog("svga->crtc[0x5d] = %02X\n", svga->crtc[0x5d]); - if (svga->crtc[0x5d] & 0x08) - svga->hblank_ext = 0x40; - svga->hblank_end_len = 0x00000040; - } - } - - svga->hblank_overscan = !(svga->crtc[0x33] & 0x20); } static void s3_trio64v_recalctimings(svga_t *svga) @@ -8138,3 +8115,4 @@ const device_t s3_trio64v2_dx_onboard_pci_device = s3_force_redraw, s3_standard_config }; + diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 8ec5c978d..b1d446829 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -20,13 +20,11 @@ * Copyright 2016-2019 Miran Grca. */ #include -#include #include #include -#include #include +#include #include -#define HAVE_STDARG_H #include <86box/86box.h> #include "cpu.h" #include <86box/device.h> @@ -55,27 +53,6 @@ uint8_t svga_rotate[8][256]; static svga_t *svga_pri; -// #define ENABLE_SVGA_LOG 1 -#ifdef ENABLE_SVGA_LOG -int svga_do_log = ENABLE_SVGA_LOG; - - -static void -svga_log(const char *fmt, ...) -{ - va_list ap; - - if (svga_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -} -#else -#define svga_log(fmt, ...) -#endif - - svga_t *svga_get_pri() { @@ -199,7 +176,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) break; case 4: svga->chain2_write = !(val & 4); - svga->chain4 = (svga->chain4 & ~8) | (val & 8); + svga->chain4 = val & 8; svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && ((svga->chain4 && svga->packed_chain4) || svga->fb_only) && !(svga->adv_flags & FLAG_ADDR_BY8); break; @@ -260,7 +237,7 @@ svga_out(uint16_t addr, uint8_t val, void *p) break; case 6: if ((svga->gdcreg[6] & 0xc) != (val & 0xc)) { - switch (val & 0xc) { + switch (val&0xC) { case 0x0: /*128k at A0000*/ mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); svga->banked_mask = 0xffff; @@ -291,9 +268,6 @@ svga_out(uint16_t addr, uint8_t val, void *p) ((svga->gdcaddr & 15) == 6 && (val ^ o) & 1)) svga_recalctimings(svga); break; - case 0x3da: - svga->fcr = val; - break; } } @@ -361,9 +335,6 @@ svga_in(uint16_t addr, void *p) if (svga->adv_flags & FLAG_RAMDAC_SHIFT) ret >>= 2; break; - case 0x3ca: - ret = svga->fcr; - break; case 0x3cc: ret = svga->miscout; break; @@ -397,11 +368,7 @@ svga_in(uint16_t addr, void *p) svga->cgastat &= ~0x30; else svga->cgastat ^= 0x30; - ret = svga->cgastat; - - if ((svga->fcr & 0x08) && svga->dispon) - ret |= 0x08; break; } @@ -433,10 +400,6 @@ void svga_recalctimings(svga_t *svga) { double crtcconst, _dispontime, _dispofftime, disptime; -#ifdef ENABLE_SVGA_LOG - int vsyncend, vblankend; - int hdispstart, hdispend, hsyncstart, hsyncend; -#endif svga->vtotal = svga->crtc[6]; svga->dispend = svga->crtc[0x12]; @@ -474,9 +437,12 @@ svga_recalctimings(svga_t *svga) svga->vblankstart |= 0x200; svga->vblankstart++; - svga->hdisp = svga->crtc[1] - ((svga->crtc[3] & 0x60) >> 5); + svga->hdisp = svga->crtc[1] - ((svga->crtc[5] & 0x60) >> 5); svga->hdisp++; + svga->htotal = svga->crtc[0]; + svga->htotal += 6; /*+6 is required for Tyrian*/ + svga->rowoffset = svga->crtc[0x13]; svga->clock = (svga->vidclock) ? VGACONST2 : VGACONST1; @@ -493,19 +459,20 @@ svga_recalctimings(svga_t *svga) svga->hdisp_time = svga->hdisp; svga->render = svga_render_blank; if (!svga->scrblank && svga->attr_palette_enable) { - /* TODO: In case of bug reports, disable 9-dots-wide character clocks in graphics modes. */ - if (svga->seqregs[1] & 8) - svga->hdisp *= (svga->seqregs[1] & 1) ? 16 : 18; - else - svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9; - if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ - if (svga->seqregs[1] & 8) /*40 column*/ + if (svga->seqregs[1] & 8) /*40 column*/ { svga->render = svga_render_text_40; - else + svga->hdisp *= (svga->seqregs[1] & 1) ? 16 : 18; + /* Character clock is off by 1 now in 40-line modes, on all cards. */ + svga->ma_latch--; + svga->hdisp += (svga->seqregs[1] & 1) ? 16 : 18; + } else { svga->render = svga_render_text_80; + svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9; + } svga->hdisp_old = svga->hdisp; } else { + svga->hdisp *= (svga->seqregs[1] & 8) ? 16 : 8; svga->hdisp_old = svga->hdisp; switch (svga->gdcreg[5] & 0x60) { @@ -567,7 +534,7 @@ svga_recalctimings(svga_t *svga) } svga->linedbl = svga->crtc[9] & 0x80; - svga->char_width = (svga->seqregs[1] & 1) ? 8 : 9; + svga->char_width = (svga->seqregs[1] & 1) ? 8 : 9; if (enable_overscan) { overscan_y = (svga->rowcount + 1) << 1; @@ -584,41 +551,9 @@ svga_recalctimings(svga_t *svga) } else overscan_x = 16; - svga->htotal = svga->crtc[0]; - svga->hblankstart = svga->crtc[4] + 1; - svga->hblank_end_val = (svga->crtc[3] & 0x1f) | ((svga->crtc[5] & 0x80) ? 0x20 : 0x00); - // pclog("htotal = %i, hblankstart = %i, hblank_end_val = %02X\n", svga->htotal, svga->hblankstart, svga->hblank_end_val); - svga->hblank_end_len = 0x00000040; - svga->hblank_overscan = 1; - - if (!svga->scrblank && svga->attr_palette_enable) { - /* TODO: In case of bug reports, disable 9-dots-wide character clocks in graphics modes. */ - if (svga->seqregs[1] & 8) - svga->dots_per_clock = ((svga->seqregs[1] & 1) ? 16 : 18); - else - svga->dots_per_clock = ((svga->seqregs[1] & 1) ? 8 : 9); - } else - svga->dots_per_clock = 1; - - /* Do svga->recalctimings_ex() here so that the above five variables can be - updated by said function. */ if (svga->recalctimings_ex) svga->recalctimings_ex(svga); - svga->htotal += 6; /*+6 is required for Tyrian*/ - svga->hblankend = (svga->hblankstart & ~(svga->hblank_end_len - 1)) | svga->hblank_end_val; - if (svga->hblankend <= svga->hblankstart) - svga->hblankend += svga->hblank_end_len; - svga->hblankend += svga->hblank_ext; - - svga->hblank_sub = 0; - if (svga->hblankend > svga->htotal) { - svga->hblankend &= (svga->hblank_end_len - 1); - svga->hblank_sub = svga->hblankend + svga->hblank_overscan; - - svga->hdisp -= (svga->hblank_sub * svga->dots_per_clock); - } - svga->y_add = (overscan_y >> 1) - (svga->crtc[8] & 0x1f); svga->x_add = (overscan_x >> 1); @@ -627,44 +562,6 @@ svga_recalctimings(svga_t *svga) crtcconst = svga->clock * svga->char_width; -#ifdef ENABLE_SVGA_LOG - vsyncend = (svga->vsyncstart & 0xfffffff0) | (svga->crtc[0x11] & 0x0f); - if (vsyncend <= svga->vsyncstart) - vsyncend += 0x00000010; - vblankend = (svga->vblankstart & 0xffffff80) | (svga->crtc[0x16] & 0x7f); - if (vblankend <= svga->vblankstart) - vblankend += 0x00000080; - - hdispstart = ((svga->crtc[3] >> 5) & 3); - hdispend = svga->crtc[1] + 1; - hsyncstart = svga->crtc[4] + ((svga->crtc[5] >> 5) & 3) + 1; - hsyncend = (hsyncstart & 0xffffffe0) | (svga->crtc[5] & 0x1f); - if (hsyncend <= hsyncstart) - hsyncend += 0x00000020; -#endif - - svga_log("Last scanline in the vertical period: %i\n" - "First scanline after the last of active display: %i\n" - "First scanline with vertical retrace asserted: %i\n" - "First scanline after the last with vertical retrace asserted: %i\n" - "First scanline of blanking: %i\n" - "First scanline after the last of blanking: %i\n" - "\n" - "Last character in the horizontal period: %i\n" - "First character of active display: %i\n" - "First character after the last of active display: %i\n" - "First character with horizontal retrace asserted: %i\n" - "First character after the last with horizontal retrace asserted: %i\n" - "First character of blanking: %i\n" - "First character after the last of blanking: %i\n" - "\n" - "\n", - svga->vtotal, svga->dispend, svga->vsyncstart, vsyncend, - svga->vblankstart, vblankend, - svga->htotal, hdispstart, hdispend, hsyncstart, hsyncend, - svga->hblankstart, svga->hblankend - ); - disptime = svga->htotal; _dispontime = svga->hdisp_time; @@ -750,8 +647,6 @@ svga_poll(void *p) uint32_t x, blink_delay; int wx, wy; int ret, old_ma; - // int lines_num = (svga->vtotal > svga->vsyncstart) ? svga->vtotal : svga->vsyncstart; - // int lines_num = svga->vsyncstart + 3 + 19; if (!svga->linepos) { if (svga->displine == svga->hwcursor_latch.y && svga->hwcursor_latch.ena) { @@ -830,7 +725,7 @@ svga_poll(void *p) svga->displine++; if (svga->interlace) svga->displine++; - if ((svga->cgastat & 8) && ((svga->displine & 15) == (svga->crtc[0x11] & 15))) + if ((svga->cgastat & 8) && ((svga->displine & 15) == (svga->crtc[0x11] & 15)) && svga->vslines) svga->cgastat &= ~8; svga->vslines++; if (svga->displine > 1500) @@ -882,12 +777,11 @@ svga_poll(void *p) if (ret) { if (svga->interlace && svga->oddeven) - svga->ma = svga->maback = (svga->rowoffset << 1) + ((svga->crtc[3] & 0x60) >> 5) + svga->hblank_sub; + svga->ma = svga->maback = (svga->rowoffset << 1) + ((svga->crtc[5] & 0x60) >> 5); else - svga->ma = svga->maback = ((svga->crtc[3] & 0x60) >> 5) + svga->hblank_sub; + svga->ma = svga->maback = ((svga->crtc[5] & 0x60) >> 5); svga->ma = (svga->ma << 2); svga->maback = (svga->maback << 2); - svga->sc = 0; if (svga->attrregs[0x10] & 0x20) { svga->scrollcache = 0; @@ -952,9 +846,9 @@ svga_poll(void *p) svga->vslines = 0; if (svga->interlace && svga->oddeven) - svga->ma = svga->maback = svga->ma_latch + (svga->rowoffset << 1) + ((svga->crtc[3] & 0x60) >> 5) + svga->hblank_sub; + svga->ma = svga->maback = svga->ma_latch + (svga->rowoffset << 1) + ((svga->crtc[5] & 0x60) >> 5); else - svga->ma = svga->maback = svga->ma_latch + ((svga->crtc[3] & 0x60) >> 5) + svga->hblank_sub; + svga->ma = svga->maback = svga->ma_latch + ((svga->crtc[5] & 0x60) >> 5); svga->ca = ((svga->crtc[0xe] << 8) | svga->crtc[0xf]) + ((svga->crtc[0xb] & 0x60) >> 5) + svga->ca_adj; svga->ma = (svga->ma << 2); @@ -964,7 +858,6 @@ svga_poll(void *p) if (svga->vsync_callback) svga->vsync_callback(svga); } - // if (svga->vc == lines_num) { if (svga->vc == svga->vtotal) { svga->vc = 0; svga->sc = 0; @@ -1084,7 +977,6 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize, svga->ramdac_type = RAMDAC_6BIT; svga->map8 = svga->pallook; - svga->hblank_overscan = 1; /* Do at least 1 character of overscan after horizontal blanking. */ return 0; } diff --git a/src/video/vid_table.c b/src/video/vid_table.c index e5cd12f9a..32865df01 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -112,8 +112,6 @@ video_cards[] = { { "tvga9000b", &tvga9000b_device }, { "tgkorvga", &et4000k_isa_device }, { "et2000", &et2000_device }, - { "et3000ax", &et3000_isa_device }, - { "et4000ax_tc6058af", &et4000_tc6058af_isa_device }, { "et4000ax", &et4000_isa_device }, { "et4000w32", &et4000w32_device }, { "et4000w32i", &et4000w32i_isa_device }, diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 068562028..bdc3d1246 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -744,7 +744,6 @@ VIDOBJ := video.o \ vid_bt48x_ramdac.o \ vid_av9194.o vid_icd2061.o vid_ics2494.o vid_ics2595.o \ vid_cl54xx.o \ - vid_et3000.o \ vid_et4000.o vid_sc1148x_ramdac.o \ vid_sc1502x_ramdac.o \ vid_et4000w32.o vid_stg_ramdac.o \ From 3e70c7e98a2cceed896cdde62bab59651290664b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 13 Nov 2021 17:33:43 -0500 Subject: [PATCH 099/159] Trivial fixes and cleanups for serial & parallel --- src/config.c | 10 +++++----- src/device/serial.c | 16 ++-------------- src/include/86box/config.h | 4 ++-- src/include/86box/serial.h | 4 +++- src/machine/m_pcjr.c | 2 +- src/machine/m_xt_zenith.c | 2 +- 6 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/config.c b/src/config.c index 0bd8dbfe3..872ed41a2 100644 --- a/src/config.c +++ b/src/config.c @@ -1042,12 +1042,12 @@ load_ports(void) char temp[512]; int c, d; - for (c = 0; c < 4; c++) { + for (c = 0; c < SERIAL_MAX; c++) { sprintf(temp, "serial%d_enabled", c + 1); serial_enabled[c] = !!config_get_int(cat, temp, (c >= 2) ? 0 : 1); } - for (c = 0; c < 3; c++) { + for (c = 0; c < PARALLEL_MAX; c++) { sprintf(temp, "lpt%d_enabled", c + 1); lpt_ports[c].enabled = !!config_get_int(cat, temp, (c == 0) ? 1 : 0); @@ -1059,7 +1059,7 @@ load_ports(void) /* Legacy config compatibility. */ d = config_get_int(cat, "lpt_enabled", 2); if (d < 2) { - for (c = 0; c < 3; c++) + for (c = 0; c < PARALLEL_MAX; c++) lpt_ports[c].enabled = d; } config_delete_var(cat, "lpt_enabled"); @@ -2512,7 +2512,7 @@ save_ports(void) char temp[512]; int c, d; - for (c = 0; c < 4; c++) { + for (c = 0; c < SERIAL_MAX; c++) { sprintf(temp, "serial%d_enabled", c + 1); if (((c < 2) && serial_enabled[c]) || ((c >= 2) && !serial_enabled[c])) config_delete_var(cat, temp); @@ -2520,7 +2520,7 @@ save_ports(void) config_set_int(cat, temp, serial_enabled[c]); } - for (c = 0; c < 3; c++) { + for (c = 0; c < PARALLEL_MAX; c++) { sprintf(temp, "lpt%d_enabled", c + 1); d = (c == 0) ? 1 : 0; if (lpt_ports[c].enabled == d) diff --git a/src/device/serial.c b/src/device/serial.c index 3de0c6826..15527fad4 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -717,20 +717,8 @@ serial_set_next_inst(int ni) void serial_standalone_init(void) { - if (next_inst == 0) { - device_add_inst(&i8250_device, 1); - device_add_inst(&i8250_device, 2); - device_add_inst(&i8250_device, 3); - device_add_inst(&i8250_device, 4); - } else if (next_inst == 1) { - device_add_inst(&i8250_device, 2); - device_add_inst(&i8250_device, 3); - device_add_inst(&i8250_device, 4); - } else if (next_inst == 2) { - device_add_inst(&i8250_device, 3); - device_add_inst(&i8250_device, 4); - } else - device_add_inst(&i8250_device, 4); + for ( ; next_inst < 4; ) + device_add_inst(&i8250_device, next_inst + 1); }; diff --git a/src/include/86box/config.h b/src/include/86box/config.h index 549306daa..b630d0c80 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -110,9 +110,9 @@ typedef struct { /* Ports category */ char parallel_devices[3][32]; /* LPT device names */ #ifdef USE_SERIAL_DEVICES - char serial_devices[2][32]; /* Serial device names */ + char serial_devices[4][32]; /* Serial device names */ #endif - int serial_enabled[2], /* Serial ports 1 and 2 enabled */ + int serial_enabled[4], /* Serial ports 1 and 2 enabled */ parallel_enabled[3]; /* LPT1, LPT2, LPT3 enabled */ /* Other peripherals category */ diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 0b6b99aa5..f580f9f9f 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -27,6 +27,8 @@ #define SERIAL_NS16450 2 #define SERIAL_NS16550 3 +#define SERIAL_FIFO_SIZE 16 + /* Default settings for the standard ports. */ #define SERIAL1_ADDR 0x03f8 #define SERIAL1_IRQ 4 @@ -54,7 +56,7 @@ typedef struct serial_s uint8_t rcvr_fifo_pos, xmit_fifo_pos, pad0, pad1, - rcvr_fifo[16], xmit_fifo[16]; + rcvr_fifo[SERIAL_FIFO_SIZE], xmit_fifo[SERIAL_FIFO_SIZE]; pc_timer_t transmit_timer, timeout_timer; double clock_src, transmit_period; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 35ddfe6da..482c26ed6 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -867,7 +867,7 @@ machine_pcjr_init(const machine_t *model) device_add(&fdc_pcjr_device); device_add(&i8250_pcjr_device); - serial_set_next_inst(2); /* So that serial_standalone_init() won't do anything. */ + serial_set_next_inst(MAX_SERIAL); /* So that serial_standalone_init() won't do anything. */ return ret; } diff --git a/src/machine/m_xt_zenith.c b/src/machine/m_xt_zenith.c index 1ca553227..791ebdcd1 100644 --- a/src/machine/m_xt_zenith.c +++ b/src/machine/m_xt_zenith.c @@ -154,7 +154,7 @@ machine_xt_z184_init(const machine_t *model) lpt2_remove(); lpt1_init(0x278); device_add(&i8250_device); - serial_set_next_inst(2); /* So that serial_standalone_init() won't do anything. */ + serial_set_next_inst(MAX_SERIAL); /* So that serial_standalone_init() won't do anything. */ device_add(&cga_device); From bf3767bc4a08c9404daf65bc69a2e4f4634033d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 23:51:03 +0100 Subject: [PATCH 100/159] Make more descriptive help for --lang --- src/86box.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/86box.c b/src/86box.c index 16c4ab4ce..1f38b2e98 100644 --- a/src/86box.c +++ b/src/86box.c @@ -434,7 +434,7 @@ usage: printf("-E or --nographic - forces the old behavior\n"); #endif printf("-F or --fullscreen - start in fullscreen mode\n"); - printf("-G or --lang langid - start the application with the specified language\n"); + printf("-G or --lang langid - start with specified language (e.g. en-US, or system)\n"); #ifdef _WIN32 printf("-H or --hwnd id,hwnd - sends back the main dialog's hwnd\n"); #endif From dfa795b26745ff1512e25403089cae0f3df80aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 23:51:29 +0100 Subject: [PATCH 101/159] Add reverse conversion from string to LCID --- src/include/86box/plat.h | 1 + src/win/win.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 148b396c3..ca116a684 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -123,6 +123,7 @@ extern void plat_resize(int x, int y); extern void plat_vidapi_enable(int enabled); extern void plat_vid_reload_options(void); extern uint32_t plat_language_code(char* langcode); +extern void plat_language_code_r(uint32_t lcid, char* outbuf, int len); /* Resource management. */ extern void set_language(uint32_t id); diff --git a/src/win/win.c b/src/win/win.c index 4c8e7ac27..80708a5ca 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -1221,6 +1221,22 @@ plat_language_code(char* langcode) return lcid; } +/* Converts back the language code to LCID */ +void +plat_language_code_r(uint32_t lcid, char* outbuf, int len) +{ + if (lcid == 0xFFFF) + { + strcpy(outbuf, "system"); + return; + } + + wchar_t buffer[LOCALE_NAME_MAX_LENGTH + 1]; + LCIDToLocaleName(lcid, buffer, LOCALE_NAME_MAX_LENGTH, 0); + + c16stombs(outbuf, buffer, len); +} + void take_screenshot(void) { From 0ba4718fb7c0d4b8902640ff1714c34156079db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 23:52:49 +0100 Subject: [PATCH 102/159] Save config language entry as string instead of hex16 And remove some unnecessary stuff. --- src/config.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 499624f50..bb6427aaa 100644 --- a/src/config.c +++ b/src/config.c @@ -567,7 +567,11 @@ load_general(void) confirm_exit = config_get_int(cat, "confirm_exit", 1); confirm_save = config_get_int(cat, "confirm_save", 1); - lang_id = config_get_hex16(cat, "language", DEFAULT_LANGUAGE); + p = config_get_string(cat, "language", NULL); + if (p != NULL) + { + lang_id = plat_language_code(p); + } #if USE_DISCORD enable_discord = !!config_get_int(cat, "enable_discord", 0); @@ -1995,9 +1999,7 @@ config_load(void) cpu_f = (cpu_family_t *) &cpu_families[0]; cpu = 0; -#ifdef USE_LANGUAGE - plat_langid = 0x0409; -#endif + kbd_req_capture = 0; hide_status_bar = 0; scale = 1; @@ -2207,7 +2209,11 @@ save_general(void) if (lang_id == DEFAULT_LANGUAGE) config_delete_var(cat, "language"); else - config_set_hex16(cat, "language", lang_id); + { + char buffer[512] = {0}; + plat_language_code_r(lang_id, buffer, 511); + config_set_string(cat, "language", buffer); + } #if USE_DISCORD if (enable_discord) From b321679bde26aed423c24ed1cd83411b78ae4f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sat, 13 Nov 2021 23:56:35 +0100 Subject: [PATCH 103/159] Final cleanup --- src/86box.c | 3 --- src/config.c | 2 -- src/win/win.c | 2 -- src/win/win_lang.c | 8 -------- 4 files changed, 15 deletions(-) diff --git a/src/86box.c b/src/86box.c index 1f38b2e98..763d41cd3 100644 --- a/src/86box.c +++ b/src/86box.c @@ -707,17 +707,14 @@ usage: config_load(); /* Load the desired language */ - pclog("lang_init %u, lang_id: %u\n", lang_init, lang_id); if (lang_init) lang_id = lang_init; - pclog("lang_init %u, lang_id: %u\n", lang_init, lang_id); lang_init = lang_id; lang_id = 0; if (lang_init) set_language(lang_init); - pclog("lang_init %u, lang_id: %u\n", lang_init, lang_id); /* All good! */ return(1); } diff --git a/src/config.c b/src/config.c index bb6427aaa..fa6b69d1d 100644 --- a/src/config.c +++ b/src/config.c @@ -2939,8 +2939,6 @@ save_other_removable_devices(void) void config_save(void) { - pclog("config_save"); - save_general(); /* General */ save_machine(); /* Machine */ save_video(); /* Video */ diff --git a/src/win/win.c b/src/win/win.c index 80708a5ca..a6845424c 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -245,7 +245,6 @@ size_t c16stombs(char dst[], const uint16_t src[], int len) int has_language_changed(uint32_t id) { - pclog("has_language_changed? lang_id:%u == id:%u?\n", lang_id, id); return (lang_id != id); } @@ -254,7 +253,6 @@ has_language_changed(uint32_t id) void set_language(uint32_t id) { - pclog("set_language %u, lang_id %u\n", id, lang_id); if (id == 0xFFFF) { set_language(lang_sys); diff --git a/src/win/win_lang.c b/src/win/win_lang.c index 805856b6d..29f5dfe9b 100644 --- a/src/win/win_lang.c +++ b/src/win/win_lang.c @@ -50,7 +50,6 @@ EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLan SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)dispname); SendMessage((HWND)lParam, CB_SETITEMDATA, c, (LPARAM)wIDLanguage); - pclog("widl: %u, langid: %u, c: %u\n", wIDLanguage, lang_id, c); if (wIDLanguage == lang_id) enum_helper = c; c++; @@ -73,10 +72,8 @@ progsett_fill_languages(HWND hdlg) //if no one is selected, then it was 0xFFFF or unsupported language, in either case go with index enum_helper=0 //also start enum index from c=1 EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo); - pclog("enum_helper is %d\n", enum_helper); SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0); - pclog("win_fill_languages\n"); } /* This returns 1 if any variable has changed, 0 if not. */ @@ -109,8 +106,6 @@ progsett_settings_save(void) { /* Language */ set_language(temp_language); - - pclog("done"); /* Update title bar */ update_mouse_msg(); @@ -136,7 +131,6 @@ ProgSettDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) hwndProgSett = hdlg; /* Language */ temp_language = lang_id; - pclog("temp_language is %u\n", lang_id); progsett_fill_languages(hdlg); break; @@ -157,7 +151,6 @@ ProgSettDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG); int index = SendMessage(combo, CB_GETCURSEL, 0, 0); temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0); - pclog("combobox changed -> temp_language = %u", temp_language); } break; @@ -166,7 +159,6 @@ ProgSettDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) int index = progsett_indexof(combo, DEFAULT_LANGUAGE); SendMessage(combo, CB_SETCURSEL, index, 0); temp_language = DEFAULT_LANGUAGE; - pclog("combobox changed -> temp_language = %u", temp_language); break; } default: From 41dccb5f6b48952f4c98f69500fae36f795a4d62 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 13 Nov 2021 18:02:56 -0500 Subject: [PATCH 104/159] EGA also supported 32K lines 194-205 appear to cover the memory window setting. --- src/video/vid_ega.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 61cf87ee0..1e66743ec 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -1168,6 +1168,9 @@ static const device_config_t ega_config[] = { "memory", "Memory size", CONFIG_SELECTION, "", 256, "", { 0 }, { + { + "32 kB", 32 + }, { "64 kB", 64 }, From 1f5322959ab7bba708f2f3dd4a50bd09230b939e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 00:12:49 +0100 Subject: [PATCH 105/159] Declared MAX_SERIAL. --- src/include/86box/serial.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index f580f9f9f..576c0c12e 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -39,6 +39,8 @@ #define SERIAL4_ADDR 0x02e8 #define SERIAL4_IRQ 3 +#define MAX_SERIAL 4 + struct serial_device_s; struct serial_s; From e24da32acf3007966e1076fe3d1c7216e395bf09 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 00:16:09 +0100 Subject: [PATCH 106/159] Moved a code block behind an #ifdef. --- src/86box.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/86box.c b/src/86box.c index 00fc3222c..5efedc238 100644 --- a/src/86box.c +++ b/src/86box.c @@ -749,6 +749,7 @@ pc_init_modules(void) wchar_t temp[512]; char tempc[512]; +#ifdef PRINT_MISSING_MACHINES_AND_VIDEO_CARDS c = m = 0; while (machine_get_internal_name_ex(c) != NULL) { m = machine_available(c); @@ -768,6 +769,7 @@ pc_init_modules(void) pclog("Missing video card: %s\n", tempc); c++; } +#endif pc_log("Scanning for ROM images:\n"); c = m = 0; From d7bc85478336b2904e6346189efd1ab0afce2bf3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 03:06:20 -0300 Subject: [PATCH 107/159] Jenkins: make build chaining more elegant, and add Discord and IRC notifications --- .ci/Jenkinsfile | 55 +++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index f45bdbec5..4dfca4eca 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -15,7 +15,7 @@ * Copyright 2021 RichardG. */ -/* Run this on /script to get all the approvals necessary to sync build numbers across jobs: +/* Run this on /script to get all approvals required to sync build numbers across jobs: def approval = org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.get() approval.approveSignature('staticMethod jenkins.model.Jenkins getInstance') @@ -41,7 +41,7 @@ def windowsBuild() { } def unixBuild() { - sh 'chmod u+x .ci/build.sh && .ci/build.sh' + sh 'chmod u+x .ci/build.sh && exec .ci/build.sh' } def saveArtifacts() { @@ -50,6 +50,12 @@ def saveArtifacts() { def anySuccess = false +def buildChain = { + '86Box': '86Box-Dev', + '86Box-Dev': '86Box-Debug', + '86Box-TestBuildPleaseIgnore': '86Box-TestBuildPleaseIgnore2' +} + pipeline { agent none @@ -62,6 +68,10 @@ pipeline { description: "Used internally to make sure all downstream builds use the same commit. Don't change this.") } + environment { + DISCORD_WEBHOOK_URL = credentials('discord-webhook-url') + } + stages { stage('Build Windows') { steps { @@ -99,32 +109,37 @@ pipeline { post { always { script { - if (env.JOB_BASE_NAME == '86Box-TestBuildPleaseIgnore') { - ["${env.JOB_BASE_NAME}2"].each { - try { - /* Set next build number for this job. */ - def job = Jenkins.instance.getItem(it) - job.nextBuildNumber = env.BUILD_NUMBER as Integer - job.saveNextBuildNumber() - } catch (Exception e) { - println "[!] Could not set next build number for [$it], make sure all the script approvals are in place" - } + if (buildChain[env.JOB_BASE_NAME]) { + def nextJob = buildChain[env.JOB_BASE_NAME] - /* Trigger this job. */ - build propagate: false, - wait: false, - job: it, - parameters: [ - string(name: 'BUILD_TYPE', value: BUILD_TYPE), - string(name: 'BRANCH', value: env.GIT_COMMIT) - ] + try { + /* Set next build number for this job. */ + def job = Jenkins.instance.getItem(nextJob) + job.nextBuildNumber = env.BUILD_NUMBER as Integer + job.saveNextBuildNumber() + } catch (Exception e) { + println "[!] Could not set next build number for [$nextJob], make sure all required script approvals are in place" } + + /* Trigger this job. */ + build propagate: false, + wait: false, + job: nextJob, + parameters: [ + string(name: 'BUILD_TYPE', value: BUILD_TYPE), + string(name: 'BRANCH', value: env.GIT_COMMIT) + ] } if (!anySuccess) { println "[!] Failing build because all build stages failed" currentBuild.result = 'FAILURE' } + + if (!env.JOB_BASE_NAME.contains("TestBuildPleaseIgnore")) { + discordSend webhookURL: DISCORD_WEBHOOK_URL + ircNotify() + } } } } From 2e9d57dcc830c7fcd566ac608f059b3fadf63cad Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 03:07:16 -0300 Subject: [PATCH 108/159] Fix typo in Jenkinsfile --- .ci/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 4dfca4eca..4118da758 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -50,11 +50,11 @@ def saveArtifacts() { def anySuccess = false -def buildChain = { +def buildChain = [ '86Box': '86Box-Dev', '86Box-Dev': '86Box-Debug', '86Box-TestBuildPleaseIgnore': '86Box-TestBuildPleaseIgnore2' -} +] pipeline { agent none From 41bff9f135295f07e0452c73bc8bf83f1bde1744 Mon Sep 17 00:00:00 2001 From: JustinJ553 Date: Sun, 14 Nov 2021 19:33:51 +0800 Subject: [PATCH 109/159] Add more K6/K6-2(+)/K6-III(+) out-of-spec clockrates --- src/cpu/cpu_table.c | 115 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 103 insertions(+), 12 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index e9c050d4f..bb0e04637 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -774,6 +774,9 @@ const cpu_family_t cpu_families[] = { .name = "K6 (Model 7)", .internal_name = "k6_m7", .cpus = (const CPU[]) { + {"100", CPU_K6, fpus_internal, 100000000, 1.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6, fpus_internal, 133333333, 2.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6, fpus_internal, 166666666, 2.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ {"200", CPU_K6, fpus_internal, 200000000, 3.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, {"233", CPU_K6, fpus_internal, 233333333, 3.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, {"266", CPU_K6, fpus_internal, 266666666, 4.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, @@ -786,6 +789,10 @@ const cpu_family_t cpu_families[] = { .name = "K6-2", .internal_name = "k6_2", .cpus = (const CPU[]) { + {"100", CPU_K6_2, fpus_internal, 100000000, 1.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6_2, fpus_internal, 133333333, 2.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_2, fpus_internal, 166666666, 2.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_2, fpus_internal, 200000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ {"233", CPU_K6_2, fpus_internal, 233333333, 3.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, {"266", CPU_K6_2, fpus_internal, 266666666, 4.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, {"300", CPU_K6_2, fpus_internal, 300000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, @@ -808,11 +815,24 @@ const cpu_family_t cpu_families[] = { .name = "K6-2+", .internal_name = "k6_2p", .cpus = (const CPU[]) { - {"450", CPU_K6_2P, fpus_internal, 450000000, 4.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"475", CPU_K6_2P, fpus_internal, 475000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, - {"500", CPU_K6_2P, fpus_internal, 500000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, - {"533", CPU_K6_2P, fpus_internal, 533333333, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, - {"550", CPU_K6_2P, fpus_internal, 550000000, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, + {"100", CPU_K6_2P, fpus_internal, 100000000, 1.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6_2P, fpus_internal, 133333333, 2.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_2P, fpus_internal, 166666666, 2.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_2P, fpus_internal, 200000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ + {"233", CPU_K6_2P, fpus_internal, 233333333, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ + {"266", CPU_K6_2P, fpus_internal, 266666666, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ + {"300", CPU_K6_2P, fpus_internal, 300000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ + {"333", CPU_K6_2P, fpus_internal, 332500000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ + {"350", CPU_K6_2P, fpus_internal, 350000000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ + {"366", CPU_K6_2P, fpus_internal, 366666666, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ + {"380", CPU_K6_2P, fpus_internal, 380000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ + {"400/66", CPU_K6_2P, fpus_internal, 400000000, 6.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ + {"400/100", CPU_K6_2P, fpus_internal, 400000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ + {"450", CPU_K6_2P, fpus_internal, 450000000, 4.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, + {"475", CPU_K6_2P, fpus_internal, 475000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, + {"500", CPU_K6_2P, fpus_internal, 500000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, + {"533", CPU_K6_2P, fpus_internal, 533333333, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, + {"550", CPU_K6_2P, fpus_internal, 550000000, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, {"", 0} } }, { @@ -821,6 +841,17 @@ const cpu_family_t cpu_families[] = { .name = "K6-III", .internal_name = "k6_3", .cpus = (const CPU[]) { + {"100", CPU_K6_3, fpus_internal, 100000000, 1.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6_3, fpus_internal, 133333333, 2.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_3, fpus_internal, 166666666, 2.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_3, fpus_internal, 200000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ + {"233", CPU_K6_3, fpus_internal, 233333333, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ + {"266", CPU_K6_3, fpus_internal, 266666666, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ + {"300", CPU_K6_3, fpus_internal, 300000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ + {"333", CPU_K6_3, fpus_internal, 332500000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ + {"350", CPU_K6_3, fpus_internal, 350000000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ + {"366", CPU_K6_3, fpus_internal, 366666666, 5.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ + {"380", CPU_K6_3, fpus_internal, 380000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ {"400", CPU_K6_3, fpus_internal, 400000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, {"450", CPU_K6_3, fpus_internal, 450000000, 4.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, {"", 0} @@ -832,6 +863,16 @@ const cpu_family_t cpu_families[] = { .internal_name = "k6_3p", .cpus = (const CPU[]) { {"100", CPU_K6_3P, fpus_internal, 100000000, 1.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7, 4, 4, 9}, /* out of spec */ + {"133", CPU_K6_3P, fpus_internal, 133333333, 2.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_3P, fpus_internal, 166666666, 2.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_3P, fpus_internal, 200000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ + {"233", CPU_K6_3P, fpus_internal, 233333333, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ + {"266", CPU_K6_3P, fpus_internal, 266666666, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ + {"300", CPU_K6_3P, fpus_internal, 300000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ + {"333", CPU_K6_3P, fpus_internal, 332500000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ + {"350", CPU_K6_3P, fpus_internal, 350000000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ + {"366", CPU_K6_3P, fpus_internal, 366666666, 5.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ + {"380", CPU_K6_3P, fpus_internal, 380000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ {"400", CPU_K6_3P, fpus_internal, 400000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, {"450", CPU_K6_3P, fpus_internal, 450000000, 4.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, {"475", CPU_K6_3P, fpus_internal, 475000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, @@ -1522,11 +1563,18 @@ static const cpu_legacy_table_t cpus_K56[] = { {"k6_m6", 166666666, 2.5}, {"k6_m6", 200000000, 3.0}, {"k6_m6", 233333333, 3.5}, - {"k6_m7", 200000000, 3.0}, + {"k6_m7", 100000000, 1.5}, + {"k6_m7", 133333333, 2.0}, + {"k6_m7", 166666666, 2.5}, + {"k6_m7", 200000000, 3.0}, {"k6_m7", 233333333, 3.5}, {"k6_m7", 266666666, 4.0}, {"k6_m7", 300000000, 4.5}, - {"k6_2", 233333333, 3.5}, + {"k6_2", 100000000, 1.5}, + {"k6_2", 133333333, 2.0}, + {"k6_2", 166666666, 2.5}, + {"k6_2", 200000000, 3.0}, + {"k6_2", 233333333, 3.5}, {"k6_2", 266666666, 4.0}, {"k6_2", 300000000, 4.5}, {"k6_2", 366666666, 5.5}, @@ -1534,14 +1582,24 @@ static const cpu_legacy_table_t cpus_K56[] = { }; static const cpu_legacy_table_t cpus_K56_SS7[] = { - {"k6_m6", 166666666, 2.5}, + {"k6_m6", 66666666, 1.0}, + {"k6_m6", 100000000, 1.5}, + {"k6_m6", 133333333, 2.0}, + {"k6_m6", 166666666, 2.5}, {"k6_m6", 200000000, 3.0}, {"k6_m6", 233333333, 3.5}, - {"k6_m7", 200000000, 3.0}, + {"k6_m7", 100000000, 1.5}, + {"k6_m7", 133333333, 2.0}, + {"k6_m7", 166666666, 2.5}, + {"k6_m7", 200000000, 3.0}, {"k6_m7", 233333333, 3.5}, {"k6_m7", 266666666, 4.0}, {"k6_m7", 300000000, 4.5}, - {"k6_2", 233333333, 3.5}, + {"k6_2", 100000000, 1.5}, + {"k6_2", 133333333, 2.0}, + {"k6_2", 166666666, 2.5}, + {"k6_2", 200000000, 3.0}, + {"k6_2", 233333333, 3.5}, {"k6_2", 266666666, 4.0}, {"k6_2", 300000000, 3.0}, {"k6_2", 332500000, 3.5}, @@ -1554,15 +1612,48 @@ static const cpu_legacy_table_t cpus_K56_SS7[] = { {"k6_2", 500000000, 5.0}, {"k6_2", 533333333, 5.5}, {"k6_2", 550000000, 5.5}, - {"k6_2p", 450000000, 4.5}, + {"k6_2p", 100000000, 1.5}, + {"k6_2p", 133333333, 2.0}, + {"k6_2p", 166666666, 2.5}, + {"k6_2p", 200000000, 3.0}, + {"k6_2p", 233333333, 3.5}, + {"k6_2p", 266666666, 4.0}, + {"k6_2p", 300000000, 3.0}, + {"k6_2p", 332500000, 3.5}, + {"k6_2p", 350000000, 3.5}, + {"k6_2p", 366666666, 5.5}, + {"k6_2p", 380000000, 4.0}, + {"k6_2p", 400000000, 4.0}, + {"k6_2p", 450000000, 4.5}, {"k6_2p", 475000000, 5.0}, {"k6_2p", 500000000, 5.0}, {"k6_2p", 533333333, 5.5}, {"k6_2p", 550000000, 5.5}, - {"k6_3", 400000000, 4.0}, + {"k6_3", 100000000, 1.5}, + {"k6_3", 133333333, 2.0}, + {"k6_3", 166666666, 2.5}, + {"k6_3", 200000000, 3.0}, + {"k6_3", 233333333, 3.5}, + {"k6_3", 266666666, 4.0}, + {"k6_3", 300000000, 3.0}, + {"k6_3", 332500000, 3.5}, + {"k6_3", 350000000, 3.5}, + {"k6_3", 366666666, 5.5}, + {"k6_3", 380000000, 4.0}, + {"k6_3", 400000000, 4.0}, {"k6_3", 450000000, 4.5}, {"k6_3p", 75000000, 1.5}, {"k6_3p", 100000000, 1.5}, + {"k6_3p", 133333333, 2.0}, + {"k6_3p", 166666666, 2.5}, + {"k6_3p", 200000000, 3.0}, + {"k6_3p", 233333333, 3.5}, + {"k6_3p", 266666666, 4.0}, + {"k6_3p", 300000000, 3.0}, + {"k6_3p", 332500000, 3.5}, + {"k6_3p", 350000000, 3.5}, + {"k6_3p", 366666666, 5.5}, + {"k6_3p", 380000000, 4.0}, {"k6_3p", 400000000, 4.0}, {"k6_3p", 450000000, 4.5}, {"k6_3p", 475000000, 5.0}, From 7c15471a724ae850145a5bc50be5ea184ba36157 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Sun, 14 Nov 2021 08:47:23 -0300 Subject: [PATCH 110/159] Portuguese Brazilian Translation --- src/win/86Box.rc | 3 +- src/win/languages/pt-BR.rc | 995 +++++++++++++++++++++++++++++++++++++ 2 files changed, 997 insertions(+), 1 deletion(-) create mode 100644 src/win/languages/pt-BR.rc diff --git a/src/win/86Box.rc b/src/win/86Box.rc index cb2d306a5..1d3046e47 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -361,4 +361,5 @@ END #include "languages/en-US.rc" -#include "languages/hu-HU.rc" \ No newline at end of file +#include "languages/hu-HU.rc" +#include "languages/pt-BR.rc" \ No newline at end of file diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc new file mode 100644 index 000000000..90cc3ebf1 --- /dev/null +++ b/src/win/languages/pt-BR.rc @@ -0,0 +1,995 @@ +//////////////////////////////////////////////////////////////////////////// +// Portuguese (pt-BR) resources +// +// Translated by Altieres Lima da Silva, 2021 +// + +#ifdef _WIN32 +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN +#pragma code_page(65001) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Ação" + BEGIN + MENUITEM "&Teclado requer captura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "CTRL &direito é o ALT esquerdo", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Reinicialização completa...", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Pausar", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "&Sair...", IDM_ACTION_EXIT + END + POPUP "&Exibir" + BEGIN + MENUITEM "&Ocultar barra de status", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Janela redimensionável", IDM_VID_RESIZE + MENUITEM "&Lembrar tamanho e posição", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "&Renderizador" + BEGIN + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (Núcleo 3.3)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "Especificar as dimensões...", IDM_VID_SPECIFY_DIM + MENUITEM "F&orçar proporção de tela em 4:3", IDM_VID_FORCE43 + POPUP "&Fator de redimensionamento da janela" + BEGIN + MENUITEM "&0,5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1,&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Método de filtragem" + BEGIN + MENUITEM "&Mais próximo", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + END + MENUITEM "Escala Hi&DPI", IDM_VID_HIDPI + MENUITEM "&Idioma de exibição...", IDM_VID_PROG_SETT + MENUITEM SEPARATOR + MENUITEM "&Tela cheia\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Modo de &redimensionamento da tela cheia" + BEGIN + MENUITEM "&Tela cheia esticada", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "Pixel&s quadrados (manter proporção)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Redimensionamento com valores inteiros", IDM_VID_FS_INT + END + POPUP "Configurações E&GA/(S)VGA" + BEGIN + MENUITEM "Monitor VGA &invertido", IDM_VID_INVERT + POPUP "&Tipo de tela VGA" + BEGIN + MENUITEM "&Cor RGB", IDM_VID_GRAY_RGB + MENUITEM "Escala de cinza &RGB", IDM_VID_GRAY_MONO + MENUITEM "Monitor &âmbar", IDM_VID_GRAY_AMBER + MENUITEM "Monitor &verde", IDM_VID_GRAY_GREEN + MENUITEM "Monitor &branco", IDM_VID_GRAY_WHITE + END + POPUP "Tipo de &conversão de escala de cinza" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Média", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "Overscan do CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN + MENUITEM "Alterar contraste para exibição &monocromática", IDM_VID_CGACON + END + MENUITEM "&Mídia", IDM_MEDIA + POPUP "&Ferramentas" + BEGIN + MENUITEM "&Configurações...", IDM_CONFIG + MENUITEM "&Atualizar ícones da barra de status", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "Alterar o &idioma de exibição...", IDM_VID_PROG_SETT +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "Ativar integração com o &Discord", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "Capturar &tela\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "&Ganho de som...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Inicio do rastreamento\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Fim do rastreamento\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Registros" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "Ativar registros da BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Ativar registros do CD-ROM\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Ativar registros do disquete (86F)\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Ativar registros do controlador de disquete\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "Ativar registros da IDE\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Ativar registros da porta serial\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Ativar registros da rede\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Registro de ponto de parada\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "Despejo da RAM de &vídeo\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Ajuda" + BEGIN + MENUITEM "&Documentação...", IDM_DOCS + MENUITEM "&Sobre o 86Box...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Imagem existente...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Gravar", IDM_CASSETTE_RECORD + MENUITEM "&Reproduzir", IDM_CASSETTE_PLAY + MENUITEM "&Rebobinar até o começo", IDM_CASSETTE_REWIND + MENUITEM "&Avançar até o fim", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "E&jetar", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Imagem...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "E&jetar", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Imagem existente...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&xportar para 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "E&jetar", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Sem som", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "&Vazio", IDM_CDROM_EMPTY + MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Imagem", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Imagem existente...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&jetar", IDM_ZIP_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Imagem existente...", IDM_MO_IMAGE_EXISTING + MENUITEM "Imagem existente (&protegida contra escrita)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&jetar", IDM_MO_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "&Taxa de quadro pretendida" + BEGIN + MENUITEM "&Sincronizar com vídeo", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 qps", IDM_VID_GL_FPS_25 + MENUITEM "&30 qps", IDM_VID_GL_FPS_30 + MENUITEM "&50 qps", IDM_VID_GL_FPS_50 + MENUITEM "&60 qps", IDM_VID_GL_FPS_60 + MENUITEM "&75 qps", IDM_VID_GL_FPS_75 + END + MENUITEM "Sincronização &vertical", IDM_VID_GL_VSYNC + MENUITEM "&Selecionar shader...", IDM_VID_GL_SHADER + MENUITEM "&Remover shader", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Alterar idioma de exibição" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 179, 65, 50, 14 + COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS + AUTOCHECKBOX "Use estas configurações como &padrões globais", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8, WS_DISABLED + PUSHBUTTON "&Padrão", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 + LTEXT "Idioma:", 0, 13, 8, 34, 8 +END + +DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Status" +FONT 9, "Segoe UI" +BEGIN + LTEXT "1",IDT_SDEVICE,16,16,180,1000 + LTEXT "1",IDT_STEXT,16,186,180,1000 +END + +DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ganho de som" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,57,7,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,57,24,50,14 + CONTROL "Ganho",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | + TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 + CTEXT "Ganho",IDT_1746,10,7,32,9,SS_CENTERIMAGE +END + +DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Nova imagem de disquete" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,104,65,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,162,65,50,14 + LTEXT "Nome:",IDT_1749,7,6,44,12,SS_CENTERIMAGE + LTEXT "Tamanho:",IDT_1750,7,25,44,12,SS_CENTERIMAGE + LTEXT "Modo RPM:",IDT_1751,7,45,44,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY + COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_CFILE,206,5,13,14 + LTEXT "Progresso:",IDT_1757,7,45,44,12,SS_CENTERIMAGE + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,53,45,166,14 +END + +DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Configurações do 86Box" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,246,235,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,307,235,50,14 + CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 + CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 +END + +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Especifique as dimensões da janela principal" +FONT 9, "Segoe UI" +BEGIN + LTEXT "Largura:",IDT_1709,7,9,24,12 + EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS, 76, 6, 12, 12 + LTEXT "Altura:",IDT_1710,97,9,24,12 + EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166, 6, 12, 12 + CONTROL "Trava nesse tamanho",IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + DEFPUSHBUTTON "OK",IDOK,30,45,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,99,45,50,14 +END + +DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo de máquina:",IDT_1708,7,9,60,10 + COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Máquina:",IDT_1701,7,28,60,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_MACHINE,214,26,46,12 + COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo de CPU:",IDT_1702,7,47,59,10 + COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Veloc.:",IDT_1704,189,47,24,10 + COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "FPU:",IDT_1707,7,66,59,10 + COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Estados de espera:",IDT_1703,7,85,60,10 + EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, + 12,12 + LTEXT "MB",IDT_1705,123,104,10,10 + LTEXT "Memória:",IDT_1706,7,104,30,10 + GROUPBOX "Sincronização de tempo",IDC_TIME_SYNC,7,135,100,56 + CONTROL "Desativada",IDC_RADIO_TS_DISABLED,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 + CONTROL "Ativada (hora local)", IDC_RADIO_TS_LOCAL,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 + CONTROL "Ativada (UTC)", IDC_RADIO_TS_UTC,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 +#ifdef USE_DYNAREC + CONTROL "Recompilador dinâmico",IDC_CHECK_DYNAREC,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 +#endif +END + +DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Vídeo:",IDT_1707,7,9,48,10 + COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_VID,222,7,38,12 + CONTROL "3DFX Voodoo",IDC_CHECK_VOODOO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 + PUSHBUTTON "Configurar",IDC_BUTTON_VOODOO,222,26,38,12 +END + +DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Mouse:",IDT_1709,7,9,57,10 + COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_MOUSE,214,7,46,12 + LTEXT "Joystick:",IDT_1710,7,27,58,10 + COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 + PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 + PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 + PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 +END + +DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Placa de som:",IDT_1711,7,9,59,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_SND,214,7,46,12 + + COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Disp. saída MIDI:",IDT_1712,7,28,59,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_MIDI,214,26,46,12 + + COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Disp. entrada MIDI:",IDT_1713,7,47,59,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_MIDI_IN,214,45,46,12 + + CONTROL "MPU-401 autônomo",IDC_CHECK_MPU401,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_MPU401,214,64,46,12 + + CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_SSI,214,82,46,12 + + CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_CMS,214,100,46,12 + + CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 + PUSHBUTTON "Configurar",IDC_CONFIGURE_GUS,214,118,46,12 + + CONTROL "Usar som FLOAT32",IDC_CHECK_FLOAT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 +END + +DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Tipo de rede:",IDT_1714,7,9,59,10 + COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "Dispositivo PCap:",IDT_1715,7,28,59,10 + COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "Adaptador de rede:",IDT_1716,7,47,59,10 + COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_NET,214,44,46,12 +END + +DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Dispositivo LPT1:",IDT_1717,7,9,61,10 + COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "Dispositivo LPT2:",IDT_1718,7,28,61,10 + COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "Dispositivo LPT3:",IDT_1719,7,47,61,10 + COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + CONTROL "Porta serial 1",IDC_CHECK_SERIAL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 + CONTROL "Porta serial 2",IDC_CHECK_SERIAL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 + CONTROL "Porta serial 3",IDC_CHECK_SERIAL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 + CONTROL "Porta serial 4",IDC_CHECK_SERIAL4,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 + + CONTROL "Porta paralela 1",IDC_CHECK_PARALLEL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 + CONTROL "Porta paralela 2",IDC_CHECK_PARALLEL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 + CONTROL "Porta paralela 3",IDC_CHECK_PARALLEL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 +END + +DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Controlador HD:",IDT_1718,7,9,64,10 + COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_HDC,222,7,38,12 + + LTEXT "Controlador FD:",IDT_1768,7,28,64,10 + COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_FDC,222,26,38,12 + + CONTROL "Controlador IDE terciário",IDC_CHECK_IDE_TER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 + PUSHBUTTON "Configurar",IDC_BUTTON_IDE_TER,222,45,38,12 + + CONTROL "Controlador IDE quaternário",IDC_CHECK_IDE_QUA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Configurar",IDC_BUTTON_IDE_QUA,222,64,38,12 + + GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 + LTEXT "Controlador 1:",IDT_1763,16,102,48,10 + COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_1,213,100,38,12 + LTEXT "Controlador 2:",IDT_1764,16,121,48,10 + COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_2,213,119,38,12 + LTEXT "Controlador 3:",IDT_1765,16,140,48,10 + COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_3,213,138,38,12 + LTEXT "Controlador 4:",IDT_1766,16,159,48,10 + COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_4,213,157,38,12 + + CONTROL "Cassete",IDC_CHECK_CASSETTE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 +END + +DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,92 + LTEXT "Discos rígidos:",IDT_1720,7,7,253,8 + PUSHBUTTON "&Novo...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 + PUSHBUTTON "&Existente...",IDC_BUTTON_HDD_ADD,129,137,62,10 + PUSHBUTTON "&Remover",IDC_BUTTON_HDD_REMOVE,198,137,62,10 + COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Barram.:",IDT_1721,7,119,25,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canal:",IDT_1722,131,119,38,8 + COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,131,119,38,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Adicionar disco rígido" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,55,127,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,112,127,50,14 + EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 + PUSHBUTTON "&Especificar...",IDC_CFILE,167,16,44,12 + EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 + EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 + EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 + EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 + COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Setores:",IDT_1726,154,35,27,10 + LTEXT "Cabeças:",IDT_1727,81,35,29,8 + LTEXT "Cilindros:",IDT_1728,7,35,32,12 + LTEXT "Tamanho (MB):",IDT_1729,7,54,33,8 + LTEXT "Tipo:",IDT_1730,86,54,24,8 + LTEXT "Nome do arquivo:",IDT_1731,7,7,204,9 + COMBOBOX IDC_COMBO_HD_BUS,34,71,58,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Barram.:",IDT_1721,7,73,25,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canal:",IDT_1722,99,73,34,8 + COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,99,73,34,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Formato da imagem:",IDT_1774,7,89,50,15 + COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tamanho do bloco:",IDT_1775,7,107,50,15 + COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Progresso:",IDT_1752,7,7,204,9 + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,7,16,204,12 +END + +DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,60 + LTEXT "Unidades de disquete:",IDT_1737,7,7,253,8 + COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo:",IDT_1738,7,87,24,8 + CONTROL "Turbo",IDC_CHECKTURBO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 + CONTROL "Verificar BPB",IDC_CHECKBPB,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 + + CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,117,253,60 + LTEXT "Unidades de CD-ROM:",IDT_1739,7,107,253,8 + COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Barram.:",IDT_1740,7,187,25,8 + COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1741,131,187,38,8 + COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canal:",IDT_1742,131,187,38,8 + COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Veloc.:",IDT_1758,7,207,24,8 +END + +DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + + CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,17,253,60 + LTEXT "Unidades magneto-ópticas:",IDT_1769,7,7,253,8 + COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Barram.:",IDT_1770,7,87,25,8 + COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1771,131,87,38,8 + COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canal:",IDT_1772,131,87,38,8 + COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo:",IDT_1773,7,107,24,8 + + CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,137,253,60 + LTEXT "Unidades ZIP:",IDT_1759,7,127,253,8 + COMBOBOX IDC_COMBO_ZIP_BUS,33,205,70,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Barram.:",IDT_1753,7,207,26,8 + COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1754,120,207,28,8 + COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canal:",IDT_1755,120,207,28,8 + CONTROL "ZIP 250",IDC_CHECK250,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 +END + +DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "RTC ISA:",IDT_1767,7,9,48,10 + COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_ISARTC,222,7,38,12 + + GROUPBOX "Expansão da memória ISA",IDC_GROUP_ISAMEM,7,28,253,93 + LTEXT "Placa 1:",IDT_1763,16,45,48,10 + COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 + LTEXT "Placa 2:",IDT_1764,16,64,48,10 + COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 + LTEXT "Placa 3:",IDT_1765,16,83,48,10 + COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 + LTEXT "Placa 4:",IDT_1766,16,102,48,10 + COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 + + CONTROL "Dispositivo ISABugger",IDC_CHECK_BUGGER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 + + CONTROL "Placa de diagnóstico",IDC_CHECK_POSTCARD,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 +END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Erro" + IDS_2050 "Erro fatal" + IDS_2051 "" + IDS_2052 "Use CTRL+ALT+PAGE DOWN para retornar ao janela" + IDS_2053 "Velocidade" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "O 86Box não conseguiu encontrar nenhuma imagem de ROM utilizável.\n\nPor favor, baixe um conjunto de ROM e extraia no diretório ""roms""." + IDS_2057 "(vazio)" + IDS_2058 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Todos os arquivos (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Lig." + IDS_2061 "Desl." + IDS_2062 "Todas as imagens (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Imagens de setor básico (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Imagens de superfície (*.86F)\0*.86F\0" + IDS_2063 "A máquina ""%hs"" não está disponível devido à falta de ROMs no diretório roms/machines. Mudando para uma máquina disponível." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "A placa de vídeo ""%hs"" não está disponível devido à falta de ROMs no diretório roms/video. Mudando para uma placa de vídeo disponível." + IDS_2065 "Máquina" + IDS_2066 "Vídeo" + IDS_2067 "Dispositivos de entrada" + IDS_2068 "Som" + IDS_2069 "Rede" + IDS_2070 "Portas (COM & LPT)" + IDS_2071 "Controladores de armaz." + IDS_2072 "Discos rígidos" + IDS_2073 "Disquete & CD-ROM" + IDS_2074 "Dispos. removíveis" + IDS_2075 "Outros periféricos" + IDS_2076 "Imagens de superfície (*.86F)\0*.86F\0" + IDS_2077 "Clique para capturar o mouse" + IDS_2078 "Aperte F8+F12 para liberar o mouse" + IDS_2079 "Aperte F8+F12 ou botão do meio para liberar o mouse" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Não foi possível inicializar o FluidSynth" + IDS_2081 "Barramento" + IDS_2082 "Arquivo" + IDS_2083 "CI" + IDS_2084 "CA" + IDS_2085 "SE" + IDS_2086 "MB" + IDS_2087 "Verificar BPB" + IDS_2088 "KB" + IDS_2089 "Não conseguiu inicializar o renderizador de vídeo." + IDS_2090 "Padrão" + IDS_2091 "%i estado(s) de espera" + IDS_2092 "Tipo" + IDS_2093 "Não foi possível configurar o PCap" + IDS_2094 "Nenhum dispositivo PCap encontrado" + IDS_2095 "Dispositivo PCap inválido" + IDS_2096 "Joystick padrão de 2 botões" + IDS_2097 "Joystick padrão de 4 botões" + IDS_2098 "Joystick padrão de 6 botões" + IDS_2099 "Joystick padrão de 8 botões" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Nada" + IDS_2104 "Não foi possível carregar os aceleradores do teclado." + IDS_2105 "Não foi possível registrar a entrada bruta." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Disquete %i (%s): %ls" + IDS_2109 "Todas as imagens (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Imagens de setor avançado (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagens de setor básico (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Imagens de fluxo (*.FDI)\0*.FDI\0Imagens de superfície (*.86F;*.MFM)\0*.86F;*.MFM\0Todos os arquivos (*.*)\0*.*\0" + IDS_2110 "Não foi possível inicializar o FreeType" + IDS_2111 "Não é possível inicializar o SDL, é necessário o SDL2.dll" + IDS_2112 "Tem certeza de que deseja reiniciar completamente a máquina emulada?" + IDS_2113 "Tem certeza de que deseja sair do 86Box?" + IDS_2114 "Não é possível inicializar o Ghostscript" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" + IDS_2117 "Bem-vindo ao 86Box!" + IDS_2118 "Controle interno" + IDS_2119 "Sair" + IDS_2120 "Nenhum ROM encontrada" + IDS_2121 "Você deseja salvar as configurações?" + IDS_2122 "Isto fará com que a máquina emulada seja reinicializada." + IDS_2123 "Salvar" + IDS_2124 "Sobre o 86Box" + IDS_2125 "86Box versão" EMU_VERSION + IDS_2126 "Um emulador de computadores antigos:\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\nLançado sob a Licença Pública Geral GNU versão 2. Veja o arquivo LICENSE para mais informações." + /* + Here uncomment following line and add your name like "Translated by: \n\n". + If such a line exists with name of previous translators, don't erase their name, just add yours to the end of line. + */ + "Traduzido por: Altieres Lima da Silva\n\n" + + "Lançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENÇA para mais informações." + + IDS_2127 "OK" + IDS_2128 "Hardware não disponível" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Certifique-se de que " LIB_NAME_PCAP " esteja instalado e que você tenha uma " LIB_NAME_PCAP " -conexão de rede compatível." + IDS_2130 "Configuração inválida" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " é necessário para emulação de impressora ESC/P." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " é necessário para a conversão automática de arquivos PostScript para PDF.\n\nQualquer documento enviado para a impressora genérica PostScript será salvo como arquivos PostScript (.ps)." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " é necessário para a saída MIDI FluidSynth." + IDS_2134 "Entrando no modo de tela cheia" + IDS_2135 "Não exibir esta mensagem novamente" + IDS_2136 "Não sair" + IDS_2137 "Reiniciar" + IDS_2138 "Não reiniciar" + IDS_2139 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" + IDS_2140 "Imagens de CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Todos os arquivos (*.*)\0*.*\0" + IDS_2141 "Configuração do dispositivo %hs" + IDS_2142 "Monitor em modo de suspensão" + IDS_2143 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Todos os arquivos (*.*)\0*.*\0" + IDS_2144 "Opções do OpenGL" + IDS_2145 "Você está carregando uma configuração não suportada" + IDS_2146 "A filtragem do tipo CPU baseada na máquina selecionada é desativada para esta máquina emulada.\n\nIsto torna possível escolher uma CPU que de outra forma seria incompatível com a máquina selecionada. Entretanto, você pode encontrar incompatibilidades com a BIOS da máquina ou outro software.\n\nA ativação desta configuração não é oficialmente suportada e qualquer relatório de erro arquivado pode ser fechado como inválido." + IDS_2147 "Continuar" + IDS_2148 "Cassete: %s" + IDS_2149 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os arquivos (*.*)\0*.*\0" + IDS_2150 "Cartucho %i: %ls" + IDS_2151 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os arquivos (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Disco rígido (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "As unidades de CD-ROM MFM/RLL ou ESDI nunca existiram" + IDS_4100 "Personalizado..." + IDS_4101 "Personalizado (grande)..." + IDS_4102 "Adicionar novo disco rígido" + IDS_4103 "Adicionar disco rígido existente" + IDS_4104 "As imagens de disco HDI não podem ser maiores do que 4GB." + IDS_4105 "As imagens de disco não podem ser maiores do que 127GB." + IDS_4106 "Imagens de disco rígido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Todos os arquivos (*.*)\0*.*\0" + IDS_4107 "Não foi possível ler o arquivo" + IDS_4108 "Não foi possível escrever o arquivo" + IDS_4109 "Imagens HDI ou HDX com um tamanho de setor que não seja 512 não são suportadas." + IDS_4110 "O USB ainda não é suportado" + IDS_4111 "Esta imagem existe" + IDS_4112 "Digite um nome de arquivo válido." + IDS_4113 "A imagem foi criada com sucesso" + IDS_4114 "Certifique-se de que o arquivo existe e é legível." + IDS_4115 "Certifique-se de que o arquivo está sendo salvo em um diretório gravável." + IDS_4116 "A imagem do disco é muito grande" + IDS_4117 "Lembre-se de particionar e formatar a unidade recém-criada." + IDS_4118 "O arquivo selecionado será sobrescrito. Você tem certeza de que deseja usá-lo?" + IDS_4119 "Imagem de disco sem suporte" + IDS_4120 "Sobrescrever" + IDS_4121 "Não sobrescrever" + IDS_4122 "Imagem bruta (.img)" + IDS_4123 "Imagem HDI (.hdi)" + IDS_4124 "Imagem HDX (.hdx)" + IDS_4125 "VHD de tamanho fixo (.vhd)" + IDS_4126 "VHD de tamanho dinâmico (.vhd)" + IDS_4127 "VHD diferencial (.vhd)" + IDS_4128 "Blocos grandes (2 MB)" + IDS_4129 "Blocos pequenos (512 KB)" + IDS_4130 "Arquivos VHD (*.VHD)\0*.VHD\0Todos os arquivos (*.*)\0*.*\0" + IDS_4131 "Selecione o VHD pai" + IDS_4132 "Isto pode significar que a imagem de origem foi modificada após a criação da imagem diferencial.\n\nTambém pode acontecer caso os arquivos de imagem tenham sido movidos ou copiados, ou por um erro no programa que criou este disco.\n\nVocê quer consertar os marcadores de tempo?" + IDS_4133 "A data/hora dos arquivos de pais e filhos não correspondem" + IDS_4134 "Não foi possível consertar o carimbo de data/hora da VHD." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Desativado" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Desativado" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3.5"" 1.3Gb M.O. (GigaMO)" + IDS_5907 "3.5"" 2.3Gb M.O. (GigaMO 2)" + IDS_5908 "5.25"" 600Mb M.O." + IDS_5909 "5.25"" 650Mb M.O." + IDS_5910 "5.25"" 1Gb M.O." + IDS_5911 "5.25"" 1.3Gb M.O." + + IDS_6144 "RPM perfeita" + IDS_6145 "1%% abaixo das RPM perfeita" + IDS_6146 "1.5%% abaixo das RPM perfeita" + IDS_6147 "2%% abaixo das RPM perfeita" + + IDS_7168 "Português (Brasil)" +END +#define IDS_LANG_ENUS IDS_7168 + +// Portuguese (pt-BR) resources +///////////////////////////////////////////////////////////////////////////// \ No newline at end of file From 0ade5e539e0a056d06dc52a09b7b0df38fb0ae91 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Sun, 14 Nov 2021 08:59:40 -0300 Subject: [PATCH 111/159] Update pt-BR.rc --- src/win/languages/pt-BR.rc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 90cc3ebf1..6053fde30 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -834,15 +834,18 @@ BEGIN IDS_2123 "Salvar" IDS_2124 "Sobre o 86Box" IDS_2125 "86Box versão" EMU_VERSION - IDS_2126 "Um emulador de computadores antigos:\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\nLançado sob a Licença Pública Geral GNU versão 2. Veja o arquivo LICENSE para mais informações." + IDS_2126 "Um emulador de computadores antigos\n\n" + + "Autores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\n" + /* Here uncomment following line and add your name like "Translated by: \n\n". If such a line exists with name of previous translators, don't erase their name, just add yours to the end of line. */ - "Traduzido por: Altieres Lima da Silva\n\n" - "Lançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENÇA para mais informações." + "Traduzido por: Altieres Lima da Silva\n\n" + "Lançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." IDS_2127 "OK" IDS_2128 "Hardware não disponível" #ifdef _WIN32 From 1586cf6f577a007fe09a5d8bcc539482ab7d6db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sun, 14 Nov 2021 15:00:55 +0100 Subject: [PATCH 112/159] Fix some Linux/Mac compile breaking stuff --- src/chipset/CMakeLists.txt | 2 +- src/unix/unix.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index ce5bded9a..050db7519 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -14,7 +14,7 @@ # add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1489.c ali1531.c ali1541.c ali1543.c - ali1621.c ali6117.c headland.c intel_82335.c contaq_82c59x.c cs4031.c intel_420ex.c + ali1621.c ali6117.c headland.c ims8848.c intel_82335.c contaq_82c59x.c cs4031.c intel_420ex.c intel_4x0.c intel_i450kx.c intel_sio.c intel_piix.c ../ioapic.c neat.c opti283.c opti291.c opti391.c opti495.c opti822.c opti895.c opti5x7.c scamp.c scat.c sis_85c310.c sis_85c4xx.c sis_85c496.c sis_85c50x.c sis_5511.c sis_5571.c via_vt82c49x.c via_vt82c505.c sis_85c310.c diff --git a/src/unix/unix.c b/src/unix/unix.c index 4a15dbfb7..ae786f8ad 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -50,6 +50,7 @@ SDL_mutex *blitmtx; SDL_threadID eventthread; static int exit_event = 0; static int fullscreen_pending = 0; +uint32_t lang_id = 0x0409, lang_sys = 0x0409; // Multilangual UI variables, for now all set to LCID of en-US static const uint16_t sdl_to_xt[0x200] = { @@ -1235,6 +1236,15 @@ uint32_t plat_language_code(char* langcode) return 0; } +/* Converts back the language code to LCID */ +void +plat_language_code_r(uint32_t lcid, char* outbuf, int len) +{ + /* or maybe not */ + return; +} + + void joystick_init(void) {} void joystick_close(void) {} void joystick_process(void) {} From fa1d0580557f3d92b767e8b0c42e4ec9d9eecbf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sun, 14 Nov 2021 15:14:33 +0100 Subject: [PATCH 113/159] Also add a fix to pt-BR to properly name (System Language) --- src/win/languages/pt-BR.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 6053fde30..a3f1e15bc 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -990,7 +990,7 @@ BEGIN IDS_6146 "1.5%% abaixo das RPM perfeita" IDS_6147 "2%% abaixo das RPM perfeita" - IDS_7168 "Português (Brasil)" + IDS_7168 "(Sistema padrão)" END #define IDS_LANG_ENUS IDS_7168 From 23f8d9cf15230d6ef1b589bc42bb5d27a63e6b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sun, 14 Nov 2021 15:40:53 +0100 Subject: [PATCH 114/159] Correct the translation fix in pt-BR --- src/win/languages/pt-BR.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index a3f1e15bc..746a69bb0 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -990,7 +990,7 @@ BEGIN IDS_6146 "1.5%% abaixo das RPM perfeita" IDS_6147 "2%% abaixo das RPM perfeita" - IDS_7168 "(Sistema padrão)" + IDS_7168 "(Padrão do sistema)" END #define IDS_LANG_ENUS IDS_7168 From c0e476340b02f28debf0dc19b9f4df8caddc47ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laci=20b=C3=A1?= Date: Sun, 14 Nov 2021 16:19:07 +0100 Subject: [PATCH 115/159] Fix the description of win_lang.c --- src/win/win_lang.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/win_lang.c b/src/win/win_lang.c index 29f5dfe9b..5f79e8c61 100644 --- a/src/win/win_lang.c +++ b/src/win/win_lang.c @@ -6,7 +6,7 @@ * * This file is part of the 86Box distribution. * - * Handle the dialog for specifying the dimensions of the main window. + * Handle the dialog for changing the program's language. * * * From 3fa3541f109fee4b892d3f53ebcf4ceaf9253b9d Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 13:35:36 -0300 Subject: [PATCH 116/159] Add dev builds with old dynarec as requested --- .ci/Jenkinsfile | 3 ++- .ci/build.sh | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 4118da758..5243d4d6b 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -52,7 +52,8 @@ def anySuccess = false def buildChain = [ '86Box': '86Box-Dev', - '86Box-Dev': '86Box-Debug', + '86Box-Dev': '86Box-DevODR', + '86Box-DevODR': '86Box-Debug', '86Box-TestBuildPleaseIgnore': '86Box-TestBuildPleaseIgnore2' ] diff --git a/.ci/build.sh b/.ci/build.sh index e441d2242..24738fbfb 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -544,16 +544,32 @@ case $JOB_BASE_NAME in $project-Dev) if is_windows then - build 32 --preset=experimental -D VNC=OFF - build 64 --preset=experimental -D VNC=OFF + build 32 --preset=experimental -D NEW_DYNAREC=ON -D VNC=OFF + build 64 --preset=experimental -D NEW_DYNAREC=ON -D VNC=OFF elif is_mac then - build Universal --preset=experimental -D VNC=OFF + build Universal --preset=experimental -D NEW_DYNAREC=ON -D VNC=OFF else - build x86 --preset=experimental -D VNC=OFF - build x86_64 --preset=experimental -D VNC=OFF - build arm32 --preset=experimental -D VNC=OFF - build arm64 --preset=experimental -D VNC=OFF + build x86 --preset=experimental -D NEW_DYNAREC=ON -D VNC=OFF + build x86_64 --preset=experimental -D NEW_DYNAREC=ON -D VNC=OFF + build arm32 --preset=experimental -D NEW_DYNAREC=ON -D VNC=OFF + build arm64 --preset=experimental -D NEW_DYNAREC=ON -D VNC=OFF + fi + ;; + + $project-DevODR) + if is_windows + then + build 32 --preset=experimental -D NEW_DYNAREC=OFF -D VNC=OFF + build 64 --preset=experimental -D NEW_DYNAREC=OFF -D VNC=OFF + elif is_mac + then + build Universal --preset=experimental -D NEW_DYNAREC=OFF -D VNC=OFF + else + build x86 --preset=experimental -D NEW_DYNAREC=OFF -D VNC=OFF + build x86_64 --preset=experimental -D NEW_DYNAREC=OFF -D VNC=OFF + build arm32 --preset=experimental -D NEW_DYNAREC=OFF -D VNC=OFF + build arm64 --preset=experimental -D NEW_DYNAREC=OFF -D VNC=OFF fi ;; From 33e56c4dd9721185453fbed5e0a02bf37cd866df Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 14:28:22 -0300 Subject: [PATCH 117/159] Merge machine table changes from local branch --- src/include/86box/machine.h | 28 ++++++------ src/machine/m_at_slot1.c | 7 +++ src/machine/m_at_socket4.c | 8 ++-- src/machine/m_at_socket5.c | 34 --------------- src/machine/m_at_socket7.c | 12 ++--- src/machine/m_at_socket7_3v.c | 82 +++++++++++++++++++++++------------ src/machine/m_at_socket8.c | 2 +- src/machine/machine_table.c | 60 ++++++++++++------------- 8 files changed, 117 insertions(+), 116 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 2767789b3..5f969aa44 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -408,7 +408,7 @@ extern void machine_at_award_common_init(const machine_t *); extern void machine_at_sp4_common_init(const machine_t *model); -extern int machine_at_excalibur_pci_init(const machine_t *); +extern int machine_at_excaliburpci_init(const machine_t *); extern int machine_at_p5mp3_init(const machine_t *); extern int machine_at_dellxp60_init(const machine_t *); extern int machine_at_opti560l_init(const machine_t *); @@ -422,7 +422,7 @@ extern int machine_at_excalibur_init(const machine_t *); extern int machine_at_p5vl_init(const machine_t *); -extern int machine_at_excalibur_pci_2_init(const machine_t *); +extern int machine_at_excaliburpci2_init(const machine_t *); extern int machine_at_p5sp4_init(const machine_t *); #ifdef EMU_DEVICE_H @@ -437,7 +437,6 @@ extern int machine_at_430nx_init(const machine_t *); extern int machine_at_acerv30_init(const machine_t *); extern int machine_at_apollo_init(const machine_t *); extern int machine_at_exp8551_init(const machine_t *); -extern int machine_at_vectra54_init(const machine_t *); extern int machine_at_zappa_init(const machine_t *); extern int machine_at_powermatev_init(const machine_t *); extern int machine_at_mb500n_init(const machine_t *); @@ -450,13 +449,10 @@ extern int machine_at_hot543_init(const machine_t *); extern int machine_at_p54sp4_init(const machine_t *); extern int machine_at_sq588_init(const machine_t *); -#ifdef EMU_DEVICE_H -#define at_vectra54_get_device at_endeavor_get_device -#endif /* m_at_socket7_3v.c */ extern int machine_at_p54tp4xe_init(const machine_t *); -extern int machine_at_mr586_init(const machine_t *); +extern int machine_at_p54tp4xe_mr_init(const machine_t *); extern int machine_at_gw2katx_init(const machine_t *); extern int machine_at_thor_init(const machine_t *); extern int machine_at_mrthor_init(const machine_t *); @@ -474,9 +470,11 @@ extern int machine_at_p5vxb_init(const machine_t *); extern int machine_at_gw2kte_init(const machine_t *); extern int machine_at_ap5s_init(const machine_t *); +extern int machine_at_vectra54_init(const machine_t *); #ifdef EMU_DEVICE_H extern const device_t *at_endeavor_get_device(void); +#define at_vectra54_get_device at_endeavor_get_device extern const device_t *at_thor_get_device(void); #define at_mrthor_get_device at_thor_get_device extern const device_t *at_pb640_get_device(void); @@ -488,7 +486,7 @@ extern int machine_at_p55t2p4_init(const machine_t *); extern int machine_at_m7shi_init(const machine_t *); extern int machine_at_tc430hx_init(const machine_t *); extern int machine_at_equium5200_init(const machine_t *); -extern int machine_at_pcv240_init(const machine_t *); +extern int machine_at_pcv90_init(const machine_t *); extern int machine_at_p65up5_cp55t2d_init(const machine_t *); extern int machine_at_ap5vm_init(const machine_t *); @@ -546,7 +544,7 @@ extern int machine_at_v60n_init(const machine_t *); extern int machine_at_vs440fx_init(const machine_t *); extern int machine_at_ap440fx_init(const machine_t *); extern int machine_at_mb600n_init(const machine_t *); -extern int machine_at_8500ttc_init(const machine_t *); +extern int machine_at_8600ttc_init(const machine_t *); extern int machine_at_m6mi_init(const machine_t *); #ifdef EMU_DEVICE_H extern void machine_at_p65up5_common_init(const machine_t *, const device_t *northbridge); @@ -570,7 +568,7 @@ extern int machine_at_bf6_init(const machine_t *); extern int machine_at_ax6bc_init(const machine_t *); extern int machine_at_atc6310bxii_init(const machine_t *); extern int machine_at_686bx_init(const machine_t *); -extern int machine_at_tsunamiatx_init(const machine_t *); +extern int machine_at_s1846_init(const machine_t *); extern int machine_at_p6sba_init(const machine_t *); extern int machine_at_ficka6130_init(const machine_t *); extern int machine_at_p3v133_init(const machine_t *); @@ -582,7 +580,11 @@ extern int machine_at_borapro_init(const machine_t *); extern int machine_at_ms6168_init(const machine_t *); #ifdef EMU_DEVICE_H -extern const device_t *at_tsunamiatx_get_device(void); +extern const device_t *at_s1846_get_device(void); +#define at_s1857_get_device at_s1846_get_device +#define at_gt694va_get_device at_s1846_get_device +extern const device_t *at_ms6168_get_device(void); +#define at_borapro_get_device at_ms6168_get_device #endif /* m_at_slot2.c */ @@ -597,13 +599,13 @@ extern int machine_at_cubx_init(const machine_t *); extern int machine_at_atc7020bxii_init(const machine_t *); extern int machine_at_ambx133_init(const machine_t *); extern int machine_at_awo671r_init(const machine_t *); -extern int machine_at_63a_init(const machine_t *); +extern int machine_at_63a1_init(const machine_t *); extern int machine_at_s370sba_init(const machine_t *); extern int machine_at_apas3_init(const machine_t *); extern int machine_at_gt694va_init(const machine_t *); extern int machine_at_cuv4xls_init(const machine_t *); extern int machine_at_6via90ap_init(const machine_t *); -extern int machine_at_trinity371_init(const machine_t *); +extern int machine_at_s1857_init(const machine_t *); extern int machine_at_p6bap_init(const machine_t *); /* m_at_misc.c */ diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index feb0a1081..9c286ec79 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -659,6 +659,13 @@ machine_at_ms6168_common_init(const machine_t *model) } +const device_t * +at_ms6168_get_device(void) +{ + return &voodoo_3_2000_agp_onboard_8m_device; +} + + int machine_at_borapro_init(const machine_t *model) { diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 7e8dd9232..30b76cf7a 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -112,11 +112,11 @@ machine_at_sp4_common_init(const machine_t *model) int -machine_at_excalibur_pci_init(const machine_t *model) +machine_at_excaliburpci_init(const machine_t *model) { int ret; - ret = bios_load_linear_inverted("roms/machines/excalibur_pci/S701P.ROM", + ret = bios_load_linear_inverted("roms/machines/excaliburpci/S701P.ROM", 0x000e0000, 131072, 0); if (bios_only || !ret) @@ -423,11 +423,11 @@ machine_at_p5vl_init(const machine_t *model) int -machine_at_excalibur_pci_2_init(const machine_t *model) +machine_at_excaliburpci2_init(const machine_t *model) { int ret; - ret = bios_load_linear_inverted("roms/machines/excalibur_pci-2/S722P.ROM", + ret = bios_load_linear_inverted("roms/machines/excaliburpci2/S722P.ROM", 0x000e0000, 131072, 0); if (bios_only || !ret) diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 2748210e0..f987bd7ab 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -194,40 +194,6 @@ machine_at_exp8551_init(const machine_t *model) } -int -machine_at_vectra54_init(const machine_t *model) -{ - int ret; - - ret = bios_load_linear("roms/machines/vectra54/GT0724.22", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_at_common_init_ex(model, 2); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); - pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); - - if (gfxcard == VID_INTERNAL) - device_add(&s3_phoenix_trio64_onboard_pci_device); - - device_add(&keyboard_ps2_ami_pci_device); - device_add(&i430fx_device); - device_add(&piix_device); - device_add(&fdc37c931apm_device); - device_add(&sst_flash_29ee010_device); - - return ret; -} - - int machine_at_zappa_init(const machine_t *model) { diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index d9e9b7cd1..70865044f 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -246,15 +246,15 @@ machine_at_equium5200_init(const machine_t *model) int -machine_at_pcv240_init(const machine_t *model) +machine_at_pcv90_init(const machine_t *model) { int ret; - ret = bios_load_linear_combined2("roms/machines/pcv240/1010DD04.BIO", - "roms/machines/pcv240/1010DD04.BI1", - "roms/machines/pcv240/1010DD04.BI2", - "roms/machines/pcv240/1010DD04.BI3", - "roms/machines/pcv240/1010DD04.RCV", + ret = bios_load_linear_combined2("roms/machines/pcv90/1010DD04.BIO", + "roms/machines/pcv90/1010DD04.BI1", + "roms/machines/pcv90/1010DD04.BI2", + "roms/machines/pcv90/1010DD04.BI3", + "roms/machines/pcv90/1010DD04.RCV", 0x3a000, 128); if (bios_only || !ret) diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 5ee87fc44..87185ad53 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -72,20 +72,11 @@ machine_at_thor_common_init(const machine_t *model, int mr) } -int -machine_at_p54tp4xe_init(const machine_t *model) +static void +machine_at_p54tp4xe_common_init(const machine_t *model) { - int ret; - - ret = bios_load_linear("roms/machines/p54tp4xe/t15i0302.awd", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - machine_at_common_init(model); - /* Award BIOS, SMC FDC37C665. */ pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); @@ -98,37 +89,38 @@ machine_at_p54tp4xe_init(const machine_t *model) device_add(&piix_device); device_add(&fdc37c665_device); device_add(&intel_flash_bxt_device); +} + + +int +machine_at_p54tp4xe_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/p54tp4xe/t15i0302.awd", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_p54tp4xe_common_init(model); return ret; } int -machine_at_mr586_init(const machine_t *model) +machine_at_p54tp4xe_mr_init(const machine_t *model) { int ret; - ret = bios_load_linear("roms/machines/mr586/TRITON.BIO", + ret = bios_load_linear("roms/machines/p54tp4xe_mr/TRITON.BIO", 0x000e0000, 131072, 0); if (bios_only || !ret) return ret; - machine_at_common_init(model); - - pci_init(PCI_CONFIG_TYPE_1); - pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); - - device_add(&i430fx_device); - device_add(&piix_device); - device_add(&keyboard_ps2_ami_pci_device); - device_add(&fdc37c665_device); - device_add(&intel_flash_bxt_device); + machine_at_p54tp4xe_common_init(model); return ret; } @@ -552,3 +544,37 @@ machine_at_ap5s_init(const machine_t *model) return ret; } + + +int +machine_at_vectra54_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/vectra54/GT0724.22", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + + if (gfxcard == VID_INTERNAL) + device_add(&s3_phoenix_trio64_onboard_pci_device); + + device_add(&keyboard_ps2_ami_pci_device); + device_add(&i430fx_device); + device_add(&piix_device); + device_add(&fdc37c931apm_device); + device_add(&sst_flash_29ee010_device); + + return ret; +} diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 52a2212cc..109a7926f 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -236,7 +236,7 @@ machine_at_8600ttc_init(const machine_t *model) { int ret; - ret = bios_load_linear("roms/machines/8500ttc/TTC0715B.ROM", + ret = bios_load_linear("roms/machines/8600ttc/TTC0715B.ROM", 0x000e0000, 131072, 0); if (bios_only || !ret) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 5077b3ea3..250661934 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -451,18 +451,18 @@ const machine_t machines[] = { of type 'H'. */ { "[SiS 496] Zida Tomato 4DP", "4dps", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 261120, 1024, 255, machine_at_4dps_init, NULL }, /* This has the UMC 88xx on-chip KBC. */ - { "[UMC 888x] A-Trend ATC-1415", "atc1415", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 65536, 1024, 255, machine_at_atc1415_init, NULL }, + { "[UMC 8881] A-Trend ATC-1415", "atc1415", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 65536, 1024, 255, machine_at_atc1415_init, NULL }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ - { "[UMC 888x] ECS Elite UM8810PAIO", "ecs486", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_ecs486_init, NULL }, + { "[UMC 8881] ECS Elite UM8810PAIO", "ecs486", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_ecs486_init, NULL }, /* Has AMIKey Z(!) KBC firmware. */ - { "[UMC 888x] Epson Action PC 2600", "actionpc2600", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 262144, 1024, 255, machine_at_actionpc2600_init, NULL }, + { "[UMC 8881] Epson Action PC 2600", "actionpc2600", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 262144, 1024, 255, machine_at_actionpc2600_init, NULL }, /* This has the UMC 88xx on-chip KBC. All the copies of the BIOS string I can find, end in in -H, so the UMC on-chip KBC likely emulates the AMI 'H' KBC firmware. */ - { "[UMC 888x] PC Chips M919", "m919", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_VLB | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_m919_init, NULL }, + { "[UMC 8881] PC Chips M919", "m919", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_VLB | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_m919_init, NULL }, /* Has IBM PS/2 Type 1 KBC firmware. Uses a mysterious I/O port C05. */ - { "[UMC 888x] Samsung SPC7700P-LW", "spc7700p-lw", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_spc7700p_lw_init, NULL }, + { "[UMC 8881] Samsung SPC7700P-LW", "spc7700p-lw", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_spc7700p_lw_init, NULL }, /* This has a Holtek KBC. */ - { "[UMC 888x] Shuttle HOT-433A", "hot433", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 262144, 1024, 255, machine_at_hot433_init, NULL }, + { "[UMC 8881] Shuttle HOT-433A", "hot433", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCI | MACHINE_IDE_DUAL, 1024, 262144, 1024, 255, machine_at_hot433_init, NULL }, /* Has a VIA VT82C406 KBC+RTC that likely has identical commands to the VT82C42N. */ { "[VIA VT82C496G] DFI G486VPA", "g486vpa", MACHINE_TYPE_486_S3, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_PCIV | MACHINE_IDE_DUAL, 1024, 131072, 1024, 255, machine_at_g486vpa_init, NULL }, /* Has a VIA VT82C42N KBC. */ @@ -493,7 +493,7 @@ const machine_t machines[] = { connector. The boot block for BIOS recovery requires an unknown bit on port 805h to be clear. */ - { "[i430LX] AMI Excalibur PCI Pentium", "excalibur_pci", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 2048, 131072, 2048, 127, machine_at_excalibur_pci_init, NULL }, + { "[i430LX] AMI Excalibur PCI Pentium", "excaliburpci", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 2048, 131072, 2048, 127, machine_at_excaliburpci_init, NULL }, /* Has AMIKey F KBC firmware (AMIKey). */ { "[i430LX] ASUS P/I-P5MP3", "p5mp3", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE, 2048, 196608, 2048, 127, machine_at_p5mp3_init, NULL }, /* Has IBM PS/2 Type 1 KBC firmware. */ @@ -517,7 +517,7 @@ const machine_t machines[] = { /* This uses an AMI KBC firmware in PS/2 mode (it sends command A5 with the PS/2 "Load Security" meaning), most likely MegaKey as it sends command AF (Set Extended Controller RAM) just like the later Intel AMI BIOS'es. */ - { "[OPTi 597] AMI Excalibur VLB", "excalibur", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_VLB | MACHINE_BUS_PS2 | MACHINE_IDE, 2048, 65536, 2048, 127, machine_at_excalibur_init, NULL }, + { "[OPTi 597] AMI Excalibur VLB", "excalibur", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 60000000, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_VLB | MACHINE_BUS_PS2 | MACHINE_IDE, 2048, 65536, 2048, 127, machine_at_excalibur_init, NULL }, /* OPTi 596/597/822 */ /* This has AMIKey 'F' KBC firmware. */ @@ -525,9 +525,9 @@ const machine_t machines[] = { /* SiS 50x */ /* This has an unknown AMI KBC firmware, most likely AMIKey / type 'F'. */ - { "[SiS 50x] AMI Excalibur PCI-II Pentium ISA","excalibur_pci-2", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_excalibur_pci_2_init, NULL }, + { "[SiS 501] AMI Excalibur PCI-II Pentium ISA","excaliburpci2", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_excaliburpci2_init, NULL }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ - { "[SiS 50x] ASUS PCI/I-P5SP4", "p5sp4", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p5sp4_init, NULL }, + { "[SiS 501] ASUS PCI/I-P5SP4", "p5sp4", MACHINE_TYPE_SOCKET4, CPU_PKG_SOCKET4, 0, 60000000, 66666667, 5000, 5000, MACHINE_MULTIPLIER_FIXED, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p5sp4_init, NULL }, /* Socket 5 machines */ /* 430NX */ @@ -546,9 +546,6 @@ const machine_t machines[] = { { "[i430FX] AMI Apollo", "apollo", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_apollo_init, NULL }, /* Has AMIKey H KBC firmware. */ { "[i430FX] Dataexpert EXP8551", "exp8551", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_exp8551_init, NULL }, - /* The BIOS does not send a single non-standard KBC command, but the board has a SMC Super I/O - chip with on-chip KBC and AMI MegaKey KBC firmware. */ - { "[i430FX] HP Vectra VL 5 Series 4", "vectra54", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 511, machine_at_vectra54_init, at_vectra54_get_device }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. Command 0xA0 copyright string: (C)1994 AMI . */ @@ -567,24 +564,27 @@ const machine_t machines[] = { { "[OPTi 597] TMC PAT54PV", "pat54pv", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_VLB, 2048, 65536, 2048, 127, machine_at_pat54pv_init, NULL }, /* OPTi 596/597/822 */ - { "[OPTi 597] Shuttle HOT-543", "hot543", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_hot543_init, NULL }, + { "[OPTi 597] Shuttle HOT-543", "hot543", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3520, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_hot543_init, NULL }, /* SiS 85C50x */ /* This has an AMIKey-2, which is an updated version of type 'H'. */ - { "[SiS 85C50x] ASUS PCI/I-P54SP4", "p54sp4", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54sp4_init, NULL }, + { "[SiS 501] ASUS PCI/I-P54SP4", "p54sp4", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 40000000, 66666667, 3380, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54sp4_init, NULL }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ - { "[SiS 85C50x] BCM SQ-588", "sq588", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_PENTIUMMMX), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_sq588_init, NULL }, + { "[SiS 501] BCM SQ-588", "sq588", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_PENTIUMMMX), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_sq588_init, NULL }, /* Socket 7 (Single Voltage) machines */ /* 430FX */ /* This has an AMIKey-2, which is an updated version of type 'H'. */ { "[i430FX] ASUS P/I-P54TP4XE", "p54tp4xe", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3600, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54tp4xe_init, NULL }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ - { "[i430FX] ASUS P/I-P54TP4XE (MR BIOS)", "mr586", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3600, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_mr586_init, NULL }, + { "[i430FX] ASUS P/I-P54TP4XE (MR BIOS)", "p54tp4xe_mr", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3600, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_p54tp4xe_mr_init, NULL }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. Command 0xA0 copyright string: (C)1994 AMI . */ { "[i430FX] Gateway 2000 Thor", "gw2katx", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_gw2katx_init, NULL }, + /* The BIOS does not send a single non-standard KBC command, but the board has a SMC Super I/O + chip with on-chip KBC and AMI MegaKey KBC firmware. */ + { "[i430FX] HP Vectra VL 5 Series 4", "vectra54", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 2.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 8192, 131072, 8192, 511, machine_at_vectra54_init, at_vectra54_get_device }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. Command 0xA0 copyright string: (C)1994 AMI . */ @@ -616,7 +616,7 @@ const machine_t machines[] = { { "[i430HX] Biostar MB-8500TUC", "8500tuc", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_8500tuc_init, NULL }, /* [TEST] Unable to determine what KBC this has. A list on a Danish site shows the BIOS as having a -0 string, indicating non-AMI KBC firmware. */ - { "[i430HX] SuperMicro Super P55T2S", "p55t2s", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3300, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 127, machine_at_p55t2s_init, NULL }, + { "[i430HX] Supermicro P55T2S", "p55t2s", MACHINE_TYPE_SOCKET7_3V, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3300, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 127, machine_at_p55t2s_init, NULL }, /* 430VX */ /* Has AMIKey H KBC firmware (AMIKey-2). */ @@ -650,7 +650,7 @@ const machine_t machines[] = { PC87306 Super I/O chip, command 0xA1 returns '5'. Command 0xA0 copyright string: (C)1994 AMI . Yes, this is an Intel AMI BIOS with a fancy splash screen. */ - { "[i430HX] Sony Vaio PCV-240", "pcv240", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 196608, 8192, 127, machine_at_pcv240_init, NULL }, + { "[i430HX] Sony Vaio PCV-90", "pcv90", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2800, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 196608, 8192, 127, machine_at_pcv90_init, NULL }, /* The base board has AMIKey-2 (updated 'H') KBC firmware. */ { "[i430HX] ASUS P/I-P65UP5 (C-P55T2D)", "p65up5_cp55t2d", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2500, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_p65up5_cp55t2d_init, NULL }, @@ -698,7 +698,7 @@ const machine_t machines[] = { /* The BIOS sends KBC command BB and expects it to output a byte, which is AMI KBC behavior. */ { "[i430TX] PC Partner MB540N", "mb540n", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 60000000, 66666667, 2700, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 255, machine_at_mb540n_init, NULL }, /* [TEST] Has AMIKey 'H' KBC firmware. */ - { "[i430TX] SuperMicro Super P5MMS98", "p5mms98", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2100, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 255, machine_at_p5mms98_init, NULL }, + { "[i430TX] Supermicro P5MMS98", "p5mms98", MACHINE_TYPE_SOCKET7, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 2100, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 262144, 8192, 255, machine_at_p5mms98_init, NULL }, /* Apollo VPX */ /* Has the VIA VT82C586B southbridge with on-chip KBC identical to the VIA @@ -760,7 +760,7 @@ const machine_t machines[] = { { "[i440FX] ASUS P/I-P65UP5 (C-P6ND)", "p65up5_cp6nd", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 60000000, 66666667, 2100, 3500, 1.5, 8.0, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 127, machine_at_p65up5_cp6nd_init, NULL }, /* The MB-8600TTX has an AMIKey 'F' KBC firmware, so I'm going to assume so does the MB-8600TTC until someone can actually identify it. */ - { "[i440FX] Biostar MB-8600TTC", "8600ttc", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 50000000, 66666667, 2900, 3300, 2.0, 5.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 127, machine_at_8500ttc_init, NULL }, + { "[i440FX] Biostar MB-8600TTC", "8600ttc", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 50000000, 66666667, 2900, 3300, 2.0, 5.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 127, machine_at_8600ttc_init, NULL }, { "[i440FX] Gigabyte GA-686NX", "686nx", MACHINE_TYPE_SOCKET8, CPU_PKG_SOCKET8, 0, 60000000, 66666667, 2100, 3500, 2.0, 5.5, MACHINE_PCI | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 127, machine_at_686nx_init, NULL }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. @@ -823,18 +823,18 @@ const machine_t machines[] = { { "[i440BX] HP Vectra VEi 8", "vei8", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192,1048576, 8192, 255, machine_at_vei8_init, NULL }, /* Has a National Semiconductors PC87309 Super I/O chip with on-chip KBC with most likely AMIKey-2 KBC firmware. */ - { "[i440BX] Tyan Tsunami ATX", "tsunamiatx", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 112121212, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SOUND, 8192,1048576, 8192, 255, machine_at_tsunamiatx_init, at_tsunamiatx_get_device }, + { "[i440BX] Tyan Tsunami ATX", "s1846", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 112121212, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_SOUND, 8192,1048576, 8192, 255, machine_at_s1846_init, at_s1846_get_device }, /* Has a Winbond W83977TF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[i440BX] SuperMicro Super P6SBA", "p6sba", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_p6sba_init, NULL }, + { "[i440BX] Supermicro P6SBA", "p6sba", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_p6sba_init, NULL }, /* 440ZX */ /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[i440ZX] MSI MS-6168", "ms6168", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_SOUND,8192, 524288, 8192, 255, machine_at_ms6168_init, NULL }, + { "[i440ZX] MSI MS-6168", "ms6168", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_SOUND,8192, 524288, 8192, 255, machine_at_ms6168_init, at_ms6168_get_device }, /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[i440ZX] Packard Bell Bora Pro", "borapro", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 66666667, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_SOUND,8192, 524288, 8192, 255, machine_at_borapro_init, NULL }, + { "[i440ZX] Packard Bell Bora Pro", "borapro", MACHINE_TYPE_SLOT1, CPU_PKG_SLOT1, 0, 66666667, 66666667, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_SOUND,8192, 524288, 8192, 255, machine_at_borapro_init, at_borapro_get_device }, /* SMSC VictoryBX-66 */ /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC @@ -865,13 +865,13 @@ const machine_t machines[] = { { "[i440GX] Gigabyte GA-6GXU", "6gxu", MACHINE_TYPE_SLOT2, CPU_PKG_SLOT2, 0, 100000000, 133333333, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,2097152,16384, 511, machine_at_6gxu_init, NULL }, /* Has a Winbond W83977TF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[i440GX] SuperMicro Super S2DGE", "s2dge", MACHINE_TYPE_SLOT2, CPU_PKG_SLOT2, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,2097152,16384, 511, machine_at_s2dge_init, NULL }, + { "[i440GX] Supermicro S2DGE", "s2dge", MACHINE_TYPE_SLOT2, CPU_PKG_SLOT2, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,2097152,16384, 511, machine_at_s2dge_init, NULL }, /* PGA370 machines */ /* 440LX */ /* Has a Winbond W83977TF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[i440LX] SuperMicro Super 370SLM", "s370slm", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_s370slm_init, NULL }, + { "[i440LX] Supermicro 370SLM", "s370slm", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, MACHINE_MULTIPLIER_FIXED, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_s370slm_init, NULL }, /* 440BX */ /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC @@ -885,12 +885,12 @@ const machine_t machines[] = { { "[i440BX] AmazePC AM-BX133", "ambx133", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, /* limits assumed */ MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_ambx133_init, NULL }, /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[i440BX] Tyan Trinity 371", "trinity371", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_trinity371_init, NULL }, + { "[i440BX] Tyan Trinity 371", "s1857", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 786432, 8192, 255, machine_at_s1857_init, at_s1857_get_device }, /* 440ZX */ /* Has a Winbond W83977TF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[i440ZX] Soltek SL-63A1", "63a", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_63a_init, NULL }, + { "[i440ZX] Soltek SL-63A1", "63a1", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 100000000, 1800, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 8192, 524288, 8192, 255, machine_at_63a1_init, NULL }, /* SMSC VictoryBX-66 */ /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC @@ -912,7 +912,7 @@ const machine_t machines[] = { { "[VIA Apollo Pro133A] ASUS CUV4X-LS", "cuv4xls", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 150000000, 1300, 3500, 1.5, 8.0, (MACHINE_AGP & ~MACHINE_AT) | MACHINE_BUS_PS2 | MACHINE_BUS_AC97 | MACHINE_IDE_DUAL,16384,4194304, 8192, 255, machine_at_cuv4xls_init, NULL }, /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ - { "[VIA Apollo Pro133A] BCM GT694VA", "gt694va", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,3145728, 8192, 255, machine_at_gt694va_init, NULL }, + { "[VIA Apollo Pro133A] BCM GT694VA", "gt694va", MACHINE_TYPE_SOCKET370, CPU_PKG_SOCKET370, 0, 66666667, 133333333, 1300, 3500, 1.5, 8.0, MACHINE_AGP | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL, 16384,3145728, 8192, 255, machine_at_gt694va_init, at_gt694va_get_device }, /* Miscellaneous/Fake/Hypervisor machines */ /* Has a Winbond W83977F Super I/O chip with on-chip KBC with AMIKey-2 KBC From dccd1627587b8f51cadaa8441a1d5760a6d7ab97 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 14:31:01 -0300 Subject: [PATCH 118/159] Add SL-63A1 config migration --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index c05036648..57bdf5508 100644 --- a/src/config.c +++ b/src/config.c @@ -639,6 +639,8 @@ load_machine(void) machine = machine_get_machine_from_internal_name("s1846"); else if (! strcmp(p, "trinity371")) machine = machine_get_machine_from_internal_name("s1857"); + else if (! strcmp(p, "63a")) + machine = machine_get_machine_from_internal_name("63a1"); else if (! strcmp(p, "award386dx")) /* ...merged machines... */ machine = machine_get_machine_from_internal_name("award495"); else if (! strcmp(p, "ami386dx")) From 1417589630a6acb5b1d765aaceb3be26ed66f03a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 14:45:56 -0300 Subject: [PATCH 119/159] Fix repository in Jenkinsfile --- .ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 5243d4d6b..43a554705 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -32,7 +32,7 @@ def gitClone() { println "[-] Building git tag [${env.GIT_COMMIT}]" def scmVars = checkout scm: [$class: 'GitSCM', branches: [[name: env.GIT_COMMIT]], - userRemoteConfigs: [[url: 'https://github.com/richardg867/86Box.git']]] + userRemoteConfigs: [[url: 'https://github.com/86Box/86Box.git']]] env.GIT_COMMIT = scmVars.GIT_COMMIT } From 453c7d8fa4f479b5047a86f73fe718155c9e80f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 14 Nov 2021 18:17:17 +0100 Subject: [PATCH 120/159] Fix Linux workflow --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 9973969e4..fd2c2b55e 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -152,7 +152,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Install dependencies - run: sudo apt install gcc-11 g++-11 libfreetype-dev libsdl2-dev libpng-dev libopenal-dev libc6-dev + run: sudo apt update && sudo apt install gcc-11 g++-11 libfreetype-dev libsdl2-dev libpng-dev libopenal-dev libc6-dev - name: Configure CMake run: >- cmake -S . -B build From 7cbf58886096937dfba04dcfe9291359b74d54a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 14 Nov 2021 18:34:34 +0100 Subject: [PATCH 121/159] Fix the Visual Studio build - resource files must end with trailing newspace, otherwise the builds fails with RC1040 - rc.exe did not like the multi-line string declaration for the about dialog text, might have to think about a more definitive solution there --- src/win/86Box.rc | 2 +- src/win/languages/en-US.rc | 18 ++++-------------- src/win/languages/hu-HU.rc | 15 ++------------- src/win/languages/pt-BR.rc | 15 ++------------- 4 files changed, 9 insertions(+), 41 deletions(-) diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 549ec4c8b..8755f1639 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -362,4 +362,4 @@ END #include "languages/en-US.rc" #include "languages/hu-HU.rc" -#include "languages/pt-BR.rc" \ No newline at end of file +#include "languages/pt-BR.rc" diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index f21f91de5..7c00d4be8 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -6,6 +6,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(65001) #endif //_WIN32 +#define AUTHORS + ///////////////////////////////////////////////////////////////////////////// // // Menu @@ -833,19 +835,7 @@ BEGIN IDS_2124 "About 86Box" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "An emulator of old computers\n\n" - - "Authors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\n" - - /* - Here uncomment following line and add your name like "Translated by: \n\n". - If such a line exists with name of previous translators, don't erase their name, just add yours to the end of line. - */ - - //"Translated by: \n\n" - - "Released under the GNU General Public License version 2 or later. See LICENSE for more information." - + IDS_2126 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." IDS_2127 "OK" IDS_2128 "Hardware not available" #ifdef _WIN32 @@ -995,4 +985,4 @@ END #define IDS_LANG_ENUS IDS_7168 // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// \ No newline at end of file +///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 4abbdb43d..0e60cbdbf 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -834,18 +834,7 @@ BEGIN IDS_2123 "Mentés" IDS_2124 "A 86Box névjegye" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "Régi számítógépek emulátora\n\n" - - "Fejlesztők: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\n" - - /* - Translate the following line as "Translated by: \n\n". - If there were previous translators, don't erase their name, just add yours to the end of line. - */ - - "Fordította: Laci bá'\n\n" - - "Megjelent a GNU General Public License v2 vagy újabb alatt. További információért lásd a LICENSE fájlt." + IDS_2126 "Régi számítógépek emulátora\n\nFejlesztők: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nFordította: Laci bá'\n\nMegjelent a GNU General Public License v2 vagy újabb alatt. További információért lásd a LICENSE fájlt." IDS_2127 "OK" IDS_2128 "Hardver nem elérhető" #ifdef _WIN32 @@ -995,4 +984,4 @@ END #define IDS_LANG_ENUS IDS_7168 // Hungarian resources -///////////////////////////////////////////////////////////////////////////// \ No newline at end of file +///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 746a69bb0..951ea6dc7 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -834,18 +834,7 @@ BEGIN IDS_2123 "Salvar" IDS_2124 "Sobre o 86Box" IDS_2125 "86Box versão" EMU_VERSION - IDS_2126 "Um emulador de computadores antigos\n\n" - - "Autores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\n" - - /* - Here uncomment following line and add your name like "Translated by: \n\n". - If such a line exists with name of previous translators, don't erase their name, just add yours to the end of line. - */ - - "Traduzido por: Altieres Lima da Silva\n\n" - - "Lançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." + IDS_2126 "Um emulador de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva\n\nLançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." IDS_2127 "OK" IDS_2128 "Hardware não disponível" #ifdef _WIN32 @@ -995,4 +984,4 @@ END #define IDS_LANG_ENUS IDS_7168 // Portuguese (pt-BR) resources -///////////////////////////////////////////////////////////////////////////// \ No newline at end of file +///////////////////////////////////////////////////////////////////////////// From be1761efec0a9df293c2422c0d21abbeb09b7ea2 Mon Sep 17 00:00:00 2001 From: dob205 Date: Sun, 14 Nov 2021 19:33:05 +0100 Subject: [PATCH 122/159] Adding the German localization Adds the German localization for the Win32 UI of 86Box --- src/win/languages/de-DE.rc | 985 +++++++++++++++++++++++++++++++++++++ 1 file changed, 985 insertions(+) create mode 100644 src/win/languages/de-DE.rc diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc new file mode 100644 index 000000000..b170ab9bb --- /dev/null +++ b/src/win/languages/de-DE.rc @@ -0,0 +1,985 @@ +//////////////////////////////////////////////////////////////////////////// +// German (de-DE) resources + +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT +#pragma code_page(65001) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Aktionen" + BEGIN + MENUITEM "&Tastatur benötigt das Einfangen des Mauszeigers", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Die rechte Strg-Taste ist die Linke Alt-Taste", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Hard-Reset...", IDM_ACTION_HRESET + MENUITEM "&Strg+Alt+Entf\tStrg+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Strg+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Pause", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "Be&enden...", IDM_ACTION_EXIT + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Statusleiste ausblenden", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Größenverstellbares Fenster", IDM_VID_RESIZE + MENUITEM "&Größe && Position merken", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "Re&nderer" + BEGIN + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (3.3 Core)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "Dimensionen spezifizieren...", IDM_VID_SPECIFY_DIM + MENUITEM "&4:3-Seitenverhältnis erzwingen", IDM_VID_FORCE43 + POPUP "&Fensterskalierungsfaktor" + BEGIN + MENUITEM "&0,5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1,&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Filteringmethode" + BEGIN + MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + END + MENUITEM "Hi&DPI-Skalierung", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Vollbild\tStrg+Alt+BildAuf", IDM_VID_FULLSCREEN + POPUP "&Stretching-Modus im Vollbildmodus" + BEGIN + MENUITEM "&Vollbild-Stretching", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Square pixels (Keep ratio)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Integer scale", IDM_VID_FS_INT + END + POPUP "E&GA/(S)VGA settings" + BEGIN + MENUITEM "&Invertierte VGA-Anzeige", IDM_VID_INVERT + POPUP "&VGA-Bildschirmtyp" + BEGIN + MENUITEM "&RGB-Farbe", IDM_VID_GRAY_RGB + MENUITEM "&RGB-Graustufen", IDM_VID_GRAY_MONO + MENUITEM "&Bernstein-Monitor", IDM_VID_GRAY_AMBER + MENUITEM "&Grüner Monitor", IDM_VID_GRAY_GREEN + MENUITEM "&Weißer Monitor", IDM_VID_GRAY_WHITE + END + POPUP "Methode zur &Graustufenkonversion" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Durchschnittsmethode", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "Overscan für CGA/PCjr/Tandy/E&GA/(S)VGA-Displays", IDM_VID_OVERSCAN + MENUITEM "Kontrast für &monochrome Displays ändern", IDM_VID_CGACON + END + MENUITEM "&Medien", IDM_MEDIA + POPUP "&Werkzeuge" + BEGIN + MENUITEM "&Einstellungen...", IDM_CONFIG + MENUITEM "&Statusleistenicons aktualisieren", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "&Anzeigesprache ändern...", IDM_VID_PROG_SETT +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "&Discord-Integration aktivieren", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "S&creenshot aufnehmen\tStrg+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "&Schallverstärkung...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Tracing starten\tStrg+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Tracing beenden\tStrg+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Logging" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "BusLogic-Logs aktivieren\tStrg+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "CD-ROM-Logs aktivieren\tSTRG+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Disketten (86F)-Logs aktivieren\tSTRG+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Diskettencontroller-Logs aktivieren\tSTRG+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "IDE-Logs aktivieren\tSTRG+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Seriell-Port-Logs aktivieren\tSTRG+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Netzwerk-Logs aktivieren\tSTRG+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Breakpoint für die Log-Datei\tSTRG+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "&Video-RAM dumpen\tSTRG+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Hilfe" + BEGIN + MENUITEM "&Dokumentation...", IDM_DOCS + MENUITEM "&Über 86Box...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Neues Image...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Bestehendes Image...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Aufnehmen", IDM_CASSETTE_RECORD + MENUITEM "&Abspielen", IDM_CASSETTE_PLAY + MENUITEM "&An den Anfang zurückspulen", IDM_CASSETTE_REWIND + MENUITEM "&An das Ende vorspulen", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "A&uswerfen", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Steckmodulimage...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "A&uswerfen", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Neues Image...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Bestehendes Image...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&In das 86F-Format e&xportieren...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "&Auswerfen", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Stummschalten", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "L&eer", IDM_CDROM_EMPTY + MENUITEM "&Voriges Image neu laden", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Image", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Neues Image...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Bestehendes Image...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "A&uswerfen", IDM_ZIP_EJECT + MENUITEM "&Voriges Image neu laden", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Neues Image...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Bestehendes Image...", IDM_MO_IMAGE_EXISTING + MENUITEM "Bestehendes Image (&schreibgeschützt)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&ject", IDM_MO_EJECT + MENUITEM "&Bestehendes Image erneut laden", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "Ziel&framerate" + BEGIN + MENUITEM "&Mit Videoausgabe synchronisieren", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 fps", IDM_VID_GL_FPS_25 + MENUITEM "&30 fps", IDM_VID_GL_FPS_30 + MENUITEM "&50 fps", IDM_VID_GL_FPS_50 + MENUITEM "&60 fps", IDM_VID_GL_FPS_60 + MENUITEM "&75 fps", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&Shader auswählen...", IDM_VID_GL_SHADER + MENUITEM "&Shader entfernen", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Anzeigesprache ändern" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 + PUSHBUTTON "Abbrechen", IDCANCEL, 179, 65, 50, 14 + COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS + AUTOCHECKBOX "Diese Einstellungen als &globalen Standard speichern", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8 , WS_DISABLED + PUSHBUTTON "&Default", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 + LTEXT "Sprache:", 0, 13, 8, 34, 8 +END + +DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Status" +FONT 9, "Segoe UI" +BEGIN + LTEXT "1",IDT_SDEVICE,16,16,180,1000 + LTEXT "1",IDT_STEXT,16,186,180,1000 +END + +DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Schallverstärkung" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,57,7,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,57,24,50,14 + CONTROL "Verstärkung",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | + TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 + CTEXT "Verstärkung",IDT_1746,10,7,32,9,SS_CENTERIMAGE +END + +DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Neues Image" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,104,65,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,162,65,50,14 + LTEXT "Dateiname:",IDT_1749,7,6,44,12,SS_CENTERIMAGE + LTEXT "Größe:",IDT_1750,7,25,44,12,SS_CENTERIMAGE + LTEXT "Drehzahlmodus:",IDT_1751,7,45,44,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY + COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_CFILE,206,5,13,14 + LTEXT "Fortschritt:",IDT_1757,7,45,44,12,SS_CENTERIMAGE + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,53,45,166,14 +END + +DLG_CONFIG DIALOG DISCARDABLE 0, 0, 396, 256 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "86Box-Einstellungen" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,246,235,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,307,235,50,14 + CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,120,212 + CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 +END + +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Abmessungen des Hauptfensters" +FONT 9, "Segoe UI" +BEGIN + LTEXT "Breite:",IDT_1709,7,9,24,12 + EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, + 12,12 + LTEXT "Höhe:",IDT_1710,97,9,24,12 + EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, + 12,12 + CONTROL "Auf diese Größe festlegen",IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + DEFPUSHBUTTON "OK",IDOK,30,45,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,99,45,50,14 +END + +DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Maschinentyp:",IDT_1708,7,9,60,10 + COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Maschine:",IDT_1701,7,28,60,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MACHINE,214,26,46,12 + COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "CPU-Typ:",IDT_1702,7,47,59,10 + COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Takt:",IDT_1704,189,47,24,10 + COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "FPU-Einheit:",IDT_1707,7,66,59,10 + COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Wartezustände:",IDT_1703,7,85,60,10 + EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, + 12,12 + LTEXT "MB",IDT_1705,123,104,10,10 + LTEXT "RAM:",IDT_1706,7,104,30,10 + GROUPBOX "Zeitsynchronization",IDC_TIME_SYNC,7,135,100,56 + CONTROL "Deaktiviert",IDC_RADIO_TS_DISABLED,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 + CONTROL "Aktiviert (Lokalzeit)", IDC_RADIO_TS_LOCAL,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 + CONTROL "Aktiviert (UTC)", IDC_RADIO_TS_UTC,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 +#ifdef USE_DYNAREC + CONTROL "Dynamischer Recompiler",IDC_CHECK_DYNAREC,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 +#endif +END + +DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 277, 45 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Videokarte:",IDT_1707,7,9,48,10 + COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_VID,222,7,46,12 + CONTROL "Voodoo Graphics",IDC_CHECK_VOODOO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 + PUSHBUTTON "Konfigurieren",IDC_BUTTON_VOODOO,222,26,46,12 +END + +DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 277, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Maus:",IDT_1709,7,9,57,10 + COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MOUSE,214,7,46,12 + LTEXT "Joystick:",IDT_1710,7,27,58,10 + COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 + PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 + PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 + PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 +END + +DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 277, 201 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Soundkarte:",IDT_1711,7,9,59,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SND,214,7,46,12 + + COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "MIDI Out-Gerät:",IDT_1712,7,28,59,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MIDI,214,26,46,12 + + COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "MIDI In-Gerät:",IDT_1713,7,47,59,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MIDI_IN,214,45,46,12 + + CONTROL "Standalone-MPU-401-Gerät",IDC_CHECK_MPU401,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MPU401,214,64,46,12 + + CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SSI,214,82,46,12 + + CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_CMS,214,100,46,12 + + CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_GUS,214,118,46,12 + + CONTROL "FLOAT32-Sound nutzen",IDC_CHECK_FLOAT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 +END + +DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 277, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Netzwerkttyp:",IDT_1714,7,9,59,10 + COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "PCap-Gerät:",IDT_1715,7,28,59,10 + COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "Netzwerkadapter:",IDT_1716,7,47,59,10 + COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_NET,214,44,46,12 +END + +DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 277, 135 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "LPT1-Gerät:",IDT_1717,7,9,61,10 + COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "LPT2-Gerät:",IDT_1718,7,28,61,10 + COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "LPT3-Gerät:",IDT_1719,7,47,61,10 + COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + CONTROL "Serielle Schnittstelle 1",IDC_CHECK_SERIAL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 + CONTROL "Serielle Schnittstelle 2",IDC_CHECK_SERIAL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 + CONTROL "Serielle Schnittstelle 3",IDC_CHECK_SERIAL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 + CONTROL "Serielle Schnittstelle 4",IDC_CHECK_SERIAL4,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 + + CONTROL "Parallelport 1",IDC_CHECK_PARALLEL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 + CONTROL "Parallelport 2",IDC_CHECK_PARALLEL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 + CONTROL "Parallelport 3",IDC_CHECK_PARALLEL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 +END + +DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 277, 203 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "HDD-Controller:",IDT_1718,7,9,64,10 + COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_HDC,222,7,46,12 + + LTEXT "FD-Controller:",IDT_1768,7,28,64,10 + COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_FDC,222,26,46,12 + + CONTROL "Tertiärer IDE-Controller",IDC_CHECK_IDE_TER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 + PUSHBUTTON "Konfigurieren",IDC_BUTTON_IDE_TER,222,45,46,12 + + CONTROL "Quartärer IDE-Controller",IDC_CHECK_IDE_QUA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Konfigurieren",IDC_BUTTON_IDE_QUA,222,64,46,12 + + GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,263,93 + LTEXT "Controller 1:",IDT_1763,16,102,48,10 + COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_1,213,100,46,12 + LTEXT "Controller 2:",IDT_1764,16,121,48,10 + COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_2,213,119,46,12 + LTEXT "Controller 3:",IDT_1765,16,140,48,10 + COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_3,213,138,46,12 + LTEXT "Controller 4:",IDT_1766,16,159,48,10 + COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_4,213,157,46,12 + + CONTROL "Kassette",IDC_CHECK_CASSETTE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 +END + +DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 277, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,263,92 + LTEXT "Festplatten:",IDT_1720,7,7,263,8 + PUSHBUTTON "&Neu...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 + PUSHBUTTON "&Vorhanden...",IDC_BUTTON_HDD_ADD,129,137,62,10 + PUSHBUTTON "&Entfernen",IDC_BUTTON_HDD_REMOVE,198,137,62,10 + COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1721,7,119,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Kanal:",IDT_1722,131,119,38,8 + COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,131,119,38,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Festplatte hinzufügen" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,55,127,50,14 + PUSHBUTTON "Abbrechen",IDCANCEL,112,127,50,14 + EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 + PUSHBUTTON "&Auswählen...",IDC_CFILE,167,16,44,12 + EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 + EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 + EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 + EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 + COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Sektoren:",IDT_1726,150,35,30,10 + LTEXT "Köpfe:",IDT_1727,81,35,29,8 + LTEXT "Zylinder:",IDT_1728,7,35,32,12 + LTEXT "Größe (MB):",IDT_1729,7,54,39,8 + LTEXT "Typ:",IDT_1730,86,54,24,8 + LTEXT "Dateiname:",IDT_1731,7,7,204,9 + COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1721,7,73,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Kanal:",IDT_1722,99,73,34,8 + COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,99,73,34,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Imageformat:",IDT_1774,7,92,50,12 + COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Blockgröße:",IDT_1775,7,111,50,12 + COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Fortschritt:",IDT_1752,7,7,204,9 + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,7,16,204,12 +END + +DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 277, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,263,60 + LTEXT "Diskettenlaufwerke:",IDT_1737,7,7,263,8 + COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Typ:",IDT_1738,7,87,24,8 + CONTROL "Turbo-Timings",IDC_CHECKTURBO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 + CONTROL "BPB überprüfen",IDC_CHECKBPB,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 + + CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,117,263,60 + LTEXT "CD-ROM-Laufwerke:",IDT_1739,7,107,263,8 + COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1740,7,187,24,8 + COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1741,131,187,38,8 + COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Kanal:",IDT_1742,131,187,38,8 + COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Geschwindigkeit:",IDT_1758,7,207,24,8 +END + +DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 277, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + + CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,17,263,60 + LTEXT "MO-Disk-Laufwerke:",IDT_1769,7,7,263,8 + COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1770,7,87,24,8 + COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1771,131,87,38,8 + COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Kanal:",IDT_1772,131,87,38,8 + COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Typ:",IDT_1773,7,107,24,8 + + CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,137,263,60 + LTEXT "ZIP-Laufwerke:",IDT_1759,7,127,263,8 + COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1753,7,207,14,8 + COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1754,120,207,28,8 + COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Kanal:",IDT_1755,120,207,28,8 + CONTROL "ZIP 250",IDC_CHECK250,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 +END + +DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 277, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "ISA-Echtzeituhr:",IDT_1767,7,9,48,10 + COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISARTC,222,7,46,12 + + GROUPBOX "ISA-Speichererweiterung",IDC_GROUP_ISAMEM,7,28,263,93 + LTEXT "Steckkarte 1:",IDT_1763,16,45,48,10 + COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_1,213,43,46,12 + LTEXT "Steckkarte 2:",IDT_1764,16,64,48,10 + COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_2,213,62,46,12 + LTEXT "Steckkarte 3:",IDT_1765,16,83,48,10 + COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_3,213,81,46,12 + LTEXT "Steckkarte 4:",IDT_1766,16,102,48,10 + COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_4,213,100,46,12 + + CONTROL "ISABugger-Gerät",IDC_CHECK_BUGGER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 + + CONTROL "POST-Code-Karte",IDC_CHECK_POSTCARD,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 +END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Fehler" + IDS_2050 "Kritischer Fehler" + IDS_2051 "" + IDS_2052 "Bitte Strg+Alt+Bild ab zur Rückkehr in den Fenstermodus drücken." + IDS_2053 "Geschwindigkeit" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box konnte keine nutzbaren ROM-Images finden.\n\nBitte besuchen Sie download, laden ein ROM-Set herunter und extrahieren dies in das ""roms""-Verzeichnis." + IDS_2057 "(leer)" + IDS_2058 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "An" + IDS_2061 "Aus" + IDS_2062 "Alle Images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basissektorimages (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Oberflächenimages (*.86F)\0*.86F\0" + IDS_2063 "Die Maschine ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/machines nicht verfügbar. Es wird auf eine verfügbare Maschine gewechselt." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "Die Videokarte ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird auf eine verfügbare Videokarte gewechselt." + IDS_2065 "Maschine" + IDS_2066 "Anzeige" + IDS_2067 "Eingabegeräte" + IDS_2068 "Multimedia" + IDS_2069 "Netzwerk" + IDS_2070 "Anschlüsse (COM & LPT)" + IDS_2071 "Speichercontroller" + IDS_2072 "Festplatten" + IDS_2073 "Disketten- & CD-ROM-Laufwerke" + IDS_2074 "Andere Wechsellaufwerke" + IDS_2075 "Andere Peripheriegeräte" + IDS_2076 "Oberflächenimages (*.86F)\0*.86F\0" + IDS_2077 "Zum Einfangen des Mauszeigers bitte klicken" + IDS_2078 "Bitte F8+F12 zur Mausfreigabe drücken" + IDS_2079 "Bitte F8+F12 oder die mittlere Maustaste zur Mausfreigabe drücken" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "FluidSynth konnte nicht initialisiert werden" + IDS_2081 "Bus" + IDS_2082 "Datei" + IDS_2083 "Z" + IDS_2084 "K" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "BPB prüfen" + IDS_2088 "KB" + IDS_2089 "Der Videorenderer konnte nicht initialisiert werden." + IDS_2090 "Default" + IDS_2091 "%i Wartezustände" + IDS_2092 "Typ" + IDS_2093 "PCap konnte nicht eingerichtet werden" + IDS_2094 "Keine PCap-Geräte gefunden" + IDS_2095 "Ungültiges PCap-Gerät" + IDS_2096 "Standard 2-Tasten-Joystick(s)" + IDS_2097 "Standard 4-Tasten-Joystick" + IDS_2098 "Standard 6-Tasten-Joystick" + IDS_2099 "Standard 8-Tasten-Joystick" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Kein(es)" + IDS_2104 "Tastaturbeschleuniger konnten nicht geladen werden." + IDS_2105 "Roheingaben konnten nicht registriert werden." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Diskette %i (%s): %ls" + IDS_2109 "Alle Images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Fortgeschrittene Sektorimages (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basissektorimages (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Fluximages (*.FDI)\0*.FDI\0Oberflächenimages (*.86F;*.MFM)\0*.86F;*.MFM\0Alle Dateien (*.*)\0*.*\0" + IDS_2110 "FreeType konnte nicht initialisiert werden" + IDS_2111 "SDL konnte nicht initialisiert werden, die Datei SDL2.dll wird benötigt" + IDS_2112 "Sind Sie sich sicher, dass Sie einen Hard-Reset für die emulierte Maschine durchführen wollen?" + IDS_2113 "Sind Sie sich sicher, dass Sie 86Box beenden wollen?" + IDS_2114 "Ghostscript konnte nicht initialisiert werden" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "MO-Images (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2117 "Willkommen bei 86Box!" + IDS_2118 "Interner Controller" + IDS_2119 "Beenden" + IDS_2120 "Keine ROMs gefunden" + IDS_2121 "Möchten Sie die Einstellungen speichern?" + IDS_2122 "Dies wird zu einem Hard-Reset der emulierten Maschine führen." + IDS_2123 "Speichern" + IDS_2124 "Über 86Box" + IDS_2125 "86Box Version " EMU_VERSION + IDS_2126 "Ein Emulator für alte Computer\n\nAutoren: Sarah Walker, Miran Grča, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho sowie andere.\n\nÜbersetzt von: dob205\n\nVeröffentlicht unter der GNU General Public License in der Version 2 oder neuer. Siehe LICENSE für mehr Informationen." + IDS_2127 "OK" + IDS_2128 "Hardware nicht verfügbar" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Bitte stellen Sie sicher, dass " LIB_NAME_PCAP " installiert ist und sie eine " LIB_NAME_PCAP "-kompatible Netzwerkverbindung nutzen." + IDS_2130 "Ungültige Konfiguration" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " wird für die ESC/P-Druckeremulation benötigt." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " wird zur automatischen Konversion von PostScript-Dateien in das PDF-Format benötigt.\n\nSämtliche an den generischen PostScript-Drucker gesendete Dateien werden als PostScript (.ps)-Dateien gesichert." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " wird für die FluidSynth-MIDI-Ausgabe benötigt." + IDS_2134 "Vollbildmodus wird aktiviert" + IDS_2135 "Diese Nachricht nicht mehr anzeigen" + IDS_2136 "Nicht beenden" + IDS_2137 "Resetten" + IDS_2138 "Nicht Resetten" + IDS_2139 "MO-Images (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2140 "CD-ROM-Images (*.ISO;*.CUE)\0*.ISO;*.CUE\0Alle Dateien (*.*)\0*.*\0" + IDS_2141 "%hs-Gerätekonfiguration" + IDS_2142 "Monitor im Standby" + IDS_2143 "OpenGL-Shader (*.GLSL)\0*.GLSL\0Alle Dateien (*.*)\0*.*\0" + IDS_2144 "OpenGL-Optionen" + IDS_2145 "Sie laden gerade eine nicht unterstützte Konfiguration" + IDS_2146 "Das Filtern der CPU-Typen basierend auf der ausgewählten Maschine ist für diese Maschine deaktiviert.\n\nDies ermöglicht es, dass man eine sonst nicht mit der ausgewählten Maschine inkompatible CPU auswählen kann. Allerdings kann dies zu Inkompatiblilitäten mit dem BIOS der Maschine oder anderen Programmen kommen.\n\nDas Aktivieren dieser Einstellung wird nicht unterstützt und sämtliche Bugreports können als ""invalid"" geschlossen werden." + IDS_2147 "Fortfahren" + IDS_2148 "Kassette: %s" + IDS_2149 "Kassettenimages (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Alle Dateien (*.*)\0*.*\0" + IDS_2150 "Steckmodul %i: %ls" + IDS_2151 "Steckmodulimages (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Alle Dateien (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Festplatte (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL- oder ESDI CD-ROM-Laufwerke sind nicht existent" + IDS_4100 "Angepasst..." + IDS_4101 "Angepasst (Groß)..." + IDS_4102 "Neue Festplatte hinzufügen" + IDS_4103 "Bestehende Festplatte hinzufügen" + IDS_4104 "HDI-Diskimages können nicht größer als 4 GB groß sein." + IDS_4105 "Festplattenimages können nicht größer als 127 GB groß sein." + IDS_4106 "Festplattenimages (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Alle Dateien (*.*)\0*.*\0" + IDS_4107 "Die Datei konnte nicht gelesen werden" + IDS_4108 "Die Datei konnte nicht beschrieben werden" + IDS_4109 "HDI- oder HDX-Images mit einer Sektorgröße größer als 512 kB werden nicht unterstützt." + IDS_4110 "USB wird noch nicht unterstützt" + IDS_4111 "Die Festplattenimagedatei existiert bereits" + IDS_4112 "Bitte geben Sie einen gültigen Dateinamen ein." + IDS_4113 "Disk-Image wurde erstellt" + IDS_4114 "Bitte stellen Sie sicher, dass die Datei existiert und lesbar ist." + IDS_4115 "Bitte stellen Sie sicher, dass die Datei in ein Verzeichnis mit Schreibberechtigungen gespeichert wird." + IDS_4116 "Festplattenimage ist zu groß" + IDS_4117 "Bitte denken Sie an das Partitionieren und Formatieren des neu erstellten Laufwerks." + IDS_4118 "Die ausgewählte Datei wird überschrieben. Möchten Sie diese Datei nutzen?" + IDS_4119 "Nicht unterstütztes Disk-Image" + IDS_4120 "Überschreiben" + IDS_4121 "Nicht überschreiben" + IDS_4122 "Rohdatenimage (.img)" + IDS_4123 "HDI-Image (.hdi)" + IDS_4124 "HDX-Image (.hdx)" + IDS_4125 "VHD mit fester Größe (.vhd)" + IDS_4126 "VHD mit dynamischer Größe (.vhd)" + IDS_4127 "Differenzierende VHD (.vhd)" + IDS_4128 "Große Blöcke (2 MB)" + IDS_4129 "Kleine Blöcke (512 KB)" + IDS_4130 "VHD-Dateien (*.VHD)\0*.VHD\0Alle Dateien (*.*)\0*.*\0" + IDS_4131 "Eltern-VHD-Datei bitte auswählen" + IDS_4132 "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nEs kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nMöchten Sie die Zeitstempel korrigieren?" + IDS_4133 "Die Zeitstempel der Eltern- und der Kindesplatte stimmen nicht überein" + IDS_4134 "Der Zeitstempel der VHD konnte nicht korrigiert werden." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Deaktiviert" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Deaktiviert" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1,2 MB" + IDS_5895 "1,25 MB" + IDS_5896 "1,44 MB" + IDS_5897 "DMF (1024 Cluster)" + IDS_5898 "DMF (2048 Cluster)" + IDS_5899 "2,88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3,5-Zoll 128 MB M.O. (ISO 10090)" + IDS_5903 "3,5-Zoll 230 MB M.O. (ISO 13963)" + IDS_5904 "3,5-Zoll 540 MB M.O. (ISO 15498)" + IDS_5905 "3,5-Zoll 640 MB M.O. (ISO 15498)" + IDS_5906 "3,5-Zoll 1,3 GB M.O. (GigaMO)" + IDS_5907 "3,5-Zoll 2,3 GB M.O. (GigaMO 2)" + IDS_5908 "5,25-Zoll 600 MB M.O." + IDS_5909 "5,25-Zoll 650 MB M.O." + IDS_5910 "5,25-Zoll 1 GB M.O." + IDS_5911 "5,25-Zoll 1,3 GB M.O." + + IDS_6144 "Perfekte Drehzahl" + IDS_6145 "1%% unterhalb der perfekten Drehzahl" + IDS_6146 "1,5%% unterhalb der perfekten Drehzahl" + IDS_6147 "2%% unterhalb der perfekten Drehzahl" + + IDS_7168 "(Systemstandard)" +END +#define IDS_LANG_ENUS IDS_7168 + +// German (de-DE) resources +///////////////////////////////////////////////////////////////////////////// From ee7695fd904d97f8f35b29225f2106b8895268c9 Mon Sep 17 00:00:00 2001 From: dob205 Date: Sun, 14 Nov 2021 19:35:31 +0100 Subject: [PATCH 123/159] Loading the German localization into 86Box.rc This commit adds the loading of the German localization into 86Box.rc --- src/win/86Box.rc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 8755f1639..e260e42aa 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -363,3 +363,5 @@ END #include "languages/en-US.rc" #include "languages/hu-HU.rc" #include "languages/pt-BR.rc" +#include "languages/de-DE.rc" + From 8b0a24d740cf279a8ad88b99d0f3e1e1cf0c7b92 Mon Sep 17 00:00:00 2001 From: dob205 Date: Sun, 14 Nov 2021 19:39:38 +0100 Subject: [PATCH 124/159] Adding missed strings Should hopefully make all dialogs translated --- src/win/languages/de-DE.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index b170ab9bb..9503def1d 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -68,10 +68,10 @@ BEGIN BEGIN MENUITEM "&Vollbild-Stretching", IDM_VID_FS_FULL MENUITEM "&4:3", IDM_VID_FS_43 - MENUITEM "&Square pixels (Keep ratio)", IDM_VID_FS_KEEPRATIO - MENUITEM "&Integer scale", IDM_VID_FS_INT + MENUITEM "&Quadratische Pixel (Seitenverhältnis beibehalten)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Integer-Skalierung", IDM_VID_FS_INT END - POPUP "E&GA/(S)VGA settings" + POPUP "E&GA/(S)VGA-Einstellungen" BEGIN MENUITEM "&Invertierte VGA-Anzeige", IDM_VID_INVERT POPUP "&VGA-Bildschirmtyp" From cfb24f9c15be29f39d17579e7d43ff7b4cd5e2a0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 19:50:35 +0100 Subject: [PATCH 125/159] Converted dialog localization to the new system with common dialog definitions and string #define's, has to be ported to non-English languages. --- src/win/languages/dialogs.rc | 458 +++++++++++++++++++++++++++++ src/win/languages/en-US.rc | 552 +++++++---------------------------- 2 files changed, 560 insertions(+), 450 deletions(-) create mode 100644 src/win/languages/dialogs.rc diff --git a/src/win/languages/dialogs.rc b/src/win/languages/dialogs.rc new file mode 100644 index 000000000..0b3cf125b --- /dev/null +++ b/src/win/languages/dialogs.rc @@ -0,0 +1,458 @@ +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION STR_PROG_SETT +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON STR_OK, IDOK, 123, 65, 50, 14 + PUSHBUTTON STR_CANCEL, IDCANCEL, 179, 65, 50, 14 + COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS + AUTOCHECKBOX STR_GLOBAL, IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8 , WS_DISABLED + PUSHBUTTON STR_DEFAULT, IDC_BUTTON_DEFAULT, 162, 32, 60, 14 + LTEXT STR_LANGUAGE, 0, 13, 8, 34, 8 +END + +DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION STR_SND_GAIN +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON STR_OK,IDOK,57,7,50,14 + PUSHBUTTON STR_CANCEL,IDCANCEL,57,24,50,14 + CONTROL STR_GAIN,IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | + TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 + CTEXT STR_GAIN,IDT_1746,10,7,32,9,SS_CENTERIMAGE +END + +DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION STR_NEW_FLOPPY +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON STR_OK,IDOK,104,65,50,14 + PUSHBUTTON STR_CANCEL,IDCANCEL,162,65,50,14 + LTEXT STR_FILE_NAME,IDT_1749,7,6,44,12,SS_CENTERIMAGE + LTEXT STR_DISK_SIZE,IDT_1750,7,25,44,12,SS_CENTERIMAGE + LTEXT STR_RPM_MODE,IDT_1751,7,45,44,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY + COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_CFILE,206,5,13,14 + LTEXT STR_PROGRESS,IDT_1757,7,45,44,12,SS_CENTERIMAGE + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,53,45,166,14 +END + +DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION STR_CONFIG +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON STR_OK,IDOK,246,235,50,14 + PUSHBUTTON STR_CANCEL,IDCANCEL,307,235,50,14 + CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 + CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 +END + +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION STR_SPECIFY_DIM +FONT 9, "Segoe UI" +BEGIN + LTEXT STR_WIDTH,IDT_1709,7,9,24,12 + EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, + 12,12 + LTEXT STR_HEIGHT,IDT_1710,97,9,24,12 + EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, + 12,12 + CONTROL STR_LOCK_TO_SIZE,IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + DEFPUSHBUTTON STR_OK,IDOK,30,45,50,14 + PUSHBUTTON STR_CANCEL,IDCANCEL,99,45,50,14 +END + +DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_MACHINE_TYPE,IDT_1708,7,9,60,10 + COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_MACHINE,IDT_1701,7,28,60,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_MACHINE,214,26,46,12 + COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_CPU_TYPE,IDT_1702,7,47,59,10 + COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_SPEED,IDT_1704,189,47,24,10 + COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT STR_FPU,IDT_1707,7,66,59,10 + COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT STR_WAIT_STATES,IDT_1703,7,85,60,10 + EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, + 12,12 + LTEXT STR_MB,IDT_1705,123,104,10,10 + LTEXT STR_MEMORY,IDT_1706,7,104,30,10 + GROUPBOX STR_TIME_SYNC,IDC_TIME_SYNC,7,135,100,56 + CONTROL STR_DISABLED,IDC_RADIO_TS_DISABLED,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 + CONTROL STR_ENABLED_LOCAL, IDC_RADIO_TS_LOCAL,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 + CONTROL STR_ENABLED_UTC, IDC_RADIO_TS_UTC,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 +#ifdef USE_DYNAREC + CONTROL STR_DYNAREC,IDC_CHECK_DYNAREC,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 +#endif +END + +DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT STR_VIDEO,IDT_1707,7,9,48,10 + COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_VID,222,7,38,12 + CONTROL STR_VOODOO,IDC_CHECK_VOODOO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 + PUSHBUTTON STR_CONFIGURE,IDC_BUTTON_VOODOO,222,26,38,12 +END + +DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT STR_MOUSE,IDT_1709,7,9,57,10 + COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_MOUSE,214,7,46,12 + LTEXT STR_JOYSTICK,IDT_1710,7,27,58,10 + COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_JOY1,IDC_JOY1,7,44,50,14 + PUSHBUTTON STR_JOY2,IDC_JOY2,74,44,50,14 + PUSHBUTTON STR_JOY3,IDC_JOY3,141,44,50,14 + PUSHBUTTON STR_JOY4,IDC_JOY4,209,44,50,14 +END + +DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT STR_SOUND,IDT_1711,7,9,59,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_SND,214,7,46,12 + + COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT STR_MIDI,IDT_1712,7,28,59,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_MIDI,214,26,46,12 + + COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT STR_MIDI_IN,IDT_1713,7,47,59,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_MIDI_IN,214,45,46,12 + + CONTROL STR_MPU401,IDC_CHECK_MPU401,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_MPU401,214,64,46,12 + + CONTROL STR_SSI,IDC_CHECK_SSI,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_SSI,214,82,46,12 + + CONTROL STR_CMS,IDC_CHECK_CMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_CMS,214,100,46,12 + + CONTROL STR_GUS,IDC_CHECK_GUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_GUS,214,118,46,12 + + CONTROL STR_FLOAT,IDC_CHECK_FLOAT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 +END + +DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT STR_NET_TYPE,IDT_1714,7,9,59,10 + COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT STR_PCAP,IDT_1715,7,28,59,10 + COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT STR_NET,IDT_1716,7,47,59,10 + COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_NET,214,44,46,12 +END + +DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT STR_LPT1,IDT_1717,7,9,61,10 + COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT STR_LPT2,IDT_1718,7,28,61,10 + COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT STR_LPT3,IDT_1719,7,47,61,10 + COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + CONTROL STR_SERIAL1,IDC_CHECK_SERIAL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 + CONTROL STR_SERIAL2,IDC_CHECK_SERIAL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 + CONTROL STR_SERIAL3,IDC_CHECK_SERIAL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 + CONTROL STR_SERIAL4,IDC_CHECK_SERIAL4,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 + + CONTROL STR_PARALLEL1,IDC_CHECK_PARALLEL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 + CONTROL STR_PARALLEL2,IDC_CHECK_PARALLEL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 + CONTROL STR_PARALLEL3,IDC_CHECK_PARALLEL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 +END + +DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT STR_HDC,IDT_1718,7,9,64,10 + COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_HDC,222,7,38,12 + + LTEXT STR_FDC,IDT_1768,7,28,64,10 + COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_FDC,222,26,38,12 + + CONTROL STR_IDE_TER,IDC_CHECK_IDE_TER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 + PUSHBUTTON STR_CONFIGURE,IDC_BUTTON_IDE_TER,222,45,38,12 + + CONTROL STR_IDE_QUA,IDC_CHECK_IDE_QUA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON STR_CONFIGURE,IDC_BUTTON_IDE_QUA,222,64,38,12 + + GROUPBOX STR_SCSI,IDC_GROUP_SCSI,7,85,253,93 + LTEXT STR_SCSI_1,IDT_1763,16,102,48,10 + COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_SCSI_1,213,100,38,12 + LTEXT STR_SCSI_2,IDT_1764,16,121,48,10 + COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_SCSI_2,213,119,38,12 + LTEXT STR_SCSI_3,IDT_1765,16,140,48,10 + COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_SCSI_3,213,138,38,12 + LTEXT STR_SCSI_4,IDT_1766,16,159,48,10 + COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_SCSI_4,213,157,38,12 + + CONTROL STR_CASSETTE,IDC_CHECK_CASSETTE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 +END + +DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,92 + LTEXT STR_HDD,IDT_1720,7,7,253,8 + PUSHBUTTON STR_NEW,IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 + PUSHBUTTON STR_EXISTING,IDC_BUTTON_HDD_ADD,129,137,62,10 + PUSHBUTTON STR_REMOVE,IDC_BUTTON_HDD_REMOVE,198,137,62,10 + COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_BUS,IDT_1721,7,119,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_CHANNEL,IDT_1722,131,119,38,8 + COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_ID,IDT_1723,131,119,38,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Add Hard Disk" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON STR_OK,IDOK,55,127,50,14 + PUSHBUTTON STR_CANCEL,IDCANCEL,112,127,50,14 + EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 + PUSHBUTTON STR_SPECIFY,IDC_CFILE,167,16,44,12 + EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 + EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 + EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 + EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 + COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_SECTORS,IDT_1726,154,35,27,10 + LTEXT STR_HEADS,IDT_1727,81,35,29,8 + LTEXT STR_CYLS,IDT_1728,7,35,32,12 + LTEXT STR_SIZE_MB,IDT_1729,7,54,33,8 + LTEXT STR_TYPE,IDT_1730,86,54,24,8 + LTEXT STR_FILE_NAME,IDT_1731,7,7,204,9 + COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_BUS,IDT_1721,7,73,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_CHANNEL,IDT_1722,99,73,34,8 + COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_ID,IDT_1723,99,73,34,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_IMG_FORMAT,IDT_1774,7,92,50,12 + COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_BLOCK_SIZE,IDT_1775,7,111,50,12 + COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_PROGRESS,IDT_1752,7,7,204,9 + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,7,16,204,12 +END + +DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,60 + LTEXT STR_FLOPPY_DRIVES,IDT_1737,7,7,253,8 + COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_TYPE,IDT_1738,7,87,24,8 + CONTROL STR_TURBO,IDC_CHECKTURBO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 + CONTROL STR_CHECKBPB,IDC_CHECKBPB,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 + + CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,117,253,60 + LTEXT STR_CDROM_DRIVES,IDT_1739,7,107,253,8 + COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_BUS,IDT_1740,7,187,24,8 + COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_ID,IDT_1741,131,187,38,8 + COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_CHANNEL,IDT_1742,131,187,38,8 + COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_SPEED,IDT_1758,7,207,24,8 +END + +DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + + CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,17,253,60 + LTEXT STR_MO_DRIVES,IDT_1769,7,7,253,8 + COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_BUS,IDT_1770,7,87,24,8 + COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_ID,IDT_1771,131,87,38,8 + COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_CHANNEL,IDT_1772,131,87,38,8 + COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_TYPE,IDT_1773,7,107,24,8 + + CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,137,253,60 + LTEXT STR_ZIP_DRIVES,IDT_1759,7,127,253,8 + COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_BUS,IDT_1753,7,207,14,8 + COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_ID,IDT_1754,120,207,28,8 + COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT STR_CHANNEL,IDT_1755,120,207,28,8 + CONTROL STR_250,IDC_CHECK250,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 +END + +DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT STR_ISARTC,IDT_1767,7,9,48,10 + COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_ISARTC,222,7,38,12 + + GROUPBOX STR_ISAMEM,IDC_GROUP_ISAMEM,7,28,253,93 + LTEXT STR_ISAMEM_1,IDT_1763,16,45,48,10 + COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_ISAMEM_1,213,43,38,12 + LTEXT STR_ISAMEM_2,IDT_1764,16,64,48,10 + COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_ISAMEM_2,213,62,38,12 + LTEXT STR_ISAMEM_3,IDT_1765,16,83,48,10 + COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_ISAMEM_3,213,81,38,12 + LTEXT STR_ISAMEM_4,IDT_1766,16,102,48,10 + COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON STR_CONFIGURE,IDC_CONFIGURE_ISAMEM_4,213,100,38,12 + + CONTROL STR_BUGGER,IDC_CHECK_BUGGER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 + + CONTROL STR_POSTCARD,IDC_CHECK_POSTCARD,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 +END diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 7c00d4be8..ccd5ff0d6 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -273,473 +273,125 @@ END // Dialog // -DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Change Display Language" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 179, 65, 50, 14 - COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS - AUTOCHECKBOX "Save these settings as &global defaults", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8 , WS_DISABLED - PUSHBUTTON "&Default", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 - LTEXT "Language:", 0, 13, 8, 34, 8 -END +#define STR_PROG_SETT "Change Display Language" +#define STR_SND_GAIN "Sound Gain" +#define STR_NEW_FLOPPY "New Image" +#define STR_CONFIG "86Box Settings" +#define STR_SPECIFY_DIM "Specify Main Window Dimensions" -DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Status" -FONT 9, "Segoe UI" -BEGIN - LTEXT "1",IDT_SDEVICE,16,16,180,1000 - LTEXT "1",IDT_STEXT,16,186,180,1000 -END +#define STR_OK "OK" +#define STR_CANCEL "Cancel" +#define STR_GLOBAL "Save these settings as &global defaults" +#define STR_DEFAULT "&Default" +#define STR_LANGUAGE "Language:" -DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Sound Gain" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,57,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,57,24,50,14 - CONTROL "Gain",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 - CTEXT "Gain",IDT_1746,10,7,32,9,SS_CENTERIMAGE -END +#define STR_GAIN "Gain" -DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "New Image" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,104,65,50,14 - PUSHBUTTON "Cancel",IDCANCEL,162,65,50,14 - LTEXT "File name:",IDT_1749,7,6,44,12,SS_CENTERIMAGE - LTEXT "Disk size:",IDT_1750,7,25,44,12,SS_CENTERIMAGE - LTEXT "RPM mode:",IDT_1751,7,45,44,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY - COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...",IDC_CFILE,206,5,13,14 - LTEXT "Progress:",IDT_1757,7,45,44,12,SS_CENTERIMAGE - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,53,45,166,14 -END +#define STR_FILE_NAME "File name:" +#define STR_DISK_SIZE "Disk size:" +#define STR_RPM_MODE "RPM mode:" +#define STR_PROGRESS "Progress:" -DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "86Box Settings" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,246,235,50,14 - PUSHBUTTON "Cancel",IDCANCEL,307,235,50,14 - CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 - CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -END +#define STR_WIDTH "Width:" +#define STR_HEIGHT "Height:" +#define STR_LOCK_TO_SIZE "Lock to this size" -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Specify Main Window Dimensions" -FONT 9, "Segoe UI" -BEGIN - LTEXT "Width:",IDT_1709,7,9,24,12 - EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, - 12,12 - LTEXT "Height:",IDT_1710,97,9,24,12 - EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, - 12,12 - CONTROL "Lock to this size",IDC_CHECK_LOCK_SIZE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 - DEFPUSHBUTTON "OK",IDOK,30,45,50,14 - PUSHBUTTON "Cancel",IDCANCEL,99,45,50,14 -END +#define STR_MACHINE_TYPE "Machine type:" +#define STR_MACHINE "Machine:" +#define STR_CONFIGURE "Configure" +#define STR_CPU_TYPE "CPU type:" +#define STR_SPEED "Speed:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Wait states:" +#define STR_MB "MB" +#define STR_MEMORY "Memory:" +#define STR_TIME_SYNC "Time synchronization" +#define STR_DISABLED "Disabled" +#define STR_ENABLED_LOCAL "Enabled (local time)" +#define STR_ENABLED_UTC "Enabled (UTC)" +#define STR_DYNAREC "Dynamic Recompiler" -DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Machine type:",IDT_1708,7,9,60,10 - COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Machine:",IDT_1701,7,28,60,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MACHINE,214,26,46,12 - COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "CPU type:",IDT_1702,7,47,59,10 - COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Speed:",IDT_1704,189,47,24,10 - COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "FPU:",IDT_1707,7,66,59,10 - COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Wait states:",IDT_1703,7,85,60,10 - EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, - 12,12 - LTEXT "MB",IDT_1705,123,104,10,10 - LTEXT "Memory:",IDT_1706,7,104,30,10 - GROUPBOX "Time synchronization",IDC_TIME_SYNC,7,135,100,56 - CONTROL "Disabled",IDC_RADIO_TS_DISABLED,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 - CONTROL "Enabled (local time)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 - CONTROL "Enabled (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 -#ifdef USE_DYNAREC - CONTROL "Dynamic Recompiler",IDC_CHECK_DYNAREC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 -#endif -END +#define STR_VIDEO "Video:" +#define STR_VOODOO "Voodoo Graphics" -DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Video:",IDT_1707,7,9,48,10 - COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_VID,222,7,38,12 - CONTROL "Voodoo Graphics",IDC_CHECK_VOODOO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 - PUSHBUTTON "Configure",IDC_BUTTON_VOODOO,222,26,38,12 -END +#define STR_MOUSE "Mouse:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Mouse:",IDT_1709,7,9,57,10 - COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_MOUSE,214,7,46,12 - LTEXT "Joystick:",IDT_1710,7,27,58,10 - COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 - PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 - PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 - PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 -END +#define STR_SOUND "Sound card:" +#define STR_MIDI "MIDI Out Device:" +#define STR_MIDI_IN "MIDI In Device:" +#define STR_MPU401 "Standalone MPU-401" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Use FLOAT32 sound" -DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Sound card:",IDT_1711,7,9,59,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_SND,214,7,46,12 +#define STR_NET_TYPE "Network type:" +#define STR_PCAP "PCap device:" +#define STR_NET "Network adapter:" - COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI Out Device:",IDT_1712,7,28,59,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MIDI,214,26,46,12 +#define STR_LPT1 "LPT1 Device" +#define STR_LPT2 "LPT2 Device" +#define STR_LPT3 "LPT3 Device" +#define STR_SERIAL1 "Serial port 1" +#define STR_SERIAL2 "Serial port 2" +#define STR_SERIAL3 "Serial port 3" +#define STR_SERIAL4 "Serial port 4" +#define STR_PARALLEL1 "Parallel port 1" +#define STR_PARALLEL2 "Parallel port 2" +#define STR_PARALLEL3 "Parallel port 3" - COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI In Device:",IDT_1713,7,47,59,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MIDI_IN,214,45,46,12 +#define STR_HDC "HD Controller:" +#define STR_FDC "FD Controller:" +#define STR_IDE_TER "Tertiary IDE Controller" +#define STR_IDE_QUA "Quaternary IDE Controller" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controller 1:" +#define STR_SCSI_2 "Controller 2:" +#define STR_SCSI_3 "Controller 3:" +#define STR_SCSI_4 "Controller 4:" +#define STR_CASSETTE "Cassette" - CONTROL "Standalone MPU-401",IDC_CHECK_MPU401,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_MPU401,214,64,46,12 +#define STR_HDD "Hard disks:" +#define STR_NEW "&New..." +#define STR_EXISTING "&Existing..." +#define STR_REMOVE "&Remove" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Channel:" +#define STR_ID "ID:" - CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_SSI,214,82,46,12 +#define STR_SPECIFY "&Specify..." +#define STR_SECTORS "Sectors:" +#define STR_HEADS "Heads:" +#define STR_CYLS "Cylinders:" +#define STR_SIZE_MB "Size (MB):" +#define STR_TYPE "Type:" +#define STR_IMG_FORMAT "Image Format:" +#define STR_BLOCK_SIZE "Block Size:" - CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_CMS,214,100,46,12 +#define STR_FLOPPY_DRIVES "Floppy drives:" +#define STR_TURBO "Turbo timings" +#define STR_CHECKBPB "Check BPB" +#define STR_CDROM_DRIVES "CD-ROM drives:" - CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_GUS,214,118,46,12 - - CONTROL "Use FLOAT32 sound",IDC_CHECK_FLOAT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 -END +#define STR_MO_DRIVES "MO drives:" +#define STR_ZIP_DRIVES "ZIP drives:" +#define STR_250 "ZIP 250" -DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Network type:",IDT_1714,7,9,59,10 - COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "ISA Memory Expansion" +#define STR_ISAMEM_1 "Card 1:" +#define STR_ISAMEM_2 "Card 2:" +#define STR_ISAMEM_3 "Card 3:" +#define STR_ISAMEM_4 "Card 4:" +#define STR_BUGGER "ISABugger device" +#define STR_POSTCARD "POST card" - LTEXT "PCap device:",IDT_1715,7,28,59,10 - COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - - LTEXT "Network adapter:",IDT_1716,7,47,59,10 - COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_NET,214,44,46,12 -END - -DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "LPT1 Device:",IDT_1717,7,9,61,10 - COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT2 Device:",IDT_1718,7,28,61,10 - COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT3 Device:",IDT_1719,7,47,61,10 - COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - CONTROL "Serial port 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 - CONTROL "Serial port 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 - CONTROL "Serial port 3",IDC_CHECK_SERIAL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 - CONTROL "Serial port 4",IDC_CHECK_SERIAL4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 - - CONTROL "Parallel port 1",IDC_CHECK_PARALLEL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 - CONTROL "Parallel port 2",IDC_CHECK_PARALLEL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 - CONTROL "Parallel port 3",IDC_CHECK_PARALLEL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 -END - -DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "HD Controller:",IDT_1718,7,9,64,10 - COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_HDC,222,7,38,12 - - LTEXT "FD Controller:",IDT_1768,7,28,64,10 - COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_FDC,222,26,38,12 - - CONTROL "Tertiary IDE Controller",IDC_CHECK_IDE_TER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 - PUSHBUTTON "Configure",IDC_BUTTON_IDE_TER,222,45,38,12 - - CONTROL "Quaternary IDE Controller",IDC_CHECK_IDE_QUA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configure",IDC_BUTTON_IDE_QUA,222,64,38,12 - - GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 - LTEXT "Controller 1:",IDT_1763,16,102,48,10 - COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_1,213,100,38,12 - LTEXT "Controller 2:",IDT_1764,16,121,48,10 - COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_2,213,119,38,12 - LTEXT "Controller 3:",IDT_1765,16,140,48,10 - COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_3,213,138,38,12 - LTEXT "Controller 4:",IDT_1766,16,159,48,10 - COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI_4,213,157,38,12 - - CONTROL "Cassette",IDC_CHECK_CASSETTE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 -END - -DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,92 - LTEXT "Hard disks:",IDT_1720,7,7,253,8 - PUSHBUTTON "&New...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 - PUSHBUTTON "&Existing...",IDC_BUTTON_HDD_ADD,129,137,62,10 - PUSHBUTTON "&Remove",IDC_BUTTON_HDD_REMOVE,198,137,62,10 - COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,119,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1722,131,119,38,8 - COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,131,119,38,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP -END - -DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add Hard Disk" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,55,127,50,14 - PUSHBUTTON "Cancel",IDCANCEL,112,127,50,14 - EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 - PUSHBUTTON "&Specify...",IDC_CFILE,167,16,44,12 - EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 - EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 - EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 - EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 - COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Sectors:",IDT_1726,154,35,27,10 - LTEXT "Heads:",IDT_1727,81,35,29,8 - LTEXT "Cylinders:",IDT_1728,7,35,32,12 - LTEXT "Size (MB):",IDT_1729,7,54,33,8 - LTEXT "Type:",IDT_1730,86,54,24,8 - LTEXT "File name:",IDT_1731,7,7,204,9 - COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,73,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1722,99,73,34,8 - COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,99,73,34,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Image Format:",IDT_1774,7,92,50,12 - COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Block Size:",IDT_1775,7,111,50,12 - COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Progress:",IDT_1752,7,7,204,9 - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,7,16,204,12 -END - -DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", - LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,60 - LTEXT "Floppy drives:",IDT_1737,7,7,253,8 - COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Type:",IDT_1738,7,87,24,8 - CONTROL "Turbo timings",IDC_CHECKTURBO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 - CONTROL "Check BPB",IDC_CHECKBPB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 - - CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,117,253,60 - LTEXT "CD-ROM drives:",IDT_1739,7,107,253,8 - COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1740,7,187,24,8 - COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1741,131,187,38,8 - COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1742,131,187,38,8 - COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Speed:",IDT_1758,7,207,24,8 -END - -DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - - CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,17,253,60 - LTEXT "MO drives:",IDT_1769,7,7,253,8 - COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1770,7,87,24,8 - COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1771,131,87,38,8 - COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1772,131,87,38,8 - COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Type:",IDT_1773,7,107,24,8 - - CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,137,253,60 - LTEXT "ZIP drives:",IDT_1759,7,127,253,8 - COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1753,7,207,14,8 - COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1754,120,207,28,8 - COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Channel:",IDT_1755,120,207,28,8 - CONTROL "ZIP 250",IDC_CHECK250,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 -END - -DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "ISA RTC:",IDT_1767,7,9,48,10 - COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISARTC,222,7,38,12 - - GROUPBOX "ISA Memory Expansion",IDC_GROUP_ISAMEM,7,28,253,93 - LTEXT "Card 1:",IDT_1763,16,45,48,10 - COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 - LTEXT "Card 2:",IDT_1764,16,64,48,10 - COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 - LTEXT "Card 3:",IDT_1765,16,83,48,10 - COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 - LTEXT "Card 4:",IDT_1766,16,102,48,10 - COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 - - CONTROL "ISABugger device",IDC_CHECK_BUGGER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 - - CONTROL "POST card",IDC_CHECK_POSTCARD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 -END +#include "dialogs.rc" ///////////////////////////////////////////////////////////////////////////// // From c53613deb74bd46860071ce765163d2aceeb4d12 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 20:25:07 +0100 Subject: [PATCH 126/159] Removed excess logs from cpu.c. --- src/cpu/cpu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 14d7a9b63..7021a83e4 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -2294,7 +2294,7 @@ amd_k_invalid_rdmsr: EDX = tsc >> 32; break; } - pclog("RDMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX); + cpu_log("RDMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX); break; case CPU_PENTIUMPRO: @@ -2700,7 +2700,7 @@ amd_k_invalid_wrmsr: case CPU_CxGX1: case CPU_Cx6x86MX: #endif - pclog("WRMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX); + cpu_log("WRMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX); switch (ECX) { case 0x10: tsc = EAX | ((uint64_t)EDX << 32); From 78f425912981f8fd186e07fbe32001a9c9aa0899 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 20:31:49 +0100 Subject: [PATCH 127/159] Fixed password jumper error on the TriGem Hawk. --- src/device/keyboard_at.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 2969ca82d..a210fd41d 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -1247,8 +1247,12 @@ write64_generic(void *priv, uint8_t val) } else { if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && ((dev->flags & KBC_VEN_MASK) != KBC_VEN_INTEL_AMI)) +#if 0 add_to_kbc_queue_front(dev, (dev->input_port | fixed_bits) & (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0xeb : 0xef), 0, 0x00); +#else + add_to_kbc_queue_front(dev, ((dev->input_port | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00); +#endif else add_to_kbc_queue_front(dev, dev->input_port | fixed_bits, 0, 0x00); dev->input_port = ((dev->input_port + 1) & 3) | From 9c729e9268d53f89bcdd0c5b5cbb2a5eb9a35633 Mon Sep 17 00:00:00 2001 From: dob205 Date: Sun, 14 Nov 2021 20:42:15 +0100 Subject: [PATCH 128/159] Updating the German localization with the new localization system --- src/win/languages/de-DE.rc | 570 ++++++++----------------------------- 1 file changed, 113 insertions(+), 457 deletions(-) diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 9503def1d..84b8d3f34 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -6,6 +6,8 @@ LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT #pragma code_page(65001) #endif //_WIN32 +#define AUTHORS + ///////////////////////////////////////////////////////////////////////////// // // Menu @@ -40,7 +42,7 @@ BEGIN MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL #if defined(DEV_BRANCH) && defined(USE_OPENGL) - MENUITEM "Open&GL (3.3 Core)", IDM_VID_OPENGL_CORE + MENUITEM "Open&GL (3.3-Kern)", IDM_VID_OPENGL_CORE #endif #ifdef USE_VNC MENUITEM "&VNC", IDM_VID_VNC @@ -82,6 +84,7 @@ BEGIN MENUITEM "&Grüner Monitor", IDM_VID_GRAY_GREEN MENUITEM "&Weißer Monitor", IDM_VID_GRAY_WHITE END + END POPUP "Methode zur &Graustufenkonversion" BEGIN MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 @@ -271,473 +274,125 @@ END // Dialog // -DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Anzeigesprache ändern" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 - PUSHBUTTON "Abbrechen", IDCANCEL, 179, 65, 50, 14 - COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS - AUTOCHECKBOX "Diese Einstellungen als &globalen Standard speichern", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8 , WS_DISABLED - PUSHBUTTON "&Default", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 - LTEXT "Sprache:", 0, 13, 8, 34, 8 -END +#define STR_PROG_SETT "Anzeigesprache ändern" +#define STR_SND_GAIN "Klangverstärkung" +#define STR_NEW_FLOPPY "Neues Image" +#define STR_CONFIG "86Box-Einstellungen" +#define STR_SPECIFY_DIM "Abmessungen des Hauptfensters einstellen" -DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Status" -FONT 9, "Segoe UI" -BEGIN - LTEXT "1",IDT_SDEVICE,16,16,180,1000 - LTEXT "1",IDT_STEXT,16,186,180,1000 -END +#define STR_OK "OK" +#define STR_CANCEL "Abbrechen" +#define STR_GLOBAL "Einstellungen als &globalen Standard speichern" +#define STR_DEFAULT "&Standard" +#define STR_LANGUAGE "Sprache:" -DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Schallverstärkung" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,57,7,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,57,24,50,14 - CONTROL "Verstärkung",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 - CTEXT "Verstärkung",IDT_1746,10,7,32,9,SS_CENTERIMAGE -END +#define STR_GAIN "Verstärkung" -DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Neues Image" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,104,65,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,162,65,50,14 - LTEXT "Dateiname:",IDT_1749,7,6,44,12,SS_CENTERIMAGE - LTEXT "Größe:",IDT_1750,7,25,44,12,SS_CENTERIMAGE - LTEXT "Drehzahlmodus:",IDT_1751,7,45,44,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY - COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...",IDC_CFILE,206,5,13,14 - LTEXT "Fortschritt:",IDT_1757,7,45,44,12,SS_CENTERIMAGE - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,53,45,166,14 -END +#define STR_FILE_NAME "Dateiname:" +#define STR_DISK_SIZE "Plattengröße:" +#define STR_RPM_MODE "Drehzahlmodus:" +#define STR_PROGRESS "Fortschritt:" -DLG_CONFIG DIALOG DISCARDABLE 0, 0, 396, 256 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "86Box-Einstellungen" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,246,235,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,307,235,50,14 - CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,120,212 - CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -END +#define STR_WIDTH "Breite:" +#define STR_HEIGHT "Höhe:" +#define STR_LOCK_TO_SIZE "Auf diese Größe festlegen" -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Abmessungen des Hauptfensters" -FONT 9, "Segoe UI" -BEGIN - LTEXT "Breite:",IDT_1709,7,9,24,12 - EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, - 12,12 - LTEXT "Höhe:",IDT_1710,97,9,24,12 - EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, - 12,12 - CONTROL "Auf diese Größe festlegen",IDC_CHECK_LOCK_SIZE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 - DEFPUSHBUTTON "OK",IDOK,30,45,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,99,45,50,14 -END +#define STR_MACHINE_TYPE "Maschinentyp:" +#define STR_MACHINE "Maschine:" +#define STR_CONFIGURE "Konfigurieren" +#define STR_CPU_TYPE "CPU-Typ:" +#define STR_SPEED "Takt:" +#define STR_FPU "FPU-Einheit:" +#define STR_WAIT_STATES "Wartezustände:" +#define STR_MB "MB" +#define STR_MEMORY "Hauptspeicher:" +#define STR_TIME_SYNC "Zeitsynchronisierung" +#define STR_DISABLED "Deaktiviert" +#define STR_ENABLED_LOCAL "Aktiviert (Lokalzeit)" +#define STR_ENABLED_UTC "Aktiviert (UTC)" +#define STR_DYNAREC "Dynamischer Recompiler" -DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Maschinentyp:",IDT_1708,7,9,60,10 - COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Maschine:",IDT_1701,7,28,60,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MACHINE,214,26,46,12 - COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "CPU-Typ:",IDT_1702,7,47,59,10 - COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Takt:",IDT_1704,189,47,24,10 - COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "FPU-Einheit:",IDT_1707,7,66,59,10 - COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Wartezustände:",IDT_1703,7,85,60,10 - EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, - 12,12 - LTEXT "MB",IDT_1705,123,104,10,10 - LTEXT "RAM:",IDT_1706,7,104,30,10 - GROUPBOX "Zeitsynchronization",IDC_TIME_SYNC,7,135,100,56 - CONTROL "Deaktiviert",IDC_RADIO_TS_DISABLED,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 - CONTROL "Aktiviert (Lokalzeit)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 - CONTROL "Aktiviert (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 -#ifdef USE_DYNAREC - CONTROL "Dynamischer Recompiler",IDC_CHECK_DYNAREC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 -#endif -END +#define STR_VIDEO "Videokarte:" +#define STR_VOODOO "Voodoo Graphics" -DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 277, 45 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Videokarte:",IDT_1707,7,9,48,10 - COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_VID,222,7,46,12 - CONTROL "Voodoo Graphics",IDC_CHECK_VOODOO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 - PUSHBUTTON "Konfigurieren",IDC_BUTTON_VOODOO,222,26,46,12 -END +#define STR_MOUSE "Maus:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 277, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Maus:",IDT_1709,7,9,57,10 - COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MOUSE,214,7,46,12 - LTEXT "Joystick:",IDT_1710,7,27,58,10 - COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 - PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 - PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 - PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 -END +#define STR_SOUND "Soundkarte:" +#define STR_MIDI "MIDI Out-Gerät:" +#define STR_MIDI_IN "MIDI In-Gerät:" +#define STR_MPU401 "Standalone-MPU-401-Gerät" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Use FLOAT32 sound" -DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 277, 201 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Soundkarte:",IDT_1711,7,9,59,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SND,214,7,46,12 +#define STR_NET_TYPE "Netzwerktyp:" +#define STR_PCAP "PCap-Gerät:" +#define STR_NET "Netzwerkadapter:" - COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI Out-Gerät:",IDT_1712,7,28,59,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MIDI,214,26,46,12 +#define STR_LPT1 "LPT1-Gerät" +#define STR_LPT2 "LPT2-Gerät" +#define STR_LPT3 "LPT3-Gerät" +#define STR_SERIAL1 "Serielle Schnittstelle 1" +#define STR_SERIAL2 "Serielle Schnittstelle 2" +#define STR_SERIAL3 "Serielle Schnittstelle 3" +#define STR_SERIAL4 "Serielle Schnittstelle 4" +#define STR_PARALLEL1 "Parallelport 1" +#define STR_PARALLEL2 "Parallelport 2" +#define STR_PARALLEL3 "Parallelport 3" - COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI In-Gerät:",IDT_1713,7,47,59,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MIDI_IN,214,45,46,12 +#define STR_HDC "HDD-Controller:" +#define STR_FDC "FD-Controller:" +#define STR_IDE_TER "Tertiärer IDE-Controller" +#define STR_IDE_QUA "Quartärer IDE-Controller" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controller 1:" +#define STR_SCSI_2 "Controller 2:" +#define STR_SCSI_3 "Controller 3:" +#define STR_SCSI_4 "Controller 4:" +#define STR_CASSETTE "Kassette" - CONTROL "Standalone-MPU-401-Gerät",IDC_CHECK_MPU401,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_MPU401,214,64,46,12 +#define STR_HDD "Festplatten:" +#define STR_NEW "&Neu..." +#define STR_EXISTING "&Vorhanden..." +#define STR_REMOVE "&Entfernen" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Kanal:" +#define STR_ID "ID:" - CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SSI,214,82,46,12 +#define STR_SPECIFY "&Festlegen..." +#define STR_SECTORS "Sektoren:" +#define STR_HEADS "Köpfe:" +#define STR_CYLS "Zylinder:" +#define STR_SIZE_MB "Größe (MB):" +#define STR_TYPE "Typ:" +#define STR_IMG_FORMAT "Imageformat:" +#define STR_BLOCK_SIZE "Blockgröße:" - CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_CMS,214,100,46,12 +#define STR_FLOPPY_DRIVES "Diskettenlaufwerke:" +#define STR_TURBO "Turbo-Timings" +#define STR_CHECKBPB "BPB überprüfen" +#define STR_CDROM_DRIVES "CD-ROM-Laufwerke:" - CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_GUS,214,118,46,12 - - CONTROL "FLOAT32-Sound nutzen",IDC_CHECK_FLOAT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 -END +#define STR_MO_DRIVES "MO-Laufwerke:" +#define STR_ZIP_DRIVES "ZIP-Laufwerke:" +#define STR_250 "ZIP 250" -DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 277, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Netzwerkttyp:",IDT_1714,7,9,59,10 - COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP +#define STR_ISARTC "ISA-Echtzeituhr:" +#define STR_ISAMEM "ISA-Speichererweiterung" +#define STR_ISAMEM_1 "Steckkarte 1:" +#define STR_ISAMEM_2 "Steckkarte 2:" +#define STR_ISAMEM_3 "Steckkarte 3:" +#define STR_ISAMEM_4 "Steckkarte 4:" +#define STR_BUGGER "ISABugger-Gerät" +#define STR_POSTCARD "POST-Code-Karte" - LTEXT "PCap-Gerät:",IDT_1715,7,28,59,10 - COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - - LTEXT "Netzwerkadapter:",IDT_1716,7,47,59,10 - COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_NET,214,44,46,12 -END - -DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 277, 135 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "LPT1-Gerät:",IDT_1717,7,9,61,10 - COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT2-Gerät:",IDT_1718,7,28,61,10 - COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT3-Gerät:",IDT_1719,7,47,61,10 - COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - CONTROL "Serielle Schnittstelle 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 - CONTROL "Serielle Schnittstelle 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 - CONTROL "Serielle Schnittstelle 3",IDC_CHECK_SERIAL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 - CONTROL "Serielle Schnittstelle 4",IDC_CHECK_SERIAL4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 - - CONTROL "Parallelport 1",IDC_CHECK_PARALLEL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 - CONTROL "Parallelport 2",IDC_CHECK_PARALLEL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 - CONTROL "Parallelport 3",IDC_CHECK_PARALLEL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 -END - -DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 277, 203 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "HDD-Controller:",IDT_1718,7,9,64,10 - COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_HDC,222,7,46,12 - - LTEXT "FD-Controller:",IDT_1768,7,28,64,10 - COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_FDC,222,26,46,12 - - CONTROL "Tertiärer IDE-Controller",IDC_CHECK_IDE_TER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 - PUSHBUTTON "Konfigurieren",IDC_BUTTON_IDE_TER,222,45,46,12 - - CONTROL "Quartärer IDE-Controller",IDC_CHECK_IDE_QUA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Konfigurieren",IDC_BUTTON_IDE_QUA,222,64,46,12 - - GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,263,93 - LTEXT "Controller 1:",IDT_1763,16,102,48,10 - COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_1,213,100,46,12 - LTEXT "Controller 2:",IDT_1764,16,121,48,10 - COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_2,213,119,46,12 - LTEXT "Controller 3:",IDT_1765,16,140,48,10 - COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_3,213,138,46,12 - LTEXT "Controller 4:",IDT_1766,16,159,48,10 - COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_SCSI_4,213,157,46,12 - - CONTROL "Kassette",IDC_CHECK_CASSETTE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 -END - -DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 277, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,263,92 - LTEXT "Festplatten:",IDT_1720,7,7,263,8 - PUSHBUTTON "&Neu...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 - PUSHBUTTON "&Vorhanden...",IDC_BUTTON_HDD_ADD,129,137,62,10 - PUSHBUTTON "&Entfernen",IDC_BUTTON_HDD_REMOVE,198,137,62,10 - COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,119,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Kanal:",IDT_1722,131,119,38,8 - COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,131,119,38,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP -END - -DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Festplatte hinzufügen" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,55,127,50,14 - PUSHBUTTON "Abbrechen",IDCANCEL,112,127,50,14 - EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 - PUSHBUTTON "&Auswählen...",IDC_CFILE,167,16,44,12 - EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 - EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 - EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 - EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 - COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Sektoren:",IDT_1726,150,35,30,10 - LTEXT "Köpfe:",IDT_1727,81,35,29,8 - LTEXT "Zylinder:",IDT_1728,7,35,32,12 - LTEXT "Größe (MB):",IDT_1729,7,54,39,8 - LTEXT "Typ:",IDT_1730,86,54,24,8 - LTEXT "Dateiname:",IDT_1731,7,7,204,9 - COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,73,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Kanal:",IDT_1722,99,73,34,8 - COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,99,73,34,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Imageformat:",IDT_1774,7,92,50,12 - COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Blockgröße:",IDT_1775,7,111,50,12 - COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Fortschritt:",IDT_1752,7,7,204,9 - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,7,16,204,12 -END - -DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 277, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", - LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,263,60 - LTEXT "Diskettenlaufwerke:",IDT_1737,7,7,263,8 - COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Typ:",IDT_1738,7,87,24,8 - CONTROL "Turbo-Timings",IDC_CHECKTURBO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 - CONTROL "BPB überprüfen",IDC_CHECKBPB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 - - CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,117,263,60 - LTEXT "CD-ROM-Laufwerke:",IDT_1739,7,107,263,8 - COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1740,7,187,24,8 - COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1741,131,187,38,8 - COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Kanal:",IDT_1742,131,187,38,8 - COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Geschwindigkeit:",IDT_1758,7,207,24,8 -END - -DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 277, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - - CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,17,263,60 - LTEXT "MO-Disk-Laufwerke:",IDT_1769,7,7,263,8 - COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1770,7,87,24,8 - COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1771,131,87,38,8 - COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Kanal:",IDT_1772,131,87,38,8 - COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Typ:",IDT_1773,7,107,24,8 - - CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,137,263,60 - LTEXT "ZIP-Laufwerke:",IDT_1759,7,127,263,8 - COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1753,7,207,14,8 - COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1754,120,207,28,8 - COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Kanal:",IDT_1755,120,207,28,8 - CONTROL "ZIP 250",IDC_CHECK250,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 -END - -DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 277, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "ISA-Echtzeituhr:",IDT_1767,7,9,48,10 - COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISARTC,222,7,46,12 - - GROUPBOX "ISA-Speichererweiterung",IDC_GROUP_ISAMEM,7,28,263,93 - LTEXT "Steckkarte 1:",IDT_1763,16,45,48,10 - COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_1,213,43,46,12 - LTEXT "Steckkarte 2:",IDT_1764,16,64,48,10 - COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_2,213,62,46,12 - LTEXT "Steckkarte 3:",IDT_1765,16,83,48,10 - COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_3,213,81,46,12 - LTEXT "Steckkarte 4:",IDT_1766,16,102,48,10 - COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Konfigurieren",IDC_CONFIGURE_ISAMEM_4,213,100,46,12 - - CONTROL "ISABugger-Gerät",IDC_CHECK_BUGGER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 - - CONTROL "POST-Code-Karte",IDC_CHECK_POSTCARD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 -END +#include "dialogs.rc" ///////////////////////////////////////////////////////////////////////////// // @@ -753,14 +408,14 @@ BEGIN IDS_2052 "Bitte Strg+Alt+Bild ab zur Rückkehr in den Fenstermodus drücken." IDS_2053 "Geschwindigkeit" IDS_2054 "ZIP %03i %i (%s): %ls" - IDS_2055 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2055 "ZIP images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" IDS_2056 "86Box konnte keine nutzbaren ROM-Images finden.\n\nBitte besuchen Sie download, laden ein ROM-Set herunter und extrahieren dies in das ""roms""-Verzeichnis." IDS_2057 "(leer)" - IDS_2058 "ZIP-Images (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2058 "ZIP-Imagedateien (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Alle Dateien (*.*)\0*.*\0" IDS_2059 "Turbo" IDS_2060 "An" IDS_2061 "Aus" - IDS_2062 "Alle Images (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basissektorimages (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Oberflächenimages (*.86F)\0*.86F\0" + IDS_2062 "Alle Imagedateien (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Basissektorimages (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Oberflächenimages (*.86F)\0*.86F\0" IDS_2063 "Die Maschine ""%hs"" ist aufgrund von fehlenden ROMs im Verzeichnis roms/machines nicht verfügbar. Es wird auf eine verfügbare Maschine gewechselt." END @@ -796,7 +451,7 @@ BEGIN IDS_2087 "BPB prüfen" IDS_2088 "KB" IDS_2089 "Der Videorenderer konnte nicht initialisiert werden." - IDS_2090 "Default" + IDS_2090 "Standard" IDS_2091 "%i Wartezustände" IDS_2092 "Typ" IDS_2093 "PCap konnte nicht eingerichtet werden" @@ -813,7 +468,7 @@ BEGIN IDS_2104 "Tastaturbeschleuniger konnten nicht geladen werden." IDS_2105 "Roheingaben konnten nicht registriert werden." IDS_2106 "%u" - IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2107 "%u MB (ZKS: %i, %i, %i)" IDS_2108 "Diskette %i (%s): %ls" IDS_2109 "Alle Images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Fortgeschrittene Sektorimages (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basissektorimages (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Fluximages (*.FDI)\0*.FDI\0Oberflächenimages (*.86F;*.MFM)\0*.86F;*.MFM\0Alle Dateien (*.*)\0*.*\0" IDS_2110 "FreeType konnte nicht initialisiert werden" @@ -832,6 +487,7 @@ BEGIN IDS_2123 "Speichern" IDS_2124 "Über 86Box" IDS_2125 "86Box Version " EMU_VERSION + IDS_2126 "Ein Emulator für alte Computer\n\nAutoren: Sarah Walker, Miran Grča, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho sowie andere.\n\nÜbersetzt von: dob205\n\nVeröffentlicht unter der GNU General Public License in der Version 2 oder neuer. Siehe LICENSE für mehr Informationen." IDS_2127 "OK" IDS_2128 "Hardware nicht verfügbar" @@ -918,7 +574,7 @@ BEGIN IDS_4129 "Kleine Blöcke (512 KB)" IDS_4130 "VHD-Dateien (*.VHD)\0*.VHD\0Alle Dateien (*.*)\0*.*\0" IDS_4131 "Eltern-VHD-Datei bitte auswählen" - IDS_4132 "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nEs kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nMöchten Sie die Zeitstempel korrigieren?" + IDS_4132 "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nDies kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nMöchten Sie die Zeitstempel korrigieren?" IDS_4133 "Die Zeitstempel der Eltern- und der Kindesplatte stimmen nicht überein" IDS_4134 "Der Zeitstempel der VHD konnte nicht korrigiert werden." IDS_4135 "%01i:%02i" From 3c7cdfa0f9fdda9e4a92dddbacf44d1919bfb85d Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 20:47:08 +0100 Subject: [PATCH 129/159] Implemented more AMI KBC commands, should fix the AMI Excalibur PCI-II. --- src/device/keyboard_at.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index a210fd41d..b7cd3951e 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -1320,6 +1320,11 @@ write60_ami(void *priv, uint8_t val) } return 0; + case 0xc1: + kbd_log("ATkbc: AMI MegaKey - write %02X to input port\n", val); + dev->input_port = val; + return 0; + case 0xcb: /* set keyboard mode */ kbd_log("ATkbc: AMI - set keyboard mode\n"); dev->ami_flags = val; @@ -1475,6 +1480,24 @@ write64_ami(void *priv, uint8_t val) add_data(dev, 0x00); return 0; + case 0xc1: /* write input port */ + kbd_log("ATkbc: AMI MegaKey - write input port\n"); + dev->want60 = 1; + return 0; + + case 0xc4: + /* set KBC line P14 low */ + kbd_log("ATkbc: set KBC line P14 (input port bit 4) low\n"); + dev->input_port &= 0xef; + add_data(dev, 0x00); + return 0; + case 0xc5: + /* set KBC line P15 low */ + kbd_log("ATkbc: set KBC line P15 (input port bit 5) low\n"); + dev->input_port &= 0xdf; + add_data(dev, 0x00); + return 0; + case 0xc8: /* * unblock KBC lines P22/P23 @@ -1493,6 +1516,19 @@ write64_ami(void *priv, uint8_t val) dev->output_locked = 1; return 0; + case 0xcc: + /* set KBC line P14 high */ + kbd_log("ATkbc: set KBC line P14 (input port bit 4) high\n"); + dev->input_port |= 0x10; + add_data(dev, 0x00); + return 0; + case 0xcd: + /* set KBC line P15 high */ + kbd_log("ATkbc: set KBC line P15 (input port bit 5) high\n"); + dev->input_port |= 0x20; + add_data(dev, 0x00); + return 0; + case 0xef: /* ??? - sent by AMI486 */ kbd_log("ATkbc: ??? - sent by AMI486\n"); return 0; From 2017b27a37b9d0e35d024bded27a5d858f014c9c Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 21:45:16 +0100 Subject: [PATCH 130/159] And Hungarian. --- src/win/languages/dialogs.rc | 118 ++++++++ src/win/languages/hu-HU.rc | 549 +++++++---------------------------- 2 files changed, 220 insertions(+), 447 deletions(-) diff --git a/src/win/languages/dialogs.rc b/src/win/languages/dialogs.rc index 0b3cf125b..6645c462d 100644 --- a/src/win/languages/dialogs.rc +++ b/src/win/languages/dialogs.rc @@ -456,3 +456,121 @@ BEGIN CONTROL STR_POSTCARD,IDC_CHECK_POSTCARD,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 END + +#undef STR_PROG_SETT +#undef STR_SND_GAIN +#undef STR_NEW_FLOPPY +#undef STR_CONFIG +#undef STR_SPECIFY_DIM + +#undef STR_OK +#undef STR_CANCEL +#undef STR_GLOBAL +#undef STR_DEFAULT +#undef STR_LANGUAGE + +#undef STR_GAIN + +#undef STR_FILE_NAME +#undef STR_DISK_SIZE +#undef STR_RPM_MODE +#undef STR_PROGRESS + +#undef STR_WIDTH +#undef STR_HEIGHT +#undef STR_LOCK_TO_SIZE + +#undef STR_MACHINE_TYPE +#undef STR_MACHINE +#undef STR_CONFIGURE +#undef STR_CPU_TYPE +#undef STR_SPEED +#undef STR_FPU +#undef STR_WAIT_STATES +#undef STR_MB +#undef STR_MEMORY +#undef STR_TIME_SYNC +#undef STR_DISABLED +#undef STR_ENABLED_LOCAL +#undef STR_ENABLED_UTC +#undef STR_DYNAREC + +#undef STR_VIDEO +#undef STR_VOODOO + +#undef STR_MOUSE +#undef STR_JOYSTICK +#undef STR_JOY1 +#undef STR_JOY2 +#undef STR_JOY3 +#undef STR_JOY4 + +#undef STR_SOUND +#undef STR_MIDI +#undef STR_MIDI_IN +#undef STR_MPU401 +#undef STR_SSI +#undef STR_CMS +#undef STR_GUS +#undef STR_FLOAT + +#undef STR_NET_TYPE +#undef STR_PCAP +#undef STR_NET + +#undef STR_LPT1 +#undef STR_LPT2 +#undef STR_LPT3 +#undef STR_SERIAL1 +#undef STR_SERIAL2 +#undef STR_SERIAL3 +#undef STR_SERIAL4 +#undef STR_PARALLEL1 +#undef STR_PARALLEL2 +#undef STR_PARALLEL3 + +#undef STR_HDC +#undef STR_FDC +#undef STR_IDE_TER +#undef STR_IDE_QUA +#undef STR_SCSI +#undef STR_SCSI_1 +#undef STR_SCSI_2 +#undef STR_SCSI_3 +#undef STR_SCSI_4 +#undef STR_CASSETTE + +#undef STR_HDD +#undef STR_NEW +#undef STR_EXISTING +#undef STR_REMOVE +#undef STR_BUS +#undef STR_CHANNEL +#undef STR_ID + +#undef STR_SPECIFY +#undef STR_SECTORS +#undef STR_HEADS +#undef STR_CYLS +#undef STR_SIZE_MB +#undef STR_TYPE +#undef STR_IMG_FORMAT +#undef STR_BLOCK_SIZE + +#undef STR_FLOPPY_DRIVES +#undef STR_TURBO +#undef STR_CHECKBPB +#undef STR_CDROM_DRIVES + +#undef STR_MO_DRIVES +#undef STR_ZIP_DRIVES +#undef STR_250 + +#undef STR_ISARTC +#undef STR_ISAMEM +#undef STR_ISAMEM_1 +#undef STR_ISAMEM_2 +#undef STR_ISAMEM_3 +#undef STR_ISAMEM_4 +#undef STR_BUGGER +#undef STR_POSTCARD diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 0e60cbdbf..fdda601a6 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -275,471 +275,126 @@ END // // Dialog // -DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Nyelvi beállítások" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 - PUSHBUTTON "Mégse", IDCANCEL, 179, 65, 50, 14 - COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS - AUTOCHECKBOX "Beállítások mentése &globális alapértékként", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8, WS_DISABLED - PUSHBUTTON "&Alapértelmezett", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 - LTEXT "Nyelv:", 0, 13, 8, 34, 8 -END -DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Status" -FONT 9, "Segoe UI" -BEGIN - LTEXT "1",IDT_SDEVICE,16,16,180,1000 - LTEXT "1",IDT_STEXT,16,186,180,1000 -END +#define STR_PROG_SETT "Nyelvi beállítások" +#define STR_SND_GAIN "Hangerőszabályzó" +#define STR_NEW_FLOPPY "Új képfájl létrehozása" +#define STR_CONFIG "86Box beállítások" +#define STR_SPECIFY_DIM "Főablak méreteinek megadása" -DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Hangerőszabályzó" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,57,7,50,14 - PUSHBUTTON "Mégse",IDCANCEL,57,24,50,14 - CONTROL "Hangerő",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 - CTEXT "Hangerő",IDT_1746,10,7,32,9,SS_CENTERIMAGE -END +#define STR_OK "OK" +#define STR_CANCEL "Mégse" +#define STR_GLOBAL "Beállítások mentése &globális alapértékként" +#define STR_DEFAULT "&Alapértelmezett" +#define STR_LANGUAGE "Nyelv:" -DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Új képfájl létrehozása" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,104,65,50,14 - PUSHBUTTON "Mégse",IDCANCEL,162,65,50,14 - LTEXT "Fájlnév:",IDT_1749,7,6,44,12,SS_CENTERIMAGE - LTEXT "Méret:",IDT_1750,7,25,44,12,SS_CENTERIMAGE - LTEXT "RPM-mód:",IDT_1751,7,45,44,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY - COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...",IDC_CFILE,206,5,13,14 - LTEXT "Folyamat:",IDT_1757,7,45,44,12,SS_CENTERIMAGE - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,53,45,166,14 -END +#define STR_GAIN "Hangerő" -DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "86Box beállítások" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,246,235,50,14 - PUSHBUTTON "Mégse",IDCANCEL,307,235,50,14 - CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 - CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -END +#define STR_FILE_NAME "Fájlnév:" +#define STR_DISK_SIZE "Méret:" +#define STR_RPM_MODE "RPM-mód:" +#define STR_PROGRESS "Folyamat:" -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 203, 66 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Főablak méreteinek megadása" -FONT 9, "Segoe UI" -BEGIN - LTEXT "Szélesség:",IDT_1709,7, 9, 34, 12 - EDITTEXT IDC_EDIT_WIDTH,44, 7, 45, 12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS, 87, 6, 10, 12 - LTEXT "Magasság:",IDT_1710,103, 8, 35, 12 - EDITTEXT IDC_EDIT_HEIGHT, 140, 7, 45, 12 ,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,183, 6, 10, 12 - CONTROL "Rögzítés a megadott méretre",IDC_CHECK_LOCK_SIZE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7, 26, 123, 10 - DEFPUSHBUTTON "OK",IDOK,42, 45, 50, 14 - PUSHBUTTON "Mégse",IDCANCEL,112, 45, 50, 14 -END +#define STR_WIDTH "Szélesség:" +#define STR_HEIGHT "Magasság:" +#define STR_LOCK_TO_SIZE "Rögzítés a megadott méretre" -DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Géptípus:",IDT_1708,7,9,60,10 - COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Számítógép:",IDT_1701,7,28,60,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MACHINE,214,26,46,12 - COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Processzor:",IDT_1702,7,47,59,10 - COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Seb.:",IDT_1704,189,47,24,10 - COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "FPU-egység:",IDT_1707,7,66,59,10 - COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Várak. ciklusok:",IDT_1703,7,85,60,10 - EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, - 12,12 - LTEXT "MB",IDT_1705,123,104,10,10 - LTEXT "Memória:",IDT_1706,7,104,30,10 - GROUPBOX "Idő szinkronizáció",IDC_TIME_SYNC,7,135,114,56 - CONTROL "Letiltva",IDC_RADIO_TS_DISABLED,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 - CONTROL "Engedélyezve (helyi idő)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,102,10 - CONTROL "Engedélyezve (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,102,10 -#ifdef USE_DYNAREC - CONTROL "Dinamikus újrafordítás",IDC_CHECK_DYNAREC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 -#endif -END +#define STR_MACHINE_TYPE "Géptípus:" +#define STR_MACHINE "Számítógép:" +#define STR_CONFIGURE "Beállítások..." +#define STR_CPU_TYPE "Processzor:" +#define STR_SPEED "Seb.:" +#define STR_FPU "FPU-egység:" +#define STR_WAIT_STATES "Várak. ciklusok:" +#define STR_MB "MB" +#define STR_MEMORY "Memória:" +#define STR_TIME_SYNC "Idő szinkronizáció" +#define STR_DISABLED "Letiltva" +#define STR_ENABLED_LOCAL "Engedélyezve (helyi idő)" +#define STR_ENABLED_UTC "Engedélyezve (UTC)" +#define STR_DYNAREC "Dinamikus újrafordítás" -DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Videokártya:",IDT_1707,7,9,48,10 - COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_VID,222,7,38,12 - CONTROL "Voodoo-gyorsítókártya",IDC_CHECK_VOODOO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 - PUSHBUTTON "Beállítások",IDC_BUTTON_VOODOO,222,26,38,12 -END +#define STR_VIDEO "Videokártya:" +#define STR_VOODOO "Voodoo-gyorsítókártya" -DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Egér:",IDT_1709,7,9,57,10 - COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MOUSE,214,7,46,12 - LTEXT "Játékvezérlő:",IDT_1710,7,27,58,10 - COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Játékvez. 1...",IDC_JOY1,7,44,50,14 - PUSHBUTTON "Játékvez. 2...",IDC_JOY2,74,44,50,14 - PUSHBUTTON "Játékvez. 3...",IDC_JOY3,141,44,50,14 - PUSHBUTTON "Játékvez. 4...",IDC_JOY4,209,44,50,14 -END +#define STR_MOUSE "Egér:" +#define STR_JOYSTICK "Játékvezérlő:" +#define STR_JOY1 "Játékvez. 1..." +#define STR_JOY2 "Játékvez. 2..." +#define STR_JOY3 "Játékvez. 3..." +#define STR_JOY4 "Játékvez. 4..." -DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Hangkártya:",IDT_1711,7,9,59,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_SND,214,7,46,12 +#define STR_SOUND "Hangkártya:" +#define STR_MIDI "MIDI-kimenet:" +#define STR_MIDI_IN "MIDI-bemenet:" +#define STR_MPU401 "Különálló MPU-401" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "FLOAT32 használata" - COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI-kimenet:",IDT_1712,7,28,59,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MIDI,214,26,46,12 +#define STR_NET_TYPE "Hálózati típusa:" +#define STR_PCAP "PCap eszköz:" +#define STR_NET "Hálózati kártya:" - COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "MIDI-bemenet:",IDT_1713,7,47,59,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MIDI_IN,214,45,46,12 +#define STR_LPT1 "LPT1 eszköz:" +#define STR_LPT2 "LPT2 eszköz:" +#define STR_LPT3 "LPT3 eszköz:" +#define STR_SERIAL1 "Soros port 1" +#define STR_SERIAL2 "Soros port 2" +#define STR_SERIAL3 "Soros port 3" +#define STR_SERIAL4 "Soros port 4" +#define STR_PARALLEL1 "Párhuzamos port 1" +#define STR_PARALLEL2 "Párhuzamos port 2" +#define STR_PARALLEL3 "Párhuzamos port 3" - CONTROL "Különálló MPU-401",IDC_CHECK_MPU401,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_MPU401,214,64,46,12 +#define STR_HDC "Merevl.-vezérlő:" +#define STR_FDC "Floppy-vezérlő:" +#define STR_IDE_TER "Harmadlagos IDE-vezérlő" +#define STR_IDE_QUA "Negyedleges IDE-vezérlő" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Gazdaadapt. 1:" +#define STR_SCSI_2 "Gazdaadapt. 2:" +#define STR_SCSI_3 "Gazdaadapt. 3:" +#define STR_SCSI_4 "Gazdaadapt. 4:" +#define STR_CASSETTE "Magnókazetta" - CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_SSI,214,82,46,12 +#define STR_HDD "Merevlemezek:" +#define STR_NEW "&Új..." +#define STR_EXISTING "&Megnyitás..." +#define STR_REMOVE "&Eltávolítás" +#define STR_BUS "Busz:" +#define STR_CHANNEL "Csatorna:" +#define STR_ID "ID:" - CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_CMS,214,100,46,12 +#define STR_SPECIFY "&Kiválasztás..." +#define STR_SECTORS "Szektor:" +#define STR_HEADS "Fej:" +#define STR_CYLS "Cilinder:" +#define STR_SIZE_MB "Méret (MB):" +#define STR_TYPE "Típus:" +#define STR_IMG_FORMAT "Formátum:" +#define STR_BLOCK_SIZE "Blokkméret:" - CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_GUS,214,118,46,12 - - CONTROL "FLOAT32 használata",IDC_CHECK_FLOAT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 -END +#define STR_FLOPPY_DRIVES "Floppy-meghajtók:" +#define STR_TURBO "Turbó időzítés" +#define STR_CHECKBPB "BPB ellenőrzés" +#define STR_CDROM_DRIVES "CD-ROM meghajtók:" -DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Hálózati típusa:",IDT_1714,7,9,59,10 - COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP +#define STR_MO_DRIVES "MO-meghajtók:" +#define STR_ZIP_DRIVES "ZIP-meghajtók:" +#define STR_250 "ZIP 250" - LTEXT "PCap eszköz:",IDT_1715,7,28,59,10 - COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "ISA memóriabővítők" +#define STR_ISAMEM_1 "Kártya 1:" +#define STR_ISAMEM_2 "Kártya 2:" +#define STR_ISAMEM_3 "Kártya 3:" +#define STR_ISAMEM_4 "Kártya 4:" +#define STR_BUGGER "ISABugger eszköz" +#define STR_POSTCARD "POST kártya" - LTEXT "Hálózati kártya:",IDT_1716,7,47,59,10 - COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - PUSHBUTTON "Beállítások...",IDC_CONFIGURE_NET,214,44,46,12 -END - -DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "LPT1 eszköz:",IDT_1717,7,9,61,10 - COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT2 eszköz:",IDT_1718,7,28,61,10 - COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "LPT3 eszköz:",IDT_1719,7,47,61,10 - COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - CONTROL "Soros port 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 - CONTROL "Soros port 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 - CONTROL "Soros port 3",IDC_CHECK_SERIAL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 - CONTROL "Soros port 4",IDC_CHECK_SERIAL4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 - - CONTROL "Párhuzamos port 1",IDC_CHECK_PARALLEL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 - CONTROL "Párhuzamos port 2",IDC_CHECK_PARALLEL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 - CONTROL "Párhuzamos port 3",IDC_CHECK_PARALLEL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 -END - -DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Merevl.-vezérlő:",IDT_1718,7,9,64,10 - COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_HDC,222,7,38,12 - - LTEXT "Floppy-vezérlő:",IDT_1768,7,28,64,10 - COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_FDC,222,26,38,12 - - CONTROL "Harmadlagos IDE-vezérlő",IDC_CHECK_IDE_TER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 - PUSHBUTTON "Beállítások",IDC_BUTTON_IDE_TER,222,45,38,12 - - CONTROL "Negyedleges IDE-vezérlő",IDC_CHECK_IDE_QUA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Beállítások",IDC_BUTTON_IDE_QUA,222,64,38,12 - - GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 - LTEXT "Gazdaadapt. 1:",IDT_1763,16,102,48,10 - COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_1,213,100,38,12 - LTEXT "Gazdaadap. 2:",IDT_1764,16,121,48,10 - COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_2,213,119,38,12 - LTEXT "Gazdaadapt. 3:",IDT_1765,16,140,48,10 - COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_3,213,138,38,12 - LTEXT "Gazdaadapt. 4:",IDT_1766,16,159,48,10 - COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_SCSI_4,213,157,38,12 - - CONTROL "Magnókazetta",IDC_CHECK_CASSETTE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 -END - -DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,92 - LTEXT "Merevlemezek:",IDT_1720,7,7,253,8 - PUSHBUTTON "&Új...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 - PUSHBUTTON "&Megnyitás...",IDC_BUTTON_HDD_ADD,129,137,62,10 - PUSHBUTTON "&Eltávolítás",IDC_BUTTON_HDD_REMOVE,198,137,62,10 - COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Busz:",IDT_1721,7,119,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Csatorna:",IDT_1722,131,119,38,8 - COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,131,119,38,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP -END - -DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Merevlemez hozzáadása" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,55,127,50,14 - PUSHBUTTON "Mégse",IDCANCEL,112,127,50,14 - EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 - PUSHBUTTON "&Kiválasztás...",IDC_CFILE,167,16,44,12 - EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 - EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 - EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 - EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 - COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Szektor:",IDT_1726,154,35,27,10 - LTEXT "Fej:",IDT_1727,81,35,29,8 - LTEXT "Cilinder:",IDT_1728,7,35,32,12 - LTEXT "Méret (MB):",IDT_1729,7,54,33,8 - LTEXT "Típus:",IDT_1730,86,54,24,8 - LTEXT "Fájlnév:",IDT_1731,7,7,204,9 - COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Busz:",IDT_1721,7,73,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Csatorna:",IDT_1722,99,73,34,8 - COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,99,73,34,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Formátum:",IDT_1774,7,92,50,12 - COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Blokkméret:",IDT_1775,7,111,50,12 - COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Folyamat:",IDT_1752,7,7,204,9 - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,7,16,204,12 -END - -DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", - LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,60 - LTEXT "Floppy-meghajtók:",IDT_1737,7,7,253,8 - COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Típus:",IDT_1738,7,87,24,8 - CONTROL "Turbó időzítés",IDC_CHECKTURBO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 - CONTROL "BPB ellenőrzés",IDC_CHECKBPB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 - - CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,117,253,60 - LTEXT "CD-ROM meghajtók:",IDT_1739,7,107,253,8 - COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Busz:",IDT_1740,7,187,24,8 - COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1741,131,187,38,8 - COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Csatorna:",IDT_1742,131,187,38,8 - COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Seb.:",IDT_1758,7,207,24,8 -END - -DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - - CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,17,253,60 - LTEXT "MO-meghajtók:",IDT_1769,7,7,253,8 - COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Busz:",IDT_1770,7,87,24,8 - COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1771,131,87,38,8 - COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Csatorna:",IDT_1772,131,87,38,8 - COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Típus:",IDT_1773,7,107,24,8 - - CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,137,253,60 - LTEXT "ZIP-meghajtók:",IDT_1759,7,127,253,8 - COMBOBOX IDC_COMBO_ZIP_BUS,33, 205, 84, 14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Busz:",IDT_1753,7,207,24,8 - COMBOBOX IDC_COMBO_ZIP_ID,170,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1754,120,207,28,8 - COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Csatorna:",IDT_1755,120,207,28,8 - CONTROL "ZIP 250",IDC_CHECK250,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 -END - -DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "ISA RTC:",IDT_1767,7,9,48,10 - COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISARTC,222,7,38,12 - - GROUPBOX "ISA memóriabővítők",IDC_GROUP_ISAMEM,7,28,253,93 - LTEXT "Kártya 1:",IDT_1763,16,45,48,10 - COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 - LTEXT "Kártya 2:",IDT_1764,16,64,48,10 - COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 - LTEXT "Kártya 3:",IDT_1765,16,83,48,10 - COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 - LTEXT "Kártya 4:",IDT_1766,16,102,48,10 - COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Beállítások",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 - - CONTROL "ISABugger eszköz",IDC_CHECK_BUGGER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 - - CONTROL "POST kártya",IDC_CHECK_POSTCARD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 -END +#include "dialogs.rc" ///////////////////////////////////////////////////////////////////////////// // From f737926fc71ca1f6858c682ccd9a12f2e6bda5ce Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 21:56:31 +0100 Subject: [PATCH 131/159] And Portuguese (Brazil). --- src/win/languages/en-US.rc | 6 +- src/win/languages/pt-BR.rc | 550 +++++++------------------------------ 2 files changed, 105 insertions(+), 451 deletions(-) diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index ccd5ff0d6..443d0debc 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -334,9 +334,9 @@ END #define STR_PCAP "PCap device:" #define STR_NET "Network adapter:" -#define STR_LPT1 "LPT1 Device" -#define STR_LPT2 "LPT2 Device" -#define STR_LPT3 "LPT3 Device" +#define STR_LPT1 "LPT1 Device:" +#define STR_LPT2 "LPT2 Device:" +#define STR_LPT3 "LPT3 Device:" #define STR_SERIAL1 "Serial port 1" #define STR_SERIAL2 "Serial port 2" #define STR_SERIAL3 "Serial port 3" diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 951ea6dc7..41ef506aa 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -275,471 +275,125 @@ END // Dialog // -DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Alterar idioma de exibição" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 179, 65, 50, 14 - COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS - AUTOCHECKBOX "Use estas configurações como &padrões globais", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8, WS_DISABLED - PUSHBUTTON "&Padrão", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 - LTEXT "Idioma:", 0, 13, 8, 34, 8 -END +#define STR_PROG_SETT "Alterar idioma de exibição" +#define STR_SND_GAIN "Ganho de som" +#define STR_NEW_FLOPPY "Nova imagem de disquete" +#define STR_CONFIG "Configurações do 86Box" +#define STR_SPECIFY_DIM "Especifique as dimensões da janela principal" -DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Status" -FONT 9, "Segoe UI" -BEGIN - LTEXT "1",IDT_SDEVICE,16,16,180,1000 - LTEXT "1",IDT_STEXT,16,186,180,1000 -END +#define STR_OK "OK" +#define STR_CANCEL "Cancelar" +#define STR_GLOBAL "Use estas configurações como &padrões globais" +#define STR_DEFAULT "&Padrão" +#define STR_LANGUAGE "Idioma:" -DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ganho de som" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,57,7,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,57,24,50,14 - CONTROL "Ganho",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 - CTEXT "Ganho",IDT_1746,10,7,32,9,SS_CENTERIMAGE -END +#define STR_GAIN "Ganho" -DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Nova imagem de disquete" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,104,65,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,162,65,50,14 - LTEXT "Nome:",IDT_1749,7,6,44,12,SS_CENTERIMAGE - LTEXT "Tamanho:",IDT_1750,7,25,44,12,SS_CENTERIMAGE - LTEXT "Modo RPM:",IDT_1751,7,45,44,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY - COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...",IDC_CFILE,206,5,13,14 - LTEXT "Progresso:",IDT_1757,7,45,44,12,SS_CENTERIMAGE - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,53,45,166,14 -END +#define STR_FILE_NAME "Nome:" +#define STR_DISK_SIZE "Tamanho:" +#define STR_RPM_MODE "Modo RPM:" +#define STR_PROGRESS "Progresso:" -DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Configurações do 86Box" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,246,235,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,307,235,50,14 - CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 - CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -END +#define STR_WIDTH "Largura:" +#define STR_HEIGHT "Altura:" +#define STR_LOCK_TO_SIZE "Trava nesse tamanho" -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Especifique as dimensões da janela principal" -FONT 9, "Segoe UI" -BEGIN - LTEXT "Largura:",IDT_1709,7,9,24,12 - EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS, 76, 6, 12, 12 - LTEXT "Altura:",IDT_1710,97,9,24,12 - EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166, 6, 12, 12 - CONTROL "Trava nesse tamanho",IDC_CHECK_LOCK_SIZE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 - DEFPUSHBUTTON "OK",IDOK,30,45,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,99,45,50,14 -END +#define STR_MACHINE_TYPE "Tipo de máquina:" +#define STR_MACHINE "Máquina:" +#define STR_CONFIGURE "Configurar" +#define STR_CPU_TYPE "Tipo de CPU:" +#define STR_SPEED "Veloc.:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Estados de espera:" +#define STR_MB "MB" +#define STR_MEMORY "Memória:" +#define STR_TIME_SYNC "Sincronização de tempo" +#define STR_DISABLED "Desativada" +#define STR_ENABLED_LOCAL "Ativada (hora local)" +#define STR_ENABLED_UTC "Ativada (UTC)" +#define STR_DYNAREC "Recompilador dinâmico" -DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo de máquina:",IDT_1708,7,9,60,10 - COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Máquina:",IDT_1701,7,28,60,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_MACHINE,214,26,46,12 - COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo de CPU:",IDT_1702,7,47,59,10 - COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Veloc.:",IDT_1704,189,47,24,10 - COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "FPU:",IDT_1707,7,66,59,10 - COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Estados de espera:",IDT_1703,7,85,60,10 - EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, - 12,12 - LTEXT "MB",IDT_1705,123,104,10,10 - LTEXT "Memória:",IDT_1706,7,104,30,10 - GROUPBOX "Sincronização de tempo",IDC_TIME_SYNC,7,135,100,56 - CONTROL "Desativada",IDC_RADIO_TS_DISABLED,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 - CONTROL "Ativada (hora local)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 - CONTROL "Ativada (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 -#ifdef USE_DYNAREC - CONTROL "Recompilador dinâmico",IDC_CHECK_DYNAREC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 -#endif -END +#define STR_VIDEO "Video:" +#define STR_VOODOO "3DFX Voodoo" -DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Vídeo:",IDT_1707,7,9,48,10 - COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_VID,222,7,38,12 - CONTROL "3DFX Voodoo",IDC_CHECK_VOODOO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 - PUSHBUTTON "Configurar",IDC_BUTTON_VOODOO,222,26,38,12 -END +#define STR_MOUSE "Mouse" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Mouse:",IDT_1709,7,9,57,10 - COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_MOUSE,214,7,46,12 - LTEXT "Joystick:",IDT_1710,7,27,58,10 - COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 - PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 - PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 - PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 -END +#define STR_SOUND "Place de som:" +#define STR_MIDI "Disp. saída MIDI:" +#define STR_MIDI_IN "Disp. enrada MIDI:" +#define STR_MPU401 "MPU-401 autônomo" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Usar som FLOAT32" -DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Placa de som:",IDT_1711,7,9,59,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_SND,214,7,46,12 +#define STR_NET_TYPE "Tipo de rede:" +#define STR_PCAP "Dispositivo PCap:" +#define STR_NET "Adaptador de rede:" - COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Disp. saída MIDI:",IDT_1712,7,28,59,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_MIDI,214,26,46,12 +#define STR_LPT1 "Dispositivo LPT1:" +#define STR_LPT2 "Dispositivo LPT2:" +#define STR_LPT3 "Dispositivo LPT3:" +#define STR_SERIAL1 "Porta serial 1" +#define STR_SERIAL2 "Porta serial 2" +#define STR_SERIAL3 "Porta serial 3" +#define STR_SERIAL4 "Porta serial 4" +#define STR_PARALLEL1 "Porta paralela 1" +#define STR_PARALLEL2 "Porta paralela 2" +#define STR_PARALLEL3 "Porta paralela 3" - COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Disp. entrada MIDI:",IDT_1713,7,47,59,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_MIDI_IN,214,45,46,12 +#define STR_HDC "Controlador HD:" +#define STR_FDC "Controlador FD:" +#define STR_IDE_TER "Controlador IDE terciário" +#define STR_IDE_QUA "Controlador IDE quaternário" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controlador 1:" +#define STR_SCSI_2 "Controlador 2:" +#define STR_SCSI_3 "Controlador 3:" +#define STR_SCSI_4 "Controlador 4:" +#define STR_CASSETTE "Cassete" - CONTROL "MPU-401 autônomo",IDC_CHECK_MPU401,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_MPU401,214,64,46,12 +#define STR_HDD "Discos rígidos:" +#define STR_NEW "&Novo..." +#define STR_EXISTING "&Existente..." +#define STR_REMOVE "&Remover" +#define STR_BUS "Barram.:" +#define STR_CHANNEL "Canal:" +#define STR_ID "ID:" - CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_SSI,214,82,46,12 +#define STR_SPECIFY "&Especificar..." +#define STR_SECTORS "Setores:" +#define STR_HEADS "Cabeças:" +#define STR_CYLS "Cilindros:" +#define STR_SIZE_MB "Tamanho (MB):" +#define STR_TYPE "Tipo:" +#define STR_IMG_FORMAT "Formato da imagem:" +#define STR_BLOCK_SIZE "Tamanho do bloco:" - CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_CMS,214,100,46,12 +#define STR_FLOPPY_DRIVES "Unidades de disquete:" +#define STR_TURBO "Turbo" +#define STR_CHECKBPB "Verificar BPB" +#define STR_CDROM_DRIVES "Unidades de CD-ROM:" - CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 - PUSHBUTTON "Configurar",IDC_CONFIGURE_GUS,214,118,46,12 - - CONTROL "Usar som FLOAT32",IDC_CHECK_FLOAT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 -END +#define STR_MO_DRIVES "Unidades magneto-ópticas:" +#define STR_ZIP_DRIVES "Unidades ZIP:" +#define STR_250 "ZIP 250" -DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Tipo de rede:",IDT_1714,7,9,59,10 - COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP +#define STR_ISARTC "RTC ISA:" +#define STR_ISAMEM "Expansão de memória ISA" +#define STR_ISAMEM_1 "Placa 1:" +#define STR_ISAMEM_2 "Placa 2:" +#define STR_ISAMEM_3 "Placa 3:" +#define STR_ISAMEM_4 "Placa 4:" +#define STR_BUGGER "Dispositivo ISABugger" +#define STR_POSTCARD "Placa de diagnóstico" - LTEXT "Dispositivo PCap:",IDT_1715,7,28,59,10 - COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - - LTEXT "Adaptador de rede:",IDT_1716,7,47,59,10 - COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_NET,214,44,46,12 -END - -DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Dispositivo LPT1:",IDT_1717,7,9,61,10 - COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "Dispositivo LPT2:",IDT_1718,7,28,61,10 - COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "Dispositivo LPT3:",IDT_1719,7,47,61,10 - COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - CONTROL "Porta serial 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 - CONTROL "Porta serial 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 - CONTROL "Porta serial 3",IDC_CHECK_SERIAL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 - CONTROL "Porta serial 4",IDC_CHECK_SERIAL4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 - - CONTROL "Porta paralela 1",IDC_CHECK_PARALLEL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 - CONTROL "Porta paralela 2",IDC_CHECK_PARALLEL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 - CONTROL "Porta paralela 3",IDC_CHECK_PARALLEL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 -END - -DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Controlador HD:",IDT_1718,7,9,64,10 - COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_HDC,222,7,38,12 - - LTEXT "Controlador FD:",IDT_1768,7,28,64,10 - COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_FDC,222,26,38,12 - - CONTROL "Controlador IDE terciário",IDC_CHECK_IDE_TER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 - PUSHBUTTON "Configurar",IDC_BUTTON_IDE_TER,222,45,38,12 - - CONTROL "Controlador IDE quaternário",IDC_CHECK_IDE_QUA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configurar",IDC_BUTTON_IDE_QUA,222,64,38,12 - - GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 - LTEXT "Controlador 1:",IDT_1763,16,102,48,10 - COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_1,213,100,38,12 - LTEXT "Controlador 2:",IDT_1764,16,121,48,10 - COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_2,213,119,38,12 - LTEXT "Controlador 3:",IDT_1765,16,140,48,10 - COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_3,213,138,38,12 - LTEXT "Controlador 4:",IDT_1766,16,159,48,10 - COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_SCSI_4,213,157,38,12 - - CONTROL "Cassete",IDC_CHECK_CASSETTE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 -END - -DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,92 - LTEXT "Discos rígidos:",IDT_1720,7,7,253,8 - PUSHBUTTON "&Novo...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 - PUSHBUTTON "&Existente...",IDC_BUTTON_HDD_ADD,129,137,62,10 - PUSHBUTTON "&Remover",IDC_BUTTON_HDD_REMOVE,198,137,62,10 - COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Barram.:",IDT_1721,7,119,25,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canal:",IDT_1722,131,119,38,8 - COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,131,119,38,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP -END - -DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Adicionar disco rígido" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,55,127,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,112,127,50,14 - EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 - PUSHBUTTON "&Especificar...",IDC_CFILE,167,16,44,12 - EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 - EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 - EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 - EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 - COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Setores:",IDT_1726,154,35,27,10 - LTEXT "Cabeças:",IDT_1727,81,35,29,8 - LTEXT "Cilindros:",IDT_1728,7,35,32,12 - LTEXT "Tamanho (MB):",IDT_1729,7,54,33,8 - LTEXT "Tipo:",IDT_1730,86,54,24,8 - LTEXT "Nome do arquivo:",IDT_1731,7,7,204,9 - COMBOBOX IDC_COMBO_HD_BUS,34,71,58,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Barram.:",IDT_1721,7,73,25,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canal:",IDT_1722,99,73,34,8 - COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,99,73,34,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Formato da imagem:",IDT_1774,7,89,50,15 - COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tamanho do bloco:",IDT_1775,7,107,50,15 - COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Progresso:",IDT_1752,7,7,204,9 - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,7,16,204,12 -END - -DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", - LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,60 - LTEXT "Unidades de disquete:",IDT_1737,7,7,253,8 - COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo:",IDT_1738,7,87,24,8 - CONTROL "Turbo",IDC_CHECKTURBO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 - CONTROL "Verificar BPB",IDC_CHECKBPB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 - - CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,117,253,60 - LTEXT "Unidades de CD-ROM:",IDT_1739,7,107,253,8 - COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Barram.:",IDT_1740,7,187,25,8 - COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1741,131,187,38,8 - COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canal:",IDT_1742,131,187,38,8 - COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Veloc.:",IDT_1758,7,207,24,8 -END - -DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - - CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,17,253,60 - LTEXT "Unidades magneto-ópticas:",IDT_1769,7,7,253,8 - COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Barram.:",IDT_1770,7,87,25,8 - COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1771,131,87,38,8 - COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canal:",IDT_1772,131,87,38,8 - COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo:",IDT_1773,7,107,24,8 - - CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,137,253,60 - LTEXT "Unidades ZIP:",IDT_1759,7,127,253,8 - COMBOBOX IDC_COMBO_ZIP_BUS,33,205,70,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Barram.:",IDT_1753,7,207,26,8 - COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1754,120,207,28,8 - COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canal:",IDT_1755,120,207,28,8 - CONTROL "ZIP 250",IDC_CHECK250,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 -END - -DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "RTC ISA:",IDT_1767,7,9,48,10 - COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_ISARTC,222,7,38,12 - - GROUPBOX "Expansão da memória ISA",IDC_GROUP_ISAMEM,7,28,253,93 - LTEXT "Placa 1:",IDT_1763,16,45,48,10 - COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 - LTEXT "Placa 2:",IDT_1764,16,64,48,10 - COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 - LTEXT "Placa 3:",IDT_1765,16,83,48,10 - COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 - LTEXT "Placa 4:",IDT_1766,16,102,48,10 - COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configurar",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 - - CONTROL "Dispositivo ISABugger",IDC_CHECK_BUGGER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 - - CONTROL "Placa de diagnóstico",IDC_CHECK_POSTCARD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 -END +#include "dialogs.rc" ///////////////////////////////////////////////////////////////////////////// // From 785d1a5deea6b8ac5a29ddc458f2670035cbcea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Sun, 14 Nov 2021 21:00:04 +0100 Subject: [PATCH 132/159] Add Czech translation --- src/win/86Box.rc | 1 + src/win/languages/cs-CZ.rc | 640 +++++++++++++++++++++++++++++++++++++ 2 files changed, 641 insertions(+) create mode 100644 src/win/languages/cs-CZ.rc diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 8755f1639..2fce6a889 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -363,3 +363,4 @@ END #include "languages/en-US.rc" #include "languages/hu-HU.rc" #include "languages/pt-BR.rc" +#include "languages/cs-CZ.rc" diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc new file mode 100644 index 000000000..24f41ba6a --- /dev/null +++ b/src/win/languages/cs-CZ.rc @@ -0,0 +1,640 @@ +//////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#ifdef _WIN32 +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +#pragma code_page(65001) +#endif //_WIN32 + +#define AUTHORS + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Akce" + BEGIN + MENUITEM "&Klávesnice vyžaduje záběr", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Pravý Ctrl je levý Alt", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Resetovat", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "P&ozastavit", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "&Ukončit", IDM_ACTION_EXIT + END + POPUP "&Zobrazení" + BEGIN + MENUITEM "&Schovat stavový řádek", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Měnitelná velikost okna", IDM_VID_RESIZE + MENUITEM "&Pamatovat velikost a pozici", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "&Renderer" + BEGIN + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (3.3 Core)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "&Zadat velikost...", IDM_VID_SPECIFY_DIM + MENUITEM "&Dodržovat poměr stran 4:3", IDM_VID_FORCE43 + POPUP "&Násobek zvětšení okna" + BEGIN + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Metoda filtrování" + BEGIN + MENUITEM "&Nejbližší", IDM_VID_FILTER_NEAREST + MENUITEM "&Lineární", IDM_VID_FILTER_LINEAR + END + MENUITEM "Š&kálování HiDPI", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Celá obrazovka\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Fullscreen &stretch mode" + BEGIN + MENUITEM "&Roztáhnout", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Zachovat poměr stran", IDM_VID_FS_KEEPRATIO + MENUITEM "&Integer scale", IDM_VID_FS_INT + END + POPUP "Nastavení pro E&GA a (S)VGA" + BEGIN + MENUITEM "&Převrátit barvy", IDM_VID_INVERT + POPUP "&Typ VGA monitoru" + BEGIN + MENUITEM "RGB &barevný", IDM_VID_GRAY_RGB + MENUITEM "&RGB odstíny šedi", IDM_VID_GRAY_MONO + MENUITEM "&Jantarová obrazovka", IDM_VID_GRAY_AMBER + MENUITEM "&Zelená obrazovka", IDM_VID_GRAY_GREEN + MENUITEM "&Bílá obrazovka", IDM_VID_GRAY_WHITE + END + POPUP "Převod na &odstíny šedi" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Průměr", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN + MENUITEM "&Upravit kontrast černobílých obrazovek", IDM_VID_CGACON + END + MENUITEM "&Média", IDM_MEDIA + POPUP "&Nástroje" + BEGIN + MENUITEM "&Nastavení...", IDM_CONFIG + MENUITEM "&Aktualizovat ikony stavového řádku", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "&Změnit jazyk zobrazení...", IDM_VID_PROG_SETT +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "Povolit integraci s &Discordem", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "Pořídit s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "&Zesílení zvuku", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Začít trace\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Zastavit trace\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Logging" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "Enable BusLogic logs\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Enable CD-ROM logs\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Enable floppy (86F) logs\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Enable floppy controller logs\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "Enable IDE logs\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Enable Serial Port logs\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Enable Network logs\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Log breakpoint\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "Dump &video RAM\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "Ná&pověda" + BEGIN + MENUITEM "&Dokumentace", IDM_DOCS + MENUITEM "&O programu 86Box", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nový obraz...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existující obraz...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Nahrávat", IDM_CASSETTE_RECORD + MENUITEM "&Přehrát", IDM_CASSETTE_PLAY + MENUITEM "Přetočit na &začátek", IDM_CASSETTE_REWIND + MENUITEM "Přetočit na &konec", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "&Vyjmout", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Obraz...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "&Vyjmout", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nový obraz...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existující obraz...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&xportovat do 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "&Vyjmout", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Ztišit", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "&Vyjmout", IDM_CDROM_EMPTY + MENUITEM "&Načíst znova předchozí obraz", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Obraz...", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nový obraz...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existující obraz...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Vyjmout", IDM_ZIP_EJECT + MENUITEM "&Načíst znova předchozí obraz", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nový obraz...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Existující obraz...", IDM_MO_IMAGE_EXISTING + MENUITEM "Existující obraz (&ochrana proti zápisu)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Vyjmout", IDM_MO_EJECT + MENUITEM "&Načíst znova předchozí obraz", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "&Cílová snímková frekvence" + BEGIN + MENUITEM "&Synchronizovat s obrazem", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 fps", IDM_VID_GL_FPS_25 + MENUITEM "&30 fps", IDM_VID_GL_FPS_30 + MENUITEM "&50 fps", IDM_VID_GL_FPS_50 + MENUITEM "&60 fps", IDM_VID_GL_FPS_60 + MENUITEM "&75 fps", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&Zvolit shader...", IDM_VID_GL_SHADER + MENUITEM "&Odebrat shader", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +#define STR_PROG_SETT "Změnit jazyk zobrazení" +#define STR_SND_GAIN "Zesílení zvuku" +#define STR_NEW_FLOPPY "Nový obraz" +#define STR_CONFIG "Nastavení emulátoru 86Box" +#define STR_SPECIFY_DIM "Zadat rozměry hlavního okna" + +#define STR_OK "OK" +#define STR_CANCEL "Storno" +#define STR_GLOBAL "Uložit toto nastavení jako &globální výchozí stav" +#define STR_DEFAULT "&Výchozí" +#define STR_LANGUAGE "Jazyk:" + +#define STR_GAIN "Zesílení" + +#define STR_FILE_NAME "Název souboru:" +#define STR_DISK_SIZE "Velikost disku:" +#define STR_RPM_MODE "Režím ot./m:" +#define STR_PROGRESS "Průběh:" + +#define STR_WIDTH "Šířka:" +#define STR_HEIGHT "Výška:" +#define STR_LOCK_TO_SIZE "Uzamknout na tyto rozměry" + +#define STR_MACHINE_TYPE "Typ počítače:" +#define STR_MACHINE "Počítač:" +#define STR_CONFIGURE "Konfigurovat" +#define STR_CPU_TYPE "Procesor:" +#define STR_SPEED "Rychlost:" +#define STR_FPU "Koprocesor:" +#define STR_WAIT_STATES "Čekací stavy:" +#define STR_MB "MB" +#define STR_MEMORY "Pamět:" +#define STR_TIME_SYNC "Synchronizace času" +#define STR_DISABLED "Vypnuta" +#define STR_ENABLED_LOCAL "Zapnuta (místní čas)" +#define STR_ENABLED_UTC "Zapnuta (UTC)" +#define STR_DYNAREC "Dynamický překladač" + +#define STR_VIDEO "Grafika:" +#define STR_VOODOO "Použít grafický akcelerátor Voodoo" + +#define STR_MOUSE "Myš:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." + +#define STR_SOUND "Zvuková karta:" +#define STR_MIDI "MIDI výstup:" +#define STR_MIDI_IN "MIDI vstup:" +#define STR_MPU401 "Samostatný MPU-401" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Použít zvuk FLOAT32" + +#define STR_NET_TYPE "Druh sítě:" +#define STR_PCAP "PCap zařízení:" +#define STR_NET "Síťový adaptér:" + +#define STR_LPT1 "Zařízení na LPT1" +#define STR_LPT2 "Zařízení na LPT2" +#define STR_LPT3 "Zařízení na LPT3" +#define STR_SERIAL1 "Povolit port COM1" +#define STR_SERIAL2 "Povolit port COM2" +#define STR_SERIAL3 "Povolit port COM3" +#define STR_SERIAL4 "Povolit port COM4" +#define STR_PARALLEL1 "Povolit port LPT1" +#define STR_PARALLEL2 "Povolit port LPT2" +#define STR_PARALLEL3 "Povolit port LPT3" + +#define STR_HDC "Řadič disku:" +#define STR_FDC "Disketový řadič:" +#define STR_IDE_TER "Třetí řadič IDE" +#define STR_IDE_QUA "Čtvrtý řadič IDE" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Řadič 1:" +#define STR_SCSI_2 "Řadič 2:" +#define STR_SCSI_3 "Řadič 3:" +#define STR_SCSI_4 "Řadič 4:" +#define STR_CASSETTE "Kazeta" + +#define STR_HDD "Pevné disky:" +#define STR_NEW "&Nový..." +#define STR_EXISTING "&Existující..." +#define STR_REMOVE "&Odebrat" +#define STR_BUS "Sběrnice:" +#define STR_CHANNEL "Kanál:" +#define STR_ID "ID:" + +#define STR_SPECIFY "&Zadat..." +#define STR_SECTORS "Sektory:" +#define STR_HEADS "Hlavy:" +#define STR_CYLS "Cylindry:" +#define STR_SIZE_MB "Velikost (MB):" +#define STR_TYPE "Typ:" +#define STR_IMG_FORMAT "Formát obrazu:" +#define STR_BLOCK_SIZE "Velikost bloků:" + +#define STR_FLOPPY_DRIVES "Disketové mechaniky:" +#define STR_TURBO "Turbo časování" +#define STR_CHECKBPB "Kontrola BPB" +#define STR_CDROM_DRIVES "Mechaniky CD-ROM:" + +#define STR_MO_DRIVES "Magnetooptické mechaniky:" +#define STR_ZIP_DRIVES "Mechaniky ZIP:" +#define STR_250 "ZIP 250" + +#define STR_ISARTC "ISA hodiny:" +#define STR_ISAMEM "ISA rozšíření paměti" +#define STR_ISAMEM_1 "Karta 1:" +#define STR_ISAMEM_2 "Karta 2:" +#define STR_ISAMEM_3 "Karta 3:" +#define STR_ISAMEM_4 "Karta 4:" +#define STR_BUGGER "Zařízení ISABugger" +#define STR_POSTCARD "Karta pro kódy POST" + +#include "dialogs.rc" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Chyba" + IDS_2050 "Závažná chyba" + IDS_2051 "" + IDS_2052 "Stiskněte Ctrl+Alt+Page Down pro návrat z režimu celé obrazovky." + IDS_2053 "Rychlost" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Obrazy ZIP disků (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box nenalezl žádné použitelné image pamětí ROM.\n\nStáhněte sadu obrazů ROM a extrahujte ji do složky ""roms""." + IDS_2057 "(prázdné)" + IDS_2058 "Obrazy ZIP disků (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0All files (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Zap." + IDS_2061 "Vyp." + IDS_2062 "Všechny obrazy disků (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Základní sektorové obrazy (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Povrchové obrazy (*.86F)\0*.86F\0" + IDS_2063 "Počítač ""%hs"" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce ""roms/machines"". Konfigurace se přepne na jiný dostupný počítač." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "Video adaptér ""%hs"" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce ""roms/video"". Konfigurace se přepne na jiný dostupný adaptér." + IDS_2065 "Počítač" + IDS_2066 "Obraz" + IDS_2067 "Vstupní zařízení" + IDS_2068 "Zvuk" + IDS_2069 "Síť" + IDS_2070 "COM a LPT porty" + IDS_2071 "Řadiče úložiště" + IDS_2072 "Pevné disky" + IDS_2073 "Disketové a CD-ROM mechaniky" + IDS_2074 "Další vyměnitelná zařízení" + IDS_2075 "Jiné příslušenství" + IDS_2076 "Image povrchu (*.86F)\0*.86F\0" + IDS_2077 "Klikněte pro zabraní myši" + IDS_2078 "Stiskněte F8+F12 pro uvolnění myši" + IDS_2079 "Stiskněte F8+F12 nebo prostřední tlačítko pro uvolnění myši" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Nebylo možné spustit FluidSynth." + IDS_2081 "Sběrnice" + IDS_2082 "Soubor" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "Kontrola BPB" + IDS_2088 "KB" + IDS_2089 "Nebylo možné spustit video renderer." + IDS_2090 "Výchozí" + IDS_2091 "%i čekací stav(y)" + IDS_2092 "Typ" + IDS_2093 "Nebylo možné spustit PCap" + IDS_2094 "Nebyla nalezena žádná PCap zařízení" + IDS_2095 "Neplatné PCap zařízení" + IDS_2096 "Standardní 2tlačítkový joystick" + IDS_2097 "Standardní 4tlačítkový joystick" + IDS_2098 "Standardní 6tlačítkový joystick" + IDS_2099 "Standardní 8tlačítkový joystick" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Žadný" + IDS_2104 "Nebylo možné nahrát klávesnicové zkratky." + IDS_2105 "Nebylo možné zaregistrovat raw input." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Disketová mechanika %i (%s): %ls" + IDS_2109 "Všechny obrazy (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Rozšířené sektorové obrazy (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Základní sektorové obrazy (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Obrazy magnetického toku (*.FDI)\0*.FDI\0Obrazy povrchu (*.86F;*.MFM)\0*.86F;*.MFM\0Všechny soubory (*.*)\0*.*\0" + IDS_2110 "Nebylo možné spustit FreeType" + IDS_2111 "Nebylo možné spustit SDL, je potřeba SDL2.dll" + IDS_2112 "Opravdu chcete resetovat emulovaný počítač?" + IDS_2113 "Opravdu chcete ukončit 86Box?" + IDS_2114 "Nebylo možné spustit Ghostscript" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Všechny soubory (*.*)\0*.*\0" + IDS_2117 "Vítejte v emulátoru 86Box!" + IDS_2118 "Vestavěný řadič" + IDS_2119 "Ukončit" + IDS_2120 "Nebyly nalezeny žádné obrazy ROM" + IDS_2121 "Chcete uložit nastavení?" + IDS_2122 "Pokračováním se resetuje emulovaný počítač." + IDS_2123 "Uložit" + IDS_2124 "O programu 86Box" + IDS_2125 "86Box v" EMU_VERSION + + IDS_2126 "Emulátor starých počítačů\n\nAutoři: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nZveřejněno pod licencí GNU General Public License verze 2 nebo novější. Viz soubor LICENSE pro více informací." + IDS_2127 "OK" + IDS_2128 "Hardware není dostupný" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Ujistěte se, že je nainstalován " LIB_NAME_PCAP " a používáte síťové připojení s ním kompatibilní." + IDS_2130 "Neplatná konfigurace" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " je potřeba pro emulaci ESC/P tiskárny." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " je potřeba pro automatický převod PostScript dokumentů do PDF.\n\nJakékoliv dokumenty vytisknuté přes obecnou PostScriptovou tiskárnu budou uloženy jako PostScript (.ps) soubory." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " je potřeba pro MIDI výstup přes knihovnu FluidSynth." + IDS_2134 "Vstup do režimu celé obrazovky" + IDS_2135 "Nezobrazovat dále tuto zprávu" + IDS_2136 "Neukončovat" + IDS_2137 "Resetovat" + IDS_2138 "Neresetovat" + IDS_2139 "Obraz magnetooptického disku (*.IM?;*.MDI)\0*.IM?;*.MDI\0Všechny soubory (*.*)\0*.*\0" + IDS_2140 "Obraz CD-ROM disku (*.ISO;*.CUE)\0*.ISO;*.CUE\0Všechny soubory (*.*)\0*.*\0" + IDS_2141 "Konfigurace zařízení %hs" + IDS_2142 "Monitor je v režimu spánku" + IDS_2143 "Shadery OpenGL (*.GLSL)\0*.GLSL\0All files (*.*)\0*.*\0" + IDS_2144 "Možnosti OpenGL" + IDS_2145 "Pokoušíte se spustit nepodporovanou konfiguraci" + IDS_2146 "Pro tuto konfiguraci bylo vypnuto filtrování procesorů podle zvoleného počítače.\n\nToto umožňuje zvolit procesor, který by jinak se zvoleným počítačem nebyl kompatibilní. Můžou však nastat potíže s BIOSem nebo jiným softwarem.\n\nPovolení tohoto nastavení není oficiálně podporováno a jakákoliv hlášení o chybách mohou být uzavřeny jako neplatné." + IDS_2147 "Pokračovat" + IDS_2148 "Kazeta: %s" + IDS_2149 "Kazetové nahrávky (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Všechny soubory (*.*)\0*.*\0" + IDS_2150 "Cartridge %i: %ls" + IDS_2151 "Obrazy cartridge (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Všechny soubory (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Pevný disk (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "CD-ROM mechaniky pro rozhraní MFM/RLL nebo ESDI nikdy neexistovaly" + IDS_4100 "Vlastní..." + IDS_4101 "Vlastní (velký)..." + IDS_4102 "Přidat nový pevný disk" + IDS_4103 "Přidat existující pevný disk" + IDS_4104 "Obraz disku formátu HDI nemůžou být větší než 4 GB." + IDS_4105 "Obraz disku nemůžou být větší než 127 GB." + IDS_4106 "Obrazy pevného disku (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Všechny soubory (*.*)\0*.*\0" + IDS_4107 "Nebylo možné přečíst soubor" + IDS_4108 "Nebylo možné zapisovat do souboru" + IDS_4109 "Obraz disku ve formátu HDI nebo HDX s velikostí sektoru jinou než 512 bajtů nejsou podporovány." + IDS_4110 "USB zatím není podporováno." + IDS_4111 "Soubor obrazu disku již existuje" + IDS_4112 "Zadejte platný název souboru." + IDS_4113 "Obraz disku byl vytvořen" + IDS_4114 "Ujistěte se, že soubor existuje a lze jej přečíst." + IDS_4115 "Ujistěte se, že se do složky, kde se má soubor uložit, dá zapisovat." + IDS_4116 "Obraz disku je příliš velký" + IDS_4117 "Nezapomeňte nově vytvořený disk rozdělit a naformátovat." + IDS_4118 "Zvolený soubor bude přepsán. Opravdu jej chcete použít?" + IDS_4119 "Nepodporovaný obraz disku" + IDS_4120 "Přepsat" + IDS_4121 "Nepřepisovat" + IDS_4122 "Surový obraz (.img)" + IDS_4123 "HDI obraz (.hdi)" + IDS_4124 "HDX obraz (.hdx)" + IDS_4125 "VHD s pevnou velikostí (.vhd)" + IDS_4126 "VHD s dynamickou velikostí (.vhd)" + IDS_4127 "Rozdílový VHD (.vhd)" + IDS_4128 "Velké bloky (2 MB)" + IDS_4129 "Malé bloky (512 KB)" + IDS_4130 "Soubory VHD (*.VHD)\0*.VHD\0Všechny soubory (*.*)\0*.*\0" + IDS_4131 "Vyberte nadřazený virtuální disk" + IDS_4132 "To může znamenat, že se obsahy nadřazeného disku změnily po vytvoření rozdílového disku.\n\nTato chyba také může nastat, pokud byl soubor s image disku kopírován nebo přesunut, nebo kvůli chybě v programu, který tento disk vytvořil.\n\nChcete časová razítka opravit?" + IDS_4133 "Časová razítka nadřazeného a podřazeného disku nesouhlasí" + IDS_4134 "Nebylo možné opravit časové razítko VHD." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Vypnuto" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Vypnuto" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3.5"" 1.3Gb M.O. (GigaMO)" + IDS_5907 "3.5"" 2.3Gb M.O. (GigaMO 2)" + IDS_5908 "5.25"" 600Mb M.O." + IDS_5909 "5.25"" 650Mb M.O." + IDS_5910 "5.25"" 1Gb M.O." + IDS_5911 "5.25"" 1.3Gb M.O." + + IDS_6144 "Dokonalé ot./m" + IDS_6145 "1%% pod dokonalými ot./m" + IDS_6146 "1.5%% pod dokonalými ot./m" + IDS_6147 "2%% pod dokonalými ot./m" + + IDS_7168 "(výchozí nastavení systému)" +END +#define IDS_LANG_ENUS IDS_7168 + +// Czech (Czech Republic) resources +///////////////////////////////////////////////////////////////////////////// From 0f010cf11f6a8ceabe34cfa0af5e88c1501312b7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 23:04:14 +0100 Subject: [PATCH 133/159] Added Portuguese (Portugal). --- src/win/86Box.rc | 1 + src/win/languages/pt-PT.rc | 640 +++++++++++++++++++++++++++++++++++++ 2 files changed, 641 insertions(+) create mode 100644 src/win/languages/pt-PT.rc diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 8755f1639..95c4fc6fb 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -363,3 +363,4 @@ END #include "languages/en-US.rc" #include "languages/hu-HU.rc" #include "languages/pt-BR.rc" +#include "languages/pt-PT.rc" diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc new file mode 100644 index 000000000..88160c893 --- /dev/null +++ b/src/win/languages/pt-PT.rc @@ -0,0 +1,640 @@ +//////////////////////////////////////////////////////////////////////////// +// Portuguese (Portugal) resources + +#ifdef _WIN32 +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE +#pragma code_page(65001) +#endif //_WIN32 + +#define AUTHORS + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Acção" + BEGIN + MENUITEM "&Teclado require captura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&CTRL direita é ALT esquerda",IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Reinicialização completa...",IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Pausa", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "&Sair...", IDM_ACTION_EXIT + END + POPUP "&Ver" + BEGIN + MENUITEM "&Ocultar barra de estado", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Janela redimensionável", IDM_VID_RESIZE + MENUITEM "&Lembrar tamanho e posição", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "&Renderizador" + BEGIN + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (Núcleo 3.3)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "&Especificar dimensões...", IDM_VID_SPECIFY_DIM + MENUITEM "&Forćar rácio de visualização 4:3", IDM_VID_FORCE43 + POPUP "F&actor de escala de janela" + BEGIN + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Método de filtragem" + BEGIN + MENUITEM "&Mais próximo", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + END + MENUITEM "Escala Hi&DPI", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Tela cheia\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Mode &de estiramento em tela cheia" + BEGIN + MENUITEM "&Estiramento em tela cheia", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "Pixels &quadrados (Manter rácio)", IDM_VID_FS_KEEPRATIO + MENUITEM "Escala &inteira", IDM_VID_FS_INT + END + POPUP "Definições E&GA/(S)VGA" + BEGIN + MENUITEM "Monitor VGA &invertido", IDM_VID_INVERT + POPUP "&Tipo de ecrã VGA" + BEGIN + MENUITEM "&Cores RGB", IDM_VID_GRAY_RGB + MENUITEM "&RGB em escala de cinzentos", IDM_VID_GRAY_MONO + MENUITEM "Monitor âmb&ar", IDM_VID_GRAY_AMBER + MENUITEM "Monitor &verde", IDM_VID_GRAY_GREEN + MENUITEM "Monitor &branco", IDM_VID_GRAY_WHITE + END + POPUP "Tipo de &conversão para escala de cinzentos" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Média", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "Overscan de CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN + MENUITEM "Mudar &contraste para ecrão monocromático", IDM_VID_CGACON + END + MENUITEM "&Mídia", IDM_MEDIA + POPUP "&Ferramentas" + BEGIN + MENUITEM "&Definições...", IDM_CONFIG + MENUITEM "&Actualizar ícones da barra de estado", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "Mudar idioma de a&presentação...", IDM_VID_PROG_SETT +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "Activar integração de &Discord", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "Tirar i&magem de tela\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "&Ganho de som...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Iniciar o rasterio\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Terminar o rasterio\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Registo" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "Activar registo BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Activar registo CD-ROM\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Activar registo de disquetes (86F)\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Activar registo do controlar de disquetes\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "Activar registo IDE\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Activar registo da porta de série\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Activar registo de rede\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Ponto de parada no registo\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "Despejo de RAM &vídeo\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Ajuda" + BEGIN + MENUITEM "&Documentação...", IDM_DOCS + MENUITEM "&Acerca de 86Box...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "Imagem &existente...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Gravar", IDM_CASSETTE_RECORD + MENUITEM "&Reproduzir", IDM_CASSETTE_PLAY + MENUITEM "Re&bobinar para o início", IDM_CASSETTE_REWIND + MENUITEM "&Avanço rápido para a fim", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "E&jectar", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Imagem...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "E&jectar", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "Imagem &existente...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&xportar para 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "E&jectar", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Mute", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "E&mpty", IDM_CDROM_EMPTY + MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Imagem", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "Imagem &existente...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&jectar", IDM_ZIP_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova imagem...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "Imagem &existente...", IDM_MO_IMAGE_EXISTING + MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&jectar", IDM_MO_EJECT + MENUITEM "&Recarregar imagem anterior", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "&Taxa de quadros de destino" + BEGIN + MENUITEM "&Sincronizar com vídeo", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 q/s", IDM_VID_GL_FPS_25 + MENUITEM "&30 q/s", IDM_VID_GL_FPS_30 + MENUITEM "&50 q/s", IDM_VID_GL_FPS_50 + MENUITEM "&60 q/s", IDM_VID_GL_FPS_60 + MENUITEM "&75 q/s", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&Seleccionar shader...", IDM_VID_GL_SHADER + MENUITEM "&Remover shader", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +#define STR_PROG_SETT "Mudar idioma de apresentação" +#define STR_SND_GAIN "Ganha de som" +#define STR_NEW_FLOPPY "Nova imagem" +#define STR_CONFIG "Definições de 86Box" +#define STR_SPECIFY_DIM "Especifiar dimensões da janela principal" + +#define STR_OK "OK" +#define STR_CANCEL "Cancelar" +#define STR_GLOBAL "Guardar estas definições como padrões &globais" +#define STR_DEFAULT "&Padrão" +#define STR_LANGUAGE "Idioma:" + +#define STR_GAIN "Ganho" + +#define STR_FILE_NAME "Nome:" +#define STR_DISK_SIZE "Tamanho:" +#define STR_RPM_MODE "Modo RPM:" +#define STR_PROGRESS "Progresso:" + +#define STR_WIDTH "Largura:" +#define STR_HEIGHT "Altura:" +#define STR_LOCK_TO_SIZE "Fechar para este tamanho" + +#define STR_MACHINE_TYPE "Tipo de máquina:" +#define STR_MACHINE "Máquina:" +#define STR_CONFIGURE "Configurar" +#define STR_CPU_TYPE "Tipo do CPU:" +#define STR_SPEED "Velocidade:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Estados de espera:" +#define STR_MB "MB" +#define STR_MEMORY "Memória:" +#define STR_TIME_SYNC "Sincronização da hora" +#define STR_DISABLED "Desactivada" +#define STR_ENABLED_LOCAL "Activada (ora local)" +#define STR_ENABLED_UTC "Activada (UTC)" +#define STR_DYNAREC "Recompilador dinâmico" + +#define STR_VIDEO "Vídeo:" +#define STR_VOODOO "Gráficos Voodoo" + +#define STR_MOUSE "Rato:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." + +#define STR_SOUND "Placa de som:" +#define STR_MIDI "Disp. saída MIDI:" +#define STR_MIDI_IN "Disp. entrada MIDI:" +#define STR_MPU401 "MPU-401 autónomo" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Utilizar som FLOAT32" + +#define STR_NET_TYPE "Tipo de rede:" +#define STR_PCAP "Dispositivo PCap:" +#define STR_NET "Placa de rede:" + +#define STR_LPT1 "Dispositivo LPT1:" +#define STR_LPT2 "Dispositivo LPT2:" +#define STR_LPT3 "Dispositivo LPT3:" +#define STR_SERIAL1 "Porta de série 1" +#define STR_SERIAL2 "Porta de série 2" +#define STR_SERIAL3 "Porta de série 3" +#define STR_SERIAL4 "Porta de série 4" +#define STR_PARALLEL1 "Porta paralela 1" +#define STR_PARALLEL2 "Porta paralela 2" +#define STR_PARALLEL3 "Porta paralela 3" + +#define STR_HDC "Controlador HD:" +#define STR_FDC "Controlador FD:" +#define STR_IDE_TER "Controlador IDE terciário" +#define STR_IDE_QUA "Controlador IDE quaternário" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controlador 1:" +#define STR_SCSI_2 "Controlador 2:" +#define STR_SCSI_3 "Controlador 3:" +#define STR_SCSI_4 "Controlador 4:" +#define STR_CASSETTE "Cassete" + +#define STR_HDD "Discos rígidos:" +#define STR_NEW "&Novo..." +#define STR_EXISTING "&Existente..." +#define STR_REMOVE "&Remover" +#define STR_BUS "Barram.:" +#define STR_CHANNEL "Canal:" +#define STR_ID "ID:" + +#define STR_SPECIFY "&Especificar..." +#define STR_SECTORS "Sectores:" +#define STR_HEADS "Cabeças:" +#define STR_CYLS "Cilindros:" +#define STR_SIZE_MB "Tamanho (MB):" +#define STR_TYPE "Tipo:" +#define STR_IMG_FORMAT "Formato de imagem:" +#define STR_BLOCK_SIZE "Tamanho de bloco:" + +#define STR_FLOPPY_DRIVES "Unidades de disquete:" +#define STR_TURBO "Velocidade turbo" +#define STR_CHECKBPB "Verificar BPB" +#define STR_CDROM_DRIVES "Unidades CD-ROM:" + +#define STR_MO_DRIVES "Unidades magneto-ópticas:" +#define STR_ZIP_DRIVES "Unidades ZIP:" +#define STR_250 "ZIP 250" + +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "Expansão de memória ISA" +#define STR_ISAMEM_1 "Placa 1:" +#define STR_ISAMEM_2 "Placa 2:" +#define STR_ISAMEM_3 "Placa 3:" +#define STR_ISAMEM_4 "Placa 4:" +#define STR_BUGGER "Dispositivo ISABugger" +#define STR_POSTCARD "Placa POST" + +#include "dialogs.rc" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Erro" + IDS_2050 "Erro fatal" + IDS_2051 "" + IDS_2052 "Pressione CTRL+ALT+PAGE DOWN para voltar no modo de janela." + IDS_2053 "Velocidade" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box não conseguiu encotnrar nenhuma imagem ROM utilizável.\n\nPor favor, descarregue um pacote ROM e extraí-lo na pasta ""roms""." + IDS_2057 "(empty)" + IDS_2058 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Activado" + IDS_2061 "Desactivado" + IDS_2062 "Todas as imagens (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Imagens básicas de sector (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Imagens de superfície (*.86F)\0*.86F\0" + IDS_2063 "A máquina ""%hs"" não é disponível devido à falta de ROMs na pasta roms/machines. A mudar para uma máquina disponível." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "A placa vídeo ""%hs"" não é disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." + IDS_2065 "Máquina" + IDS_2066 "Apresentação" + IDS_2067 "Dispositivos de entraa" + IDS_2068 "Som" + IDS_2069 "Rede" + IDS_2070 "Portas (COM e LPT)" + IDS_2071 "Dispositivos de armazenamento" + IDS_2072 "Discos rígidos" + IDS_2073 "Unidades de disquete e CD-ROM" + IDS_2074 "Outros dispostivos removíveis" + IDS_2075 "Outros dispositivos" + IDS_2076 "Imagens de superfície (*.86F)\0*.86F\0" + IDS_2077 "Clique para capturar o rato" + IDS_2078 "Pressione F8+F12 para soltar o rato" + IDS_2079 "Pressione F8+F12 ou tecla média para soltar o rato" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Não foi possível inicializar o FluidSynth" + IDS_2081 "Barramento" + IDS_2082 "Ficheiro" + IDS_2083 "C" + IDS_2084 "C" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "Verificar BPB" + IDS_2088 "KB" + IDS_2089 "Não foi possível inicializar o renderizador vídeo." + IDS_2090 "Padrão" + IDS_2091 "%i estado(s) de espera" + IDS_2092 "Tipo" + IDS_2093 "Falha na configuração de PCap" + IDS_2094 "Não foi encontrado algum dispositivo PCap" + IDS_2095 "Dispositivo PCap inválido" + IDS_2096 "Joystick(s) estándar a 2 botões" + IDS_2097 "Joystick(s) estándar a 4 botões" + IDS_2098 "Joystick(s) estándar a 6 botões" + IDS_2099 "Joystick(s) estándar a 8 botões" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Nenhum" + IDS_2104 "Não foi possível inicializar os acceleradores de teclado." + IDS_2105 "Não foi possível registar a entrada bruta." + IDS_2106 "%u" + IDS_2107 "%u MB (CCS: %i, %i, %i)" + IDS_2108 "Disquete %i (%s): %ls" + IDS_2109 "Todas as imagens (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Imagens avançadas de sector (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagens básicas de sector (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Imagens de fluxo (*.FDI)\0*.FDI\0Imagens de superfície (*.86F;*.MFM)\0*.86F;*.MFM\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2110 "Não foi possível inicializar o FreeType" + IDS_2111 "Não foi possível inicializar o SDL, SDL2.dll é necessário" + IDS_2112 "Tem certaza de que quer um reinicio completeo da máquina emulada?" + IDS_2113 "Tem certeza de que quer sair de 86Box?" + IDS_2114 "Não foi possível inicializar o Ghostscript" + IDS_2115 "Magneto-óptico %i (%ls): %ls" + IDS_2116 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todas as imagens (*.*)\0*.*\0" + IDS_2117 "Bem-vindoes em 86Box!" + IDS_2118 "Controlador interno" + IDS_2119 "Sair" + IDS_2120 "Não foi encontrado nenhum ROMs" + IDS_2121 "Deseja guardar as definições?" + IDS_2122 "Esto irá a causar um reinicio completo da máquina emulada." + IDS_2123 "Guardar" + IDS_2124 "Acerca de 86Box" + IDS_2125 "86Box v" EMU_VERSION + + IDS_2126 "Em emulator de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nLibertado sob a licença GNU General Public License versão 2 ou posterior. Veja o ficheiro LICENSE para mais informações." + IDS_2127 "OK" + IDS_2128 "Hardware não disponível" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Certifique-se de que a biblioteca " LIB_NAME_PCAP " è instalada e que está a utilizar uma ligação de rede compatível com a biblioteca " LIB_NAME_PCAP "." + IDS_2130 "Configuração inválida" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " 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." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " è necessário para a saída MIDI FluidSynth MIDI." + IDS_2134 "A entrar no modo da tela cheia" + IDS_2135 "Não mostrar mais esta mensagem" + IDS_2136 "Não sair" + IDS_2137 "Reiniciar" + IDS_2138 "Não reiniciar" + IDS_2139 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2140 "Imagens CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2141 "Configuração de dispositivo %hs" + IDS_2142 "Ecrã em modo de sono" + IDS_2143 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2144 "Opções de OpenGL" + IDS_2145 "Está a carregar uma configuração sem suporte" + IDS_2146 "A filtragem do tipo de CPU baseada na máquina escolhida está desactivada para esta máquina emulada.\n\nIsto torna possíve escolher um CPU que de outra formar não é compatível com a máquina escolhida. No entanto, pode não ser compatível com o BIOS da máquina ou outros programas.\n\nA activação desta definição não tem suporte oficial e qualquer relatório de errors pode ser fechado como inválido." + IDS_2147 "Continuar" + IDS_2148 "Cassete: %s" + IDS_2149 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2150 "Cartucho %i: %ls" + IDS_2151 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os ficheiros (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Disco rígido (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "As unidades CD-ROM com barramento MFM/RLL ou ESDI nunca existiram" + IDS_4100 "Personalizado..." + IDS_4101 "Persoanlizado (grande)..." + IDS_4102 "Adicionar novo disco rígido" + IDS_4103 "Adicionar disco rígido existente" + IDS_4104 "As imagens de disco HDI não podem ser mais grandes de 4 GB." + IDS_4105 "As imagens de disco não podem ser mais grandes de 127 GB." + IDS_4106 "Imagens de disco rígido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Todos os ficheiros (*.*)\0*.*\0" + IDS_4107 "Não foi possível ler o ficheiro" + IDS_4108 "Nào foi possível escrever o ficheiro" + IDS_4109 "As imagens HDI ou HDX com um tamanho de sector não 512 não têm suporte." + IDS_4110 "O barramento USB ainda não tem suporte" + IDS_4111 "A imagem de disco já existe" + IDS_4112 "Por favor, especifique um nome de ficheiro inválido." + IDS_4113 "Imagem de disco criada" + IDS_4114 "Certifique-se de que o ficheiro existe e é legível." + IDS_4115 "Certifique-se de que o ficheiro está a ser guarado numa pasta escrevível." + IDS_4116 "Imagem de disco muito grande" + IDS_4117 "Lembre de particionar e formatar o novo disco criado." + IDS_4118 "O ficheiro seleccionado será sobrescrevido. Tem certeza de que quiser utilizá-lo?" + IDS_4119 "Imagem de disco sem suporte" + IDS_4120 "Sobrescrever" + IDS_4121 "Não sobrescerever" + IDS_4122 "Imagem bruta (.img)" + IDS_4123 "Imagem HDI (.hdi)" + IDS_4124 "Imagem HDX (.hdx)" + IDS_4125 "VHD com tamanho fixo (.vhd)" + IDS_4126 "VHD com tamanho dinâmico (.vhd)" + IDS_4127 "VHD diferenciador (.vhd)" + IDS_4128 "Blocos grandes (2 MB)" + IDS_4129 "Blocos pequenos (512 KB)" + IDS_4130 "Ficheiros VHD (*.VHD)\0*.VHD\0Todos os ficheiros (*.*)\0*.*\0" + IDS_4131 "Seleccione o VHD pai" + IDS_4132 "Esto pode significar que a imagem pai foi modificada depois da criação da imagem diferenciadora.\n\nTambém pode acontecer se os ficheiros da imagem foram movidos ou copiados, ou por cause de um erro no programa que criou este disco.\n\nQuer corrigir os carimbos de data/hora?" + IDS_4133 "Os carimbos de data/hora de pai e criança não correspondem" + IDS_4134 "Não foi possível corrigir o carimbo de data/hora do VHD." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Desactivado" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Desactivado" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3.5"" 1.3Gb M.O. (GigaMO)" + IDS_5907 "3.5"" 2.3Gb M.O. (GigaMO 2)" + IDS_5908 "5.25"" 600Mb M.O." + IDS_5909 "5.25"" 650Mb M.O." + IDS_5910 "5.25"" 1Gb M.O." + IDS_5911 "5.25"" 1.3Gb M.O." + + IDS_6144 "RPM perfecto" + IDS_6145 "RPM 1%% sob a perfecção" + IDS_6146 "RPM 1.5%% sob a perfecção" + IDS_6147 "RPM 2%% sob a perfecção" + + IDS_7168 "(Padrão de sistema)" +END +#define IDS_LANG_ENUS IDS_7168 + +// Portuguese (Portugal) resources +///////////////////////////////////////////////////////////////////////////// From e74bd66f7c14152f8f5933aab9b3437965c77190 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 23:09:20 +0100 Subject: [PATCH 134/159] Fixed a typo in the pt-PT translation. --- src/win/languages/pt-PT.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 88160c893..0e6186fb6 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -423,7 +423,7 @@ BEGIN IDS_2064 "A placa vídeo ""%hs"" não é disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." IDS_2065 "Máquina" IDS_2066 "Apresentação" - IDS_2067 "Dispositivos de entraa" + IDS_2067 "Dispositivos de entrada" IDS_2068 "Som" IDS_2069 "Rede" IDS_2070 "Portas (COM e LPT)" From d708e67afb03ba46861f81a23f344feeb58e2747 Mon Sep 17 00:00:00 2001 From: dob205 Date: Sun, 14 Nov 2021 23:28:52 +0100 Subject: [PATCH 135/159] Fixing potential conflicts --- src/win/86Box.rc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/win/86Box.rc b/src/win/86Box.rc index e260e42aa..da5444f89 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -359,9 +359,10 @@ END ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED - +#include "languages/cs-CZ.rc" +#include "languages/de-DE.rc" #include "languages/en-US.rc" #include "languages/hu-HU.rc" #include "languages/pt-BR.rc" -#include "languages/de-DE.rc" +#include "languages/pt-PT.rc" From b8bc8f2a995c516a4106fafc2fb5c7758f7ff406 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Nov 2021 23:45:09 +0100 Subject: [PATCH 136/159] Removed a double END in the German translation. --- src/win/languages/de-DE.rc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 84b8d3f34..8621e70b5 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -84,7 +84,6 @@ BEGIN MENUITEM "&Grüner Monitor", IDM_VID_GRAY_GREEN MENUITEM "&Weißer Monitor", IDM_VID_GRAY_WHITE END - END POPUP "Methode zur &Graustufenkonversion" BEGIN MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 @@ -124,32 +123,32 @@ BEGIN MENUITEM "BusLogic-Logs aktivieren\tStrg+F4", IDM_LOG_BUSLOGIC # endif # ifdef ENABLE_CDROM_LOG - MENUITEM "CD-ROM-Logs aktivieren\tSTRG+F5", IDM_LOG_CDROM + MENUITEM "CD-ROM-Logs aktivieren\tStrg+F5", IDM_LOG_CDROM # endif # ifdef ENABLE_D86F_LOG - MENUITEM "Disketten (86F)-Logs aktivieren\tSTRG+F6", IDM_LOG_D86F + MENUITEM "Disketten (86F)-Logs aktivieren\tStrg+F6", IDM_LOG_D86F # endif # ifdef ENABLE_FDC_LOG - MENUITEM "Diskettencontroller-Logs aktivieren\tSTRG+F7", IDM_LOG_FDC + MENUITEM "Diskettencontroller-Logs aktivieren\tStrg+F7", IDM_LOG_FDC # endif # ifdef ENABLE_IDE_LOG - MENUITEM "IDE-Logs aktivieren\tSTRG+F8", IDM_LOG_IDE + MENUITEM "IDE-Logs aktivieren\tStrg+F8", IDM_LOG_IDE # endif # ifdef ENABLE_SERIAL_LOG - MENUITEM "Seriell-Port-Logs aktivieren\tSTRG+F3", IDM_LOG_SERIAL + MENUITEM "Seriell-Port-Logs aktivieren\tStrg+F3", IDM_LOG_SERIAL # endif # ifdef ENABLE_NIC_LOG - MENUITEM "Netzwerk-Logs aktivieren\tSTRG+F9", IDM_LOG_NIC + MENUITEM "Netzwerk-Logs aktivieren\tStrg+F9", IDM_LOG_NIC # endif # ifdef ENABLE_LOG_COMMANDS # ifdef ENABLE_LOG_TOGGLES MENUITEM SEPARATOR # endif # ifdef ENABLE_LOG_BREAKPOINT - MENUITEM "&Breakpoint für die Log-Datei\tSTRG+F10", IDM_LOG_BREAKPOINT + MENUITEM "&Breakpoint für die Log-Datei\tStrg+F10", IDM_LOG_BREAKPOINT # endif # ifdef ENABLE_VRAM_DUMP - MENUITEM "&Video-RAM dumpen\tSTRG+F1", IDM_DUMP_VRAM + MENUITEM "&Video-RAM dumpen\tStrg+F1", IDM_DUMP_VRAM # endif # endif END From 20507587e711d0685c5fd8daabd1b5150a46f6f5 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 15 Nov 2021 00:32:50 +0100 Subject: [PATCH 137/159] Fixed some mistakes in the pt-PT translation, thanks DoutorHouse! --- src/win/languages/pt-PT.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 0e6186fb6..a79644b09 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -17,8 +17,8 @@ MainMenu MENU DISCARDABLE BEGIN POPUP "&Acção" BEGIN - MENUITEM "&Teclado require captura", IDM_ACTION_KBD_REQ_CAPTURE - MENUITEM "&CTRL direita é ALT esquerda",IDM_ACTION_RCTRL_IS_LALT + MENUITEM "&Teclado requere captura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&CTRL direito é ALT esquerdo",IDM_ACTION_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Reinicialização completa...",IDM_ACTION_HRESET MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD @@ -50,7 +50,7 @@ BEGIN END MENUITEM SEPARATOR MENUITEM "&Especificar dimensões...", IDM_VID_SPECIFY_DIM - MENUITEM "&Forćar rácio de visualização 4:3", IDM_VID_FORCE43 + MENUITEM "&Forçar rácio de visualização 4:3", IDM_VID_FORCE43 POPUP "F&actor de escala de janela" BEGIN MENUITEM "&0.5x", IDM_VID_SCALE_1X From 5fb7141cc2353c92898a2eda127c971fecfee58e Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 20:51:01 -0300 Subject: [PATCH 138/159] Fix Jenkins Discord and IRC notifications --- .ci/Jenkinsfile | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 43a554705..a279e4932 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -138,8 +138,21 @@ pipeline { } if (!env.JOB_BASE_NAME.contains("TestBuildPleaseIgnore")) { - discordSend webhookURL: DISCORD_WEBHOOK_URL - ircNotify() + try { + def result = currentBuild.currentResult.toLowerCase() + discordSend webhookURL: DISCORD_WEBHOOK_URL, + title: "${env.JOB_BASE_NAME} #${env.BUILD_NUMBER}", + url: env.BUILD_URL, + description: "**Status:** ${result}\n\u2060", /* word joiner forces a blank line */ + enableArtifactsList: false, + showChangeset: true + + node { /* IRC notifications need a node for whatever reason */ + ircNotify() + } + } catch (Exception e) { + e.printStackTrace() + } } } } From ac0e77d9e61bd8807a1d16b8609a0dfb697d303f Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 20:58:30 -0300 Subject: [PATCH 139/159] Fix Jenkins Discord notification parameter --- .ci/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index a279e4932..feb9a6f41 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -142,8 +142,8 @@ pipeline { def result = currentBuild.currentResult.toLowerCase() discordSend webhookURL: DISCORD_WEBHOOK_URL, title: "${env.JOB_BASE_NAME} #${env.BUILD_NUMBER}", - url: env.BUILD_URL, - description: "**Status:** ${result}\n\u2060", /* word joiner forces a blank line */ + link: env.BUILD_URL, + description: "**Status:** ${result}\n\u2060", /* word joiner character forces a blank line */ enableArtifactsList: false, showChangeset: true From a95ce46240beddba0e75cc8dbc942dc61493ede4 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 21:10:09 -0300 Subject: [PATCH 140/159] Fix another Jenkins Discord notification parameter --- .ci/Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index feb9a6f41..f60bf06d8 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -143,6 +143,7 @@ pipeline { discordSend webhookURL: DISCORD_WEBHOOK_URL, title: "${env.JOB_BASE_NAME} #${env.BUILD_NUMBER}", link: env.BUILD_URL, + result: currentBuild.currentResult, description: "**Status:** ${result}\n\u2060", /* word joiner character forces a blank line */ enableArtifactsList: false, showChangeset: true From 0e52a261cc5c4a832603ea033248e73d8bcc195b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 21:20:47 -0300 Subject: [PATCH 141/159] Fix Jenkins CMake flags on MSYSTEM switching --- .ci/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 24738fbfb..5d71fcc91 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -145,7 +145,7 @@ build() { echo [-] Switching to MSYSTEM [$msys] cd "$cwd" CHERE_INVOKING=yes MSYSTEM="$msys" JOB_BASE_NAME="$JOB_BASE_NAME" BUILD_TYPE="$BUILD_TYPE" BUILD_NUMBER="$BUILD_NUMBER" GIT_COMMIT="$GIT_COMMIT" \ - bash -lc 'exec "'$0'" -b "'$arch'" '$cmake_flags && job_status=0 # make sure the main script exits cleanly on any success + bash -lc 'exec "'$0'" -b "'$arch'" '"$cmake_flags" && job_status=0 # make sure the main script exits cleanly on any success return $? fi else @@ -354,7 +354,7 @@ EOF : else # Create binary tarball. - make_tar ../$job_name-Linux-$arch$build_fn.tar + VERBOSE=1 make_tar ../$job_name-Linux-$arch$build_fn.tar local status=$? fi cd .. From 441ac9171db30ba25cb8b4da230ad06606d90a84 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Sun, 14 Nov 2021 21:21:12 -0300 Subject: [PATCH 142/159] Update pt-BR.rc --- src/win/languages/pt-BR.rc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 41ef506aa..623bced89 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -65,7 +65,6 @@ BEGIN MENUITEM "&Linear", IDM_VID_FILTER_LINEAR END MENUITEM "Escala Hi&DPI", IDM_VID_HIDPI - MENUITEM "&Idioma de exibição...", IDM_VID_PROG_SETT MENUITEM SEPARATOR MENUITEM "&Tela cheia\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN POPUP "Modo de &redimensionamento da tela cheia" @@ -147,7 +146,7 @@ BEGIN MENUITEM SEPARATOR # endif # ifdef ENABLE_LOG_BREAKPOINT - MENUITEM "&Registro de ponto de parada\tCtrl+F10", IDM_LOG_BREAKPOINT + MENUITEM "&Ponto de parada no registo\tCtrl+F10", IDM_LOG_BREAKPOINT # endif # ifdef ENABLE_VRAM_DUMP MENUITEM "Despejo da RAM de &vídeo\tCtrl+F1", IDM_DUMP_VRAM @@ -296,7 +295,7 @@ END #define STR_WIDTH "Largura:" #define STR_HEIGHT "Altura:" -#define STR_LOCK_TO_SIZE "Trava nesse tamanho" +#define STR_LOCK_TO_SIZE "Travar nesse tamanho" #define STR_MACHINE_TYPE "Tipo de máquina:" #define STR_MACHINE "Máquina:" @@ -307,7 +306,7 @@ END #define STR_WAIT_STATES "Estados de espera:" #define STR_MB "MB" #define STR_MEMORY "Memória:" -#define STR_TIME_SYNC "Sincronização de tempo" +#define STR_TIME_SYNC "Sincronização da hora" #define STR_DISABLED "Desativada" #define STR_ENABLED_LOCAL "Ativada (hora local)" #define STR_ENABLED_UTC "Ativada (UTC)" @@ -362,7 +361,7 @@ END #define STR_NEW "&Novo..." #define STR_EXISTING "&Existente..." #define STR_REMOVE "&Remover" -#define STR_BUS "Barram.:" +#define STR_BUS "Bar.:" #define STR_CHANNEL "Canal:" #define STR_ID "ID:" @@ -406,7 +405,7 @@ BEGIN IDS_2049 "Erro" IDS_2050 "Erro fatal" IDS_2051 "" - IDS_2052 "Use CTRL+ALT+PAGE DOWN para retornar ao janela" + IDS_2052 "Use CTRL+ALT+PAGE DOWN para retornar para o modo janela" IDS_2053 "Velocidade" IDS_2054 "ZIP %03i %i (%s): %ls" IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" @@ -451,7 +450,7 @@ BEGIN IDS_2086 "MB" IDS_2087 "Verificar BPB" IDS_2088 "KB" - IDS_2089 "Não conseguiu inicializar o renderizador de vídeo." + IDS_2089 "Não foi possível inicializar o renderizador de vídeo." IDS_2090 "Padrão" IDS_2091 "%i estado(s) de espera" IDS_2092 "Tipo" @@ -488,6 +487,7 @@ BEGIN IDS_2123 "Salvar" IDS_2124 "Sobre o 86Box" IDS_2125 "86Box versão" EMU_VERSION + IDS_2126 "Um emulador de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva\n\nLançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." IDS_2127 "OK" IDS_2128 "Hardware não disponível" From a45d8ac3ae371b85f0cd21a7eccdb773bd8705f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Mon, 15 Nov 2021 01:40:10 +0100 Subject: [PATCH 143/159] Reduce the number of makefile GH jobs --- .github/workflows/c-cpp.yml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 619d2c871..362becce6 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -1,4 +1,4 @@ -name: C/C++ CI +name: MinGW64 Makefile on: @@ -16,7 +16,7 @@ on: jobs: build: - name: ${{ matrix.environment.msystem }} makefile build (DEV_BUILD=${{ matrix.dev-build }}, NEW_DYNAREC=${{ matrix.new-dynarec }}, CLANG=${{ matrix.clang }}) + name: ${{ matrix.environment.msystem }} Makefile build (DEV_BUILD=${{ matrix.dev-build }}, NEW_DYNAREC=${{ matrix.new-dynarec }}) runs-on: windows-latest @@ -25,11 +25,10 @@ jobs: shell: msys2 {0} strategy: - fail-fast: false + fail-fast: true matrix: dev-build: ['y', 'n'] new-dynarec: ['y', 'n'] - clang: ['y', 'n'] environment: - msystem: MINGW32 prefix: mingw-w64-i686 @@ -37,9 +36,6 @@ jobs: - msystem: MINGW64 prefix: mingw-w64-x86_64 x64: y - - msystem: UCRT64 - prefix: mingw-w64-ucrt-x86_64 - x64: y steps: - uses: msys2/setup-msys2@v2 @@ -49,7 +45,6 @@ jobs: install: >- make ${{ matrix.environment.prefix }}-gcc - ${{ matrix.environment.prefix }}-clang ${{ matrix.environment.prefix }}-pkg-config ${{ matrix.environment.prefix }}-openal ${{ matrix.environment.prefix }}-freetype @@ -60,5 +55,5 @@ jobs: ${{ matrix.environment.prefix }}-winpthreads - uses: actions/checkout@v2 - name: make - run: make -fwin/makefile.mingw -j DEV_BUILD=${{ matrix.dev-build }} NEW_DYNAREC=${{ matrix.new-dynarec }} X64=${{ matrix.environment.x64 }} CLANG=${{ matrix.clang }} VNC=n + run: make -fwin/makefile.mingw -j DEV_BUILD=${{ matrix.dev-build }} NEW_DYNAREC=${{ matrix.new-dynarec }} X64=${{ matrix.environment.x64 }} VNC=n working-directory: ./src From 15b3507c812ca108d73935d648101d74f85331e8 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 21:23:28 -0300 Subject: [PATCH 144/159] Slight optimization on Jenkins workspace cleanup --- .ci/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 5d71fcc91..a7e690df4 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -211,7 +211,7 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) EOF - local cmake_flags_extra="$cmake_flags_extra -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake" + local cmake_flags_extra="$cmake_flags_extra -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake" # Install or update dependencies. echo [-] Installing dependencies through apt @@ -223,8 +223,8 @@ EOF # Clean workspace. echo [-] Cleaning workspace try_make clean > /dev/null - find . \( -name Makefile -o -name CMakeCache.txt -o -name CMakeFiles \) -exec rm -rf "{}" \; 2> /dev/null rm -rf build + find . \( -name Makefile -o -name CMakeCache.txt -o -name CMakeFiles \) -exec rm -rf "{}" \; 2> /dev/null # Determine available dynarec types for this architecture, and # also specify ARCH right away to skip the arch_detect process. From 79d974ee7fdad558c429ee0313f1db62132c8eb7 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 14 Nov 2021 22:19:15 -0300 Subject: [PATCH 145/159] Revert to old freetype DLL name --- .ci/build.sh | 2 +- src/printer/prt_escp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index a7e690df4..63a758542 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -288,7 +288,7 @@ EOF [ "$arch" = "32" -a -d "/c/Program Files (x86)" ] && pf="/c/Program Files (x86)" # Archive freetype from local MSYS installation. - .ci/static2dll.sh -p freetype2 /$MSYSTEM/lib/libfreetype.a archive_tmp/libfreetype.dll + .ci/static2dll.sh -p freetype2 /$MSYSTEM/lib/libfreetype.a archive_tmp/freetype.dll # Archive Ghostscript DLL from local official distribution installation. for gs in "$pf"/gs/gs*.*.* diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index 08b6cd58e..8e490e9e1 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -87,7 +87,7 @@ #ifdef _WIN32 -# define PATH_FREETYPE_DLL "libfreetype.dll" +# define PATH_FREETYPE_DLL "freetype.dll" #else # define PATH_FREETYPE_DLL "libfreetype.so.6" #endif From 672557546f76c97263f66c27460d804445602db1 Mon Sep 17 00:00:00 2001 From: dob205 Date: Mon, 15 Nov 2021 12:36:17 +0100 Subject: [PATCH 146/159] Adding the Croatian localization for Win32 This commit adds the Croatian (hr-HR) localization to the Win32 interface. --- src/win/languages/hr-HR.rc | 640 +++++++++++++++++++++++++++++++++++++ 1 file changed, 640 insertions(+) create mode 100644 src/win/languages/hr-HR.rc diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc new file mode 100644 index 000000000..09ca74158 --- /dev/null +++ b/src/win/languages/hr-HR.rc @@ -0,0 +1,640 @@ +//////////////////////////////////////////////////////////////////////////// +// Croatian (hr-HR) resources + +#ifdef _WIN32 +LANGUAGE LANG_CROATIAN, SUBLANG_DEFAULT +#pragma code_page(65001) +#endif //_WIN32 + +#define AUTHORS + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Action" + BEGIN + MENUITEM "&Tipkovnica zahtijeva snimanje miša", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Desni CTRL je lijevi ALT", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Hard Reset...", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Pauza", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "&Izlaz...", IDM_ACTION_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Sakrij statusnu traku", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Prozor s promjenjivim veličinama", IDM_VID_RESIZE + MENUITEM "&Zapamtite veličinu && poziciju", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "&Renderer" + BEGIN + MENUITEM "&SDL (Softver)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardver)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (3.3 jezgra)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "Odrediti dimenzije...", IDM_VID_SPECIFY_DIM + MENUITEM "&4:3 omjer prikaza", IDM_VID_FORCE43 + POPUP "&Faktor skaliranje prozora" + BEGIN + MENUITEM "&0,5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1,&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Metoda filtriranja" + BEGIN + MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + END + MENUITEM "&HiDPI skaliranje", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Cijeli zaslon\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "&Način rastezanja preko cijelog zaslona" + BEGIN + MENUITEM "&Razvlačenje preko cijelog zaslona", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Kvadratni pikseli (zadrži omjer)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Integer skala", IDM_VID_FS_INT + END + POPUP "E&GA/(S)VGA postavke" + BEGIN + MENUITEM "&Invertirani VGA monitor", IDM_VID_INVERT + POPUP "&Tip VGA monitora" + BEGIN + MENUITEM "RGB &Boja", IDM_VID_GRAY_RGB + MENUITEM "&RGB s sivih tonova", IDM_VID_GRAY_MONO + MENUITEM "&Jantarni monitor", IDM_VID_GRAY_AMBER + MENUITEM "&Zeleni monitor", IDM_VID_GRAY_GREEN + MENUITEM "&Bijeli monitor", IDM_VID_GRAY_WHITE + END + POPUP "&Vrsta konverzije sivih tonova" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Prosječno", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN + MENUITEM "Promjena kontrasta za &monokromatski ekran", IDM_VID_CGACON + END + MENUITEM "&Media", IDM_MEDIA + POPUP "&Alati" + BEGIN + MENUITEM "&Postavke...", IDM_CONFIG + MENUITEM "&Ažuriranje ikone statusne trake", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "&Promijeni jezik prikaza...", IDM_VID_PROG_SETT +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "Omogući integraciju &Discord-a", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "Napravite &snimku zaslona\Ctrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "&Pojačanje zvuka...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Započni tracing\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Prestani tracing\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Logging" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "Omogući BusLogic logging\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Omogući logging CD-ROM-a\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Omogući logging disketa (86F)\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Omogući logging floppy kontrolera\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "Omogući IDE logging\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Omogući logging serijskog porta\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Omogući mrežni logging\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Breakpoint za logging\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "Dump od &video RAM-a\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Help" + BEGIN + MENUITEM "&Dokumentacija...", IDM_DOCS + MENUITEM "&O 86Box...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova image daoteka...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Postojeća image daoteka...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Postojeća image daoteka (&zaštićena od pisanja)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Snimi", IDM_CASSETTE_RECORD + MENUITEM "&Pusti", IDM_CASSETTE_PLAY + MENUITEM "&Premotanje na početak", IDM_CASSETTE_REWIND + MENUITEM "&Brzi naprijed do kraja", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "&Izbaci", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Image daoteka...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "&Izbaci", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova image daoteka...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Postojeća image daoteka...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Postojeća image daoteka (&zaštićena od pisanja)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Exportiraj u 86F format...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "&Izbaci", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Isključi zvuk", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "&Prazno", IDM_CDROM_EMPTY + MENUITEM "&Ponovo učitaj prethodnu image daoteku", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Image daoteka", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova image daoteka...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Postojeća image daoteka...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Postojeća image daoteka (&zaštićena od pisanja)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Izbaci", IDM_ZIP_EJECT + MENUITEM "&Ponovo učitaj prethodnu image daoteku", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nova image daoteka...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Postojeća image daoteka...", IDM_MO_IMAGE_EXISTING + MENUITEM "Postojeća image daoteka (&zaštićena od pisanja)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Izbaci", IDM_MO_EJECT + MENUITEM "&Ponovo učitaj prethodnu image daoteku", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "Target &framerate" + BEGIN + MENUITEM "&Sinkronizacija s videom", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 fps", IDM_VID_GL_FPS_25 + MENUITEM "&30 fps", IDM_VID_GL_FPS_30 + MENUITEM "&50 fps", IDM_VID_GL_FPS_50 + MENUITEM "&60 fps", IDM_VID_GL_FPS_60 + MENUITEM "&75 fps", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&Odaberi shader...", IDM_VID_GL_SHADER + MENUITEM "&Ukloni shader", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +#define STR_PROG_SETT "Promjena jezika prikaza" +#define STR_SND_GAIN "Pojačavanje zvuka" +#define STR_NEW_FLOPPY "Nova image daoteka" +#define STR_CONFIG "86Box postavke" +#define STR_SPECIFY_DIM "Odredite glavne dimenzije prozora" + +#define STR_OK "OK" +#define STR_CANCEL "Odustani" +#define STR_GLOBAL "Spremite ove postavke kao &globalne zadane postavke" +#define STR_DEFAULT "&Standard" +#define STR_LANGUAGE "Jezik:" + +#define STR_GAIN "Pojačavanje" + +#define STR_FILE_NAME "Ime daoteke:" +#define STR_DISK_SIZE "Veličina diska:" +#define STR_RPM_MODE "Način rotacije:" +#define STR_PROGRESS "Napredak:" + +#define STR_WIDTH "Širina:" +#define STR_HEIGHT "Visina:" +#define STR_LOCK_TO_SIZE "Zaključajte na ovu veličinu" + +#define STR_MACHINE_TYPE "Tip računala:" +#define STR_MACHINE "Računalo:" +#define STR_CONFIGURE "Konfigurirajte" +#define STR_CPU_TYPE "CPU tip:" +#define STR_SPEED "Brzina:" +#define STR_FPU "FPU uređaj:" +#define STR_WAIT_STATES "Stanja čekanje:" +#define STR_MB "MB" +#define STR_MEMORY "Memorija:" +#define STR_TIME_SYNC "Vremenska sinkronizacija" +#define STR_DISABLED "Deaktivirano" +#define STR_ENABLED_LOCAL "Uključeno (lokalno vrijeme)" +#define STR_ENABLED_UTC "Uključeno (UTC)" +#define STR_DYNAREC "Dinamički rekompilator" + +#define STR_VIDEO "Video kartica:" +#define STR_VOODOO "Voodoo Graphics" + +#define STR_MOUSE "Miš:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." + +#define STR_SOUND "Sound kartica:" +#define STR_MIDI "MIDI Out uređaj:" +#define STR_MIDI_IN "MIDI In uređaj:" +#define STR_MPU401 "Samostalni MPU-401 uređaj" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Koristi FLOAT32 zvuk" + +#define STR_NET_TYPE "Tip mreže:" +#define STR_PCAP "PCap uređaj:" +#define STR_NET "Mrežni adapter:" + +#define STR_LPT1 "LPT1 uređaj:" +#define STR_LPT2 "LPT2 uređaj:" +#define STR_LPT3 "LPT3 uređaj:" +#define STR_SERIAL1 "Serijski port 1" +#define STR_SERIAL2 "Serijski port 2" +#define STR_SERIAL3 "Serijski port 3" +#define STR_SERIAL4 "Serijski port 4" +#define STR_PARALLEL1 "Paralelni priključak 1" +#define STR_PARALLEL2 "Paralelni priključak 2" +#define STR_PARALLEL3 "Paralelni priključak 3" + +#define STR_HDC "Kontroler tvrdog diska:" +#define STR_FDC "Kontroler diskete:" +#define STR_IDE_TER "Tercijarni IDE kontroler" +#define STR_IDE_QUA "Kvaternarni IDE kontroler" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Kontroler 1:" +#define STR_SCSI_2 "Kontroler 2:" +#define STR_SCSI_3 "Kontroler 3:" +#define STR_SCSI_4 "Kontroler 4:" +#define STR_CASSETTE "Audio kaseta" + +#define STR_HDD "Tvrdi diskovi:" +#define STR_NEW "&Novo..." +#define STR_EXISTING "&Postojeći..." +#define STR_REMOVE "&Ukloniti" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Kanal:" +#define STR_ID "ID:" + +#define STR_SPECIFY "&Izaberi..." +#define STR_SECTORS "Sektori:" +#define STR_HEADS "Glave:" +#define STR_CYLS "Cilindri:" +#define STR_SIZE_MB "Veličina (MB):" +#define STR_TYPE "Tip:" +#define STR_IMG_FORMAT "Format image daoteke:" +#define STR_BLOCK_SIZE "Veličina image daoteke:" + +#define STR_FLOPPY_DRIVES "Floppy drives:" +#define STR_TURBO "Turbo timingovi" +#define STR_CHECKBPB "Provjerite BPB" +#define STR_CDROM_DRIVES "CD-ROM pogoni:" + +#define STR_MO_DRIVES "MO pogoni:" +#define STR_ZIP_DRIVES "ZIP pogoni:" +#define STR_250 "ZIP 250" + +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "ISA proširenje memorije" +#define STR_ISAMEM_1 "Kartica 1:" +#define STR_ISAMEM_2 "Kartica 2:" +#define STR_ISAMEM_3 "Kartica 3:" +#define STR_ISAMEM_4 "Kartica 4:" +#define STR_BUGGER "ISABugger uređaj" +#define STR_POSTCARD "POST kartica" + +#include "dialogs.rc" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Greška" + IDS_2050 "Fatalna greška" + IDS_2051 "" + IDS_2052 "Pritisnite CTRL+ALT+PAGE DOWN za povratak u prozorski način rada." + IDS_2053 "Brzina" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "ZIP image daoteke (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the ""roms"" directory." + IDS_2057 "(prazno)" + IDS_2058 "ZIP image daoteke (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Svi daoteke (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Uključeno" + IDS_2061 "Isključeno" + IDS_2062 "Svi image daoteke (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Bazni sektorni image daoteke (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Površne image daoteke (*.86F)\0*.86F\0" + IDS_2063 "Računalo ""%hs"" nije dostupan jer nedostaju ROM-ovi u mapu roms/machines. Prebacivanje na raspoloživi računalo." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "Video kartica ""%hs"" nije dostupna jer nedostaju ROM-ovi u mapu roms/video. Prebacivanje na dostupnu video karticu." + IDS_2065 "Računalo" + IDS_2066 "Video" + IDS_2067 "Ulazni uređaji" + IDS_2068 "Zvuk" + IDS_2069 "Mreža" + IDS_2070 "Priključci (COM & LPT)" + IDS_2071 "Kontroleri za diskovi" + IDS_2072 "Tvrdi diskovi" + IDS_2073 "Floppy & CD-ROM pogoni" + IDS_2074 "Ostali uklonjivi uređaji" + IDS_2075 "Ostali periferni uređaji" + IDS_2076 "Površne image daoteke (*.86F)\0*.86F\0" + IDS_2077 "Kliknite za snimanje miša" + IDS_2078 "Pritisnite F8+F12 za otpuštanje miša" + IDS_2079 "Pritisnite F8+F12 ili srednji gumb za otpuštanje miša" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Nije moguće inicijalizirati FluidSynth" + IDS_2081 "Bus" + IDS_2082 "Daoteka" + IDS_2083 "C" + IDS_2084 "G" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "Provjeri BPB" + IDS_2088 "KB" + IDS_2089 "Nije moguće inicijalizirati videorenderer." + IDS_2090 "Standard" + IDS_2091 "%i stanja čekanja" + IDS_2092 "Tip" + IDS_2093 "Postavljanje PCap-a nije uspjelo" + IDS_2094 "Nema PCap uređaja" + IDS_2095 "Nevažeći PCap uređaj" + IDS_2096 "Standardni joystick(e) s 2 tipke" + IDS_2097 "Standardni joystick s 4 tipke" + IDS_2098 "Standardni joystick s 6 tipke" + IDS_2099 "Standardni joystick s 6 tipke" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Nikakve" + IDS_2104 "Nije moguće učitati akceleratore tipkovnice." + IDS_2105 "Nije moguće registrirati neobrađeni unos." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Disketa %i (%s): %ls" + IDS_2109 "Svi image daoteke (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Napredne sektorske image daoteke (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Bazni sektorni image daoteke (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux image daoteke (*.FDI)\0*.FDI\0Površne image daoteke (*.86F;*.MFM)\0*.86F;*.MFM\0Svi daoteke (*.*)\0*.*\0" + IDS_2110 "Nije moguće inicijalizirati FreeType" + IDS_2111 "Nije moguće inicijalizirati SDL, SDL2.dll je potrebno" + IDS_2112 "Jeste li sigurni da želite hard resetirati emulirano računalo?" + IDS_2113 "Jeste li sigurni da želite izaći iz 86Boxa?" + IDS_2114 "Nije moguće inicijalizirati Ghostscript" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "Image daoteke za MO diskovi (*.IM?;*.MDI)\0*.IM?;*.MDI\0Svi daoteke (*.*)\0*.*\0" + IDS_2117 "Dobrodošli u 86Box!" + IDS_2118 "Interni kontroler" + IDS_2119 "Izlazi" + IDS_2120 "Nisu pronađeni ROM daoteke" + IDS_2121 "Želite li spremiti postavke?" + IDS_2122 "Ovo će napraviti hard resetiranje emuliranog računala." + IDS_2123 "Spremi" + IDS_2124 "O 86Box" + IDS_2125 "86Box verzija " EMU_VERSION + + IDS_2126 "Emulator starih računala\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, i drugi.\n\Preveo: dob205\n\nObjavljeno pod GNU Općom javnom licencom, verzija 2 ili kasnije. Vidi LICENSE za više informacije." + IDS_2127 "OK" + IDS_2128 "Hardver nije dostupan" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Provjerite je li " LIB_NAME_PCAP " instaliran i jeste li na " LIB_NAME_PCAP "-kompatibilnoj mrežnoj vezi." + IDS_2130 "Nevažeća konfiguracija" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " je potrebno za emuliranje ESC/P pisača." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " je potrebno za automatsku konverziju PostScript daoteke u PDF daoteke.\n\nSvi dokumenti poslani na generički PostScript pisač bit će spremljeni kao PostScript (.ps) datoteke." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " je potrebno za FluidSynth MIDI izlaz." + IDS_2134 "Ulazak u način cijelog zaslona" + IDS_2135 "Ne pokazi više ovu poruku" + IDS_2136 "Ne izlazi" + IDS_2137 "Resetiraj" + IDS_2138 "Ne resetiraj" + IDS_2139 "Image daoteke za MO diskovi (*.IM?;*.MDI)\0*.IM?;*.MDI\0Svi daoteke (*.*)\0*.*\0" + IDS_2140 "Image daoteke za CD-ROM diskovi (*.ISO;*.CUE)\0*.ISO;*.CUE\0Svi daoteke (*.*)\0*.*\0" + IDS_2141 "%hs Konfiguracija Uređaja" + IDS_2142 "Monitor u stanju mirovanja" + IDS_2143 "OpenGL shaderi (*.GLSL)\0*.GLSL\0Svi daoteke (*.*)\0*.*\0" + IDS_2144 "OpenGL opcije" + IDS_2145 "Učitavate nepodržanu konfiguraciju" + IDS_2146 "Filtriranje tipa CPU-a na temelju odabranog stroja onemogućeno je za ovaj emuliranog računalo.\n\nOvo omogućuje odabir CPU-a koji inače nije kompatibilan s odabranog računalom. Međutim, možete naići na nekompatibilnosti s BIOS-om uređaja ili drugim softverom.\n\nOmogućavanje ove postavke nije službeno podržano i sva prijava o greškama mogu biti zatvorena kao ""invalid""." + IDS_2147 "Nastavi" + IDS_2148 "Audio kasete: %s" + IDS_2149 "Image daoteke za audio kasete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Svi daoteke (*.*)\0*.*\0" + IDS_2150 "Kaseta %i: %ls" + IDS_2151 "Image daoteke za kasete (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Svi daoteke (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Tvrdi disk (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "MFM/RLL ili ESDI CD-ROM drives nisu nikada postojali" + IDS_4100 "Prilagođeno..." + IDS_4101 "Prilagođeno (veliko)..." + IDS_4102 "Dodajte novi tvrdi disk" + IDS_4103 "Dodajte postojeći tvrdi disk" + IDS_4104 "HDI disk image daoteke ne mogu biti veće od 4 GB." + IDS_4105 "Image daoteke tvrdog diska ne mogu biti veće od 127 GB." + IDS_4106 "Image daoteke za tvrde diskove (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Svi daoteke (*.*)\0*.*\0" + IDS_4107 "Nije moguće pročitati datoteku" + IDS_4108 "Nije moguće napisati datoteku" + IDS_4109 "HDI ili HDX image daoteke s veličinom sektora koja nije 512 kB nisu podržane." + IDS_4110 "USB nije još podržano" + IDS_4111 "Image daoteka diska već postoji" + IDS_4112 "Molimo unesite važeći naziv datoteke." + IDS_4113 "Image diska je stvorena" + IDS_4114 "Provjerite je li postoji datoteka i je li je čitljiva." + IDS_4115 "Provjerite je li se datoteka sprema u mapu s dopuštenjima za pisanje." + IDS_4116 "Image diska je prevelika" + IDS_4117 "Ne zaboravite particionirati i formatirati novostvoreni tvrdi disk." + IDS_4118 "Odabrana datoteka bit će prebrisana. Jeste li sigurni da želite koristiti ovu daoteku?" + IDS_4119 "Nepodržana image daoteka diska" + IDS_4120 "Prepiši" + IDS_4121 "Ne prepiši" + IDS_4122 "Image daoteka neobrađenih podataka (.img)" + IDS_4123 "HDI image daoteka (.hdi)" + IDS_4124 "HDX image daoteka (.hdx)" + IDS_4125 "VHD fiksne veličine (.vhd)" + IDS_4126 "VHD dinamičke veličine (.vhd)" + IDS_4127 "Različiti VHD (.vhd)" + IDS_4128 "Veliki blokovi (2 MB)" + IDS_4129 "Mali blokovi (512 KB)" + IDS_4130 "VHD image daoteke (*.VHD)\0*.VHD\0Svi daoteke (*.*)\0*.*\0" + IDS_4131 "Izaberi matični VHD" + IDS_4132 "To bi moglo značiti da je matična image daoteka promijenjena nakon što je stvorena različita image daoteka.\n\nTo se također može dogoditi ako su image datoteke premještene ili kopirane, ili greška u programu koji je stvorio ovaj disk.\n\nŽelite li popraviti vremenske oznake?" + IDS_4133 "Vremenske ozanke matične i poređenog diska ne odgovaraju." + IDS_4134 "Nisam mogao popraviti vremensku oznaku VHDa." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Deaktivirano" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Deaktivirano" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1,2 MB" + IDS_5895 "1,25 MB" + IDS_5896 "1,44 MB" + IDS_5897 "DMF (1024 clusteri)" + IDS_5898 "DMF (2048 clusteri)" + IDS_5899 "2,88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3,5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3,5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3,5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3,5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3,5"" 1.3Gb M.O. (GigaMO)" + IDS_5907 "3,5"" 2.3Gb M.O. (GigaMO 2)" + IDS_5908 "5,25"" 600Mb M.O." + IDS_5909 "5,25"" 650Mb M.O." + IDS_5910 "5,25"" 1Gb M.O." + IDS_5911 "5,25"" 1.3Gb M.O." + + IDS_6144 "Savršen broj okretanja" + IDS_6145 "1%% ispod savršenog broja okretaja" + IDS_6146 "1,5%% ispod savršenog broja okretaja" + IDS_6147 "2%% ispod savršenog broja okretaja" + + IDS_7168 "(Standard operativnog sustava)" +END +#define IDS_LANG_ENUS IDS_7168 + +// Croatian (hr-HR) resources +///////////////////////////////////////////////////////////////////////////// From 08075ff29f79ead03a349f43954a2b8a994532bf Mon Sep 17 00:00:00 2001 From: dob205 Date: Mon, 15 Nov 2021 12:37:42 +0100 Subject: [PATCH 147/159] Loading the Croatian localization into the program --- src/win/86Box.rc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 7fd422702..ffa88d48c 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -366,3 +366,4 @@ END #include "languages/hu-HU.rc" #include "languages/pt-BR.rc" #include "languages/pt-PT.rc" +#include "languages/hr-HR.rc" From df6f638a21686bbb0dfccf20017c375e53b15095 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 15 Nov 2021 12:48:38 +0100 Subject: [PATCH 148/159] Fixed two bugs with the Croatian translation. --- src/win/languages/hr-HR.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 09ca74158..015e00da6 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -107,7 +107,7 @@ BEGIN MENUITEM "Omogući integraciju &Discord-a", IDM_DISCORD # endif MENUITEM SEPARATOR - MENUITEM "Napravite &snimku zaslona\Ctrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM "Napravite &snimku zaslona\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Pojačanje zvuka...", IDM_SND_GAIN #ifdef MTR_ENABLED @@ -487,7 +487,7 @@ BEGIN IDS_2124 "O 86Box" IDS_2125 "86Box verzija " EMU_VERSION - IDS_2126 "Emulator starih računala\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, i drugi.\n\Preveo: dob205\n\nObjavljeno pod GNU Općom javnom licencom, verzija 2 ili kasnije. Vidi LICENSE za više informacije." + IDS_2126 "Emulator starih računala\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, i drugi.\n\nPreveo: dob205\n\nObjavljeno pod GNU Općom javnom licencom, verzija 2 ili kasnije. Vidi LICENSE za više informacije." IDS_2127 "OK" IDS_2128 "Hardver nije dostupan" #ifdef _WIN32 From 0111c83828145a5e20fc9975e7ace62191b5590d Mon Sep 17 00:00:00 2001 From: altiereslima Date: Mon, 15 Nov 2021 11:19:36 -0300 Subject: [PATCH 149/159] Update pt-BR.rc --- src/win/languages/pt-BR.rc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 623bced89..4e6b97981 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -282,7 +282,7 @@ END #define STR_OK "OK" #define STR_CANCEL "Cancelar" -#define STR_GLOBAL "Use estas configurações como &padrões globais" +#define STR_GLOBAL "Usar estas configurações como &padrões globais" #define STR_DEFAULT "&Padrão" #define STR_LANGUAGE "Idioma:" @@ -312,19 +312,19 @@ END #define STR_ENABLED_UTC "Ativada (UTC)" #define STR_DYNAREC "Recompilador dinâmico" -#define STR_VIDEO "Video:" +#define STR_VIDEO "Vídeo:" #define STR_VOODOO "3DFX Voodoo" -#define STR_MOUSE "Mouse" +#define STR_MOUSE "Mouse:" #define STR_JOYSTICK "Joystick:" #define STR_JOY1 "Joystick 1..." #define STR_JOY2 "Joystick 2..." #define STR_JOY3 "Joystick 3..." #define STR_JOY4 "Joystick 4..." -#define STR_SOUND "Place de som:" +#define STR_SOUND "Placa de som:" #define STR_MIDI "Disp. saída MIDI:" -#define STR_MIDI_IN "Disp. enrada MIDI:" +#define STR_MIDI_IN "Disp. entrada MIDI:" #define STR_MPU401 "MPU-401 autônomo" #define STR_SSI "Innovation SSI-2001" #define STR_CMS "CMS / Game Blaster" @@ -405,7 +405,7 @@ BEGIN IDS_2049 "Erro" IDS_2050 "Erro fatal" IDS_2051 "" - IDS_2052 "Use CTRL+ALT+PAGE DOWN para retornar para o modo janela" + IDS_2052 "Use CTRL+ALT+PAGE DOWN para retornar ao modo janela" IDS_2053 "Velocidade" IDS_2054 "ZIP %03i %i (%s): %ls" IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" @@ -476,7 +476,7 @@ BEGIN IDS_2112 "Tem certeza de que deseja reiniciar completamente a máquina emulada?" IDS_2113 "Tem certeza de que deseja sair do 86Box?" IDS_2114 "Não é possível inicializar o Ghostscript" - IDS_2115 "MO %i (%ls): %ls" + IDS_2115 "Magneto-óptico %i (%ls): %ls" IDS_2116 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todos os arquivos (*.*)\0*.*\0" IDS_2117 "Bem-vindo ao 86Box!" IDS_2118 "Controle interno" @@ -496,7 +496,7 @@ BEGIN #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2129 "Certifique-se de que " LIB_NAME_PCAP " esteja instalado e que você tenha uma " LIB_NAME_PCAP " -conexão de rede compatível." + IDS_2129 "Certifique-se de que " LIB_NAME_PCAP " esteja instalado e que você tenha uma conexão de rede compatível com " LIB_NAME_PCAP "." IDS_2130 "Configuração inválida" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" From 6297823fb40c91b4c57d94726034157f8dfc3aa3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 15 Nov 2021 16:35:34 +0100 Subject: [PATCH 150/159] Fixed by DoutorHouse to the pt-PT translation. --- src/win/languages/pt-PT.rc | 176 ++++++++++++++++++------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index a79644b09..b7e291621 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -15,7 +15,7 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE MainMenu MENU DISCARDABLE BEGIN - POPUP "&Acção" + POPUP "&Ação" BEGIN MENUITEM "&Teclado requere captura", IDM_ACTION_KBD_REQ_CAPTURE MENUITEM "&CTRL direito é ALT esquerdo",IDM_ACTION_RCTRL_IS_LALT @@ -51,7 +51,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Especificar dimensões...", IDM_VID_SPECIFY_DIM MENUITEM "&Forçar rácio de visualização 4:3", IDM_VID_FORCE43 - POPUP "F&actor de escala de janela" + POPUP "&Factor de escala de janela" BEGIN MENUITEM "&0.5x", IDM_VID_SCALE_1X MENUITEM "&1x", IDM_VID_SCALE_2X @@ -65,10 +65,10 @@ BEGIN END MENUITEM "Escala Hi&DPI", IDM_VID_HIDPI MENUITEM SEPARATOR - MENUITEM "&Tela cheia\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN - POPUP "Mode &de estiramento em tela cheia" + MENUITEM "&Ecrã cheio\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Modo &de estiramento em ecrã cheio" BEGIN - MENUITEM "&Estiramento em tela cheia", IDM_VID_FS_FULL + MENUITEM "&Estiramento em ecrã cheio", IDM_VID_FS_FULL MENUITEM "&4:3", IDM_VID_FS_43 MENUITEM "Pixels &quadrados (Manter rácio)", IDM_VID_FS_KEEPRATIO MENUITEM "Escala &inteira", IDM_VID_FS_INT @@ -88,64 +88,64 @@ BEGIN BEGIN MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 - MENUITEM "&Média", IDM_VID_GRAYCT_AVE + MENUITEM "&Media", IDM_VID_GRAYCT_AVE END END MENUITEM SEPARATOR MENUITEM "Overscan de CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN - MENUITEM "Mudar &contraste para ecrão monocromático", IDM_VID_CGACON + MENUITEM "Mudar &contraste para ecrã monocromático", IDM_VID_CGACON END - MENUITEM "&Mídia", IDM_MEDIA + MENUITEM "&Media", IDM_MEDIA POPUP "&Ferramentas" BEGIN MENUITEM "&Definições...", IDM_CONFIG - MENUITEM "&Actualizar ícones da barra de estado", IDM_UPDATE_ICONS + MENUITEM "&Atualizar ícones da barra de estado", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Mudar idioma de a&presentação...", IDM_VID_PROG_SETT # ifdef USE_DISCORD MENUITEM SEPARATOR - MENUITEM "Activar integração de &Discord", IDM_DISCORD + MENUITEM "Ativar integração com &Discord", IDM_DISCORD # endif MENUITEM SEPARATOR - MENUITEM "Tirar i&magem de tela\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM "Gravar imagem de ecrã\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Ganho de som...", IDM_SND_GAIN #ifdef MTR_ENABLED MENUITEM SEPARATOR - MENUITEM "Iniciar o rasterio\tCtrl+T", IDM_ACTION_BEGIN_TRACE - MENUITEM "Terminar o rasterio\tCtrl+T", IDM_ACTION_END_TRACE + MENUITEM "Iniciar o rastreio\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Terminar o rastreio\tCtrl+T", IDM_ACTION_END_TRACE #endif END #if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) POPUP "&Registo" BEGIN # ifdef ENABLE_BUSLOGIC_LOG - MENUITEM "Activar registo BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC + MENUITEM "Ativar registo BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC # endif # ifdef ENABLE_CDROM_LOG - MENUITEM "Activar registo CD-ROM\tCtrl+F5", IDM_LOG_CDROM + MENUITEM "Ativar registo do CD-ROM\tCtrl+F5", IDM_LOG_CDROM # endif # ifdef ENABLE_D86F_LOG - MENUITEM "Activar registo de disquetes (86F)\tCtrl+F6", IDM_LOG_D86F + MENUITEM "Ativar registo de disquetes (86F)\tCtrl+F6", IDM_LOG_D86F # endif # ifdef ENABLE_FDC_LOG - MENUITEM "Activar registo do controlar de disquetes\tCtrl+F7", IDM_LOG_FDC + MENUITEM "Ativar registo do controlador de disquetes\tCtrl+F7", IDM_LOG_FDC # endif # ifdef ENABLE_IDE_LOG - MENUITEM "Activar registo IDE\tCtrl+F8", IDM_LOG_IDE + MENUITEM "Ativar registo IDE\tCtrl+F8", IDM_LOG_IDE # endif # ifdef ENABLE_SERIAL_LOG - MENUITEM "Activar registo da porta de série\tCtrl+F3", IDM_LOG_SERIAL + MENUITEM "Ativar registo da porta série\tCtrl+F3", IDM_LOG_SERIAL # endif # ifdef ENABLE_NIC_LOG - MENUITEM "Activar registo de rede\tCtrl+F9", IDM_LOG_NIC + MENUITEM "Ativar registo de rede\tCtrl+F9", IDM_LOG_NIC # endif # ifdef ENABLE_LOG_COMMANDS # ifdef ENABLE_LOG_TOGGLES MENUITEM SEPARATOR # endif # ifdef ENABLE_LOG_BREAKPOINT - MENUITEM "&Ponto de parada no registo\tCtrl+F10", IDM_LOG_BREAKPOINT + MENUITEM "&Ponto de paragem no registo\tCtrl+F10", IDM_LOG_BREAKPOINT # endif # ifdef ENABLE_VRAM_DUMP MENUITEM "Despejo de RAM &vídeo\tCtrl+F1", IDM_DUMP_VRAM @@ -156,7 +156,7 @@ BEGIN POPUP "&Ajuda" BEGIN MENUITEM "&Documentação...", IDM_DOCS - MENUITEM "&Acerca de 86Box...", IDM_ABOUT + MENUITEM "&Acerca do 86Box...", IDM_ABOUT END END @@ -172,14 +172,14 @@ BEGIN MENUITEM "&Nova imagem...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "Imagem &existente...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR MENUITEM "&Gravar", IDM_CASSETTE_RECORD MENUITEM "&Reproduzir", IDM_CASSETTE_PLAY MENUITEM "Re&bobinar para o início", IDM_CASSETTE_REWIND - MENUITEM "&Avanço rápido para a fim", IDM_CASSETTE_FAST_FORWARD + MENUITEM "&Avanço rápido para o fim", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&jectar", IDM_CASSETTE_EJECT + MENUITEM "E&jetar", IDM_CASSETTE_EJECT END END @@ -189,7 +189,7 @@ BEGIN BEGIN MENUITEM "&Imagem...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&jectar", IDM_CARTRIDGE_EJECT + MENUITEM "E&jetar", IDM_CARTRIDGE_EJECT END END @@ -200,11 +200,11 @@ BEGIN MENUITEM "&Nova imagem...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "Imagem &existente...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR MENUITEM "E&xportar para 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&jectar", IDM_FLOPPY_EJECT + MENUITEM "E&jetar", IDM_FLOPPY_EJECT END END @@ -214,7 +214,7 @@ BEGIN BEGIN MENUITEM "&Mute", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "E&mpty", IDM_CDROM_EMPTY + MENUITEM "&CDROM vazio", IDM_CDROM_EMPTY MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Imagem", IDM_CDROM_IMAGE @@ -228,9 +228,9 @@ BEGIN MENUITEM "&Nova imagem...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "Imagem &existente...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jectar", IDM_ZIP_EJECT + MENUITEM "E&jetar", IDM_ZIP_EJECT MENUITEM "&Recarregar imagem anterior", IDM_ZIP_RELOAD END END @@ -242,9 +242,9 @@ BEGIN MENUITEM "&Nova imagem...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "Imagem &existente...", IDM_MO_IMAGE_EXISTING - MENUITEM "Imagem existente (&Protecção contra a escritura)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "Imagem existente (&Proteção contra escrita)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&jectar", IDM_MO_EJECT + MENUITEM "E&jetar", IDM_MO_EJECT MENUITEM "&Recarregar imagem anterior", IDM_MO_RELOAD END END @@ -262,7 +262,7 @@ BEGIN MENUITEM "&75 q/s", IDM_VID_GL_FPS_75 END MENUITEM "&VSync", IDM_VID_GL_VSYNC - MENUITEM "&Seleccionar shader...", IDM_VID_GL_SHADER + MENUITEM "&Selecionar shader...", IDM_VID_GL_SHADER MENUITEM "&Remover shader", IDM_VID_GL_NOSHADER END #endif @@ -274,10 +274,10 @@ END // #define STR_PROG_SETT "Mudar idioma de apresentação" -#define STR_SND_GAIN "Ganha de som" +#define STR_SND_GAIN "Ganho de som" #define STR_NEW_FLOPPY "Nova imagem" -#define STR_CONFIG "Definições de 86Box" -#define STR_SPECIFY_DIM "Especifiar dimensões da janela principal" +#define STR_CONFIG "Definições do 86Box" +#define STR_SPECIFY_DIM "Especificar dimensões da janela principal" #define STR_OK "OK" #define STR_CANCEL "Cancelar" @@ -294,7 +294,7 @@ END #define STR_WIDTH "Largura:" #define STR_HEIGHT "Altura:" -#define STR_LOCK_TO_SIZE "Fechar para este tamanho" +#define STR_LOCK_TO_SIZE "Fixar neste tamanho" #define STR_MACHINE_TYPE "Tipo de máquina:" #define STR_MACHINE "Máquina:" @@ -306,9 +306,9 @@ END #define STR_MB "MB" #define STR_MEMORY "Memória:" #define STR_TIME_SYNC "Sincronização da hora" -#define STR_DISABLED "Desactivada" -#define STR_ENABLED_LOCAL "Activada (ora local)" -#define STR_ENABLED_UTC "Activada (UTC)" +#define STR_DISABLED "Desativada" +#define STR_ENABLED_LOCAL "Ativada (hora local)" +#define STR_ENABLED_UTC "Ativada (UTC)" #define STR_DYNAREC "Recompilador dinâmico" #define STR_VIDEO "Vídeo:" @@ -404,23 +404,23 @@ BEGIN IDS_2049 "Erro" IDS_2050 "Erro fatal" IDS_2051 "" - IDS_2052 "Pressione CTRL+ALT+PAGE DOWN para voltar no modo de janela." + IDS_2052 "Pressione CTRL+ALT+PAGE DOWN para voltar ao modo de janela." IDS_2053 "Velocidade" IDS_2054 "ZIP %03i %i (%s): %ls" IDS_2055 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" - IDS_2056 "86Box não conseguiu encotnrar nenhuma imagem ROM utilizável.\n\nPor favor, descarregue um pacote ROM e extraí-lo na pasta ""roms""." + IDS_2056 "O 86Box não conseguiu encontrar nenhuma imagem ROM utilizável.\n\nPor favor, vá a href=""https://github.com/86Box/roms/releases/latest"">descarregue um pacote ROM e instale-o na pasta ""roms""." IDS_2057 "(empty)" IDS_2058 "Imagens ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Todos os ficheiros (*.*)\0*.*\0" IDS_2059 "Turbo" - IDS_2060 "Activado" - IDS_2061 "Desactivado" + IDS_2060 "Ativado" + IDS_2061 "Desativado" IDS_2062 "Todas as imagens (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Imagens básicas de sector (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Imagens de superfície (*.86F)\0*.86F\0" - IDS_2063 "A máquina ""%hs"" não é disponível devido à falta de ROMs na pasta roms/machines. A mudar para uma máquina disponível." + IDS_2063 "A máquina ""%hs"" não está disponível devido à falta de ROMs na pasta roms/machines. A mudar para uma máquina disponível." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "A placa vídeo ""%hs"" não é disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." + IDS_2064 "A placa vídeo ""%hs"" não está disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." IDS_2065 "Máquina" IDS_2066 "Apresentação" IDS_2067 "Dispositivos de entrada" @@ -454,40 +454,40 @@ BEGIN IDS_2091 "%i estado(s) de espera" IDS_2092 "Tipo" IDS_2093 "Falha na configuração de PCap" - IDS_2094 "Não foi encontrado algum dispositivo PCap" + IDS_2094 "Não foi encontrado um dispositivo PCap" IDS_2095 "Dispositivo PCap inválido" - IDS_2096 "Joystick(s) estándar a 2 botões" - IDS_2097 "Joystick(s) estándar a 4 botões" - IDS_2098 "Joystick(s) estándar a 6 botões" - IDS_2099 "Joystick(s) estándar a 8 botões" + IDS_2096 "Joystick(s) standard de 2 botões" + IDS_2097 "Joystick(s) standard de 4 botões" + IDS_2098 "Joystick(s) standard de 6 botões" + IDS_2099 "Joystick(s) standard de 8 botões" IDS_2100 "CH Flightstick Pro" IDS_2101 "Microsoft SideWinder Pad" IDS_2102 "Thrustmaster Flight Control System" IDS_2103 "Nenhum" - IDS_2104 "Não foi possível inicializar os acceleradores de teclado." + IDS_2104 "Não foi possível inicializar os aceleradores de teclado." IDS_2105 "Não foi possível registar a entrada bruta." IDS_2106 "%u" IDS_2107 "%u MB (CCS: %i, %i, %i)" IDS_2108 "Disquete %i (%s): %ls" IDS_2109 "Todas as imagens (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Imagens avançadas de sector (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagens básicas de sector (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Imagens de fluxo (*.FDI)\0*.FDI\0Imagens de superfície (*.86F;*.MFM)\0*.86F;*.MFM\0Todos os ficheiros (*.*)\0*.*\0" IDS_2110 "Não foi possível inicializar o FreeType" - IDS_2111 "Não foi possível inicializar o SDL, SDL2.dll é necessário" - IDS_2112 "Tem certaza de que quer um reinicio completeo da máquina emulada?" - IDS_2113 "Tem certeza de que quer sair de 86Box?" + IDS_2111 "Não foi possível inicializar o SDL. O ficheiro SDL2.dll é necessário!" + IDS_2112 "Tem a certeza de que quer um reinício completo da máquina emulada?" + IDS_2113 "Tem a certeza de que quer sair do 86Box?" IDS_2114 "Não foi possível inicializar o Ghostscript" IDS_2115 "Magneto-óptico %i (%ls): %ls" IDS_2116 "Imagens magneto-ópticas (*.IM?;*.MDI)\0*.IM?;*.MDI\0Todas as imagens (*.*)\0*.*\0" - IDS_2117 "Bem-vindoes em 86Box!" + IDS_2117 "Bem-vindos ao 86Box!" IDS_2118 "Controlador interno" IDS_2119 "Sair" - IDS_2120 "Não foi encontrado nenhum ROMs" + IDS_2120 "Não foi encontrada nenhuma ROM" IDS_2121 "Deseja guardar as definições?" - IDS_2122 "Esto irá a causar um reinicio completo da máquina emulada." + IDS_2122 "Isto irá causar um reinício completo da máquina emulada." IDS_2123 "Guardar" - IDS_2124 "Acerca de 86Box" + IDS_2124 "Acerca do 86Box" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "Em emulator de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nLibertado sob a licença GNU General Public License versão 2 ou posterior. Veja o ficheiro LICENSE para mais informações." + IDS_2126 "Em emulator de computadores antigos\n\nAutores: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nUsado sob a licença GNU General Public License versão 2 ou posterior. Veja o ficheiro LICENSE para mais informações." IDS_2127 "OK" IDS_2128 "Hardware não disponível" #ifdef _WIN32 @@ -495,27 +495,27 @@ BEGIN #else #define LIB_NAME_PCAP "libpcap" #endif - IDS_2129 "Certifique-se de que a biblioteca " LIB_NAME_PCAP " è instalada e que está a utilizar uma ligação de rede compatível com a biblioteca " LIB_NAME_PCAP "." + IDS_2129 "Certifique-se de que a biblioteca " LIB_NAME_PCAP " está instalada e de que está a utilizar uma ligação de rede compatível com a biblioteca " LIB_NAME_PCAP "." IDS_2130 "Configuração inválida" #ifdef _WIN32 #define LIB_NAME_FREETYPE "freetype.dll" #else #define LIB_NAME_FREETYPE "libfreetype" #endif - IDS_2131 LIB_NAME_FREETYPE " is required for ESC/P printer emulation." + IDS_2131 LIB_NAME_FREETYPE " é requerida para a emulação de impressora ESC/P." #ifdef _WIN32 #define LIB_NAME_GS "gsdll32.dll" #else #define LIB_NAME_GS "libgs" #endif - IDS_2132 LIB_NAME_GS " 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." + IDS_2132 LIB_NAME_GS " é requerido para a conversão automática de ficheiros PostScript para ficheiros PDF.\n\nQualquer documento enviado para a impressora PostScript genérica será gravado como um ficheiro PostScript (.ps)." #ifdef _WIN32 #define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" #else #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif - IDS_2133 LIB_NAME_FLUIDSYNTH " è necessário para a saída MIDI FluidSynth MIDI." - IDS_2134 "A entrar no modo da tela cheia" + IDS_2133 LIB_NAME_FLUIDSYNTH " é necessário para a saída MIDI FluidSynth MIDI." + IDS_2134 "A entrar no modo de ecrã cheio" IDS_2135 "Não mostrar mais esta mensagem" IDS_2136 "Não sair" IDS_2137 "Reiniciar" @@ -526,8 +526,8 @@ BEGIN IDS_2142 "Ecrã em modo de sono" IDS_2143 "Shaders OpenGL (*.GLSL)\0*.GLSL\0Todos os ficheiros (*.*)\0*.*\0" IDS_2144 "Opções de OpenGL" - IDS_2145 "Está a carregar uma configuração sem suporte" - IDS_2146 "A filtragem do tipo de CPU baseada na máquina escolhida está desactivada para esta máquina emulada.\n\nIsto torna possíve escolher um CPU que de outra formar não é compatível com a máquina escolhida. No entanto, pode não ser compatível com o BIOS da máquina ou outros programas.\n\nA activação desta definição não tem suporte oficial e qualquer relatório de errors pode ser fechado como inválido." + IDS_2145 "Está a carregar uma configuração sem suporte!" + IDS_2146 "A filtragem do tipo de CPU baseada na máquina escolhida está desativada para esta máquina emulada.\n\nIsto torna possível escolher um CPU que, de outra forma, não seria compatível com a máquina escolhida. No entanto, pode não ser compatível com a BIOS da máquina ou outros programas.\n\nA activação desta definição não tem suporte oficial e qualquer relatório de erros pode ser fechado como inválido." IDS_2147 "Continuar" IDS_2148 "Cassete: %s" IDS_2149 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os ficheiros (*.*)\0*.*\0" @@ -540,29 +540,29 @@ BEGIN IDS_4096 "Disco rígido (%s)" IDS_4097 "%01i:%01i" IDS_4098 "%01i" - IDS_4099 "As unidades CD-ROM com barramento MFM/RLL ou ESDI nunca existiram" + IDS_4099 "Unidades CD-ROM com barramento MFM/RLL ou ESDI nunca existiram!" IDS_4100 "Personalizado..." - IDS_4101 "Persoanlizado (grande)..." + IDS_4101 "Personalizado (grande)..." IDS_4102 "Adicionar novo disco rígido" IDS_4103 "Adicionar disco rígido existente" - IDS_4104 "As imagens de disco HDI não podem ser mais grandes de 4 GB." - IDS_4105 "As imagens de disco não podem ser mais grandes de 127 GB." + IDS_4104 "As imagens de disco HDI não podem ter mais de 4 GB." + IDS_4105 "As imagens de disco não podem ter mais de 127 GB." IDS_4106 "Imagens de disco rígido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Todos os ficheiros (*.*)\0*.*\0" IDS_4107 "Não foi possível ler o ficheiro" - IDS_4108 "Nào foi possível escrever o ficheiro" - IDS_4109 "As imagens HDI ou HDX com um tamanho de sector não 512 não têm suporte." + IDS_4108 "Não foi possível escrever o ficheiro" + IDS_4109 "Imagens HDI ou HDX com um tamanho de sector diferente de 512 não são suportadas." IDS_4110 "O barramento USB ainda não tem suporte" IDS_4111 "A imagem de disco já existe" - IDS_4112 "Por favor, especifique um nome de ficheiro inválido." + IDS_4112 "Por favor, especifique um nome de ficheiro válido." IDS_4113 "Imagem de disco criada" IDS_4114 "Certifique-se de que o ficheiro existe e é legível." - IDS_4115 "Certifique-se de que o ficheiro está a ser guarado numa pasta escrevível." + IDS_4115 "Certifique-se de que o ficheiro está a ser guardado numa pasta editável." IDS_4116 "Imagem de disco muito grande" - IDS_4117 "Lembre de particionar e formatar o novo disco criado." - IDS_4118 "O ficheiro seleccionado será sobrescrevido. Tem certeza de que quiser utilizá-lo?" + IDS_4117 "Lembre-se de particionar e formatar o novo disco criado." + IDS_4118 "O ficheiro selecionado será sobrescrito. Tem a certeza de que quer utilizá-lo?" IDS_4119 "Imagem de disco sem suporte" IDS_4120 "Sobrescrever" - IDS_4121 "Não sobrescerever" + IDS_4121 "Não sobrescrever" IDS_4122 "Imagem bruta (.img)" IDS_4123 "Imagem HDI (.hdi)" IDS_4124 "Imagem HDX (.hdx)" @@ -573,8 +573,8 @@ BEGIN IDS_4129 "Blocos pequenos (512 KB)" IDS_4130 "Ficheiros VHD (*.VHD)\0*.VHD\0Todos os ficheiros (*.*)\0*.*\0" IDS_4131 "Seleccione o VHD pai" - IDS_4132 "Esto pode significar que a imagem pai foi modificada depois da criação da imagem diferenciadora.\n\nTambém pode acontecer se os ficheiros da imagem foram movidos ou copiados, ou por cause de um erro no programa que criou este disco.\n\nQuer corrigir os carimbos de data/hora?" - IDS_4133 "Os carimbos de data/hora de pai e criança não correspondem" + IDS_4132 "Isto pode significar que a imagem pai foi modificada depois da criação da imagem diferenciadora.\n\nTambém pode acontecer se os ficheiros da imagem foram movidos ou copiados ou por causa de um erro no programa que criou este disco.\n\nQuer corrigir os carimbos de data/hora?" + IDS_4133 "Os carimbos de data/hora dos discos pai e filho não correspondem!" IDS_4134 "Não foi possível corrigir o carimbo de data/hora do VHD." IDS_4135 "%01i:%02i" @@ -594,11 +594,11 @@ BEGIN IDS_5120 "CD-ROM %i (%s): %s" - IDS_5376 "Desactivado" + IDS_5376 "Desativado" IDS_5381 "ATAPI" IDS_5382 "SCSI" - IDS_5632 "Desactivado" + IDS_5632 "Desativado" IDS_5637 "ATAPI (%01i:%01i)" IDS_5638 "SCSI (%01i:%02i)" @@ -627,12 +627,12 @@ BEGIN IDS_5910 "5.25"" 1Gb M.O." IDS_5911 "5.25"" 1.3Gb M.O." - IDS_6144 "RPM perfecto" - IDS_6145 "RPM 1%% sob a perfecção" - IDS_6146 "RPM 1.5%% sob a perfecção" - IDS_6147 "RPM 2%% sob a perfecção" + IDS_6144 "RPM perfeito" + IDS_6145 "RPM 1%% abaixo do RPM perfeito" + IDS_6146 "RPM 1.5%% abaixo do RPM perfeito" + IDS_6147 "RPM 2%% abaixo do RPM perfeito" - IDS_7168 "(Padrão de sistema)" + IDS_7168 "(Padrão do sistema)" END #define IDS_LANG_ENUS IDS_7168 From 7d90bb7018cb93ff04c509f49cb855b8bba81f7d Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 15 Nov 2021 16:38:51 +0100 Subject: [PATCH 151/159] Fixed some highlights in the pt-PT translation. --- src/win/languages/pt-PT.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index b7e291621..8efc1aa29 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -51,7 +51,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Especificar dimensões...", IDM_VID_SPECIFY_DIM MENUITEM "&Forçar rácio de visualização 4:3", IDM_VID_FORCE43 - POPUP "&Factor de escala de janela" + POPUP "F&actor de escala de janela" BEGIN MENUITEM "&0.5x", IDM_VID_SCALE_1X MENUITEM "&1x", IDM_VID_SCALE_2X @@ -65,7 +65,7 @@ BEGIN END MENUITEM "Escala Hi&DPI", IDM_VID_HIDPI MENUITEM SEPARATOR - MENUITEM "&Ecrã cheio\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + MENUITEM "E&crã cheio\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN POPUP "Modo &de estiramento em ecrã cheio" BEGIN MENUITEM "&Estiramento em ecrã cheio", IDM_VID_FS_FULL From fb21dc842fd0f6110b0ea3e0fa0e8fa7fffdbbac Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 15 Nov 2021 16:42:16 +0100 Subject: [PATCH 152/159] Some slight reordering. --- src/win/86Box.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/win/86Box.rc b/src/win/86Box.rc index ffa88d48c..67de35bdc 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -361,9 +361,9 @@ END #include "languages/cs-CZ.rc" -#include "languages/de-DE.rc" +#include "languages/hr-HR.rc" #include "languages/en-US.rc" +#include "languages/de-DE.rc" #include "languages/hu-HU.rc" #include "languages/pt-BR.rc" #include "languages/pt-PT.rc" -#include "languages/hr-HR.rc" From 3c8183e631eaae8ad8c8c75a2d869fb09089306d Mon Sep 17 00:00:00 2001 From: dob205 Date: Mon, 15 Nov 2021 16:46:53 +0100 Subject: [PATCH 153/159] Fixes some missing Croatian translations --- src/win/languages/hr-HR.rc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 015e00da6..e71a3b10b 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -15,7 +15,7 @@ LANGUAGE LANG_CROATIAN, SUBLANG_DEFAULT MainMenu MENU DISCARDABLE BEGIN - POPUP "&Action" + POPUP "&Akcija" BEGIN MENUITEM "&Tipkovnica zahtijeva snimanje miša", IDM_ACTION_KBD_REQ_CAPTURE MENUITEM "&Desni CTRL je lijevi ALT", IDM_ACTION_RCTRL_IS_LALT @@ -29,7 +29,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Izlaz...", IDM_ACTION_EXIT END - POPUP "&View" + POPUP "&Pogled" BEGIN MENUITEM "&Sakrij statusnu traku", IDM_VID_HIDE_STATUS_BAR MENUITEM SEPARATOR @@ -95,7 +95,7 @@ BEGIN MENUITEM "CGA/PCjr/Tandy/E&GA/(S)VGA overscan", IDM_VID_OVERSCAN MENUITEM "Promjena kontrasta za &monokromatski ekran", IDM_VID_CGACON END - MENUITEM "&Media", IDM_MEDIA + MENUITEM "&Mediji", IDM_MEDIA POPUP "&Alati" BEGIN MENUITEM "&Postavke...", IDM_CONFIG @@ -153,7 +153,7 @@ BEGIN # endif END #endif - POPUP "&Help" + POPUP "&Pomoć" BEGIN MENUITEM "&Dokumentacija...", IDM_DOCS MENUITEM "&O 86Box...", IDM_ABOUT From 64fa8f8898c9d120138d22a99af925c1d59b7771 Mon Sep 17 00:00:00 2001 From: dob205 Date: Mon, 15 Nov 2021 17:50:40 +0100 Subject: [PATCH 154/159] Doing some updates to the German translation --- src/win/languages/de-DE.rc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 8621e70b5..ef737c2e3 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -69,7 +69,7 @@ BEGIN POPUP "&Stretching-Modus im Vollbildmodus" BEGIN MENUITEM "&Vollbild-Stretching", IDM_VID_FS_FULL - MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&4:3-Seitenverhältnis erzwingen", IDM_VID_FS_43 MENUITEM "&Quadratische Pixel (Seitenverhältnis beibehalten)", IDM_VID_FS_KEEPRATIO MENUITEM "&Integer-Skalierung", IDM_VID_FS_INT END @@ -328,7 +328,7 @@ END #define STR_SSI "Innovation SSI-2001" #define STR_CMS "CMS / Game Blaster" #define STR_GUS "Gravis Ultrasound" -#define STR_FLOAT "Use FLOAT32 sound" +#define STR_FLOAT "FLOAT32-Wiedergabe benutzen" #define STR_NET_TYPE "Netzwerktyp:" #define STR_PCAP "PCap-Gerät:" @@ -402,7 +402,7 @@ STRINGTABLE DISCARDABLE BEGIN 2048 "86Box" IDS_2049 "Fehler" - IDS_2050 "Kritischer Fehler" + IDS_2050 "Fataler Fehler" IDS_2051 "" IDS_2052 "Bitte Strg+Alt+Bild ab zur Rückkehr in den Fenstermodus drücken." IDS_2053 "Geschwindigkeit" @@ -520,8 +520,8 @@ BEGIN IDS_2136 "Nicht beenden" IDS_2137 "Resetten" IDS_2138 "Nicht Resetten" - IDS_2139 "MO-Images (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" - IDS_2140 "CD-ROM-Images (*.ISO;*.CUE)\0*.ISO;*.CUE\0Alle Dateien (*.*)\0*.*\0" + IDS_2139 "MO-Imagedateien (*.IM?;*.MDI)\0*.IM?;*.MDI\0Alle Dateien (*.*)\0*.*\0" + IDS_2140 "CD-ROM-Imagedateien (*.ISO;*.CUE)\0*.ISO;*.CUE\0Alle Dateien (*.*)\0*.*\0" IDS_2141 "%hs-Gerätekonfiguration" IDS_2142 "Monitor im Standby" IDS_2143 "OpenGL-Shader (*.GLSL)\0*.GLSL\0Alle Dateien (*.*)\0*.*\0" @@ -563,9 +563,9 @@ BEGIN IDS_4119 "Nicht unterstütztes Disk-Image" IDS_4120 "Überschreiben" IDS_4121 "Nicht überschreiben" - IDS_4122 "Rohdatenimage (.img)" - IDS_4123 "HDI-Image (.hdi)" - IDS_4124 "HDX-Image (.hdx)" + IDS_4122 "Rohdatenimagedateien (.img)" + IDS_4123 "HDI-Imagedateien (.hdi)" + IDS_4124 "HDX-Imagedateien (.hdx)" IDS_4125 "VHD mit fester Größe (.vhd)" IDS_4126 "VHD mit dynamischer Größe (.vhd)" IDS_4127 "Differenzierende VHD (.vhd)" From 47d742b65e76fceec30f184fbcffe3920f56f090 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 15 Nov 2021 23:58:12 +0100 Subject: [PATCH 155/159] Removed the last vestiges of IBM PS/2 model 70 type 4. --- src/machine/m_ps2_mca.c | 24 ------------------------ src/win/Makefile.mingw | 10 ---------- 2 files changed, 34 deletions(-) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index b1b611d94..db53f8047 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -1361,30 +1361,6 @@ machine_ps2_model_70_type3_init(const machine_t *model) } -#if defined(DEV_BRANCH) && defined(USE_PS2M70T4) -int -machine_ps2_model_70_type4_init(const machine_t *model) -{ - int ret; - - ret = bios_load_interleaved("roms/machines/ibmps2_m70_type4/70-b_even.bin", - "roms/machines/ibmps2_m70_type4/70-b_odd.bin", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) - return ret; - - machine_ps2_common_init(model); - - ps2.planar_id = 0xfcff; - - ps2_mca_board_model_70_type34_init(1, 4); - - return ret; -} -#endif - - int machine_ps2_model_80_init(const machine_t *model) { diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index d4022ee3a..9d3dab886 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -63,9 +63,6 @@ ifeq ($(DEV_BUILD), y) ifndef PAS16 PAS16 := n endif - ifndef PS2M70T4 - PS2M70T4 := y - endif ifndef SIO_DETECT SIO_DETECT := y endif @@ -124,9 +121,6 @@ else ifndef PAS16 PAS16 := n endif - ifndef PS2M70T4 - PS2M70T4 := n - endif ifndef SIO_DETECT SIO_DETECT := n endif @@ -524,10 +518,6 @@ OPTS += -DUSE_PAS16 DEVBROBJ += snd_pas16.o endif -ifeq ($(PS2M70T4), y) -OPTS += -DUSE_PS2M70T4 -endif - ifeq ($(SIO_DETECT), y) OPTS += -DUSE_SIO_DETECT DEVBROBJ += sio_detect.o From 98794cfe76d01c57bd955df3de52b9608e204923 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 16 Nov 2021 00:00:58 +0100 Subject: [PATCH 156/159] Removed vestiges of the Hedaka. --- src/machine/CMakeLists.txt | 4 ---- src/win/Makefile.mingw | 10 ---------- 2 files changed, 14 deletions(-) diff --git a/src/machine/CMakeLists.txt b/src/machine/CMakeLists.txt index c20d21a75..d2500561a 100644 --- a/src/machine/CMakeLists.txt +++ b/src/machine/CMakeLists.txt @@ -24,10 +24,6 @@ add_library(mch OBJECT machine.c machine_table.c m_xt.c m_xt_compaq.c m_at_sockets7.c m_at_socket8.c m_at_slot1.c m_at_slot2.c m_at_socket370.c m_at_misc.c) -if(HEDAKA) - target_compile_definitions(mch PRIVATE USE_HEDAKA) -endif() - if(LASERXT) target_sources(mch PRIVATE m_xt_laserxt.c) target_compile_definitions(mch PRIVATE USE_LASERXT) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 9d3dab886..eee3e63a4 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -42,9 +42,6 @@ ifeq ($(DEV_BUILD), y) ifndef GUSMAX GUSMAX := y endif - ifndef HEDAKA - HEDAKA := y - endif ifndef LASERXT LASERXT := y endif @@ -100,9 +97,6 @@ else ifndef GUSMAX GUSMAX := n endif - ifndef HEDAKA - HEDAKA := n - endif ifndef LASERXT LASERXT := n endif @@ -485,10 +479,6 @@ ifeq ($(GUSMAX), y) OPTS += -DUSE_GUSMAX endif -ifeq ($(HEDAKA), y) -OPTS += -DUSE_HEDAKA -endif - ifeq ($(LASERXT), y) OPTS += -DUSE_LASERXT DEVBROBJ += m_xt_laserxt.o From 5674fe188fa3ccf7d7a879f598e9ff9cb2588edb Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 16 Nov 2021 00:02:05 +0100 Subject: [PATCH 157/159] VECT486VL vestiges. --- src/win/Makefile.mingw | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index eee3e63a4..1dc7426f0 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -72,9 +72,6 @@ ifeq ($(DEV_BUILD), y) ifndef XL24 XL24 := y endif - ifndef VECT486VL - VECT486VL := y - endif ifndef OLIVETTI OLIVETTI := y endif @@ -127,9 +124,6 @@ else ifndef XL24 XL24 := n endif - ifndef VECT486VL - VECT486VL := n - endif ifndef OLIVETTI OLIVETTI := n endif From e41389b7f2ab23fb4ed5a9706530bf84ff64900f Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 16 Nov 2021 00:18:19 +0100 Subject: [PATCH 158/159] Italian translation by explorerexe. --- src/win/86Box.rc | 1 + src/win/languages/it-IT.rc | 988 +++++++++++++++++++++++++++++++++++++ 2 files changed, 989 insertions(+) create mode 100644 src/win/languages/it-IT.rc diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 67de35bdc..aa5048877 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -365,5 +365,6 @@ END #include "languages/en-US.rc" #include "languages/de-DE.rc" #include "languages/hu-HU.rc" +#include "languages/it-IT.rc" #include "languages/pt-BR.rc" #include "languages/pt-PT.rc" diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc new file mode 100644 index 000000000..5cb44e989 --- /dev/null +++ b/src/win/languages/it-IT.rc @@ -0,0 +1,988 @@ +//////////////////////////////////////////////////////////////////////////// +// Italian (IT-it) resources + +#ifdef _WIN32 +LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN +#pragma code_page(65001) +#endif //_WIN32 + +#define explorerdotexe + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Azione" + BEGIN + MENUITEM "&Tastiera richiede la cattura", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&CTRL destro è ALT sinistro", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Riavvia...", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Pausa", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "E&sci...", IDM_ACTION_EXIT + END + POPUP "&Visualizza" + BEGIN + MENUITEM "&Nascondi barra di stato", IDM_VID_HIDE_STATUS_BAR + MENUITEM SEPARATOR + MENUITEM "&Finestra ridimensionabile", IDM_VID_RESIZE + MENUITEM "R&icorda dimensioni e posizione", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "Re&nderer" + BEGIN + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL +#if defined(DEV_BRANCH) && defined(USE_OPENGL) + MENUITEM "Open&GL (3.3 Core)", IDM_VID_OPENGL_CORE +#endif +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "Specifica dimensioni...", IDM_VID_SPECIFY_DIM + MENUITEM "F&orza display 4:3", IDM_VID_FORCE43 + POPUP "&Fattore scalare della finestra" + BEGIN + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Metodo filtro" + BEGIN + MENUITEM "&Dal più vicino", IDM_VID_FILTER_NEAREST + MENUITEM "&Lineare", IDM_VID_FILTER_LINEAR + END + MENUITEM "Scala Hi&DPI", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Schermo intero\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Modalità adattamento &schermo intero" + BEGIN + MENUITEM "&Adatta a schermo intero", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Pixel quadrati (Mantiene l'aspetto)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Scala Integer", IDM_VID_FS_INT + END + POPUP "Impostazioni E&GA/(S)VGA" + BEGIN + MENUITEM "&Invertire monitor VGA", IDM_VID_INVERT + POPUP "Schermi VGA &" + BEGIN + MENUITEM "RGB &Color", IDM_VID_GRAY_RGB + MENUITEM "&RGB Monocroma", IDM_VID_GRAY_MONO + MENUITEM "&Monitor ambra", IDM_VID_GRAY_AMBER + MENUITEM "&Monitor verde", IDM_VID_GRAY_GREEN + MENUITEM "&Monitor bianco", IDM_VID_GRAY_WHITE + END + POPUP "Conversione &scala grigia" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&AMedia", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "Sovrascansione CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN + MENUITEM "Cambia il contrasto per &display monocromatici", IDM_VID_CGACON + END + MENUITEM "&Dispositivi", IDM_MEDIA + POPUP "&Strumenti" + BEGIN + MENUITEM "&Impostazioni...", IDM_CONFIG + MENUITEM "&Aggiorna icone della barra di stato", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "Cambia li&ngua...", IDM_VID_PROG_SETT +# ifdef USE_DISCORD + MENUITEM SEPARATOR + MENUITEM "Abilita &integrazione Discord", IDM_DISCORD +# endif + MENUITEM SEPARATOR + MENUITEM "Cattura schermata\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "Guadagno &suono...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Inizia traccia\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Ferma traccia\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Registra" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "Attiva registrazione da BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Attiva registrazione da CD-ROM\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Attiva registrazione del floppy (86F)\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Attiva registrazione del controller floppy\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "Attiva registrazione da IDE\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Attiva registrazione della porta seriale\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Attiva registrazione della rete\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Punto di interruzione del registro\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "Scarica &la RAM video\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Aiuto" + BEGIN + MENUITEM "&Documentazione...", IDM_DOCS + MENUITEM "&Informazioni su 86Box...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nuova immagine...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Immagine esistente...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Registra", IDM_CASSETTE_RECORD + MENUITEM "&Riproduci", IDM_CASSETTE_PLAY + MENUITEM "&Riavvolgi all'inizio", IDM_CASSETTE_REWIND + MENUITEM "&Velocizza alla fine", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "E&spelli", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Immagine...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "E&spelli", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nuova immagine...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Immagine esistente...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&sporta in 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "E&spelli", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Muto", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "E&spelli", IDM_CDROM_EMPTY + MENUITEM "&Ricarica l'immagine precedente", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Immagine", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nuova immagine...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Immagine esistente...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&spelli", IDM_ZIP_EJECT + MENUITEM "&Ricarica l'immagine precedente", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nuova immagine...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Immagine esistente...", IDM_MO_IMAGE_EXISTING + MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&spelli", IDM_MO_EJECT + MENUITEM "&Ricarica l'immagine precedente", IDM_MO_RELOAD + END +END + +#if defined(DEV_BRANCH) && defined(USE_OPENGL) +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "Imposta obiettivo &fotogrammi" + BEGIN + MENUITEM "&Sincronizza col video", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 FPS", IDM_VID_GL_FPS_25 + MENUITEM "&30 FPS", IDM_VID_GL_FPS_30 + MENUITEM "&50 FPS", IDM_VID_GL_FPS_50 + MENUITEM "&60 FPS", IDM_VID_GL_FPS_60 + MENUITEM "&75 FPS", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&Seleziona shader...", IDM_VID_GL_SHADER + MENUITEM "&Rimuovi shader", IDM_VID_GL_NOSHADER +END +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Cambia Lingua Display" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 + PUSHBUTTON "Cancella", IDCANCEL, 179, 65, 50, 14 + COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS + AUTOCHECKBOX "Salva queste impostazioni come &predefinite globali", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8 , WS_DISABLED + PUSHBUTTON "&Predefinito", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 + LTEXT "Lingua:", 0, 13, 8, 34, 8 +END + +DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Stato" +FONT 9, "Segoe UI" +BEGIN + LTEXT "1",IDT_SDEVICE,16,16,180,1000 + LTEXT "1",IDT_STEXT,16,186,180,1000 +END + +DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Guadagno del Suono" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,57,7,50,14 + PUSHBUTTON "Cancella",IDCANCEL,57,24,50,14 + CONTROL "Guadagno",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | + TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 + CTEXT "Guadagno",IDT_1746,10,7,32,9,SS_CENTERIMAGE +END + +DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Nuova Immagine" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,104,65,50,14 + PUSHBUTTON "Cancella",IDCANCEL,162,65,50,14 + LTEXT "Nome file:",IDT_1749,7,6,44,12,SS_CENTERIMAGE + LTEXT "Dimensioni disco:",IDT_1750,7,25,44,12,SS_CENTERIMAGE + LTEXT "Modalità RPM:",IDT_1751,7,45,44,12,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY + COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_CFILE,206,5,13,14 + LTEXT "Progresso:",IDT_1757,7,45,44,12,SS_CENTERIMAGE + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,53,45,166,14 +END + +DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Impostazioni 86Box" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,246,235,50,14 + PUSHBUTTON "Cancella",IDCANCEL,307,235,50,14 + CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 + CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 +END + +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Specifica dimensioni della finestra principale" +FONT 9, "Segoe UI" +BEGIN + LTEXT "Larghezza:",IDT_1709,7,9,24,12 + EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, + 12,12 + LTEXT "Altezza:",IDT_1710,97,9,24,12 + EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, + 12,12 + CONTROL "Blocca in questa dimensione",IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + DEFPUSHBUTTON "OK",IDOK,30,45,50,14 + PUSHBUTTON "Cancella",IDCANCEL,99,45,50,14 +END + +DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo di macchina:",IDT_1708,7,9,60,10 + COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Macchina:",IDT_1701,7,28,60,10 + PUSHBUTTON "Configura",IDC_CONFIGURE_MACHINE,214,26,46,12 + COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo del CPU:",IDT_1702,7,47,59,10 + COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Veloc.:",IDT_1704,189,47,24,10 + COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "FPU:",IDT_1707,7,66,59,10 + COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Stati di attesa :",IDT_1703,7,85,60,10 + EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, + 12,12 + LTEXT "MB",IDT_1705,123,104,10,10 + LTEXT "Memoria:",IDT_1706,7,104,30,10 + GROUPBOX "sincronizzazione del tempo",IDC_TIME_SYNC,7,135,100,56 + CONTROL "Disattiva",IDC_RADIO_TS_DISABLED,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 + CONTROL "Attiva (tempo locale)", IDC_RADIO_TS_LOCAL,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 + CONTROL "Attiva (UTC)", IDC_RADIO_TS_UTC,"Button", + BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 +#ifdef USE_DYNAREC + CONTROL "Ricompilatore dinamico",IDC_CHECK_DYNAREC,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 +#endif +END + +DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Video:",IDT_1707,7,9,48,10 + COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_VID,222,7,38,12 + CONTROL "Grafica Voodoo",IDC_CHECK_VOODOO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 + PUSHBUTTON "Configura",IDC_BUTTON_VOODOO,222,26,38,12 +END + +DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Mouse:",IDT_1709,7,9,57,10 + COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_MOUSE,214,7,46,12 + LTEXT "Joystick:",IDT_1710,7,27,58,10 + COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 + PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 + PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 + PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 +END + +DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Scheda audio:",IDT_1711,7,9,59,10 + PUSHBUTTON "Configura",IDC_CONFIGURE_SND,214,7,46,12 + + COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Dispositivo uscita MIDI:",IDT_1712,7,28,59,10 + PUSHBUTTON "Configura",IDC_CONFIGURE_MIDI,214,26,46,12 + + COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "Dispositivo entrata MIDI:",IDT_1713,7,47,59,10 + PUSHBUTTON "Configura",IDC_CONFIGURE_MIDI_IN,214,45,46,12 + + CONTROL "MPU-401 autonomo",IDC_CHECK_MPU401,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Configura",IDC_CONFIGURE_MPU401,214,64,46,12 + + CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_SSI,214,82,46,12 + + CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_CMS,214,100,46,12 + + CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 + PUSHBUTTON "Configure",IDC_CONFIGURE_GUS,214,118,46,12 + + CONTROL "Usare suono FLOAT32",IDC_CHECK_FLOAT,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 +END + +DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Tipo di Rete:",IDT_1714,7,9,59,10 + COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "Dispositivo PCap:",IDT_1715,7,28,59,10 + COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + + LTEXT "Scheda di rete:",IDT_1716,7,47,59,10 + COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "Configure",IDC_CONFIGURE_NET,214,44,46,12 +END + +DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Dispositivo LPT1:",IDT_1717,7,9,61,10 + COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "Dispositivo LPT2:",IDT_1718,7,28,61,10 + COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + LTEXT "Dispositivo LPT3:",IDT_1719,7,47,61,10 + COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + + CONTROL "Porta seriale 1",IDC_CHECK_SERIAL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 + CONTROL "Porta seriale 2",IDC_CHECK_SERIAL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 + CONTROL "Porta seriale 3",IDC_CHECK_SERIAL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 + CONTROL "Porta seriale 4",IDC_CHECK_SERIAL4,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 + + CONTROL "Porta parallela 1",IDC_CHECK_PARALLEL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 + CONTROL "Porta parallela 2",IDC_CHECK_PARALLEL2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 + CONTROL "Porta parallela 3",IDC_CHECK_PARALLEL3,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 +END + +DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "Controllore HDD:",IDT_1718,7,9,64,10 + COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_HDC,222,7,38,12 + + LTEXT "Controllore FD:",IDT_1768,7,28,64,10 + COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_FDC,222,26,38,12 + + CONTROL "Controllore IDE terziario",IDC_CHECK_IDE_TER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 + PUSHBUTTON "Configura",IDC_BUTTON_IDE_TER,222,45,38,12 + + CONTROL "Controllore IDE quaternario",IDC_CHECK_IDE_QUA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 + PUSHBUTTON "Configura",IDC_BUTTON_IDE_QUA,222,64,38,12 + + GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 + LTEXT "Controllore 1:",IDT_1763,16,102,48,10 + COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_1,213,100,38,12 + LTEXT "Controllore 2:",IDT_1764,16,121,48,10 + COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_2,213,119,38,12 + LTEXT "Controllore 3:",IDT_1765,16,140,48,10 + COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_3,213,138,38,12 + LTEXT "Controllore 4:",IDT_1766,16,159,48,10 + COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_4,213,157,38,12 + + CONTROL "Cassetta",IDC_CHECK_CASSETTE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 +END + +DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,92 + LTEXT "Disco rigido:",IDT_1720,7,7,253,8 + PUSHBUTTON "&Nuovo...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 + PUSHBUTTON "&Esistente...",IDC_BUTTON_HDD_ADD,129,137,62,10 + PUSHBUTTON "&Rimuovi",IDC_BUTTON_HDD_REMOVE,198,137,62,10 + COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1721,7,119,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canale:",IDT_1722,131,119,38,8 + COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,131,119,38,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP +END + +DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Aggiungi disco rigido" +FONT 9, "Segoe UI" +BEGIN + DEFPUSHBUTTON "OK",IDOK,55,127,50,14 + PUSHBUTTON "Cancella",IDCANCEL,112,127,50,14 + EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 + PUSHBUTTON "&Specifica...",IDC_CFILE,167,16,44,12 + EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 + EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 + EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 + EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 + COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Settori:",IDT_1726,154,35,27,10 + LTEXT "Teste:",IDT_1727,81,35,29,8 + LTEXT "Cilindri:",IDT_1728,7,35,32,12 + LTEXT "Dimensioni (MB):",IDT_1729,7,54,33,8 + LTEXT "Tipo:",IDT_1730,86,54,24,8 + LTEXT "Nome file:",IDT_1731,7,7,204,9 + COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1721,7,73,24,8 + COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canale:",IDT_1722,99,73,34,8 + COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1723,99,73,34,8 + COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Formato Immag.:",IDT_1774,7,92,50,12 + COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Dimensioni blocchi:",IDT_1775,7,111,50,12 + COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Progresso:",IDT_1752,7,7,204,9 + CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,7,16,204,12 +END + +DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", + LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,18,253,60 + LTEXT "Unità floppy:",IDT_1737,7,7,253,8 + COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo:",IDT_1738,7,87,24,8 + CONTROL "Turbo",IDC_CHECKTURBO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 + CONTROL "Verifica BPB",IDC_CHECKBPB,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 + + CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,117,253,60 + LTEXT "Unità CD-ROM:",IDT_1739,7,107,253,8 + COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1740,7,187,24,8 + COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1741,131,187,38,8 + COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canale:",IDT_1742,131,187,38,8 + COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Velocità:",IDT_1758,7,207,24,8 +END + +DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + + CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,17,253,60 + LTEXT "Unità MO:",IDT_1769,7,7,253,8 + COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1770,7,87,24,8 + COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1771,131,87,38,8 + COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canale:",IDT_1772,131,87,38,8 + COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Tipo:",IDT_1773,7,107,24,8 + + CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | + WS_TABSTOP,7,137,253,60 + LTEXT "Unità ZIP:",IDT_1759,7,127,253,8 + COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Bus:",IDT_1753,7,207,14,8 + COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "ID:",IDT_1754,120,207,28,8 + COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + LTEXT "Canale:",IDT_1755,120,207,28,8 + CONTROL "ZIP 250",IDC_CHECK250,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 +END + +DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 +STYLE DS_CONTROL | WS_CHILD +FONT 9, "Segoe UI" +BEGIN + LTEXT "ISA RTC:",IDT_1767,7,9,48,10 + COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_ISARTC,222,7,38,12 + + GROUPBOX "Espansione memoria ISA",IDC_GROUP_ISAMEM,7,28,253,93 + LTEXT "Scheda 1:",IDT_1763,16,45,48,10 + COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 + LTEXT "Scheda 2:",IDT_1764,16,64,48,10 + COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 + LTEXT "Scheda 3:",IDT_1765,16,83,48,10 + COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 + LTEXT "Scheda 4:",IDT_1766,16,102,48,10 + COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 + + CONTROL "Dispositivo ISABugger",IDC_CHECK_BUGGER,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 + + CONTROL "Scheda POST",IDC_CHECK_POSTCARD,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 +END + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Errore" + IDS_2050 "Errore fatale" + IDS_2051 "" + IDS_2052 "Usa CTRL+ALT+PAGE DOWN per tornare alla modalità finestra." + IDS_2053 "Velocità" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Immagini ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box non può trovare immagini ROM utilizzabili.\n\nPlease download a ROM set and extract it into the ""roms"" directory." + IDS_2057 "(empty)" + IDS_2058 "Immagini ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Tutti i file (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Acceso" + IDS_2061 "Spento" + IDS_2062 "Tutte le immagini (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Immagini di settori base (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Immagini di superfice (*.86F)\0*.86F\0" + IDS_2063 "La macchina ""%hs"" non è disponibile a causa di immagini ROM mancanti nel percorso roms/machines. Cambiando ad una macchina disponibile." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "La scheda video ""%hs"" non è disponibile a causa di immagini ROM mancanti nel percorso roms/video. Cambiando ad una scheda video disponibile." + IDS_2065 "Macchina" + IDS_2066 "Schermo" + IDS_2067 "Dispositivi di input" + IDS_2068 "Audio" + IDS_2069 "Rete" + IDS_2070 "Porte (COM & LPT)" + IDS_2071 "Controllori di memor." + IDS_2072 "Dischi rigidi" + IDS_2073 "Unitaà CD-ROM e Floppy" + IDS_2074 "Altri dispositivi rimuov." + IDS_2075 "Altre periferiche" + IDS_2076 "Immagini di superfice (*.86F)\0*.86F\0" + IDS_2077 "Clicca per catturare mouse" + IDS_2078 "Premi F8+F12 per liberare il mouse" + IDS_2079 "Premi F8+F12 o pulsante centrale per liberare il mouse" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Impossibile inizializzare FluidSynth" + IDS_2081 "Bus" + IDS_2082 "File" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "Verifica BPB" + IDS_2088 "KB" + IDS_2089 "Impossibile inizializzare il renderer video." + IDS_2090 "Predefinito" + IDS_2091 "%i Stati d'attesa" + IDS_2092 "Tipo" + IDS_2093 "Impossibile impostare PCap" + IDS_2094 "Nessun dispositivo PCap trovato" + IDS_2095 "Dispositivo PCap invalido" + IDS_2096 "Joystick comune da 2 pulsanti" + IDS_2097 "Joystick comune da 4 pulsanti" + IDS_2098 "Joystick comune da 6 pulsanti" + IDS_2099 "Joystick comune da 8 pulsanti" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Niente" + IDS_2104 "Impossibile caricare gli acceleratori da tastiera." + IDS_2105 "Impossibile registrare input raw." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Floppy %i (%s): %ls" + IDS_2109 "Tutte le immagini (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Immagini da settori avanzati (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagini da settori basilari (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Immagini flusso (*.FDI)\0*.FDI\0Immagini da superfice (*.86F;*.MFM)\0*.86F;*.MFM\0Tutti i file (*.*)\0*.*\0" + IDS_2110 "Impossibile inizializzare FreeType" + IDS_2111 "Impossibile inizializzare SDL, SDL2.dll è necessario" + IDS_2112 "Sei sicuro di voler riavviare la macchina emulata?" + IDS_2113 "Sei sicuro di voler uscire da 86Box?" + IDS_2114 "Impossibile inizializzare Ghostscript" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "Immagini MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tutti i file (*.*)\0*.*\0" + IDS_2117 "Benvenuti in 86Box!" + IDS_2118 "Controllore interno" + IDS_2119 "Esci" + IDS_2120 "Nessune immagini ROM trovate" + IDS_2121 "Vuoi salvare queste impostazioni?" + IDS_2122 "Questo riavviera la macchina emulata." + IDS_2123 "Salva" + IDS_2124 "Informazioni su 86Box" + IDS_2125 "86Box v" EMU_VERSION + + IDS_2126 "Un emulatore di computer vecchi\n\nAutori: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nTradotto da: explorerdotexe\n\nRilasciato sotto la Licenza Pubblica GNU versione 2 o dopo. Vedi LICENSE per maggior informazioni." + IDS_2127 "OK" + IDS_2128 "Hardware non disponibile" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Controlla se " LIB_NAME_PCAP " è installato e che tu sia connesso ad una connessione " LIB_NAME_PCAP " compatibile." + IDS_2130 "Configurazione invalida" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " è richesto per l'emuazione di stampanti ESC/P." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " è richiesto per la conversione automatica di file PostScript a file PDF.\n\nQualsiasi documento mandato alla stampante generica PostScript sarà salvato come file PostScript. (.ps)" +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " è richiesto per l'output FluidSynth MIDI." + IDS_2134 "Entrando modalità schermo intero" + IDS_2135 "Non mostrare più questo messaggio" + IDS_2136 "Non uscire" + IDS_2137 "Riavvia" + IDS_2138 "Non riavviare" + IDS_2139 "Immagini MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tutti i file (*.*)\0*.*\0" + IDS_2140 "Immagini CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0Tutti i file (*.*)\0*.*\0" + IDS_2141 "Configurazione del dispositivo %hs" + IDS_2142 "Monitor in modalità riposo" + IDS_2143 "Shader OpenGL (*.GLSL)\0*.GLSL\0Tutti i file (*.*)\0*.*\0" + IDS_2144 "Impostazioni OpenGL" + IDS_2145 "Stai caricando una configurazione non supportata" + IDS_2146 "Il filtraggio della tipologia di CPU è disabilitato per la macchina selezionata.\n\nQuesto lo rende possibile scegliere un CPU che è altrimenti incompatibile con la macchina selezionata. Tuttavia, portresti incorrere in incompatibilità con il BIOS della macchina o altri programmi. \n\nL'abilitare di questa impostazione non è ufficialmente supportato e tutte le segnalazioni di errori saranno considerate invalide." + IDS_2147 "Continua" + IDS_2148 "Cassetta: %s" + IDS_2149 "Immagini cassetta (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tutti i file (*.*)\0*.*\0" + IDS_2150 "Cartuccia %i: %ls" + IDS_2151 "Immagini cartuccia (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tutti i file (*.*)\0*.*\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Disco rigido (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "Le unità CD-ROM per MFM/RLL o ESDI non sono mai esistite." + IDS_4100 "Personalizzata..." + IDS_4101 "Personalizzata (grande)..." + IDS_4102 "Aggiungi un nuovo disco rigido" + IDS_4103 "Aggiungi un disco rigido esistente" + IDS_4104 "Le immagini HDI non possono essere più grandi di 4 GB." + IDS_4105 "Le immmagini disco non possono essere più grandi di 127 GB." + IDS_4106 "Immagini disco rigido (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Tutti i file (*.*)\0*.*\0" + IDS_4107 "Impossibile leggere il file" + IDS_4108 "Impossibile scrivere al file" + IDS_4109 "Le immagini HDI o HDX con settori di dimensioni diverse da 512 non sono supportati." + IDS_4110 "USB non è ancora supportato" + IDS_4111 "Immagine disco già esiste" + IDS_4112 "Specifica un nome file valido." + IDS_4113 "Immagine disco creata" + IDS_4114 "Controlla che il file esiste e che sia leggibile." + IDS_4115 "Controlla che il file viene salvato ad un percorso con diritti di scrittura" + IDS_4116 "Immagine disco troppo grande" + IDS_4117 "Ricordati di partizionare e formattare il disco appena creato." + IDS_4118 "Il file selezionato sarà sovrascritto, sei sicuro di volerlo usare?" + IDS_4119 "Immagine disco non supportata" + IDS_4120 "Sovrascrivi" + IDS_4121 "Non sovrascrivere" + IDS_4122 "Immagine raw (.img)" + IDS_4123 "Immagine HDI (.hdi)" + IDS_4124 "Immagine HDX (.hdx)" + IDS_4125 "VHD di dimensioni fisse (.vhd)" + IDS_4126 "VHD di dimensioni dinamiche (.vhd)" + IDS_4127 "VHD di differenziazione (.vhd)" + IDS_4128 "Blocchi larghi (2 MB)" + IDS_4129 "Blocchi piccoli (512 KB)" + IDS_4130 "File VHD (*.VHD)\0*.VHD\0Tutti i file (*.*)\0*.*\0" + IDS_4131 "Seleziona il VHD padre." + IDS_4132 "Questo potrebbe significare che l'immagine padre sia stata modificata dopo la creazione dell'immagine di differenziazione.\n\nPuò anche succedere se i file immagini sono stati spostati o copiati, o da un errore nel programma che ha creato questo disco.\n\nVuoi aggiustare le marcature di tempo?" + IDS_4133 "Le marcature di tempo padre e figlio non corrispondono" + IDS_4134 "Impossibile aggiustare marcature di tempo VHD." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Disabilitato" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Disabilitato" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1.2 MB" + IDS_5895 "1.25 MB" + IDS_5896 "1.44 MB" + IDS_5897 "DMF (cluster 1024)" + IDS_5898 "DMF (cluster 2048)" + IDS_5899 "2.88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3.5"" 1.3Gb M.O. (GigaMO)" + IDS_5907 "3.5"" 2.3Gb M.O. (GigaMO 2)" + IDS_5908 "5.25"" 600Mb M.O." + IDS_5909 "5.25"" 650Mb M.O." + IDS_5910 "5.25"" 1Gb M.O." + IDS_5911 "5.25"" 1.3Gb M.O." + + IDS_6144 "RPM Perfette" + IDS_6145 "RPM 1%% sotto perfezione" + IDS_6146 "RPM 1.5%% sotto perfezione" + IDS_6147 "RPM 2%% sotto perfezione" + + IDS_7168 "(Predefinito del sistema)" +END +#define IDS_LANG_ENUS IDS_7168 + +// Italian (IT-it) resources +///////////////////////////////////////////////////////////////////////////// From b24f54b922d197a84a6ffaebac80df6c8b17f813 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 16 Nov 2021 00:57:04 +0100 Subject: [PATCH 159/159] Fixed to the Italian translation and ported its dialogs to the common format. --- src/win/languages/it-IT.rc | 634 +++++++++---------------------------- 1 file changed, 143 insertions(+), 491 deletions(-) diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 5cb44e989..b988a40c5 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -70,8 +70,8 @@ BEGIN BEGIN MENUITEM "&Adatta a schermo intero", IDM_VID_FS_FULL MENUITEM "&4:3", IDM_VID_FS_43 - MENUITEM "&Pixel quadrati (Mantiene l'aspetto)", IDM_VID_FS_KEEPRATIO - MENUITEM "&Scala Integer", IDM_VID_FS_INT + MENUITEM "&Pixel quadrati (mantiene l'aspetto)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Scala intera", IDM_VID_FS_INT END POPUP "Impostazioni E&GA/(S)VGA" BEGIN @@ -120,10 +120,10 @@ BEGIN POPUP "&Registra" BEGIN # ifdef ENABLE_BUSLOGIC_LOG - MENUITEM "Attiva registrazione da BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC + MENUITEM "Attiva registrazione di BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC # endif # ifdef ENABLE_CDROM_LOG - MENUITEM "Attiva registrazione da CD-ROM\tCtrl+F5", IDM_LOG_CDROM + MENUITEM "Attiva registrazione del CD-ROM\tCtrl+F5", IDM_LOG_CDROM # endif # ifdef ENABLE_D86F_LOG MENUITEM "Attiva registrazione del floppy (86F)\tCtrl+F6", IDM_LOG_D86F @@ -132,7 +132,7 @@ BEGIN MENUITEM "Attiva registrazione del controller floppy\tCtrl+F7", IDM_LOG_FDC # endif # ifdef ENABLE_IDE_LOG - MENUITEM "Attiva registrazione da IDE\tCtrl+F8", IDM_LOG_IDE + MENUITEM "Attiva registrazione di IDE\tCtrl+F8", IDM_LOG_IDE # endif # ifdef ENABLE_SERIAL_LOG MENUITEM "Attiva registrazione della porta seriale\tCtrl+F3", IDM_LOG_SERIAL @@ -172,14 +172,14 @@ BEGIN MENUITEM "&Nuova immagine...", IDM_CASSETTE_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "&Immagine esistente...", IDM_CASSETTE_IMAGE_EXISTING - MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR MENUITEM "&Registra", IDM_CASSETTE_RECORD - MENUITEM "&Riproduci", IDM_CASSETTE_PLAY - MENUITEM "&Riavvolgi all'inizio", IDM_CASSETTE_REWIND - MENUITEM "&Velocizza alla fine", IDM_CASSETTE_FAST_FORWARD + MENUITEM "R&iproduci", IDM_CASSETTE_PLAY + MENUITEM "Ri&avvolgi all'inizio", IDM_CASSETTE_REWIND + MENUITEM "A&vanti veloce alla fine", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR - MENUITEM "E&spelli", IDM_CASSETTE_EJECT + MENUITEM "&Espelli", IDM_CASSETTE_EJECT END END @@ -189,7 +189,7 @@ BEGIN BEGIN MENUITEM "&Immagine...", IDM_CARTRIDGE_IMAGE MENUITEM SEPARATOR - MENUITEM "E&spelli", IDM_CARTRIDGE_EJECT + MENUITEM "&Espelli", IDM_CARTRIDGE_EJECT END END @@ -200,11 +200,11 @@ BEGIN MENUITEM "&Nuova immagine...", IDM_FLOPPY_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "&Immagine esistente...", IDM_FLOPPY_IMAGE_EXISTING - MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_FLOPPY_IMAGE_EXISTING_WP MENUITEM SEPARATOR MENUITEM "E&sporta in 86F...", IDM_FLOPPY_EXPORT_TO_86F MENUITEM SEPARATOR - MENUITEM "E&spelli", IDM_FLOPPY_EJECT + MENUITEM "&Espelli", IDM_FLOPPY_EJECT END END @@ -214,7 +214,7 @@ BEGIN BEGIN MENUITEM "&Muto", IDM_CDROM_MUTE MENUITEM SEPARATOR - MENUITEM "E&spelli", IDM_CDROM_EMPTY + MENUITEM "&Espelli", IDM_CDROM_EMPTY MENUITEM "&Ricarica l'immagine precedente", IDM_CDROM_RELOAD MENUITEM SEPARATOR MENUITEM "&Immagine", IDM_CDROM_IMAGE @@ -228,9 +228,9 @@ BEGIN MENUITEM "&Nuova immagine...", IDM_ZIP_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "&Immagine esistente...", IDM_ZIP_IMAGE_EXISTING - MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_ZIP_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&spelli", IDM_ZIP_EJECT + MENUITEM "&Espelli", IDM_ZIP_EJECT MENUITEM "&Ricarica l'immagine precedente", IDM_ZIP_RELOAD END END @@ -242,9 +242,9 @@ BEGIN MENUITEM "&Nuova immagine...", IDM_MO_IMAGE_NEW MENUITEM SEPARATOR MENUITEM "&Immagine esistente...", IDM_MO_IMAGE_EXISTING - MENUITEM "Immagine esistente (&Protezione scrittura)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM "Immagine esistente (&protezione contro scrittura)...", IDM_MO_IMAGE_EXISTING_WP MENUITEM SEPARATOR - MENUITEM "E&spelli", IDM_MO_EJECT + MENUITEM "&Espelli", IDM_MO_EJECT MENUITEM "&Ricarica l'immagine precedente", IDM_MO_RELOAD END END @@ -273,473 +273,125 @@ END // Dialog // -DLG_PROG_SETT DIALOG DISCARDABLE 0, 0, 240, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Cambia Lingua Display" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK", IDOK, 123, 65, 50, 14 - PUSHBUTTON "Cancella", IDCANCEL, 179, 65, 50, 14 - COMBOBOX IDC_COMBO_LANG, 13, 18, 213, 22, CBS_DROPDOWNLIST | CBS_HASSTRINGS - AUTOCHECKBOX "Salva queste impostazioni come &predefinite globali", IDC_CHECKBOX_GLOBAL, 13, 50, 217, 8 , WS_DISABLED - PUSHBUTTON "&Predefinito", IDC_BUTTON_DEFAULT, 162, 32, 60, 14 - LTEXT "Lingua:", 0, 13, 8, 34, 8 -END +#define STR_PROG_SETT "Cambia lingua dell'interfaccia" +#define STR_SND_GAIN "Guadagno del suono" +#define STR_NEW_FLOPPY "Nuova immagine" +#define STR_CONFIG "Impostazioni di 86Box" +#define STR_SPECIFY_DIM "Specifica dimensioni della finestra principale" -DLG_STATUS DIALOG DISCARDABLE 0, 0, 186, 386 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Stato" -FONT 9, "Segoe UI" -BEGIN - LTEXT "1",IDT_SDEVICE,16,16,180,1000 - LTEXT "1",IDT_STEXT,16,186,180,1000 -END +#define STR_OK "OK" +#define STR_CANCEL "Annulla" +#define STR_GLOBAL "Salva queste impostazioni come &predefinite globali" +#define STR_DEFAULT "&Predefinito" +#define STR_LANGUAGE "Lingua:" -DLG_SND_GAIN DIALOG DISCARDABLE 0, 0, 113, 136 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Guadagno del Suono" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,57,7,50,14 - PUSHBUTTON "Cancella",IDCANCEL,57,24,50,14 - CONTROL "Guadagno",IDC_SLIDER_GAIN,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_AUTOTICKS | WS_TABSTOP,15,20,20,109 - CTEXT "Guadagno",IDT_1746,10,7,32,9,SS_CENTERIMAGE -END +#define STR_GAIN "Guadagno" -DLG_NEW_FLOPPY DIALOG DISCARDABLE 0, 0, 226, 86 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Nuova Immagine" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,104,65,50,14 - PUSHBUTTON "Cancella",IDCANCEL,162,65,50,14 - LTEXT "Nome file:",IDT_1749,7,6,44,12,SS_CENTERIMAGE - LTEXT "Dimensioni disco:",IDT_1750,7,25,44,12,SS_CENTERIMAGE - LTEXT "Modalità RPM:",IDT_1751,7,45,44,12,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_FILE_NAME,53,5,150,14,ES_AUTOHSCROLL | ES_READONLY - COMBOBOX IDC_COMBO_DISK_SIZE,53,25,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_COMBO_RPM_MODE,53,45,166,14,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "...",IDC_CFILE,206,5,13,14 - LTEXT "Progresso:",IDT_1757,7,45,44,12,SS_CENTERIMAGE - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,53,45,166,14 -END +#define STR_FILE_NAME "Nome file:" +#define STR_DISK_SIZE "Dimensioni disco:" +#define STR_RPM_MODE "Modalità RPM:" +#define STR_PROGRESS "Progresso:" -DLG_CONFIG DIALOG DISCARDABLE 0, 0, 376, 256 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Impostazioni 86Box" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,246,235,50,14 - PUSHBUTTON "Cancella",IDCANCEL,307,235,50,14 - CONTROL "List2",IDC_SETTINGSCATLIST,"SysListView32",LVS_REPORT | LVS_NOCOLUMNHEADER | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,100,212 - CONTROL "",-1,"Static",SS_BLACKFRAME | SS_SUNKEN,1,226,373,1 -END +#define STR_WIDTH "Larghezza:" +#define STR_HEIGHT "Altezza:" +#define STR_LOCK_TO_SIZE "Blocca in queste dimensioni" -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Specifica dimensioni della finestra principale" -FONT 9, "Segoe UI" -BEGIN - LTEXT "Larghezza:",IDT_1709,7,9,24,12 - EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, - 12,12 - LTEXT "Altezza:",IDT_1710,97,9,24,12 - EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, - 12,12 - CONTROL "Blocca in questa dimensione",IDC_CHECK_LOCK_SIZE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 - DEFPUSHBUTTON "OK",IDOK,30,45,50,14 - PUSHBUTTON "Cancella",IDCANCEL,99,45,50,14 -END +#define STR_MACHINE_TYPE "Tipo di macchina:" +#define STR_MACHINE "Macchina:" +#define STR_CONFIGURE "Configura" +#define STR_CPU_TYPE "Tipo del CPU:" +#define STR_SPEED "Veloc.:" +#define STR_FPU "FPU:" +#define STR_WAIT_STATES "Stati di attesa:" +#define STR_MB "MB" +#define STR_MEMORY "Memoria:" +#define STR_TIME_SYNC "Sincronizzazione dell'ora" +#define STR_DISABLED "Disabilitata" +#define STR_ENABLED_LOCAL "Abilitata (ora locale)" +#define STR_ENABLED_UTC "Abilitata (UTC)" +#define STR_DYNAREC "Ricompilatore dinamico" -DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_MACHINE_TYPE,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo di macchina:",IDT_1708,7,9,60,10 - COMBOBOX IDC_COMBO_MACHINE,71,26,138,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Macchina:",IDT_1701,7,28,60,10 - PUSHBUTTON "Configura",IDC_CONFIGURE_MACHINE,214,26,46,12 - COMBOBOX IDC_COMBO_CPU_TYPE,71,45,110,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo del CPU:",IDT_1702,7,47,59,10 - COMBOBOX IDC_COMBO_CPU,215,45,45,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Veloc.:",IDT_1704,189,47,24,10 - COMBOBOX IDC_COMBO_FPU,71,64,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "FPU:",IDT_1707,7,66,59,10 - COMBOBOX IDC_COMBO_WS,71,83,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Stati di attesa :",IDT_1703,7,85,60,10 - EDITTEXT IDC_MEMTEXT,70,102,45,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_MEMSPIN,"msctls_updown32",UDS_SETBUDDYINT | - UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,113,101, - 12,12 - LTEXT "MB",IDT_1705,123,104,10,10 - LTEXT "Memoria:",IDT_1706,7,104,30,10 - GROUPBOX "sincronizzazione del tempo",IDC_TIME_SYNC,7,135,100,56 - CONTROL "Disattiva",IDC_RADIO_TS_DISABLED,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,147,84,10 - CONTROL "Attiva (tempo locale)", IDC_RADIO_TS_LOCAL,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,161,84,10 - CONTROL "Attiva (UTC)", IDC_RADIO_TS_UTC,"Button", - BS_AUTORADIOBUTTON | WS_TABSTOP,14,175,84,10 -#ifdef USE_DYNAREC - CONTROL "Ricompilatore dinamico",IDC_CHECK_DYNAREC,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 -#endif -END +#define STR_VIDEO "Video:" +#define STR_VOODOO "Grafica Voodoo" -DLG_CFG_VIDEO DIALOG DISCARDABLE 107, 0, 267, 45 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Video:",IDT_1707,7,9,48,10 - COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_VID,222,7,38,12 - CONTROL "Grafica Voodoo",IDC_CHECK_VOODOO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10 - PUSHBUTTON "Configura",IDC_BUTTON_VOODOO,222,26,38,12 -END +#define STR_MOUSE "Mouse:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." -DLG_CFG_INPUT DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Mouse:",IDT_1709,7,9,57,10 - COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_MOUSE,214,7,46,12 - LTEXT "Joystick:",IDT_1710,7,27,58,10 - COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 - PUSHBUTTON "Joystick 2...",IDC_JOY2,74,44,50,14 - PUSHBUTTON "Joystick 3...",IDC_JOY3,141,44,50,14 - PUSHBUTTON "Joystick 4...",IDC_JOY4,209,44,50,14 -END +#define STR_SOUND "Scheda audio:" +#define STR_MIDI "Uscita MIDI:" +#define STR_MIDI_IN "Entrata MIDI:" +#define STR_MPU401 "MPU-401 autonomo" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Usa suono FLOAT32" -DLG_CFG_SOUND DIALOG DISCARDABLE 107, 0, 267, 201 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - COMBOBOX IDC_COMBO_SOUND,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Scheda audio:",IDT_1711,7,9,59,10 - PUSHBUTTON "Configura",IDC_CONFIGURE_SND,214,7,46,12 +#define STR_NET_TYPE "Tipo di rete:" +#define STR_PCAP "Dispositivo PCap:" +#define STR_NET "Scheda di rete:" - COMBOBOX IDC_COMBO_MIDI,71,26,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Dispositivo uscita MIDI:",IDT_1712,7,28,59,10 - PUSHBUTTON "Configura",IDC_CONFIGURE_MIDI,214,26,46,12 +#define STR_LPT1 "Dispositivo LPT1:" +#define STR_LPT2 "Dispositivo LPT2:" +#define STR_LPT3 "Dispositivo LPT3:" +#define STR_SERIAL1 "Porta seriale 1" +#define STR_SERIAL2 "Porta seriale 2" +#define STR_SERIAL3 "Porta seriale 3" +#define STR_SERIAL4 "Porta seriale 4" +#define STR_PARALLEL1 "Porta parallela 1" +#define STR_PARALLEL2 "Porta parallela 2" +#define STR_PARALLEL3 "Porta parallela 3" - COMBOBOX IDC_COMBO_MIDI_IN,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - LTEXT "Dispositivo entrata MIDI:",IDT_1713,7,47,59,10 - PUSHBUTTON "Configura",IDC_CONFIGURE_MIDI_IN,214,45,46,12 +#define STR_HDC "Controller HD:" +#define STR_FDC "Controller FD:" +#define STR_IDE_TER "Controller IDE terziario" +#define STR_IDE_QUA "Controller IDE quaternario" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Controller 1:" +#define STR_SCSI_2 "Controller 2:" +#define STR_SCSI_3 "Controller 3:" +#define STR_SCSI_4 "Controller 4:" +#define STR_CASSETTE "Cassetta" - CONTROL "MPU-401 autonomo",IDC_CHECK_MPU401,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configura",IDC_CONFIGURE_MPU401,214,64,46,12 +#define STR_HDD "Hard disk:" +#define STR_NEW "&Nuovo..." +#define STR_EXISTING "&Esistente..." +#define STR_REMOVE "&Rimouvi" +#define STR_BUS "Bus:" +#define STR_CHANNEL "Canale:" +#define STR_ID "ID:" - CONTROL "Innovation SSI-2001",IDC_CHECK_SSI,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,84,95,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_SSI,214,82,46,12 +#define STR_SPECIFY "&Specifica..." +#define STR_SECTORS "Settori:" +#define STR_HEADS "Testine:" +#define STR_CYLS "Cilindri:" +#define STR_SIZE_MB "Dimensioni (MB):" +#define STR_TYPE "Tipo:" +#define STR_IMG_FORMAT "Formato immagine:" +#define STR_BLOCK_SIZE "Dimensioni blocco:" - CONTROL "CMS / Game Blaster",IDC_CHECK_CMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,102,95,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_CMS,214,100,46,12 +#define STR_FLOPPY_DRIVES "Unità floppy:" +#define STR_TURBO "Turbo" +#define STR_CHECKBPB "Verifica BPB" +#define STR_CDROM_DRIVES "Unità CD-ROM:" - CONTROL "Gravis Ultrasound",IDC_CHECK_GUS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,120,94,10 - PUSHBUTTON "Configure",IDC_CONFIGURE_GUS,214,118,46,12 - - CONTROL "Usare suono FLOAT32",IDC_CHECK_FLOAT,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,138,94,10 -END +#define STR_MO_DRIVES "Unità magneto-ottiche:" +#define STR_ZIP_DRIVES "Unità ZIP:" +#define STR_250 "ZIP 250" -DLG_CFG_NETWORK DIALOG DISCARDABLE 107, 0, 267, 65 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Tipo di Rete:",IDT_1714,7,9,59,10 - COMBOBOX IDC_COMBO_NET_TYPE,71,7,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP +#define STR_ISARTC "RTC ISA:" +#define STR_ISAMEM "Espansione memoria ISA" +#define STR_ISAMEM_1 "Scheda 1:" +#define STR_ISAMEM_2 "Scheda 2:" +#define STR_ISAMEM_3 "Scheda 3:" +#define STR_ISAMEM_4 "Scheda 4:" +#define STR_BUGGER "Dispositivo ISABugger" +#define STR_POSTCARD "Scheda POST" - LTEXT "Dispositivo PCap:",IDT_1715,7,28,59,10 - COMBOBOX IDC_COMBO_PCAP,71,26,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - - LTEXT "Scheda di rete:",IDT_1716,7,47,59,10 - COMBOBOX IDC_COMBO_NET,71,45,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | - WS_TABSTOP - PUSHBUTTON "Configure",IDC_CONFIGURE_NET,214,44,46,12 -END - -DLG_CFG_PORTS DIALOG DISCARDABLE 107, 0, 267, 135 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Dispositivo LPT1:",IDT_1717,7,9,61,10 - COMBOBOX IDC_COMBO_LPT1,71,7,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "Dispositivo LPT2:",IDT_1718,7,28,61,10 - COMBOBOX IDC_COMBO_LPT2,71,26,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - LTEXT "Dispositivo LPT3:",IDT_1719,7,47,61,10 - COMBOBOX IDC_COMBO_LPT3,71,45,189,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - - CONTROL "Porta seriale 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,64,94,10 - CONTROL "Porta seriale 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,64,94,10 - CONTROL "Porta seriale 3",IDC_CHECK_SERIAL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,82,94,10 - CONTROL "Porta seriale 4",IDC_CHECK_SERIAL4,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,82,94,10 - - CONTROL "Porta parallela 1",IDC_CHECK_PARALLEL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,100,94,10 - CONTROL "Porta parallela 2",IDC_CHECK_PARALLEL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,100,94,10 - CONTROL "Porta parallela 3",IDC_CHECK_PARALLEL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,118,94,10 -END - -DLG_CFG_STORAGE DIALOG DISCARDABLE 107, 0, 267, 203 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "Controllore HDD:",IDT_1718,7,9,64,10 - COMBOBOX IDC_COMBO_HDC,64,7,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_HDC,222,7,38,12 - - LTEXT "Controllore FD:",IDT_1768,7,28,64,10 - COMBOBOX IDC_COMBO_FDC,64,26,155,120,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_FDC,222,26,38,12 - - CONTROL "Controllore IDE terziario",IDC_CHECK_IDE_TER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,47,199,10 - PUSHBUTTON "Configura",IDC_BUTTON_IDE_TER,222,45,38,12 - - CONTROL "Controllore IDE quaternario",IDC_CHECK_IDE_QUA,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,66,199,10 - PUSHBUTTON "Configura",IDC_BUTTON_IDE_QUA,222,64,38,12 - - GROUPBOX "SCSI",IDC_GROUP_SCSI,7,85,253,93 - LTEXT "Controllore 1:",IDT_1763,16,102,48,10 - COMBOBOX IDC_COMBO_SCSI_1,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_1,213,100,38,12 - LTEXT "Controllore 2:",IDT_1764,16,121,48,10 - COMBOBOX IDC_COMBO_SCSI_2,73,119,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_2,213,119,38,12 - LTEXT "Controllore 3:",IDT_1765,16,140,48,10 - COMBOBOX IDC_COMBO_SCSI_3,73,138,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_3,213,138,38,12 - LTEXT "Controllore 4:",IDT_1766,16,159,48,10 - COMBOBOX IDC_COMBO_SCSI_4,73,157,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_SCSI_4,213,157,38,12 - - CONTROL "Cassetta",IDC_CHECK_CASSETTE,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,185,94,10 -END - -DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_HARD_DISKS,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,92 - LTEXT "Disco rigido:",IDT_1720,7,7,253,8 - PUSHBUTTON "&Nuovo...",IDC_BUTTON_HDD_ADD_NEW,60,137,62,10 - PUSHBUTTON "&Esistente...",IDC_BUTTON_HDD_ADD,129,137,62,10 - PUSHBUTTON "&Rimuovi",IDC_BUTTON_HDD_REMOVE,198,137,62,10 - COMBOBOX IDC_COMBO_HD_BUS,33,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,119,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canale:",IDT_1722,131,119,38,8 - COMBOBOX IDC_COMBO_HD_ID,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,131,119,38,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,170,117,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP -END - -DLG_CFG_HARD_DISKS_ADD DIALOG DISCARDABLE 0, 0, 219, 149 -STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Aggiungi disco rigido" -FONT 9, "Segoe UI" -BEGIN - DEFPUSHBUTTON "OK",IDOK,55,127,50,14 - PUSHBUTTON "Cancella",IDCANCEL,112,127,50,14 - EDITTEXT IDC_EDIT_HD_FILE_NAME,7,16,153,12 - PUSHBUTTON "&Specifica...",IDC_CFILE,167,16,44,12 - EDITTEXT IDC_EDIT_HD_SPT,183,34,28,12 - EDITTEXT IDC_EDIT_HD_HPC,112,34,28,12 - EDITTEXT IDC_EDIT_HD_CYL,42,34,28,12 - EDITTEXT IDC_EDIT_HD_SIZE,42,52,28,12 - COMBOBOX IDC_COMBO_HD_TYPE,113,52,98,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Settori:",IDT_1726,154,35,27,10 - LTEXT "Teste:",IDT_1727,81,35,29,8 - LTEXT "Cilindri:",IDT_1728,7,35,32,12 - LTEXT "Dimensioni (MB):",IDT_1729,7,54,33,8 - LTEXT "Tipo:",IDT_1730,86,54,24,8 - LTEXT "Nome file:",IDT_1731,7,7,204,9 - COMBOBOX IDC_COMBO_HD_BUS,33,71,58,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1721,7,73,24,8 - COMBOBOX IDC_COMBO_HD_CHANNEL,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canale:",IDT_1722,99,73,34,8 - COMBOBOX IDC_COMBO_HD_ID,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1723,99,73,34,8 - COMBOBOX IDC_COMBO_HD_CHANNEL_IDE,134,71,77,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Formato Immag.:",IDT_1774,7,92,50,12 - COMBOBOX IDC_COMBO_HD_IMG_FORMAT,58,90,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Dimensioni blocchi:",IDT_1775,7,111,50,12 - COMBOBOX IDC_COMBO_HD_BLOCK_SIZE,58,109,153,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Progresso:",IDT_1752,7,7,204,9 - CONTROL "IMGCreateProgress",IDC_PBAR_IMG_CREATE,"msctls_progress32",PBS_SMOOTH | - WS_BORDER,7,16,204,12 -END - -DLG_CFG_FLOPPY_AND_CDROM_DRIVES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - CONTROL "List1",IDC_LIST_FLOPPY_DRIVES,"SysListView32", - LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,18,253,60 - LTEXT "Unità floppy:",IDT_1737,7,7,253,8 - COMBOBOX IDC_COMBO_FD_TYPE,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo:",IDT_1738,7,87,24,8 - CONTROL "Turbo",IDC_CHECKTURBO,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,131,86,64,10 - CONTROL "Verifica BPB",IDC_CHECKBPB,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,196,86,64,10 - - CONTROL "List1",IDC_LIST_CDROM_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,117,253,60 - LTEXT "Unità CD-ROM:",IDT_1739,7,107,253,8 - COMBOBOX IDC_COMBO_CD_BUS,33,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1740,7,187,24,8 - COMBOBOX IDC_COMBO_CD_ID,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1741,131,187,38,8 - COMBOBOX IDC_COMBO_CD_CHANNEL_IDE,170,185,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canale:",IDT_1742,131,187,38,8 - COMBOBOX IDC_COMBO_CD_SPEED,33,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Velocità:",IDT_1758,7,207,24,8 -END - -DLG_CFG_OTHER_REMOVABLE_DEVICES DIALOG DISCARDABLE 107, 0, 267, 222 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - - CONTROL "List1",IDC_LIST_MO_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,17,253,60 - LTEXT "Unità MO:",IDT_1769,7,7,253,8 - COMBOBOX IDC_COMBO_MO_BUS,33,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1770,7,87,24,8 - COMBOBOX IDC_COMBO_MO_ID,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1771,131,87,38,8 - COMBOBOX IDC_COMBO_MO_CHANNEL_IDE,170,85,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canale:",IDT_1772,131,87,38,8 - COMBOBOX IDC_COMBO_MO_TYPE,33,105,120,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Tipo:",IDT_1773,7,107,24,8 - - CONTROL "List1",IDC_LIST_ZIP_DRIVES,"SysListView32",LVS_REPORT | - LVS_SHOWSELALWAYS | LVS_SINGLESEL | WS_BORDER | - WS_TABSTOP,7,137,253,60 - LTEXT "Unità ZIP:",IDT_1759,7,127,253,8 - COMBOBOX IDC_COMBO_ZIP_BUS,23,205,90,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Bus:",IDT_1753,7,207,14,8 - COMBOBOX IDC_COMBO_ZIP_ID,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "ID:",IDT_1754,120,207,28,8 - COMBOBOX IDC_COMBO_ZIP_CHANNEL_IDE,149,205,61,12,CBS_DROPDOWNLIST | - WS_VSCROLL | WS_TABSTOP - LTEXT "Canale:",IDT_1755,120,207,28,8 - CONTROL "ZIP 250",IDC_CHECK250,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,218,205,44,10 -END - -DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 107, 0, 267, 154 -STYLE DS_CONTROL | WS_CHILD -FONT 9, "Segoe UI" -BEGIN - LTEXT "ISA RTC:",IDT_1767,7,9,48,10 - COMBOBOX IDC_COMBO_ISARTC,64,7,155,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_ISARTC,222,7,38,12 - - GROUPBOX "Espansione memoria ISA",IDC_GROUP_ISAMEM,7,28,253,93 - LTEXT "Scheda 1:",IDT_1763,16,45,48,10 - COMBOBOX IDC_COMBO_ISAMEM_1,73,43,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_1,213,43,38,12 - LTEXT "Scheda 2:",IDT_1764,16,64,48,10 - COMBOBOX IDC_COMBO_ISAMEM_2,73,62,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_2,213,62,38,12 - LTEXT "Scheda 3:",IDT_1765,16,83,48,10 - COMBOBOX IDC_COMBO_ISAMEM_3,73,81,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_3,213,81,38,12 - LTEXT "Scheda 4:",IDT_1766,16,102,48,10 - COMBOBOX IDC_COMBO_ISAMEM_4,73,100,137,120, - CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Configura",IDC_CONFIGURE_ISAMEM_4,213,100,38,12 - - CONTROL "Dispositivo ISABugger",IDC_CHECK_BUGGER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,128,94,10 - - CONTROL "Scheda POST",IDC_CHECK_POSTCARD,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,147,128,94,10 -END +#include "dialogs.rc" ///////////////////////////////////////////////////////////////////////////// // @@ -762,28 +414,28 @@ BEGIN IDS_2059 "Turbo" IDS_2060 "Acceso" IDS_2061 "Spento" - IDS_2062 "Tutte le immagini (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Immagini di settori base (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Immagini di superfice (*.86F)\0*.86F\0" - IDS_2063 "La macchina ""%hs"" non è disponibile a causa di immagini ROM mancanti nel percorso roms/machines. Cambiando ad una macchina disponibile." + IDS_2062 "Tutte le immagini (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Immagini di settori base (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Immagini di superficie (*.86F)\0*.86F\0" + IDS_2063 "La macchina ""%hs"" non è disponibile a causa di immagini ROM mancanti nella directory roms/machines. Cambiando ad una macchina disponibile." END STRINGTABLE DISCARDABLE BEGIN - IDS_2064 "La scheda video ""%hs"" non è disponibile a causa di immagini ROM mancanti nel percorso roms/video. Cambiando ad una scheda video disponibile." + IDS_2064 "La scheda video ""%hs"" non è disponibile a causa di immagini ROM mancanti nella directory roms/video. Cambiando ad una scheda video disponibile." IDS_2065 "Macchina" IDS_2066 "Schermo" - IDS_2067 "Dispositivi di input" + IDS_2067 "Dispositivi di entrata" IDS_2068 "Audio" IDS_2069 "Rete" IDS_2070 "Porte (COM & LPT)" - IDS_2071 "Controllori di memor." - IDS_2072 "Dischi rigidi" - IDS_2073 "Unitaà CD-ROM e Floppy" - IDS_2074 "Altri dispositivi rimuov." + IDS_2071 "Controller memoria" + IDS_2072 "Hard disk" + IDS_2073 "Unità CD-ROM e Floppy" + IDS_2074 "Altri dispositivi rimuovibili" IDS_2075 "Altre periferiche" - IDS_2076 "Immagini di superfice (*.86F)\0*.86F\0" - IDS_2077 "Clicca per catturare mouse" - IDS_2078 "Premi F8+F12 per liberare il mouse" - IDS_2079 "Premi F8+F12 o pulsante centrale per liberare il mouse" + IDS_2076 "Immagini di superficie (*.86F)\0*.86F\0" + IDS_2077 "Fare clic per catturare mouse" + IDS_2078 "Premi F8+F12 per rilasciare il mouse" + IDS_2079 "Premi F8+F12 o pulsante centrale per rilasciare il mouse" END STRINGTABLE DISCARDABLE @@ -799,7 +451,7 @@ BEGIN IDS_2088 "KB" IDS_2089 "Impossibile inizializzare il renderer video." IDS_2090 "Predefinito" - IDS_2091 "%i Stati d'attesa" + IDS_2091 "%i stati d'attesa" IDS_2092 "Tipo" IDS_2093 "Impossibile impostare PCap" IDS_2094 "Nessun dispositivo PCap trovato" @@ -811,13 +463,13 @@ BEGIN IDS_2100 "CH Flightstick Pro" IDS_2101 "Microsoft SideWinder Pad" IDS_2102 "Thrustmaster Flight Control System" - IDS_2103 "Niente" + IDS_2103 "Nessuno" IDS_2104 "Impossibile caricare gli acceleratori da tastiera." IDS_2105 "Impossibile registrare input raw." IDS_2106 "%u" IDS_2107 "%u MB (CHS: %i, %i, %i)" IDS_2108 "Floppy %i (%s): %ls" - IDS_2109 "Tutte le immagini (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Immagini da settori avanzati (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagini da settori basilari (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Immagini flusso (*.FDI)\0*.FDI\0Immagini da superfice (*.86F;*.MFM)\0*.86F;*.MFM\0Tutti i file (*.*)\0*.*\0" + IDS_2109 "Tutte le immagini (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Immagini da settori avanzati (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Imagini da settori basilari (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Immagini flusso (*.FDI)\0*.FDI\0Immagini da superficie (*.86F;*.MFM)\0*.86F;*.MFM\0Tutti i file (*.*)\0*.*\0" IDS_2110 "Impossibile inizializzare FreeType" IDS_2111 "Impossibile inizializzare SDL, SDL2.dll è necessario" IDS_2112 "Sei sicuro di voler riavviare la macchina emulata?" @@ -826,11 +478,11 @@ BEGIN IDS_2115 "MO %i (%ls): %ls" IDS_2116 "Immagini MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0Tutti i file (*.*)\0*.*\0" IDS_2117 "Benvenuti in 86Box!" - IDS_2118 "Controllore interno" + IDS_2118 "Controller interno" IDS_2119 "Esci" IDS_2120 "Nessune immagini ROM trovate" - IDS_2121 "Vuoi salvare queste impostazioni?" - IDS_2122 "Questo riavviera la macchina emulata." + IDS_2121 "Vuole salvare queste impostazioni?" + IDS_2122 "Questo riavvierà la macchina emulata." IDS_2123 "Salva" IDS_2124 "Informazioni su 86Box" IDS_2125 "86Box v" EMU_VERSION @@ -863,7 +515,7 @@ BEGIN #define LIB_NAME_FLUIDSYNTH "libfluidsynth" #endif IDS_2133 LIB_NAME_FLUIDSYNTH " è richiesto per l'output FluidSynth MIDI." - IDS_2134 "Entrando modalità schermo intero" + IDS_2134 "Entrando nella modalità schermo intero" IDS_2135 "Non mostrare più questo messaggio" IDS_2136 "Non uscire" IDS_2137 "Riavvia" @@ -885,10 +537,10 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_4096 "Disco rigido (%s)" + IDS_4096 "Hard disk (%s)" IDS_4097 "%01i:%01i" IDS_4098 "%01i" - IDS_4099 "Le unità CD-ROM per MFM/RLL o ESDI non sono mai esistite." + IDS_4099 "Le unità CD-ROM MFM/RLL o ESDI non sono mai esistite." IDS_4100 "Personalizzata..." IDS_4101 "Personalizzata (grande)..." IDS_4102 "Aggiungi un nuovo disco rigido" @@ -916,7 +568,7 @@ BEGIN IDS_4124 "Immagine HDX (.hdx)" IDS_4125 "VHD di dimensioni fisse (.vhd)" IDS_4126 "VHD di dimensioni dinamiche (.vhd)" - IDS_4127 "VHD di differenziazione (.vhd)" + IDS_4127 "VHD differenziato (.vhd)" IDS_4128 "Blocchi larghi (2 MB)" IDS_4129 "Blocchi piccoli (512 KB)" IDS_4130 "File VHD (*.VHD)\0*.VHD\0Tutti i file (*.*)\0*.*\0" @@ -975,7 +627,7 @@ BEGIN IDS_5910 "5.25"" 1Gb M.O." IDS_5911 "5.25"" 1.3Gb M.O." - IDS_6144 "RPM Perfette" + IDS_6144 "RPM perfette" IDS_6145 "RPM 1%% sotto perfezione" IDS_6146 "RPM 1.5%% sotto perfezione" IDS_6147 "RPM 2%% sotto perfezione"