diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml
index dcbb68f5b..5157cec51 100644
--- a/.github/workflows/cmake_windows_msys2.yml
+++ b/.github/workflows/cmake_windows_msys2.yml
@@ -21,7 +21,6 @@ on:
- cmake/**
- "**/CMakeLists.txt"
- "CMakePresets.json"
- - .github/workflows/**
- .github/workflows/cmake_windows_msys2.yml
- vcpkg.json
- "!**/Makefile*"
@@ -29,9 +28,9 @@ on:
jobs:
msys2:
- name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}"
+ name: "${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}"
- runs-on: windows-2022
+ runs-on: ${{ matrix.environment.runner }}
env:
BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed
@@ -44,47 +43,38 @@ jobs:
fail-fast: true
matrix:
build:
-# - name: Regular
-# preset: regular
- - name: Debug
+ - name: Dev Debug
preset: dev_debug
- slug: -Debug
+ slug: -Dev-Debug
- name: Dev
preset: development
slug: -Dev
dynarec:
- name: ODR
new: off
- slug: -ODR
- name: NDR
new: on
slug: -NDR
- ui:
- - name: Qt GUI
- qt: on
- static: on
- slug: -Qt
- packages: >-
- qt5-static:p
- vulkan-headers:p
environment:
-# - msystem: MSYS
-# toolchain: ./cmake/flags-gcc-x86_64.cmake
- msystem: MINGW64
- prefix: mingw-w64-x86_64
toolchain: ./cmake/flags-gcc-x86_64.cmake
-# - msystem: CLANG64
-# prefix: mingw-w64-clang-x86_64
-# toolchain: ./cmake/llvm-win32-x86_64.cmake
-# - msystem: UCRT64
-# prefix: mingw-w64-ucrt-x86_64
-# toolchain: ./cmake/flags-gcc-x86_64.cmake
+ slug: "-64"
+ runner: windows-2022
+ - msystem: CLANGARM64
+ toolchain: ./cmake/flags-gcc-aarch64.cmake
+ slug: -arm64
+ runner: windows-11-arm
+ exclude:
+ - dynarec:
+ new: off
+ environment:
+ msystem: CLANGARM64
steps:
- name: Prepare MSYS2 environment
uses: msys2/setup-msys2@v2
with:
- release: false
+ release: true
update: true
msystem: ${{ matrix.environment.msystem }}
pacboy: >-
@@ -101,15 +91,17 @@ jobs:
libslirp:p
fluidsynth:p
libserialport:p
- ${{ matrix.ui.packages }}
+ qt5-static:p
+ vulkan-headers:p
+ openmp:p
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- - name: Install sonar-scanner and build-wrapper
- uses: SonarSource/sonarcloud-github-c-cpp@v3
+ # - name: Install sonar-scanner and build-wrapper
+ # uses: SonarSource/sonarcloud-github-c-cpp@v3
- name: Configure CMake
run: >-
@@ -117,20 +109,20 @@ jobs:
--toolchain ${{ matrix.environment.toolchain }}
-D NEW_DYNAREC=${{ matrix.dynarec.new }}
-D CMAKE_INSTALL_PREFIX=./build/artifacts
- -D QT=${{ matrix.ui.qt }}
- -D STATIC_BUILD=${{ matrix.ui.static }}
+
+ # - name: Build
+ # run: |
+ # .sonar/build-wrapper-win-x86/build-wrapper-win-x86-64.exe --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build
- name: Build
- run: |
- .sonar/build-wrapper-win-x86/build-wrapper-win-x86-64.exe --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build
+ run: cmake --build build
- - name: Run sonar-scanner
- if: 0
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- run: |
- .sonar/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
+ # - name: Run sonar-scanner
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ # run: |
+ # .sonar/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
- name: Generate package
run: cmake --install build
@@ -138,5 +130,5 @@ jobs:
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
- name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}'
+ name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows${{ matrix.environment.slug }}-gha${{ github.run_number }}'
path: build/artifacts/**
diff --git a/src/86box.c b/src/86box.c
index 2b6e1ba9f..ad1cfc519 100644
--- a/src/86box.c
+++ b/src/86box.c
@@ -1624,6 +1624,8 @@ set_screen_size_monitor(int x, int y, int monitor_index)
{
int temp_overscan_x = monitors[monitor_index].mon_overscan_x;
int temp_overscan_y = monitors[monitor_index].mon_overscan_y;
+ int is_svga = (video_get_type_monitor(monitor_index) == VIDEO_FLAG_TYPE_SPECIAL) ||
+ (video_get_type_monitor(monitor_index) == VIDEO_FLAG_TYPE_8514);
double dx;
double dy;
double dtx;
@@ -1657,19 +1659,19 @@ set_screen_size_monitor(int x, int y, int monitor_index)
dty = (double) temp_overscan_y;
/* Account for possible overscan. */
- if (video_get_type_monitor(monitor_index) != VIDEO_FLAG_TYPE_SPECIAL && (temp_overscan_y == 16)) {
+ if (!is_svga && (temp_overscan_y == 16)) {
/* CGA */
dy = (((dx - dtx) / 4.0) * 3.0) + dty;
- } else if (video_get_type_monitor(monitor_index) != VIDEO_FLAG_TYPE_SPECIAL && (temp_overscan_y < 16)) {
+ } else if (!is_svga && (temp_overscan_y < 16)) {
/* MDA/Hercules */
- dy = (x / 4.0) * 3.0;
+ dy = (dx / 4.0) * 3.0;
} else {
if (enable_overscan) {
/* EGA/(S)VGA with overscan */
dy = (((dx - dtx) / 4.0) * 3.0) + dty;
} else {
/* EGA/(S)VGA without overscan */
- dy = (x / 4.0) * 3.0;
+ dy = (dx / 4.0) * 3.0;
}
}
monitors[monitor_index].mon_unscaled_size_y = (int) dy;
diff --git a/src/chipset/neat.c b/src/chipset/neat.c
index 1146ecbff..0661f89ee 100644
--- a/src/chipset/neat.c
+++ b/src/chipset/neat.c
@@ -956,8 +956,9 @@ neat_write(uint16_t port, uint8_t val, void *priv)
dev->ems_size);
}
- mem_a20_key = !(val & RB12_GA20);
+ mem_a20_alt = !(val & RB12_GA20);
mem_a20_recalc();
+ flushmmucache();
break;
default:
@@ -987,7 +988,7 @@ neat_read(uint16_t port, void *priv)
if ((dev->indx >= 0x60) && (dev->indx <= 0x6e))
ret = dev->regs[dev->indx];
else if (dev->indx == 0x6f)
- ret = (dev->regs[dev->indx] & 0xfd) | (mem_a20_key & 2);
+ ret = (dev->regs[dev->indx] & 0xfd) | ~(mem_a20_alt & 0x02);
break;
default:
diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c
index 6e26a4751..537675a85 100644
--- a/src/chipset/sis_85c4xx.c
+++ b/src/chipset/sis_85c4xx.c
@@ -375,7 +375,7 @@ sis_85c4xx_init(const device_t *info)
dev->reg_base = info->local & 0xff;
if (dev->is_471) {
- dev->reg_last = dev->reg_base + 0x76;
+ dev->reg_last = 0x76;
dev->smram = smram_add();
diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c
index 6b855f5aa..248664983 100644
--- a/src/chipset/via_pipc.c
+++ b/src/chipset/via_pipc.c
@@ -493,14 +493,28 @@ pipc_reset_hard(void *priv)
}
dev->ac97_regs[i][0x1c] = 0x01;
+ if (i == 0) {
+ dev->ac97_regs[i][0x34] = 0xc0;
+
+ dev->ac97_regs[i][0xc0] = 0x01;
+ dev->ac97_regs[i][0xc1] = 0x00;
+ dev->ac97_regs[i][0xc2] = 0x03;
+ dev->ac97_regs[i][0xc3] = 0x00;
+
+ dev->ac97_regs[i][0xc4] = 0x00;
+ dev->ac97_regs[i][0xc5] = 0x00;
+ dev->ac97_regs[i][0xc6] = 0x00;
+ dev->ac97_regs[i][0xc7] = 0x00;
+ }
+
dev->ac97_regs[i][0x3d] = 0x03;
- if (i == 0)
+ if (i == 0) {
dev->ac97_regs[i][0x40] = 0x01;
-
- dev->ac97_regs[i][0x43] = 0x1c;
- dev->ac97_regs[i][0x48] = 0x01;
- dev->ac97_regs[i][0x4b] = 0x02;
+ dev->ac97_regs[i][0x43] = 0x1c;
+ dev->ac97_regs[i][0x48] = 0x01;
+ dev->ac97_regs[i][0x4b] = 0x00;
+ }
pipc_sgd_handlers(dev, i);
pipc_codec_handlers(dev, i);
@@ -742,10 +756,12 @@ pipc_codec_handlers(pipc_t *dev, uint8_t modem)
if (!dev->ac97)
return;
+ uint32_t base = (dev->ac97_regs[modem][0x1d] << 8);
+
if (modem)
- ac97_via_remap_modem_codec(dev->ac97, dev->ac97_regs[1][0x1d] << 8, dev->ac97_regs[1][0x04] & PCI_COMMAND_IO);
+ ac97_via_remap_modem_codec(dev->ac97, base, dev->ac97_regs[1][0x04] & PCI_COMMAND_IO);
else
- ac97_via_remap_audio_codec(dev->ac97, dev->ac97_regs[0][0x1d] << 8, dev->ac97_regs[0][0x04] & PCI_COMMAND_IO);
+ ac97_via_remap_audio_codec(dev->ac97, base, dev->ac97_regs[0][0x04] & PCI_COMMAND_IO);
}
static uint8_t
@@ -1204,7 +1220,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
case 0x77:
if ((dev->local >= VIA_PIPC_686A) && (val & 0x10))
- pclog("PIPC: Warning: Internal I/O APIC enabled.\n");
+ warning("PIPC: Warning: Internal I/O APIC enabled.\n");
nvr_via_wp_set(!!(val & 0x04), 0x32, dev->nvr);
nvr_via_wp_set(!!(val & 0x02), 0x0d, dev->nvr);
break;
@@ -1488,36 +1504,39 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
break;
}
} else if (func <= pm_func + 2) { /* AC97 / MC97 */
- /* Read-only addresses. */
- if ((addr < 0x4) || ((addr >= 0x6) && (addr < 0x9)) || ((addr >= 0xc) && (addr < 0x11)) || (addr == 0x16) || (addr == 0x17) || (addr == 0x1a) || (addr == 0x1b) || ((addr >= 0x1e) && (addr < 0x2c)) || ((addr >= 0x30) && (addr < 0x34)) || ((addr >= 0x35) && (addr < 0x3c)) || ((addr >= 0x3d) && (addr < 0x41)) || ((addr >= 0x45) && (addr < 0x4a)) || (addr >= 0x4c))
- return;
-
/* Small shortcut. */
func = func - pm_func - 1;
- /* Check disable bits and specific read-only addresses for both controllers. */
- if ((func == 0) && (((addr >= 0x09) && (addr < 0xc)) || (addr == 0x44) || (dev->pci_isa_regs[0x85] & 0x04)))
+ /* Check disable bits. */
+ if ((func == 0) && (dev->pci_isa_regs[0x85] & 0x04))
return;
- if ((func == 1) && ((addr == 0x14) || (addr == 0x15) || (addr == 0x18) || (addr == 0x19) || (addr == 0x42) || (addr == 0x43) || (addr == 0x48) || (addr == 0x4a) || (addr == 0x4b) || (dev->pci_isa_regs[0x85] & 0x08)))
+ if ((func == 1) && (dev->pci_isa_regs[0x85] & 0x08))
return;
switch (addr) {
case 0x04:
- dev->ac97_regs[func][addr] = val;
+ dev->ac97_regs[func][addr] = val & 0x01;
pipc_sgd_handlers(dev, func);
+ if (func == 0) {
+ pipc_fmnmi_handlers(dev, func);
+ pipc_sb_handlers(dev, func);
+ }
pipc_codec_handlers(dev, func);
- pipc_fmnmi_handlers(dev, func);
break;
case 0x09:
case 0x0a:
case 0x0b:
- if (dev->ac97_regs[func][0x44] & 0x20)
+ /* Not writable on audio, only on modem. */
+ if ((func == 1) && (dev->ac97_regs[func][0x44] & 0x20))
dev->ac97_regs[func][addr] = val;
break;
- case 0x10:
+ /*
+ The lowest 10 bytes are always 0x01, indicating
+ a 256-byte I/O space.
+ */
case 0x11:
dev->ac97_regs[func][addr] = val;
pipc_sgd_handlers(dev, func);
@@ -1525,21 +1544,26 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
case 0x14:
case 0x15:
- if (addr == 0x14)
- val = (val & 0xfc) | 1;
- dev->ac97_regs[func][addr] = val;
- pipc_fmnmi_handlers(dev, func);
+ /* Not present on modem. */
+ if (func == 0) {
+ if (addr == 0x14)
+ val = (val & 0xfc) | 1;
+ dev->ac97_regs[func][addr] = val;
+ pipc_fmnmi_handlers(dev, func);
+ }
break;
case 0x18:
case 0x19:
- if (addr == 0x18)
- val = (val & 0xfc) | 1;
- dev->ac97_regs[func][addr] = val;
- pipc_sb_handlers(dev, func);
+ /* Not present on modem. */
+ if (func == 0) {
+ if (addr == 0x18)
+ val = (val & 0xfc) | 1;
+ dev->ac97_regs[func][addr] = val;
+ pipc_sb_handlers(dev, func);
+ }
break;
- case 0x1c:
case 0x1d:
dev->ac97_regs[func][addr] = val;
pipc_codec_handlers(dev, func);
@@ -1549,39 +1573,84 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
case 0x2d:
case 0x2e:
case 0x2f:
- if ((func == 0) && (dev->ac97_regs[func][0x42] & 0x20))
+ if (((func == 0) && (dev->ac97_regs[func][0x42] & 0x20)) ||
+ ((func == 1) && (dev->ac97_regs[func][0x44] & 0x10)))
dev->ac97_regs[func][addr] = val;
break;
+ case 0x3c:
+ dev->ac97_regs[func][addr] = val & 0x0f;
+ break;
+
case 0x41:
dev->ac97_regs[func][addr] = val;
ac97_via_write_control(dev->ac97, func, val);
break;
case 0x42:
- case 0x4a:
- case 0x4b:
- dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val;
- gameport_remap(dev->gameport, (dev->ac97_regs[0][0x42] & 0x08) ? ((dev->ac97_regs[0][0x4b] << 8) | (dev->ac97_regs[0][0x4a] & 0xf8)) : 0);
- if (addr == 0x42)
- pipc_sb_handlers(dev, func);
+ case 0x4a ... 0x4b:
+ if (func == 0) {
+ dev->ac97_regs[func][addr] = val;
+ gameport_remap(dev->gameport, (dev->ac97_regs[func][0x42] & 0x08) ?
+ ((dev->ac97_regs[func][0x4b] << 8) |
+ (dev->ac97_regs[func][0x4a] & 0xf8)) : 0);
+
+ if (addr == 0x42)
+ pipc_sb_handlers(dev, func);
+ }
break;
case 0x43:
- dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val;
+ if (func == 0)
+ dev->ac97_regs[func][addr] = val;
break;
case 0x44:
- dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val & 0xf0;
+ if (func == 1)
+ dev->ac97_regs[func][addr] = val & 0xf0;
break;
- case 0x45:
case 0x48:
- dev->ac97_regs[0][addr] = dev->ac97_regs[1][addr] = val & 0x0f;
+ if (func == 0)
+ dev->ac97_regs[func][addr] = val & 0x0f;
+ break;
+
+ case 0x80:
+ case 0x81:
+ case 0x82:
+ dev->ac97_regs[func][addr] = val;
+ break;
+ case 0x83:
+ dev->ac97_regs[func][addr] = ((dev->ac97_regs[func][addr] & 0x01) |
+ (val & 0xc0)) & ~(val & 0x0a);
+ break;
+
+ case 0x88:
+ case 0x89:
+ dev->ac97_regs[func][addr] = val;
+ break;
+ case 0x8a:
+ case 0x8b:
+ dev->ac97_regs[func][addr] &= ~val;
+ break;
+
+ case 0x8e:
+ case 0x8f:
+ dev->ac97_regs[func][addr] = val;
+ break;
+
+ case 0xc4:
+ if (func == 0)
+ dev->ac97_regs[func][addr] = (dev->ac97_regs[func][addr] & 0x0c) |
+ (val & 0x03);
+ break;
+ case 0xc5:
+ if (func == 0)
+ dev->ac97_regs[func][addr] = (dev->ac97_regs[func][addr] & 0x60) |
+ (val & 0x9f);
break;
default:
- dev->ac97_regs[func][addr] = val;
break;
}
}
diff --git a/src/chipset/wd76c10.c b/src/chipset/wd76c10.c
index a375c8eb6..48bb56483 100644
--- a/src/chipset/wd76c10.c
+++ b/src/chipset/wd76c10.c
@@ -65,9 +65,10 @@ wd76c10_log(const char *fmt, ...)
#endif
typedef struct {
- uint32_t enable;
+ uint32_t phys_on, enable;
uint32_t virt_addr, phys_addr;
uint32_t virt_size, phys_size;
+ uint32_t adj_virt_addr, adj_virt_size;
} ram_bank_t;
typedef struct {
@@ -103,6 +104,7 @@ typedef struct
int locked;
uint32_t mem_top, hmwp_base;
+ uint32_t fast;
ram_bank_t ram_banks[5];
@@ -121,6 +123,40 @@ static uint32_t bank_sizes[4] = { 0x00020000, /* 64 Kbit X 16 = 1024 Kbit
0x00200000, /* 1 Mbit X 16 = 16 Mbit = 2 MB, 10x10 */
0x00800000 }; /* 4 Mbit X 16 = 64 Mbit = 8 MB, 11x11 */
+static uint32_t
+wd76c10_calc_phys(uint32_t row, uint32_t col, uint32_t size, uint32_t a0)
+{
+ uint32_t ret = WD76C10_ADDR_INVALID;
+
+ switch (size) {
+ default:
+ ret = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00020000:
+ row = (row & 0x0000ff) << 9;
+ col = (col & 0x0000ff) << 1;
+ ret = row | col | a0;
+ break;
+ case 0x00080000:
+ row = (row & 0x0001ff) << 10;
+ col = (col & 0x0001ff) << 1;
+ ret = row | col | a0;
+ break;
+ case 0x00200000:
+ row = (row & 0x0003ff) << 11;
+ col = (col & 0x0003ff) << 1;
+ ret = row | col | a0;
+ break;
+ case 0x00800000:
+ row = (row & 0x0007ff) << 12;
+ col = (col & 0x0007ff) << 1;
+ ret = row | col | a0;
+ break;
+ }
+
+ return ret;
+}
+
static uint32_t
wd76c10_calc_addr(wd76c10_t *dev, uint32_t addr)
{
@@ -159,20 +195,303 @@ wd76c10_calc_addr(wd76c10_t *dev, uint32_t addr)
ret = WD76C10_ADDR_INVALID;
/* Then, handle the physical memory banks. */
+ int ilv4 = (dev->mem_ctl >> 8) & 4;
+ int8_t add = 0;
+ uint32_t pg = (dev->mem_ctl & 0x0800);
+ uint32_t nrt = WD76C10_ADDR_INVALID;
+
+ if (ret != WD76C10_ADDR_INVALID) {
+ if (dev->fast) for (int8_t i = 0; i < 4; i++) {
+ rb = &(dev->ram_banks[i]);
+
+ uint32_t ret2 = ret - rb->phys_addr;
+
+ if (rb->phys_on && (ret >= rb->phys_addr) &&
+ (ret < (rb->phys_addr + rb->phys_size))) {
+ if (ret2 < rb->phys_size)
+ nrt = ret2 + rb->phys_addr;
+ break;
+ }
+ } else for (int8_t i = 0; i < 4; i++) {
+ rb = &(dev->ram_banks[i]);
+
+ int ilv2 = (dev->mem_ctl >> 8) & (1 << (i >> 1));
+ uint32_t size = rb->virt_size;
+ uint32_t ret2 = ret - rb->virt_addr;
+ uint32_t ret4 = ret2;
+ uint32_t row = WD76C10_ADDR_INVALID;
+ uint32_t col = WD76C10_ADDR_INVALID;
+ uint32_t rb_or = 0;
+
+ if (ilv4) {
+ size <<= 2;
+ switch (rb->virt_size) {
+ default:
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00020000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000fc;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 9) & 0x000003;
+ } else
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00080000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000f8;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 21) & 0x000001) << 2;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 10) & 0x000003;
+ } else
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00200000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000f0;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 21) & 0x000001) << 2;
+ row |= ((ret2 >> 23) & 0x000001) << 3;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 11) & 0x000003;
+ } else
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00800000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000e0;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 21) & 0x000001) << 2;
+ row |= ((ret2 >> 23) & 0x000001) << 3;
+ row |= ((ret2 >> 24) & 0x000001) << 4;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 12) & 0x000003;
+ } else
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ }
+ add = 3;
+ } else if (ilv2) {
+ size <<= 1;
+ switch (rb->virt_size) {
+ default:
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00020000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000fe;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 9) & 0x000001;
+ } else {
+ row = (ret2 >> 1) & 0x0007fe;
+ row |= (ret2 >> 13) & 0x000001;
+ col = (ret2 >> 9) & 0x0000ef;
+ col |= ((ret2 >> 17) & 0x000001) << 4;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ rb_or = (ret2 >> 1) & 0x000001;
+ }
+ break;
+ case 0x00080000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000fc;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 10) & 0x000001;
+ } else {
+ row = (ret2 >> 1) & 0x0007fe;
+ row |= (ret2 >> 13) & 0x000001;
+ col = (ret2 >> 9) & 0x0000ee;
+ col |= (ret2 >> 17) & 0x000001;
+ col |= ((ret2 >> 19) & 0x000001) << 4;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ rb_or = (ret2 >> 1) & 0x000001;
+ }
+ break;
+ case 0x00200000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000f8;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 21) & 0x000001) << 2;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 11) & 0x000001;
+ } else {
+ row = (ret2 >> 1) & 0x0007fe;
+ row |= (ret2 >> 13) & 0x000001;
+ col = (ret2 >> 9) & 0x0000ec;
+ col |= (ret2 >> 17) & 0x000001;
+ col |= ((ret2 >> 19) & 0x000001) << 1;
+ col |= ((ret2 >> 21) & 0x000001) << 4;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ rb_or = (ret2 >> 1) & 0x000001;
+ }
+ break;
+ case 0x00800000:
+ if (pg) {
+ row = (ret2 >> 9) & 0x0000f0;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 21) & 0x000001) << 2;
+ row |= ((ret2 >> 23) & 0x000001) << 3;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x000007ff;
+ rb_or = (ret2 >> 12) & 0x000001;
+ } else {
+ row = (ret2 >> 1) & 0x0007fe;
+ row |= (ret2 >> 13) & 0x000001;
+ col = (ret2 >> 9) & 0x0000e0;
+ col |= (ret2 >> 17) & 0x000001;
+ col |= ((ret2 >> 19) & 0x000001) << 1;
+ col |= ((ret2 >> 21) & 0x000001) << 2;
+ col |= ((ret2 >> 23) & 0x000001) << 3;
+ col |= ((ret2 >> 12) & 0x000001) << 4;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ rb_or = (ret2 >> 1) & 0x000001;
+ }
+ break;
+ }
+ add = 1;
+ } else if (pg) switch (rb->virt_size) {
+ default:
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00020000:
+ row = (ret2 >> 9) & 0x0000ff;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x0007ff;
+ break;
+ case 0x00080000:
+ row = (ret2 >> 9) & 0x0000fe;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x0007ff;
+ break;
+ case 0x00200000:
+ row = (ret2 >> 9) & 0x0000fc;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x0007ff;
+ break;
+ case 0x00800000:
+ row = (ret2 >> 9) & 0x0000f8;
+ row |= (ret2 >> 17) & 0x000001;
+ row |= ((ret2 >> 19) & 0x000001) << 1;
+ row |= ((ret2 >> 21) & 0x000001) << 2;
+ row |= ((ret2 >> 18) & 0x000001) << 8;
+ row |= ((ret2 >> 20) & 0x000001) << 9;
+ row |= ((ret2 >> 22) & 0x000001) << 10;
+ col = (ret2 >> 1) & 0x0007ff;
+ break;
+ } else switch (rb->virt_size) {
+ default:
+ ret4 = WD76C10_ADDR_INVALID;
+ break;
+ case 0x00020000:
+ row = (ret2 >> 1) & 0x0007ff;
+ col = (ret2 >> 9) & 0x0000ff;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ break;
+ case 0x00080000:
+ row = (ret2 >> 1) & 0x0007ff;
+ col = (ret2 >> 9) & 0x0000fe;
+ col |= (ret2 >> 17) & 0x000001;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ break;
+ case 0x00200000:
+ row = (ret2 >> 1) & 0x0007ff;
+ col = (ret2 >> 9) & 0x0000fc;
+ col |= (ret2 >> 17) & 0x000001;
+ col |= ((ret2 >> 19) & 0x000001) << 1;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ break;
+ case 0x00800000:
+ row = (ret2 >> 1) & 0x0007ff;
+ col = (ret2 >> 9) & 0x0000f8;
+ col |= (ret2 >> 17) & 0x000001;
+ col |= ((ret2 >> 19) & 0x000001) << 1;
+ col |= ((ret2 >> 21) & 0x000001) << 2;
+ col |= ((ret2 >> 18) & 0x000001) << 8;
+ col |= ((ret2 >> 20) & 0x000001) << 9;
+ col |= ((ret2 >> 22) & 0x000001) << 10;
+ break;
+ }
+
+ if (row != WD76C10_ADDR_INVALID) {
+ ret4 = wd76c10_calc_phys(row & 0x0007ff, col & 0x0007ff,
+ rb->phys_size, ret2 & 0x000001);
+
+ if (ilv4 || ilv2)
+ rb = &(dev->ram_banks[i | rb_or]);
+
+ i += add;
+ }
+
+ if (rb->enable && (ret >= rb->virt_addr) &&
+ (ret < (rb->virt_addr + size))) {
+ if ((ret4 != WD76C10_ADDR_INVALID) && (rb->phys_size > 0x00000000))
+ nrt = ret4 + rb->phys_addr;
+ break;
+ }
+ }
+
+ ret = nrt;
+ }
+
if (ret >= (mem_size << 10))
/* The physical memory address is too high or disabled, which is invalid. */
ret = WD76C10_ADDR_INVALID;
- /* Otherwise, map it to the correct bank so the BIOS can auto-size it correctly. */
- else for (uint8_t i = 0; i < 4; i++) {
- rb = &(dev->ram_banks[i]);
- if (rb->enable && (ret >= rb->virt_addr) && (ret < (rb->virt_addr + rb->virt_size))) {
- if (rb->phys_size == 0x00000000)
- ret = WD76C10_ADDR_INVALID;
- else
- ret = ((ret - rb->virt_addr) % rb->phys_size) + rb->phys_addr;
- break;
- }
- }
return ret;
}
@@ -185,8 +504,12 @@ wd76c10_read_ram(uint32_t addr, void *priv)
addr = wd76c10_calc_addr(dev, addr);
- if (addr != WD76C10_ADDR_INVALID)
- ret = mem_read_ram(addr, priv);
+ if (addr != WD76C10_ADDR_INVALID) {
+ if (dev->fast)
+ ret = mem_read_ram(addr, priv);
+ else
+ ret = ram[addr];
+ }
return ret;
}
@@ -199,8 +522,12 @@ wd76c10_read_ramw(uint32_t addr, void *priv)
addr = wd76c10_calc_addr(dev, addr);
- if (addr != WD76C10_ADDR_INVALID)
- ret = mem_read_ramw(addr, priv);
+ if (addr != WD76C10_ADDR_INVALID) {
+ if (dev->fast)
+ ret = mem_read_ramw(addr, priv);
+ else
+ ret = *(uint16_t *) &(ram[addr]);
+ }
return ret;
}
@@ -212,8 +539,12 @@ wd76c10_write_ram(uint32_t addr, uint8_t val, void *priv)
addr = wd76c10_calc_addr(dev, addr);
- if (addr != WD76C10_ADDR_INVALID)
- mem_write_ram(addr, val, priv);
+ if (addr != WD76C10_ADDR_INVALID) {
+ if (dev->fast)
+ mem_write_ram(addr, val, priv);
+ else
+ ram[addr] = val;
+ }
}
static void
@@ -223,8 +554,12 @@ wd76c10_write_ramw(uint32_t addr, uint16_t val, void *priv)
addr = wd76c10_calc_addr(dev, addr);
- if (addr != WD76C10_ADDR_INVALID)
- mem_write_ramw(addr, val, priv);
+ if (addr != WD76C10_ADDR_INVALID) {
+ if (dev->fast)
+ mem_write_ramw(addr, val, priv);
+ else
+ *(uint16_t *) &(ram[addr]) = val;
+ }
}
static void
@@ -258,6 +593,9 @@ wd76c10_recalc_exec(wd76c10_t *dev, uint32_t base, uint32_t size)
static void
wd76c10_banks_recalc(wd76c10_t *dev)
{
+ int match = 0;
+ dev->fast = 0;
+
for (uint8_t i = 0; i < 4; i++) {
ram_bank_t *rb = &(dev->ram_banks[i]);
uint8_t bit = i << 1;
@@ -266,8 +604,42 @@ wd76c10_banks_recalc(wd76c10_t *dev)
rb->enable = (dev->split_sa >> bit) & 0x01;
rb->virt_addr = ((uint32_t) dev->bank_bases[i]) << 17;
+ if (rb->enable) {
+ rb->adj_virt_addr = rb->virt_addr;
+ rb->adj_virt_size = rb->virt_size;
+
+ if (dev->mem_ctl & 0x0400)
+ rb->adj_virt_addr += (i * rb->adj_virt_size);
+ else if ((dev->mem_ctl >> 8) & (1 << (i >> 1)))
+ rb->adj_virt_addr += ((i & 1) * rb->adj_virt_size);
+ } else {
+ rb->adj_virt_addr = WD76C10_ADDR_INVALID;
+ rb->adj_virt_size = 0x00000000;
+ }
+
+ if ((rb->enable == rb->phys_on) &&
+ (rb->adj_virt_addr == rb->phys_addr) &&
+ (rb->adj_virt_size == rb->phys_size))
+ match++;
+ }
+
+ dev->fast = (match == 4);
+
+ for (uint8_t i = 0; i < 4; i++) {
+ ram_bank_t *rb = &(dev->ram_banks[i]);
+
if (cpu_use_exec)
wd76c10_recalc_exec(dev, rb->virt_addr, rb->virt_size);
+
+ wd76c10_log("Bank %i (%s), physical: %i, %08X-%08X, "
+ "virtual: %i, %08X-%08X, adj.: %i, %08X-%08X\n",
+ i, dev->fast ? "FAST" : "SLOW",
+ rb->phys_on,
+ rb->phys_addr, rb->phys_addr + rb->phys_size - 1,
+ rb->enable,
+ rb->virt_addr, rb->virt_addr + rb->virt_size - 1,
+ rb->enable,
+ rb->adj_virt_addr, rb->adj_virt_addr + rb->adj_virt_size - 1);
}
}
@@ -899,11 +1271,22 @@ wd76c10_init(UNUSED(const device_t *info))
}
}
if (size != 0x00000000) {
+ rb->phys_on = 1;
rb->phys_addr = accum_mem;
rb->phys_size = size;
+ wd76c10_log("Bank %i size: %5i KiB, starting at %5i KiB\n", i, rb->phys_size >> 10, rb->phys_addr >> 10);
total_mem -= size;
accum_mem += size;
- }
+ } else
+ rb->phys_addr = WD76C10_ADDR_INVALID;
+ }
+
+ if (mem_size == 3072) {
+ /* Reorganize the banks a bit so, we have 2048, 0, 512, 512. */
+ ram_bank_t rt = dev->ram_banks[3];
+ dev->ram_banks[3] = dev->ram_banks[2];
+ dev->ram_banks[2] = dev->ram_banks[1];
+ dev->ram_banks[1] = rt;
}
rb = &(dev->ram_banks[4]);
diff --git a/src/codegen/codegen_ops_mov.h b/src/codegen/codegen_ops_mov.h
index 039489035..eb2a0202c 100644
--- a/src/codegen/codegen_ops_mov.h
+++ b/src/codegen/codegen_ops_mov.h
@@ -152,7 +152,13 @@ ropMOV_b_imm(UNUSED(uint8_t opcode), uint32_t fetchdat, uint32_t op_32, uint32_t
{
if ((fetchdat & 0xc0) == 0xc0) {
STORE_IMM_REG_B(fetchdat & 7, (fetchdat >> 8) & 0xff);
- } else {
+ }
+/* TODO: Fix the recompilation of that specific case so it no longer breaks NT 3.x NTVDM. */
+#ifndef RECOMPILE_MOVB_IMM_MEM_ALWAYS
+ else if (((fetchdat & 0xfc) == 0x80) && (op_32 & 0x200))
+ return 0;
+#endif
+ else {
x86seg *target_seg = FETCH_EA(op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32);
uint32_t imm = fastreadb(cs + op_pc + 1);
int host_reg = LOAD_REG_IMM(imm);
@@ -594,12 +600,12 @@ ropMOV_seg_w(UNUSED(uint8_t opcode), uint32_t fetchdat, uint32_t op_32, uint32_t
MEM_LOAD_ADDR_EA_L(target_seg); \
STORE_HOST_REG_ADDR((uintptr_t) &codegen_temp, 0); \
LOAD_EA(); \
- MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 4); \
+ MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 4, op_32); \
} else { \
MEM_LOAD_ADDR_EA_W(target_seg); \
STORE_HOST_REG_ADDR_W((uintptr_t) &codegen_temp, 0); \
LOAD_EA(); \
- MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 2); \
+ MEM_LOAD_ADDR_EA_W_OFFSET(target_seg, 2, op_32); \
} \
LOAD_SEG(0, &rseg); \
if (op_32 & 0x100) { \
diff --git a/src/codegen/codegen_ops_x86-64.h b/src/codegen/codegen_ops_x86-64.h
index e46f55a05..129d9a740 100644
--- a/src/codegen/codegen_ops_x86-64.h
+++ b/src/codegen/codegen_ops_x86-64.h
@@ -1049,11 +1049,18 @@ MEM_LOAD_ADDR_EA_W(x86seg *seg)
/*done:*/
}
static __inline void
-MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset)
+MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset, int op_32)
{
addbyte(0x83); /*ADD EAX, offset*/
addbyte(0xc0);
addbyte(offset);
+ if (!(op_32 & 0x200)) {
+ addbyte(0x25); /* AND EAX, ffffh */
+ addbyte(0xff);
+ addbyte(0xff);
+ addbyte(0x00);
+ addbyte(0x00);
+ }
MEM_LOAD_ADDR_EA_W(seg);
}
static __inline void
diff --git a/src/codegen/codegen_ops_x86.h b/src/codegen/codegen_ops_x86.h
index c48324c2a..3fbefdeaa 100644
--- a/src/codegen/codegen_ops_x86.h
+++ b/src/codegen/codegen_ops_x86.h
@@ -789,7 +789,7 @@ MEM_LOAD_ADDR_EA_W(x86seg *seg)
host_reg_mapping[0] = 8;
}
static __inline void
-MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset)
+MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset, int op_32)
{
if ((seg == &cpu_state.seg_ds && codegen_flat_ds && !(cpu_cur_status & CPU_STATUS_NOTFLATDS)) || (seg == &cpu_state.seg_ss && codegen_flat_ss && !(cpu_cur_status & CPU_STATUS_NOTFLATSS))) {
addbyte(0x31); /*XOR EDX, EDX*/
@@ -802,6 +802,13 @@ MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset)
addbyte(0x83); /*ADD EAX, offset*/
addbyte(0xc0);
addbyte(offset);
+ if (!(op_32 & 0x200)) {
+ addbyte(0x25); /* AND EAX, ffffh */
+ addbyte(0xff);
+ addbyte(0xff);
+ addbyte(0x00);
+ addbyte(0x00);
+ }
addbyte(0xe8); /*CALL mem_load_addr_ea_w*/
addlong(mem_load_addr_ea_w - (uint32_t) (&codeblock[block_current].data[block_pos + 4]));
diff --git a/src/codegen_new/codegen_backend_arm64_uops.c b/src/codegen_new/codegen_backend_arm64_uops.c
index deaf53c20..82cc79cfd 100644
--- a/src/codegen_new/codegen_backend_arm64_uops.c
+++ b/src/codegen_new/codegen_backend_arm64_uops.c
@@ -931,6 +931,8 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop)
host_arm64_ADD_REG(block, REG_X0, seg_reg, addr_reg, 0);
if (uop->imm_data)
host_arm64_ADD_IMM(block, REG_X0, REG_X0, uop->imm_data);
+ if (uop->is_a16)
+ host_arm64_AND_IMM(block, REG_X0, REG_X0, 0xffff);
if (REG_IS_B(dest_size) || REG_IS_BH(dest_size)) {
host_arm64_call(block, codegen_mem_load_byte);
} else if (REG_IS_W(dest_size)) {
diff --git a/src/codegen_new/codegen_backend_arm_uops.c b/src/codegen_new/codegen_backend_arm_uops.c
index d8c223884..b6963562c 100644
--- a/src/codegen_new/codegen_backend_arm_uops.c
+++ b/src/codegen_new/codegen_backend_arm_uops.c
@@ -995,6 +995,8 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop)
host_arm_ADD_REG(block, REG_R0, seg_reg, addr_reg);
if (uop->imm_data)
host_arm_ADD_IMM(block, REG_R0, REG_R0, uop->imm_data);
+ if (uop->is_a16)
+ host_arm_AND_IMM(block, REG_R0, REG_R0, 0xffff);
if (REG_IS_B(dest_size) || REG_IS_BH(dest_size)) {
host_arm_BL(block, (uintptr_t) codegen_mem_load_byte);
} else if (REG_IS_W(dest_size)) {
diff --git a/src/codegen_new/codegen_backend_x86-64_uops.c b/src/codegen_new/codegen_backend_x86-64_uops.c
index 46af68e75..655896b54 100644
--- a/src/codegen_new/codegen_backend_x86-64_uops.c
+++ b/src/codegen_new/codegen_backend_x86-64_uops.c
@@ -997,8 +997,12 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop)
int dest_size = IREG_GET_SIZE(uop->dest_reg_a_real);
host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg);
- if (uop->imm_data)
+ if (uop->imm_data) {
host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data);
+ if (uop->is_a16) {
+ host_x86_AND32_REG_IMM(block, REG_ESI, 0x0000ffff);
+ }
+ }
if (REG_IS_B(dest_size)) {
host_x86_CALL(block, codegen_mem_load_byte);
} else if (REG_IS_W(dest_size)) {
diff --git a/src/codegen_new/codegen_backend_x86_uops.c b/src/codegen_new/codegen_backend_x86_uops.c
index cd79b9b47..02c441234 100644
--- a/src/codegen_new/codegen_backend_x86_uops.c
+++ b/src/codegen_new/codegen_backend_x86_uops.c
@@ -981,8 +981,12 @@ codegen_MEM_LOAD_REG(codeblock_t *block, uop_t *uop)
int dest_size = IREG_GET_SIZE(uop->dest_reg_a_real);
host_x86_LEA_REG_REG(block, REG_ESI, seg_reg, addr_reg);
- if (uop->imm_data)
+ if (uop->imm_data) {
host_x86_ADD32_REG_IMM(block, REG_ESI, uop->imm_data);
+ if (uop->is_a16) {
+ host_x86_AND32_REG_IMM(block, REG_ESI, 0x0000ffff);
+ }
+ }
if (REG_IS_B(dest_size)) {
host_x86_CALL(block, codegen_mem_load_byte);
} else if (REG_IS_W(dest_size)) {
diff --git a/src/codegen_new/codegen_ir_defs.h b/src/codegen_new/codegen_ir_defs.h
index 9bd2f9afe..d55e57f3d 100644
--- a/src/codegen_new/codegen_ir_defs.h
+++ b/src/codegen_new/codegen_ir_defs.h
@@ -340,6 +340,7 @@ typedef struct uop_t {
void *p;
ir_host_reg_t dest_reg_a_real;
ir_host_reg_t src_reg_a_real, src_reg_b_real, src_reg_c_real;
+ int is_a16;
int jump_dest_uop;
int jump_list_next;
void *jump_dest;
@@ -364,6 +365,8 @@ uop_alloc(ir_data_t *ir, uint32_t uop_type)
uop = &ir->uops[ir->wr_pos++];
+ uop->is_a16 = 0;
+
uop->dest_reg_a = invalid_ir_reg;
uop->src_reg_a = invalid_ir_reg;
uop->src_reg_b = invalid_ir_reg;
@@ -488,8 +491,14 @@ uop_gen_reg_dst_src2_imm(uint32_t uop_type, ir_data_t *ir, int dest_reg, int src
uop_t *uop = uop_alloc(ir, uop_type);
uop->type = uop_type;
+ uop->is_a16 = 0;
uop->src_reg_a = codegen_reg_read(src_reg_a);
- uop->src_reg_b = codegen_reg_read(src_reg_b);
+ if (src_reg_b == IREG_eaa16) {
+ uop->src_reg_b = codegen_reg_read(IREG_eaaddr);
+ uop->is_a16 = 1;
+ } else
+ uop->src_reg_b = codegen_reg_read(src_reg_b);
+ uop->is_a16 = 0;
uop->dest_reg_a = codegen_reg_write(dest_reg, ir->wr_pos - 1);
uop->imm_data = imm;
}
diff --git a/src/codegen_new/codegen_ops_misc.c b/src/codegen_new/codegen_ops_misc.c
index 91e0f5d63..33e01d951 100644
--- a/src/codegen_new/codegen_ops_misc.c
+++ b/src/codegen_new/codegen_ops_misc.c
@@ -533,8 +533,8 @@ ropCWDE(UNUSED(codeblock_t *block), ir_data_t *ir, UNUSED(uint8_t opcode), UNUSE
uop_MOV_IMM(ir, IREG_oldpc, cpu_state.oldpc); \
target_seg = codegen_generate_ea(ir, op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32, 0); \
codegen_check_seg_read(block, ir, target_seg); \
- uop_MEM_LOAD_REG(ir, IREG_temp0_W, ireg_seg_base(target_seg), IREG_eaaddr); \
- uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), IREG_eaaddr, 2); \
+ uop_MEM_LOAD_REG(ir, IREG_temp0_W, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16); \
+ uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16, 2); \
uop_LOAD_SEG(ir, seg, IREG_temp1_W); \
uop_MOV(ir, IREG_16(dest_reg), IREG_temp0_W); \
\
@@ -556,8 +556,8 @@ ropCWDE(UNUSED(codeblock_t *block), ir_data_t *ir, UNUSED(uint8_t opcode), UNUSE
uop_MOV_IMM(ir, IREG_oldpc, cpu_state.oldpc); \
target_seg = codegen_generate_ea(ir, op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32, 0); \
codegen_check_seg_read(block, ir, target_seg); \
- uop_MEM_LOAD_REG(ir, IREG_temp0, ireg_seg_base(target_seg), IREG_eaaddr); \
- uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), IREG_eaaddr, 4); \
+ uop_MEM_LOAD_REG(ir, IREG_temp0, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16); \
+ uop_MEM_LOAD_REG_OFFSET(ir, IREG_temp1_W, ireg_seg_base(target_seg), (op_32 & 0x200) ? IREG_eaaddr : IREG_eaa16, 4); \
uop_LOAD_SEG(ir, seg, IREG_temp1_W); \
uop_MOV(ir, IREG_32(dest_reg), IREG_temp0); \
\
diff --git a/src/codegen_new/codegen_ops_mov.c b/src/codegen_new/codegen_ops_mov.c
index 031d2ea05..f79a959a7 100644
--- a/src/codegen_new/codegen_ops_mov.c
+++ b/src/codegen_new/codegen_ops_mov.c
@@ -296,7 +296,13 @@ ropMOV_b_imm(codeblock_t *block, ir_data_t *ir, UNUSED(uint8_t opcode), uint32_t
imm = fastreadb(cs + op_pc + 1);
uop_MOV_IMM(ir, IREG_8(dest_reg), imm);
- } else {
+ }
+/* TODO: Fix the recompilation of that specific case so it no longer breaks NT 3.x NTVDM. */
+#ifndef RECOMPILE_MOVB_IMM_MEM_ALWAYS
+ else if (((fetchdat & 0xfc) == 0x80) && (op_32 & 0x200))
+ return 0;
+#endif
+ else {
uop_MOV_IMM(ir, IREG_oldpc, cpu_state.oldpc);
target_seg = codegen_generate_ea(ir, op_ea_seg, fetchdat, op_ssegs, &op_pc, op_32, 0);
codegen_check_seg_write(block, ir, target_seg);
diff --git a/src/codegen_new/codegen_reg.c b/src/codegen_new/codegen_reg.c
index a3f000826..de67fde5a 100644
--- a/src/codegen_new/codegen_reg.c
+++ b/src/codegen_new/codegen_reg.c
@@ -169,6 +169,8 @@ struct
[IREG_GS_limit_high] = { REG_DWORD, &cpu_state.seg_gs.limit_high, REG_INTEGER, REG_PERMANENT},
[IREG_SS_limit_high] = { REG_DWORD, &cpu_state.seg_ss.limit_high, REG_INTEGER, REG_PERMANENT},
+ [IREG_eaa16] = { REG_WORD, &cpu_state.eaaddr, REG_INTEGER, REG_PERMANENT},
+
/*Temporary registers are stored on the stack, and are not guaranteed to
be preserved across uOPs. They will not be written back if they will
not be read again.*/
diff --git a/src/codegen_new/codegen_reg.h b/src/codegen_new/codegen_reg.h
index ebb90b42f..fd3cf279a 100644
--- a/src/codegen_new/codegen_reg.h
+++ b/src/codegen_new/codegen_reg.h
@@ -132,7 +132,9 @@ enum {
IREG_GS_limit_high = 86,
IREG_SS_limit_high = 87,
- IREG_COUNT = 88,
+ IREG_eaa16 = 88,
+
+ IREG_COUNT = 89,
IREG_INVALID = 255,
diff --git a/src/config.c b/src/config.c
index 8ff7d548c..6f023cf67 100644
--- a/src/config.c
+++ b/src/config.c
@@ -185,6 +185,8 @@ load_general(void)
p = ini_section_get_string(cat, "language", NULL);
if (p != NULL)
lang_id = plat_language_code(p);
+ else
+ lang_id = 0xffff;
mouse_sensitivity = ini_section_get_double(cat, "mouse_sensitivity", 1.0);
if (mouse_sensitivity < 0.1)
@@ -1840,6 +1842,8 @@ config_load(void)
cassette_pcm = 0;
cassette_ui_writeprot = 0;
+ lang_id = DEFAULT_LANGUAGE;
+
config_log("Config file not present or invalid!\n");
} else {
load_general(); /* General */
diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h
index ec40612ee..83ef4e72b 100644
--- a/src/cpu/386_common.h
+++ b/src/cpu/386_common.h
@@ -277,6 +277,19 @@ int checkio(uint32_t port, int mask);
#define CHECK_WRITE(chseg, low, high) \
CHECK_WRITE_COMMON(chseg, low, high)
+#define CHECK_WRITE_2OP(chseg, low, high, low2, high2) \
+ if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high) || (low2 < (chseg)->limit_low) || (high2 > (chseg)->limit_high) || !((chseg)->access & 2) || ((msw & 1) && !(cpu_state.eflags & VM_FLAG) && ((chseg)->access & 8))) { \
+ x86gpf("Limit check (WRITE)", 0); \
+ return 1; \
+ } \
+ if (msw & 1 && !(cpu_state.eflags & VM_FLAG) && !((chseg)->access & 0x80)) { \
+ if ((chseg) == &cpu_state.seg_ss) \
+ x86ss(NULL, (chseg)->seg & 0xfffc); \
+ else \
+ x86np("Write to seg not present", (chseg)->seg & 0xfffc); \
+ return 1; \
+ }
+
#define CHECK_WRITE_REP(chseg, low, high) \
if ((low < (chseg)->limit_low) || (high > (chseg)->limit_high)) { \
x86gpf("Limit check (WRITE REP)", 0); \
diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index 910d40765..d13dfe041 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -2448,11 +2448,6 @@ cpu_CPUID(void)
EAX = CPUID;
EBX = ECX = 0;
EDX = CPUID_FPU | CPUID_DE | CPUID_TSC | CPUID_MSR | CPUID_CMPXCHG8B | CPUID_CMOV | CPUID_MMX;
- /*
- Return anything non-zero in bits 32-63 of the BIOS signature MSR
- to indicate there has been an update.
- */
- msr.bbl_cr_dx[3] = 0xffffffff00000000ULL;
} else
EAX = EBX = ECX = EDX = 0;
break;
@@ -2467,6 +2462,11 @@ cpu_CPUID(void)
EAX = CPUID;
EBX = ECX = 0;
EDX = CPUID_FPU | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_SEP | CPUID_CMOV;
+ /*
+ Return anything non-zero in bits 32-63 of the BIOS signature MSR
+ to indicate there has been an update.
+ */
+ msr.bbl_cr_dx[3] = 0xffffffff00000000ULL;
} else if (EAX == 2) {
EAX = 0x03020101; /* Instruction TLB: 4 KB pages, 4-way set associative, 32 entries
Instruction TLB: 4 MB pages, fully associative, 2 entries
@@ -2649,6 +2649,12 @@ cpu_ven_reset(void)
case CPU_PENTIUM2:
case CPU_PENTIUM2D:
msr.mtrr_cap = 0x00000508ULL;
+
+ /* 4 GB cacheable space on Deschutes 651h and later (including the 1632h
+ Overdrive) according to the Pentium II Processor Specification Update.
+ Covington 651h (no L2 cache) reports the same 512 MB value as Klamath. */
+ if (CPUID >= (!strncmp(cpu_f->internal_name, "celeron", 7) ? 0x660 : 0x651))
+ msr.bbl_cr_ctl3 |= 0x00300000;
break;
case CPU_CYRIX3S:
@@ -3295,7 +3301,6 @@ pentium_invalid_rdmsr:
case 0x88 ... 0x8b:
EAX = msr.bbl_cr_dx[ECX - 0x88] & 0xffffffff;
EDX = msr.bbl_cr_dx[ECX - 0x88] >> 32;
- // EDX |= 0xffffffff;
break;
/* Unknown */
case 0xae:
@@ -4103,7 +4108,7 @@ pentium_invalid_wrmsr:
break;
/* BBL_CR_CTL3 - L2 Cache Control Register 3 */
case 0x11e:
- msr.bbl_cr_ctl3 = EAX | ((uint64_t) EDX << 32);
+ msr.bbl_cr_ctl3 = (msr.bbl_cr_ctl3 & 0x02f00000) | (EAX & ~0x02f00000) | ((uint64_t) EDX << 32);
break;
/* Unknown */
case 0x131:
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index 80097294d..0e49704fd 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -335,7 +335,10 @@ typedef struct {
uint8_t tag[8];
x86seg *ea_seg;
- uint32_t eaaddr;
+ union {
+ uint32_t eaaddr;
+ uint16_t eaa16[2];
+ };
int flags_op;
uint32_t flags_res;
diff --git a/src/cpu/x86_ops_mov_seg.h b/src/cpu/x86_ops_mov_seg.h
index 7fcc92312..f5bd02923 100644
--- a/src/cpu/x86_ops_mov_seg.h
+++ b/src/cpu/x86_ops_mov_seg.h
@@ -272,9 +272,13 @@ opLDS_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
SEG_CHECK_READ(cpu_state.ea_seg);
- CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3);
- addr = readmemw(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 2);
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
+ addr = readmemw(easeg, cpu_state.eaa16[0]);
+ if (cpu_state.abrt)
+ return 1;
+ cpu_state.eaa16[0] += 2;
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
+ seg = readmemw(easeg, cpu_state.eaa16[0]);
if (cpu_state.abrt)
return 1;
op_loadseg(seg, &cpu_state.seg_ds);
@@ -318,9 +322,13 @@ opLDS_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
SEG_CHECK_READ(cpu_state.ea_seg);
- CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5);
- addr = readmeml(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 4);
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff));
+ addr = readmeml(easeg, cpu_state.eaa16[0]);
+ if (cpu_state.abrt)
+ return 1;
+ cpu_state.eaa16[0] += 4;
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
+ seg = readmemw(easeg, cpu_state.eaa16[0]);
if (cpu_state.abrt)
return 1;
op_loadseg(seg, &cpu_state.seg_ds);
@@ -365,9 +373,13 @@ opLSS_w_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
SEG_CHECK_READ(cpu_state.ea_seg);
- CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3);
- addr = readmemw(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 2);
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
+ addr = readmemw(easeg, cpu_state.eaa16[0]);
+ if (cpu_state.abrt)
+ return 1;
+ cpu_state.eaa16[0] += 2;
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
+ seg = readmemw(easeg, cpu_state.eaa16[0]);
if (cpu_state.abrt)
return 1;
op_loadseg(seg, &cpu_state.seg_ss);
@@ -411,9 +423,13 @@ opLSS_l_a16(uint32_t fetchdat)
fetch_ea_16(fetchdat);
ILLEGAL_ON(cpu_mod == 3);
SEG_CHECK_READ(cpu_state.ea_seg);
- CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5);
- addr = readmeml(easeg, cpu_state.eaaddr);
- seg = readmemw(easeg, cpu_state.eaaddr + 4);
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff));
+ addr = readmeml(easeg, cpu_state.eaa16[0]);
+ if (cpu_state.abrt)
+ return 1;
+ cpu_state.eaa16[0] += 4;
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff));
+ seg = readmemw(easeg, cpu_state.eaa16[0]);
if (cpu_state.abrt)
return 1;
op_loadseg(seg, &cpu_state.seg_ss);
@@ -457,9 +473,13 @@ opLSS_l_a32(uint32_t fetchdat)
fetch_ea_16(fetchdat); \
SEG_CHECK_READ(cpu_state.ea_seg); \
ILLEGAL_ON(cpu_mod == 3); \
- CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 3); \
- addr = readmemw(easeg, cpu_state.eaaddr); \
- seg = readmemw(easeg, cpu_state.eaaddr + 2); \
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \
+ addr = readmemw(easeg, cpu_state.eaa16[0]); \
+ if (cpu_state.abrt) \
+ return 1; \
+ cpu_state.eaa16[0] += 2; \
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \
+ seg = readmemw(easeg, cpu_state.eaa16[0]); \
if (cpu_state.abrt) \
return 1; \
op_loadseg(seg, &sel); \
@@ -502,9 +522,13 @@ opLSS_l_a32(uint32_t fetchdat)
fetch_ea_16(fetchdat); \
SEG_CHECK_READ(cpu_state.ea_seg); \
ILLEGAL_ON(cpu_mod == 3); \
- CHECK_READ(cpu_state.ea_seg, cpu_state.eaaddr, cpu_state.eaaddr + 5); \
- addr = readmeml(easeg, cpu_state.eaaddr); \
- seg = readmemw(easeg, cpu_state.eaaddr + 4); \
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 3) & 0xffff)); \
+ addr = readmeml(easeg, cpu_state.eaa16[0]); \
+ if (cpu_state.abrt) \
+ return 1; \
+ cpu_state.eaa16[0] += 4; \
+ CHECK_READ(cpu_state.ea_seg, cpu_state.eaa16[0], ((cpu_state.eaa16[0] + 1) & 0xffff)); \
+ seg = readmemw(easeg, cpu_state.eaa16[0]); \
if (cpu_state.abrt) \
return 1; \
op_loadseg(seg, &sel); \
diff --git a/src/cpu/x86_ops_ret.h b/src/cpu/x86_ops_ret.h
index 935fb5aa0..8bf72e9ed 100644
--- a/src/cpu/x86_ops_ret.h
+++ b/src/cpu/x86_ops_ret.h
@@ -15,7 +15,7 @@
op_loadcs(readmemw(ss, ESP + 2)); \
} else { \
cpu_state.pc = readmemw(ss, SP); \
- op_loadcs(readmemw(ss, SP + 2)); \
+ op_loadcs(readmemw(ss, (SP + 2) & 0xffff)); \
} \
if (cpu_state.abrt) \
return 1; \
diff --git a/src/cpu/x86_ops_ret_2386.h b/src/cpu/x86_ops_ret_2386.h
index 155925dfe..02233fd1d 100644
--- a/src/cpu/x86_ops_ret_2386.h
+++ b/src/cpu/x86_ops_ret_2386.h
@@ -15,7 +15,7 @@
op_loadcs(readmemw(ss, ESP + 2)); \
} else { \
cpu_state.pc = readmemw(ss, SP); \
- op_loadcs(readmemw(ss, SP + 2)); \
+ op_loadcs(readmemw(ss, (SP + 2) & 0xffff)); \
} \
if (cpu_state.abrt) \
return 1; \
diff --git a/src/device/bugger.c b/src/device/bugger.c
index b56937a43..6a30df7be 100644
--- a/src/device/bugger.c
+++ b/src/device/bugger.c
@@ -84,7 +84,10 @@ static uint8_t bug_spcfg; /* serial port configuration */
#define FIFO_LEN 256
static uint8_t bug_buff[FIFO_LEN]; /* serial port data buffer */
static uint8_t *bug_bptr;
-#define UISTR_LEN 24
+
+static char LED_R[] = "R";
+static char LED_G[] = "G";
+#define UISTR_LEN (17 + 8 * sizeof(LED_G) + 8 * sizeof(LED_R))
static char bug_str[UISTR_LEN]; /* UI output string */
extern void ui_sb_bugui(char *__str);
@@ -112,16 +115,16 @@ static void
bug_setui(void)
{
/* Format all current info in a string. */
- sprintf(bug_str, "%02X:%02X %c%c%c%c%c%c%c%c-%c%c%c%c%c%c%c%c",
+ sprintf(bug_str, "%02X:%02X %s%s%s%s%s%s%s%s-%s%s%s%s%s%s%s%s",
bug_seg2, bug_seg1,
- (bug_ledg & 0x80) ? 'G' : 'g', (bug_ledg & 0x40) ? 'G' : 'g',
- (bug_ledg & 0x20) ? 'G' : 'g', (bug_ledg & 0x10) ? 'G' : 'g',
- (bug_ledg & 0x08) ? 'G' : 'g', (bug_ledg & 0x04) ? 'G' : 'g',
- (bug_ledg & 0x02) ? 'G' : 'g', (bug_ledg & 0x01) ? 'G' : 'g',
- (bug_ledr & 0x80) ? 'R' : 'r', (bug_ledr & 0x40) ? 'R' : 'r',
- (bug_ledr & 0x20) ? 'R' : 'r', (bug_ledr & 0x10) ? 'R' : 'r',
- (bug_ledr & 0x08) ? 'R' : 'r', (bug_ledr & 0x04) ? 'R' : 'r',
- (bug_ledr & 0x02) ? 'R' : 'r', (bug_ledr & 0x01) ? 'R' : 'r');
+ (bug_ledg & 0x80) ? LED_G : "g", (bug_ledg & 0x40) ? LED_G : "g",
+ (bug_ledg & 0x20) ? LED_G : "g", (bug_ledg & 0x10) ? LED_G : "g",
+ (bug_ledg & 0x08) ? LED_G : "g", (bug_ledg & 0x04) ? LED_G : "g",
+ (bug_ledg & 0x02) ? LED_G : "g", (bug_ledg & 0x01) ? LED_G : "g",
+ (bug_ledr & 0x80) ? LED_R : "r", (bug_ledr & 0x40) ? LED_R : "r",
+ (bug_ledr & 0x20) ? LED_R : "r", (bug_ledr & 0x10) ? LED_R : "r",
+ (bug_ledr & 0x08) ? LED_R : "r", (bug_ledr & 0x04) ? LED_R : "r",
+ (bug_ledr & 0x02) ? LED_R : "r", (bug_ledr & 0x01) ? LED_R : "r");
/* Send formatted string to the UI. */
ui_sb_bugui(bug_str);
diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c
index abb10d108..f8fd33e62 100644
--- a/src/device/kbc_at.c
+++ b/src/device/kbc_at.c
@@ -1070,10 +1070,14 @@ write64_generic(void *priv, uint8_t val)
fixed_bits |= 8;
/* (B0 or F0) | (0x04 or 0x0c) */
kbc_delay_to_ob(dev, dev->p1 | fixed_bits, 0, 0x00);
- } else if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_GREEN))
+ } else if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_GREEN)) {
/* (B0 or F0) | (0x08 or 0x0c) */
- kbc_delay_to_ob(dev, ((dev->p1 | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00);
- else if (kbc_ven == KBC_VEN_COMPAQ)
+ uint8_t p1_out = ((dev->p1 | fixed_bits) & 0xf0) |
+ (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c);
+ if (!strcmp(machine_get_internal_name(), "alfredo"))
+ p1_out &= 0xef;
+ kbc_delay_to_ob(dev, p1_out, 0, 0x00);
+ } else if (kbc_ven == KBC_VEN_COMPAQ)
kbc_delay_to_ob(dev, dev->p1 | (hasfpu ? 0x00 : 0x04), 0, 0x00);
else
/* (B0 or F0) | (0x04 or 0x44) */
@@ -1578,8 +1582,13 @@ write64_phoenix(void *priv, uint8_t val)
case 0xd5: /* Read MultiKey code revision level */
kbc_at_log("ATkbc: Phoenix - Read MultiKey code revision level\n");
if (dev->misc_flags & FLAG_PS2) {
- kbc_at_queue_add(dev, 0x04);
- kbc_at_queue_add(dev, 0x16);
+ if (dev->flags & DEVICE_PCI) {
+ kbc_at_queue_add(dev, 0x04);
+ kbc_at_queue_add(dev, 0x16);
+ } else {
+ kbc_at_queue_add(dev, 0x01);
+ kbc_at_queue_add(dev, 0x38);
+ }
} else {
kbc_at_queue_add(dev, 0x01);
kbc_at_queue_add(dev, 0x29);
@@ -1598,9 +1607,15 @@ write64_phoenix(void *priv, uint8_t val)
case 0xd7: /* Read MultiKey model numbers */
kbc_at_log("ATkbc: Phoenix - Read MultiKey model numbers\n");
if (dev->misc_flags & FLAG_PS2) {
- kbc_at_queue_add(dev, 0x02);
- kbc_at_queue_add(dev, 0x87);
- kbc_at_queue_add(dev, 0x02);
+ if (dev->flags & DEVICE_PCI) {
+ kbc_at_queue_add(dev, 0x02);
+ kbc_at_queue_add(dev, 0x87);
+ kbc_at_queue_add(dev, 0x02);
+ } else {
+ kbc_at_queue_add(dev, 0x99);
+ kbc_at_queue_add(dev, 0x75);
+ kbc_at_queue_add(dev, 0x01);
+ }
} else {
kbc_at_queue_add(dev, 0x90);
kbc_at_queue_add(dev, 0x88);
@@ -2608,6 +2623,20 @@ const device_t keyboard_ps2_ami_device = {
.config = NULL
};
+const device_t keyboard_ps2_compaq_device = {
+ .name = "PS/2 Keyboard (Compaq)",
+ .internal_name = "keyboard_at_compaq",
+ .flags = DEVICE_KBC,
+ .local = KBC_TYPE_PS2_1 | KBC_VEN_COMPAQ,
+ .init = kbc_at_init,
+ .close = kbc_at_close,
+ .reset = kbc_at_reset,
+ .available = NULL,
+ .speed_changed = NULL,
+ .force_redraw = NULL,
+ .config = NULL
+};
+
const device_t keyboard_ps2_holtek_device = {
.name = "PS/2 Keyboard (Holtek)",
.internal_name = "keyboard_ps2_holtek",
@@ -2775,3 +2804,17 @@ const device_t keyboard_ps2_acer_pci_device = {
.force_redraw = NULL,
.config = NULL
};
+
+const device_t keyboard_ps2_phoenix_pci_device = {
+ .name = "PS/2 Keyboard (Phoenix)",
+ .internal_name = "keyboard_ps2_acer_pci",
+ .flags = DEVICE_KBC | DEVICE_PCI,
+ .local = KBC_TYPE_PS2_1 | KBC_VEN_PHOENIX,
+ .init = kbc_at_init,
+ .close = kbc_at_close,
+ .reset = kbc_at_reset,
+ .available = NULL,
+ .speed_changed = NULL,
+ .force_redraw = NULL,
+ .config = NULL
+};
diff --git a/src/device/serial.c b/src/device/serial.c
index 8483f7fe3..deb97225a 100644
--- a/src/device/serial.c
+++ b/src/device/serial.c
@@ -999,8 +999,7 @@ void
serial_standalone_init(void)
{
while (next_inst < SERIAL_MAX)
- device_add_inst(!strcmp(machine_get_internal_name(), "if386sx") ? &ns16450_device :
- &ns8250_device, next_inst + 1);
+ device_add_inst(&ns8250_device, next_inst + 1);
};
const device_t ns8250_device = {
diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c
index 01690cd70..04e580e72 100644
--- a/src/disk/hdc_ide.c
+++ b/src/disk/hdc_ide.c
@@ -1208,7 +1208,9 @@ ide_atapi_pio_request(ide_t *ide, uint8_t out)
ide->tf->atastat = BSY_STAT;
if (ide->tf->pos >= dev->packet_len) {
- ide_log("%i bytes %s, command done\n", ide->tf->pos, out ? "written" : "read");
+ // ide_log("%i bytes %s, command done\n", ide->tf->pos, out ? "written" : "read");
+ ide_log("%i bytes %s, command done, %i sectors left\n", ide->tf->pos, out ? "written" : "read",
+ dev->sector_len);
ide->tf->pos = dev->request_pos = 0;
@@ -1262,13 +1264,12 @@ ide_atapi_pio_request(ide_t *ide, uint8_t out)
ide_atapi_callback(ide);
ide_set_callback(ide, 0.0);
} else {
- ide->sc->packet_status = PHASE_COMPLETE;
- ide->sc->callback = 0.0;
-
if (ide->phase_data_out != NULL)
(void) ide->phase_data_out(dev);
- ide_atapi_callback(ide);
+ if ((ide->sc->packet_status == PHASE_COMPLETE) &&
+ (ide->sc->callback == 0.0))
+ ide_atapi_callback(ide);
}
}
} else {
@@ -1280,10 +1281,9 @@ ide_atapi_pio_request(ide_t *ide, uint8_t out)
if (ide->command_stop != NULL)
ide->command_stop(dev);
- ide->sc->packet_status = PHASE_COMPLETE;
- ide->sc->callback = 0.0;
-
- ide_atapi_callback(ide);
+ if ((ide->sc->packet_status == PHASE_COMPLETE) &&
+ (ide->sc->callback == 0.0))
+ ide_atapi_callback(ide);
}
} else if (ide->read != NULL)
ide->read(dev);
@@ -1299,8 +1299,8 @@ ide_atapi_packet_read(ide_t *ide)
uint16_t ret = 0;
if (dev && dev->temp_buffer && (dev->packet_status == PHASE_DATA_IN)) {
- ide_log("PHASE_DATA_IN read: %i, %i, %i, %i\n",
- dev->request_pos, dev->max_transfer_len, ide->tf->pos, dev->packet_len);
+ /* ide_log("PHASE_DATA_IN read: %i, %i, %i, %i\n",
+ dev->request_pos, dev->max_transfer_len, ide->tf->pos, dev->packet_len); */
bufferw = (uint16_t *) dev->temp_buffer;
@@ -1722,7 +1722,8 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
break;
case 0x7: /* Command register */
- if (ide->tf->atastat & (BSY_STAT | DRQ_STAT))
+ if ((ide->tf->atastat & (BSY_STAT | DRQ_STAT)) &&
+ ((val != WIN_SRST) || (ide->type != IDE_ATAPI)))
break;
if ((ide->type == IDE_NONE) || ((ide->type & IDE_SHADOW) && (val != WIN_DRIVE_DIAGNOSTICS)))
@@ -2158,7 +2159,8 @@ ide_read_alt_status(UNUSED(const uint16_t addr), void *priv)
if (!(addr & 0x0001))
ret = ide_status(ide, ide_drives[ch ^ 1], ch);
- ide_log("[%04X:%08X] ide_read_alt_status(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret);
+ // ide_log("[%04X:%08X] ide_read_alt_status(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret);
+ // ide_log("ide_read_alt_status(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret);
return ret;
}
@@ -3159,6 +3161,13 @@ ide_init(const device_t *info)
ide_board_init(1, HDC_SECONDARY_IRQ, HDC_SECONDARY_BASE, HDC_SECONDARY_SIDE, info->local, info->flags);
break;
+ case 8 ... 0x0d:
+ ide_board_init(2, -1, 0, 0, info->local, info->flags);
+
+ if (info->local & 1)
+ ide_board_init(3, -1, 0, 0, info->local, info->flags);
+ break;
+
default:
break;
}
@@ -3540,7 +3549,7 @@ const device_t mcide_device = {
.name = "MCA McIDE Controller",
.internal_name = "ide_mcide",
.flags = DEVICE_MCA,
- .local = 3,
+ .local = 1,
.init = mcide_init,
.close = mcide_close,
.reset = mcide_reset,
@@ -3661,3 +3670,17 @@ const device_t ide_qua_pnp_device = {
.force_redraw = NULL,
.config = NULL
};
+
+const device_t ide_pci_ter_qua_2ch_device = {
+ .name = "PCI IDE Controller (Dual-Channel Tertiary/Quaternary)",
+ .internal_name = "ide_pci_ter_qua_2ch",
+ .flags = DEVICE_PCI,
+ .local = 0x0d,
+ .init = ide_init,
+ .close = ide_close,
+ .reset = ide_reset,
+ .available = NULL,
+ .speed_changed = NULL,
+ .force_redraw = NULL,
+ .config = NULL
+};
diff --git a/src/disk/hdd.c b/src/disk/hdd.c
index 8292dc472..e051cc841 100644
--- a/src/disk/hdd.c
+++ b/src/disk/hdd.c
@@ -407,14 +407,14 @@ hdd_zones_init(hard_disk_t *hdd)
static hdd_preset_t hdd_speed_presets[] = {
// clang-format off
- { .name = "RAM Disk (max. speed)", .internal_name = "ramdisk", .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 },
- { .name = "[1989] 3500 RPM", .internal_name = "1989_3500rpm", .zones = 1, .avg_spt = 35, .heads = 2, .rpm = 3500, .full_stroke_ms = 40, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 16, .max_multiple = 8 },
- { .name = "[1992] 3600 RPM", .internal_name = "1992_3600rpm", .zones = 1, .avg_spt = 45, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 6, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 },
- { .name = "[1994] 4500 RPM", .internal_name = "1994_4500rpm", .zones = 8, .avg_spt = 80, .heads = 4, .rpm = 4500, .full_stroke_ms = 26, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 16 },
- { .name = "[1996] 5400 RPM", .internal_name = "1996_5400rpm", .zones = 16, .avg_spt = 135, .heads = 4, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 },
- { .name = "[1997] 5400 RPM", .internal_name = "1997_5400rpm", .zones = 16, .avg_spt = 185, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 32 },
- { .name = "[1998] 5400 RPM", .internal_name = "1998_5400rpm", .zones = 16, .avg_spt = 300, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 },
- { .name = "[2000] 7200 RPM", .internal_name = "2000_7200rpm", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 },
+ { .name = "[Generic] RAM Disk (max. speed)", .internal_name = "ramdisk", .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 },
+ { .name = "[Generic] 1989 (3500 RPM)", .internal_name = "1989_3500rpm", .zones = 1, .avg_spt = 35, .heads = 2, .rpm = 3500, .full_stroke_ms = 40, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 16, .max_multiple = 8 },
+ { .name = "[Generic] 1992 (3600 RPM)", .internal_name = "1992_3600rpm", .zones = 1, .avg_spt = 45, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 6, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 },
+ { .name = "[Generic] 1994 (4500 RPM)", .internal_name = "1994_4500rpm", .zones = 8, .avg_spt = 80, .heads = 4, .rpm = 4500, .full_stroke_ms = 26, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 16 },
+ { .name = "[Generic] 1996 (5400 RPM)", .internal_name = "1996_5400rpm", .zones = 16, .avg_spt = 135, .heads = 4, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 },
+ { .name = "[Generic] 1997 (5400 RPM)", .internal_name = "1997_5400rpm", .zones = 16, .avg_spt = 185, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 32 },
+ { .name = "[Generic] 1998 (5400 RPM)", .internal_name = "1998_5400rpm", .zones = 16, .avg_spt = 300, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 },
+ { .name = "[Generic] 2000 (7200 RPM)", .internal_name = "2000_7200rpm", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 },
{ .name = "[PIO IDE] IBM WDA-L42", .internal_name = "WDAL42", .model = "WDA-L42", .zones = 1, .avg_spt = 85, .heads = 2, .rpm = 3600, .full_stroke_ms = 33, .track_seek_ms = 2.5, .rcache_num_seg = 1, .rcache_seg_size = 32, .max_multiple = 1 },
{ .name = "[ATA-1] Conner CP3024", .internal_name = "CP3024", .model = "Conner Peripherals 20MB - CP3024", .zones = 1, .avg_spt = 33, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work
{ .name = "[ATA-1] Conner CP3044", .internal_name = "CP3044", .model = "Conner Peripherals 40MB - CP3044", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work
@@ -469,7 +469,7 @@ static hdd_preset_t hdd_speed_presets[] = {
{ .name = "[ATA-2] Western Digital Caviar 22000", .internal_name = "AC22000", .model = "WDC AC22000LA", .zones = 8, .avg_spt = 130, .heads = 3, .rpm = 5200, .full_stroke_ms = 33, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 },
{ .name = "[ATA-2] Western Digital Caviar 22100", .internal_name = "AC22100", .model = "WDC AC22100H", .zones = 8, .avg_spt = 140, .heads = 4, .rpm = 5200, .full_stroke_ms = 30, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },
{ .name = "[ATA-2] Western Digital Caviar 31200", .internal_name = "AC31200", .model = "WDC AC31200F", .zones = 8, .avg_spt = 210, .heads = 4, .rpm = 4500, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 16 },
- { .name = "[ATA-3] Connor CFS1275A", .internal_name = "CFS1275A", .model = "Connor Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3
+ { .name = "[ATA-3] Conner CFS1275A", .internal_name = "CFS1275A", .model = "Conner Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3
{ .name = "[ATA-3] Fujitsu MPA3017AT", .internal_name = "MPA3017AT", .model = "FUJITSU MPA3017AT", .zones = 5, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },
{ .name = "[ATA-3] Fujitsu MPA3026AT", .internal_name = "MPA3026AT", .model = "FUJITSU MPA3026AT", .zones = 8, .avg_spt = 195, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },
{ .name = "[ATA-3] Fujitsu MPA3035AT", .internal_name = "MPA3035AT", .model = "FUJITSU MPA3035AT", .zones = 11, .avg_spt = 195, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },
diff --git a/src/disk/mo.c b/src/disk/mo.c
index f1cd3b983..a20333404 100644
--- a/src/disk/mo.c
+++ b/src/disk/mo.c
@@ -584,7 +584,10 @@ mo_data_command_finish(mo_t *dev, int len, const int block_len,
mo_command_write_dma(dev);
} else {
mo_update_request_length(dev, len, block_len);
- if (direction == 0)
+ if ((dev->drv->bus_type != MO_BUS_SCSI) &&
+ (dev->tf->request_length == 0))
+ mo_command_complete(dev);
+ else if (direction == 0)
mo_command_read(dev);
else
mo_command_write(dev);
diff --git a/src/disk/zip.c b/src/disk/zip.c
index eecafb802..7a407c5fe 100644
--- a/src/disk/zip.c
+++ b/src/disk/zip.c
@@ -665,7 +665,10 @@ zip_data_command_finish(zip_t *dev, int len, const int block_len,
zip_command_write_dma(dev);
} else {
zip_update_request_length(dev, len, block_len);
- if (direction == 0)
+ if ((dev->drv->bus_type != ZIP_BUS_SCSI) &&
+ (dev->tf->request_length == 0))
+ zip_command_complete(dev);
+ else if (direction == 0)
zip_command_read(dev);
else
zip_command_write(dev);
diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c
index 51c3aa24a..1f49b192a 100644
--- a/src/floppy/fdc.c
+++ b/src/floppy/fdc.c
@@ -79,6 +79,8 @@ int floppyrate[4];
int fdc_current[FDC_MAX] = { 0, 0 };
+volatile int fdcinited = 0;
+
#ifdef ENABLE_FDC_LOG
int fdc_do_log = ENABLE_FDC_LOG;
@@ -2268,10 +2270,21 @@ fdc_reset(void *priv)
fdc_update_rwc(fdc, 1, default_rwc);
fdc_update_rwc(fdc, 2, default_rwc);
fdc_update_rwc(fdc, 3, default_rwc);
- fdc_update_drvrate(fdc, 0, 0);
- fdc_update_drvrate(fdc, 1, 0);
- fdc_update_drvrate(fdc, 2, 0);
- fdc_update_drvrate(fdc, 3, 0);
+ /*
+ The OKI IF386SX natively supports the Japanese 1.25 MB floppy format,
+ since it can read such images just fine, it also attempts to use data
+ rate 01 on a 3.5" MB drive (which is the only kind it can physically
+ take, anyway), and rate 01 on a 3.5" MB drive is usually used by 3-mode
+ drives to switch to 360 RPM. Hence why I'm switching DRVDEN to 1, so
+ rate 01 becomes 500 kbps, so on a 3-mode 3.5" drive, 1.25 MB floppies
+ can be read. The side effect is that to read 5.25" 360k drives, you
+ need to use a dual-RPM 5.25" drive - but hey, that finally gets those
+ drives some usage as well.
+ */
+ fdc_update_drvrate(fdc, 0, !strcmp(machine_get_internal_name(), "if386sx"));
+ fdc_update_drvrate(fdc, 1, !strcmp(machine_get_internal_name(), "if386sx"));
+ fdc_update_drvrate(fdc, 2, !strcmp(machine_get_internal_name(), "if386sx"));
+ fdc_update_drvrate(fdc, 3, !strcmp(machine_get_internal_name(), "if386sx"));
fdc_update_drv2en(fdc, 1);
fdc_update_rates(fdc);
@@ -2337,6 +2350,8 @@ fdc_close(void *priv)
fifo_close(fdc->fifo_p);
+ fdcinited = 0;
+
free(fdc);
}
@@ -2382,6 +2397,8 @@ fdc_init(const device_t *info)
fdc_reset(fdc);
+ fdcinited = 1;
+
return fdc;
}
diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c
index f5626e35b..0a7120b16 100644
--- a/src/floppy/fdd_86f.c
+++ b/src/floppy/fdd_86f.c
@@ -3452,6 +3452,7 @@ d86f_common_handlers(int drive)
drives[drive].poll = d86f_poll;
drives[drive].format = d86f_proxy_format;
drives[drive].stop = d86f_stop;
+ drives[drive].hole = d86f_hole;
}
int
diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h
index 61de69cf3..ddca937f1 100644
--- a/src/include/86box/86box.h
+++ b/src/include/86box/86box.h
@@ -45,7 +45,7 @@
#define MAX_UUID_LEN 64
/* Default language 0xFFFF = from system, 0x409 = en-US */
-#define DEFAULT_LANGUAGE 0x0409
+#define DEFAULT_LANGUAGE 0xffff
#define POSTCARDS_NUM 4
#define POSTCARD_MASK (POSTCARDS_NUM - 1)
diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h
index 9142fbfe1..e495cb0df 100644
--- a/src/include/86box/keyboard.h
+++ b/src/include/86box/keyboard.h
@@ -245,6 +245,7 @@ extern const device_t keyboard_ps2_ps1_device;
extern const device_t keyboard_ps2_ps1_pci_device;
extern const device_t keyboard_ps2_xi8088_device;
extern const device_t keyboard_ps2_ami_device;
+extern const device_t keyboard_ps2_compaq_device;
extern const device_t keyboard_ps2_holtek_device;
extern const device_t keyboard_ps2_mca_1_device;
extern const device_t keyboard_ps2_mca_2_device;
@@ -258,6 +259,7 @@ extern const device_t keyboard_ps2_ami_pci_device;
extern const device_t keyboard_ps2_intel_ami_pci_device;
extern const device_t keyboard_ps2_acer_pci_device;
extern const device_t keyboard_ps2_ali_pci_device;
+extern const device_t keyboard_ps2_phoenix_pci_device;
extern const device_t keyboard_ps2_tg_ami_pci_device;
extern const device_t keyboard_at_generic_device;
@@ -284,6 +286,7 @@ extern int keyboard_isfsexit_up(void);
extern int keyboard_ismsexit(void);
extern void keyboard_set_is_amstrad(int ams);
extern void kbc_at_set_ps2(void *priv, uint8_t ps2);
+extern void kbc_at_write_p(void *priv, uint8_t port, uint8_t mask, uint8_t val);
extern void kbc_at_set_fast_reset(uint8_t new_fast_reset);
extern void kbc_at_handler(int set, void *priv);
diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h
index 16ccb2720..5a552d6eb 100644
--- a/src/include/86box/machine.h
+++ b/src/include/86box/machine.h
@@ -441,6 +441,8 @@ extern int machine_at_ibmatquadtel_init(const machine_t *); // IBM AT with Quadt
extern int machine_at_ibmxt286_init(const machine_t *);
+extern int machine_at_pb286_init(const machine_t *);
+
extern int machine_at_siemens_init(const machine_t *); // Siemens PCD-2L. N82330 discrete machine. It segfaults in some places
extern int machine_at_wellamerastar_init(const machine_t *); // Wells American A*Star with custom award BIOS
diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h
index 81b46b2fa..f8d0f659a 100644
--- a/src/include/86box/mem.h
+++ b/src/include/86box/mem.h
@@ -459,6 +459,7 @@ extern void mem_a20_recalc(void);
extern void mem_init(void);
extern void mem_close(void);
+extern void mem_zero(void);
extern void mem_reset(void);
extern void mem_remap_top_ex(int kb, uint32_t start);
extern void mem_remap_top_ex_nomid(int kb, uint32_t start);
diff --git a/src/include/86box/scsi_cdrom.h b/src/include/86box/scsi_cdrom.h
index 7bb39d9db..c01f347a8 100644
--- a/src/include/86box/scsi_cdrom.h
+++ b/src/include/86box/scsi_cdrom.h
@@ -70,6 +70,7 @@ typedef struct scsi_cdrom_t {
int was_cached;
int toc_cached;
int media_access;
+ int sectors_num;
uint8_t vendor_type;
uint8_t ven_cmd_is_data[256];
diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h
index 62da8b7dc..289201b04 100644
--- a/src/include/86box/scsi_device.h
+++ b/src/include/86box/scsi_device.h
@@ -467,9 +467,10 @@ typedef struct scsi_bus_t {
int msgout_pos;
int is_msgout;
int state;
- int dma_on_pio_enabled;
uint32_t bus_phase;
+ uint32_t total_len;
+ uint32_t data_repeat;
double period;
double speed;
diff --git a/src/include/86box/scsi_t128.h b/src/include/86box/scsi_t128.h
index 65148a5d1..a3bc79335 100644
--- a/src/include/86box/scsi_t128.h
+++ b/src/include/86box/scsi_t128.h
@@ -30,7 +30,7 @@ typedef struct t128_t {
uint8_t status;
uint8_t buffer[512];
uint8_t ext_ram[0x80];
- uint8_t block_count;
+ uint32_t block_count;
int block_loaded;
int pos, host_pos;
@@ -39,6 +39,7 @@ typedef struct t128_t {
int bios_enabled;
uint8_t pos_regs[8];
+ int type;
pc_timer_t timer;
} t128_t;
diff --git a/src/include/86box/snd_cms.h b/src/include/86box/snd_cms.h
index 8eec22935..8201fe32c 100644
--- a/src/include/86box/snd_cms.h
+++ b/src/include/86box/snd_cms.h
@@ -7,23 +7,20 @@
#define MASTER_CLOCK 7159090
typedef struct cms_t {
- int addrs[2];
- uint8_t regs[2][32];
- uint16_t latch[2][6];
- int freq[2][6];
- float count[2][6];
- int vol[2][6][2];
- int stat[2][6];
- uint16_t noise[2][2];
- uint16_t noisefreq[2][2];
- int noisecount[2][2];
- int noisetype[2][2];
+#ifdef SAASOUND_H_INCLUDED
+ SAASND saasound;
+ SAASND saasound2;
+#else
+ void* saasound;
+ void* saasound2;
+#endif
uint8_t latched_data;
- int16_t buffer[SOUNDBUFLEN * 2];
+ int16_t buffer[WTBUFLEN * 2];
+ int16_t buffer2[WTBUFLEN * 2];
- int pos;
+ int pos, pos2;
} cms_t;
extern void cms_update(cms_t *cms);
diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h
index 153bface4..7694a028a 100644
--- a/src/include/86box/vid_8514a.h
+++ b/src/include/86box/vid_8514a.h
@@ -92,8 +92,8 @@ typedef struct ibm8514_t {
uint16_t advfunc_cntl;
uint16_t cur_y;
uint16_t cur_x;
- uint16_t destx;
- uint16_t desty;
+ int16_t destx;
+ int16_t desty;
int16_t desty_axstp;
int16_t destx_distp;
int16_t err_term;
@@ -250,4 +250,9 @@ typedef struct ibm8514_t {
} ibm8514_t;
+#define IBM_8514A (((dev->local & 0xff) == 0x00) && (dev->extensions == 0x00))
+#define ATI_8514A_ULTRA (((dev->local & 0xff) == 0x00) && (dev->extensions == 0x01))
+#define ATI_GRAPHICS_ULTRA ((dev->local & 0xff) == 0x01)
+#define ATI_MACH32 ((dev->local & 0xff) == 0x02)
+
#endif /*VIDEO_8514A_H*/
diff --git a/src/include/86box/vid_ati_mach8.h b/src/include/86box/vid_ati_mach8.h
index 4a5d3deb5..8ed1dbc74 100644
--- a/src/include/86box/vid_ati_mach8.h
+++ b/src/include/86box/vid_ati_mach8.h
@@ -77,7 +77,8 @@ typedef struct mach_t {
uint8_t overscan_g_col_24;
uint8_t overscan_r_col_24;
uint16_t fifo_test_data[17];
- int resolution_crt;
+ int port_len;
+ int crt_resolution;
struct {
uint8_t line_idx;
diff --git a/src/include/86box/video.h b/src/include/86box/video.h
index 6cf9c8d59..d55275359 100644
--- a/src/include/86box/video.h
+++ b/src/include/86box/video.h
@@ -583,6 +583,7 @@ extern const device_t ps1vga_mca_device;
extern const device_t voodoo_device;
extern const device_t voodoo_banshee_device;
extern const device_t creative_voodoo_banshee_device;
+extern const device_t quantum3d_raven_device;
extern const device_t voodoo_3_1000_device;
extern const device_t voodoo_3_1000_agp_device;
extern const device_t voodoo_3_2000_device;
diff --git a/src/machine/m_at.c b/src/machine/m_at.c
index 3f5e88011..86fbe3776 100644
--- a/src/machine/m_at.c
+++ b/src/machine/m_at.c
@@ -187,7 +187,7 @@ static const device_config_t ibmat_config[] = {
};
const device_t ibmat_device = {
- .name = " IBM AT Devices",
+ .name = "IBM AT",
.internal_name = "ibmat_device",
.flags = 0,
.local = 0,
@@ -294,7 +294,7 @@ static const device_config_t ibmxt286_config[] = {
};
const device_t ibmxt286_device = {
- .name = "IBM XT Model 286 Devices",
+ .name = "IBM XT Model 286",
.internal_name = "ibmxt286_device",
.flags = 0,
.local = 0,
@@ -332,6 +332,23 @@ machine_at_ibmxt286_init(const machine_t *model)
return ret;
}
+int
+machine_at_pb286_init(const machine_t *model)
+{
+ int ret;
+
+ ret = bios_load_interleaved("roms/machines/pb286/LB_V332P.BIN",
+ "roms/machines/pb286/HB_V332P.BIN",
+ 0x000f0000, 65536, 0);
+
+ if (bios_only || !ret)
+ return ret;
+
+ machine_at_ibm_common_init(model);
+
+ return ret;
+}
+
int
machine_at_siemens_init(const machine_t *model)
{
diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c
index 033233955..b084bfbbd 100644
--- a/src/machine/m_at_286_386sx.c
+++ b/src/machine/m_at_286_386sx.c
@@ -653,7 +653,9 @@ machine_at_if386sx_init(const machine_t *model)
if (bios_only || !ret)
return ret;
- machine_at_common_init(model);
+ machine_at_common_init_ex(model, 2);
+ device_add(&amstrad_megapc_nvr_device); /* NVR that is initialized to all 0x00's. */
+
device_add(&keyboard_at_phoenix_device);
device_add(&neat_sx_device);
@@ -663,6 +665,12 @@ machine_at_if386sx_init(const machine_t *model)
if (fdc_current[0] == FDC_INTERNAL)
device_add(&fdc_at_device);
+ /*
+ One serial port - on the real hardware IF386AX, it is on the VL 16C451,
+ alognside the bidirectional parallel port.
+ */
+ device_add_inst(&ns16450_device, 1);
+
return ret;
}
diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c
index 19c4b535e..4e659dd77 100644
--- a/src/machine/m_at_386dx_486.c
+++ b/src/machine/m_at_386dx_486.c
@@ -691,12 +691,12 @@ static const device_config_t pb450_config[] = {
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
- .default_string = "pci10a",
+ .default_string = "pb450a",
.default_int = 0,
.file_filter = "",
.spinner = { 0 },
.bios = {
- { .name = "PCI 1.0A", .internal_name = "pb450" /*"pci10a"*/, .bios_type = BIOS_NORMAL,
+ { .name = "PCI 1.0A", .internal_name = "pb450a" /*"pci10a"*/, .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/pb450/OPTI802.bin", "" } },
{ .name = "PNP 1.1A", .internal_name = "pnp11a", .bios_type = BIOS_NORMAL,
.files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/pb450/PNP11A.bin", "" } },
@@ -708,7 +708,7 @@ static const device_config_t pb450_config[] = {
};
const device_t pb450_device = {
- .name = "Packard Bell PB450 Devices",
+ .name = "Packard Bell PB450",
.internal_name = "pb450_device",
.flags = 0,
.local = 0,
@@ -732,7 +732,7 @@ machine_at_pb450_init(const machine_t *model)
return ret;
device_context(model->device);
- fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
+ fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0);
ret = bios_load_linear(fn, 0x000e0000, 131072, 0);
device_context_restore();
@@ -1248,7 +1248,9 @@ machine_at_alfredo_init(const machine_t *model)
if (bios_only || !ret)
return ret;
- machine_at_common_init(model);
+ machine_at_common_init_ex(model, 2);
+
+ device_add(&amstrad_megapc_nvr_device);
device_add(&ide_pci_device);
pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING);
@@ -1258,7 +1260,7 @@ machine_at_alfredo_init(const machine_t *model)
pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4);
pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4);
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
- device_add(&keyboard_ps2_pci_device);
+ device_add(&keyboard_ps2_phoenix_device);
device_add(&sio_device);
device_add(&fdc37c663_device);
device_add(&intel_flash_bxt_ami_device);
@@ -1279,14 +1281,15 @@ machine_at_ninja_init(const machine_t *model)
if (bios_only || !ret)
return ret;
- machine_at_common_init(model);
+ machine_at_common_init_ex(model, 2);
+ device_add(&amstrad_megapc_nvr_device);
pci_init(PCI_CONFIG_TYPE_1);
pci_register_slot(0x05, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
pci_register_slot(0x11, PCI_CARD_NORMAL, 1, 2, 1, 2);
pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 1, 2, 1);
pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 1, 2, 1);
- device_add(&keyboard_ps2_intel_ami_pci_device);
+ device_add(&keyboard_ps2_phoenix_device);
device_add(&intel_flash_bxt_ami_device);
device_add(&i420ex_device);
diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c
index 78df5b0cb..c747d8cc0 100644
--- a/src/machine/m_at_socket4.c
+++ b/src/machine/m_at_socket4.c
@@ -44,8 +44,10 @@
void
machine_at_premiere_common_init(const machine_t *model, int pci_switch)
{
- machine_at_common_init(model);
- device_add(&ide_pci_device);
+ machine_at_common_init_ex(model, 2);
+
+ device_add(&amstrad_megapc_nvr_device);
+ device_add(&ide_pci_2ch_device);
pci_init(PCI_CONFIG_TYPE_2 | pci_switch);
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
@@ -54,7 +56,7 @@ machine_at_premiere_common_init(const machine_t *model, int pci_switch)
pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4);
pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4);
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
- device_add(&keyboard_ps2_intel_ami_pci_device);
+ device_add(&keyboard_ps2_phoenix_device);
device_add(&sio_zb_device);
device_add(&fdc37c665_device);
device_add(&intel_flash_bxt_ami_device);
diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c
index 41821a4a8..c22463de4 100644
--- a/src/machine/m_ps1.c
+++ b/src/machine/m_ps1.c
@@ -290,7 +290,7 @@ const device_t ps1_2011_device = {
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
- .config = &ps1_2011_config[0]
+ .config = ps1_2011_config
};
static void
diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c
index 78d2daa13..13f9c52ca 100644
--- a/src/machine/m_xt.c
+++ b/src/machine/m_xt.c
@@ -108,7 +108,7 @@ static const device_config_t ibmpc_config[] = {
};
const device_t ibmpc_device = {
- .name = "IBM PC (1981) Device",
+ .name = "IBM PC (1981)",
.internal_name = "ibmpc_device",
.flags = 0,
.local = 0,
@@ -218,7 +218,7 @@ static const device_config_t ibmpc82_config[] = {
};
const device_t ibmpc82_device = {
- .name = "IBM PC (1982) Devices",
+ .name = "IBM PC (1982)",
.internal_name = "ibmpc82_device",
.flags = 0,
.local = 0,
@@ -331,7 +331,7 @@ static const device_config_t ibmxt_config[] = {
};
const device_t ibmxt_device = {
- .name = "IBM XT (1982) Device",
+ .name = "IBM XT (1982)",
.internal_name = "ibmxt_device",
.flags = 0,
.local = 0,
@@ -451,7 +451,7 @@ static const device_config_t ibmxt86_config[] = {
};
const device_t ibmxt86_device = {
- .name = "IBM XT (1986) Device",
+ .name = "IBM XT (1986)",
.internal_name = "ibmxt86_device",
.flags = 0,
.local = 0,
@@ -624,7 +624,7 @@ static const device_config_t jukopc_config[] = {
};
const device_t jukopc_device = {
- .name = "Juko ST Devices",
+ .name = "Juko ST",
.internal_name = "jukopc_device",
.flags = 0,
.local = 0,
@@ -949,7 +949,7 @@ static const device_config_t vendex_config[] = {
};
const device_t vendex_device = {
- .name = "Vendex 888T Devices",
+ .name = "Vendex 888T",
.internal_name = "vendex_device",
.flags = 0,
.local = 0,
diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c
index 877d26ff5..c0405f99a 100644
--- a/src/machine/m_xt_laserxt.c
+++ b/src/machine/m_xt_laserxt.c
@@ -154,6 +154,8 @@ machine_xt_laserxt_common_init(const machine_t *model,int is_lxt3)
standalone_gameport_type = &gameport_device;
laserxt_init(is_lxt3);
+
+ device_add(&keyboard_xt_lxt3_device);
}
int
@@ -167,8 +169,6 @@ machine_xt_laserxt_init(const machine_t *model)
if (bios_only || !ret)
return ret;
- device_add(&keyboard_xt_device);
-
machine_xt_laserxt_common_init(model, 0);
return ret;
@@ -185,8 +185,6 @@ machine_xt_lxt3_init(const machine_t *model)
if (bios_only || !ret)
return ret;
- device_add(&keyboard_xt_lxt3_device);
-
machine_xt_laserxt_common_init(model, 1);
return ret;
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index fa383139b..42ac79417 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -1721,7 +1721,7 @@ const machine_t machines[] = {
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
- .package = CPU_PKG_8088,
+ .package = CPU_PKG_8088_VTECH,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
@@ -1762,7 +1762,7 @@ const machine_t machines[] = {
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
- .package = CPU_PKG_8088_VTECH,
+ .package = CPU_PKG_8088,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
@@ -3261,6 +3261,47 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
+ /* Has IBM AT KBC firmware. */
+ /* To configure the BIOS, use PB_2330a_diag.IMA from MS-DOS 3.30 Packard Bell OEM, GSETUP might work too*/
+ {
+ .name = "[ISA] Packard Bell PB286",
+ .internal_name = "pb286",
+ .type = MACHINE_TYPE_286,
+ .chipset = MACHINE_CHIPSET_DISCRETE,
+ .init = machine_at_pb286_init,
+ .p1_handler = NULL,
+ .gpio_handler = NULL,
+ .available_flag = MACHINE_AVAILABLE,
+ .gpio_acpi_handler = NULL,
+ .cpu = {
+ .package = CPU_PKG_286,
+ .block = CPU_BLOCK_NONE,
+ .min_bus = 0,
+ .max_bus = 0,
+ .min_voltage = 0,
+ .max_voltage = 0,
+ .min_multi = 0,
+ .max_multi = 0
+ },
+ .bus_flags = MACHINE_AT,
+ .flags = MACHINE_FLAGS_NONE,
+ .ram = {
+ .min = 256,
+ .max = 1024,
+ .step = 128
+ },
+ .nvrmask = 63,
+ .kbc_device = NULL,
+ .kbc_p1 = 0xff,
+ .gpio = 0xffffffff,
+ .gpio_acpi = 0xffffffff,
+ .device = NULL,
+ .fdc_device = NULL,
+ .sio_device = NULL,
+ .vid_device = NULL,
+ .snd_device = NULL,
+ .net_device = NULL
+ },
/* This has a Siemens proprietary KBC which is completely undocumented. */
{
.name = "[ISA] Siemens PCD-2L",
diff --git a/src/mem/mem.c b/src/mem/mem.c
index 074b44bda..8c2cfd6cc 100644
--- a/src/mem/mem.c
+++ b/src/mem/mem.c
@@ -2792,6 +2792,17 @@ mem_init_ram_mapping(mem_mapping_t *mapping, uint32_t base, uint32_t size)
mem_add_ram_mapping(mapping, base, size);
}
+void
+mem_zero(void)
+{
+#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
+ if (mem_size > 1048576)
+ memset(ram2, 0x00, ram2_size + 16);
+#endif
+
+ memset(ram, 0x00, ram_size + 16);
+}
+
/* Reset the memory state. */
void
mem_reset(void)
@@ -2867,8 +2878,10 @@ mem_reset(void)
return;
}
memset(ram, 0x00, ram_size + 16);
+#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
if (mem_size > 1048576)
ram2 = &(ram[1 << 30]);
+#endif
}
/*
@@ -2963,6 +2976,7 @@ mem_reset(void)
else if (cpu_16bitbus && is6117 && mem_size > 65408)
mem_init_ram_mapping(&ram_high_mapping, 0x100000, (65408 - 1024) * 1024);
else {
+#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
if (mem_size > 1048576) {
mem_init_ram_mapping(&ram_high_mapping, 0x100000, (1048576 - 1024) * 1024);
@@ -2975,6 +2989,9 @@ mem_reset(void)
ram2, MEM_MAPPING_INTERNAL, NULL);
} else
mem_init_ram_mapping(&ram_high_mapping, 0x100000, (mem_size - 1024) * 1024);
+#else
+ mem_init_ram_mapping(&ram_high_mapping, 0x100000, (mem_size - 1024) * 1024);
+#endif
}
}
diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c
index 71e5c2ca7..e45b55b22 100644
--- a/src/network/net_ne2000.c
+++ b/src/network/net_ne2000.c
@@ -1071,7 +1071,7 @@ nic_init(const device_t *info)
mac_oui = (((int) dev->maclocal[0]) << 16);
mac_oui |= (((int) dev->maclocal[1]) << 8);
mac_oui |= ((int) dev->maclocal[2]);
- device_set_config_mac("mac", mac);
+ device_set_config_mac("mac_oui", mac_oui);
} else {
dev->maclocal[0] = (mac_oui >> 16) & 0xff;
dev->maclocal[1] = (mac_oui >> 8) & 0xff;
diff --git a/src/pci.c b/src/pci.c
index ab585c456..c3020ca73 100644
--- a/src/pci.c
+++ b/src/pci.c
@@ -419,6 +419,9 @@ pci_trc_reset(uint8_t val)
mem_a20_recalc();
flushmmucache();
+
+ if (is_p6)
+ mem_zero();
}
#ifdef USE_DYNAREC
diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot
index 93a47a1cb..1d151a9d9 100644
--- a/src/qt/languages/86box.pot
+++ b/src/qt/languages/86box.pot
@@ -18,7 +18,7 @@ msgstr ""
msgid "&Hard Reset..."
msgstr ""
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
msgstr ""
msgid "Ctrl+Alt+&Esc"
@@ -111,7 +111,7 @@ msgstr ""
msgid "Hi&DPI scaling"
msgstr ""
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
msgstr ""
msgid "Fullscreen &stretch mode"
@@ -186,7 +186,10 @@ msgstr ""
msgid "&Update status bar icons"
msgstr ""
-msgid "Take s&creenshot\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr ""
+
+msgid "S&ound"
msgstr ""
msgid "&Preferences..."
@@ -198,10 +201,10 @@ msgstr ""
msgid "Sound &gain..."
msgstr ""
-msgid "Begin trace\tCtrl+T"
+msgid "Begin trace"
msgstr ""
-msgid "End trace\tCtrl+T"
+msgid "End trace"
msgstr ""
msgid "&Help"
@@ -249,7 +252,7 @@ msgstr ""
msgid "E&mpty"
msgstr ""
-msgid "&Reload previous image"
+msgid "Reload previous image"
msgstr ""
msgid "&Folder..."
@@ -306,18 +309,12 @@ msgstr ""
msgid "Cancel"
msgstr ""
-msgid "Save these settings as &global defaults"
-msgstr ""
-
msgid "&Default"
msgstr ""
msgid "Language:"
msgstr ""
-msgid "Icon set:"
-msgstr ""
-
msgid "Gain"
msgstr ""
@@ -648,7 +645,7 @@ msgstr ""
msgid "Speed"
msgstr ""
-msgid "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
msgstr ""
msgid "ZIP images"
@@ -753,13 +750,10 @@ msgstr ""
msgid "KB"
msgstr ""
-msgid "Could not initialize the video renderer."
-msgstr ""
-
msgid "Default"
msgstr ""
-msgid "%i estat(s) d'espera"
+msgid "%1 Wait state(s)"
msgstr ""
msgid "Type"
@@ -804,10 +798,10 @@ msgstr ""
msgid "None"
msgstr ""
-msgid "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
msgstr ""
-msgid "Floppy %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
msgstr ""
msgid "Advanced sector images"
@@ -828,7 +822,7 @@ msgstr ""
msgid "Unable to initialize GhostPCL"
msgstr ""
-msgid "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
msgstr ""
msgid "MO images"
@@ -903,10 +897,7 @@ msgstr ""
msgid "Monitor in sleep mode"
msgstr ""
-msgid "OpenGL Shaders"
-msgstr ""
-
-msgid "OpenGL options"
+msgid "GLSL shaders"
msgstr ""
msgid "You are loading an unsupported configuration"
@@ -918,24 +909,18 @@ msgstr ""
msgid "Continue"
msgstr ""
-msgid "Cassette: %s"
+msgid "Cassette: %1"
msgstr ""
msgid "Cassette images"
msgstr ""
-msgid "Cartridge %i: %ls"
+msgid "Cartridge %1: %2"
msgstr ""
msgid "Cartridge images"
msgstr ""
-msgid "Error initializing renderer"
-msgstr ""
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr ""
-
msgid "Resume execution"
msgstr ""
@@ -1098,7 +1083,7 @@ msgstr ""
msgid "ATAPI"
msgstr ""
-msgid "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
msgstr ""
msgid "160 KB"
@@ -1278,9 +1263,6 @@ msgstr ""
msgid "Create..."
msgstr ""
-msgid "previous image"
-msgstr ""
-
msgid "Host CD/DVD Drive (%1)"
msgstr ""
@@ -1290,22 +1272,7 @@ msgstr ""
msgid "Null Driver"
msgstr ""
-msgid "NIC %02i (%ls) %ls"
-msgstr ""
-
-msgid "Error opening \"%1\": %2"
-msgstr ""
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr ""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr ""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr ""
-
-msgid "OpenGL 3.0 renderer options"
+msgid "NIC %1 (%2) %3"
msgstr ""
msgid "Render behavior"
@@ -1320,9 +1287,6 @@ msgstr ""
msgid "VSync"
msgstr ""
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr ""
-
msgid "Synchronize with video"
msgstr ""
@@ -1332,21 +1296,9 @@ msgstr ""
msgid "Remove"
msgstr ""
-msgid "No shader selected"
-msgstr ""
-
msgid "Browse..."
msgstr ""
-msgid "Shader error"
-msgstr ""
-
-msgid "Could not load shaders."
-msgstr ""
-
-msgid "More information in details."
-msgstr ""
-
msgid "Couldn't create OpenGL context."
msgstr ""
@@ -1356,16 +1308,10 @@ msgstr ""
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr ""
-msgid "OpenGL initialization failed. Error %1."
-msgstr ""
-
msgid "Error initializing OpenGL"
msgstr ""
-msgid "Falling back to software rendering.\n"
-msgstr ""
-
-msgid "Allocating memory for unpack buffer failed.\n"
+msgid "\nFalling back to software rendering."
msgstr ""
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr ""
msgid "Serial port passthrough 4"
msgstr ""
-msgid "Vision Systems LBA Enhancer"
-msgstr ""
-
msgid "Renderer options..."
msgstr ""
@@ -2103,7 +2046,7 @@ msgstr ""
msgid "Host Serial Passthrough"
msgstr ""
-msgid "Eject %s"
+msgid "E&ject %1"
msgstr ""
msgid "&Unmute"
@@ -2115,7 +2058,28 @@ msgstr ""
msgid "High performance impact"
msgstr ""
-msgid "RAM Disk (max. speed)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr ""
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
msgstr ""
msgid "IBM 8514/A clone (ISA)"
@@ -2142,5 +2106,62 @@ msgstr ""
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr ""
-msgid "Inhibit multimedia keys on Windows"
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
msgstr ""
diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po
index cf3d5c7f7..9dec41c32 100644
--- a/src/qt/languages/ca-ES.po
+++ b/src/qt/languages/ca-ES.po
@@ -18,8 +18,8 @@ msgstr "CTRL &dret és ALT esquerre"
msgid "&Hard Reset..."
msgstr "&Reinicialització completa ..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Lineal"
msgid "Hi&DPI scaling"
msgstr "&Escalat alta densitat"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Pantalla completa\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Pantalla completa"
msgid "Fullscreen &stretch mode"
msgstr "Escalat pantalla completa"
@@ -186,8 +186,11 @@ msgstr "&Ajustaments ..."
msgid "&Update status bar icons"
msgstr "&Actualitzar icones a la barra d'estat"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Prendre c&aptura\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Prendre c&aptura"
+
+msgid "S&ound"
+msgstr "S&o"
msgid "&Preferences..."
msgstr "&Preferències ..."
@@ -198,11 +201,11 @@ msgstr "Activar la integració amb el &Discord"
msgid "Sound &gain..."
msgstr "&Guany de so ..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Començar traça\tCtrl+T"
+msgid "Begin trace"
+msgstr "Començar traça"
-msgid "End trace\tCtrl+T"
-msgstr "Acabar traça\tCtrl+T"
+msgid "End trace"
+msgstr "Acabar traça"
msgid "&Help"
msgstr "&Ajuda"
@@ -249,8 +252,8 @@ msgstr "&Silenciar"
msgid "E&mpty"
msgstr "E&xtreure disc"
-msgid "&Reload previous image"
-msgstr "&Recarregar imatge anterior"
+msgid "Reload previous image"
+msgstr "Recarregar imatge anterior"
msgid "&Folder..."
msgstr "&Carpeta ..."
@@ -306,18 +309,12 @@ msgstr "D'acord"
msgid "Cancel"
msgstr "Anuŀlació"
-msgid "Save these settings as &global defaults"
-msgstr "Salvar aquests paràmetres com per &defecte globalment"
-
msgid "&Default"
msgstr "&Per defecte"
msgid "Language:"
msgstr "Idioma:"
-msgid "Icon set:"
-msgstr "Conjunt d'icones:"
-
msgid "Gain"
msgstr "Guany"
@@ -648,8 +645,8 @@ msgstr "Premeu Ctrl+Alt+PgDn per tornar al mode de finestra."
msgid "Speed"
msgstr "Velocitat"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Imatges ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "No has estat possible inicialitzar el renderitzador de vídeo."
-
msgid "Default"
msgstr "Per defecte"
-msgid "%i estat(s) d'espera"
-msgstr "%i estado(s) de Espera"
+msgid "%1 Wait state(s)"
+msgstr "%1 estado(s) de Espera"
msgid "Type"
msgstr "Tipus"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Cap"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disquet %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disquet %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Imatges avançates del sector"
@@ -828,8 +822,8 @@ msgstr "No es pot inicialitzar Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "No es pot inicialitzar GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Imatges MO"
@@ -903,11 +897,8 @@ msgstr "Configuració de Dispositiu %1"
msgid "Monitor in sleep mode"
msgstr "Monitor en mode estalvi"
-msgid "OpenGL Shaders"
-msgstr "Shaders OpenGL"
-
-msgid "OpenGL options"
-msgstr "Opcions OpenGL"
+msgid "GLSL shaders"
+msgstr "Shaders GLSL"
msgid "You are loading an unsupported configuration"
msgstr "S'està carregant una configuració no suportada"
@@ -918,24 +909,18 @@ msgstr "El Filtratge de tipus de CPU basat en màquina seleccionada està deshab
msgid "Continue"
msgstr "Continuar"
-msgid "Cassette: %s"
-msgstr "Casset: %s"
+msgid "Cassette: %1"
+msgstr "Casset: %1"
msgid "Cassette images"
msgstr "Imatges de casset"
-msgid "Cartridge %i: %ls"
-msgstr "Cartutx %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartutx %1: %2"
msgid "Cartridge images"
msgstr "Imatges de cartutx"
-msgid "Error initializing renderer"
-msgstr "Error en inicialitzar el renderitzador"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "No has estat possible inicialitzar el renderitzador OpenGL (3.0 Core). Utilitzar un altre renderitzador."
-
msgid "Resume execution"
msgstr "Reprendre l'execució"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "Esborrar la història de imatges"
msgid "Create..."
msgstr "Crear ..."
-msgid "previous image"
-msgstr "imatge anterior"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Unitat CD/DVD d'amfitrió (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Bus desconegut"
msgid "Null Driver"
msgstr "Controlador nul"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Error d'obertura \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Error en recopilar el vertex shader al fitxer \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Error en recopilar el fragment shader al fitxer \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Error en enllaçar el programa de shader al fitxer \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Opcions del renderitzador OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Comportament del renderitzador"
@@ -1320,9 +1287,6 @@ msgstr " fotogrames/s"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Feu que cada fotograma sigui immediatament, en sincronització amb la pantalla emulada.</p><p><span style=" font-style:italic;">Aquesta és l’opció recomanada si els shaders en ús no utilitzen FrameTime per a efectes animats.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Sincronitzar amb vídeo"
@@ -1332,21 +1296,9 @@ msgstr "Shaders"
msgid "Remove"
msgstr "Supressió"
-msgid "No shader selected"
-msgstr "Cap shader seleccionat"
-
msgid "Browse..."
msgstr "Navegació..."
-msgid "Shader error"
-msgstr "Error del shader"
-
-msgid "Could not load shaders."
-msgstr "No has estat possible carregar els shaders."
-
-msgid "More information in details."
-msgstr "Més informació en els detalls."
-
msgid "Couldn't create OpenGL context."
msgstr "No has estat possible crear un context d'OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "No has estat possible canviar al context d'OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Es requereix la versió 3.0 o superior d'OpenGL. La versió actual és %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "No has estat possible inicialitzar OpenGL. Error %1."
-
msgid "Error initializing OpenGL"
msgstr "Error en inicialitzar OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Tornant al renderitzador software.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "No has estat possible assignar la memòria per a un buffer de desempaquetament.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nTornant al renderitzador software."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Quan seleccioneu imatges de suports (CD-ROM, disquet, etc.), el diàleg obert s’iniciarà al mateix directori que el fitxer de configuració 86Box. Aquesta configuració només farà una diferència en les macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Pas del port sèrie 3"
msgid "Serial port passthrough 4"
msgstr "Pas del port sèrie 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Opcions del renderitzador ..."
@@ -2103,8 +2046,8 @@ msgstr "Pipe anomenat (servidor)"
msgid "Host Serial Passthrough"
msgstr "Pas del port sèrie amfitrió"
-msgid "Eject %s"
-msgstr "Extreure %s"
+msgid "E&ject %1"
+msgstr "E&xtreure %1"
msgid "&Unmute"
msgstr "&Saver"
@@ -2115,8 +2058,29 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Alt impact en el rendiment"
-msgid "RAM Disk (max. speed)"
-msgstr "Disc RAM (velocitat màxima)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disc RAM (velocitat màxima)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Clon IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "No es pot trobar tipus de lletra de matriu de punts"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Els tipus de lletra TrueType al directori \"roms/printer/fonts\" són necessaris per a l'emulació de la impressora de matriu de punts ESC/P genèrica."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po
index e3d85dd09..2098fe018 100644
--- a/src/qt/languages/cs-CZ.po
+++ b/src/qt/languages/cs-CZ.po
@@ -18,8 +18,8 @@ msgstr "&Pravý Ctrl je levý Alt"
msgid "&Hard Reset..."
msgstr "&Resetovat"
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Lineární"
msgid "Hi&DPI scaling"
msgstr "Š&kálování HiDPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Celá obrazovka\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Celá obrazovka"
msgid "Fullscreen &stretch mode"
msgstr "Režím roztá&hnutí při celé obrazovce"
@@ -186,8 +186,11 @@ msgstr "&Nastavení..."
msgid "&Update status bar icons"
msgstr "&Aktualizovat ikony stavového řádku"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Pořídit &screenshot\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Pořídit &screenshot"
+
+msgid "S&ound"
+msgstr "&Zvuk"
msgid "&Preferences..."
msgstr "&Předvolby..."
@@ -198,11 +201,11 @@ msgstr "Povolit integraci s &Discordem"
msgid "Sound &gain..."
msgstr "&Zesílení zvuku"
-msgid "Begin trace\tCtrl+T"
-msgstr "Začít trace\tCtrl+T"
+msgid "Begin trace"
+msgstr "Začít trace"
-msgid "End trace\tCtrl+T"
-msgstr "Zastavit trace\tCtrl+T"
+msgid "End trace"
+msgstr "Zastavit trace"
msgid "&Help"
msgstr "Ná&pověda"
@@ -249,8 +252,8 @@ msgstr "&Ztišit"
msgid "E&mpty"
msgstr "&Vyjmout"
-msgid "&Reload previous image"
-msgstr "&Načíst znova předchozí obraz"
+msgid "Reload previous image"
+msgstr "Načíst znova předchozí obraz"
msgid "&Folder..."
msgstr "&Složka..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Storno"
-msgid "Save these settings as &global defaults"
-msgstr "Uložit toto nastavení jako &globální výchozí stav"
-
msgid "&Default"
msgstr "&Výchozí"
msgid "Language:"
msgstr "Jazyk:"
-msgid "Icon set:"
-msgstr "Sada ikon:"
-
msgid "Gain"
msgstr "Zesílení"
@@ -648,8 +645,8 @@ msgstr "Stiskněte Ctrl+Alt+PgDn pro návrat z režimu celé obrazovky."
msgid "Speed"
msgstr "Rychlost"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Obrazy ZIP disků"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Nastala chyba při inicializaci video rendereru."
-
msgid "Default"
msgstr "Výchozí"
-msgid "%i Wait state(s)"
-msgstr "%i čekací stav(y)"
+msgid "%1 Wait state(s)"
+msgstr "%1 čekací stav(y)"
msgid "Type"
msgstr "Typ"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Žadné"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disketová mechanika %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disketová mechanika %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Rozšířené sektorové obrazy"
@@ -828,8 +822,8 @@ msgstr "Nastala chyba při inicializaci knihovny Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Nastala chyba při inicializaci knihovny GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Obrazy MO"
@@ -903,11 +897,8 @@ msgstr "Nastavení zařízení %1"
msgid "Monitor in sleep mode"
msgstr "Monitor je v režimu spánku"
-msgid "OpenGL Shaders"
-msgstr "Shadery OpenGL"
-
-msgid "OpenGL options"
-msgstr "Možnosti OpenGL"
+msgid "GLSL shaders"
+msgstr "Shadery GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Pokoušíte se spustit nepodporovanou konfiguraci"
@@ -918,24 +909,18 @@ msgstr "Pro tuto konfiguraci bylo vypnuto filtrování procesorů podle zvolené
msgid "Continue"
msgstr "Pokračovat"
-msgid "Cassette: %s"
-msgstr "Kazeta: %s"
+msgid "Cassette: %1"
+msgstr "Kazeta: %1"
msgid "Cassette images"
msgstr "Kazetové nahrávky"
-msgid "Cartridge %i: %ls"
-msgstr "Cartridge %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartridge %1: %2"
msgid "Cartridge images"
msgstr "Obrazy cartridge"
-msgid "Error initializing renderer"
-msgstr "Chyba při inicializaci vykreslovače"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Vykreslovač OpenGL (3.0 Core) se nepodařilo inicializovat. Použijte jiný renderer."
-
msgid "Resume execution"
msgstr "Obnovit"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "Vymaž historie snímků"
msgid "Create..."
msgstr "Vytvoř..."
-msgid "previous image"
-msgstr "předchozí obraz"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Jednotka CD/DVD hostitele (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Neznámá sběrnice"
msgid "Null Driver"
msgstr "Nulový ovladač"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Chyba při otevírání \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Chyba při kompilaci vertex shaderu v souboru \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Chyba při kompilaci fragment shaderu v souboru \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Chyba při linkování shader programu v souboru \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Možnosti vykreslovače OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Chování vykreslování"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Každý snímek se vykreslí okamžitě, synchronizovaně s emulovaným displejem.</p><p><span style=" font-style:italic;">Tuto možnost doporučujeme, pokud používané shadery nevyužívají frametime pro animované efekty.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Synchronizovat s obrazem"
@@ -1332,21 +1296,9 @@ msgstr "Shadery"
msgid "Remove"
msgstr "Odstraň"
-msgid "No shader selected"
-msgstr "Není vybrán žádný shader"
-
msgid "Browse..."
msgstr "Prohlížejte..."
-msgid "Shader error"
-msgstr "Chyba shaderu"
-
-msgid "Could not load shaders."
-msgstr "Nepodařilo se načíst shadery."
-
-msgid "More information in details."
-msgstr "Více informací v podrobnostech."
-
msgid "Couldn't create OpenGL context."
msgstr "Nepodařilo se vytvořit kontext OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Nepodařilo se přepnout na kontext OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Je vyžadována verze OpenGL 3.0 nebo vyšší. Aktuální verze je %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Inicializace OpenGL se nezdařila. Chyba %1."
-
msgid "Error initializing OpenGL"
msgstr "Chyba při inicializaci OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Návrat k softwarovému vykreslování.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Alokace paměti pro rozbalovací vyrovnávací paměť se nezdařila.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nNávrat k softwarovému vykreslování."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Při výběru obrazů médií (CD-ROM, disketa atd.) se otevřené dialogové okno spustí ve stejném adresáři jako konfigurační soubor 86Box. Toto nastavení bude mít pravděpodobně význam pouze v systému MacOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Průchod sériového portu 3"
msgid "Serial port passthrough 4"
msgstr "Průchod sériového portu 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Možnosti vykreslovače..."
@@ -2103,8 +2046,8 @@ msgstr "Pojmenované potrubí (server)"
msgid "Host Serial Passthrough"
msgstr "Průchod sériového portu hostitele"
-msgid "Eject %s"
-msgstr "Vyjmout %s"
+msgid "E&ject %1"
+msgstr "&Vyjmout %1"
msgid "&Unmute"
msgstr "&Roztišit"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Vysoký dopad na výkon"
-msgid "RAM Disk (max. speed)"
-msgstr "Disk RAM (max. rychlost)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disk RAM (max. rychlost)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Klon IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Nastala chyba při nachození jehličkových písem"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Pro emulaci obecné jehličkové tiskárny ESC/P jsou vyžadována písma TrueType ve složce \"roms/printer/fonts\"."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po
index c904cad0d..2088e4141 100644
--- a/src/qt/languages/de-DE.po
+++ b/src/qt/languages/de-DE.po
@@ -18,8 +18,8 @@ msgstr "&Die rechte Strg-Taste ist die Linke Alt-Taste"
msgid "&Hard Reset..."
msgstr "&Kaltstart..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Strg+Alt+Entf\tStrg+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Strg+Alt+Entf"
msgid "Ctrl+Alt+&Esc"
msgstr "Strg+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Linear"
msgid "Hi&DPI scaling"
msgstr "Hi&DPI-Skalierung"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Vollbild\tStrg+Alt+Bild auf"
+msgid "&Fullscreen"
+msgstr "&Vollbild"
msgid "Fullscreen &stretch mode"
msgstr "&Vollbild-Skalierungsmodus"
@@ -186,8 +186,11 @@ msgstr "&Optionen..."
msgid "&Update status bar icons"
msgstr "&Statusleistenicons aktualisieren"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "S&creenshot aufnehmen\tStrg+F11"
+msgid "Take s&creenshot"
+msgstr "S&creenshot aufnehmen"
+
+msgid "S&ound"
+msgstr "S&ound"
msgid "&Preferences..."
msgstr "&Einstellungen..."
@@ -198,11 +201,11 @@ msgstr "&Discord-Integration einschalten"
msgid "Sound &gain..."
msgstr "&Klangverstärkung..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Tracing starten\tStrg+T"
+msgid "Begin trace"
+msgstr "Tracing starten"
-msgid "End trace\tCtrl+T"
-msgstr "Tracing beenden\tStrg+T"
+msgid "End trace"
+msgstr "Tracing beenden"
msgid "&Help"
msgstr "&Hilfe"
@@ -249,8 +252,8 @@ msgstr "&Stummschalten"
msgid "E&mpty"
msgstr "L&eer"
-msgid "&Reload previous image"
-msgstr "&Voriges Abbild neu laden"
+msgid "Reload previous image"
+msgstr "Voriges Abbild neu laden"
msgid "&Folder..."
msgstr "&Verzeichnis..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Abbrechen"
-msgid "Save these settings as &global defaults"
-msgstr "Einstellungen als &globalen Standard speichern"
-
msgid "&Default"
msgstr "&Standard"
msgid "Language:"
msgstr "Sprache:"
-msgid "Icon set:"
-msgstr "Icon-Satz:"
-
msgid "Gain"
msgstr "Verstärkung"
@@ -648,8 +645,8 @@ msgstr "Strg+Alt+Bild ab, zur Rückkehr in den Fenstermodus."
msgid "Speed"
msgstr "Geschwindigkeit"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP-Abbilder"
@@ -756,14 +753,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Der Videorenderer konnte nicht initialisiert werden."
-
msgid "Default"
msgstr "Standard"
-msgid "%i Wait state(s)"
-msgstr "%i Wartezustände"
+msgid "%1 Wait state(s)"
+msgstr "%1 Wartezustände"
msgid "Type"
msgstr "Typ"
@@ -807,11 +801,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Ohne"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Diskette %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Diskette %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Fortgeschrittene Sektorabbilder"
@@ -831,8 +825,8 @@ msgstr "Ghostscript konnte nicht initialisiert werden"
msgid "Unable to initialize GhostPCL"
msgstr "GhostPCL konnte nicht initialisiert werden"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "MO-Abbilder"
@@ -906,11 +900,8 @@ msgstr "%1-Gerätekonfiguration"
msgid "Monitor in sleep mode"
msgstr "Monitor im Standbymodus"
-msgid "OpenGL Shaders"
-msgstr "OpenGL-Shader"
-
-msgid "OpenGL options"
-msgstr "OpenGL-Optionen"
+msgid "GLSL shaders"
+msgstr "GLSL-Shader"
msgid "You are loading an unsupported configuration"
msgstr "Zur Zeit wird eine nicht unterstützte Konfiguration geladen"
@@ -921,24 +912,18 @@ msgstr "Das Filtern der CPU-Typen basierend auf dem ausgewählten System ist fü
msgid "Continue"
msgstr "Fortfahren"
-msgid "Cassette: %s"
-msgstr "Kassette: %s"
+msgid "Cassette: %1"
+msgstr "Kassette: %1"
msgid "Cassette images"
msgstr "Kassettenabbilder"
-msgid "Cartridge %i: %ls"
-msgstr "Cartridge %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartridge %1: %2"
msgid "Cartridge images"
msgstr "Cartridgeabbilder"
-msgid "Error initializing renderer"
-msgstr "Fehler bei der Initialisierung des Renderer"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Der OpenGL (3.0-Kern)-Renderer konnte nicht initialisiert werden. Benutze einen anderen Renderer."
-
msgid "Resume execution"
msgstr "Fortsetzen"
@@ -1101,8 +1086,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1281,9 +1266,6 @@ msgstr "Abbildverlauf löschen"
msgid "Create..."
msgstr "Erstellen..."
-msgid "previous image"
-msgstr "Vorheriges Abbild"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Host-CD/DVD-Laufwerk (%1)"
@@ -1293,23 +1275,8 @@ msgstr "Unbekannter Bus"
msgid "Null Driver"
msgstr "Nulltreiber"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Fehler beim Öffnen \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Fehler beim Kompilieren des Vertex-Shaders in der Datei \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Fehler beim Kompilieren des Fragment-Shaders in der Datei \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Fehler beim Linken des Shader-Programms in der Datei \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0 Renderer-Optionen"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Rendering-Verhalten"
@@ -1323,9 +1290,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Jedes Bild sofort rendern, synchron mit der emulierten Monitor.</p><p><span style=" font-style:italic;">Dies ist die empfohlene Option, wenn die verwendeten Shader die Bildzeit für animierte Effekte nicht nutzen.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Mit Videoausgabe synchronisieren"
@@ -1335,21 +1299,9 @@ msgstr "Shader"
msgid "Remove"
msgstr "Entfernen"
-msgid "No shader selected"
-msgstr "Kein Shader ausgewählt"
-
msgid "Browse..."
msgstr "Durchsuchen..."
-msgid "Shader error"
-msgstr "Shader-Fehler"
-
-msgid "Could not load shaders."
-msgstr "Shader konnten nicht geladen werden."
-
-msgid "More information in details."
-msgstr "Weitere Informationen im Einzelnen."
-
msgid "Couldn't create OpenGL context."
msgstr "OpenGL-Kontext konnte nicht erstellt werden."
@@ -1359,17 +1311,11 @@ msgstr "Konnte nicht in den OpenGL-Kontext wechseln."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "OpenGL-Version 3.0 oder höher ist erforderlich. Die aktuelle Version ist %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL-Initialisierung fehlgeschlagen. Fehler %1."
-
msgid "Error initializing OpenGL"
msgstr "Fehler beim Initialisieren von OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Rückgriff auf Software-Rendering.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Nicht genug Speicher zum Entpacken.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nRückgriff auf Software-Rendering."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Bei der Auswahl von Medien-Abbildern (CD-ROM, Diskette usw.) wird der Öffnungsdialog im selben Verzeichnis wie die 86Box-Konfigurationsdatei gestartet. Diese Einstellung macht wahrscheinlich nur unter macOS einen Unterschied.</p></body></html>"
@@ -1437,9 +1383,6 @@ msgstr "Durchreichung der Serielle Schnittstelle 3"
msgid "Serial port passthrough 4"
msgstr "Durchreichung der Serielle Schnittstelle 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Renderer-Optionen..."
@@ -2106,8 +2049,8 @@ msgstr "Benanntes Pipe (Server)"
msgid "Host Serial Passthrough"
msgstr "Durchreichung der seriellen Schnittstelle des Hosts"
-msgid "Eject %s"
-msgstr "Auswerfen %s"
+msgid "E&ject %1"
+msgstr "A&uswerfen %1"
msgid "&Unmute"
msgstr "&Ton einschalten"
@@ -2118,8 +2061,29 @@ msgstr "Softfloat-FPU"
msgid "High performance impact"
msgstr "Hohe Auswirkung auf die Leistung"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM-Diskette (maximale Geschwindigkeit)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM-Diskette (maximale Geschwindigkeit)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A-Klon (ISA)"
@@ -2138,3 +2102,63 @@ msgstr "Nadel-Schriften konnten nicht gefunden werden"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "TrueType-Schriften in das \"roms/printer/fonts\"-Verzeichnis sind für die Allgemeines ESC/P Nadel-Druckers erforderlich."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po
index bd3a5ba99..8cc29a71a 100644
--- a/src/qt/languages/en-GB.po
+++ b/src/qt/languages/en-GB.po
@@ -15,14 +15,11 @@ msgstr "&RGB Greyscale"
msgid "Time synchronization"
msgstr "Time synchronisation"
-msgid "Could not initialize the video renderer."
-msgstr "Could not initialise the video renderer."
+msgid "Unable to initialize Ghostscript"
+msgstr "Unable to initialise Ghostscript"
-msgid "Error initializing renderer"
-msgstr "Error initialising renderer"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "OpenGL (3.0 Core) renderer could not be initialised. Use another renderer."
+msgid "Unable to initialize GhostPCL"
+msgstr "Unable to initialise GhostPCL"
msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behaviour will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
@@ -30,15 +27,18 @@ msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maint
msgid "Apply fullscreen stretch mode when maximized"
msgstr "Apply fullscreen stretch mode when maximised"
+msgid "Failed to initialize network driver"
+msgstr "Failed to initialise network driver"
+
msgid "Render behavior"
msgstr "Render behaviour"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilise frametime for animated effects.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Synchronise with video"
+msgid "Error initializing OpenGL"
+msgstr "Error initialising OpenGL"
+
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialogue will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
@@ -71,3 +71,6 @@ msgstr "Grey"
msgid "Color"
msgstr "Colour"
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr "Failed to initialise Vulkan renderer."
diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po
index ca7a3ad53..bc11a4d4c 100644
--- a/src/qt/languages/es-ES.po
+++ b/src/qt/languages/es-ES.po
@@ -18,8 +18,8 @@ msgstr "CTRL &derecho es ALT izquierdo"
msgid "&Hard Reset..."
msgstr "&Hard Reset..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Lineal"
msgid "Hi&DPI scaling"
msgstr "&Escalado alta densidad"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Pantalla completa\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Pantalla completa"
msgid "Fullscreen &stretch mode"
msgstr "Escalado pantalla completa"
@@ -186,8 +186,11 @@ msgstr "&Configuraciones..."
msgid "&Update status bar icons"
msgstr "&Actualizar iconos en barra de estado"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Tomar c&aptura\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Tomar c&aptura"
+
+msgid "S&ound"
+msgstr "S&onido"
msgid "&Preferences..."
msgstr "&Preferencias..."
@@ -198,11 +201,11 @@ msgstr "Habilitar integración con &Discord"
msgid "Sound &gain..."
msgstr "&Ganancia de sonido..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Comenzar traza\tCtrl+T"
+msgid "Begin trace"
+msgstr "Comenzar traza"
-msgid "End trace\tCtrl+T"
-msgstr "Terminar traza\tCtrl+T"
+msgid "End trace"
+msgstr "Terminar traza"
msgid "&Help"
msgstr "&Ayuda"
@@ -249,8 +252,8 @@ msgstr "&Silenciar"
msgid "E&mpty"
msgstr "E&xtraer disco"
-msgid "&Reload previous image"
-msgstr "&Recargar imagen previa"
+msgid "Reload previous image"
+msgstr "Recargar imagen previa"
msgid "&Folder..."
msgstr "&Carpeta..."
@@ -306,18 +309,12 @@ msgstr "Aceptar"
msgid "Cancel"
msgstr "Cancelar"
-msgid "Save these settings as &global defaults"
-msgstr "Salvar estos configuraciones como por &defecto globalmente"
-
msgid "&Default"
msgstr "&Por defecto"
msgid "Language:"
msgstr "Idioma:"
-msgid "Icon set:"
-msgstr "Juego de iconos:"
-
msgid "Gain"
msgstr "Ganancia"
@@ -648,8 +645,8 @@ msgstr "Pulsa Ctrl+Alt+PgDn para volver a modo ventana."
msgid "Speed"
msgstr "Velocidad"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Imagenes ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "No fué posible inicializar el renderizador de vídeo."
-
msgid "Default"
msgstr "Por defecto"
-msgid "%i Wait state(s)"
-msgstr "%i estado(s) de Espera"
+msgid "%1 Wait state(s)"
+msgstr "%1 estado(s) de Espera"
msgid "Type"
msgstr "Tipo"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Ninguno"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disquete %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disquete %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Imágenes avanzadas de sector"
@@ -828,8 +822,8 @@ msgstr "No fué posible inicializar Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "No fué posible inicializar GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Imágenes de MO"
@@ -903,11 +897,8 @@ msgstr "%1 Configuración de Dispositivo"
msgid "Monitor in sleep mode"
msgstr "Monitor en modo ahorro"
-msgid "OpenGL Shaders"
-msgstr "Shaders OpenGL"
-
-msgid "OpenGL options"
-msgstr "Opciones OpenGL"
+msgid "GLSL shaders"
+msgstr "Shaders GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Está cargando una configuración no soportada"
@@ -918,24 +909,18 @@ msgstr "El Filtrado de tipo de CPU basado en máquina seleccionada está deshabi
msgid "Continue"
msgstr "Continuar"
-msgid "Cassette: %s"
-msgstr "Cassette: %s"
+msgid "Cassette: %1"
+msgstr "Cassette: %1"
msgid "Cassette images"
msgstr "Imágenes de Cassette"
-msgid "Cartridge %i: %ls"
-msgstr "Cartucho %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartucho %1: %2"
msgid "Cartridge images"
msgstr "Imágenes de Cartucho"
-msgid "Error initializing renderer"
-msgstr "Error al inicializar el renderizador"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "No fué posible inicializar el renderizador OpenGL (3.0 Core). Utilice otro renderizador."
-
msgid "Resume execution"
msgstr "Retomar la ejecución"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1277,9 +1262,6 @@ msgstr "Eliminar historia de imágenes"
msgid "Create..."
msgstr "Crear..."
-msgid "previous image"
-msgstr "imagen previa"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Unidad de CD/DVD anfitriona (%1)"
@@ -1289,23 +1271,8 @@ msgstr "Bus desconocido"
msgid "Null Driver"
msgstr "Controlador nulo"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Error al abrir \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Error al compilar el vertex shader en el archivo \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Error al compilar el fragmentshader en el archivo \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Error al enlazar el programa shader en el archivo \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Opciones del renderizador OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Comportamiento del renderizador"
@@ -1319,9 +1286,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Renderiza cada fotograma inmediatamente, en sincronía con la pantalla emulada.</p><p><span style=" font-style:italic;">Esta es la opción recomendada si los shaders en uso no utilizan frametime para efectos animados.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Sincronizar con los gráficos"
@@ -1331,21 +1295,9 @@ msgstr "Shaders"
msgid "Remove"
msgstr "Eliminar"
-msgid "No shader selected"
-msgstr "Ningun shader seleccionado"
-
msgid "Browse..."
msgstr "Buscar..."
-msgid "Shader error"
-msgstr "Error del shader"
-
-msgid "Could not load shaders."
-msgstr "No ha sido posible carregar los shaders."
-
-msgid "More information in details."
-msgstr "Más informaciones en los detalles."
-
msgid "Couldn't create OpenGL context."
msgstr "No ha sido posible crear el contexto OpenGL."
@@ -1355,17 +1307,11 @@ msgstr "No ha sido posible cambiar al contexto OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Es requerida la versión 3.0 o más alta de OpenGL. La versión actual es %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "La inicialización de OpenGL no tuvo éxito. Error %1."
-
msgid "Error initializing OpenGL"
msgstr "Error al inicializar OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Recurrir al renderizado por software.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "La allocación de memoria para el búfer de desempaquetado no tuvo éxito.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nRecurrir al renderizado por software."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Al seleccionar imágenes multimedia (CD-ROM, disquete, etc.), el diálogo de apertura se iniciará en el mismo directorio que el archivo de configuración de 86Box. Es probable que este ajuste sólo suponga una diferencia en macOS.</p></body></html>"
@@ -1433,9 +1379,6 @@ msgstr "Paso de puerto serie 3"
msgid "Serial port passthrough 4"
msgstr "Paso de puerto serie 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Opciones del renderizador..."
@@ -2102,8 +2045,8 @@ msgstr "Tubería con nombre (servidor)"
msgid "Host Serial Passthrough"
msgstr "Paso del puerto serie del host"
-msgid "Eject %s"
-msgstr "Extraer %s"
+msgid "E&ject %1"
+msgstr "E&xtraer %1"
msgid "&Unmute"
msgstr "&Reactivar sonido"
@@ -2114,8 +2057,29 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Alto impact en el rendimiento"
-msgid "RAM Disk (max. speed)"
-msgstr "Disco RAM (velocidad máxima)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disco RAM (velocidad máxima)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Clon IBM 8514/A (ISA)"
@@ -2134,3 +2098,63 @@ msgstr "No fué posible encontrar las fuentes matriciales"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Las fuentes TrueType en el directorio \"roms/printer/fonts\" son necesarias para la emulación de la impresora matricial ESC/P genérica."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po
index f044365f0..34e9aeead 100644
--- a/src/qt/languages/fi-FI.po
+++ b/src/qt/languages/fi-FI.po
@@ -18,8 +18,8 @@ msgstr "&Oikea CTRL on vasen ALT"
msgid "&Hard Reset..."
msgstr "&Uudelleenkäynnistys (kylmä)..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "Li&neaarinen interpolaatio"
msgid "Hi&DPI scaling"
msgstr "&Suuri DPI-skaalaus"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Koko näytön tila\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Koko näytön tila"
msgid "Fullscreen &stretch mode"
msgstr "Koko näytön &skaalaustila"
@@ -186,8 +186,11 @@ msgstr "&Kokoonpano..."
msgid "&Update status bar icons"
msgstr "&Päivitä tilapalkin kuvakkeita"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Ota &kuvakaappaus\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Ota &kuvakaappaus"
+
+msgid "S&ound"
+msgstr "&Ääni"
msgid "&Preferences..."
msgstr "&Sovellusasetukset..."
@@ -198,11 +201,11 @@ msgstr "Käytä &Discord-integraatiota"
msgid "Sound &gain..."
msgstr "&Äänitasot..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Aloita jäljitys\tCtrl+T"
+msgid "Begin trace"
+msgstr "Aloita jäljitys"
-msgid "End trace\tCtrl+T"
-msgstr "Lopeta jäljitys\tCtrl+T"
+msgid "End trace"
+msgstr "Lopeta jäljitys"
msgid "&Help"
msgstr "&Ohje"
@@ -249,8 +252,8 @@ msgstr "&Mykistä"
msgid "E&mpty"
msgstr "&Tyhjä"
-msgid "&Reload previous image"
-msgstr "&Lataa edellinen levykuva uudelleen"
+msgid "Reload previous image"
+msgstr "Lataa edellinen levykuva uudelleen"
msgid "&Folder..."
msgstr "&Kansio..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Peruuta"
-msgid "Save these settings as &global defaults"
-msgstr "Tallenna nämä asetukset &globaaleiksi oletuksiksi"
-
msgid "&Default"
msgstr "&Oletus"
msgid "Language:"
msgstr "Kieli:"
-msgid "Icon set:"
-msgstr "Kuvakkeet:"
-
msgid "Gain"
msgstr "Taso"
@@ -648,8 +645,8 @@ msgstr "Paina Ctrl+Alt+PgDn palataksesi ikkunoituun tilaan."
msgid "Speed"
msgstr "Nopeus"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP-levykuvat"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "Kt"
-msgid "Could not initialize the video renderer."
-msgstr "Videorenderöijän alustus epäonnistui"
-
msgid "Default"
msgstr "Oletus"
-msgid "%i Wait state(s)"
-msgstr "%i odotustilaa"
+msgid "%1 Wait state(s)"
+msgstr "%1 odotustilaa"
msgid "Type"
msgstr "Tyyppi"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Ei mikään"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u Mt (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 Mt (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Levyke %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Levyke %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Kehittyneet sektorilevykuvat"
@@ -828,8 +822,8 @@ msgstr "Ghostscriptin alustus epäonnistui"
msgid "Unable to initialize GhostPCL"
msgstr "GhostPCLin alustus epäonnistui"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "MO-levykuvat"
@@ -903,11 +897,8 @@ msgstr "%1 - Laitteen määritykset"
msgid "Monitor in sleep mode"
msgstr "Näyttö lepotilassa"
-msgid "OpenGL Shaders"
-msgstr "OpenGL-varjostinohjelmat"
-
-msgid "OpenGL options"
-msgstr "OpenGL-asetukset"
+msgid "GLSL shaders"
+msgstr "GLSL-varjostinohjelmat"
msgid "You are loading an unsupported configuration"
msgstr "Olet lataamassa ei-tuettuja määrittelyjä"
@@ -918,24 +909,18 @@ msgstr "Valittuun tietokoneeseen perustuva suoritintyypin suodatus ei ole käyt
msgid "Continue"
msgstr "Jatka"
-msgid "Cassette: %s"
-msgstr "Kasetti: %s"
+msgid "Cassette: %1"
+msgstr "Kasetti: %1"
msgid "Cassette images"
msgstr "Kasettitiedostot"
-msgid "Cartridge %i: %ls"
-msgstr "ROM-moduuli %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "ROM-moduuli %1: %2"
msgid "Cartridge images"
msgstr "ROM-moduulikuvat"
-msgid "Error initializing renderer"
-msgstr "Virhe renderöijän alustuksessa"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "OpenGL (3.0 Core)-renderöijän alustus epäonnistui. Käytä toista renderöijää."
-
msgid "Resume execution"
msgstr "Jatka suoritusta"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 Kt"
@@ -1278,9 +1263,6 @@ msgstr "Tyhjennä kuvahistoria"
msgid "Create..."
msgstr "Luo..."
-msgid "previous image"
-msgstr "edellinen levykuva"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Isäntä CD/DVD-asema (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Tuntematon väylä"
msgid "Null Driver"
msgstr "Nolla-ajuri"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Virhe \"%1\" avaamisessa: %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Virhe vertex-shaderin kääntämisessä tiedostossa \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Virhe fragmenttivarjostimen kääntämisessä tiedostossa \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Virhe varjostinohjelman linkittämisessä tiedostoon \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0-alustusasetukset"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Renderöintikäyttäytyminen"
@@ -1320,9 +1287,6 @@ msgstr " ruutua/s"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Renderöi jokainen ruutu välittömästi synkronoidusti emuloidun näytön kanssa.</p><p><span style=" font-style:italic;">Tämä on suositeltava vaihtoehto, jos käytössä olevat varjostimet eivät käytä frametimeä animaatioefekteihin.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Synkronisoi videoon"
@@ -1338,15 +1302,6 @@ msgstr "Ei valittu varjostinohjelmatta"
msgid "Browse..."
msgstr "Selaa..."
-msgid "Shader error"
-msgstr "Varjostinohjelmatvirhe"
-
-msgid "Could not load shaders."
-msgstr "Varjostinohjelmateita ei voitu ladata."
-
-msgid "More information in details."
-msgstr "Lisätietoja yksityiskohtaisesti."
-
msgid "Couldn't create OpenGL context."
msgstr "OpenGL-kontekstia ei voitu luoda."
@@ -1356,17 +1311,11 @@ msgstr "Ei voitu siirtyä OpenGL-kontekstiin."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Tarvitaan OpenGL-versio 3.0 tai uudempi. Nykyinen versio on %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL:n alustaminen epäonnistui. Virhe %1."
-
msgid "Error initializing OpenGL"
msgstr "Virhe OpenGL:n alustamisessa"
-msgid "Falling back to software rendering.\n"
-msgstr "Paluu ohjelmistoalustusöintiin.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Pakkauspuskurin muistin varaaminen epäonnistui.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nPaluu ohjelmistoalustusöintiin."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Kun valitset mediakuvia (CD-ROM, levykkeet jne.), avausikkuna käynnistyy samaan hakemistoon kuin 86Boxin konfigurointitiedosto. Tällä asetuksella on todennäköisesti merkitystä vain macOS-käyttöjärjestelmässä.</p></body></html>"
@@ -1434,9 +1383,6 @@ msgstr "Sarjaportin läpivienti 3"
msgid "Serial port passthrough 4"
msgstr "Sarjaportin läpivienti 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Alustusasetukset..."
@@ -2103,8 +2049,8 @@ msgstr "Nimetty putki (palvelin)"
msgid "Host Serial Passthrough"
msgstr "Isännän sarjaportin läpivienti"
-msgid "Eject %s"
-msgstr "Poista kasettipesästä %s"
+msgid "E&ject %1"
+msgstr "&Poista kasettipesästä %1"
msgid "&Unmute"
msgstr "&Poista mykistys"
@@ -2115,8 +2061,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Suuri vaikutus suorituskykyyn"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM-levy (maksiminopeus)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM-levy (maksiminopeus)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A-klooni (ISA)"
@@ -2135,3 +2102,63 @@ msgstr "Pistematriisifontteja ei löydy"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "TrueType-fontteja kansiossa \"roms/printer/fonts\"-hakemistoon yleinen ESC/P pistematriisitulostin emulointiin."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po
index 590674a29..ebb181a30 100644
--- a/src/qt/languages/fr-FR.po
+++ b/src/qt/languages/fr-FR.po
@@ -18,8 +18,8 @@ msgstr "CTRL &Droite devient ALT Gauche"
msgid "&Hard Reset..."
msgstr "&Hard Reset..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Lineaire"
msgid "Hi&DPI scaling"
msgstr "Mise à l'échelle Hi&DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Plein Ecran\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Plein Ecran"
msgid "Fullscreen &stretch mode"
msgstr "Mode &Elargi plein écran"
@@ -186,8 +186,11 @@ msgstr "&Réglages..."
msgid "&Update status bar icons"
msgstr "Mettre à jour la barre de stat&us"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Copie &Ecran\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Copie &Ecran"
+
+msgid "S&ound"
+msgstr "S&on"
msgid "&Preferences..."
msgstr "&Préférences..."
@@ -198,11 +201,11 @@ msgstr "Activer intégration &Discord"
msgid "Sound &gain..."
msgstr "&Gain Son..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Démarrer traces\tCtrl+T"
+msgid "Begin trace"
+msgstr "Démarrer traces"
-msgid "End trace\tCtrl+T"
-msgstr "Finir traces\tCtrl+T"
+msgid "End trace"
+msgstr "Finir traces"
msgid "&Help"
msgstr "&Aide"
@@ -220,7 +223,7 @@ msgid "&Existing image..."
msgstr "Image &Existante..."
msgid "Existing image (&Write-protected)..."
-msgstr "Image Existante(&Lecture seule)..."
+msgstr "Image Existante (&Lecture seule)..."
msgid "&Record"
msgstr "En®istrer"
@@ -235,7 +238,7 @@ msgid "&Fast forward to the end"
msgstr "Aller à la &Fin"
msgid "E&ject"
-msgstr "E&jecter"
+msgstr "É&jecter"
msgid "&Image..."
msgstr "&Image..."
@@ -249,8 +252,8 @@ msgstr "&Couper"
msgid "E&mpty"
msgstr "E&jecter"
-msgid "&Reload previous image"
-msgstr "&Recharger image précedente"
+msgid "Reload previous image"
+msgstr "Recharger image précedente"
msgid "&Folder..."
msgstr "&Dossier..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Annuler"
-msgid "Save these settings as &global defaults"
-msgstr "Sauvegarder ces paramètres comme valeurs par défaut &globales"
-
msgid "&Default"
msgstr "&Défaut"
msgid "Language:"
msgstr "Langue:"
-msgid "Icon set:"
-msgstr "Ensemble d'icônes:"
-
msgid "Gain"
msgstr "Gain"
@@ -648,8 +645,8 @@ msgstr "Appuyez sur Ctrl+Alt+PgDn pour revenir au mode fenêtré."
msgid "Speed"
msgstr "Vitesse"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Images ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "Ko"
-msgid "Could not initialize the video renderer."
-msgstr "Impossible d'initialiser le moteur de rendu vidéo."
-
msgid "Default"
msgstr "Défaut"
-msgid "%i Wait state(s)"
-msgstr "%i état(s) d'attente"
+msgid "%1 Wait state(s)"
+msgstr "%1 état(s) d'attente"
msgid "Type"
msgstr "Type"
@@ -804,11 +798,11 @@ msgstr "Système de contrôle de vol Thrustmaster"
msgid "None"
msgstr "Aucun"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u Mo (CTS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 Mo (CTS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disquette %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disquette %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Images du secteur avancés"
@@ -828,8 +822,8 @@ msgstr "Impossible d'initialiser Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Impossible d'initialiser GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "Magnéto-optique %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "Magnéto-optique %1 (%2): %3"
msgid "MO images"
msgstr "Images magnéto-optiques"
@@ -903,11 +897,8 @@ msgstr "Configuration du dispositif %1"
msgid "Monitor in sleep mode"
msgstr "Moniteur en mode veille"
-msgid "OpenGL Shaders"
-msgstr "Shaders OpenGL"
-
-msgid "OpenGL options"
-msgstr "Options OpenGL"
+msgid "GLSL shaders"
+msgstr "Shaders GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Vous chargez une configuration non prise en charge"
@@ -918,24 +909,18 @@ msgstr "La filtrage du type du processeur sur la base de la machine sélectionn
msgid "Continue"
msgstr "Continuer"
-msgid "Cassette: %s"
-msgstr "Cassette: %s"
+msgid "Cassette: %1"
+msgstr "Cassette: %1"
msgid "Cassette images"
msgstr "Images cassette"
-msgid "Cartridge %i: %ls"
-msgstr "Cartouche %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartouche %1: %2"
msgid "Cartridge images"
msgstr "Images cartouche"
-msgid "Error initializing renderer"
-msgstr "Erreur d'initialisation du moteur de rendu"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Le moteur de rendu OpenGL (3.0 Core) n'a pas pu être initialisé. Utilisez un autre moteur de rendu."
-
msgid "Resume execution"
msgstr "Reprendre l'exécution"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 Ko"
@@ -1278,9 +1263,6 @@ msgstr "Effacer l'historique de l'image"
msgid "Create..."
msgstr "Créer..."
-msgid "previous image"
-msgstr "image précedente"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Lecteur CD/DVD hôte (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Bus inconnu"
msgid "Null Driver"
msgstr "Pilote nul"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Erreur d'ouverture de \"%1\" : %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Erreur de compilation du vertex shader dans le fichier \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Erreur de compilation du fragment shader dans le fichier \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Erreur de liaison du programme shader dans le fichier \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Options de rendu OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Comportement de rendu"
@@ -1320,9 +1287,6 @@ msgstr " mages par seconde"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Rendre chaque image immédiatement, en synchronisation avec l'affichage émulé.</p><p><span style=" font-style:italic;">C'est l'option recommandée si les shaders utilisés n'utilisent pas le frametime pour les effets animés.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Synchronisation avec la vidéo"
@@ -1332,21 +1296,9 @@ msgstr "Shaders"
msgid "Remove"
msgstr "Retirer"
-msgid "No shader selected"
-msgstr "Pas de shader sélectionné"
-
msgid "Browse..."
msgstr "Parcourir..."
-msgid "Shader error"
-msgstr "Erreur de shader"
-
-msgid "Could not load shaders."
-msgstr "Impossible de charger les shaders."
-
-msgid "More information in details."
-msgstr "Plus d'informations dans les détails."
-
msgid "Couldn't create OpenGL context."
msgstr "Impossible de créer un contexte OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Impossible de passer au contexte OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "La version 3.0 ou supérieure d'OpenGL est requise. La version actuelle est %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "L'initialisation d'OpenGL a échoué. Erreur %1."
-
msgid "Error initializing OpenGL"
msgstr "Erreur d'initialisation d'OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Se rabattre sur le rendu logiciel.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "L'allocation de mémoire pour le tampon de décompression a échoué.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nSe rabattre sur le rendu logiciel."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Lors de la sélection d'images multimédia (CD-ROM, disquette, etc.), la boîte de dialogue d'ouverture démarrera dans le même répertoire que le fichier de configuration de 86Box. Ce paramètre ne fera probablement une différence que sur macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Passage du port série 3"
msgid "Serial port passthrough 4"
msgstr "Passage du port série 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Options de rendu..."
@@ -2103,8 +2046,8 @@ msgstr "Tuyau nommé (serveur)"
msgid "Host Serial Passthrough"
msgstr "Passage du port série de l'hôte"
-msgid "Eject %s"
-msgstr "Éjecter %s"
+msgid "E&ject %1"
+msgstr "É&jecter %1"
msgid "&Unmute"
msgstr "&Réactiver son"
@@ -2115,8 +2058,29 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Impact important sur la performance"
-msgid "RAM Disk (max. speed)"
-msgstr "Disque RAM (vitesse maximale)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disque RAM (vitesse maximale)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Clon IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Impossible de trouver les polices à matrice à points"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Les polices TrueType dans le répertoire \"roms/printer/fonts\" sont nécessaires à l'émulation de l'imprimante générique ESC/P à matrice à points."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po
index ed4fdf621..c1f6480c2 100644
--- a/src/qt/languages/hr-HR.po
+++ b/src/qt/languages/hr-HR.po
@@ -18,8 +18,8 @@ msgstr "&Desni CTRL je lijevi ALT"
msgid "&Hard Reset..."
msgstr "&Ponovno pokretanje..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Linearna"
msgid "Hi&DPI scaling"
msgstr "&HiDPI skaliranje"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Cijelozaslonski način\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Cijelozaslonski način"
msgid "Fullscreen &stretch mode"
msgstr "&Način cijelozaslonskog rastezanja"
@@ -186,8 +186,11 @@ msgstr "&Opcije..."
msgid "&Update status bar icons"
msgstr "&Ažuriraj ikone statusnog redka"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Napravi &snimku zaslona\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Napravi &snimku zaslona"
+
+msgid "S&ound"
+msgstr "&Zvuk"
msgid "&Preferences..."
msgstr "&Postavke..."
@@ -198,11 +201,11 @@ msgstr "Omogući integraciju sa programom &Discord"
msgid "Sound &gain..."
msgstr "&Pojačavanje zvuka..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Z&apočni praćenje\tCtrl+T"
+msgid "Begin trace"
+msgstr "Z&apočni praćenje"
-msgid "End trace\tCtrl+T"
-msgstr "&Svrši praćenje\tCtrl+T"
+msgid "End trace"
+msgstr "&Svrši praćenje"
msgid "&Help"
msgstr "&Pomoć"
@@ -249,8 +252,8 @@ msgstr "&Isključi zvuk"
msgid "E&mpty"
msgstr "&Prazno"
-msgid "&Reload previous image"
-msgstr "&Ponovo učitaj prethodnu sliku"
+msgid "Reload previous image"
+msgstr "Ponovo učitaj prethodnu sliku"
msgid "&Folder..."
msgstr "&Mapa..."
@@ -306,18 +309,12 @@ msgstr "U redu"
msgid "Cancel"
msgstr "Otkaži"
-msgid "Save these settings as &global defaults"
-msgstr "Spremite ove postavke kao &globalne zadane postavke"
-
msgid "&Default"
msgstr "Zadano"
msgid "Language:"
msgstr "Jezik:"
-msgid "Icon set:"
-msgstr "Paket ikona:"
-
msgid "Gain"
msgstr "Pojačavanje"
@@ -648,8 +645,8 @@ msgstr "Pritisnite Ctrl+Alt+PgDn za povratak u prozorski način rada."
msgid "Speed"
msgstr "Brzina"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP slike"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Nije moguće inicijalizirati renderer."
-
msgid "Default"
msgstr "Standard"
-msgid "%i Wait state(s)"
-msgstr "%i stanje čekanja"
+msgid "%1 Wait state(s)"
+msgstr "%1 stanje čekanja"
msgid "Type"
msgstr "Tip"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Bez"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disketa %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disketa %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Napredne sektorske slike"
@@ -828,8 +822,8 @@ msgstr "Nije moguće inicijalizirati GhostScript"
msgid "Unable to initialize GhostPCL"
msgstr "Nije moguće inicijalizirati GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "MO slike"
@@ -903,11 +897,8 @@ msgstr "Konfiguracija uređaja %1"
msgid "Monitor in sleep mode"
msgstr "Ekran u stanju mirovanja"
-msgid "OpenGL Shaders"
-msgstr "OpenGL shaderi"
-
-msgid "OpenGL options"
-msgstr "OpenGL opcije"
+msgid "GLSL shaders"
+msgstr "GLSL shaderi"
msgid "You are loading an unsupported configuration"
msgstr "Učitavate nepodržanu konfiguraciju"
@@ -918,24 +909,18 @@ msgstr "Filtriranje tipa CPU-a na temelju odabranog sistema onemogućeno je za o
msgid "Continue"
msgstr "Nastavi"
-msgid "Cassette: %s"
-msgstr "Audio kaseta: %s"
+msgid "Cassette: %1"
+msgstr "Audio kaseta: %1"
msgid "Cassette images"
msgstr "Slike audio kasete"
-msgid "Cartridge %i: %ls"
-msgstr "Kaseta %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Kaseta %1: %2"
msgid "Cartridge images"
msgstr "Slike kasete"
-msgid "Error initializing renderer"
-msgstr "Nije moguće inicijalizirati renderer"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Nije moguće inicijalizirati OpenGL (3.0 jezgra) renderer. Molimte koristite drugi renderer."
-
msgid "Resume execution"
msgstr "Nastavi"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "Očisti povijest slika"
msgid "Create..."
msgstr "Stvori..."
-msgid "previous image"
-msgstr "prethodna slika"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "CD/DVD pogon nositelja (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Nepoznata sabirnica"
msgid "Null Driver"
msgstr "Nulti upravljački program"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Nije moguće otvoriti \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Nije moguće sastaviti vertex shader u datoteci \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Nije moguće sastaviti framgent shader u datoteci \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Nije moguće povezati program shader u datoteci \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Opcije renderera OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Ponašanje rendera"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Odmah napravi svaki okvir, sinkronizirano s emuliranim zaslonom.</p><p><span style=" font-style:italic;">Ovo je preporučena opcija, ako korišćeni shader ne koristi vreme okvira za animirane efekte.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Sinkroniziraj s videom"
@@ -1332,21 +1296,9 @@ msgstr "Shaderi"
msgid "Remove"
msgstr "Ukloni"
-msgid "No shader selected"
-msgstr "Bez odabranog shadera"
-
msgid "Browse..."
msgstr "Pregledajte..."
-msgid "Shader error"
-msgstr "Greška shadera"
-
-msgid "Could not load shaders."
-msgstr "Nije moguće učitati shadere."
-
-msgid "More information in details."
-msgstr "Više informacija u detaljima."
-
msgid "Couldn't create OpenGL context."
msgstr "Nije moguće stvoriti kontekst OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Nije se moguće prebaciti na kontekst OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Potrebna je OpenGL verzija 3.0 ili više. Trenutna verzija je %1. %2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Nije moguće inicijalizirati OpenGL. Greška %1."
-
msgid "Error initializing OpenGL"
msgstr "Nije moguće inicijalizirati OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Vraća se na softverski renderer.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Nije moguće idodijeliti memoriju za međuspremnik za raspakiranje.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nVraća se na softverski renderer."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Prilikom odabira medijskih slika (CD-ROM, diskete itd.), otvoreni dijalog zopočet će u istom direktoriju kao i konfiguracijska datoteka 86Box-a. Razlika će vjerojatno biti primjetna samo na macOS-u.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Prolaz serijskih vrata 3"
msgid "Serial port passthrough 4"
msgstr "Prolaz serijskih vrata 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Opcije rendera..."
@@ -2103,8 +2046,8 @@ msgstr "Imenovani vod (server)"
msgid "Host Serial Passthrough"
msgstr "Prolaz serijskih vrata nositelja"
-msgid "Eject %s"
-msgstr "Izbaci %s"
+msgid "E&ject %1"
+msgstr "&Izbaci %1"
msgid "&Unmute"
msgstr "&Uključi zvuk"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Visoki učinak na brzinu izvršavanja"
-msgid "RAM Disk (max. speed)"
-msgstr "Disk RAM (najviša brzina)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disk RAM (najviša brzina)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Klon IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Nije moguće pronaći matrične fontove"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "TrueType fontovi u mapi \"roms/printer/fonts\" potrebni su za emulaciju generičnog matričnog pisača ESC/P."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po
index b4afd8010..09f914860 100644
--- a/src/qt/languages/hu-HU.po
+++ b/src/qt/languages/hu-HU.po
@@ -18,8 +18,8 @@ msgstr "A &jobb oldali CTRL a bal ALT"
msgid "&Hard Reset..."
msgstr "Hardveres &újraindítás..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Lineáris"
msgid "Hi&DPI scaling"
msgstr "Hi&DPI méretezés"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Teljes képernyő\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Teljes képernyő"
msgid "Fullscreen &stretch mode"
msgstr "Teljes képernyős &méretezés"
@@ -186,8 +186,11 @@ msgstr "&Konfigurálás..."
msgid "&Update status bar icons"
msgstr "Állapotsori ikonok &frissítése"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "&Képernyőkép készítése\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "&Képernyőkép készítése"
+
+msgid "S&ound"
+msgstr "&Hang"
msgid "&Preferences..."
msgstr "&Beállítások..."
@@ -198,11 +201,11 @@ msgstr "&Discord integráció engedélyezése"
msgid "Sound &gain..."
msgstr "&Hangerőszabályzó..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Nyomkövetés megkezdése\tCtrl+T"
+msgid "Begin trace"
+msgstr "Nyomkövetés megkezdése"
-msgid "End trace\tCtrl+T"
-msgstr "Nyomkövetés befejezése\tCtrl+T"
+msgid "End trace"
+msgstr "Nyomkövetés befejezése"
msgid "&Help"
msgstr "&Súgó"
@@ -249,8 +252,8 @@ msgstr "&Némítás"
msgid "E&mpty"
msgstr "&Kiadás"
-msgid "&Reload previous image"
-msgstr "Előző képfájl &újratöltése"
+msgid "Reload previous image"
+msgstr "Előző képfájl újratöltése"
msgid "&Folder..."
msgstr "&Mappa..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Mégse"
-msgid "Save these settings as &global defaults"
-msgstr "Beállítások mentése &globális alapértékként"
-
msgid "&Default"
msgstr "&Alapértelmezett"
msgid "Language:"
msgstr "Nyelv:"
-msgid "Icon set:"
-msgstr "Ikonkészlet:"
-
msgid "Gain"
msgstr "Hangerő"
@@ -648,8 +645,8 @@ msgstr "Használja a Ctrl+Alt+PgDn gombokat az ablakhoz való visszatéréshez."
msgid "Speed"
msgstr "Sebesség"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP-lemezképek"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Nem sikerült inicializálni a videó megjelenítőt."
-
msgid "Default"
msgstr "Alapértelmezett"
-msgid "%i Wait state(s)"
-msgstr "%i várakozási ciklus(ok)"
+msgid "%1 Wait state(s)"
+msgstr "%1 várakozási ciklus(ok)"
msgid "Type"
msgstr "Típus"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Nincs"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Floppy %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Floppy %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Továbbfejlesztett szektor képek"
@@ -828,8 +822,8 @@ msgstr "Nem sikerült inicializálni a Ghostscript-et"
msgid "Unable to initialize GhostPCL"
msgstr "Nem sikerült inicializálni a GhostPCL-et"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "MO-képfájlok"
@@ -903,11 +897,8 @@ msgstr "%1 eszközkonfiguráció"
msgid "Monitor in sleep mode"
msgstr "Képernyő alvó módban"
-msgid "OpenGL Shaders"
-msgstr "OpenGL Shaderek"
-
-msgid "OpenGL options"
-msgstr "OpenGL beállítások"
+msgid "GLSL shaders"
+msgstr "GLSL shaderek"
msgid "You are loading an unsupported configuration"
msgstr "Egy nem támogatott konfigurációt tölt be"
@@ -918,24 +909,18 @@ msgstr "A kiválasztott gépen alapuló CPU-típusszűrés le van tiltva ezen az
msgid "Continue"
msgstr "Folytatás"
-msgid "Cassette: %s"
-msgstr "Magnókazetta: %s"
+msgid "Cassette: %1"
+msgstr "Magnókazetta: %1"
msgid "Cassette images"
msgstr "Magnókazetta-képek"
-msgid "Cartridge %i: %ls"
-msgstr "ROM-kazetta %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "ROM-kazetta %1: %2"
msgid "Cartridge images"
msgstr "ROM-kazetta képek"
-msgid "Error initializing renderer"
-msgstr "Hiba történt a renderelő inicializálásakor"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Az OpenGL (3.0 Core) megjelenítő-motort nem sikerült inicializálni. Kérem használjon másik renderelőt."
-
msgid "Resume execution"
msgstr "Folytassa a végrehajtást"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1270,7 +1255,7 @@ msgid "Host CD/DVD Drive (%1:)"
msgstr "Gazdag CD/DVD-meghajtó (%1:)"
msgid "&Connected"
-msgstr "&Connected"
+msgstr ""
msgid "Clear image history"
msgstr "Törölje a kép előzményeit"
@@ -1278,9 +1263,6 @@ msgstr "Törölje a kép előzményeit"
msgid "Create..."
msgstr "Hozzon létre..."
-msgid "previous image"
-msgstr "előző képfájl"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Gazdag CD/DVD-meghajtó (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Ismeretlen busz"
msgid "Null Driver"
msgstr "Null Driver"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Hiba a \"%1\" megnyitásakor: %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Hiba a vertex shader fordításában a \"%1\" fájlban"
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Hiba a fragment shader fordításában a \"%1\" fájlban"
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Hiba a shader program összekapcsolásában a \"%1\" fájlban"
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0 renderelési beállítások"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Renderelési viselkedés"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Az egyes képkockák azonnali, az emulált kijelzővel szinkronizált megjelenítése.</p><p><span style=" font-style:italic;"">Ez az ajánlott opció, ha a használt shaderek nem használják a frametime-ot az animált effektusokhoz.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Szinkronizálás a videóval"
@@ -1332,21 +1296,9 @@ msgstr "Shaderek"
msgid "Remove"
msgstr "Távolítsa el a"
-msgid "No shader selected"
-msgstr "Nincs shader kiválasztva"
-
msgid "Browse..."
msgstr "Böngésszen..."
-msgid "Shader error"
-msgstr "Shader hiba"
-
-msgid "Could not load shaders."
-msgstr "Nem sikerült betölteni a shadereket."
-
-msgid "More information in details."
-msgstr "További információ a részletekről."
-
msgid "Couldn't create OpenGL context."
msgstr "Nem sikerült OpenGL-kontextust létrehozni."
@@ -1356,17 +1308,11 @@ msgstr "Nem tudott OpenGL-kontextusra váltani."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Az OpenGL 3.0 vagy magasabb verziója szükséges. Az aktuális verzió %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Az OpenGL inicializálása sikertelen. Hiba %1."
-
msgid "Error initializing OpenGL"
msgstr "Hiba az OpenGL inicializálásában"
-msgid "Falling back to software rendering.\n"
-msgstr "Visszatérés a szoftveres rendereléshez.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "A memória kiosztása a kicsomagolási pufferhez sikertelen.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nVisszatérés a szoftveres rendereléshez."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>A médiaképek (CD-ROM, floppy stb.) kiválasztásakor a megnyitási párbeszédpanel ugyanabban a könyvtárban indul, mint a 86Box konfigurációs fájl. Ez a beállítás valószínűleg csak a macOS rendszerben jelent különbséget.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Soros port áthaladás 3"
msgid "Serial port passthrough 4"
msgstr "Soros port áthaladás 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Renderer opciók..."
@@ -2103,8 +2046,8 @@ msgstr "Megnevezett cső (kiszolgáló)"
msgid "Host Serial Passthrough"
msgstr "Az állomás soros portjának áthaladása"
-msgid "Eject %s"
-msgstr "%s kiadás"
+msgid "E&ject %1"
+msgstr "%1 &kiadás"
msgid "&Unmute"
msgstr "&Hang újra bekapcsolása"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Nagy hatással van a teljesítményre"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM lemez (max. sebesség)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM lemez (max. sebesség)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A klón (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Nem találja a Dot-Matrix betűtípusokat"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Az általános ESC/P pontmátrixnyomtató emulációjához a \"roms/printer/fonts\" könyvtárban található TrueType betűtípusok szükségesek."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po
index 73ec57ec0..c9694c3be 100644
--- a/src/qt/languages/it-IT.po
+++ b/src/qt/languages/it-IT.po
@@ -18,8 +18,8 @@ msgstr "&CTRL destro è ALT sinistro"
msgid "&Hard Reset..."
msgstr "&Riavvia..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Lineare"
msgid "Hi&DPI scaling"
msgstr "Scala Hi&DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Schermo intero\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Schermo intero"
msgid "Fullscreen &stretch mode"
msgstr "Modalità adattamento &schermo intero"
@@ -186,8 +186,11 @@ msgstr "&Impostazioni..."
msgid "&Update status bar icons"
msgstr "&Aggiorna icone della barra di stato"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Cattura schermata\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Cattura schermata"
+
+msgid "S&ound"
+msgstr "A&udio"
msgid "&Preferences..."
msgstr "&Preferenze..."
@@ -198,11 +201,11 @@ msgstr "Abilita &integrazione Discord"
msgid "Sound &gain..."
msgstr "Guadagno &suono..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Inizia traccia\tCtrl+T"
+msgid "Begin trace"
+msgstr "Inizia traccia"
-msgid "End trace\tCtrl+T"
-msgstr "Ferma traccia\tCtrl+T"
+msgid "End trace"
+msgstr "Ferma traccia"
msgid "&Help"
msgstr "&?"
@@ -249,8 +252,8 @@ msgstr "&Muto"
msgid "E&mpty"
msgstr "&Espelli"
-msgid "&Reload previous image"
-msgstr "&Ricarica l'immagine precedente"
+msgid "Reload previous image"
+msgstr "Ricarica l'immagine precedente"
msgid "&Folder..."
msgstr "&Cartella..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Annulla"
-msgid "Save these settings as &global defaults"
-msgstr "Salva queste impostazioni come &predefinite globali"
-
msgid "&Default"
msgstr "&Predefinito"
msgid "Language:"
msgstr "Lingua:"
-msgid "Icon set:"
-msgstr "Pacchetto di icone:"
-
msgid "Gain"
msgstr "Guadagno"
@@ -648,8 +645,8 @@ msgstr "Usa Ctrl+Alt+PgDn per tornare alla modalità finestra."
msgid "Speed"
msgstr "Velocità"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Immagini ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Impossibile inizializzare il renderer video."
-
msgid "Default"
msgstr "Predefinito"
-msgid "%i Wait state(s)"
-msgstr "%i stati d'attesa"
+msgid "%1 Wait state(s)"
+msgstr "%1 stati d'attesa"
msgid "Type"
msgstr "Tipo"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Nessuno"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Floppy %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Floppy %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Immagini da settori avanzati"
@@ -828,8 +822,8 @@ msgstr "Impossibile inizializzare Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Impossibile inizializzare GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Immagini MO"
@@ -903,11 +897,8 @@ msgstr "Configurazione del dispositivo %1"
msgid "Monitor in sleep mode"
msgstr "Monitor in modalità riposo"
-msgid "OpenGL Shaders"
-msgstr "Shader OpenGL"
-
-msgid "OpenGL options"
-msgstr "Impostazioni OpenGL"
+msgid "GLSL shaders"
+msgstr "Shader GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Stai caricando una configurazione non supportata"
@@ -918,24 +909,18 @@ msgstr "Il filtraggio della tipologia di CPU è disabilitato per la macchina sel
msgid "Continue"
msgstr "Continua"
-msgid "Cassette: %s"
-msgstr "Cassetta: %s"
+msgid "Cassette: %1"
+msgstr "Cassetta: %1"
msgid "Cassette images"
msgstr "Immagini cassetta"
-msgid "Cartridge %i: %ls"
-msgstr "Cartuccia %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartuccia %1: %2"
msgid "Cartridge images"
msgstr "Immagini cartuccia"
-msgid "Error initializing renderer"
-msgstr "Errore nell'inizializzazione del renderer"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Non è stato possibile inizializzare il renderer OpenGL (3.0 Core). Utilizzare un altro renderer."
-
msgid "Resume execution"
msgstr "Riprendere l'esecuzione"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,35 +1263,17 @@ msgstr "Cancella la cronologia delle immagini"
msgid "Create..."
msgstr "Creare..."
-msgid "previous image"
-msgstr "immagine precedente"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Unità CD/DVD host (%1)"
msgid "Unknown Bus"
-msgstr "Autobus sconosciuto"
+msgstr "Bus sconosciuto"
msgid "Null Driver"
msgstr "Driver nullo"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Errore nell'apertura di \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Errore nella compilazione di vertex shader nel file \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Errore nella compilazione dello shader dei frammenti nel file \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Errore nel collegamento del programma shader nel file \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Opzioni del renderer OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Comportamento di rendering"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Renderizza ogni fotogramma immediatamente, in sincronia con la visualizzazione emulata.</p><p><span style=" font-style:italic;">Questa è l'opzione consigliata se gli shader in uso non utilizzano il frametime per gli effetti animati.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Sincronizza col video"
@@ -1332,21 +1296,9 @@ msgstr "Shader"
msgid "Remove"
msgstr "Rimuovere"
-msgid "No shader selected"
-msgstr "Nessuno shader selezionato"
-
msgid "Browse..."
msgstr "Sfoglia..."
-msgid "Shader error"
-msgstr "Errore dello shader"
-
-msgid "Could not load shaders."
-msgstr "Impossibile caricare gli shader."
-
-msgid "More information in details."
-msgstr "Maggiori informazioni in dettaglio."
-
msgid "Couldn't create OpenGL context."
msgstr "Impossibile creare un contesto OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Impossibile passare al contesto OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "È richiesta la versione OpenGL 3.0 o superiore. La versione attuale è %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Inizializzazione OpenGL non riuscita. Errore %1."
-
msgid "Error initializing OpenGL"
msgstr "Errore nell'inizializzazione di OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Ricaduta sul rendering software."
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "L'allocazione della memoria per il buffer di disimballaggio non è riuscita."
+msgid "\nFalling back to software rendering."
+msgstr "\nRicaduta sul rendering software."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Quando si selezionano immagini multimediali (CD-ROM, floppy, ecc.) la finestra di dialogo di apertura si avvia nella stessa directory del file di configurazione di 86Box. Questa impostazione probabilmente farà la differenza solo su macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Passaggio della porta seriale 3"
msgid "Serial port passthrough 4"
msgstr "Passaggio della porta seriale 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Opzioni del renderer..."
@@ -2103,8 +2046,8 @@ msgstr "Tubo denominato (Server)"
msgid "Host Serial Passthrough"
msgstr "Passaggio della porta seriale host"
-msgid "Eject %s"
-msgstr "Espelli %s"
+msgid "E&ject %1"
+msgstr "&Espelli %1"
msgid "&Unmute"
msgstr "&Riattiva l'audio"
@@ -2115,11 +2058,32 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Impatto elevato sulla prestazione"
-msgid "RAM Disk (max. speed)"
-msgstr "Disco RAM (velocità massima)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disco RAM (velocità massima)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
-msgstr "Clone IBM 8514/A(ISA)"
+msgstr "Clone IBM 8514/A (ISA)"
msgid "Vendor"
msgstr "Fabricante"
@@ -2135,3 +2099,63 @@ msgstr "Impossibile trovare i font a matrice di punti"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "I font TrueType presenti nella directory \"roms/printer/fonts\" sono necessari per l'emulazione della stampante a matrice di punti ESC/P generica."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po
index 6132a8db1..1c139aaec 100644
--- a/src/qt/languages/ja-JP.po
+++ b/src/qt/languages/ja-JP.po
@@ -18,8 +18,8 @@ msgstr "右CTRLを左ALTへ変換(&R)"
msgid "&Hard Reset..."
msgstr "ハード リセット(&H)..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "Ctrl+Alt+Del(&C)"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+Esc(&E)"
@@ -111,8 +111,8 @@ msgstr "線形補間(&L)"
msgid "Hi&DPI scaling"
msgstr "HiDPIスケーリング(&D)"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "全画面表示(&F)\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "全画面表示(&F)"
msgid "Fullscreen &stretch mode"
msgstr "全画面の拡大表示モード(&S)"
@@ -186,8 +186,11 @@ msgstr "設定(&S)..."
msgid "&Update status bar icons"
msgstr "ステータスバーのアイコンを更新(&U)"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "スクリーンショットを撮る(&C)\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "スクリーンショットを撮る(&C)"
+
+msgid "S&ound"
+msgstr "サウンド(&O)"
msgid "&Preferences..."
msgstr "環境設定(&P)..."
@@ -198,11 +201,11 @@ msgstr "Discord連携機能(&D)"
msgid "Sound &gain..."
msgstr "音量調整(&G)..."
-msgid "Begin trace\tCtrl+T"
-msgstr "トレース開始\tCtrl+T"
+msgid "Begin trace"
+msgstr "トレース開始"
-msgid "End trace\tCtrl+T"
-msgstr "トレース終了\tCtrl+T"
+msgid "End trace"
+msgstr "トレース終了"
msgid "&Help"
msgstr "ヘルプ(&H)"
@@ -249,8 +252,8 @@ msgstr "ミュート(&M)"
msgid "E&mpty"
msgstr "なし(&M)"
-msgid "&Reload previous image"
-msgstr "前のイメージを再読み込み(&R)"
+msgid "Reload previous image"
+msgstr "前のイメージを再読み込み"
msgid "&Folder..."
msgstr "フォルダ(&F)..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "キャンセル"
-msgid "Save these settings as &global defaults"
-msgstr "これらの設定をグローバル既定値として保存(&G)"
-
msgid "&Default"
msgstr "既定値(&D)"
msgid "Language:"
msgstr "言語:"
-msgid "Icon set:"
-msgstr "アイコンセット:"
-
msgid "Gain"
msgstr "音量"
@@ -648,8 +645,8 @@ msgstr "Ctrl+Alt+PgDnでウィンドウ モードに戻ります。"
msgid "Speed"
msgstr "速度"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIPイメージ"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "ビデオレンダラーが初期化できません。"
-
msgid "Default"
msgstr "既定値"
-msgid "%i Wait state(s)"
-msgstr "%iつのウェイト ステート"
+msgid "%1 Wait state(s)"
+msgstr "%1つのウェイト ステート"
msgid "Type"
msgstr "タイプ"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster飛行制御システム"
msgid "None"
msgstr "なし"
-msgid "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
msgstr "%u MB (CHS値: %i、%i、%i)"
-msgid "Floppy %i (%s): %ls"
-msgstr "フロッピー %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "フロッピー %1 (%2): %3"
msgid "Advanced sector images"
msgstr "アドバンスドセクターイメージ"
@@ -828,8 +822,8 @@ msgstr "Ghostscriptが初期化できません"
msgid "Unable to initialize GhostPCL"
msgstr "GhostPCLが初期化できません"
-msgid "MO %i (%ls): %ls"
-msgstr "光磁気 %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "光磁気 %1 (%2): %3"
msgid "MO images"
msgstr "光磁気イメージ"
@@ -903,11 +897,8 @@ msgstr "%1 のデバイス設定"
msgid "Monitor in sleep mode"
msgstr "モニターのスリープモード"
-msgid "OpenGL Shaders"
-msgstr "OpenGLシェーダー"
-
-msgid "OpenGL options"
-msgstr "OpenGL設定"
+msgid "GLSL shaders"
+msgstr "GLSLシェーダー"
msgid "You are loading an unsupported configuration"
msgstr "サポートされていないコンフィグを読み込んでいます"
@@ -918,24 +909,18 @@ msgstr "選択したマシンに基づくCPUタイプのフィルター機能は
msgid "Continue"
msgstr "続行"
-msgid "Cassette: %s"
-msgstr "カセット: %s"
+msgid "Cassette: %1"
+msgstr "カセット: %1"
msgid "Cassette images"
msgstr "カセットイメージ"
-msgid "Cartridge %i: %ls"
-msgstr "カートリッジ %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "カートリッジ %1: %2"
msgid "Cartridge images"
msgstr "カートリッジイメージ"
-msgid "Error initializing renderer"
-msgstr "レンダラーの初期化エラー"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "OpenGL (3.0 Core) レンダラーが初期化できません。別のレンダラーを使用してください。"
-
msgid "Resume execution"
msgstr "実行を再開"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "クリア画像履歴"
msgid "Create..."
msgstr "作成..."
-msgid "previous image"
-msgstr "前の画像"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "ホスト CD/DVD ドライブ (%1)"
@@ -1290,23 +1272,8 @@ msgstr "不明なバス"
msgid "Null Driver"
msgstr "ヌル・ドライバー"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "\"%1\"を開く際にエラーが発生しました: %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "ファイル\"%1\"の頂点シェーダのコンパイルエラー。"
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "ファイル\"%1\"のフラグメント・シェーダのコンパイル・エラー。"
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "ファイル\"%1\"のシェーダープログラムのリンクエラー。"
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0レンダラー設定"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "レンダリング動作"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSシンク"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>エミュレートされたディスプレイと同期して、各フレームを即座にレンダリングします。</p><p><span style=" font-style:italic;">これは、使用中のシェーダがアニメーション効果のためにフレームタイムを利用しない場合に推奨されるオプションです。</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "ビデオと同期"
@@ -1332,21 +1296,9 @@ msgstr "シェーダー"
msgid "Remove"
msgstr "削除"
-msgid "No shader selected"
-msgstr "シェーダーが選択されていない"
-
msgid "Browse..."
msgstr "ブラウズ..."
-msgid "Shader error"
-msgstr "シェーダーエラー"
-
-msgid "Could not load shaders."
-msgstr "シェーダーをロードできませんでした。"
-
-msgid "More information in details."
-msgstr "詳細はこちら。"
-
msgid "Couldn't create OpenGL context."
msgstr "OpenGLコンテキストを作成できませんでした。"
@@ -1356,17 +1308,11 @@ msgstr "OpenGLコンテキストに切り替えられなかった。"
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "OpenGLのバージョン3.0以上が必要です。現在のバージョンは %1.%2 です。"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL の初期化に失敗しました。エラー %1。"
-
msgid "Error initializing OpenGL"
msgstr "OpenGLの初期化エラー"
-msgid "Falling back to software rendering.\n"
-msgstr "ソフトウェアレンダリングに逆戻り。"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "アンパックバッファのメモリ確保に失敗しました。"
+msgid "\nFalling back to software rendering."
+msgstr "\nソフトウェアレンダリングに逆戻り。"
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>メディアイメージ(CD-ROM、フロッピーなど)を選択するとき、オープンダイアログは86Box設定ファイルと同じディレクトリで開始します。この設定は、おそらく macOS でのみ違いがあります。</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "シリアル・ポート・パススルー 3"
msgid "Serial port passthrough 4"
msgstr "シリアル・ポート・パススルー 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "ビジョン・システムズ LBAエンハンサー"
-
msgid "Renderer options..."
msgstr "レンダラー設定..."
@@ -2103,8 +2046,8 @@ msgstr "名前付きパイプ(サーバー)"
msgid "Host Serial Passthrough"
msgstr "ホストシリアルポートのパススルー"
-msgid "Eject %s"
-msgstr "%sを取り出す"
+msgid "E&ject %1"
+msgstr "%1を取り出す(&J)"
msgid "&Unmute"
msgstr "ミュート解除(&U)"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "パフォーマンスへの影響が大きい"
-msgid "RAM Disk (max. speed)"
-msgstr "RAMディスク(最高速度)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAMディスク(最高速度)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A クローン(ISA)"
@@ -2135,3 +2099,63 @@ msgstr "ドットマトリクスフォントが見つかりません"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "汎用ESC/Pドットマトリクスプリンタのエミュレーションには、roms/printer/fontsディレクトリ内のTrueTypeフォントが必要です。"
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po
index ec4b20d0d..941bd740a 100644
--- a/src/qt/languages/ko-KR.po
+++ b/src/qt/languages/ko-KR.po
@@ -18,8 +18,8 @@ msgstr "우측CTRL로 좌측ALT 입력(&R)"
msgid "&Hard Reset..."
msgstr "재시작(&H)..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "Ctrl+Alt+Del(&C)"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+Esc(&E)"
@@ -111,8 +111,8 @@ msgstr "선형 보간법(&L)"
msgid "Hi&DPI scaling"
msgstr "HiDPI 스케일링(&D)"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "전체 화면(&F)\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "전체 화면(&F)"
msgid "Fullscreen &stretch mode"
msgstr "전체 화면 비율(&S)"
@@ -186,8 +186,11 @@ msgstr "설정(&S)..."
msgid "&Update status bar icons"
msgstr "상태 바 아이콘 갱신하기(&U)"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "스크린샷 찍기(&C)\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "스크린샷 찍기(&C)"
+
+msgid "S&ound"
+msgstr "사운드(&O)"
msgid "&Preferences..."
msgstr "환경설정(&P)..."
@@ -198,11 +201,11 @@ msgstr "디스코드 연동 활성화하기(&D)"
msgid "Sound &gain..."
msgstr "음량 증폭(&G)..."
-msgid "Begin trace\tCtrl+T"
-msgstr "추적 시작하기\tCtrl+T"
+msgid "Begin trace"
+msgstr "추적 시작하기"
-msgid "End trace\tCtrl+T"
-msgstr "추적 끝내기\tCtrl+T"
+msgid "End trace"
+msgstr "추적 끝내기"
msgid "&Help"
msgstr "도움말(&H)"
@@ -249,8 +252,8 @@ msgstr "음소거(&M)"
msgid "E&mpty"
msgstr "비었음(&M)"
-msgid "&Reload previous image"
-msgstr "이전 이미지 다시 불러오기(&R)"
+msgid "Reload previous image"
+msgstr "이전 이미지 다시 불러오기"
msgid "&Folder..."
msgstr "폴더(&F)..."
@@ -306,18 +309,12 @@ msgstr "확인"
msgid "Cancel"
msgstr "취소"
-msgid "Save these settings as &global defaults"
-msgstr "이 설정들을 전역 기본값으로 저장하기(&G)"
-
msgid "&Default"
msgstr "기본값(&D)"
msgid "Language:"
msgstr "언어:"
-msgid "Icon set:"
-msgstr "아이콘셋:"
-
msgid "Gain"
msgstr "증가값"
@@ -648,8 +645,8 @@ msgstr "Ctrl+Alt+PgDn 키를 누르면 창 모드로 전환합니다."
msgid "Speed"
msgstr "속도"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP 이미지"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "비디오 렌더러를 초기화할 수 없습니다."
-
msgid "Default"
msgstr "기본값"
-msgid "%i Wait state(s)"
-msgstr "%i 대기 상태"
+msgid "%1 Wait state(s)"
+msgstr "%1 대기 상태"
msgid "Type"
msgstr "형식"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "없음"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "플로피 %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "플로피 %1 (%2): %3"
msgid "Advanced sector images"
msgstr "어드밴스드 섹터 이미지"
@@ -828,8 +822,8 @@ msgstr "Ghostscript를 초기화할 수 없습니다"
msgid "Unable to initialize GhostPCL"
msgstr "GhostPCL를 초기화할 수 없습니다"
-msgid "MO %i (%ls): %ls"
-msgstr "광자기 %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "광자기 %1 (%2): %3"
msgid "MO images"
msgstr "광자기 이미지"
@@ -903,11 +897,8 @@ msgstr "%1 장치 설정"
msgid "Monitor in sleep mode"
msgstr "모니터 절전 모드"
-msgid "OpenGL Shaders"
-msgstr "OpenGL 쉐이더"
-
-msgid "OpenGL options"
-msgstr "OpenGL 설정"
+msgid "GLSL shaders"
+msgstr "GLSL 쉐이더"
msgid "You are loading an unsupported configuration"
msgstr "지원하지 않는 설정입니다"
@@ -918,24 +909,18 @@ msgstr "이 에뮬레이트된 기종에 대해 선택한 기종을 기반으로
msgid "Continue"
msgstr "계속"
-msgid "Cassette: %s"
-msgstr "카세트: %s"
+msgid "Cassette: %1"
+msgstr "카세트: %1"
msgid "Cassette images"
msgstr "카세트 이미지"
-msgid "Cartridge %i: %ls"
-msgstr "카트리지 %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "카트리지 %1: %2"
msgid "Cartridge images"
msgstr "카트리지 이미지"
-msgid "Error initializing renderer"
-msgstr "렌더러 초기화 오류"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "OpenGL (3.0 Core) 렌더러를 초기화할 수 없습니다. 다른 렌더러를 사용하십시오."
-
msgid "Resume execution"
msgstr "실행 재개"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "이미지 기록 지우기"
msgid "Create..."
msgstr "만들기..."
-msgid "previous image"
-msgstr "이전 이미지"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "호스트 CD/DVD 드라이브 (%1)"
@@ -1290,23 +1272,8 @@ msgstr "알 수 없는 버스"
msgid "Null Driver"
msgstr "Null 드라이버"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "열기 오류 \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "파일 \"%1\"에서 버텍스 셰이더를 컴파일하는 동안 오류가 발생했습니다."
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "파일에서 조각 셰이더 컴파일 중 오류 발생 \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "파일에서 셰이더 프로그램 연결 중 오류 \"%1\"\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0 렌더러 옵션"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "렌더링 동작"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>;에뮬레이트된 디스플레이와 동기화하여 각 프레임을 즉시 렌더링합니다.</p><p><span style=" font-style:italic;">사용 중인 셰이더가 애니메이션 효과에 프레임 시간을 활용하지 않는 경우 권장되는 옵션입니다.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "비디오와 동기"
@@ -1332,21 +1296,9 @@ msgstr "셰이더"
msgid "Remove"
msgstr "제거"
-msgid "No shader selected"
-msgstr "셰이더를 선택하지 않음"
-
msgid "Browse..."
msgstr "찾아보기..."
-msgid "Shader error"
-msgstr "셰이더 오류"
-
-msgid "Could not load shaders."
-msgstr "셰이더를 로드할 수 없습니다."
-
-msgid "More information in details."
-msgstr "자세한 내용은 자세히 알아보세요."
-
msgid "Couldn't create OpenGL context."
msgstr "OpenGL 컨텍스트를 만들 수 없습니다."
@@ -1356,17 +1308,11 @@ msgstr "OpenGL 컨텍스트로 전환할 수 없습니다."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "OpenGL 버전 3.0 이상이 필요합니다. 현재 버전은 %1.%2입니다."
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL 초기화에 실패했습니다. 오류 %1입니다."
-
msgid "Error initializing OpenGL"
msgstr "OpenGL 초기화 중 오류 발생"
-msgid "Falling back to software rendering.\n"
-msgstr "소프트웨어 렌더링으로 돌아가기.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "압축 해제 버퍼에 메모리를 할당하지 못했습니다.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\n소프트웨어 렌더링으로 돌아가기."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>미디어 이미지(CD-ROM, 플로피 등)를 선택하면 86Box 구성 파일과 동일한 디렉터리에서 열기 대화 상자가 시작됩니다. 이 설정은 macOS에서만 차이가 있을 수 있습니다.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "직렬 포트 패스스루 3"
msgid "Serial port passthrough 4"
msgstr "직렬 포트 패스스루 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "비전 시스템 LBA 인핸서"
-
msgid "Renderer options..."
msgstr "렌더러 옵션..."
@@ -2103,8 +2046,8 @@ msgstr "네임드 파이프(서버)"
msgid "Host Serial Passthrough"
msgstr "호스트 직렬 포트 패스스루"
-msgid "Eject %s"
-msgstr "%s 꺼내기"
+msgid "E&ject %1"
+msgstr "%1 꺼내기(&J)"
msgid "&Unmute"
msgstr "음소거 해제(&U)"
@@ -2115,8 +2058,29 @@ msgstr "소프트플로트 FPU"
msgid "High performance impact"
msgstr "성능에 미치는 영향"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM 디스크(최대 속도)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM 디스크(최대 속도)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A 클론(ISA)"
@@ -2135,3 +2099,63 @@ msgstr "도트 매트릭스 글꼴을 찾을 수 없습니다"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "일반 ESC/P 도트 매트릭스 프린터의 에뮬레이션을 사용하려면 \"roms/printer/fonts\" 디렉터리에 있는 트루타입 글꼴이 필요합니다."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po
index c601197ac..fd2b66245 100644
--- a/src/qt/languages/nl-NL.po
+++ b/src/qt/languages/nl-NL.po
@@ -6,2128 +6,2092 @@ msgstr ""
"X-Language: nl_NL\n"
"X-Source-Language: en_US\n"
-msgid "&Action"
+msgid "&Action"
msgstr "&Actie"
-msgid "&Keyboard requires capture"
+msgid "&Keyboard requires capture"
msgstr "&Keyboard vereist vastleggen"
-msgid "&Right CTRL is left ALT"
+msgid "&Right CTRL is left ALT"
msgstr "&Rechtse CTRL is linkse ALT"
-msgid "&Hard Reset..."
+msgid "&Hard Reset..."
msgstr "&Harde Reset..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
-msgid "Ctrl+Alt+&Esc"
+msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
-msgid "&Pause"
+msgid "&Pause"
msgstr "&Pauze"
-msgid "E&xit..."
+msgid "E&xit..."
msgstr "&Afsluiten..."
-msgid "&View"
+msgid "&View"
msgstr "&Beeld"
-msgid "&Hide status bar"
+msgid "&Hide status bar"
msgstr "&Statusbalk verbergen"
-msgid "Hide &toolbar"
+msgid "Hide &toolbar"
msgstr "Verberg &toolbar"
-msgid "&Resizeable window"
+msgid "&Resizeable window"
msgstr "&Venster met aanpasbare grootte"
-msgid "R&emember size && position"
+msgid "R&emember size && position"
msgstr "&Onthoud grootte && positie"
-msgid "Re&nderer"
+msgid "Re&nderer"
msgstr "Re&nderer"
-msgid "&Qt (Software)"
+msgid "&Qt (Software)"
msgstr "&Qt (software)"
-msgid "Qt (&OpenGL)"
+msgid "Qt (&OpenGL)"
msgstr "Qt (&OpenGL)"
-msgid "Open&GL (3.0 Core)"
+msgid "Open&GL (3.0 Core)"
msgstr "Open&GL (3.0 Core)"
-msgid "&VNC"
+msgid "&VNC"
msgstr "&VNC"
-msgid "Specify dimensions..."
+msgid "Specify dimensions..."
msgstr "Afmetingen opgeven..."
-msgid "F&orce 4:3 display ratio"
+msgid "F&orce 4:3 display ratio"
msgstr "F&orceer 4:3 beeldverhouding"
-msgid "&Window scale factor"
+msgid "&Window scale factor"
msgstr "&Venster schaalfactor"
-msgid "&0.5x"
+msgid "&0.5x"
msgstr "&0,5x"
-msgid "&1x"
+msgid "&1x"
msgstr "&1x"
-msgid "1.&5x"
+msgid "1.&5x"
msgstr "1,&5x"
-msgid "&2x"
+msgid "&2x"
msgstr "&2x"
-msgid "&3x"
+msgid "&3x"
msgstr "&3x"
-msgid "&4x"
+msgid "&4x"
msgstr "&4x"
-msgid "&5x"
+msgid "&5x"
msgstr "&5x"
-msgid "&6x"
+msgid "&6x"
msgstr "&6x"
-msgid "&7x"
+msgid "&7x"
msgstr "&7x"
-msgid "&8x"
+msgid "&8x"
msgstr "&8x"
-msgid "Filter method"
+msgid "Filter method"
msgstr "Filtermethode"
-msgid "&Nearest"
+msgid "&Nearest"
msgstr "&Dichtsbijzijnde"
-msgid "&Linear"
+msgid "&Linear"
msgstr "&Lineair"
-msgid "Hi&DPI scaling"
+msgid "Hi&DPI scaling"
msgstr "Hi&DPI-schaling"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Fullscreen\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Fullscreen"
-msgid "Fullscreen &stretch mode"
+msgid "Fullscreen &stretch mode"
msgstr "Volledig scherm &uitrekmodus"
-msgid "&Full screen stretch"
+msgid "&Full screen stretch"
msgstr "&Volledig scherm uitrekken"
-msgid "&4:3"
+msgid "&4:3"
msgstr "&4:3"
-msgid "&Square pixels (Keep ratio)"
+msgid "&Square pixels (Keep ratio)"
msgstr "&Vierkante pixels (behoud verhouding)"
-msgid "&Integer scale"
+msgid "&Integer scale"
msgstr "&Integerschaal"
-msgid "4:&3 Integer scale"
+msgid "4:&3 Integer scale"
msgstr "4:&3 integerschaal"
-msgid "E&GA/(S)VGA settings"
+msgid "E&GA/(S)VGA settings"
msgstr "E&GA/(S)VGA-instellingen"
-msgid "&Inverted VGA monitor"
+msgid "&Inverted VGA monitor"
msgstr "Ge&ïnverteerde VGA-monitor"
-msgid "VGA screen &type"
+msgid "VGA screen &type"
msgstr "VGA-scherm &type"
-msgid "RGB &Color"
+msgid "RGB &Color"
msgstr "RGB &Kleur"
-msgid "&RGB Grayscale"
+msgid "&RGB Grayscale"
msgstr "&RGB grijstinten"
-msgid "&Amber monitor"
+msgid "&Amber monitor"
msgstr "&Amber monitor"
-msgid "&Green monitor"
+msgid "&Green monitor"
msgstr "&Groene monitor"
-msgid "&White monitor"
+msgid "&White monitor"
msgstr "&Witte monitor"
-msgid "Grayscale &conversion type"
+msgid "Grayscale &conversion type"
msgstr "Grijstinten &conversietype"
-msgid "BT&601 (NTSC/PAL)"
+msgid "BT&601 (NTSC/PAL)"
msgstr "BT&601 (NTSC/PAL)"
-msgid "BT&709 (HDTV)"
+msgid "BT&709 (HDTV)"
msgstr "BT&709 (HDTV)"
-msgid "&Average"
+msgid "&Average"
msgstr "&Gemiddelde"
-msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan"
+msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan"
msgstr "CGA/PCjr/Tandy/E&GA/(S)VGA overscan"
-msgid "Change contrast for &monochrome display"
+msgid "Change contrast for &monochrome display"
msgstr "Contrast wijzigen voor &monochroom beeldscherm"
-msgid "&Media"
+msgid "&Media"
msgstr "&Media"
-msgid "&Tools"
+msgid "&Tools"
msgstr "&Tools"
-msgid "&Settings..."
+msgid "&Settings..."
msgstr "&Instellingen..."
-msgid "&Update status bar icons"
+msgid "&Update status bar icons"
msgstr "&Statusbalkpictogrammen bijwerken"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Maak een schermafbeelding\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Maak een schermafbeelding"
-msgid "&Preferences..."
+msgid "S&ound"
+msgstr "&Geluid"
+
+msgid "&Preferences..."
msgstr "&Voorkeuren..."
-msgid "Enable &Discord integration"
+msgid "Enable &Discord integration"
msgstr "&Discord integratie inschakelen"
-msgid "Sound &gain..."
+msgid "Sound &gain..."
msgstr "&Geluidsversterking..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Begin traceren\tCtrl+T"
+msgid "Begin trace"
+msgstr "Begin traceren"
-msgid "End trace\tCtrl+T"
-msgstr "Traceren beëindigen\tCtrl+T"
+msgid "End trace"
+msgstr "Traceren beëindigen"
-msgid "&Help"
+msgid "&Help"
msgstr "&Help"
-msgid "&Documentation..."
+msgid "&Documentation..."
msgstr "&Documentatie..."
-msgid "&About 86Box..."
+msgid "&About 86Box..."
msgstr "&Over 86Box..."
-msgid "&New image..."
+msgid "&New image..."
msgstr "&Nieuw image..."
-msgid "&Existing image..."
+msgid "&Existing image..."
msgstr "&Bestaande image..."
-msgid "Existing image (&Write-protected)..."
+msgid "Existing image (&Write-protected)..."
msgstr "Bestaande image (&Schrijfbeveiligd)..."
-msgid "&Record"
+msgid "&Record"
msgstr "&Opnemen"
-msgid "&Play"
+msgid "&Play"
msgstr "&Play"
-msgid "&Rewind to the beginning"
+msgid "&Rewind to the beginning"
msgstr "&Terugspoelen naar het begin"
-msgid "&Fast forward to the end"
+msgid "&Fast forward to the end"
msgstr "&Snel vooruit naar het einde"
-msgid "E&ject"
-msgstr "E&ject"
+msgid "E&ject"
+msgstr "&Uitwerpen"
-msgid "&Image..."
+msgid "&Image..."
msgstr "&Image..."
-msgid "E&xport to 86F..."
+msgid "E&xport to 86F..."
msgstr "E&xporteer naar 86F..."
-msgid "&Mute"
+msgid "&Mute"
msgstr "&Mute"
-msgid "E&mpty"
+msgid "E&mpty"
msgstr "E&mpty"
-msgid "&Reload previous image"
-msgstr "&Herlaad vorige image"
+msgid "Reload previous image"
+msgstr "Herlaad vorige image"
-msgid "&Folder..."
+msgid "&Folder..."
msgstr "&Map..."
-msgid "Target &framerate"
+msgid "Target &framerate"
msgstr "Doel &framerate"
-msgid "&Sync with video"
+msgid "&Sync with video"
msgstr "&Synchroniseer met video"
-msgid "&25 fps"
+msgid "&25 fps"
msgstr "&25 fps"
-msgid "&30 fps"
+msgid "&30 fps"
msgstr "&30 fps"
-msgid "&50 fps"
+msgid "&50 fps"
msgstr "&50 fps"
-msgid "&60 fps"
+msgid "&60 fps"
msgstr "&60 fps"
-msgid "&75 fps"
+msgid "&75 fps"
msgstr "&75 fps"
-msgid "&VSync"
+msgid "&VSync"
msgstr "&VSync"
-msgid "&Select shader..."
+msgid "&Select shader..."
msgstr "&Selecteer shader..."
-msgid "&Remove shader"
+msgid "&Remove shader"
msgstr "&Remove shader"
-msgid "Preferences"
+msgid "Preferences"
msgstr "Voorkeuren"
-msgid "Sound Gain"
+msgid "Sound Gain"
msgstr "Geluidsversterking"
-msgid "New Image"
+msgid "New Image"
msgstr "Nieuw image"
-msgid "Settings"
+msgid "Settings"
msgstr "Instellingen"
-msgid "Specify Main Window Dimensions"
+msgid "Specify Main Window Dimensions"
msgstr "Afmetingen hoofdvenster opgeven"
-msgid "OK"
+msgid "OK"
msgstr "OK"
-msgid "Cancel"
+msgid "Cancel"
msgstr "Annuleren"
-msgid "Save these settings as &global defaults"
-msgstr "Sla deze instellingen op als &globale standaardinstellingen"
-
-msgid "&Default"
+msgid "&Default"
msgstr "&Standaard"
-msgid "Language:"
+msgid "Language:"
msgstr "Taal:"
-msgid "Icon set:"
-msgstr "Pictogrammenset:"
-
-msgid "Gain"
+msgid "Gain"
msgstr "Versterking"
-msgid "File name:"
+msgid "File name:"
msgstr "Bestandsnaam:"
-msgid "Disk size:"
+msgid "Disk size:"
msgstr "Schijfgrootte:"
-msgid "RPM mode:"
+msgid "RPM mode:"
msgstr "RPM-modus:"
-msgid "Progress:"
+msgid "Progress:"
msgstr "Vooruitgang:"
-msgid "Width:"
+msgid "Width:"
msgstr "Breedte:"
-msgid "Height:"
+msgid "Height:"
msgstr "Hoogte:"
-msgid "Lock to this size"
+msgid "Lock to this size"
msgstr "Leg vast op deze grootte"
-msgid "Machine type:"
+msgid "Machine type:"
msgstr "Machinetype:"
-msgid "Machine:"
+msgid "Machine:"
msgstr "Machine:"
-msgid "Configure"
+msgid "Configure"
msgstr "Configureren"
-msgid "CPU type:"
+msgid "CPU type:"
msgstr "CPU type:"
-msgid "Speed:"
+msgid "Speed:"
msgstr "Snelheid:"
-msgid "Frequency:"
+msgid "Frequency:"
msgstr "Frequentie:"
-msgid "FPU:"
+msgid "FPU:"
msgstr "FPU:"
-msgid "Wait states:"
+msgid "Wait states:"
msgstr "Wachttoestanden:"
-msgid "MB"
+msgid "MB"
msgstr "MB"
-msgid "Memory:"
+msgid "Memory:"
msgstr "Geheugen:"
-msgid "Time synchronization"
+msgid "Time synchronization"
msgstr "Tijdsynchronisatie"
-msgid "Disabled"
+msgid "Disabled"
msgstr "Uitgeschakeld"
-msgid "Enabled (local time)"
+msgid "Enabled (local time)"
msgstr "Ingeschakeld (lokale tijd)"
-msgid "Enabled (UTC)"
+msgid "Enabled (UTC)"
msgstr "Ingeschakeld (UTC)"
-msgid "Dynamic Recompiler"
+msgid "Dynamic Recompiler"
msgstr "Dynamische Recompiler"
-msgid "Video:"
+msgid "Video:"
msgstr "Video:"
-msgid "Video #2:"
+msgid "Video #2:"
msgstr "Video #2:"
-msgid "Voodoo 1 or 2 Graphics"
+msgid "Voodoo 1 or 2 Graphics"
msgstr "Voodoo 1 of 2 graphics"
-msgid "IBM 8514/A Graphics"
+msgid "IBM 8514/A Graphics"
msgstr "IBM 8514/A-graphics"
-msgid "XGA Graphics"
+msgid "XGA Graphics"
msgstr "XGA Graphics"
-msgid "Mouse:"
+msgid "Mouse:"
msgstr "Muis:"
-msgid "Joystick:"
+msgid "Joystick:"
msgstr "Joystick:"
-msgid "Joystick 1..."
+msgid "Joystick 1..."
msgstr "Joystick 1..."
-msgid "Joystick 2..."
+msgid "Joystick 2..."
msgstr "Joystick 2..."
-msgid "Joystick 3..."
+msgid "Joystick 3..."
msgstr "Joystick 3..."
-msgid "Joystick 4..."
+msgid "Joystick 4..."
msgstr "Joystick 4..."
-msgid "Sound card #1:"
+msgid "Sound card #1:"
msgstr "Geluidskaart #1:"
-msgid "Sound card #2:"
+msgid "Sound card #2:"
msgstr "Geluidskaart #2:"
-msgid "Sound card #3:"
+msgid "Sound card #3:"
msgstr "Geluidskaart #3:"
-msgid "Sound card #4:"
+msgid "Sound card #4:"
msgstr "Geluidskaart #4:"
-msgid "MIDI Out Device:"
+msgid "MIDI Out Device:"
msgstr "MIDI Out-apparaat:"
-msgid "MIDI In Device:"
+msgid "MIDI In Device:"
msgstr "MIDI In-apparaat:"
-msgid "Standalone MPU-401"
+msgid "Standalone MPU-401"
msgstr "Standalone MPU-401"
-msgid "Use FLOAT32 sound"
+msgid "Use FLOAT32 sound"
msgstr "Gebruik FLOAT32-geluid"
-msgid "FM synth driver"
+msgid "FM synth driver"
msgstr "FM-synthesizer"
-msgid "Nuked (more accurate)"
+msgid "Nuked (more accurate)"
msgstr "Nuked (nauwkeuriger)"
-msgid "YMFM (faster)"
+msgid "YMFM (faster)"
msgstr "YMFM (sneller)"
-msgid "Network type:"
+msgid "Network type:"
msgstr "Type netwerk:"
-msgid "PCap device:"
+msgid "PCap device:"
msgstr "PCap-apparaat:"
-msgid "Network adapter:"
+msgid "Network adapter:"
msgstr "Netwerkadapter:"
-msgid "COM1 Device:"
+msgid "COM1 Device:"
msgstr "COM1-apparaat:"
-msgid "COM2 Device:"
+msgid "COM2 Device:"
msgstr "COM2-apparaat:"
-msgid "COM3 Device:"
+msgid "COM3 Device:"
msgstr "COM3-apparaat:"
-msgid "COM4 Device:"
+msgid "COM4 Device:"
msgstr "COM4-apparaat:"
-msgid "LPT1 Device:"
+msgid "LPT1 Device:"
msgstr "LPT1-apparaat:"
-msgid "LPT2 Device:"
+msgid "LPT2 Device:"
msgstr "LPT2-apparaat:"
-msgid "LPT3 Device:"
+msgid "LPT3 Device:"
msgstr "LPT3-apparaat:"
-msgid "LPT4 Device:"
+msgid "LPT4 Device:"
msgstr "LPT4-apparaat:"
-msgid "Serial port 1"
+msgid "Serial port 1"
msgstr "Seriële poort 1"
-msgid "Serial port 2"
+msgid "Serial port 2"
msgstr "Seriële poort 2"
-msgid "Serial port 3"
+msgid "Serial port 3"
msgstr "Seriële poort 3"
-msgid "Serial port 4"
+msgid "Serial port 4"
msgstr "Seriële poort 4"
-msgid "Parallel port 1"
+msgid "Parallel port 1"
msgstr "Parallelle poort 1"
-msgid "Parallel port 2"
+msgid "Parallel port 2"
msgstr "Parallelle poort 2"
-msgid "Parallel port 3"
+msgid "Parallel port 3"
msgstr "Parallelle poort 3"
-msgid "Parallel port 4"
+msgid "Parallel port 4"
msgstr "Parallelle poort 4"
-msgid "HD Controller:"
+msgid "HD Controller:"
msgstr "HD-controller:"
-msgid "FD Controller:"
+msgid "FD Controller:"
msgstr "FD-Controller:"
-msgid "Tertiary IDE Controller"
+msgid "Tertiary IDE Controller"
msgstr "Tertiaire IDE-controller"
-msgid "Quaternary IDE Controller"
+msgid "Quaternary IDE Controller"
msgstr "Quaternaire IDE-controller"
-msgid "SCSI"
+msgid "SCSI"
msgstr "SCSI"
-msgid "Controller 1:"
+msgid "Controller 1:"
msgstr "Controller 1:"
-msgid "Controller 2:"
+msgid "Controller 2:"
msgstr "Controller 2:"
-msgid "Controller 3:"
+msgid "Controller 3:"
msgstr "Controller 3:"
-msgid "Controller 4:"
+msgid "Controller 4:"
msgstr "Controller 4:"
-msgid "Cassette"
+msgid "Cassette"
msgstr "Cassette"
-msgid "Hard disks:"
+msgid "Hard disks:"
msgstr "Harde schijven:"
-msgid "&New..."
+msgid "&New..."
msgstr "&Nieuw..."
-msgid "&Existing..."
+msgid "&Existing..."
msgstr "&Bestaande..."
-msgid "&Remove"
+msgid "&Remove"
msgstr "&Verwijderen"
-msgid "Bus:"
+msgid "Bus:"
msgstr "Bus:"
-msgid "Channel:"
+msgid "Channel:"
msgstr "Kanaal:"
-msgid "ID:"
+msgid "ID:"
msgstr "ID:"
-msgid "&Specify..."
+msgid "&Specify..."
msgstr "&Specificeer..."
-msgid "Sectors:"
+msgid "Sectors:"
msgstr "Sectoren:"
-msgid "Heads:"
+msgid "Heads:"
msgstr "Heads:"
-msgid "Cylinders:"
+msgid "Cylinders:"
msgstr "Cilinders:"
-msgid "Size (MB):"
+msgid "Size (MB):"
msgstr "Grootte (MB):"
-msgid "Type:"
+msgid "Type:"
msgstr "Type:"
-msgid "Image Format:"
+msgid "Image Format:"
msgstr "Imageformaat:"
-msgid "Block Size:"
+msgid "Block Size:"
msgstr "Blokgrootte:"
-msgid "Floppy drives:"
+msgid "Floppy drives:"
msgstr "Floppy-schijfstations:"
-msgid "Turbo timings"
+msgid "Turbo timings"
msgstr "Turbo timings"
-msgid "Check BPB"
+msgid "Check BPB"
msgstr "Controleer BPB"
-msgid "CD-ROM drives:"
+msgid "CD-ROM drives:"
msgstr "CD-ROM-stations:"
-msgid "MO drives:"
+msgid "MO drives:"
msgstr "MO-schijven:"
-msgid "ZIP drives:"
+msgid "ZIP drives:"
msgstr "ZIP-schijven:"
-msgid "ZIP 250"
+msgid "ZIP 250"
msgstr "ZIP 250"
-msgid "ISA RTC:"
+msgid "ISA RTC:"
msgstr "ISA RTC:"
-msgid "ISA Memory Expansion"
+msgid "ISA Memory Expansion"
msgstr "ISA-geheugenuitbreiding"
-msgid "Card 1:"
+msgid "Card 1:"
msgstr "Kaart 1:"
-msgid "Card 2:"
+msgid "Card 2:"
msgstr "Kaart 2:"
-msgid "Card 3:"
+msgid "Card 3:"
msgstr "Kaart 3:"
-msgid "Card 4:"
+msgid "Card 4:"
msgstr "Kaart 4:"
-msgid "ISABugger device"
+msgid "ISABugger device"
msgstr "ISABugger-apparaat"
-msgid "POST card"
+msgid "POST card"
msgstr "POST-kaart"
-msgid "86Box"
+msgid "86Box"
msgstr "86Box"
-msgid "Error"
+msgid "Error"
msgstr "Fout"
-msgid "Fatal error"
+msgid "Fatal error"
msgstr "Fatale fout"
-msgid " - PAUSED"
+msgid " - PAUSED"
msgstr " - GEPAUZEERD"
-msgid "Press Ctrl+Alt+PgDn to return to windowed mode."
+msgid "Press Ctrl+Alt+PgDn to return to windowed mode."
msgstr "Druk op Ctrl+Alt+PgDn om terug te gaan naar de venstermodus."
-msgid "Speed"
+msgid "Speed"
msgstr "Snelheid"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
-msgid "ZIP images"
+msgid "ZIP images"
msgstr "ZIP-images"
-msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory."
+msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory."
msgstr "86Box kon geen bruikbare ROM images vinden.\n\nDownload een ROM set en pak deze uit in de map \"roms\"."
-msgid "(empty)"
+msgid "(empty)"
msgstr "(leeg)"
-msgid "All files"
+msgid "All files"
msgstr "Alle bestanden"
-msgid "Turbo"
+msgid "Turbo"
msgstr "Turbo"
-msgid "On"
+msgid "On"
msgstr "Aan"
-msgid "Off"
+msgid "Off"
msgstr "Uit"
-msgid "All images"
+msgid "All images"
msgstr "Alle schijfimages"
-msgid "Basic sector images"
+msgid "Basic sector images"
msgstr "Basissectorimages"
-msgid "Surface images"
+msgid "Surface images"
msgstr "Oppervlakte-images"
-msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine."
+msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine."
msgstr "Machine \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/machines. Overschakelen naar een beschikbare machine."
-msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card."
+msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card."
msgstr "Videokaart \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Overschakel over naar een beschikbare videokaart."
-msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card."
+msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card."
msgstr "Videokaart #2 \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Uitschakel de tweede videokaart."
msgid "Device \"%hs\" is not available due to missing ROMs. Ignoring the device."
msgstr "Het apparaat \"%hs\" is niet beschikbaar door ontbrekende ROMs. Negeer het apparaat."
-msgid "Machine"
+msgid "Machine"
msgstr "Machine"
-msgid "Display"
+msgid "Display"
msgstr "Scherm"
-msgid "Input devices"
+msgid "Input devices"
msgstr "Invoerapparaten"
-msgid "Sound"
+msgid "Sound"
msgstr "Geluid"
-msgid "Network"
+msgid "Network"
msgstr "Netwerk"
-msgid "Ports (COM & LPT)"
+msgid "Ports (COM & LPT)"
msgstr "Poorten (COM & LPT)"
-msgid "Storage controllers"
+msgid "Storage controllers"
msgstr "Opslagcontrollers"
-msgid "Hard disks"
+msgid "Hard disks"
msgstr "Harde schijven"
-msgid "Floppy & CD-ROM drives"
+msgid "Floppy & CD-ROM drives"
msgstr "Floppy- en CD-ROM-stations"
-msgid "Other removable devices"
+msgid "Other removable devices"
msgstr "Andere verwijderbare apparaten"
-msgid "Other peripherals"
+msgid "Other peripherals"
msgstr "Andere randapparatuur"
-msgid "Click to capture mouse"
+msgid "Click to capture mouse"
msgstr "Klik om muis vast te leggen"
-msgid "Press %1 to release mouse"
+msgid "Press %1 to release mouse"
msgstr "Druk op %1 om de muis los te laten"
-msgid "Press %1 or middle button to release mouse"
+msgid "Press %1 or middle button to release mouse"
msgstr "Druk op %1 of middelste knop om de muis los te laten"
-msgid "Bus"
+msgid "Bus"
msgstr "Bus"
-msgid "File"
+msgid "File"
msgstr "Bestand"
-msgid "C"
+msgid "C"
msgstr "C"
-msgid "H"
+msgid "H"
msgstr "H"
-msgid "S"
+msgid "S"
msgstr "S"
-msgid "KB"
+msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Kan de videorenderer niet initialiseren."
-
-msgid "Default"
+msgid "Default"
msgstr "Standaard"
-msgid "%i estat(s) d'espera"
-msgstr "%i estat(s) d'espera"
+msgid "%1 Wait state(s)"
+msgstr "%1 Wachttoestand(en)"
-msgid "Type"
+msgid "Type"
msgstr "Type"
-msgid "No PCap devices found"
+msgid "No PCap devices found"
msgstr "Geen PCap-apparaten gevonden"
-msgid "Invalid PCap device"
+msgid "Invalid PCap device"
msgstr "Ongeldig PCap-apparaat"
-msgid "2-axis, 2-button joystick(s)"
+msgid "2-axis, 2-button joystick(s)"
msgstr "Joystick(s) met 2 assen en 2 knoppen"
-msgid "2-axis, 4-button joystick"
+msgid "2-axis, 4-button joystick"
msgstr "Joystick met 2 assen en 4 knoppen"
-msgid "2-axis, 6-button joystick"
+msgid "2-axis, 6-button joystick"
msgstr "Joystick met 2 assen en 6 knoppen"
-msgid "2-axis, 8-button joystick"
+msgid "2-axis, 8-button joystick"
msgstr "Joystick met 2 assen en 8 knoppen"
-msgid "3-axis, 2-button joystick"
+msgid "3-axis, 2-button joystick"
msgstr "Joystick met 3 assen en 2 knoppen"
-msgid "3-axis, 4-button joystick"
+msgid "3-axis, 4-button joystick"
msgstr "Joystick met 3 assen en 4 knoppen"
-msgid "4-axis, 4-button joystick"
+msgid "4-axis, 4-button joystick"
msgstr "Joystick met 4 assen en 4 knoppen"
-msgid "CH Flightstick Pro"
+msgid "CH Flightstick Pro"
msgstr "CH Flightstick Pro"
-msgid "Microsoft SideWinder Pad"
+msgid "Microsoft SideWinder Pad"
msgstr "Microsoft SideWinder Pad"
-msgid "Thrustmaster Flight Control System"
+msgid "Thrustmaster Flight Control System"
msgstr "Thrustmaster Flight Control systeem"
-msgid "None"
+msgid "None"
msgstr "Geen"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Floppy %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Floppy %1 (%2): %3"
-msgid "Advanced sector images"
+msgid "Advanced sector images"
msgstr "Geavanceerde sector-images"
-msgid "Flux images"
+msgid "Flux images"
msgstr "Flux images"
-msgid "Are you sure you want to hard reset the emulated machine?"
+msgid "Are you sure you want to hard reset the emulated machine?"
msgstr "Weet je zeker dat je de geëmuleerde machine wilt resetten?"
-msgid "Are you sure you want to exit 86Box?"
+msgid "Are you sure you want to exit 86Box?"
msgstr "Weet je zeker dat je 86Box wilt verlaten?"
-msgid "Unable to initialize Ghostscript"
+msgid "Unable to initialize Ghostscript"
msgstr "Kan Ghostscript niet initialiseren"
-msgid "Unable to initialize GhostPCL"
+msgid "Unable to initialize GhostPCL"
msgstr "Kan GhostPCL niet initialiseren"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
-msgid "MO images"
+msgid "MO images"
msgstr "MO-images"
-msgid "Welcome to 86Box!"
+msgid "Welcome to 86Box!"
msgstr "Welkom bij 86Box!"
-msgid "Internal device"
+msgid "Internal device"
msgstr "Intern apparaat"
-msgid "Exit"
+msgid "Exit"
msgstr "&Afsluiten"
-msgid "No ROMs found"
+msgid "No ROMs found"
msgstr "Geen ROMs gevonden"
-msgid "Do you want to save the settings?"
+msgid "Do you want to save the settings?"
msgstr "Wil je de instellingen opslaan?"
-msgid "This will hard reset the emulated machine."
+msgid "This will hard reset the emulated machine."
msgstr "Dit zal de geëmuleerde machine een hard reset geven."
-msgid "Save"
+msgid "Save"
msgstr "Opslaan"
-msgid "About 86Box"
+msgid "About 86Box"
msgstr "Over 86Box"
-msgid "86Box v"
+msgid "86Box v"
msgstr "86Box v"
-msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information."
+msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information."
msgstr "Een emulator van oude computers\n\nAuteurs: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nMet eerdere bijdragen van Sarah Walker, leilei, JohnElliott, greatpsycho en anderen.\n\nUitgebracht onder de GNU General Public License versie 2 of later. Zie LICENSE voor meer informatie."
-msgid "Hardware not available"
+msgid "Hardware not available"
msgstr "Hardware niet beschikbaar"
-msgid "Make sure %1 is installed and that you are on a %1-compatible network connection."
+msgid "Make sure %1 is installed and that you are on a %1-compatible network connection."
msgstr "Zorg ervoor dat %1 is geïnstalleerd en dat je een %1-compatibele netwerkverbinding hebt."
-msgid "Invalid configuration"
+msgid "Invalid configuration"
msgstr "Ongeldige configuratie"
-msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files."
+msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files."
msgstr "%1 is vereist voor automatische conversie van PostScript-bestanden naar PDF.\n\nAlle documenten die naar de generieke PostScript-printer worden gestuurd, worden opgeslagen als PostScript-bestanden (.ps)."
-msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files."
+msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files."
msgstr "%1 is vereist voor automatische conversie van PCL-bestanden naar PDF.\n\nAlle documenten die naar de generieke PCL-printer worden gestuurd, worden opgeslagen als Printer Command Language (.pcl) bestanden."
-msgid "Entering fullscreen mode"
+msgid "Entering fullscreen mode"
msgstr "Volledig scherm modus openen"
-msgid "Don't show this message again"
+msgid "Don't show this message again"
msgstr "Dit bericht niet meer tonen"
-msgid "Don't exit"
+msgid "Don't exit"
msgstr "Niet afsluiten"
-msgid "Reset"
+msgid "Reset"
msgstr "Reset"
-msgid "Don't reset"
+msgid "Don't reset"
msgstr "Niet resetten"
-msgid "CD-ROM images"
+msgid "CD-ROM images"
msgstr "CD-ROM-images"
-msgid "%1 Device Configuration"
+msgid "%1 Device Configuration"
msgstr "%1 Apparaatconfiguratie"
-msgid "Monitor in sleep mode"
+msgid "Monitor in sleep mode"
msgstr "Monitor in slaapstand"
-msgid "OpenGL Shaders"
-msgstr "OpenGL Shaders"
+msgid "GLSL shaders"
+msgstr "GLSL Shaders"
-msgid "OpenGL options"
-msgstr "OpenGL-opties"
-
-msgid "You are loading an unsupported configuration"
+msgid "You are loading an unsupported configuration"
msgstr "U laadt een configuratie die niet wordt ondersteund"
-msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid."
+msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid."
msgstr "Filteren op CPU type voor de geselecteerde machine is niet mogelijk met de geselecteerde machine.\n\nDit maakt het mogelijk een CPU te kunnen kiezen die anders niet compatible zou zijn met de geselecteerde machine. Je kunt hiermee echter compatibiliteitsproblemen krijgen met de BIOS van de machine of met andere software.\n\nHet inschakelen van deze instelling wordt niet officieel ondersteund en bugrapporten die worden ingediend kunnen als ongeldig worden gesloten."
-msgid "Continue"
+msgid "Continue"
msgstr "Doorgaan"
-msgid "Cassette: %s"
-msgstr "Cassette: %s"
+msgid "Cassette: %1"
+msgstr "Cassette: %1"
-msgid "Cassette images"
+msgid "Cassette images"
msgstr "Cassette-images"
-msgid "Cartridge %i: %ls"
-msgstr "Cartridge %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartridge %1: %2"
-msgid "Cartridge images"
+msgid "Cartridge images"
msgstr "Cartridge-images"
-msgid "Error initializing renderer"
-msgstr "Fout bij het initialiseren van renderer"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "OpenGL (3.0 Core) renderer kon niet worden geïnitialiseerd. Gebruik een andere renderer."
-
-msgid "Resume execution"
+msgid "Resume execution"
msgstr "Hervat executie"
-msgid "Pause execution"
+msgid "Pause execution"
msgstr "Pauze executie"
-msgid "Press Ctrl+Alt+Del"
+msgid "Press Ctrl+Alt+Del"
msgstr "Druk op Ctrl+Alt+Del"
-msgid "Press Ctrl+Alt+Esc"
+msgid "Press Ctrl+Alt+Esc"
msgstr "Druk op Ctrl+Alt+Esc"
-msgid "Hard reset"
+msgid "Hard reset"
msgstr "Harde reset"
-msgid "ACPI shutdown"
+msgid "ACPI shutdown"
msgstr "ACPI uitschakeling"
-msgid "Hard disk (%1)"
+msgid "Hard disk (%1)"
msgstr "Harde schijf (%1)"
-msgid "MFM/RLL or ESDI CD-ROM drives never existed"
+msgid "MFM/RLL or ESDI CD-ROM drives never existed"
msgstr "MFM/RLL of ESDI CD-ROM-stations hebben nooit bestaan"
-msgid "Custom..."
+msgid "Custom..."
msgstr "Aangepast..."
-msgid "Custom (large)..."
+msgid "Custom (large)..."
msgstr "Aangepast (groot)..."
-msgid "Add New Hard Disk"
+msgid "Add New Hard Disk"
msgstr "Nieuwe harde schijf toevoegen"
-msgid "Add Existing Hard Disk"
+msgid "Add Existing Hard Disk"
msgstr "Bestaande harde schijf toevoegen"
-msgid "HDI disk images cannot be larger than 4 GB."
+msgid "HDI disk images cannot be larger than 4 GB."
msgstr "HDI-schijfimages kunnen niet groter zijn dan 4 GB."
-msgid "Disk images cannot be larger than 127 GB."
+msgid "Disk images cannot be larger than 127 GB."
msgstr "Schijfimages kunnen niet groter zijn dan 127 GB."
-msgid "Hard disk images"
+msgid "Hard disk images"
msgstr "Harde schijf-image"
-msgid "Unable to read file"
+msgid "Unable to read file"
msgstr "Kan bestand niet lezen"
-msgid "Unable to write file"
+msgid "Unable to write file"
msgstr "Kan bestand niet schrijven"
-msgid "HDI or HDX images with a sector size other than 512 are not supported."
+msgid "HDI or HDX images with a sector size other than 512 are not supported."
msgstr "HDI- of HDX-image met een andere sectorgrootte dan 512 worden niet ondersteund."
-msgid "Disk image file already exists"
+msgid "Disk image file already exists"
msgstr "Schijfimagebestand bestaat al"
-msgid "Please specify a valid file name."
+msgid "Please specify a valid file name."
msgstr "Geef een geldige bestandsnaam op."
-msgid "Disk image created"
+msgid "Disk image created"
msgstr "Schijfimage gemaakt"
-msgid "Make sure the file exists and is readable."
+msgid "Make sure the file exists and is readable."
msgstr "Controleer of het bestand bestaat en leesbaar is."
-msgid "Make sure the file is being saved to a writable directory."
+msgid "Make sure the file is being saved to a writable directory."
msgstr "Zorg ervoor dat het bestand wordt opgeslagen in een schrijfbare map."
-msgid "Disk image too large"
+msgid "Disk image too large"
msgstr "Schijfimage te groot"
-msgid "Remember to partition and format the newly-created drive."
+msgid "Remember to partition and format the newly-created drive."
msgstr "Vergeet niet om de nieuw aangemaakte schijf te partitioneren en te formatteren."
-msgid "The selected file will be overwritten. Are you sure you want to use it?"
+msgid "The selected file will be overwritten. Are you sure you want to use it?"
msgstr "Het geselecteerde bestand wordt overschreven. Weet u zeker dat u het wilt gebruiken?"
-msgid "Unsupported disk image"
+msgid "Unsupported disk image"
msgstr "Niet-ondersteunde schijfimage"
-msgid "Overwrite"
+msgid "Overwrite"
msgstr "Overschrijven"
-msgid "Don't overwrite"
+msgid "Don't overwrite"
msgstr "Niet overschrijven"
-msgid "Raw image"
+msgid "Raw image"
msgstr "Ruw image"
-msgid "HDI image"
+msgid "HDI image"
msgstr "HDI-image"
-msgid "HDX image"
+msgid "HDX image"
msgstr "HDX-image"
-msgid "Fixed-size VHD"
+msgid "Fixed-size VHD"
msgstr "VHD met vaste grootte"
-msgid "Dynamic-size VHD"
+msgid "Dynamic-size VHD"
msgstr "VHD met dynamisch grootte"
-msgid "Differencing VHD"
+msgid "Differencing VHD"
msgstr "Verschil-VHD"
-msgid "(N/A)"
+msgid "(N/A)"
msgstr "(N/A)"
-msgid "Raw image (.img)"
+msgid "Raw image (.img)"
msgstr "Ruw image (.img)"
-msgid "HDI image (.hdi)"
+msgid "HDI image (.hdi)"
msgstr "HDI-image (.hdi)"
-msgid "HDX image (.hdx)"
+msgid "HDX image (.hdx)"
msgstr "HDX-image (.hdx)"
-msgid "Fixed-size VHD (.vhd)"
+msgid "Fixed-size VHD (.vhd)"
msgstr "VHD met vaste grootte (.vhd)"
-msgid "Dynamic-size VHD (.vhd)"
+msgid "Dynamic-size VHD (.vhd)"
msgstr "VHD met dynamisch grootte (.vhd)"
-msgid "Differencing VHD (.vhd)"
+msgid "Differencing VHD (.vhd)"
msgstr "Verschil-VHD (.vhd)"
-msgid "Large blocks (2 MB)"
+msgid "Large blocks (2 MB)"
msgstr "Grote blokken (2 MB)"
-msgid "Small blocks (512 KB)"
+msgid "Small blocks (512 KB)"
msgstr "Kleine blokken (512 KB)"
-msgid "VHD files"
+msgid "VHD files"
msgstr "VHD-bestanden"
-msgid "Select the parent VHD"
+msgid "Select the parent VHD"
msgstr "Selecteer de bovenliggende VHD"
-msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?"
+msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?"
msgstr "Dit kan betekenen dat de bovenliggende image is gewijzigd nadat de verschil-image is gemaakt.\n\nDit kan ook gebeuren als de imagebestanden zijn verplaatst of gekopieerd, of door een fout in het programma waarmee deze schijf is gemaakt.\n\nWil je de tijdstempels herstellen?"
-msgid "Parent and child disk timestamps do not match"
+msgid "Parent and child disk timestamps do not match"
msgstr "Bovenliggende en onderliggende schijf tijdstempels komen niet overeen"
-msgid "Could not fix VHD timestamp."
+msgid "Could not fix VHD timestamp."
msgstr "Kan VHD tijdstempel niet herstellen."
-msgid "MFM/RLL"
+msgid "MFM/RLL"
msgstr "MFM/RLL"
-msgid "XTA"
+msgid "XTA"
msgstr "XTA"
-msgid "ESDI"
+msgid "ESDI"
msgstr "ESDI"
-msgid "IDE"
+msgid "IDE"
msgstr "IDE"
-msgid "ATAPI"
+msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
-msgid "160 KB"
+msgid "160 KB"
msgstr "160 KB"
-msgid "180 KB"
+msgid "180 KB"
msgstr "180 KB"
-msgid "320 KB"
+msgid "320 KB"
msgstr "320 KB"
-msgid "360 KB"
+msgid "360 KB"
msgstr "360 KB"
-msgid "640 KB"
+msgid "640 KB"
msgstr "640 KB"
-msgid "720 KB"
+msgid "720 KB"
msgstr "720 KB"
-msgid "1.2 MB"
+msgid "1.2 MB"
msgstr "1,2 MB"
-msgid "1.25 MB"
+msgid "1.25 MB"
msgstr "1,25 MB"
-msgid "1.44 MB"
+msgid "1.44 MB"
msgstr "1,44 MB"
-msgid "DMF (cluster 1024)"
+msgid "DMF (cluster 1024)"
msgstr "DMF (cluster 1024)"
-msgid "DMF (cluster 2048)"
+msgid "DMF (cluster 2048)"
msgstr "DMF (cluster 2048)"
-msgid "2.88 MB"
+msgid "2.88 MB"
msgstr "2,88 MB"
-msgid "ZIP 100"
+msgid "ZIP 100"
msgstr "ZIP 100"
-msgid "3.5\" 128 MB (ISO 10090)"
+msgid "3.5\" 128 MB (ISO 10090)"
msgstr "3,5\" 128 MB (ISO 10090)"
-msgid "3.5\" 230 MB (ISO 13963)"
+msgid "3.5\" 230 MB (ISO 13963)"
msgstr "3,5\" 230 MB (ISO 13963)"
-msgid "3.5\" 540 MB (ISO 15498)"
+msgid "3.5\" 540 MB (ISO 15498)"
msgstr "3,5\" 540 MB (ISO 15498)"
-msgid "3.5\" 640 MB (ISO 15498)"
+msgid "3.5\" 640 MB (ISO 15498)"
msgstr "3,5\" 640 MB (ISO 15498)"
-msgid "3.5\" 1.3 GB (GigaMO)"
+msgid "3.5\" 1.3 GB (GigaMO)"
msgstr "3,5\" 1,3 GB (GigaMO)"
-msgid "3.5\" 2.3 GB (GigaMO 2)"
+msgid "3.5\" 2.3 GB (GigaMO 2)"
msgstr "3,5\" 2,3 GB (GigaMO 2)"
-msgid "5.25\" 600 MB"
+msgid "5.25\" 600 MB"
msgstr "5,25\" 600 MB"
-msgid "5.25\" 650 MB"
+msgid "5.25\" 650 MB"
msgstr "5,25\" 650 MB"
-msgid "5.25\" 1 GB"
+msgid "5.25\" 1 GB"
msgstr "5,25\" 1 GB"
-msgid "5.25\" 1.3 GB"
+msgid "5.25\" 1.3 GB"
msgstr "5,25\" 1,3 GB"
-msgid "Perfect RPM"
+msgid "Perfect RPM"
msgstr "Perfecte RPM"
-msgid "1% below perfect RPM"
+msgid "1% below perfect RPM"
msgstr "1% onder perfecte RPM"
-msgid "1.5% below perfect RPM"
+msgid "1.5% below perfect RPM"
msgstr "1,5% onder perfecte RPM"
-msgid "2% below perfect RPM"
+msgid "2% below perfect RPM"
msgstr "2% onder perfecte RPM"
-msgid "(System Default)"
+msgid "(System Default)"
msgstr "(Systeemstandaard)"
-msgid "Failed to initialize network driver"
+msgid "Failed to initialize network driver"
msgstr "Netwerkstuurprogramma niet geïnitialiseerd"
-msgid "The network configuration will be switched to the null driver"
+msgid "The network configuration will be switched to the null driver"
msgstr "De netwerkconfiguratie wordt overgeschakeld naar de nul-driver"
-msgid "Mouse sensitivity:"
+msgid "Mouse sensitivity:"
msgstr "Muisgevoeligheid:"
-msgid "Select media images from program working directory"
+msgid "Select media images from program working directory"
msgstr "Selecteer media-images uit de werkmap van het programma"
-msgid "PIT mode:"
+msgid "PIT mode:"
msgstr "PIT-modus:"
-msgid "Auto"
+msgid "Auto"
msgstr "Auto"
-msgid "Slow"
+msgid "Slow"
msgstr "Langzaam"
-msgid "Fast"
+msgid "Fast"
msgstr "Snel"
-msgid "&Auto-pause on focus loss"
+msgid "&Auto-pause on focus loss"
msgstr "&Autopauze bij focusverlies"
-msgid "WinBox is no longer supported"
+msgid "WinBox is no longer supported"
msgstr "WinBox wordt niet langer ondersteund"
-msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
+msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
msgstr "De ontwikkeling van de WinBox manager is gestopt in 2022 door een gebrek aan beheerders. Omdat we onze inspanningen richten op het nog beter maken van 86Box, hebben we de beslissing genomen om WinBox niet langer te ondersteunen als een manager.\n\nEr zullen geen verdere updates worden geleverd door WinBox. Je kunt onjuist gedrag tegenkomen als je het blijft gebruiken met nieuwere versies van 86Box. Alle bugrapporten gerelateerd aan het gedrag van WinBox zullen worden gesloten als ongeldig.\n\nGa naar 86box.net voor een lijst van andere managers die je kunt gebruiken."
-msgid "Generate"
+msgid "Generate"
msgstr "Genereren"
-msgid "Joystick configuration"
+msgid "Joystick configuration"
msgstr "Joystick configuratie "
-msgid "Device"
+msgid "Device"
msgstr "Apparaat"
-msgid "%1 (X axis)"
+msgid "%1 (X axis)"
msgstr "%1 (X-as)"
-msgid "%1 (Y axis)"
+msgid "%1 (Y axis)"
msgstr "%1 (Y-as)"
-msgid "MCA devices"
+msgid "MCA devices"
msgstr "MCA-apparaten"
-msgid "List of MCA devices:"
+msgid "List of MCA devices:"
msgstr "Lijst van MCA-apparaten:"
-msgid "Tablet tool"
+msgid "Tablet tool"
msgstr "Tablet-hulpmiddel"
-msgid "Qt (OpenGL &ES)"
+msgid "Qt (OpenGL &ES)"
msgstr "Qt (OpenGL &ES)"
-msgid "About Qt"
+msgid "About Qt"
msgstr "Over Qt"
-msgid "MCA devices..."
+msgid "MCA devices..."
msgstr "MCA-apparaten..."
-msgid "Show non-primary monitors"
+msgid "Show non-primary monitors"
msgstr "Toon niet-primaire monitors"
-msgid "Open screenshots folder..."
+msgid "Open screenshots folder..."
msgstr "Map met schermafbeeldingen openen..."
-msgid "Apply fullscreen stretch mode when maximized"
+msgid "Apply fullscreen stretch mode when maximized"
msgstr "Pas fullscreen stretchmodus toe wanneer gemaximaliseerd"
-msgid "Cursor/Puck"
+msgid "Cursor/Puck"
msgstr "Cursor/Puck"
-msgid "Pen"
+msgid "Pen"
msgstr "Pen"
-msgid "Host CD/DVD Drive (%1:)"
+msgid "Host CD/DVD Drive (%1:)"
msgstr "Host cd/dvd-station (%1:)"
-msgid "&Connected"
+msgid "&Connected"
msgstr "&Verbonden"
-msgid "Clear image history"
+msgid "Clear image history"
msgstr "Imagegeschiedenis verwijderen"
-msgid "Create..."
+msgid "Create..."
msgstr "Creëer..."
-msgid "previous image"
-msgstr "vorige image"
-
-msgid "Host CD/DVD Drive (%1)"
+msgid "Host CD/DVD Drive (%1)"
msgstr "Host CD/DVD-station (%1)"
-msgid "Unknown Bus"
+msgid "Unknown Bus"
msgstr "Onbekende bus"
-msgid "Null Driver"
+msgid "Null Driver"
msgstr "Null Driver"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
-msgid "Error opening \"%1\": %2"
-msgstr "Fout bij het openen van \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Fout bij het compileren van vertex shader in bestand \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Fout bij het compileren van fragment shader in bestand \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Fout bij koppelen shaderprogramma in bestand \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0 renderer opties"
-
-msgid "Render behavior"
+msgid "Render behavior"
msgstr "Rendergedrag"
-msgid "Use target framerate:"
+msgid "Use target framerate:"
msgstr "Gebruik doelframerate:"
-msgid " fps"
+msgid " fps"
msgstr " fps"
-msgid "VSync"
+msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Onmiddellijk elk frame synchroon met het geëmuleerde beeldscherm renderen.</p><p><span style=" font-style:italic;">Dit is de aanbevolen optie als de gebruikte shaders geen frametime gebruiken voor geanimeerde effecten.</span></p></body></html>"
-
-msgid "Synchronize with video"
+msgid "Synchronize with video"
msgstr "Synchroniseren met video"
-msgid "Shaders"
+msgid "Shaders"
msgstr "Shaders"
-msgid "Remove"
+msgid "Remove"
msgstr "Verwijderen"
-msgid "No shader selected"
-msgstr "Geen shader geselecteerd"
-
-msgid "Browse..."
+msgid "Browse..."
msgstr "Bladeren..."
-msgid "Shader error"
-msgstr "Shader-fout"
-
-msgid "Could not load shaders."
-msgstr "Kan shaders niet laden."
-
-msgid "More information in details."
-msgstr "Meer informatie in details."
-
-msgid "Couldn't create OpenGL context."
+msgid "Couldn't create OpenGL context."
msgstr "Kan OpenGL context niet maken."
-msgid "Couldn't switch to OpenGL context."
+msgid "Couldn't switch to OpenGL context."
msgstr "Kan niet overschakelen naar OpenGL context."
-msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
+msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "OpenGL versie 3.0 of hoger is vereist. De huidige versie is %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL initialisatie mislukt. Fout %1."
-
-msgid "Error initializing OpenGL"
+msgid "Error initializing OpenGL"
msgstr "Fout bij het initialiseren van OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Terugvallen op software rendering.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nTerugvallen op software rendering."
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Toewijzen van geheugen voor uitpakbuffer mislukt.\n"
-
-msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
+msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Bij het selecteren van media-images (CD-ROM, floppy, etc.) zal de \"open dialoog\" starten in dezelfde map als het 86Box configuratiebestand. Deze instelling is doet er waarschijnlijk alleen toe op macOS.</p></body></html>"
-msgid "This machine might have been moved or copied."
+msgid "This machine might have been moved or copied."
msgstr "Deze machine is misschien verplaatst of gekopieerd."
-msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure."
+msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure."
msgstr "Om een goede netwerkfunctionaliteit te garanderen, moet 86Box weten of deze machine verplaatst of gekopieerd is.\n\nSelecteer \"Ik heb het gekopieerd\" als u het niet zeker weet."
-msgid "I Moved It"
+msgid "I Moved It"
msgstr "Ik heb het verplaatst"
-msgid "I Copied It"
+msgid "I Copied It"
msgstr "Ik heb het gekopieerd"
-msgid "86Box Monitor #"
+msgid "86Box Monitor #"
msgstr "86Box Monitor #"
-msgid "No MCA devices."
+msgid "No MCA devices."
msgstr "Geen MCA-apparaten."
-msgid "MiB"
+msgid "MiB"
msgstr "MiB"
-msgid "Network Card #1"
+msgid "Network Card #1"
msgstr "Netwerkkaart #1"
-msgid "Network Card #2"
+msgid "Network Card #2"
msgstr "Netwerkkaart #2"
-msgid "Network Card #3"
+msgid "Network Card #3"
msgstr "Netwerkkaart #3"
-msgid "Network Card #4"
+msgid "Network Card #4"
msgstr "Netwerkkaart #4"
-msgid "Mode"
+msgid "Mode"
msgstr "Modus"
-msgid "Interface"
+msgid "Interface"
msgstr "Interface"
-msgid "Adapter"
+msgid "Adapter"
msgstr "Adapter"
-msgid "VDE Socket"
+msgid "VDE Socket"
msgstr "VDE-socket"
-msgid "86Box Unit Tester"
+msgid "86Box Unit Tester"
msgstr "86Box apparaattester"
-msgid "Novell NetWare 2.x Key Card"
+msgid "Novell NetWare 2.x Key Card"
msgstr "Novell NetWare 2.x Key Card"
-msgid "Serial port passthrough 1"
+msgid "Serial port passthrough 1"
msgstr "Seriële poort doorvoer 1"
-msgid "Serial port passthrough 2"
+msgid "Serial port passthrough 2"
msgstr "Seriële poort doorvoer 2"
-msgid "Serial port passthrough 3"
+msgid "Serial port passthrough 3"
msgstr "Seriële poort doorvoer 3"
-msgid "Serial port passthrough 4"
+msgid "Serial port passthrough 4"
msgstr "Seriële poort doorvoer 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
-msgid "Renderer options..."
+msgid "Renderer options..."
msgstr "Renderer-opties..."
-msgid "Logitech/Microsoft Bus Mouse"
+msgid "Logitech/Microsoft Bus Mouse"
msgstr "Logitech/Microsoft busmuis"
-msgid "Microsoft Bus Mouse (InPort)"
+msgid "Microsoft Bus Mouse (InPort)"
msgstr "Microsoft busmuis (InPort)"
-msgid "Mouse Systems Serial Mouse"
+msgid "Mouse Systems Serial Mouse"
msgstr "Mouse Systems seriële muis"
-msgid "Microsoft Serial Mouse"
+msgid "Microsoft Serial Mouse"
msgstr "Microsoft seriële muis"
-msgid "Logitech Serial Mouse"
+msgid "Logitech Serial Mouse"
msgstr "Logitech seriële muis"
-msgid "PS/2 Mouse"
+msgid "PS/2 Mouse"
msgstr "PS/2-muis"
-msgid "3M MicroTouch (Serial)"
+msgid "3M MicroTouch (Serial)"
msgstr "3M MicroTouch (serieel)"
-msgid "[COM] Standard Hayes-compliant Modem"
+msgid "[COM] Standard Hayes-compliant Modem"
msgstr "COM] Standaard Hayes-compatibele modem "
-msgid "Roland MT-32 Emulation"
+msgid "Roland MT-32 Emulation"
msgstr "Roland MT-32-emulatie"
-msgid "Roland MT-32 (New) Emulation"
+msgid "Roland MT-32 (New) Emulation"
msgstr "Roland MT-32 (nieuwe) emulatie"
-msgid "Roland CM-32L Emulation"
+msgid "Roland CM-32L Emulation"
msgstr "Roland CM-32L-emulatie"
-msgid "Roland CM-32LN Emulation"
+msgid "Roland CM-32LN Emulation"
msgstr "Roland CM-32LN-emulatie"
-msgid "OPL4-ML Daughterboard"
+msgid "OPL4-ML Daughterboard"
msgstr "OPL4-ML-dochterbord"
-msgid "System MIDI"
+msgid "System MIDI"
msgstr "Systeem MIDI"
-msgid "MIDI Input Device"
+msgid "MIDI Input Device"
msgstr "MIDI-ingangsapparaat"
-msgid "BIOS Address"
+msgid "BIOS Address"
msgstr "BIOS-adres"
-msgid "Enable BIOS extension ROM Writes"
+msgid "Enable BIOS extension ROM Writes"
msgstr "BIOS-extensie ROM Writes inschakelen"
-msgid "Address"
+msgid "Address"
msgstr "Adres"
-msgid "IRQ"
+msgid "IRQ"
msgstr "IRQ"
-msgid "BIOS Revision"
+msgid "BIOS Revision"
msgstr "BIOS Revisie"
-msgid "Translate 26 -> 17"
+msgid "Translate 26 -> 17"
msgstr "Vertaal 26 -> 17"
-msgid "Language"
+msgid "Language"
msgstr "Taal"
-msgid "Enable backlight"
+msgid "Enable backlight"
msgstr "Backlight inschakelen"
-msgid "Invert colors"
+msgid "Invert colors"
msgstr "Kleuren omkeren"
-msgid "BIOS size"
+msgid "BIOS size"
msgstr "BIOS-grootte"
-msgid "Map C0000-C7FFF as UMB"
+msgid "Map C0000-C7FFF as UMB"
msgstr "Geheugenadres C0000-C7FFF toewijzen aan UMB"
-msgid "Map C8000-CFFFF as UMB"
+msgid "Map C8000-CFFFF as UMB"
msgstr "Geheugenadres C8000-CFFFF toewijzen aan UMB"
-msgid "Map D0000-D7FFF as UMB"
+msgid "Map D0000-D7FFF as UMB"
msgstr "Geheugenadres D0000-D7FFF toewijzen aan UMB"
-msgid "Map D8000-DFFFF as UMB"
+msgid "Map D8000-DFFFF as UMB"
msgstr "Geheugenadres D8000-DFFFF toewijzen aan UMB"
-msgid "Map E0000-E7FFF as UMB"
+msgid "Map E0000-E7FFF as UMB"
msgstr "Geheugenadres E0000-E7FFF toewijzen aan UMB"
-msgid "Map E8000-EFFFF as UMB"
+msgid "Map E8000-EFFFF as UMB"
msgstr "Geheugenadres E8000-EFFFF toewijzen aan UMB"
-msgid "JS9 Jumper (JIM)"
+msgid "JS9 Jumper (JIM)"
msgstr "JS9 Jumper (JIM)"
-msgid "MIDI Output Device"
+msgid "MIDI Output Device"
msgstr "MIDI-uitgangsapparaat"
-msgid "MIDI Real time"
+msgid "MIDI Real time"
msgstr "MIDI real-time"
-msgid "MIDI Thru"
+msgid "MIDI Thru"
msgstr "MIDI doorvoer"
-msgid "MIDI Clockout"
+msgid "MIDI Clockout"
msgstr "MIDI Clockout"
-msgid "SoundFont"
+msgid "SoundFont"
msgstr "SoundFont"
-msgid "Output Gain"
+msgid "Output Gain"
msgstr "Output Gain"
-msgid "Chorus"
+msgid "Chorus"
msgstr "Chorus"
-msgid "Chorus Voices"
+msgid "Chorus Voices"
msgstr "Chorus-stemmen"
-msgid "Chorus Level"
+msgid "Chorus Level"
msgstr "Chorus-niveau"
-msgid "Chorus Speed"
+msgid "Chorus Speed"
msgstr "Chorus-snelheid"
-msgid "Chorus Depth"
+msgid "Chorus Depth"
msgstr "Chorus-diepte"
-msgid "Chorus Waveform"
+msgid "Chorus Waveform"
msgstr "Chorus-golfvorm"
-msgid "Reverb"
+msgid "Reverb"
msgstr "Reverb"
-msgid "Reverb Room Size"
+msgid "Reverb Room Size"
msgstr "Reverbkamer afmetingen"
-msgid "Reverb Damping"
+msgid "Reverb Damping"
msgstr "Reverbdemping"
-msgid "Reverb Width"
+msgid "Reverb Width"
msgstr "Reverbbreedte"
-msgid "Reverb Level"
+msgid "Reverb Level"
msgstr "Reverbniveau"
-msgid "Interpolation Method"
+msgid "Interpolation Method"
msgstr "Interpolatiemethode"
-msgid "Reverb Output Gain"
+msgid "Reverb Output Gain"
msgstr "Reverbuitgang Versterking"
-msgid "Reversed stereo"
+msgid "Reversed stereo"
msgstr "Omgekeerde stereo"
-msgid "Nice ramp"
+msgid "Nice ramp"
msgstr "Mooie helling"
-msgid "Hz"
+msgid "Hz"
msgstr "Hz"
-msgid "Buttons"
+msgid "Buttons"
msgstr "Knoppen"
-msgid "Serial Port"
+msgid "Serial Port"
msgstr "Seriële poort"
-msgid "RTS toggle"
+msgid "RTS toggle"
msgstr "RTS toggle"
-msgid "Revision"
+msgid "Revision"
msgstr "Revisie"
-msgid "Controller"
+msgid "Controller"
msgstr "Controller"
-msgid "Show Crosshair"
+msgid "Show Crosshair"
msgstr "Toon dradenkruis"
-msgid "DMA"
+msgid "DMA"
msgstr "DMA"
-msgid "MAC Address"
+msgid "MAC Address"
msgstr "MAC-adres"
-msgid "MAC Address OUI"
+msgid "MAC Address OUI"
msgstr "MAC-adres OUI"
-msgid "Enable BIOS"
+msgid "Enable BIOS"
msgstr "BIOS inschakelen"
-msgid "Baud Rate"
+msgid "Baud Rate"
msgstr "Baud-snelheid"
-msgid "TCP/IP listening port"
+msgid "TCP/IP listening port"
msgstr "TCP/IP-luisterpoort"
-msgid "Phonebook File"
+msgid "Phonebook File"
msgstr "Telefoonboekbestand"
-msgid "Telnet emulation"
+msgid "Telnet emulation"
msgstr "Telnet-emulatie"
-msgid "RAM Address"
+msgid "RAM Address"
msgstr "RAM-adres"
-msgid "RAM size"
+msgid "RAM size"
msgstr "RAM-grootte"
-msgid "Initial RAM size"
+msgid "Initial RAM size"
msgstr "Oorspronkelijke RAM-grootte"
-msgid "Serial Number"
+msgid "Serial Number"
msgstr "Serienummer"
-msgid "Host ID"
+msgid "Host ID"
msgstr "Host-ID"
-msgid "FDC Address"
+msgid "FDC Address"
msgstr "FDC Adres"
-msgid "MPU-401 Address"
+msgid "MPU-401 Address"
msgstr "MPU-401 Adres"
-msgid "MPU-401 IRQ"
+msgid "MPU-401 IRQ"
msgstr "MPU-401 IRQ"
-msgid "Receive MIDI input"
+msgid "Receive MIDI input"
msgstr "MIDI-ingang ontvangen"
-msgid "Low DMA"
+msgid "Low DMA"
msgstr "Lage DMA"
-msgid "Enable Game port"
+msgid "Enable Game port"
msgstr "Game-poort inschakelen"
-msgid "Surround module"
+msgid "Surround module"
msgstr "Surroundmodule"
-msgid "CODEC"
+msgid "CODEC"
msgstr "Codec"
-msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)"
+msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)"
msgstr "Verhoog CODEC interrupt bij CODEC setup (nodig voor sommige stuurprogramma's)"
-msgid "SB Address"
+msgid "SB Address"
msgstr "SB-adres"
-msgid "WSS IRQ"
+msgid "WSS IRQ"
msgstr "WSS IRQ"
-msgid "WSS DMA"
+msgid "WSS DMA"
msgstr "WSS DMA"
-msgid "Enable OPL"
+msgid "Enable OPL"
msgstr "OPL inschakelen"
-msgid "Receive MIDI input (MPU-401)"
+msgid "Receive MIDI input (MPU-401)"
msgstr "MIDI-ingang ontvangen (MPU-401)"
-msgid "SB low DMA"
+msgid "SB low DMA"
msgstr "SB lage DMA"
-msgid "6CH variant (6-channel)"
+msgid "6CH variant (6-channel)"
msgstr "6CH-variant (6-kanaals)"
-msgid "Enable CMS"
+msgid "Enable CMS"
msgstr "CMS inschakelen"
-msgid "Mixer"
+msgid "Mixer"
msgstr "Mixer"
-msgid "High DMA"
+msgid "High DMA"
msgstr "Hoge DMA"
-msgid "Control PC speaker"
+msgid "Control PC speaker"
msgstr "Bestuur pc-luidspreker"
-msgid "Memory size"
+msgid "Memory size"
msgstr "Geheugengrootte"
-msgid "EMU8000 Address"
+msgid "EMU8000 Address"
msgstr "EMU8000 Adres"
-msgid "IDE Controller"
+msgid "IDE Controller"
msgstr "IDE-controller"
-msgid "Codec"
+msgid "Codec"
msgstr "Codec"
-msgid "GUS type"
+msgid "GUS type"
msgstr "GUS-type"
-msgid "Enable 0x04 \"Exit 86Box\" command"
+msgid "Enable 0x04 \"Exit 86Box\" command"
msgstr "Schakel het commando 0x04 \"Exit 86Box\" in"
-msgid "Display type"
+msgid "Display type"
msgstr "Scherm type"
-msgid "Composite type"
+msgid "Composite type"
msgstr "Composite type"
-msgid "RGB type"
+msgid "RGB type"
msgstr "RGB-type"
-msgid "Line doubling type"
+msgid "Line doubling type"
msgstr "Type lijnverdubbeling"
-msgid "Snow emulation"
+msgid "Snow emulation"
msgstr "Sneeuwemulatie"
-msgid "Monitor type"
+msgid "Monitor type"
msgstr "Type monitor"
-msgid "Character set"
+msgid "Character set"
msgstr "Tekenset"
-msgid "XGA type"
+msgid "XGA type"
msgstr "XGA-type"
-msgid "Instance"
+msgid "Instance"
msgstr "Instantie"
-msgid "MMIO Address"
+msgid "MMIO Address"
msgstr "MMIO-adres"
-msgid "RAMDAC type"
+msgid "RAMDAC type"
msgstr "RAMDAC type"
-msgid "Blend"
+msgid "Blend"
msgstr "Mengen"
-msgid "Bilinear filtering"
+msgid "Bilinear filtering"
msgstr "Bilineaire filtering"
-msgid "Dithering"
+msgid "Dithering"
msgstr "Dithering"
-msgid "Enable NMI for CGA emulation"
+msgid "Enable NMI for CGA emulation"
msgstr "NMI inschakelen voor CGA-emulatie"
-msgid "Voodoo type"
+msgid "Voodoo type"
msgstr "Voodoo-type"
-msgid "Framebuffer memory size"
+msgid "Framebuffer memory size"
msgstr "Framebuffer geheugengrootte"
-msgid "Texture memory size"
+msgid "Texture memory size"
msgstr "Grootte textuurgeheugen"
-msgid "Dither subtraction"
+msgid "Dither subtraction"
msgstr "Dither aftrekken"
-msgid "Screen Filter"
+msgid "Screen Filter"
msgstr "Schermfilter"
-msgid "Render threads"
+msgid "Render threads"
msgstr "Render threads"
-msgid "SLI"
+msgid "SLI"
msgstr "SLI"
-msgid "Start Address"
+msgid "Start Address"
msgstr "Startadres"
-msgid "Contiguous Size"
+msgid "Contiguous Size"
msgstr "Aaneengesloten grootte"
-msgid "I/O Width"
+msgid "I/O Width"
msgstr "I/O-breedte"
-msgid "Transfer Speed"
+msgid "Transfer Speed"
msgstr "Overdrachtssnelheid"
-msgid "EMS mode"
+msgid "EMS mode"
msgstr "EMS-modus"
-msgid "Address for > 2 MB"
+msgid "Address for > 2 MB"
msgstr "Adres voor > 2 MB"
-msgid "Frame Address"
+msgid "Frame Address"
msgstr "Frameadres"
-msgid "USA"
+msgid "USA"
msgstr "USA"
-msgid "Danish"
+msgid "Danish"
msgstr "Deens"
-msgid "Always at selected speed"
+msgid "Always at selected speed"
msgstr "Altijd op geselecteerde snelheid"
-msgid "BIOS setting + Hotkeys (off during POST)"
+msgid "BIOS setting + Hotkeys (off during POST)"
msgstr "BIOS-instelling + Sneltoetsen (niet actief tijdens POST)"
-msgid "64 kB starting from F0000"
+msgid "64 kB starting from F0000"
msgstr "64 kB vanaf F0000"
-msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)"
+msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)"
msgstr "128 kB vanaf E0000 (geïnverteerd MSB adres, laatste 64KB eerst)"
-msgid "Sine"
+msgid "Sine"
msgstr "Sinus"
-msgid "Triangle"
+msgid "Triangle"
msgstr "Driehoek"
-msgid "Linear"
+msgid "Linear"
msgstr "Lineair"
-msgid "4th Order"
+msgid "4th Order"
msgstr "4e Orde"
-msgid "7th Order"
+msgid "7th Order"
msgstr "7e Orde"
-msgid "Non-timed (original)"
+msgid "Non-timed (original)"
msgstr "Niet-getimed (origineel)"
-msgid "45 Hz (JMP2 not populated)"
+msgid "45 Hz (JMP2 not populated)"
msgstr "45 Hz (JMP2 niet gezet)"
-msgid "Two"
+msgid "Two"
msgstr "Twee"
-msgid "Three"
+msgid "Three"
msgstr "Drie"
-msgid "Wheel"
+msgid "Wheel"
msgstr "Wiel"
-msgid "Five + Wheel"
+msgid "Five + Wheel"
msgstr "Vijf + Wiel"
-msgid "A3 - SMT2 Serial / SMT3(R)V"
+msgid "A3 - SMT2 Serial / SMT3(R)V"
msgstr "A3 - SMT2 Serieel / SMT3(R)V"
-msgid "Q1 - SMT3(R) Serial"
+msgid "Q1 - SMT3(R) Serial"
msgstr "Q1 - SMT3(R) Serieel"
-msgid "8 KB"
+msgid "8 KB"
msgstr "8 KB"
-msgid "32 KB"
+msgid "32 KB"
msgstr "32 KB"
-msgid "16 KB"
+msgid "16 KB"
msgstr "16 KB"
-msgid "64 KB"
+msgid "64 KB"
msgstr "64 KB"
-msgid "Disable BIOS"
+msgid "Disable BIOS"
msgstr "BIOS uitschakelen"
-msgid "512 KB"
+msgid "512 KB"
msgstr "512 KB"
-msgid "2 MB"
+msgid "2 MB"
msgstr "2 MB"
-msgid "8 MB"
+msgid "8 MB"
msgstr "8 MB"
-msgid "28 MB"
+msgid "28 MB"
msgstr "28 MB"
-msgid "1 MB"
+msgid "1 MB"
msgstr "1 MB"
-msgid "4 MB"
+msgid "4 MB"
msgstr "4 MB"
-msgid "12 MB"
+msgid "12 MB"
msgstr "12 MB"
-msgid "16 MB"
+msgid "16 MB"
msgstr "16 MB"
-msgid "20 MB"
+msgid "20 MB"
msgstr "20 MB"
-msgid "24 MB"
+msgid "24 MB"
msgstr "24 MB"
-msgid "SigmaTel STAC9721T (stereo)"
+msgid "SigmaTel STAC9721T (stereo)"
msgstr "SigmaTel STAC9721T (stereo)"
-msgid "Classic"
+msgid "Classic"
msgstr "Klassiek"
-msgid "256 KB"
+msgid "256 KB"
msgstr "256 KB"
-msgid "Composite"
+msgid "Composite"
msgstr "Composite"
-msgid "Old"
+msgid "Old"
msgstr "Oud"
-msgid "New"
+msgid "New"
msgstr "Nieuw"
-msgid "Color (generic)"
+msgid "Color (generic)"
msgstr "Kleur (algemeen)"
-msgid "Green Monochrome"
+msgid "Green Monochrome"
msgstr "Groen monochroom"
-msgid "Amber Monochrome"
+msgid "Amber Monochrome"
msgstr "Amber Monochroom"
-msgid "Gray Monochrome"
+msgid "Gray Monochrome"
msgstr "Grijs monochroom"
-msgid "Color (no brown)"
+msgid "Color (no brown)"
msgstr "Kleur (geen bruin)"
-msgid "Color (IBM 5153)"
+msgid "Color (IBM 5153)"
msgstr "Kleur (IBM 5153)"
-msgid "Simple doubling"
+msgid "Simple doubling"
msgstr "Eenvoudige verdubbeling"
-msgid "sRGB interpolation"
+msgid "sRGB interpolation"
msgstr "sRGB-interpolatie"
-msgid "Linear interpolation"
+msgid "Linear interpolation"
msgstr "Lineaire interpolatie"
-msgid "128 KB"
+msgid "128 KB"
msgstr "128 KB"
-msgid "Monochrome (5151/MDA) (white)"
+msgid "Monochrome (5151/MDA) (white)"
msgstr "Monochroom (5151/MDA) (wit)"
-msgid "Monochrome (5151/MDA) (green)"
+msgid "Monochrome (5151/MDA) (green)"
msgstr "Monochroom (5151/MDA) (groen)"
-msgid "Monochrome (5151/MDA) (amber)"
+msgid "Monochrome (5151/MDA) (amber)"
msgstr "Monochroom (5151/MDA) (amber)"
-msgid "Color 40x25 (5153/CGA)"
+msgid "Color 40x25 (5153/CGA)"
msgstr "Kleur 40x25 (5153/CGA)"
-msgid "Color 80x25 (5153/CGA)"
+msgid "Color 80x25 (5153/CGA)"
msgstr "Kleur 80x25 (5153/CGA)"
-msgid "Enhanced Color - Normal Mode (5154/ECD)"
+msgid "Enhanced Color - Normal Mode (5154/ECD)"
msgstr "Verbeterde kleur - normale modus (5154/ECD)"
-msgid "Enhanced Color - Enhanced Mode (5154/ECD)"
+msgid "Enhanced Color - Enhanced Mode (5154/ECD)"
msgstr "Verbeterde kleur - Verbeterde modus (5154/ECD)"
-msgid "Green"
+msgid "Green"
msgstr "Groen"
-msgid "Amber"
+msgid "Amber"
msgstr "Amber"
-msgid "Gray"
+msgid "Gray"
msgstr "Grijs"
-msgid "Color"
+msgid "Color"
msgstr "Kleur"
-msgid "U.S. English"
+msgid "U.S. English"
msgstr "Amerikaans Engels"
-msgid "Scandinavian"
+msgid "Scandinavian"
msgstr "Scandinavisch"
-msgid "Other languages"
+msgid "Other languages"
msgstr "Andere talen"
-msgid "Bochs latest"
+msgid "Bochs latest"
msgstr "Bochs nieuwste"
-msgid "Mono Non-Interlaced"
+msgid "Mono Non-Interlaced"
msgstr "Mono Non-Interlaced"
-msgid "Color Interlaced"
+msgid "Color Interlaced"
msgstr "Kleur interlaced"
-msgid "Color Non-Interlaced"
+msgid "Color Non-Interlaced"
msgstr "Kleur non-interlaced"
-msgid "3Dfx Voodoo Graphics"
+msgid "3Dfx Voodoo Graphics"
msgstr "3Dfx Voodoo Graphics"
-msgid "Obsidian SB50 + Amethyst (2 TMUs)"
+msgid "Obsidian SB50 + Amethyst (2 TMUs)"
msgstr "Obsidian SB50 + Amethyst (2 TMU's)"
-msgid "8-bit"
+msgid "8-bit"
msgstr "8-bit"
-msgid "16-bit"
+msgid "16-bit"
msgstr "16-bit"
-msgid "Standard (150ns)"
+msgid "Standard (150ns)"
msgstr "Standaard (150ns)"
-msgid "High-Speed (120ns)"
+msgid "High-Speed (120ns)"
msgstr "Hoge snelheid (120ns)"
-msgid "Enabled"
+msgid "Enabled"
msgstr "Ingeschakeld"
-msgid "Standard"
+msgid "Standard"
msgstr "Standaard"
-msgid "High-Speed"
+msgid "High-Speed"
msgstr "Hoge snelheid"
-msgid "Stereo LPT DAC"
+msgid "Stereo LPT DAC"
msgstr "Stereo LPT DAC"
-msgid "Generic Text Printer"
+msgid "Generic Text Printer"
msgstr "Generieke tekstprinter"
-msgid "Generic ESC/P Dot-Matrix Printer"
+msgid "Generic ESC/P Dot-Matrix Printer"
msgstr "Generieke ESC/P dot-matrix-printer"
-msgid "Generic PostScript Printer"
+msgid "Generic PostScript Printer"
msgstr "Generieke PostScript-printer"
-msgid "Generic PCL5e Printer"
+msgid "Generic PCL5e Printer"
msgstr "Generieke PCL5e-printer"
-msgid "Parallel Line Internet Protocol"
+msgid "Parallel Line Internet Protocol"
msgstr "Internetprotocol voor parallelle lijnen"
-msgid "Protection Dongle for Savage Quest"
+msgid "Protection Dongle for Savage Quest"
msgstr "Beschermingsdongle voor Savage Quest"
-msgid "Serial Passthrough Device"
+msgid "Serial Passthrough Device"
msgstr "Serieel doorvoerapparaat"
-msgid "Passthrough Mode"
+msgid "Passthrough Mode"
msgstr "Doorgeefmodus"
-msgid "Host Serial Device"
+msgid "Host Serial Device"
msgstr "Host Serieel Apparaat"
-msgid "Name of pipe"
+msgid "Name of pipe"
msgstr "Naam van de pipe"
-msgid "Data bits"
+msgid "Data bits"
msgstr "Databits"
-msgid "Stop bits"
+msgid "Stop bits"
msgstr "Stopbits"
-msgid "Baud Rate of Passthrough"
+msgid "Baud Rate of Passthrough"
msgstr "Baud-snelheid van doorvoer"
-msgid "Named Pipe (Server)"
+msgid "Named Pipe (Server)"
msgstr "Named Pipe (Server)"
-msgid "Host Serial Passthrough"
+msgid "Host Serial Passthrough"
msgstr "Host seriële doorgave"
-msgid "Eject %s"
-msgstr "Uitwerpen %s"
+msgid "E&ject %1"
+msgstr "&Uitwerpen %1"
-msgid "&Unmute"
+msgid "&Unmute"
msgstr "&Geluid aanzetten"
-msgid "Softfloat FPU"
+msgid "Softfloat FPU"
msgstr "Softfloat FPU"
-msgid "High performance impact"
+msgid "High performance impact"
msgstr "Hoge prestatie-impact"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM-schijf (max. snelheid)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM-schijf (max. snelheid)"
-msgid "IBM 8514/A clone (ISA)"
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
+
+msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A-kloon (ISA)"
-msgid "Vendor"
+msgid "Vendor"
msgstr "Verkoper"
-msgid "Generic PC/XT Memory Expansion"
+msgid "Generic PC/XT Memory Expansion"
msgstr "Generieke PC/XT geheugenuitbreiding"
-msgid "Generic PC/AT Memory Expansion"
+msgid "Generic PC/AT Memory Expansion"
msgstr "Generieke PC/AT geheugenuitbreiding"
msgid "Unable to find Dot-Matrix fonts"
@@ -2135,3 +2099,63 @@ msgstr "Dot-matrix-lettertypen niet gevonden"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "TrueType lettertypen in de map \"roms/printer/fonts\" zijn nodig voor de emulatie van de generieke ESC/P dot-matrix-printer."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po
index 78ded239f..ab50711f6 100644
--- a/src/qt/languages/pl-PL.po
+++ b/src/qt/languages/pl-PL.po
@@ -18,8 +18,8 @@ msgstr "&Prawy CTRL to lewy Alt"
msgid "&Hard Reset..."
msgstr "&Twardy reset..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Linear"
msgid "Hi&DPI scaling"
msgstr "Skalowanie Hi&DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Pełny ekran\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Pełny ekran"
msgid "Fullscreen &stretch mode"
msgstr "Tryb rozciągania na pełnym ekranie"
@@ -186,8 +186,11 @@ msgstr "&Ustawienia..."
msgid "&Update status bar icons"
msgstr "&Aktualizuj ikony na pasku statusu"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Zrób &zrzut ekranu\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Zrób &zrzut ekranu"
+
+msgid "S&ound"
+msgstr "Dź&więk"
msgid "&Preferences..."
msgstr "&Preferencje..."
@@ -198,11 +201,11 @@ msgstr "Włącz integrację z &Discord"
msgid "Sound &gain..."
msgstr "Wzmocnienie &dźwięku..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Rozpocznij śledzenie\tCtrl+T"
+msgid "Begin trace"
+msgstr "Rozpocznij śledzenie"
-msgid "End trace\tCtrl+T"
-msgstr "Zakończ śledzenie\tCtrl+T"
+msgid "End trace"
+msgstr "Zakończ śledzenie"
msgid "&Help"
msgstr "&Pomoc"
@@ -249,8 +252,8 @@ msgstr "&Ścisz"
msgid "E&mpty"
msgstr "P&usty"
-msgid "&Reload previous image"
-msgstr "&Przeładuj poprzedni obraz"
+msgid "Reload previous image"
+msgstr "Przeładuj poprzedni obraz"
msgid "&Folder..."
msgstr "&Teczka..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Anuluj"
-msgid "Save these settings as &global defaults"
-msgstr "Zapisz ustawienia jako &globalne ustawienia domyślne"
-
msgid "&Default"
msgstr "&Domyślny"
msgid "Language:"
msgstr "Język:"
-msgid "Icon set:"
-msgstr "Zestaw ikon:"
-
msgid "Gain"
msgstr "Wzmacniacz"
@@ -648,8 +645,8 @@ msgstr "Naciśnij klawisze Ctrl+Alt+PgDn aby wrócić to trybu okna."
msgid "Speed"
msgstr "Szybkość"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Obrazy ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Nie można zainicjować renderera wideo."
-
msgid "Default"
msgstr "Domyślny"
-msgid "%i Wait state(s)"
-msgstr "%i Stany oczekiwania"
+msgid "%1 Wait state(s)"
+msgstr "%1 Stany oczekiwania"
msgid "Type"
msgstr "Rodzaj"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Żaden"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Dyskietka %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Dyskietka %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Zaawansowane obrazy sektorów"
@@ -828,8 +822,8 @@ msgstr "Nie można zainicjować Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Nie można zainicjować GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Obrazy MO"
@@ -903,11 +897,8 @@ msgstr "Konfiguracja urządzenia %1"
msgid "Monitor in sleep mode"
msgstr "Monitor w trybie czuwania"
-msgid "OpenGL Shaders"
-msgstr "Shadery OpenGL"
-
-msgid "OpenGL options"
-msgstr "Opcje OpenGL"
+msgid "GLSL shaders"
+msgstr "Shadery GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Ładujesz nieobsługiwaną konfigurację"
@@ -918,24 +909,18 @@ msgstr "Wybór rodzaju procesora oparty na wybranej maszynie jest wyłączony dl
msgid "Continue"
msgstr "Kontynuuj"
-msgid "Cassette: %s"
-msgstr "Kaseta: %s"
+msgid "Cassette: %1"
+msgstr "Kaseta: %1"
msgid "Cassette images"
msgstr "Obrazy kaset"
-msgid "Cartridge %i: %ls"
-msgstr "Kartrydż %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Kartrydż %1: %2"
msgid "Cartridge images"
msgstr "Obrazy kartrydżu"
-msgid "Error initializing renderer"
-msgstr "Błąd inicjalizacji renderera"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Nie można zainicjować renderera OpenGL (3.0 Core). Użyj innego."
-
msgid "Resume execution"
msgstr "Wznów wykonywanie"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1270,7 +1255,7 @@ msgid "Host CD/DVD Drive (%1:)"
msgstr "Napęd CD/DVD hosta (%1:)"
msgid "&Connected"
-msgstr "&Connected"
+msgstr ""
msgid "Clear image history"
msgstr "Wyczyść historię obrazów"
@@ -1278,9 +1263,6 @@ msgstr "Wyczyść historię obrazów"
msgid "Create..."
msgstr "Stwórz..."
-msgid "previous image"
-msgstr "poprzedni obraz"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Napęd CD/DVD hosta (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Nieznana magistrala"
msgid "Null Driver"
msgstr "Null Driver"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Błąd otwarcia \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Błąd kompilacji shadera wierzchołków w pliku \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Błąd kompilacji shadera fragmentów w pliku \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Błąd łączenia programu shader w pliku \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Opcje renderowania OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Zachowanie renderowania"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Renderuj każdą klatkę natychmiast, w synchronizacji z emulowanym wyświetlaczem.</p><p><span style=" font-style:italic;">Jest to zalecana opcja, jeśli używane shadery nie wykorzystują frametime do animowanych efektów.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Zsynchronizuj z wideo"
@@ -1332,21 +1296,9 @@ msgstr "Shadery"
msgid "Remove"
msgstr "Usuń"
-msgid "No shader selected"
-msgstr "Nie wybrano shadera"
-
msgid "Browse..."
msgstr "Przeglądaj..."
-msgid "Shader error"
-msgstr "Błąd shadera"
-
-msgid "Could not load shaders."
-msgstr "Nie można załadować shaderów."
-
-msgid "More information in details."
-msgstr "Więcej informacji w szczegółach."
-
msgid "Couldn't create OpenGL context."
msgstr "Nie można utworzyć kontekstu OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Nie można przełączyć na kontekst OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Wymagana jest wersja OpenGL 3.0 lub wyższa. Aktualna wersja to %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Inicjalizacja OpenGL nie powiodła się. Błąd %1."
-
msgid "Error initializing OpenGL"
msgstr "Błąd inicjalizacji OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Powrót do renderowania oprogramowania.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Przydzielenie pamięci dla bufora rozpakowywania nie powiodło się.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nPowrót do renderowania oprogramowania."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Podczas wybierania obrazów nośników (CD-ROM, dyskietka itp.) otwarte okno dialogowe rozpocznie się w tym samym katalogu, co plik konfiguracyjny 86Box. To ustawienie prawdopodobnie będzie miało znaczenie tylko na macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Przełączanie portu szeregowego 3"
msgid "Serial port passthrough 4"
msgstr "Przełączanie portu szeregowego 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Opcje renderowania..."
@@ -2103,8 +2046,8 @@ msgstr "Nazwana rura (serwer)"
msgid "Host Serial Passthrough"
msgstr "Przejście przez port szeregowy hosta"
-msgid "Eject %s"
-msgstr "Wyjmij %s"
+msgid "E&ject %1"
+msgstr "W&yjmij %1"
msgid "&Unmute"
msgstr "&Wycisz"
@@ -2115,8 +2058,29 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Wysoki wpływ na wydajność"
-msgid "RAM Disk (max. speed)"
-msgstr "Dysk RAM (maks. prędkość)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Dysk RAM (maks. prędkość)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Klon IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Nie można znaleźć czcionek igłowych"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Czcionki TrueType w katalogu \"roms/printer/fonts\" są wymagane do emulacji generyczniej drukarki igłowej ESC/P."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po
index 1594e30ab..db07a69ae 100644
--- a/src/qt/languages/pt-BR.po
+++ b/src/qt/languages/pt-BR.po
@@ -18,8 +18,8 @@ msgstr "&CTRL direito é o ALT esquerdo"
msgid "&Hard Reset..."
msgstr "&Reinicialização completa..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Linear"
msgid "Hi&DPI scaling"
msgstr "Escala Hi&DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Tela cheia\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Tela cheia"
msgid "Fullscreen &stretch mode"
msgstr "Modo de &redimensionamento da tela cheia"
@@ -186,8 +186,11 @@ msgstr "&Configurações..."
msgid "&Update status bar icons"
msgstr "&Atualizar ícones da barra de status"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Capturar &tela\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Capturar &tela"
+
+msgid "S&ound"
+msgstr "&Som"
msgid "&Preferences..."
msgstr "&Preferências..."
@@ -198,11 +201,11 @@ msgstr "Ativar integração com o &Discord"
msgid "Sound &gain..."
msgstr "&Ganho de som..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Inicio do rastreamento\tCtrl+T"
+msgid "Begin trace"
+msgstr "Inicio do rastreamento"
-msgid "End trace\tCtrl+T"
-msgstr "Finalizar rastreamento\tCtrl+T"
+msgid "End trace"
+msgstr "Finalizar rastreamento"
msgid "&Help"
msgstr "&Ajuda"
@@ -249,8 +252,8 @@ msgstr "&Silenciar"
msgid "E&mpty"
msgstr "&Vazio"
-msgid "&Reload previous image"
-msgstr "&Recarregar imagem anterior"
+msgid "Reload previous image"
+msgstr "Recarregar imagem anterior"
msgid "&Folder..."
msgstr "&Pasta..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Cancelar"
-msgid "Save these settings as &global defaults"
-msgstr "Salvar estas configurações como &padrões globais"
-
msgid "&Default"
msgstr "&Padrão"
msgid "Language:"
msgstr "Idioma:"
-msgid "Icon set:"
-msgstr "Conjunto de ícones:"
-
msgid "Gain"
msgstr "Ganho"
@@ -648,8 +645,8 @@ msgstr "Use Ctrl+Alt+PgDn para retornar ao modo janela"
msgid "Speed"
msgstr "Velocidade"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Imagens ZIP"
@@ -753,14 +750,11 @@ msgstr "SE"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Não foi possível inicializar o renderizador de vídeo."
-
msgid "Default"
msgstr "Padrão"
-msgid "%i Wait state(s)"
-msgstr "%i estado(s) de espera"
+msgid "%1 Wait state(s)"
+msgstr "%1 estado(s) de espera"
msgid "Type"
msgstr "Tipo"
@@ -804,11 +798,11 @@ msgstr "Sistema de Controle de Voo Thrustmaster"
msgid "None"
msgstr "Nenhum"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CCS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CCS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disquete %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disquete %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Imagens de setor avançado"
@@ -828,8 +822,8 @@ msgstr "Não foi possível inicializar o Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Não foi possível inicializar o GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "Magneto-óptico %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "Magneto-óptico %1 (%2): %3"
msgid "MO images"
msgstr "Imagens magneto-ópticas"
@@ -903,11 +897,8 @@ msgstr "Configuração do dispositivo %1"
msgid "Monitor in sleep mode"
msgstr "Monitor em modo de suspensão"
-msgid "OpenGL Shaders"
-msgstr "Shaders OpenGL"
-
-msgid "OpenGL options"
-msgstr "Opções do OpenGL"
+msgid "GLSL shaders"
+msgstr "Shaders GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Você está carregando uma configuração não suportada"
@@ -918,24 +909,18 @@ msgstr "A filtragem do tipo de CPU baseada na máquina selecionada está desativ
msgid "Continue"
msgstr "Continuar"
-msgid "Cassette: %s"
-msgstr "Cassete: %s"
+msgid "Cassette: %1"
+msgstr "Cassete: %1"
msgid "Cassette images"
msgstr "Imagens de cassete"
-msgid "Cartridge %i: %ls"
-msgstr "Cartucho %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartucho %1: %2"
msgid "Cartridge images"
msgstr "Imagens de cartucho"
-msgid "Error initializing renderer"
-msgstr "Erro ao inicializar o renderizador"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "O renderizador OpenGL (Núcleo 3.0) não pôde ser inicializado. Use outro renderizador."
-
msgid "Resume execution"
msgstr "Continuar a execução"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "Limpar histórico de imagens"
msgid "Create..."
msgstr "Criar..."
-msgid "previous image"
-msgstr "imagem anterior"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Unidade de CD/DVD do anfitrião (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Barramento desconhecido"
msgid "Null Driver"
msgstr "Driver nulo"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Erro ao abrir \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Erro ao compilar o sombreador de vértice no arquivo \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Erro ao compilar o fragment shader no arquivo \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Erro ao vincular o programa de shader no arquivo \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Opções do renderizador OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Comportamento de renderização"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Renderize cada quadro imediatamente, em sincronia com a tela emulada.</p><p><span style=" font-style:italic;">Essa é a opção recomendada se os shaders em uso não utilizarem o frametime para efeitos animados.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Sincronizar com o vídeo"
@@ -1332,21 +1296,9 @@ msgstr "Shaders"
msgid "Remove"
msgstr "Remover"
-msgid "No shader selected"
-msgstr "Nenhum shader selecionado"
-
msgid "Browse..."
msgstr "Procurar..."
-msgid "Shader error"
-msgstr "Erro do sombreador"
-
-msgid "Could not load shaders."
-msgstr "Não foi possível carregar os shaders."
-
-msgid "More information in details."
-msgstr "Mais informações em detalhes."
-
msgid "Couldn't create OpenGL context."
msgstr "Não foi possível criar o contexto OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Não foi possível alternar para o contexto OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Falha na inicialização do OpenGL. Erro %1."
-
msgid "Error initializing OpenGL"
msgstr "Erro ao inicializar o OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Voltando à renderização de software.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Falha na alocação de memória para o buffer de descompactação.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nVoltando à renderização de software."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Ao selecionar imagens de mídia (CD-ROM, disquete, etc.), a caixa de diálogo de abertura será iniciada no mesmo diretório do arquivo de configuração do 86Box. Essa configuração provavelmente só fará diferença no macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Passagem de porta serial 3"
msgid "Serial port passthrough 4"
msgstr "Passagem de porta serial 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Opções do renderizador..."
@@ -2103,8 +2046,8 @@ msgstr "Tubo nomeado (servidor)"
msgid "Host Serial Passthrough"
msgstr "Passagem da porta serial do host"
-msgid "Eject %s"
-msgstr "Ejetar %s"
+msgid "E&ject %1"
+msgstr "E&jetar %1"
msgid "&Unmute"
msgstr "&Reativar som"
@@ -2115,8 +2058,29 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Alto impacto no desempenho"
-msgid "RAM Disk (max. speed)"
-msgstr "Disco RAM (velocidade máxima)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disco RAM (velocidade máxima)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Clone IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Não foi possível localizar os fontes matriciais de pontos"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "As fontes TrueType no diretório \"roms/printer/fonts\" são necessárias para a emulação da impressora matricial de pontos ESC/P genérica."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po
index b31f020d4..f67ddbdf8 100644
--- a/src/qt/languages/pt-PT.po
+++ b/src/qt/languages/pt-PT.po
@@ -18,8 +18,8 @@ msgstr "&CTRL direito é ALT esquerdo"
msgid "&Hard Reset..."
msgstr "&Reinicialização completa..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Linear"
msgid "Hi&DPI scaling"
msgstr "Escala Hi&DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "E&crã cheio\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "E&crã cheio"
msgid "Fullscreen &stretch mode"
msgstr "Modo &de estiramento na tela cheia"
@@ -186,8 +186,11 @@ msgstr "&Definições..."
msgid "&Update status bar icons"
msgstr "&Atualizar ícones da barra de estado"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Gravar imagem de ecrã\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Gravar imagem de ecrã"
+
+msgid "S&ound"
+msgstr "&Som"
msgid "&Preferences..."
msgstr "&Preferências..."
@@ -198,11 +201,11 @@ msgstr "Ativar integração com &Discord"
msgid "Sound &gain..."
msgstr "&Ganho de som..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Iniciar o rastreio\tCtrl+T"
+msgid "Begin trace"
+msgstr "Iniciar o rastreio"
-msgid "End trace\tCtrl+T"
-msgstr "Terminar o rastreio\tCtrl+T"
+msgid "End trace"
+msgstr "Terminar o rastreio"
msgid "&Help"
msgstr "&Ajuda"
@@ -249,8 +252,8 @@ msgstr "&Desativar som"
msgid "E&mpty"
msgstr "&CDROM vazio"
-msgid "&Reload previous image"
-msgstr "&Recarregar imagem anterior"
+msgid "Reload previous image"
+msgstr "Recarregar imagem anterior"
msgid "&Folder..."
msgstr "&Pasta..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Cancelar"
-msgid "Save these settings as &global defaults"
-msgstr "Guardar estas definições como padrões &globais"
-
msgid "&Default"
msgstr "&Padrão"
msgid "Language:"
msgstr "Idioma:"
-msgid "Icon set:"
-msgstr "Pacote de ícones:"
-
msgid "Gain"
msgstr "Ganho"
@@ -648,8 +645,8 @@ msgstr "Pressione Ctrl+Alt+PgDn para voltar ao modo de janela."
msgid "Speed"
msgstr "Velocidade"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Imagens ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Não foi possível inicializar o renderizador vídeo."
-
msgid "Default"
msgstr "Padrão"
-msgid "%i Wait state(s)"
-msgstr "%i estado(s) de espera"
+msgid "%1 Wait state(s)"
+msgstr "%1 estado(s) de espera"
msgid "Type"
msgstr "Tipo"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Nenhum"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CCS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CCS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disquete %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disquete %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Imagens avançadas de sector"
@@ -828,8 +822,8 @@ msgstr "Não foi possível inicializar o Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Não foi possível inicializar o GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "Magneto-óptico %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "Magneto-óptico %1 (%2): %3"
msgid "MO images"
msgstr "Imagens magneto-ópticas"
@@ -903,11 +897,8 @@ msgstr "Configuração de dispositivo %1"
msgid "Monitor in sleep mode"
msgstr "Ecrã em modo de sono"
-msgid "OpenGL Shaders"
-msgstr "Shaders OpenGL"
-
-msgid "OpenGL options"
-msgstr "Opções de OpenGL"
+msgid "GLSL shaders"
+msgstr "Shaders GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Está a carregar uma configuração sem suporte!"
@@ -918,24 +909,18 @@ msgstr "A filtragem do tipo de CPU baseada na máquina escolhida está desativad
msgid "Continue"
msgstr "Continuar"
-msgid "Cassette: %s"
-msgstr "Cassete: %s"
+msgid "Cassette: %1"
+msgstr "Cassete: %1"
msgid "Cassette images"
msgstr "Imagens de cassete"
-msgid "Cartridge %i: %ls"
-msgstr "Cartucho %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartucho %1: %2"
msgid "Cartridge images"
msgstr "Imagens de cartucho"
-msgid "Error initializing renderer"
-msgstr "Erro na inicialização do renderizador"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Não foi possível inicializar o renderizador OpenGL (3.0 Core). Utilize outro renderizador."
-
msgid "Resume execution"
msgstr "Retomar execução"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "Limpar o histórico de imagens"
msgid "Create..."
msgstr "Criar..."
-msgid "previous image"
-msgstr "imagem anterior"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Unidade de CD/DVD do anfitrião (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Autocarro desconhecido"
msgid "Null Driver"
msgstr "Condutor nulo"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Erro ao abrir \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Erro ao compilar o sombreador de vértice no ficheiro \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Erro ao compilar o shader de fragmento no ficheiro \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Erro ao ligar o programa de shader no ficheiro \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Opções do renderizador OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Comportamento de renderização"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Renderiza cada frame imediatamente, em sincronia com o ecrã emulado.</p><p><span style=" font-style:italic;">Esta é a opção recomendada se os shaders em uso não utilizam frametime para efeitos animados.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Sincronizar com vídeo"
@@ -1332,21 +1296,9 @@ msgstr "Shaders"
msgid "Remove"
msgstr "Remover"
-msgid "No shader selected"
-msgstr "Nenhum sombreador selecionado"
-
msgid "Browse..."
msgstr "Navegar..."
-msgid "Shader error"
-msgstr "Erro de shader"
-
-msgid "Could not load shaders."
-msgstr "Não foi possível carregar os shaders."
-
-msgid "More information in details."
-msgstr "Mais informações em pormenor."
-
msgid "Couldn't create OpenGL context."
msgstr "Não foi possível criar o contexto OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Não foi possível mudar para o contexto OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Falha na inicialização do OpenGL. Erro %1."
-
msgid "Error initializing OpenGL"
msgstr "Erro ao inicializar o OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Recuando para a renderização de software."
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Falha na atribuição de memória para a memória intermédia de descompactação.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nRecuando para a renderização de software."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Ao selecionar imagens multimédia (CD-ROM, disquete, etc.) a caixa de diálogo de abertura irá começar no mesmo diretório que o ficheiro de configuração da 86Box. Esta configuração provavelmente só fará diferença no macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Passagem da porta de série 3"
msgid "Serial port passthrough 4"
msgstr "Passagem da porta de série 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Sistemas de visão Melhorador LBA"
-
msgid "Renderer options..."
msgstr "Opções do renderizador..."
@@ -2103,8 +2046,8 @@ msgstr "Tubo nomeado (servidor)"
msgid "Host Serial Passthrough"
msgstr "Passagem da porta de série do anfitrião"
-msgid "Eject %s"
-msgstr "Ejetar %s"
+msgid "E&ject %1"
+msgstr "E&jetar %1"
msgid "&Unmute"
msgstr "&Reativar som"
@@ -2115,8 +2058,29 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Elevado impacto no desempenho"
-msgid "RAM Disk (max. speed)"
-msgstr "Disco RAM (velocidade máxima)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disco RAM (velocidade máxima)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Clone IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Não foi possível encontrar os fontes matriciais de pontos"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "As fontes TrueType no diretório \"roms/printer/fonts\" são necessárias para a emulação da impressora matricial de pontos ESC/P genérica"
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po
index a8a4b7794..fb1908f60 100644
--- a/src/qt/languages/ru-RU.po
+++ b/src/qt/languages/ru-RU.po
@@ -18,8 +18,8 @@ msgstr "&Правый CTRL - это левый ALT"
msgid "&Hard Reset..."
msgstr "&Холодная перезагрузка..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Линейный"
msgid "Hi&DPI scaling"
msgstr "Масштабирование Hi&DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Полноэкранный режим\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Полноэкранный режим"
msgid "Fullscreen &stretch mode"
msgstr "&Растягивание в полноэкранном режиме"
@@ -186,8 +186,11 @@ msgstr "&Настройки машины..."
msgid "&Update status bar icons"
msgstr "&Обновление значков строки состояния"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Сделать с&криншот\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Сделать с&криншот"
+
+msgid "S&ound"
+msgstr "&Звук"
msgid "&Preferences..."
msgstr "&Параметры..."
@@ -198,11 +201,11 @@ msgstr "Включить интеграцию &Discord"
msgid "Sound &gain..."
msgstr "&Усиление звука..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Начать трассировку\tCtrl+T"
+msgid "Begin trace"
+msgstr "Начать трассировку"
-msgid "End trace\tCtrl+T"
-msgstr "Завершить трассировку\tCtrl+T"
+msgid "End trace"
+msgstr "Завершить трассировку"
msgid "&Help"
msgstr "&Помощь"
@@ -249,8 +252,8 @@ msgstr "О&тключить звук"
msgid "E&mpty"
msgstr "П&устой"
-msgid "&Reload previous image"
-msgstr "&Снова загрузить предыдущий образ"
+msgid "Reload previous image"
+msgstr "Загрузить предыдущий образ"
msgid "&Folder..."
msgstr "&Папка..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Отмена"
-msgid "Save these settings as &global defaults"
-msgstr "Сохранить эти параметры как &глобальные по умолчанию"
-
msgid "&Default"
msgstr "&По умолчанию"
msgid "Language:"
msgstr "Язык:"
-msgid "Icon set:"
-msgstr "Набор иконок:"
-
msgid "Gain"
msgstr "Усиление"
@@ -648,8 +645,8 @@ msgstr "Нажмите Ctrl+Alt+PgDn для возврата в оконный
msgid "Speed"
msgstr "Скорость"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Образы ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "КБ"
-msgid "Could not initialize the video renderer."
-msgstr "Не удалось инициализировать рендерер видео."
-
msgid "Default"
msgstr "По умолчанию"
-msgid "%i Wait state(s)"
-msgstr "%i WS"
+msgid "%1 Wait state(s)"
+msgstr "%1 WS"
msgid "Type"
msgstr "Тип"
@@ -804,11 +798,11 @@ msgstr "Система управления полётом Thrustmaster"
msgid "None"
msgstr "Нет"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u МБ (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 МБ (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Дисковод %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Дисковод %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Расширенные образы секторов"
@@ -828,8 +822,8 @@ msgstr "Невозможно инициализировать Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Невозможно инициализировать GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "Магнитооптический %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "Магнитооптический %1 (%2): %3"
msgid "MO images"
msgstr "Образы магнитооптических дисков"
@@ -903,11 +897,8 @@ msgstr "Конфигурация устройства %1"
msgid "Monitor in sleep mode"
msgstr "Монитор в спящем режиме"
-msgid "OpenGL Shaders"
-msgstr "Шейдеры OpenGL"
-
-msgid "OpenGL options"
-msgstr "Параметры OpenGL"
+msgid "GLSL shaders"
+msgstr "Шейдеры GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Вы загружаете неподдерживаемую конфигурацию"
@@ -918,24 +909,18 @@ msgstr "Выбор типов ЦП для этой системной платы
msgid "Continue"
msgstr "Продолжить"
-msgid "Cassette: %s"
-msgstr "Кассета: %s"
+msgid "Cassette: %1"
+msgstr "Кассета: %1"
msgid "Cassette images"
msgstr "Образы кассет"
-msgid "Cartridge %i: %ls"
-msgstr "Картридж %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Картридж %1: %2"
msgid "Cartridge images"
msgstr "Образы картриджей"
-msgid "Error initializing renderer"
-msgstr "Ошибка инициализации рендерера"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Невозможно инициализировать рендерер OpenGL (3.0). Пожалуйста, используйте другой рендерер."
-
msgid "Resume execution"
msgstr "Возобновить выполнение"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 КБ"
@@ -1267,22 +1252,19 @@ msgid "Pen"
msgstr "Ручка"
msgid "Host CD/DVD Drive (%1:)"
-msgstr "Главный CD/DVD-привод (%1:)"
+msgstr "CD/DVD-привод хоста (%1:)"
msgid "&Connected"
-msgstr "&Connected"
+msgstr "&Кабель подключен"
msgid "Clear image history"
msgstr "Очистить историю образов"
msgid "Create..."
-msgstr "Создайте..."
-
-msgid "previous image"
-msgstr "предыдущее изображение"
+msgstr "Создать..."
msgid "Host CD/DVD Drive (%1)"
-msgstr "Главный CD/DVD-привод (%1)"
+msgstr "CD/DVD-привод хоста (%1)"
msgid "Unknown Bus"
msgstr "Неизвестная шина"
@@ -1290,23 +1272,8 @@ msgstr "Неизвестная шина"
msgid "Null Driver"
msgstr "Нулевой драйвер"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Ошибка при открытии \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Ошибка компиляции вершинного шейдера в файле \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Ошибка компиляции фрагментного шейдера в файле \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Ошибка компоновки программы шейдера в файле \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Параметры рендеринга OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Режим рендеринга"
@@ -1320,11 +1287,8 @@ msgstr " fps"
msgid "VSync"
msgstr "Вертикальная синхронизация"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Рендерить каждый кадр немедленно, синхронно с эмулируемым дисплеем.</p><p><span style="font-style:italic;">Это рекомендуемый вариант, если используемые шейдеры не используют время кадров для анимированных эффектов.</span></p></body></html>"
-
msgid "Synchronize with video"
-msgstr "Синхронизация с видео"
+msgstr "Синхронизировать с видео"
msgid "Shaders"
msgstr "Шейдеры"
@@ -1332,21 +1296,9 @@ msgstr "Шейдеры"
msgid "Remove"
msgstr "Удалить"
-msgid "No shader selected"
-msgstr "Шейдер не выбран"
-
msgid "Browse..."
msgstr "Обзор..."
-msgid "Shader error"
-msgstr "Ошибка шейдера"
-
-msgid "Could not load shaders."
-msgstr "Не удалось загрузить шейдеры."
-
-msgid "More information in details."
-msgstr "Более подробная информация в деталях."
-
msgid "Couldn't create OpenGL context."
msgstr "Не удалось создать контекст OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Не удалось переключиться на контекст Ope
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Требуется OpenGL версии 3.0 или выше. Текущая версия %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Не удалось выполнить инициализацию OpenGL. Ошибка %1."
-
msgid "Error initializing OpenGL"
msgstr "Ошибка инициализации OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Переключение на программный рендеринг.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Выделение памяти для буфера распаковки не удалось.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nПереключение на программный рендеринг."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>При выборе образов носителей (CD-ROM, дискет и т. д.) диалог открытия будет запускаться в том же каталоге, что и файл конфигурации 86Box. Эта настройка, скорее всего, будет иметь значение только на macOS.</p></body></html>"
@@ -1434,32 +1380,29 @@ msgstr "Сквозной последовательный порт COM3"
msgid "Serial port passthrough 4"
msgstr "Сквозной последовательный порт COM4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Параметры рендеринга..."
msgid "Logitech/Microsoft Bus Mouse"
-msgstr "Шинная мышь Logitech/Microsoft"
+msgstr "Bus-мышь Logitech/Microsoft"
msgid "Microsoft Bus Mouse (InPort)"
-msgstr "Шинная мышь Microsoft (InPort)"
+msgstr "Bus-мышь Microsoft (InPort)"
msgid "Mouse Systems Serial Mouse"
-msgstr "Последовательная мышь Mouse Systems"
+msgstr "COM-мышь Mouse Systems"
msgid "Microsoft Serial Mouse"
-msgstr "Последовательная мышь Microsoft"
+msgstr "COM-мышь Microsoft"
msgid "Logitech Serial Mouse"
-msgstr "Последовательная мышь Logitech"
+msgstr "COM-мышь Logitech"
msgid "PS/2 Mouse"
msgstr "Мышь PS/2"
msgid "3M MicroTouch (Serial)"
-msgstr "3M MicroTouch (последовательная)"
+msgstr "3M MicroTouch (последовательный)"
msgid "[COM] Standard Hayes-compliant Modem"
msgstr "[COM] Стандартный Hayes-совместимый модем"
@@ -2103,8 +2046,8 @@ msgstr "Именованный пайп (Сервер)"
msgid "Host Serial Passthrough"
msgstr "Последовательный порт хоста"
-msgid "Eject %s"
-msgstr "Извлечь %s"
+msgid "E&ject %1"
+msgstr "И&звлечь %1"
msgid "&Unmute"
msgstr "В&ключить звук"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Сильное влияние на производительность"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM-диск (макс. скорость)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Стандартный] RAM-диск (макс. скорость)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr "[Стандартный] 1989 (3500 RPM)"
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr "[Стандартный] 1989 (3500 RPM)"
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr "[Стандартный] 1989 (3500 RPM)"
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr "[Стандартный] 1989 (3500 RPM)"
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr "[Стандартный] 1989 (3500 RPM)"
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr "[Стандартный] 1989 (3500 RPM)"
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr "[Стандартный] 1989 (3500 RPM)"
msgid "IBM 8514/A clone (ISA)"
msgstr "Клон IBM 8514/A (ISA)"
@@ -2141,3 +2105,63 @@ msgstr "Невозможно найти матричные шрифты"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Шрифты TrueType в каталоге \"roms/printer/fonts\" необходимы для эмуляции стандартного матричного принтера ESC/P."
+
+msgid "Inhibit multimedia keys"
+msgstr "Перехватывать мультимедиа-клавиши"
+
+msgid "Ask for confirmation before saving settings"
+msgstr "Спрашивать подтверждения перед сохранением настроек"
+
+msgid "Ask for confirmation before hard resetting"
+msgstr "Спрашивать подтверждения перед холодной перезагрузкой"
+
+msgid "Ask for confirmation before quitting"
+msgstr "Спрашивать подтвержждения перед выходом"
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr "Показывать сообщение о горячих клавишах при включении полноэкранного режима"
+
+msgid "Options"
+msgstr "Параметры"
+
+msgid "Model:"
+msgstr "Модель:"
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr "Не удалось инициализировать рендерер Vulkan."
+
+msgid "GLSL Error"
+msgstr "Ошибка GLSL"
+
+msgid "Could not load shader: %1"
+msgstr "Не удалось загрузить шейдер: %1"
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr "Требуется OpenGL версии 3.0 или выше. Текущая версия GLSL %1.%2"
+
+msgid "Could not load texture: %1"
+msgstr "Не удалось загрузить текстуру: %1"
+
+msgid "Could not compile shader:\n\n%1"
+msgstr "Не удалось скомпилировать шейдер:\n\n%1"
+
+msgid "Program not linked:\n\n%1"
+msgstr "Не удалось скомпоновать шейдер:\n\n%1"
+
+msgid "Shader Manager"
+msgstr "Управление шейдерами"
+
+msgid "Shader Configuration"
+msgstr "Конфигурация шейдера"
+
+msgid "Add"
+msgstr "Добавить"
+
+msgid "Move up"
+msgstr "Вверх"
+
+msgid "Move down"
+msgstr "Вниз"
+
+msgid "Could not load file %1"
+msgstr "Не удалось загрузить файл %1"
diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po
index e789d9ef9..5080c49b5 100644
--- a/src/qt/languages/sk-SK.po
+++ b/src/qt/languages/sk-SK.po
@@ -18,8 +18,8 @@ msgstr "&Pravý Ctrl je ľavý Alt"
msgid "&Hard Reset..."
msgstr "&Resetovať"
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Lineárny"
msgid "Hi&DPI scaling"
msgstr "Š&kálovanie HiDPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Celá obrazovka\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Celá obrazovka"
msgid "Fullscreen &stretch mode"
msgstr "Režim roztia&hnutia na celú obrazovku"
@@ -186,8 +186,11 @@ msgstr "&Nastavenia..."
msgid "&Update status bar icons"
msgstr "&Aktualizovať ikony na stavovom riadku"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Urobiť snímku &obrazovky\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Urobiť snímku &obrazovky"
+
+msgid "S&ound"
+msgstr "&Zvuk"
msgid "&Preferences..."
msgstr "&Predvoľby..."
@@ -198,11 +201,11 @@ msgstr "Povolenie integrácie s &Discordem"
msgid "Sound &gain..."
msgstr "&Zosilnenie zvuku"
-msgid "Begin trace\tCtrl+T"
-msgstr "Začať trace\tCtrl+T"
+msgid "Begin trace"
+msgstr "Začať trace"
-msgid "End trace\tCtrl+T"
-msgstr "Zastaviť trace\tCtrl+T"
+msgid "End trace"
+msgstr "Zastaviť trace"
msgid "&Help"
msgstr "&Pomoc"
@@ -249,8 +252,8 @@ msgstr "&Stíšiť"
msgid "E&mpty"
msgstr "&Vystrihnúť"
-msgid "&Reload previous image"
-msgstr "&Načítať znova predchádzajúci obraz"
+msgid "Reload previous image"
+msgstr "Načítať znova predchádzajúci obraz"
msgid "&Folder..."
msgstr "&Zložka..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Storno"
-msgid "Save these settings as &global defaults"
-msgstr "Uložiť toto nastavenie ako &globálny východiskový stav"
-
msgid "&Default"
msgstr "&Východiskové"
msgid "Language:"
msgstr "Jazyk:"
-msgid "Icon set:"
-msgstr "Súprava ikon:"
-
msgid "Gain"
msgstr "Zosilnenie"
@@ -648,8 +645,8 @@ msgstr "Stlačte Ctrl+Alt+PgDn pre návrat z režimu celej obrazovky."
msgid "Speed"
msgstr "Rýchlosť"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Obrazy ZIP diskov"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Nastala chyba pri inicializácii video renderera."
-
msgid "Default"
msgstr "Východiskové"
-msgid "%i Wait state(s)"
-msgstr "%i čakací stav(y)"
+msgid "%1 Wait state(s)"
+msgstr "%1 čakací stav(y)"
msgid "Type"
msgstr "Typ"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Žiadne"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disketová mechanika %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disketová mechanika %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Rozšírené sektorové obrazy"
@@ -828,8 +822,8 @@ msgstr "Nastala chyba pri inicializácii knižnice Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Nastala chyba pri inicializácii knižnice GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Obrazy MO"
@@ -903,11 +897,8 @@ msgstr "Konfigurácia zariadenia %1"
msgid "Monitor in sleep mode"
msgstr "Monitor je v režime spánku"
-msgid "OpenGL Shaders"
-msgstr "Shadery OpenGL"
-
-msgid "OpenGL options"
-msgstr "Možnosti OpenGL"
+msgid "GLSL shaders"
+msgstr "Shadery GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Pokúšate sa spustiť nepodporovanú konfiguráciu"
@@ -918,24 +909,18 @@ msgstr "Pre túto konfiguráciu bolo vypnuté filtrovanie procesorov podľa zvol
msgid "Continue"
msgstr "Pokračovať"
-msgid "Cassette: %s"
-msgstr "Kazeta: %s"
+msgid "Cassette: %1"
+msgstr "Kazeta: %1"
msgid "Cassette images"
msgstr "Kazetové nahrávky"
-msgid "Cartridge %i: %ls"
-msgstr "Cartridge %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Cartridge %1: %2"
msgid "Cartridge images"
msgstr "Obrazy cartridge"
-msgid "Error initializing renderer"
-msgstr "Chyba pri inicializácii vykresľovača"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Vykresľovač OpenGL (3.0 Core) sa nepodarilo inicializovať. Použite iný renderer."
-
msgid "Resume execution"
msgstr "Obnoviť"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1270,7 +1255,7 @@ msgid "Host CD/DVD Drive (%1:)"
msgstr "Hostiteľská jednotka CD/DVD (%1:)"
msgid "&Connected"
-msgstr "&Connected"
+msgstr ""
msgid "Clear image history"
msgstr "Vymazanie histórie obrázkov"
@@ -1278,9 +1263,6 @@ msgstr "Vymazanie histórie obrázkov"
msgid "Create..."
msgstr "Vytvorte..."
-msgid "previous image"
-msgstr "predchádzajúca snímka"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Hostiteľská jednotka CD/DVD (%1)"
@@ -1290,23 +1272,9 @@ msgstr "Neznáma zbernica"
msgid "Null Driver"
msgstr "Nulový ovládač"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
-msgid "Error opening \"%1\": %2"
-msgstr "Chyba pri otváraní \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Chyba kompilácie vertex shadera v súbore \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Chyba kompilácie fragment shadera v súbore \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Chyba pri prepojení shader programu v súbore \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Možnosti vykresľovania OpenGL 3.0"
msgid "Render behavior"
msgstr "Správanie pri vykresľovaní"
@@ -1320,9 +1288,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Okamžite vykresliť každú snímku v synchronizácii s emulovaným displejom.</p><p><span style=" font-style:italic;">Toto je odporúčaná možnosť, ak používané shadery nevyužívajú frametime pre animované efekty.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Synchronizovať s obrazom"
@@ -1332,21 +1297,9 @@ msgstr "Shadery"
msgid "Remove"
msgstr "Odstránenie stránky"
-msgid "No shader selected"
-msgstr "Nie je vybraný žiadny tieňovač"
-
msgid "Browse..."
msgstr "Prehľadávať..."
-msgid "Shader error"
-msgstr "Chyba shadera"
-
-msgid "Could not load shaders."
-msgstr "Nepodarilo sa načítať shadery."
-
-msgid "More information in details."
-msgstr "Viac informácií v detailoch."
-
msgid "Couldn't create OpenGL context."
msgstr "Nepodarilo sa vytvoriť kontext OpenGL."
@@ -1356,17 +1309,11 @@ msgstr "Nepodarilo sa prepnúť na kontext OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Vyžaduje sa verzia OpenGL 3.0 alebo vyššia. Aktuálna verzia je %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Inicializácia OpenGL zlyhala. Chyba %1."
-
msgid "Error initializing OpenGL"
msgstr "Chyba pri inicializácii OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Návrat k softvérovému vykresľovaniu.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Alokácia pamäte pre rozbaľovaciu vyrovnávaciu pamäť zlyhala.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nNávrat k softvérovému vykresľovaniu."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Pri výbere multimediálnych obrazov (CD-ROM, disketa atď.) sa dialógové okno otvorenia spustí v rovnakom adresári ako konfiguračný súbor 86Box. Toto nastavenie bude mať pravdepodobne význam len v systéme MacOS.</p></body></html>"
@@ -1434,9 +1381,6 @@ msgstr "Priechod sériového portu 3"
msgid "Serial port passthrough 4"
msgstr "Priechod cez sériový port 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Možnosti vykresľovača..."
@@ -2103,8 +2047,8 @@ msgstr "Pomenované potrubie (server)"
msgid "Host Serial Passthrough"
msgstr "Priechod sériového portu hostiteľa"
-msgid "Eject %s"
-msgstr "Vystrihnúť %s"
+msgid "E&ject %1"
+msgstr "&Vystrihnúť %1"
msgid "&Unmute"
msgstr "&Roztíšiť"
@@ -2115,8 +2059,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Vysoký vplyv na výkon"
-msgid "RAM Disk (max. speed)"
-msgstr "Disk RAM (max. rýchlosť)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Disk RAM (max. rýchlosť)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Klon IBM 8514/A (ISA)"
@@ -2135,3 +2100,63 @@ msgstr "Nastala chyba pri hľadaní ihličkových písem"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Písma TrueType v adresári \"roms/printer/fonts\" sú potrebné na emuláciu generickej ihličkovej tlačiarne ESC/P."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po
index 1394a3635..c34fb6f7e 100644
--- a/src/qt/languages/sl-SI.po
+++ b/src/qt/languages/sl-SI.po
@@ -18,8 +18,8 @@ msgstr "&Desni CTRL je levi ALT"
msgid "&Hard Reset..."
msgstr "&Ponovni zagon..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Linearna"
msgid "Hi&DPI scaling"
msgstr "&Raztezanje za visok DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Celozaslonski način\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Celozaslonski način"
msgid "Fullscreen &stretch mode"
msgstr "&Način celozaslonskega raztezanja"
@@ -186,8 +186,11 @@ msgstr "&Nastavitve..."
msgid "&Update status bar icons"
msgstr "&Posodabljaj ikone statusne vrstice"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "&Zajemi posnetek zaslona\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "&Zajemi posnetek zaslona"
+
+msgid "S&ound"
+msgstr "Z&vok"
msgid "&Preferences..."
msgstr "&Možnosti..."
@@ -198,11 +201,11 @@ msgstr "Omogoči integracijo s programom &Discord"
msgid "Sound &gain..."
msgstr "&Ojačanje zvoka..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Z&ačni sledenje\tCtrl+T"
+msgid "Begin trace"
+msgstr "Z&ačni sledenje"
-msgid "End trace\tCtrl+T"
-msgstr "&Končaj sledenje\tCtrl+T"
+msgid "End trace"
+msgstr "&Končaj sledenje"
msgid "&Help"
msgstr "&Pomoč"
@@ -249,8 +252,8 @@ msgstr "&Utišaj"
msgid "E&mpty"
msgstr "&Prazen"
-msgid "&Reload previous image"
-msgstr "&Naloži zadnjo sliko"
+msgid "Reload previous image"
+msgstr "Naloži zadnjo sliko"
msgid "&Folder..."
msgstr "&Mapa..."
@@ -306,18 +309,12 @@ msgstr "V redu"
msgid "Cancel"
msgstr "Prekliči"
-msgid "Save these settings as &global defaults"
-msgstr "Shrani te nastavitve kot globalne privzete"
-
msgid "&Default"
msgstr "Privzeto"
msgid "Language:"
msgstr "Jezik:"
-msgid "Icon set:"
-msgstr "Komplet ikon:"
-
msgid "Gain"
msgstr "Ojačanje"
@@ -648,8 +645,8 @@ msgstr "Pritisnite Ctrl+Alt+PgDn za povratek iz celozaslonskega načina."
msgid "Speed"
msgstr "Hitrost"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP slike"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Ne morem inicializirati sistema za upodabljanje."
-
msgid "Default"
msgstr "Privzeto"
-msgid "%i Wait state(s)"
-msgstr "%i stanj čakanja"
+msgid "%1 Wait state(s)"
+msgstr "%1 stanj čakanja"
msgid "Type"
msgstr "Vrsta"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Brez"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disketa %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disketa %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Napredne sektorske slike"
@@ -828,8 +822,8 @@ msgstr "Ghostscript-a ni bilo mogoče inicializirati"
msgid "Unable to initialize GhostPCL"
msgstr "GhostPCL-ja ni bilo mogoče inicializirati"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Slike MO"
@@ -903,11 +897,8 @@ msgstr "Konfiguracija naprave %1"
msgid "Monitor in sleep mode"
msgstr "Zaslon v načinu spanja"
-msgid "OpenGL Shaders"
-msgstr "Senčilniki OpenGL"
-
-msgid "OpenGL options"
-msgstr "Možnosti OpenGL"
+msgid "GLSL shaders"
+msgstr "Senčilniki GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Nalagate nepodprto konfiguracijo"
@@ -918,24 +909,18 @@ msgstr "Filtriranje vrste procesorja glede na izbran sistem je onemogočeno za t
msgid "Continue"
msgstr "Nadaljuj"
-msgid "Cassette: %s"
-msgstr "Kaseta: %s"
+msgid "Cassette: %1"
+msgstr "Kaseta: %1"
msgid "Cassette images"
msgstr "Slike kaset"
-msgid "Cartridge %i: %ls"
-msgstr "Spominski vložek %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Spominski vložek %1: %2"
msgid "Cartridge images"
msgstr "Slike spominskega vložka"
-msgid "Error initializing renderer"
-msgstr "Napaka pri zagonu sistema za upodabljanje"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Sistema za upodabljanje OpenGL (3.0 Core) ni bilo mogoče zagnati. Uporabite drug sistem za upodabljanje."
-
msgid "Resume execution"
msgstr "Nadaljuj izvajanje"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "Jasna zgodovina slik"
msgid "Create..."
msgstr "Ustvari..."
-msgid "previous image"
-msgstr "zadnja slika"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Pogon CD/DVD gostitelja (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Neznano vodilo"
msgid "Null Driver"
msgstr "Ničelni gonilnik"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Napaka pri odpiranju \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Napaka pri sestavljanju senčilnika vrhov v datoteki \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Napaka pri sestavljanju shaderja fragmentov v datoteki \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Napaka pri povezovanju programa shader v datoteki \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Možnosti sistema za upodabljanje OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Obnašanje pri upodabljanju"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Vsako sličico prikažite takoj, sinhronizirano z emuliranim zaslonom.</p><p><span style=" font-style:italic;">To je priporočljiva možnost, če uporabljeni senčilniki ne uporabljajo časa okvirja za animirane učinke.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Sinhroniziraj z videom"
@@ -1332,21 +1296,9 @@ msgstr "Senčilniki"
msgid "Remove"
msgstr "Odstrani"
-msgid "No shader selected"
-msgstr "Ni izbran noben senčnik"
-
msgid "Browse..."
msgstr "Brskaj..."
-msgid "Shader error"
-msgstr "Napaka senčilnika"
-
-msgid "Could not load shaders."
-msgstr "Ni bilo mogoče naložiti senčilnikov."
-
-msgid "More information in details."
-msgstr "Več informacij v podrobnostih."
-
msgid "Couldn't create OpenGL context."
msgstr "Ni bilo mogoče ustvariti konteksta OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Ni bilo mogoče preklopiti na kontekst OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Zahteva se različica OpenGL 3.0 ali novejša. Trenutna različica je %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Inicializacija OpenGL ni uspela. Napaka %1."
-
msgid "Error initializing OpenGL"
msgstr "Napaka pri inicializaciji OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Vrnitev k programskemu upodabljanju.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Dodelitev pomnilnika za razpakirni predpomnilnik ni uspela.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nVrnitev k programskemu upodabljanju."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Pri izbiri medijskih slik (CD-ROM, disketa itd.) se bo odprto pogovorno okno začelo v istem imeniku kot konfiguracijska datoteka 86Box. Ta nastavitev bo verjetno imela pomen le v operacijskem sistemu MacOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Prepust za serijska vrata 3"
msgid "Serial port passthrough 4"
msgstr "Prepust za serijska vrata 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Možnosti sistema za upodabljanje..."
@@ -2103,8 +2046,8 @@ msgstr "Poimenovana cev (Strežnik)"
msgid "Host Serial Passthrough"
msgstr "Prepustno serijskih vrat gostitelja"
-msgid "Eject %s"
-msgstr "Izvrzi %s"
+msgid "E&ject %1"
+msgstr "I&zvrzi %1"
msgid "&Unmute"
msgstr "&Vklopi zvok"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Visok učinek na hitrost delovanja"
-msgid "RAM Disk (max. speed)"
-msgstr "Pogon RAM (največja hitrost)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Pogon RAM (največja hitrost)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Klon IBM 8514/A (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Matričnih pisav ni bilo mogoče najti"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Matrične pisave v imeniku \"roms/printer/fonts\" so potrebne za emulacijo generičnega matričnega tiskalnika ESC/P."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po
index 81866b3ce..b7a59b620 100644
--- a/src/qt/languages/tr-TR.po
+++ b/src/qt/languages/tr-TR.po
@@ -18,8 +18,8 @@ msgstr "&Sağ CTRL tuşunu sol ALT tuşu olarak ayarla"
msgid "&Hard Reset..."
msgstr "Yeniden başlamaya &zorla"
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+&Alt+Esc"
@@ -111,8 +111,8 @@ msgstr "Doğ&rusal"
msgid "Hi&DPI scaling"
msgstr "HiDPI ölçekle&mesi"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "Tam ekran\tCtrl+Alt+Pg&Up"
+msgid "&Fullscreen"
+msgstr "Tam ekran"
msgid "Fullscreen &stretch mode"
msgstr "Tam e&kran germe modu"
@@ -186,8 +186,8 @@ msgstr "&Ayarlar..."
msgid "&Update status bar icons"
msgstr "Durum &çubuğu simgelerini güncelle"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "&Ekran görüntüsü al\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "&Ekran görüntüsü al"
msgid "&Preferences..."
msgstr "&Tercihler..."
@@ -195,14 +195,17 @@ msgstr "&Tercihler..."
msgid "Enable &Discord integration"
msgstr "&Discord entegrasyonunu etkinleştir"
+msgid "S&ound"
+msgstr "&Ses"
+
msgid "Sound &gain..."
msgstr "&Ses düzeyi artışı..."
-msgid "Begin trace\tCtrl+T"
-msgstr "İzlemeyi başlat\tCtrl+T"
+msgid "Begin trace"
+msgstr "İzlemeyi başlat"
-msgid "End trace\tCtrl+T"
-msgstr "İzlemeyi bitir\tCtrl+T"
+msgid "End trace"
+msgstr "İzlemeyi bitir"
msgid "&Help"
msgstr "&Yardım"
@@ -249,8 +252,8 @@ msgstr "&Sesi kapat"
msgid "E&mpty"
msgstr "İmajı &çıkar"
-msgid "&Reload previous image"
-msgstr "&Önceki imajı yeniden seç"
+msgid "Reload previous image"
+msgstr "Önceki imajı yeniden seç"
msgid "&Folder..."
msgstr "&Klasör..."
@@ -306,18 +309,12 @@ msgstr "Tamam"
msgid "Cancel"
msgstr "İptal"
-msgid "Save these settings as &global defaults"
-msgstr "Ayarları &varsayılan olarak kaydet"
-
msgid "&Default"
msgstr "&Varsayılan"
msgid "Language:"
msgstr "Dil:"
-msgid "Icon set:"
-msgstr "Simge seti:"
-
msgid "Gain"
msgstr "Artış"
@@ -648,8 +645,8 @@ msgstr "Pencere moduna geri dönmek için Ctrl+Alt+PgDn tuşlarına basın."
msgid "Speed"
msgstr "Hız"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP imajları"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Video işleyici başlatılamadı."
-
msgid "Default"
msgstr "Varsayılan"
-msgid "%i Wait state(s)"
-msgstr "%i Bekleme durumları"
+msgid "%1 Wait state(s)"
+msgstr "%1 Bekleme durumları"
msgid "Type"
msgstr "Tür"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Hiçbiri"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Disket %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Disket %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Gelişmiş sektör imajları"
@@ -828,8 +822,8 @@ msgstr "Ghostscript başlatılamadı"
msgid "Unable to initialize GhostPCL"
msgstr "GhostPCL başlatılamadı"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "MO imajları"
@@ -903,11 +897,8 @@ msgstr "%1 cihaz konfigürasyonu"
msgid "Monitor in sleep mode"
msgstr "Monitör uyku modunda"
-msgid "OpenGL Shaders"
-msgstr "OpenGL gölgelendiricileri"
-
-msgid "OpenGL options"
-msgstr "OpenGL ayarları"
+msgid "GLSL shaders"
+msgstr "GLSL gölgelendiricileri"
msgid "You are loading an unsupported configuration"
msgstr "Desteklenmeyen bir konfigürasyon kullanıyorsunuz"
@@ -918,24 +909,18 @@ msgstr "Seçtiğiniz makineye uygun işlemci türü filtrelemesi bu emüle edile
msgid "Continue"
msgstr "Devam et"
-msgid "Cassette: %s"
-msgstr "Kaset: %s"
+msgid "Cassette: %1"
+msgstr "Kaset: %1"
msgid "Cassette images"
msgstr "Kaset imajları"
-msgid "Cartridge %i: %ls"
-msgstr "Kartuş %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Kartuş %1: %2"
msgid "Cartridge images"
msgstr "Kartuş imajları"
-msgid "Error initializing renderer"
-msgstr "İşleyici başlatılırken hata oluştu"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "OpenGL (3.0 Core) işleyici başlatılamadı. Başka bir görüntüleyici kullanın."
-
msgid "Resume execution"
msgstr "Çalıştırmaya devam et"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "İmaj geçmişini temizleyin"
msgid "Create..."
msgstr "Oluştur..."
-msgid "previous image"
-msgstr "önceki imaj"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Ana bilgisayar CD/DVD sürücüsü (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Bilinmeyen veri yolu"
msgid "Null Driver"
msgstr "Null sürücü"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "\"%1\": %2 açılırken hata oluştu"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "\"%1\" dosyasında tepe gölgelendirici derlenirken hata oluştu"
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "\"%1\" dosyasında parça gölgelendirici derlenirken hata oluştu"
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "\"%1\" dosyasında gölgelendirici programı bağlanırken hata oluştu"
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0 işleyici seçenekleri"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "İşleyiş davranışı"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Emüle edilen ekranla senkronize olarak her kareyi hemen işleyin.</p><p><span style=" font-style:italic;">Kullanılan gölgelendiriciler animasyonlu efektler için kare zamanını kullanmıyorsa bu önerilen seçenektir.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Video ile senkronize et"
@@ -1332,21 +1296,9 @@ msgstr "Gölgelendiriciler"
msgid "Remove"
msgstr "Kaldır"
-msgid "No shader selected"
-msgstr "Gölgelendirici seçili değil"
-
msgid "Browse..."
msgstr "Göz at..."
-msgid "Shader error"
-msgstr "Gölgelendirici hatası"
-
-msgid "Could not load shaders."
-msgstr "Gölgelendiriciler yüklenemedi."
-
-msgid "More information in details."
-msgstr "Daha fazla bilgi detaylardadır."
-
msgid "Couldn't create OpenGL context."
msgstr "OpenGL bağlamı oluşturulamadı."
@@ -1356,17 +1308,11 @@ msgstr "OpenGL bağlamına geçilemedi."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "OpenGL sürüm 3.0 veya üstü gereklidir. Geçerli sürüm %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL başlatılamadı. Hata %1."
-
msgid "Error initializing OpenGL"
msgstr "OpenGL başlatılırken hata oluştu"
-msgid "Falling back to software rendering.\n"
-msgstr "Yazılım işleyicisine geri dönülüyor.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Paket açma arabelleği için bellek ayırma başarısız oldu.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nYazılım işleyicisine geri dönülüyor."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Medya görüntüsü (CD-ROM, disket, vb.) seçme diyaloğu 86Box yapılandırma dosyasıyla aynı dizinde başlayacaktır. Bu ayar muhtemelen sadece macOS üzerinde bir fark meydana getirecektir.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Seri port geçişi 3"
msgid "Serial port passthrough 4"
msgstr "Seri port geçişi 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "İşleyici seçenekleri..."
@@ -2103,8 +2046,8 @@ msgstr "Adlandırılmış boru (Sunucu)"
msgid "Host Serial Passthrough"
msgstr "Ana bilgisayar seri port geçişi"
-msgid "Eject %s"
-msgstr "%s diskini çıkar"
+msgid "E&ject %1"
+msgstr "%1 diskini &çıkar"
msgid "&Unmute"
msgstr "&Sesi aç"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Ciddi performans düşüklüğüne neden olabilir"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM Disk (maks. hız)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM Disk (maks. hız)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A klonu (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Dot Matrix yazı tipleri bulunamıyor"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Sıradan ESC/P Dot Matrix Yazıcının emülasyonu için \"roms/printer/fonts\" dizinindeki TrueType yazı tipleri gereklidir."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po
index 9b57ac03e..3145f5e34 100644
--- a/src/qt/languages/uk-UA.po
+++ b/src/qt/languages/uk-UA.po
@@ -18,8 +18,8 @@ msgstr "&Правий CTRL - це лівий ALT"
msgid "&Hard Reset..."
msgstr "&Холодне перезавантаження..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "&Лінійний"
msgid "Hi&DPI scaling"
msgstr "Масштабування Hi&DPI"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "&Повноекранний режим\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "&Повноекранний режим"
msgid "Fullscreen &stretch mode"
msgstr "&Розстягування у повноекранному режимі"
@@ -186,8 +186,11 @@ msgstr "&Налаштування машини..."
msgid "&Update status bar icons"
msgstr "&Обновлення значків рядка стану"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Зробити &знімок\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Зробити &знімок"
+
+msgid "S&ound"
+msgstr "&Звук"
msgid "&Preferences..."
msgstr "&Параметри..."
@@ -198,11 +201,11 @@ msgstr "Увімкнути інтеграцію &Discord"
msgid "Sound &gain..."
msgstr "&Посилення звуку..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Почати трасування\tCtrl+T"
+msgid "Begin trace"
+msgstr "Почати трасування"
-msgid "End trace\tCtrl+T"
-msgstr "Завершити трасування\tCtrl+T"
+msgid "End trace"
+msgstr "Завершити трасування"
msgid "&Help"
msgstr "&Допомога"
@@ -249,8 +252,8 @@ msgstr "&Відключити звук"
msgid "E&mpty"
msgstr "&Пустий"
-msgid "&Reload previous image"
-msgstr "&Знову завантажити попередній образ"
+msgid "Reload previous image"
+msgstr "Знову завантажити попередній образ"
msgid "&Folder..."
msgstr "&Тека..."
@@ -306,18 +309,12 @@ msgstr "OK"
msgid "Cancel"
msgstr "Відміна"
-msgid "Save these settings as &global defaults"
-msgstr "Зберегти ці параметри як &глобальні за замовчуванням"
-
msgid "&Default"
msgstr "&За замовчуванням"
msgid "Language:"
msgstr "Мова:"
-msgid "Icon set:"
-msgstr "Набір іконок:"
-
msgid "Gain"
msgstr "Посилення"
@@ -648,8 +645,8 @@ msgstr "Натисніть Ctrl+Alt+PgDn для повернення у віко
msgid "Speed"
msgstr "Швидкість"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Образи ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "КБ"
-msgid "Could not initialize the video renderer."
-msgstr "Не вдалося ініціалізувати рендер відео."
-
msgid "Default"
msgstr "За замовчуванням"
-msgid "%i Wait state(s)"
-msgstr "%i WS"
+msgid "%1 Wait state(s)"
+msgstr "%1 WS"
msgid "Type"
msgstr "Тип"
@@ -804,11 +798,11 @@ msgstr "Система управління польотом Thrustmaster"
msgid "None"
msgstr "Ні"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u МБ (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 МБ (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Дисковод %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Дисковод %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Розширені образи секторів"
@@ -828,8 +822,8 @@ msgstr "Неможливо ініціалізувати Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Неможливо ініціалізувати GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "Магнітооптичний %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "Магнітооптичний %1 (%2): %3"
msgid "MO images"
msgstr "Образи магнітооптичних дисків"
@@ -903,11 +897,8 @@ msgstr "Конфігурація пристрою %1"
msgid "Monitor in sleep mode"
msgstr "Монітор у сплячому режимі"
-msgid "OpenGL Shaders"
-msgstr "Шейдери OpenGL"
-
-msgid "OpenGL options"
-msgstr "Параметри OpenGL"
+msgid "GLSL shaders"
+msgstr "Шейдери GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Ви завантажуєте непідтримувану конфігурацію"
@@ -918,24 +909,18 @@ msgstr "Вибір типів ЦП для цієї системної плати
msgid "Continue"
msgstr "Продовжити"
-msgid "Cassette: %s"
-msgstr "Касета: %s"
+msgid "Cassette: %1"
+msgstr "Касета: %1"
msgid "Cassette images"
msgstr "Образи касет"
-msgid "Cartridge %i: %ls"
-msgstr "Картридж %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Картридж %1: %2"
msgid "Cartridge images"
msgstr "Образи картриджів"
-msgid "Error initializing renderer"
-msgstr "Помилка ініціалізації рендерера"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Неможливо ініціалізувати рендерер OpenGL (3.0). Будь ласка, використовуйте інший рендерер."
-
msgid "Resume execution"
msgstr "Відновити виконання"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 КБ"
@@ -1278,9 +1263,6 @@ msgstr "Очистити історію образів"
msgid "Create..."
msgstr "Створити..."
-msgid "previous image"
-msgstr "попередній образ"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "CD/DVD привід хоста (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Невідома шина"
msgid "Null Driver"
msgstr "Нульовий драйвер"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Помилка відкриття \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Помилка компіляції вершинного шейдера у файлі \"%1\"."
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Помилка компіляції фрагментного шейдера у файлі \"%1\"."
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Помилка зв'язування шейдерної програми у файлі \"%1\"."
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Параметри рендерингу OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Поведінка рендерингу"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Відображати кожен кадр миттєво, синхронно з емульованим дисплеєм.</p><p><span style=" font-style:italic;">Це рекомендований варіант, якщо використовувані шейдери не використовують час кадру для анімованих ефектів.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Синхронізація з відео"
@@ -1332,21 +1296,9 @@ msgstr "Шейдери"
msgid "Remove"
msgstr "Видалити"
-msgid "No shader selected"
-msgstr "Не вибрано шейдер"
-
msgid "Browse..."
msgstr "Переглянути..."
-msgid "Shader error"
-msgstr "Помилка шейдеру"
-
-msgid "Could not load shaders."
-msgstr "Не вдалося завантажити шейдери."
-
-msgid "More information in details."
-msgstr "Більше інформації в деталях."
-
msgid "Couldn't create OpenGL context."
msgstr "Не вдалося створити контекст OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Не вдалося переключитися на контекст Ope
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "Потрібна версія OpenGL 3.0 або новіша. Поточна версія %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Не вдалося ініціалізувати OpenGL. Помилка %1."
-
msgid "Error initializing OpenGL"
msgstr "Помилка ініціалізації OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Повернення до програмного рендерингу.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Не вдалося виділити пам'ять для буфера розпакування.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nПовернення до програмного рендерингу."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>При виборі медіа-образів (CD-ROM, дискета і т.д.) діалогове вікно буде відкриватися в тому ж каталозі, що і файл конфігурації 86Box. Цей параметр, швидше за все, матиме значення лише на macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Пропуск послідовного порту 3"
msgid "Serial port passthrough 4"
msgstr "Пропуск послідовного порту 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Параметри рендерингу..."
@@ -2103,8 +2046,8 @@ msgstr "Іменований пайп (сервер)"
msgid "Host Serial Passthrough"
msgstr "Пропуск послідовного порту хоста"
-msgid "Eject %s"
-msgstr "Вилучити %s"
+msgid "E&ject %1"
+msgstr "&Вилучити %1"
msgid "&Unmute"
msgstr "&Увімкнути звук"
@@ -2115,8 +2058,29 @@ msgstr "FPU Softfloat"
msgid "High performance impact"
msgstr "Високий вплив на продуктивність"
-msgid "RAM Disk (max. speed)"
-msgstr "Диск оперативної пам'яті (макс. швидкість)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Диск оперативної пам'яті (макс. швидкість)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "Клон IBM 8514/A (ISA)"
@@ -2141,3 +2105,63 @@ msgstr "Неможливо знайти матричні шрифти"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Шрифти TrueType у каталозі \"roms/printer/fonts\" потрібні для емуляції загального матричного принтера Generic ESC/P."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po
index abf9a1dea..932150f7b 100644
--- a/src/qt/languages/vi-VN.po
+++ b/src/qt/languages/vi-VN.po
@@ -18,8 +18,8 @@ msgstr "Gắn ALT trái vào CTRL ph&ải"
msgid "&Hard Reset..."
msgstr "Buộc khởi độn&g lại"
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "&Ctrl+Alt+Del\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Del"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -111,8 +111,8 @@ msgstr "Tu&yến tính"
msgid "Hi&DPI scaling"
msgstr "Tỷ lệ hinh ảnh phân giải cao"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "Toàn màn &hình\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "Toàn màn &hình"
msgid "Fullscreen &stretch mode"
msgstr "&Chế độ kéo giãn hình"
@@ -186,8 +186,11 @@ msgstr "&Cài đặt..."
msgid "&Update status bar icons"
msgstr "Cậ&p nhật biểu tượng thanh trạng thái"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "Chụp &màn hình\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "Chụp &màn hình"
+
+msgid "S&ound"
+msgstr "&Thanh âm"
msgid "&Preferences..."
msgstr "&Tùy biến..."
@@ -198,11 +201,11 @@ msgstr "Bật trình trạng thái cho Discord"
msgid "Sound &gain..."
msgstr "Bộ &tăng âm..."
-msgid "Begin trace\tCtrl+T"
-msgstr "Bắt đầu dò\tCtrl+T"
+msgid "Begin trace"
+msgstr "Bắt đầu dò"
-msgid "End trace\tCtrl+T"
-msgstr "Ngưng dò\tCtrl+T"
+msgid "End trace"
+msgstr "Ngưng dò"
msgid "&Help"
msgstr "&Trợ giúp"
@@ -249,8 +252,8 @@ msgstr "Tắt tiến&g"
msgid "E&mpty"
msgstr "Làm trố&ng đĩa"
-msgid "&Reload previous image"
-msgstr "Load đĩ&a trước đó"
+msgid "Reload previous image"
+msgstr "Load đĩa trước đó"
msgid "&Folder..."
msgstr "Thư mụ&c"
@@ -306,18 +309,12 @@ msgstr "Đồng ý"
msgid "Cancel"
msgstr "Thôi"
-msgid "Save these settings as &global defaults"
-msgstr "Lưu cài đặt làm mặc định chung"
-
msgid "&Default"
msgstr "&Mặc định"
msgid "Language:"
msgstr "Ngôn ngữ:"
-msgid "Icon set:"
-msgstr "Bộ biểu tượng:"
-
msgid "Gain"
msgstr "Tăng"
@@ -648,8 +645,8 @@ msgstr "Bấm Ctrl+Alt+PgDn để quay lại chế độ cửa sổ."
msgid "Speed"
msgstr "Vận tốc"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "Ảnh đĩa ZIP"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "Không thể khởi tạo trình kết xuất (renderer) video ."
-
msgid "Default"
msgstr "Mặc định"
-msgid "%i Wait state(s)"
-msgstr "%i trạng thái chờ"
+msgid "%1 Wait state(s)"
+msgstr "%1 trạng thái chờ"
msgid "Type"
msgstr "Loại"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "Không có"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "Đĩa mềm %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "Đĩa mềm %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Ảnh (đĩa) sector nâng cao"
@@ -828,8 +822,8 @@ msgstr "Không thể khởi tạo Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "Không thể khởi tạo GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "MO %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "MO %1 (%2): %3"
msgid "MO images"
msgstr "Ảnh đĩa MO"
@@ -903,11 +897,8 @@ msgstr "Tinh chỉnh thiết bị %1"
msgid "Monitor in sleep mode"
msgstr "Màn hình chế độ chờ/ngủ"
-msgid "OpenGL Shaders"
-msgstr "Shader OpenGL"
-
-msgid "OpenGL options"
-msgstr "Tùy chọn OpenGL"
+msgid "GLSL shaders"
+msgstr "Shader GLSL"
msgid "You are loading an unsupported configuration"
msgstr "Bạn đang load tinh chỉnh không được hỗ trợ."
@@ -918,24 +909,18 @@ msgstr "Phần chọn loại CPU dựa trên mẫu máy đã chọn bị vô hi
msgid "Continue"
msgstr "Tiếp tục"
-msgid "Cassette: %s"
-msgstr "Cassette: %s"
+msgid "Cassette: %1"
+msgstr "Cassette: %1"
msgid "Cassette images"
msgstr "Ảnh đĩa Cassette"
-msgid "Cartridge %i: %ls"
-msgstr "Băng cartridge %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "Băng cartridge %1: %2"
msgid "Cartridge images"
msgstr "Ảnh đĩa băng cartridge"
-msgid "Error initializing renderer"
-msgstr "Lỗi khởi tạo renderer (trình kết xuất)"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "Không khởi tạo được renderer OpenGL (3.0 Core). Hãy dùng renderer khác."
-
msgid "Resume execution"
msgstr "Tiếp tục chạy thực thi"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "CD-ROM %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "CD-ROM %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "Xóa lịch sử ảnh đĩa"
msgid "Create..."
msgstr "Tạo..."
-msgid "previous image"
-msgstr "đĩa trước đó"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "Máy chủ CD/DVD Drive (%1)"
@@ -1290,23 +1272,8 @@ msgstr "Bus không xác định"
msgid "Null Driver"
msgstr "Trình điều khiển NULL"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i ( %ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "Mở lỗi \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "Lỗi biên dịch shader đỉnh trong tệp \"%1\""
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "Lỗi biên dịch shader fragment trong tệp \"%1\""
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "Lỗi liên kết chương trình shader trong tệp \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "Tùy chọn kết xuất OpenGL 3.0"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Hành vi kết xuất"
@@ -1320,9 +1287,6 @@ msgstr " khung hình / giây"
msgid "VSync"
msgstr "Vsync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>Kết xuất mỗi khung ngay lập tức, đồng bộ với màn hình mô phỏng.</p><p><span style=" font-style:italic;">Đây là tùy chọn được đề xuất nếu các shader đang sử dụng không tối ưu frametime cho các hiệu ứng động.</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "Đồng bộ với video"
@@ -1332,21 +1296,9 @@ msgstr "Shaders"
msgid "Remove"
msgstr "Loại bỏ"
-msgid "No shader selected"
-msgstr "Không có shader được chọn"
-
msgid "Browse..."
msgstr "Duyệt..."
-msgid "Shader error"
-msgstr "Lỗi shader"
-
-msgid "Could not load shaders."
-msgstr "Không thể tải shader."
-
-msgid "More information in details."
-msgstr "Thêm thông tin chi tiết."
-
msgid "Couldn't create OpenGL context."
msgstr "Không thể tạo bối cảnh OpenGL."
@@ -1356,17 +1308,11 @@ msgstr "Không thể chuyển sang bối cảnh OpenGL."
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "OpenGL phiên bản 3.0 trở lên là bắt buộc. Phiên bản hiện tại là %1. %2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "Khởi tạo OpenGL không thành công. Lỗi %1."
-
msgid "Error initializing OpenGL"
msgstr "Lỗi khởi tạo OpenGL"
-msgid "Falling back to software rendering.\n"
-msgstr "Quay trở lại kết xuất phần mềm.\n"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "Phân bổ bộ nhớ cho bộ đệm giải nén không thành công.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\nQuay trở lại kết xuất phần mềm."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Khi chọn hình ảnh phương tiện (CD-ROM, ổ mềm, v.v.), hộp thoại mở sẽ bắt đầu trong cùng thư mục với tệp cấu hình 86box. Cài đặt này có thể sẽ chỉ tạo ra sự khác biệt trên macOS.</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "Thông qua cổng serial 3"
msgid "Serial port passthrough 4"
msgstr "Thông qua cổng serial 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "Tùy chọn kết xuất ..."
@@ -2103,8 +2046,8 @@ msgstr "Đường ống có tên (máy chủ)"
msgid "Host Serial Passthrough"
msgstr "Thông qua cổng serial của máy chủ"
-msgid "Eject %s"
-msgstr "Đẩy đĩa ra %s"
+msgid "E&ject %1"
+msgstr "Đẩy đĩ&a ra %1"
msgid "&Unmute"
msgstr "&Mở tiếng"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "Ảnh hưởng lớn đến hiệu suất"
-msgid "RAM Disk (max. speed)"
-msgstr "Đĩa RAM (tốc độ tối đa)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] Đĩa RAM (tốc độ tối đa)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A bản nhái (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "Không tìm thấy phông chữ ma trận chấm"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Cần có phông chữ TrueType trong thư mục \"roms/printer/fonts\" để mô phỏng máy in generic ESC/P ma trận chấm."
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po
index ec5d2c252..18f5a8fb8 100644
--- a/src/qt/languages/zh-CN.po
+++ b/src/qt/languages/zh-CN.po
@@ -18,8 +18,8 @@ msgstr "将右 CTRL 键映射为左 ALT 键(&R)"
msgid "&Hard Reset..."
msgstr "硬重置(&H)..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "Ctrl+Alt+Del(&C)"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+Esc(&E)"
@@ -111,8 +111,8 @@ msgstr "线性(&L)"
msgid "Hi&DPI scaling"
msgstr "HiDPI 缩放(&D)"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "全屏(&F)\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "全屏(&F)"
msgid "Fullscreen &stretch mode"
msgstr "全屏拉伸模式(&S)"
@@ -186,8 +186,11 @@ msgstr "设置(&S)..."
msgid "&Update status bar icons"
msgstr "更新状态栏图标(&U)"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "截图(&C)\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "截图(&C)"
+
+msgid "S&ound"
+msgstr "声音(&O)"
msgid "&Preferences..."
msgstr "首选项(&P)..."
@@ -198,11 +201,11 @@ msgstr "启用 Discord 集成(&D)"
msgid "Sound &gain..."
msgstr "音量增益(&G)..."
-msgid "Begin trace\tCtrl+T"
-msgstr "开始追踪\tCtrl+T"
+msgid "Begin trace"
+msgstr "开始追踪"
-msgid "End trace\tCtrl+T"
-msgstr "结束追踪\tCtrl+T"
+msgid "End trace"
+msgstr "结束追踪"
msgid "&Help"
msgstr "帮助(&H)"
@@ -249,8 +252,8 @@ msgstr "静音(&M)"
msgid "E&mpty"
msgstr "空置驱动器(&M)"
-msgid "&Reload previous image"
-msgstr "载入上一个映像(&R)"
+msgid "Reload previous image"
+msgstr "载入上一个映像"
msgid "&Folder..."
msgstr "文件夹(&F)..."
@@ -306,18 +309,12 @@ msgstr "确定"
msgid "Cancel"
msgstr "取消"
-msgid "Save these settings as &global defaults"
-msgstr "将以上设置存储为全局默认值(&G)"
-
msgid "&Default"
msgstr "默认(&D)"
msgid "Language:"
msgstr "语言:"
-msgid "Icon set:"
-msgstr "图标集:"
-
msgid "Gain"
msgstr "增益"
@@ -648,8 +645,8 @@ msgstr "按下 Ctrl+Alt+PgDn 返回到窗口模式。"
msgid "Speed"
msgstr "速度"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP 映像"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "无法初始化视频渲染器。"
-
msgid "Default"
msgstr "默认"
-msgid "%i Wait state(s)"
-msgstr "%i 等待状态 (WS)"
+msgid "%1 Wait state(s)"
+msgstr "%1 等待状态 (WS)"
msgid "Type"
msgstr "类型"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "无"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "软盘 %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "软盘 %1 (%2): %3"
msgid "Advanced sector images"
msgstr "高级扇区映像"
@@ -828,8 +822,8 @@ msgstr "无法初始化 Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "无法初始化 GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "磁光盘 %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "磁光盘 %1 (%2): %3"
msgid "MO images"
msgstr "磁光盘映像"
@@ -903,11 +897,8 @@ msgstr "%1 设备配置"
msgid "Monitor in sleep mode"
msgstr "显示器处在睡眠状态"
-msgid "OpenGL Shaders"
-msgstr "OpenGL 着色器"
-
-msgid "OpenGL options"
-msgstr "OpenGL 选项"
+msgid "GLSL shaders"
+msgstr "GLSL 着色器"
msgid "You are loading an unsupported configuration"
msgstr "正在载入一个不受支持的配置"
@@ -918,24 +909,18 @@ msgstr "此模拟计算机禁用了基于选定计算机的 CPU 类型过滤。\
msgid "Continue"
msgstr "继续"
-msgid "Cassette: %s"
-msgstr "磁带: %s"
+msgid "Cassette: %1"
+msgstr "磁带: %1"
msgid "Cassette images"
msgstr "磁带映像"
-msgid "Cartridge %i: %ls"
-msgstr "卡带 %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "卡带 %1: %2"
msgid "Cartridge images"
msgstr "卡带映像"
-msgid "Error initializing renderer"
-msgstr "初始化渲染器时出错"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "无法初始化 OpenGL (3.0 Core) 渲染器。请使用其他渲染器。"
-
msgid "Resume execution"
msgstr "恢复执行"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "光盘 %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "光盘 %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1270,7 +1255,7 @@ msgid "Host CD/DVD Drive (%1:)"
msgstr "主机 CD/DVD 驱动器 (%1:)"
msgid "&Connected"
-msgstr "&Connected"
+msgstr ""
msgid "Clear image history"
msgstr "清除映像历史记录"
@@ -1278,9 +1263,6 @@ msgstr "清除映像历史记录"
msgid "Create..."
msgstr "创建..."
-msgid "previous image"
-msgstr "上一张"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "主机 CD/DVD 驱动器 (%1)"
@@ -1290,23 +1272,8 @@ msgstr "未知总线"
msgid "Null Driver"
msgstr "空驱动程序"
-msgid "NIC %02i (%ls) %ls"
-msgstr "NIC %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "打开 \"%1\": %2 时出错"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "文件 \"%1\" 中的顶点着色器编译出错"
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "文件 \"%1\" 中的片段着色器编译出错"
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "文件 \"%1\" 中的着色器程序链接出错"
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0 渲染器选项"
+msgid "NIC %1 (%2) %3"
+msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "渲染行为"
@@ -1320,9 +1287,6 @@ msgstr " fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>与模拟显示同步,即时渲染每一帧。</p><p><span style=" font-style:italic;">如果使用的着色器不使用帧时间来产生动画效果,则建议使用此选项。</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "与视频同步"
@@ -1332,21 +1296,9 @@ msgstr "着色器"
msgid "Remove"
msgstr "移除"
-msgid "No shader selected"
-msgstr "未选择着色器"
-
msgid "Browse..."
msgstr "浏览..."
-msgid "Shader error"
-msgstr "着色器错误"
-
-msgid "Could not load shaders."
-msgstr "无法加载着色器。"
-
-msgid "More information in details."
-msgstr "更多详细信息。"
-
msgid "Couldn't create OpenGL context."
msgstr "无法创建 OpenGL 上下文。"
@@ -1356,17 +1308,11 @@ msgstr "无法切换到 OpenGL 上下文。"
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "需要 OpenGL 3.0 或更高版本。当前版本为 %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL 初始化失败。错误 %1."
-
msgid "Error initializing OpenGL"
msgstr "初始化 OpenGL 时出错"
-msgid "Falling back to software rendering.\n"
-msgstr "回到软件渲染。"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "为解包缓冲区分配内存失败.\n"
+msgid "\nFalling back to software rendering."
+msgstr "\n回到软件渲染。"
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>选择媒体图像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。</p></body></html>;"
@@ -1434,9 +1380,6 @@ msgstr "串行端口直通 3"
msgid "Serial port passthrough 4"
msgstr "串行端口直通 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA 增强器"
-
msgid "Renderer options..."
msgstr "渲染器选项..."
@@ -2103,8 +2046,8 @@ msgstr "命名管道(服务器)"
msgid "Host Serial Passthrough"
msgstr "主机串行端口直通"
-msgid "Eject %s"
-msgstr "弹出 %s"
+msgid "E&ject %1"
+msgstr "弹出 %1(&J)"
msgid "&Unmute"
msgstr "解除静音(&U)"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "重大性能影响"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM 磁盘 (最大速度)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM 磁盘 (最大速度)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A 克隆 (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "无法找到点阵字体"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "仿真通用 ESC/P 点阵打印机需要使用 \"roms/printer/fonts\" 目录中的 TrueType 字体。"
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po
index b0d8163cb..9dbf51c70 100644
--- a/src/qt/languages/zh-TW.po
+++ b/src/qt/languages/zh-TW.po
@@ -18,8 +18,8 @@ msgstr "將右 CTRL 鍵映射為左 ALT 鍵(&R)"
msgid "&Hard Reset..."
msgstr "硬重設(&H)..."
-msgid "&Ctrl+Alt+Del\tCtrl+F12"
-msgstr "Ctrl+Alt+Del(&C)\tCtrl+F12"
+msgid "&Ctrl+Alt+Del"
+msgstr "Ctrl+Alt+Del(&C)"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+Esc(&E)"
@@ -111,8 +111,8 @@ msgstr "線性(&L)"
msgid "Hi&DPI scaling"
msgstr "HiDPI 縮放(&D)"
-msgid "&Fullscreen\tCtrl+Alt+PgUp"
-msgstr "全螢幕(&F)\tCtrl+Alt+PgUp"
+msgid "&Fullscreen"
+msgstr "全螢幕(&F)"
msgid "Fullscreen &stretch mode"
msgstr "全螢幕拉伸模式(&S)"
@@ -186,8 +186,11 @@ msgstr "設定(&S)..."
msgid "&Update status bar icons"
msgstr "更新狀態列圖示(&U)"
-msgid "Take s&creenshot\tCtrl+F11"
-msgstr "擷圖(&C)\tCtrl+F11"
+msgid "Take s&creenshot"
+msgstr "擷圖(&C)"
+
+msgid "S&ound"
+msgstr "聲音(&O)"
msgid "&Preferences..."
msgstr "偏好設定(&P)..."
@@ -198,11 +201,11 @@ msgstr "啟用 Discord 整合(&D)"
msgid "Sound &gain..."
msgstr "音量增益(&G)..."
-msgid "Begin trace\tCtrl+T"
-msgstr "開始追踪\tCtrl+T"
+msgid "Begin trace"
+msgstr "開始追踪"
-msgid "End trace\tCtrl+T"
-msgstr "結束追踪\tCtrl+T"
+msgid "End trace"
+msgstr "結束追踪"
msgid "&Help"
msgstr "說明(&H)"
@@ -249,8 +252,8 @@ msgstr "靜音(&M)"
msgid "E&mpty"
msgstr "空置光碟機(&M)"
-msgid "&Reload previous image"
-msgstr "載入上一個映像(&R)"
+msgid "Reload previous image"
+msgstr "載入上一個映像"
msgid "&Folder..."
msgstr "資料夾(&F)..."
@@ -306,18 +309,12 @@ msgstr "確定"
msgid "Cancel"
msgstr "取消"
-msgid "Save these settings as &global defaults"
-msgstr "將以上設定存儲為全局預設值(&G)"
-
msgid "&Default"
msgstr "預設(&D)"
msgid "Language:"
msgstr "語言:"
-msgid "Icon set:"
-msgstr "圖示集:"
-
msgid "Gain"
msgstr "增益"
@@ -648,8 +645,8 @@ msgstr "按下 Ctrl+Alt+PgDn 返回到視窗模式。"
msgid "Speed"
msgstr "速度"
-msgid "ZIP %03i %i (%s): %ls"
-msgstr "ZIP %03i %i (%s): %ls"
+msgid "ZIP %1 %2 (%3): %4"
+msgstr "ZIP %1 %2 (%3): %4"
msgid "ZIP images"
msgstr "ZIP 映像"
@@ -753,14 +750,11 @@ msgstr "S"
msgid "KB"
msgstr "KB"
-msgid "Could not initialize the video renderer."
-msgstr "無法初始化視訊渲染器。"
-
msgid "Default"
msgstr "預設"
-msgid "%i Wait state(s)"
-msgstr "%i 等待狀態 (WS)"
+msgid "%1 Wait state(s)"
+msgstr "%1 等待狀態 (WS)"
msgid "Type"
msgstr "類型"
@@ -804,11 +798,11 @@ msgstr "Thrustmaster Flight Control System"
msgid "None"
msgstr "無"
-msgid "%u MB (CHS: %i, %i, %i)"
-msgstr "%u MB (CHS: %i, %i, %i)"
+msgid "%1 MB (CHS: %2, %3, %4)"
+msgstr "%1 MB (CHS: %2, %3, %4)"
-msgid "Floppy %i (%s): %ls"
-msgstr "軟碟 %i (%s): %ls"
+msgid "Floppy %1 (%2): %3"
+msgstr "軟碟 %1 (%2): %3"
msgid "Advanced sector images"
msgstr "進階磁區映像"
@@ -828,8 +822,8 @@ msgstr "無法初始化 Ghostscript"
msgid "Unable to initialize GhostPCL"
msgstr "無法初始化 GhostPCL"
-msgid "MO %i (%ls): %ls"
-msgstr "磁光碟 %i (%ls): %ls"
+msgid "MO %1 (%2): %3"
+msgstr "磁光碟 %1 (%2): %3"
msgid "MO images"
msgstr "磁光碟映像"
@@ -903,11 +897,8 @@ msgstr "%1 裝置設定"
msgid "Monitor in sleep mode"
msgstr "顯示器處在睡眠狀態"
-msgid "OpenGL Shaders"
-msgstr "OpenGL 著色器"
-
-msgid "OpenGL options"
-msgstr "OpenGL 選項"
+msgid "GLSL shaders"
+msgstr "GLSL 著色器"
msgid "You are loading an unsupported configuration"
msgstr "正在載入一個不受支援的設定"
@@ -918,24 +909,18 @@ msgstr "此模擬電腦停用了基於選定電腦的 CPU 類型過濾。\n\n能
msgid "Continue"
msgstr "繼續"
-msgid "Cassette: %s"
-msgstr "磁帶: %s"
+msgid "Cassette: %1"
+msgstr "磁帶: %1"
msgid "Cassette images"
msgstr "磁帶映像"
-msgid "Cartridge %i: %ls"
-msgstr "卡帶 %i: %ls"
+msgid "Cartridge %1: %2"
+msgstr "卡帶 %1: %2"
msgid "Cartridge images"
msgstr "卡帶映像"
-msgid "Error initializing renderer"
-msgstr "初始化渲染器時出錯"
-
-msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer."
-msgstr "無法初始化 OpenGL (3.0 Core) 渲染器。請使用其他渲染器。"
-
msgid "Resume execution"
msgstr "恢復執行"
@@ -1098,8 +1083,8 @@ msgstr "IDE"
msgid "ATAPI"
msgstr "ATAPI"
-msgid "CD-ROM %i (%s): %s"
-msgstr "光碟 %i (%s): %s"
+msgid "CD-ROM %1 (%2): %3"
+msgstr "光碟 %1 (%2): %3"
msgid "160 KB"
msgstr "160 KB"
@@ -1278,9 +1263,6 @@ msgstr "清除映像歷史記錄"
msgid "Create..."
msgstr "建立..."
-msgid "previous image"
-msgstr "上一個映像"
-
msgid "Host CD/DVD Drive (%1)"
msgstr "主機 CD/DVD 光碟機 (%1)"
@@ -1290,23 +1272,8 @@ msgstr "未知匯流排"
msgid "Null Driver"
msgstr "空驅動程式"
-msgid "NIC %02i (%ls) %ls"
-msgstr "網路卡 %02i (%ls) %ls"
-
-msgid "Error opening \"%1\": %2"
-msgstr "錯誤開啟 \"%1\": %2"
-
-msgid "Error compiling vertex shader in file \"%1\""
-msgstr "編譯檔案 \"%1\" 中的頂點著色器時發生錯誤"
-
-msgid "Error compiling fragment shader in file \"%1\""
-msgstr "編譯檔案 \"%1\" 中的片段著色器出錯"
-
-msgid "Error linking shader program in file \"%1\""
-msgstr "在檔案中連結shader程式出錯 \"%1\""
-
-msgid "OpenGL 3.0 renderer options"
-msgstr "OpenGL 3.0 渲染器選項"
+msgid "NIC %1 (%2) %3"
+msgstr "網路卡 %1 (%2) %3"
msgid "Render behavior"
msgstr "渲染行為"
@@ -1320,9 +1287,6 @@ msgstr "fps"
msgid "VSync"
msgstr "VSync"
-msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>"
-msgstr "<html><head/><body><p>立即渲染每個畫面,與模擬顯示同步。</p><p><span style=" font-style:italic;">如果使用中的著色器不利用影格時間製作動畫效果,建議使用此選項。</span></p></body></html>"
-
msgid "Synchronize with video"
msgstr "與視訊同步"
@@ -1332,21 +1296,9 @@ msgstr "著色器"
msgid "Remove"
msgstr "移除"
-msgid "No shader selected"
-msgstr "未選擇著色器"
-
msgid "Browse..."
msgstr "瀏覽..."
-msgid "Shader error"
-msgstr "著色器錯誤"
-
-msgid "Could not load shaders."
-msgstr "無法載入著色器。"
-
-msgid "More information in details."
-msgstr "更多詳細資訊。"
-
msgid "Couldn't create OpenGL context."
msgstr "無法建立 OpenGL 上下文。"
@@ -1356,17 +1308,11 @@ msgstr "無法切換至 OpenGL 上下文。"
msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2"
msgstr "需要 OpenGL 版本 3.0 或更高。目前版本為 %1.%2"
-msgid "OpenGL initialization failed. Error %1."
-msgstr "OpenGL 初始化失敗。錯誤 %1."
-
msgid "Error initializing OpenGL"
msgstr "初始化 OpenGL 出錯"
-msgid "Falling back to software rendering.\n"
-msgstr "回退到軟體渲染。"
-
-msgid "Allocating memory for unpack buffer failed.\n"
-msgstr "為解除封包緩衝區分配記憶體失敗。\n"
+msgid "\nFalling back to software rendering."
+msgstr "\n回退到軟體渲染。"
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>當選擇媒體映像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 設定檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。</p></body></html>"
@@ -1434,9 +1380,6 @@ msgstr "序列埠的直通 3"
msgid "Serial port passthrough 4"
msgstr "序列埠的直通 4"
-msgid "Vision Systems LBA Enhancer"
-msgstr "Vision Systems LBA Enhancer"
-
msgid "Renderer options..."
msgstr "渲染器選項..."
@@ -2103,11 +2046,11 @@ msgstr "已命名管道 (伺服器)"
msgid "Host Serial Passthrough"
msgstr "主機序列埠的直通"
-msgid "Eject %s"
-msgstr "退出 %s"
+msgid "E&ject %1"
+msgstr "退出 %1(&J)"
msgid "&Unmute"
-msgstr "解除靜音 (&U)"
+msgstr "解除靜音(&U)"
msgid "Softfloat FPU"
msgstr "Softfloat FPU"
@@ -2115,8 +2058,29 @@ msgstr "Softfloat FPU"
msgid "High performance impact"
msgstr "對效能影響大"
-msgid "RAM Disk (max. speed)"
-msgstr "RAM 磁碟 (最大速度)"
+msgid "[Generic] RAM Disk (max. speed)"
+msgstr "[Generic] RAM 磁碟 (最大速度)"
+
+msgid "[Generic] 1989 (3500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1992 (3600 RPM)"
+msgstr ""
+
+msgid "[Generic] 1994 (4500 RPM)"
+msgstr ""
+
+msgid "[Generic] 1996 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1997 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 1998 (5400 RPM)"
+msgstr ""
+
+msgid "[Generic] 2000 (7200 RPM)"
+msgstr ""
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A 克隆 (ISA)"
@@ -2135,3 +2099,63 @@ msgstr "無法找到點矩陣字型"
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "通用 ESC/P 點矩陣印表機的模擬需要 \"roms/printer/fonts\" 目錄中的 TrueType 字體。"
+
+msgid "Inhibit multimedia keys"
+msgstr ""
+
+msgid "Ask for confirmation before saving settings"
+msgstr ""
+
+msgid "Ask for confirmation before hard resetting"
+msgstr ""
+
+msgid "Ask for confirmation before quitting"
+msgstr ""
+
+msgid "Display hotkey message when entering full-screen mode"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Model:"
+msgstr ""
+
+msgid "Failed to initialize Vulkan renderer."
+msgstr ""
+
+msgid "GLSL Error"
+msgstr ""
+
+msgid "Could not load shader: %1"
+msgstr ""
+
+msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
+msgstr ""
+
+msgid "Could not load texture: %1"
+msgstr ""
+
+msgid "Could not compile shader:\n\n%1"
+msgstr ""
+
+msgid "Program not linked:\n\n%1"
+msgstr ""
+
+msgid "Shader Manager"
+msgstr ""
+
+msgid "Shader Configuration"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Could not load file %1"
+msgstr ""
diff --git a/src/qt/qt_glsl_parser.cpp b/src/qt/qt_glsl_parser.cpp
index fa45267a7..6e107bc19 100644
--- a/src/qt/qt_glsl_parser.cpp
+++ b/src/qt/qt_glsl_parser.cpp
@@ -214,7 +214,7 @@ static glslp_t *glsl_parse(const char *f) {
strcpy(shader->shader_fn, f);
shader->shader_program = load_file(f);
if (!shader->shader_program) {
- QMessageBox::critical((QWidget *) qApp->findChild(), QObject::tr("GLSL error"), QObject::tr("Could not load shader %1").arg(shader->shader_fn));
+ QMessageBox::critical((QWidget *) qApp->findChild(), QObject::tr("GLSL error"), QObject::tr("Could not load shader: %1").arg(shader->shader_fn));
//wx_simple_messagebox("GLSL error", "Could not load shader %s\n", shader->shader_fn);
glslp_free(glslp);
return 0;
diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp
index 2acaaeacc..9e5563536 100644
--- a/src/qt/qt_harddiskdialog.cpp
+++ b/src/qt/qt_harddiskdialog.cpp
@@ -77,8 +77,7 @@ HarddiskDialog::HarddiskDialog(bool existing, QWidget *parent)
for (int i = 0; i < 127; i++) {
uint64_t size = ((uint64_t) hdd_table[i][0]) * hdd_table[i][1] * hdd_table[i][2];
uint32_t size_mb = size >> 11LL;
- // QString text = QString("%1 MiB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]);
- QString text = QString::asprintf(tr("%u MB (CHS: %i, %i, %i)").toUtf8().constData(), size_mb, (hdd_table[i][0]), (hdd_table[i][1]), (hdd_table[i][2]));
+ QString text = tr("%1 MB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]);
Models::AddEntry(model, text, i);
}
Models::AddEntry(model, tr("Custom..."), 127);
diff --git a/src/qt/qt_harddiskdialog.ui b/src/qt/qt_harddiskdialog.ui
index 91499d2cb..cba835134 100644
--- a/src/qt/qt_harddiskdialog.ui
+++ b/src/qt/qt_harddiskdialog.ui
@@ -32,27 +32,16 @@
Dialog
- -
-
-
- -
-
-
- Channel:
+
-
+
+
+ false
-
-
- -
-
-
- Speed:
+
+ 0
-
-
- -
-
-
- 30
+
+ true
@@ -63,86 +52,34 @@
- -
-
+
-
+
- Type:
+ Image Format:
- -
-
-
-
- 0
- 0
-
-
-
-
- 64
- 16777215
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 64
- 16777215
-
-
-
-
- -
-
-
- Size (MB):
-
-
-
- -
-
+
-
+
30
- -
-
-
- Qt::Horizontal
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
-
+
+
+ Bus:
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 20
-
-
-
+
-
+
- -
-
+
-
+
- Cylinders:
+ Type:
@@ -165,10 +102,29 @@
- -
-
-
- Image Format:
+
-
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 64
+ 16777215
+
@@ -179,31 +135,47 @@
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 64
+ 16777215
+
+
+
+
+ -
+
30
- -
-
+
-
+
- Bus:
+ Cylinders:
- -
-
-
- 30
+
-
+
+
+ File name:
- -
-
-
- 30
+
-
+
+
+ Size (MB):
@@ -226,37 +198,65 @@
- -
-
+
-
+
+
+ Channel:
+
+
+
+ -
+
30
- -
+
-
Block Size:
- -
-
+
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 20
+
+
+
+
+ -
+
- File name:
+ Model:
- -
-
-
- false
+
-
+
+
+ 30
-
- 0
+
+
+ -
+
+
+ 30
-
- true
+
+
+ -
+
+
+ 30
diff --git a/src/qt/qt_hardwarerenderer.cpp b/src/qt/qt_hardwarerenderer.cpp
index ee2ec07df..fb84606b0 100644
--- a/src/qt/qt_hardwarerenderer.cpp
+++ b/src/qt/qt_hardwarerenderer.cpp
@@ -37,7 +37,7 @@ void
HardwareRenderer::resizeGL(int w, int h)
{
m_context->makeCurrent(this);
- glViewport(0, 0, qRound(w * devicePixelRatio()), qRound(h * devicePixelRatio()));
+ glViewport(0, 0, qRound(w * devicePixelRatioF()), qRound(h * devicePixelRatioF()));
}
#define PROGRAM_VERTEX_ATTRIBUTE 0
@@ -145,7 +145,7 @@ HardwareRenderer::paintGL()
QVector texcoords;
QMatrix4x4 mat;
mat.setToIdentity();
- mat.ortho(QRectF(0, 0, (qreal) width(), (qreal) height()));
+ mat.ortho(QRectF(0, 0, (qreal) width() * (qreal) devicePixelRatioF(), (qreal) height() * (qreal) devicePixelRatioF()));
verts.push_back(QVector2D((float) destination.x(), (float) destination.y()));
verts.push_back(QVector2D((float) destination.x(), (float) destination.y() + (float) destination.height()));
verts.push_back(QVector2D((float) destination.x() + (float) destination.width(), (float) destination.y() + (float) destination.height()));
@@ -220,14 +220,17 @@ HardwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h)
#endif
buf_usage[buf_idx].clear();
source.setRect(x, y, w, h);
- if (origSource != source)
+ if (origSource != source) {
+ this->pixelRatio = devicePixelRatioF();
onResize(this->width(), this->height());
+ }
update();
}
void
HardwareRenderer::resizeEvent(QResizeEvent *event)
{
+ this->pixelRatio = devicePixelRatioF();
onResize(width(), height());
QOpenGLWindow::resizeEvent(event);
diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp
index d555be360..d86dae7b9 100644
--- a/src/qt/qt_machinestatus.cpp
+++ b/src/qt/qt_machinestatus.cpp
@@ -40,6 +40,8 @@ extern "C" {
#include <86box/ui.h>
#include <86box/machine_status.h>
#include <86box/config.h>
+
+extern volatile int fdcinited;
};
#include
@@ -268,7 +270,6 @@ MachineStatus::MachineStatus(QObject *parent)
, refreshTimer(new QTimer(this))
{
d = std::make_unique(this);
- muteUnmuteAction = nullptr;
soundMenu = nullptr;
connect(refreshTimer, &QTimer::timeout, this, &MachineStatus::refreshIcons);
refreshTimer->start(75);
@@ -277,9 +278,9 @@ MachineStatus::MachineStatus(QObject *parent)
MachineStatus::~MachineStatus() = default;
void
-MachineStatus::setSoundGainAction(QAction* action)
+MachineStatus::setSoundMenu(QMenu* menu)
{
- soundGainAction = action;
+ soundMenu = menu;
}
bool
@@ -303,6 +304,9 @@ MachineStatus::hasSCSI()
void
MachineStatus::iterateFDD(const std::function &cb)
{
+ if (!fdcinited)
+ return;
+
for (int i = 0; i < FDD_NUM; ++i) {
if (fdd_get_type(i) != 0) {
cb(i);
@@ -514,28 +518,6 @@ MachineStatus::refresh(QStatusBar *sbar)
}
sbar->removeWidget(d->sound.get());
- if (!muteUnmuteAction) {
- muteUnmuteAction = new QAction;
- connect(muteUnmuteAction, &QAction::triggered, this, [this]() {
- sound_muted ^= 1;
- config_save();
- if (d->sound)
- d->sound->setPixmap(sound_muted ? d->pixmaps.sound.disabled : d->pixmaps.sound.normal);
-
- muteUnmuteAction->setText(sound_muted ? tr("&Unmute") : tr("&Mute"));
- });
- }
-
- if (!soundMenu) {
- soundMenu = new QMenu((QWidget*)parent());
-
- soundMenu->addAction(muteUnmuteAction);
- soundMenu->addSeparator();
- soundMenu->addAction(soundGainAction);
-
- muteUnmuteAction->setParent(soundMenu);
- }
-
if (cassette_enable) {
d->cassette.label = std::make_unique();
d->cassette.setEmpty(QString(cassette_fname).isEmpty());
@@ -705,8 +687,6 @@ MachineStatus::refresh(QStatusBar *sbar)
d->sound = std::make_unique();
d->sound->setPixmap(sound_muted ? d->pixmaps.sound.disabled : d->pixmaps.sound.normal);
- if (muteUnmuteAction)
- muteUnmuteAction->setText(sound_muted ? tr("&Unmute") : tr("&Mute"));
connect(d->sound.get(), &ClickableLabel::clicked, this, [this](QPoint pos) {
this->soundMenu->popup(pos - QPoint(0, this->soundMenu->sizeHint().height()));
@@ -722,6 +702,13 @@ MachineStatus::refresh(QStatusBar *sbar)
refreshEmptyIcons();
}
+void
+MachineStatus::updateSoundIcon()
+{
+ if (d->sound)
+ d->sound->setPixmap(sound_muted ? d->pixmaps.sound.disabled : d->pixmaps.sound.normal);
+}
+
void
MachineStatus::message(const QString &msg)
{
diff --git a/src/qt/qt_machinestatus.hpp b/src/qt/qt_machinestatus.hpp
index 90b420763..ad6425b5a 100644
--- a/src/qt/qt_machinestatus.hpp
+++ b/src/qt/qt_machinestatus.hpp
@@ -73,20 +73,19 @@ public:
QString getMessage();
void clearActivity();
- void setSoundGainAction(QAction* action);
+ void setSoundMenu(QMenu* menu);
public slots:
void refresh(QStatusBar *sbar);
void message(const QString &msg);
void updateTip(int tag);
void refreshEmptyIcons();
void refreshIcons();
+ void updateSoundIcon();
private:
struct States;
std::unique_ptr d;
QTimer *refreshTimer;
- QAction *soundGainAction;
- QAction *muteUnmuteAction;
QMenu *soundMenu;
};
diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp
index 2ef797bd1..1f1dd6b49 100644
--- a/src/qt/qt_main.cpp
+++ b/src/qt/qt_main.cpp
@@ -194,8 +194,6 @@ win_keyboard_handle(uint32_t scancode, int up, int e0, int e1)
it's not an invalid scan code. */
if (scancode != 0xFFFF)
keyboard_input(!up, scancode);
-
- main_window->checkFullscreenHotkey();
}
}
@@ -370,8 +368,6 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
else if ((lpKdhs->scanCode == 0x3e) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
ret = TRUE;
- else if ((lpKdhs->scanCode == 0x49) && bCtrlDown && !(lpKdhs->flags & LLKHF_UP))
- ret = TRUE;
else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED))
ret = TRUE;
else if (inhibit_multimedia_keys
diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp
index b3d0d9fa9..886f84dcd 100644
--- a/src/qt/qt_mainwindow.cpp
+++ b/src/qt/qt_mainwindow.cpp
@@ -180,7 +180,8 @@ MainWindow::MainWindow(QWidget *parent)
extern MainWindow *main_window;
main_window = this;
ui->setupUi(this);
- status->setSoundGainAction(ui->actionSound_gain);
+ status->setSoundMenu(ui->menuSound);
+ ui->actionMute_Unmute->setText(sound_muted ? tr("&Unmute") : tr("&Mute"));
ui->menuEGA_S_VGA_settings->menuAction()->setMenuRole(QAction::NoRole);
ui->stackedWidget->setMouseTracking(true);
statusBar()->setVisible(!hide_status_bar);
@@ -674,6 +675,17 @@ MainWindow::MainWindow(QWidget *parent)
/* Remove default Shift+F10 handler, which unfocuses keyboard input even with no context menu. */
connect(new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_F10), this), &QShortcut::activated, this, [](){});
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_PageDown), this);
+#else
+ auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_PageDown), this);
+#endif
+ windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut);
+ connect(windowedShortcut, &QShortcut::activated, this, [this] () {
+ if (video_fullscreen)
+ ui->actionFullscreen->trigger();
+ });
+
connect(this, &MainWindow::initRendererMonitor, this, &MainWindow::initRendererMonitorSlot);
connect(this, &MainWindow::initRendererMonitorForNonQtThread, this, &MainWindow::initRendererMonitorSlot, Qt::BlockingQueuedConnection);
connect(this, &MainWindow::destroyRendererMonitor, this, &MainWindow::destroyRendererMonitorSlot);
@@ -696,6 +708,22 @@ MainWindow::MainWindow(QWidget *parent)
});
#endif
+ QTimer::singleShot(0, this, [this]() {
+ for (auto curObj : this->menuBar()->children()) {
+ if (qobject_cast(curObj)) {
+ auto menu = qobject_cast(curObj);
+ for (auto curObj2 : menu->children()) {
+ if (qobject_cast(curObj2)) {
+ auto action = qobject_cast(curObj2);
+ if (!action->shortcut().isEmpty()) {
+ this->insertAction(nullptr, action);
+ }
+ }
+ }
+ }
+ }
+ });
+
actGroup = new QActionGroup(this);
actGroup->addAction(ui->actionCursor_Puck);
actGroup->addAction(ui->actionPen);
@@ -803,7 +831,7 @@ MainWindow::resizeEvent(QResizeEvent *event)
{
//qDebug() << pos().x() + event->size().width();
//qDebug() << pos().y() + event->size().height();
- if (vid_resize == 1)
+ if (vid_resize == 1 || video_fullscreen)
return;
int newX = pos().x();
@@ -833,6 +861,11 @@ MainWindow::initRendererMonitorSlot(int monitor_index)
});
secondaryRenderer->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
secondaryRenderer->setWindowTitle(QObject::tr("86Box Monitor #") + QString::number(monitor_index + 1));
+ secondaryRenderer->setContextMenuPolicy(Qt::PreventContextMenu);
+
+ for (int i = 0; i < this->actions().size(); i++) {
+ secondaryRenderer->addAction(this->actions()[i]);
+ }
if (vid_resize == 2)
secondaryRenderer->setFixedSize(fixed_size_x, fixed_size_y);
@@ -1302,7 +1335,7 @@ void
MainWindow::refreshMediaMenu()
{
mm->refresh(ui->menuMedia);
- status->setSoundGainAction(ui->actionSound_gain);
+ status->setSoundMenu(ui->menuSound);
status->refresh(ui->statusbar);
ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA));
ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled);
@@ -1360,18 +1393,9 @@ MainWindow::keyPressEvent(QKeyEvent *event)
#endif
}
- checkFullscreenHotkey();
-
if (keyboard_ismsexit())
plat_mouse_capture(0);
- if ((video_fullscreen > 0) && (keyboard_recv_ui(0x1D) || keyboard_recv_ui(0x11D))) {
- if (keyboard_recv_ui(0x57))
- ui->actionTake_screenshot->trigger();
- else if (keyboard_recv_ui(0x58))
- pc_send_cad();
- }
-
event->accept();
}
@@ -1403,28 +1427,6 @@ MainWindow::keyReleaseEvent(QKeyEvent *event)
processKeyboardInput(false, event->nativeScanCode());
#endif
}
-
- checkFullscreenHotkey();
-}
-
-void
-MainWindow::checkFullscreenHotkey()
-{
- if (!fs_off_signal && video_fullscreen && keyboard_isfsexit()) {
- /* Signal "exit fullscreen mode". */
- fs_off_signal = true;
- } else if (fs_off_signal && video_fullscreen && keyboard_isfsexit_up()) {
- ui->actionFullscreen->trigger();
- fs_off_signal = false;
- }
-
- if (!fs_on_signal && !video_fullscreen && keyboard_isfsenter()) {
- /* Signal "enter fullscreen mode". */
- fs_on_signal = true;
- } else if (fs_on_signal && !video_fullscreen && keyboard_isfsenter_up()) {
- ui->actionFullscreen->trigger();
- fs_on_signal = false;
- }
}
QSize
@@ -1936,6 +1938,15 @@ MainWindow::on_actionTake_screenshot_triggered()
device_force_redraw();
}
+void
+MainWindow::on_actionMute_Unmute_triggered()
+{
+ sound_muted ^= 1;
+ config_save();
+ status->updateSoundIcon();
+ ui->actionMute_Unmute->setText(sound_muted ? tr("&Unmute") : tr("&Mute"));
+}
+
void
MainWindow::on_actionSound_gain_triggered()
{
diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp
index f1c6cadf6..4b3f9ecae 100644
--- a/src/qt/qt_mainwindow.hpp
+++ b/src/qt/qt_mainwindow.hpp
@@ -31,7 +31,6 @@ public:
void blitToWidget(int x, int y, int w, int h, int monitor_index);
QSize getRenderWidgetSize();
void setSendKeyboardInput(bool enabled);
- void checkFullscreenHotkey();
void reloadAllRenderers();
std::array, 8> renderers;
@@ -117,6 +116,7 @@ private slots:
void on_actionHide_tool_bar_triggered();
void on_actionUpdate_status_bar_icons_triggered();
void on_actionTake_screenshot_triggered();
+ void on_actionMute_Unmute_triggered();
void on_actionSound_gain_triggered();
void on_actionPreferences_triggered();
void on_actionEnable_Discord_integration_triggered(bool checked);
diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui
index ef3cf16c6..83a80342b 100644
--- a/src/qt/qt_mainwindow.ui
+++ b/src/qt/qt_mainwindow.ui
@@ -87,13 +87,21 @@
&Tools
+
-
+
@@ -725,6 +733,11 @@
false
+
+
+ &Mute
+
+
Sound &gain...
diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp
index d548c0779..5892c55cd 100644
--- a/src/qt/qt_mediahistorymanager.cpp
+++ b/src/qt/qt_mediahistorymanager.cpp
@@ -101,15 +101,20 @@ MediaHistoryManager::getImageForSlot(int index, int slot, ui::MediaType type)
return image_name;
}
-// These are hardcoded since we can't include the various
-// header files where they are defined (e.g., fdd.h, mo.h).
-// However, all in ui::MediaType support 4 except cassette.
int
MediaHistoryManager::maxDevicesSupported(ui::MediaType type)
{
switch (type) {
default:
return 4;
+ case ui::MediaType::Optical:
+ return CDROM_NUM;
+ case ui::MediaType::Floppy:
+ return FDD_NUM;
+ case ui::MediaType::Zip:
+ return ZIP_NUM;
+ case ui::MediaType::Mo:
+ return MO_NUM;
case ui::MediaType::Cassette:
return 1;
case ui::MediaType::Cartridge:
diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp
index f7abebdf1..351012d1e 100644
--- a/src/qt/qt_mediamenu.cpp
+++ b/src/qt/qt_mediamenu.cpp
@@ -93,7 +93,7 @@ MediaMenu::refresh(QMenu *parentMenu)
cassetteMenu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
cassetteImageHistoryPos[slot] = cassetteMenu->children().count();
- cassetteMenu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false);
+ cassetteMenu->addAction(tr("Image %1").arg(slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false);
}
cassetteMenu->addSeparator();
cassetteRecordPos = cassetteMenu->children().count();
@@ -118,7 +118,7 @@ MediaMenu::refresh(QMenu *parentMenu)
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
cartridgeImageHistoryPos[slot] = menu->children().count();
- menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false);
+ menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false);
}
menu->addSeparator();
cartridgeEjectPos = menu->children().count();
@@ -138,7 +138,7 @@ MediaMenu::refresh(QMenu *parentMenu)
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
floppyImageHistoryPos[slot] = menu->children().count();
- menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { floppyMenuSelect(i, slot); })->setCheckable(false);
+ menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { floppyMenuSelect(i, slot); })->setCheckable(false);
}
menu->addSeparator();
floppyExportPos = menu->children().count();
@@ -161,7 +161,7 @@ MediaMenu::refresh(QMenu *parentMenu)
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
cdromImageHistoryPos[slot] = menu->children().count();
- menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { cdromReload(i, slot); })->setCheckable(false);
+ menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { cdromReload(i, slot); })->setCheckable(false);
}
menu->addSeparator();
#ifdef Q_OS_WINDOWS
@@ -174,8 +174,7 @@ MediaMenu::refresh(QMenu *parentMenu)
}
menu->addSeparator();
#endif // Q_OS_WINDOWS
- cdromImagePos = menu->children().count();
- cdromDirPos = menu->children().count();
+ cdromEjectPos = menu->children().count();
menu->addAction(tr("E&ject"), [this, i]() { cdromEject(i); })->setCheckable(false);
cdromMenus[i] = menu;
cdromUpdateMenu(i);
@@ -191,7 +190,7 @@ MediaMenu::refresh(QMenu *parentMenu)
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
zipImageHistoryPos[slot] = menu->children().count();
- menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false);
+ menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false);
}
menu->addSeparator();
zipEjectPos = menu->children().count();
@@ -210,7 +209,7 @@ MediaMenu::refresh(QMenu *parentMenu)
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
moImageHistoryPos[slot] = menu->children().count();
- menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false);
+ menu->addAction(tr("Image %1").arg(slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false);
}
menu->addSeparator();
moEjectPos = menu->children().count();
@@ -263,7 +262,7 @@ void
MediaMenu::cassetteMenuSelect(int slot)
{
QString filename = mhm.getImageForSlot(0, slot, ui::MediaType::Cassette);
- cassetteMount(filename.toUtf8().constData(), 0);
+ cassetteMount(filename, 0);
cassetteUpdateMenu();
ui_sb_update_tip(SB_CASSETTE);
}
@@ -304,7 +303,8 @@ MediaMenu::cassetteEject()
void
MediaMenu::cassetteUpdateMenu()
{
- QString name = cassette_fname;
+ QString name = cassette_fname;
+ QFileInfo fi(cassette_fname);
const QString mode = cassette_mode;
auto childs = cassetteMenu->children();
auto *recordMenu = dynamic_cast(childs[cassetteRecordPos]);
@@ -318,13 +318,13 @@ MediaMenu::cassetteUpdateMenu()
rewindMenu->setEnabled(!name.isEmpty());
fastFwdMenu->setEnabled(!name.isEmpty());
ejectMenu->setEnabled(!name.isEmpty());
+ ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
const bool isSaving = (mode == QStringLiteral("save"));
recordMenu->setChecked(isSaving);
playMenu->setChecked(!isSaving);
- cassetteMenu->setTitle(QString::asprintf(tr("Cassette: %s").toUtf8().constData(),
- (name.isEmpty() ? tr("(empty)") : name).toUtf8().constData()));
+ cassetteMenu->setTitle(tr("Cassette: %1").arg(name.isEmpty() ? tr("(empty)") : name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
updateImageHistory(0, slot, ui::MediaType::Cassette);
@@ -365,7 +365,7 @@ void
MediaMenu::cartridgeMenuSelect(int index, int slot)
{
QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Cartridge);
- cartridgeMount(index, filename.toUtf8().constData());
+ cartridgeMount(index, filename);
cartridgeUpdateMenu(index);
ui_sb_update_tip(SB_CARTRIDGE | index);
}
@@ -385,12 +385,13 @@ void
MediaMenu::cartridgeUpdateMenu(int i)
{
const QString name = cart_fns[i];
- auto *menu = cartridgeMenus[i];
+ QFileInfo fi(cart_fns[i]);
+ auto *menu = cartridgeMenus[i];
auto childs = menu->children();
auto *ejectMenu = dynamic_cast(childs[cartridgeEjectPos]);
ejectMenu->setEnabled(!name.isEmpty());
- // menu->setTitle(tr("Cartridge %1: %2").arg(QString::number(i+1), name.isEmpty() ? tr("(empty)") : name));
- menu->setTitle(QString::asprintf(tr("Cartridge %i: %ls").toUtf8().constData(), i + 1, name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
+ ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
+ menu->setTitle(tr("Cartridge %1: %2").arg(QString::number(i + 1), name.isEmpty() ? tr("(empty)") : name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
updateImageHistory(i, slot, ui::MediaType::Cartridge);
@@ -491,7 +492,7 @@ MediaMenu::floppyUpdateMenu(int i)
auto *ejectMenu = dynamic_cast(childs[floppyEjectPos]);
auto *exportMenu = dynamic_cast(childs[floppyExportPos]);
ejectMenu->setEnabled(!name.isEmpty());
- ejectMenu->setText(QString::asprintf(tr("Eject %s").toUtf8().constData(), name.isEmpty() ? QString().toUtf8().constData() : fi.fileName().toUtf8().constData()));
+ ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
exportMenu->setEnabled(!name.isEmpty());
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
@@ -499,15 +500,15 @@ MediaMenu::floppyUpdateMenu(int i)
}
int type = fdd_get_type(i);
- // floppyMenus[i]->setTitle(tr("Floppy %1 (%2): %3").arg(QString::number(i+1), fdd_getname(type), name.isEmpty() ? tr("(empty)") : name));
- floppyMenus[i]->setTitle(QString::asprintf(tr("Floppy %i (%s): %ls").toUtf8().constData(), i + 1, fdd_getname(type), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
+ floppyMenus[i]->setTitle(tr("Floppy %1 (%2): %3").arg(QString::number(i + 1), fdd_getname(type), name.isEmpty() ? tr("(empty)") : name));
+
}
void
MediaMenu::floppyMenuSelect(int index, int slot)
{
QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Floppy);
- floppyMount(index, filename.toUtf8().constData(), false);
+ floppyMount(index, filename, false);
floppyUpdateMenu(index);
ui_sb_update_tip(SB_FLOPPY | index);
}
@@ -594,7 +595,7 @@ void
MediaMenu::cdromReload(int index, int slot)
{
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Optical);
- cdromMount(index, filename.toUtf8().constData());
+ cdromMount(index, filename);
cdromUpdateMenu(index);
ui_sb_update_tip(SB_CDROM | index);
}
@@ -630,7 +631,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
switch (type) {
default:
- menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
return;
case ui::MediaType::Cassette:
if (!MachineStatus::hasCassette())
@@ -639,7 +640,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
children = menu->children();
imageHistoryUpdatePos = dynamic_cast(children[cassetteImageHistoryPos[slot]]);
fi.setFile(fn);
- menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
break;
case ui::MediaType::Cartridge:
if (!machine_has_cartridge(machine))
@@ -648,7 +649,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
children = menu->children();
imageHistoryUpdatePos = dynamic_cast(children[cartridgeImageHistoryPos[slot]]);
fi.setFile(fn);
- menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
break;
case ui::MediaType::Floppy:
if (!floppyMenus.contains(index))
@@ -657,7 +658,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
children = menu->children();
imageHistoryUpdatePos = dynamic_cast(children[floppyImageHistoryPos[slot]]);
fi.setFile(fn);
- menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
break;
case ui::MediaType::Optical:
if (!cdromMenus.contains(index))
@@ -668,14 +669,14 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
if (fn.left(8) == "ioctl://") {
menu_icon = QIcon(":/settings/qt/icons/cdrom_host.ico");
#ifdef Q_OS_WINDOWS
- menu_item_name = tr("Host CD/DVD Drive (%1)").arg(fn.right(2)).toUtf8().constData();
+ menu_item_name = tr("Host CD/DVD Drive (%1)").arg(fn.right(2));
#else
menu_item_name = tr("Host CD/DVD Drive (%1)").arg(fn.right(fn.length() - 8));
#endif
} else {
fi.setFile(fn);
menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico");
- menu_item_name = fn.isEmpty() ? tr("previous image").toUtf8().constData() : fn.toUtf8().constData();
+ menu_item_name = fn.isEmpty() ? tr("Reload previous image") : fn;
}
imageHistoryUpdatePos->setIcon(menu_icon);
break;
@@ -686,7 +687,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
children = menu->children();
imageHistoryUpdatePos = dynamic_cast(children[zipImageHistoryPos[slot]]);
fi.setFile(fn);
- menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
break;
case ui::MediaType::Mo:
if (!moMenus.contains(index))
@@ -695,11 +696,11 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
children = menu->children();
imageHistoryUpdatePos = dynamic_cast(children[moImageHistoryPos[slot]]);
fi.setFile(fn);
- menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
break;
}
- imageHistoryUpdatePos->setText(QString::asprintf(tr("%s").toUtf8().constData(), menu_item_name.toUtf8().constData()));
+ imageHistoryUpdatePos->setText(menu_item_name);
if (fn.left(8) == "ioctl://")
imageHistoryUpdatePos->setVisible(true);
@@ -730,12 +731,12 @@ MediaMenu::cdromUpdateMenu(int i)
muteMenu->setIcon(QIcon((cdrom[i].sound_on == 0) ? ":/settings/qt/icons/cdrom_unmute.ico" : ":/settings/qt/icons/cdrom_mute.ico"));
muteMenu->setText((cdrom[i].sound_on == 0) ? tr("&Unmute") : tr("&Mute"));
- auto *imageMenu = dynamic_cast(childs[cdromImagePos]);
- imageMenu->setEnabled(!name.isEmpty());
+ auto *ejectMenu = dynamic_cast(childs[cdromEjectPos]);
+ ejectMenu->setEnabled(!name.isEmpty());
QString menu_item_name;
if (name.left(8) == "ioctl://") {
#ifdef Q_OS_WINDOWS
- menu_item_name = tr("Host CD/DVD Drive (%1)").arg(name.right(2)).toUtf8().constData();
+ menu_item_name = tr("Host CD/DVD Drive (%1)").arg(name.right(2));
#else
menu_item_name = tr("Host CD/DVD Drive (%1)").arg(name.right(name.length() - 8));
#endif
@@ -744,12 +745,12 @@ MediaMenu::cdromUpdateMenu(int i)
} else {
QFileInfo fi(cdrom[i].image_path);
- menu_item_name = name.isEmpty() ? QString().toUtf8().constData() : name.toUtf8().constData();
+ menu_item_name = name.isEmpty() ? QString() : fi.fileName();
name2 = name;
menu_icon = fi.isDir() ? QIcon(":/settings/qt/icons/cdrom_folder.ico") : QIcon(":/settings/qt/icons/cdrom_image.ico");
}
- imageMenu->setIcon(menu_icon);
- imageMenu->setText(QString::asprintf(tr("Eject %s").toUtf8().constData(), menu_item_name.toUtf8().constData()));
+ ejectMenu->setIcon(menu_icon);
+ ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(menu_item_name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::Optical);
@@ -769,8 +770,7 @@ MediaMenu::cdromUpdateMenu(int i)
break;
}
- // menu->setTitle(tr("CD-ROM %1 (%2): %3").arg(QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name));
- menu->setTitle(QString::asprintf(tr("CD-ROM %i (%s): %s").toUtf8().constData(), i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toUtf8().data() : name2.toUtf8().data()));
+ menu->setTitle(tr("CD-ROM %1 (%2): %3").arg(QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name2));
}
void
@@ -879,6 +879,7 @@ MediaMenu::zipUpdateMenu(int i)
{
const QString name = zip_drives[i].image_path;
const QString prev_name = zip_drives[i].prev_image_path;
+ QFileInfo fi(zip_drives[i].image_path);
if (!zipMenus.contains(i))
return;
auto *menu = zipMenus[i];
@@ -886,6 +887,7 @@ MediaMenu::zipUpdateMenu(int i)
auto *ejectMenu = dynamic_cast(childs[zipEjectPos]);
ejectMenu->setEnabled(!name.isEmpty());
+ ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
QString busName = tr("Unknown Bus");
switch (zip_drives[i].bus_type) {
@@ -899,8 +901,7 @@ MediaMenu::zipUpdateMenu(int i)
break;
}
- // menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? "250" : "100", QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name));
- menu->setTitle(QString::asprintf(tr("ZIP %03i %i (%s): %ls").toUtf8().constData(), (zip_drives[i].is_250 > 0) ? 250 : 100, i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
+ menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? QString("250") : QString("100"), QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::Zip);
@@ -1013,8 +1014,9 @@ MediaMenu::moReload(int index, int slot)
void
MediaMenu::moUpdateMenu(int i)
{
- QString name = mo_drives[i].image_path;
- QString prev_name = mo_drives[i].prev_image_path;
+ QString name = mo_drives[i].image_path;
+ QString prev_name = mo_drives[i].prev_image_path;
+ QFileInfo fi(mo_drives[i].image_path);
if (!moMenus.contains(i))
return;
auto *menu = moMenus[i];
@@ -1022,6 +1024,7 @@ MediaMenu::moUpdateMenu(int i)
auto *ejectMenu = dynamic_cast(childs[moEjectPos]);
ejectMenu->setEnabled(!name.isEmpty());
+ ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
QString busName = tr("Unknown Bus");
switch (mo_drives[i].bus_type) {
@@ -1035,7 +1038,7 @@ MediaMenu::moUpdateMenu(int i)
break;
}
- menu->setTitle(QString::asprintf(tr("MO %i (%ls): %ls").toUtf8().constData(), i + 1, busName.toStdU16String().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
+ menu->setTitle(tr("MO %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::Mo);
@@ -1087,7 +1090,7 @@ MediaMenu::nicUpdateMenu(int i)
auto *connectedAction = dynamic_cast(childs[netDisconnPos]);
connectedAction->setChecked(network_is_connected(i));
- menu->setTitle(QString::asprintf(tr("NIC %02i (%ls) %ls").toUtf8().constData(), i + 1, netType.toStdU16String().data(), devName.toStdU16String().data()));
+ menu->setTitle(tr("NIC %1 (%2) %3").arg(QString::number(i + 1), netType, devName));
}
QString
diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp
index b069c67d9..ed97a0a50 100644
--- a/src/qt/qt_mediamenu.hpp
+++ b/src/qt/qt_mediamenu.hpp
@@ -108,8 +108,7 @@ private:
int floppyImageHistoryPos[MAX_PREV_IMAGES];
int cdromMutePos;
- int cdromImagePos;
- int cdromDirPos;
+ int cdromEjectPos;
int cdromImageHistoryPos[MAX_PREV_IMAGES];
int zipEjectPos;
diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp
index b465bfddd..2e8869c09 100644
--- a/src/qt/qt_openglrenderer.cpp
+++ b/src/qt/qt_openglrenderer.cpp
@@ -633,7 +633,7 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f)
if (!load_texture(file, &tex->texture)) {
//QMessageBox::critical(main_window, tr("GLSL Error"), tr("Could not load texture: %s").arg(file));
- main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %s").arg(file));
+ main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %1").arg(file));
pclog("Could not load texture %s!\n", file);
failed = 1;
break;
@@ -1154,14 +1154,15 @@ OpenGLRenderer::onBlit(int buf_idx, int x, int y, int w, int h)
buf_usage[buf_idx].clear();
source.setRect(x, y, w, h);
+ this->pixelRatio = devicePixelRatio();
onResize(this->width(), this->height());
#ifdef Q_OS_MACOS
glw.glViewport(
- destination.x() * devicePixelRatio(),
- destination.y() * devicePixelRatio(),
- destination.width() * devicePixelRatio(),
- destination.height() * devicePixelRatio());
+ destination.x(),
+ destination.y(),
+ destination.width(),
+ destination.height());
#endif
if (video_framerate == -1)
@@ -1187,6 +1188,7 @@ OpenGLRenderer::exposeEvent(QExposeEvent *event)
if (!isInitialized)
initialize();
+ this->pixelRatio = devicePixelRatio();
onResize(size().width(), size().height());
}
@@ -1195,6 +1197,7 @@ OpenGLRenderer::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
+ this->pixelRatio = devicePixelRatio();
onResize(event->size().width(), event->size().height());
if (notReady())
@@ -1203,10 +1206,10 @@ OpenGLRenderer::resizeEvent(QResizeEvent *event)
context->makeCurrent(this);
glw.glViewport(
- destination.x() * devicePixelRatio(),
- destination.y() * devicePixelRatio(),
- destination.width() * devicePixelRatio(),
- destination.height() * devicePixelRatio());
+ destination.x(),
+ destination.y(),
+ destination.width(),
+ destination.height());
}
void
@@ -1386,10 +1389,10 @@ OpenGLRenderer::render()
uint32_t x, y, w, h;
} window_rect;
- window_rect.x = destination.x() * devicePixelRatio();
- window_rect.y = destination.y() * devicePixelRatio();
- window_rect.w = destination.width() * devicePixelRatio();
- window_rect.h = destination.height() * devicePixelRatio();
+ window_rect.x = destination.x();
+ window_rect.y = destination.y();
+ window_rect.w = destination.width();
+ window_rect.h = destination.height();
glw.glBindTexture(GL_TEXTURE_2D, scene_texture.id);
scene_texture.min_filter = scene_texture.mag_filter = video_filter_method ? GL_LINEAR : GL_NEAREST;
@@ -1652,7 +1655,7 @@ OpenGLRenderer::render()
}
if (monitors[r_monitor_index].mon_screenshots) {
- int width = destination.width() * devicePixelRatio(), height = destination.height() * devicePixelRatio();
+ int width = destination.width(), height = destination.height();
char path[1024];
char fn[256];
diff --git a/src/qt/qt_openglshadermanagerdialog.cpp b/src/qt/qt_openglshadermanagerdialog.cpp
index 72f58f9cb..90f38f40f 100644
--- a/src/qt/qt_openglshadermanagerdialog.cpp
+++ b/src/qt/qt_openglshadermanagerdialog.cpp
@@ -2,6 +2,7 @@
#include "ui_qt_openglshadermanagerdialog.h"
#include "qt_mainwindow.hpp"
+#include "qt_util.hpp"
extern MainWindow* main_window;
#include "qt_openglshaderconfig.hpp"
@@ -9,6 +10,7 @@ extern MainWindow* main_window;
#include
#include
#include
+#include
extern "C" {
#include <86box/86box.h>
@@ -166,7 +168,8 @@ void OpenGLShaderManagerDialog::on_buttonMoveDown_clicked()
void OpenGLShaderManagerDialog::on_buttonAdd_clicked()
{
- auto res = QFileDialog::getOpenFileName(this, QString(), QString(), "GLSL Shaders (*.glslp *.glsl);;All files (*.*)");
+ auto res = QFileDialog::getOpenFileName(this, QString(), QString(),
+ tr("GLSL shaders") % util::DlgFilter({ "glslp", "glsl" }) % tr("All files") % util::DlgFilter({ "*" }, true));
if (!res.isEmpty()) {
auto glslp_file = res.toUtf8();
glslp_t* shaderfile = glslp_parse(glslp_file.data());
@@ -181,7 +184,7 @@ void OpenGLShaderManagerDialog::on_buttonAdd_clicked()
ui->buttonAdd->setDisabled(ui->shaderListWidget->count() >= MAX_USER_SHADERS);
}
} else {
- QMessageBox::critical(this, tr("GLSL error"), tr("Could not load filename %1").arg(res));
+ QMessageBox::critical(this, tr("GLSL error"), tr("Could not load file %1").arg(res));
}
}
}
diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp
index 2fd108186..0fce0d705 100644
--- a/src/qt/qt_progsettings.cpp
+++ b/src/qt/qt_progsettings.cpp
@@ -80,7 +80,7 @@ ProgSettings::accept()
confirm_save = ui->checkBoxConfirmSave->isChecked() ? 1 : 0;
confirm_reset = ui->checkBoxConfirmHardReset->isChecked() ? 1 : 0;
video_fullscreen_first = ui->checkBoxFullscreenFirst->isChecked() ? 1 : 0;
- inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked();
+ inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked() ? 1 : 0;
loadTranslators(QCoreApplication::instance());
reloadStrings();
diff --git a/src/qt/qt_progsettings.hpp b/src/qt/qt_progsettings.hpp
index b4e59e02d..1c7295f56 100644
--- a/src/qt/qt_progsettings.hpp
+++ b/src/qt/qt_progsettings.hpp
@@ -28,22 +28,7 @@ public:
QString translate(const char *context, const char *sourceText,
const char *disambiguation = nullptr, int n = -1) const override
{
- if (strcmp(sourceText, "&Fullscreen") == 0)
- sourceText = "&Fullscreen\tCtrl+Alt+PgUp";
- if (strcmp(sourceText, "&Ctrl+Alt+Del") == 0)
- sourceText = "&Ctrl+Alt+Del\tCtrl+F12";
- if (strcmp(sourceText, "Take s&creenshot") == 0)
- sourceText = "Take s&creenshot\tCtrl+F11";
- if (strcmp(sourceText, "Begin trace") == 0)
- sourceText = "Begin trace\tCtrl+T";
- if (strcmp(sourceText, "End trace") == 0)
- sourceText = "End trace\tCtrl+T";
- QString finalstr = QTranslator::translate("", sourceText, disambiguation, n);
-#ifdef Q_OS_MACOS
- if (finalstr.contains('\t'))
- finalstr.truncate(finalstr.indexOf('\t'));
-#endif
- return finalstr;
+ return QTranslator::translate("", sourceText, disambiguation, n);
}
};
static CustomTranslator *translator;
diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui
index d3ebf8c85..b01199dfd 100644
--- a/src/qt/qt_progsettings.ui
+++ b/src/qt/qt_progsettings.ui
@@ -140,7 +140,7 @@
-
- Inhibit multimedia keys on Windows
+ Inhibit multimedia keys
diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp
index 2a20ff63c..56217b611 100644
--- a/src/qt/qt_renderercommon.cpp
+++ b/src/qt/qt_renderercommon.cpp
@@ -59,6 +59,9 @@ RendererCommon::onResize(int width, int height)
bool main_max = main_window->isMaximized();
bool main_is_max = (main_is_ancestor && main_max == false);
+ width = round(pixelRatio * width);
+ height = round(pixelRatio * height);
+
if (is_fs && (video_fullscreen_scale_maximized ? (parent_max && main_is_max) : 1))
destination.setRect(0, 0, width, height);
else {
@@ -129,6 +132,9 @@ RendererCommon::onResize(int width, int height)
monitors[r_monitor_index].mon_res_x = (double) destination.width();
monitors[r_monitor_index].mon_res_y = (double) destination.height();
+
+ destinationF.setRect((double)destination.x() / (double)width, (double)destination.y() / (double)height,
+ (double)destination.width() / (double)width, (double)destination.height() / (double)height);
}
bool
diff --git a/src/qt/qt_renderercommon.hpp b/src/qt/qt_renderercommon.hpp
index bbda9516b..6bfa51a8d 100644
--- a/src/qt/qt_renderercommon.hpp
+++ b/src/qt/qt_renderercommon.hpp
@@ -4,6 +4,7 @@
#include
#include
#include
+#include
#include
#include
@@ -40,6 +41,7 @@ public:
virtual bool rendererTakeScreenshot() { return false; }
int r_monitor_index = 0;
+ QRectF destinationF = QRectF(0, 0, 1, 1); /* normalized to 0.0-1.0 range. */
protected:
bool eventDelegate(QEvent *event, bool &result);
@@ -49,5 +51,7 @@ protected:
QRect destination;
QWidget *parentWidget { nullptr };
+ double pixelRatio = 1.0;
+
std::vector buf_usage;
};
diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp
index aed932e92..431b3609b 100644
--- a/src/qt/qt_rendererstack.cpp
+++ b/src/qt/qt_rendererstack.cpp
@@ -39,6 +39,7 @@
#include
#include
#include
+#include
#ifdef __APPLE__
# include
@@ -375,7 +376,7 @@ RendererStack::createRenderer(Renderer renderer)
try {
hw = new VulkanWindowRenderer(this);
} catch (std::runtime_error &e) {
- auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", e.what() + QString("\nFalling back to software rendering."), QMessageBox::Ok);
+ auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", e.what() + tr("\nFalling back to software rendering."), QMessageBox::Ok);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->show();
imagebufs = {};
@@ -393,7 +394,7 @@ RendererStack::createRenderer(Renderer renderer)
});
connect(hw, &VulkanWindowRenderer::errorInitializing, [=]() {
/* Renderer could not initialize, fallback to software. */
- auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", QString("Failed to initialize Vulkan renderer.\nFalling back to software rendering."), QMessageBox::Ok);
+ auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", tr("Failed to initialize Vulkan renderer.") % tr("\nFalling back to software rendering."), QMessageBox::Ok);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->show();
imagebufs = {};
@@ -487,6 +488,17 @@ RendererStack::event(QEvent* event)
mouse_y_abs = (mouse_event->localPos().y()) / (double)height();
if (!mouse_tablet_in_proximity)
mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity;
+ mouse_x_abs -= rendererWindow->destinationF.left();
+ mouse_y_abs -= rendererWindow->destinationF.top();
+
+ if (mouse_x_abs < 0) mouse_x_abs = 0;
+ if (mouse_y_abs < 0) mouse_y_abs = 0;
+
+ mouse_x_abs /= rendererWindow->destinationF.width();
+ mouse_y_abs /= rendererWindow->destinationF.height();
+
+ if (mouse_x_abs > 1) mouse_x_abs = 1;
+ if (mouse_y_abs > 1) mouse_y_abs = 1;
}
return QStackedWidget::event(event);
}
@@ -495,12 +507,34 @@ RendererStack::event(QEvent* event)
if (mouse_input_mode == 0) {
mouse_x_abs = (mouse_event->localPos().x()) / (double)width();
mouse_y_abs = (mouse_event->localPos().y()) / (double)height();
+ mouse_x_abs -= rendererWindow->destinationF.left();
+ mouse_y_abs -= rendererWindow->destinationF.top();
+
+ if (mouse_x_abs < 0) mouse_x_abs = 0;
+ if (mouse_y_abs < 0) mouse_y_abs = 0;
+
+ mouse_x_abs /= rendererWindow->destinationF.width();
+ mouse_y_abs /= rendererWindow->destinationF.height();
+
+ if (mouse_x_abs > 1) mouse_x_abs = 1;
+ if (mouse_y_abs > 1) mouse_y_abs = 1;
return QStackedWidget::event(event);
}
#endif
mouse_x_abs = (mouse_event->localPos().x()) / (double)width();
mouse_y_abs = (mouse_event->localPos().y()) / (double)height();
+ mouse_x_abs -= rendererWindow->destinationF.left();
+ mouse_y_abs -= rendererWindow->destinationF.top();
+
+ if (mouse_x_abs < 0) mouse_x_abs = 0;
+ if (mouse_y_abs < 0) mouse_y_abs = 0;
+
+ mouse_x_abs /= rendererWindow->destinationF.width();
+ mouse_y_abs /= rendererWindow->destinationF.height();
+
+ if (mouse_x_abs > 1) mouse_x_abs = 1;
+ if (mouse_y_abs > 1) mouse_y_abs = 1;
mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity;
} else switch (event->type()) {
case QEvent::TouchBegin:
@@ -510,8 +544,19 @@ RendererStack::event(QEvent* event)
QTouchEvent* touchevent = (QTouchEvent*)event;
if (mouse_input_mode == 0) break;
if (touchevent->touchPoints().count()) {
- mouse_x_abs = (touchevent->touchPoints()[0].pos().x()) / (double)width();
- mouse_y_abs = (touchevent->touchPoints()[0].pos().y()) / (double)height();
+ mouse_x_abs = (touchevent->touchPoints()[0].pos().x()) / (double)width();
+ mouse_y_abs = (touchevent->touchPoints()[0].pos().y()) / (double)height();
+ mouse_x_abs -= rendererWindow->destinationF.left();
+ mouse_y_abs -= rendererWindow->destinationF.top();
+
+ if (mouse_x_abs < 0) mouse_x_abs = 0;
+ if (mouse_y_abs < 0) mouse_y_abs = 0;
+
+ mouse_x_abs /= rendererWindow->destinationF.width();
+ mouse_y_abs /= rendererWindow->destinationF.height();
+
+ if (mouse_x_abs > 1) mouse_x_abs = 1;
+ if (mouse_y_abs > 1) mouse_y_abs = 1;
}
mouse_set_buttons_ex(mouse_get_buttons_ex() | 1);
touchevent->accept();
@@ -520,8 +565,19 @@ RendererStack::event(QEvent* event)
QTouchEvent* touchevent = (QTouchEvent*)event;
if (mouse_input_mode == 0) break;
if (touchevent->pointCount()) {
- mouse_x_abs = (touchevent->point(0).position().x()) / (double)width();
- mouse_y_abs = (touchevent->point(0).position().y()) / (double)height();
+ mouse_x_abs = (touchevent->point(0).position().x()) / (double)width();
+ mouse_y_abs = (touchevent->point(0).position().y()) / (double)height();
+ mouse_x_abs -= rendererWindow->destinationF.left();
+ mouse_y_abs -= rendererWindow->destinationF.top();
+
+ if (mouse_x_abs < 0) mouse_x_abs = 0;
+ if (mouse_y_abs < 0) mouse_y_abs = 0;
+
+ mouse_x_abs /= rendererWindow->destinationF.width();
+ mouse_y_abs /= rendererWindow->destinationF.height();
+
+ if (mouse_x_abs > 1) mouse_x_abs = 1;
+ if (mouse_y_abs > 1) mouse_y_abs = 1;
}
mouse_set_buttons_ex(mouse_get_buttons_ex() | 1);
touchevent->accept();
@@ -537,6 +593,17 @@ RendererStack::event(QEvent* event)
if (touchevent->touchPoints().count()) {
mouse_x_abs = (touchevent->touchPoints()[0].pos().x()) / (double)width();
mouse_y_abs = (touchevent->touchPoints()[0].pos().y()) / (double)height();
+ mouse_x_abs -= rendererWindow->destinationF.left();
+ mouse_y_abs -= rendererWindow->destinationF.top();
+
+ if (mouse_x_abs < 0) mouse_x_abs = 0;
+ if (mouse_y_abs < 0) mouse_y_abs = 0;
+
+ mouse_x_abs /= rendererWindow->destinationF.width();
+ mouse_y_abs /= rendererWindow->destinationF.height();
+
+ if (mouse_x_abs > 1) mouse_x_abs = 1;
+ if (mouse_y_abs > 1) mouse_y_abs = 1;
}
mouse_set_buttons_ex(mouse_get_buttons_ex() & ~1);
touchevent->accept();
@@ -547,6 +614,17 @@ RendererStack::event(QEvent* event)
if (touchevent->pointCount()) {
mouse_x_abs = (touchevent->point(0).position().x()) / (double)width();
mouse_y_abs = (touchevent->point(0).position().y()) / (double)height();
+ mouse_x_abs -= rendererWindow->destinationF.left();
+ mouse_y_abs -= rendererWindow->destinationF.top();
+
+ if (mouse_x_abs < 0) mouse_x_abs = 0;
+ if (mouse_y_abs < 0) mouse_y_abs = 0;
+
+ mouse_x_abs /= rendererWindow->destinationF.width();
+ mouse_y_abs /= rendererWindow->destinationF.height();
+
+ if (mouse_x_abs > 1) mouse_x_abs = 1;
+ if (mouse_y_abs > 1) mouse_y_abs = 1;
}
mouse_set_buttons_ex(mouse_get_buttons_ex() & ~1);
touchevent->accept();
diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp
index 52d737ae6..5e0ec7bed 100644
--- a/src/qt/qt_settingsfloppycdrom.cpp
+++ b/src/qt/qt_settingsfloppycdrom.cpp
@@ -200,7 +200,7 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent)
(cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) {
QString name = CDROMName(j);
Models::AddEntry(modelType, name, j);
- if ((cdrom[cdromIdx].bus_type == bus_type) && (cdrom[cdromIdx].type == j))
+ if (cdrom[cdromIdx].type == j)
selectedTypeRow = eligibleRows;
++eligibleRows;
}
@@ -256,9 +256,9 @@ SettingsFloppyCDROM::onFloppyRowChanged(const QModelIndex ¤t)
void
SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t)
{
- uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt();
- uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt();
- int type = current.siblingAtColumn(2).data(Qt::UserRole).toInt();
+ uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt();
+ uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt();
+ uint32_t type = current.siblingAtColumn(2).data(Qt::UserRole).toUInt();
ui->comboBoxBus->setCurrentIndex(-1);
auto* model = ui->comboBoxBus->model();
@@ -279,7 +279,29 @@ SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t)
ui->comboBoxSpeed->setEnabled(false);
ui->comboBoxSpeed->setCurrentIndex(speed == 0 ? 7 : speed - 1);
- ui->comboBoxCDROMType->setCurrentIndex(type);
+ auto *modelType = ui->comboBoxCDROMType->model();
+ int removeRows = modelType->rowCount();
+
+ uint32_t j = 0;
+ int selectedTypeRow = 0;
+ int eligibleRows = 0;
+ while (cdrom_drive_types[j].bus_type != BUS_TYPE_NONE) {
+ if (((bus == CDROM_BUS_ATAPI) || (bus == CDROM_BUS_SCSI)) &&
+ ((cdrom_drive_types[j].bus_type == bus) ||
+ (cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) {
+ QString name = CDROMName(j);
+ Models::AddEntry(modelType, name, j);
+ if (type == j)
+ selectedTypeRow = eligibleRows;
+ ++eligibleRows;
+ }
+ ++j;
+ }
+ modelType->removeRows(0, removeRows);
+ ui->comboBoxCDROMType->setEnabled(eligibleRows > 1);
+ ui->comboBoxCDROMType->setCurrentIndex(-1);
+ ui->comboBoxCDROMType->setCurrentIndex(selectedTypeRow);
+
enableCurrentlySelectedChannel();
}
@@ -371,7 +393,7 @@ SettingsFloppyCDROM::on_comboBoxBus_activated(int)
(cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) {
QString name = CDROMName(j);
Models::AddEntry(modelType, name, j);
- if ((cdrom[cdromIdx].bus_type == bus_type) && (cdrom[cdromIdx].type == j))
+ if (cdrom[cdromIdx].type == j)
selectedTypeRow = eligibleRows;
++eligibleRows;
}
diff --git a/src/qt/qt_settingsharddisks.ui b/src/qt/qt_settingsharddisks.ui
index 3ae20fee1..ea69edc5b 100644
--- a/src/qt/qt_settingsharddisks.ui
+++ b/src/qt/qt_settingsharddisks.ui
@@ -78,7 +78,7 @@
-
- Speed:
+ Model:
diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp
index 34968b288..939cd9eb2 100644
--- a/src/qt/qt_settingsmachine.cpp
+++ b/src/qt/qt_settingsmachine.cpp
@@ -69,7 +69,7 @@ SettingsMachine::SettingsMachine(QWidget *parent)
waitStatesModel->setData(idx, 0, Qt::UserRole);
for (int i = 0; i < 8; ++i) {
idx = waitStatesModel->index(i + 1, 0);
- waitStatesModel->setData(idx, QString::asprintf(tr("%i Wait state(s)").toUtf8().constData(), i), Qt::DisplayRole);
+ waitStatesModel->setData(idx, tr("%1 Wait state(s)").arg(i), Qt::DisplayRole);
waitStatesModel->setData(idx, i + 1, Qt::UserRole);
}
diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp
index a0acd7a3f..9a53411d5 100644
--- a/src/qt/qt_settingsnetwork.cpp
+++ b/src/qt/qt_settingsnetwork.cpp
@@ -137,54 +137,63 @@ SettingsNetwork::onCurrentMachineChanged(int machineId)
{
this->machineId = machineId;
- int c = 0;
- int selectedRow = 0;
+ int c = 0;
+ int selectedRow = 0;
- for (int i = 0; i < NET_CARD_MAX; ++i) {
- auto *cbox = findChild(QString("comboBoxNIC%1").arg(i + 1));
- auto *model = cbox->model();
- auto removeRows = model->rowCount();
- c = 0;
- selectedRow = 0;
+ // Network Card
+ QComboBox * cbox_[NET_CARD_MAX] = { 0 };
+ QAbstractItemModel *models[NET_CARD_MAX] = { 0 };
+ int removeRows_[NET_CARD_MAX] = { 0 };
+ int selectedRows[NET_CARD_MAX] = { 0 };
+ int m_has_net = machine_has_flags(machineId, MACHINE_NIC);
- while (true) {
- /* Skip "internal" if machine doesn't have it or this is not the primary card. */
- if ((c == 1) && ((i > 0) || (machine_has_flags(machineId, MACHINE_NIC) == 0))) {
- c++;
- continue;
- }
+ for (uint8_t i = 0; i < NET_CARD_MAX; ++i) {
+ cbox_[i] = findChild(QString("comboBoxNIC%1").arg(i + 1));
+ models[i] = cbox_[i]->model();
+ removeRows_[i] = models[i]->rowCount();
+ }
- auto name = DeviceConfig::DeviceName(network_card_getdevice(c), network_card_get_internal_name(c), 1);
- if (name.isEmpty()) {
- break;
- }
+ c = 0;
+ while (true) {
+ const QString name = DeviceConfig::DeviceName(network_card_getdevice(c),
+ network_card_get_internal_name(c), 1);
- if (network_card_available(c) && device_is_valid(network_card_getdevice(c), machineId)) {
- int row = Models::AddEntry(model, name, c);
- if (c == net_cards_conf[i].device_num) {
- selectedRow = row - removeRows;
+ if (name.isEmpty())
+ break;
+
+ if (network_card_available(c)) {
+ if (device_is_valid(network_card_getdevice(c), machineId)) {
+ for (uint8_t i = 0; i < NET_CARD_MAX; ++i) {
+ if ((c != 1) || ((i == 0) && m_has_net)) {
+ int row = Models::AddEntry(models[i], name, c);
+
+ if (c == net_cards_conf[i].device_num)
+ selectedRows[i] = row - removeRows_[i];
+ }
}
}
- c++;
}
- model->removeRows(0, removeRows);
- cbox->setEnabled(model->rowCount() > 0);
- cbox->setCurrentIndex(-1);
- cbox->setCurrentIndex(selectedRow);
+ c++;
+ }
- cbox = findChild(QString("comboBoxNet%1").arg(i + 1));
- model = cbox->model();
- removeRows = model->rowCount();
+ for (uint8_t i = 0; i < NET_CARD_MAX; ++i) {
+ models[i]->removeRows(0, removeRows_[i]);
+ cbox_[i]->setEnabled(models[i]->rowCount() > 1);
+ cbox_[i]->setCurrentIndex(-1);
+ cbox_[i]->setCurrentIndex(selectedRows[i]);
+
+ auto cbox = findChild(QString("comboBoxNet%1").arg(i + 1));
+ auto model = cbox->model();
+ auto removeRows = model->rowCount();
Models::AddEntry(model, tr("Null Driver"), NET_TYPE_NONE);
Models::AddEntry(model, "SLiRP", NET_TYPE_SLIRP);
- if (network_ndev > 1) {
+ if (network_ndev > 1)
Models::AddEntry(model, "PCap", NET_TYPE_PCAP);
- }
- if (network_devmap.has_vde) {
+
+ if (network_devmap.has_vde)
Models::AddEntry(model, "VDE", NET_TYPE_VDE);
- }
model->removeRows(0, removeRows);
cbox->setCurrentIndex(cbox->findData(net_cards_conf[i].net_type));
@@ -205,6 +214,7 @@ SettingsNetwork::onCurrentMachineChanged(int machineId)
model->removeRows(0, removeRows);
cbox->setCurrentIndex(selectedRow);
}
+
if (net_cards_conf[i].net_type == NET_TYPE_VDE) {
QString currentVdeSocket = net_cards_conf[i].host_dev_name;
auto editline = findChild(QString("socketVDENIC%1").arg(i+1));
diff --git a/src/qt/qt_settingsotherperipherals.cpp b/src/qt/qt_settingsotherperipherals.cpp
index a7db551ad..b780dc1a6 100644
--- a/src/qt/qt_settingsotherperipherals.cpp
+++ b/src/qt/qt_settingsotherperipherals.cpp
@@ -83,31 +83,45 @@ SettingsOtherPeripherals::onCurrentMachineChanged(int machineId)
ui->comboBoxRTC->setCurrentIndex(selectedRow);
ui->pushButtonConfigureRTC->setEnabled((isartc_type != 0) && isartc_has_config(isartc_type) && machineHasIsa);
- for (int c = 0; c < ISAMEM_MAX; c++) {
- auto *cbox = findChild(QString("comboBoxCard%1").arg(c + 1));
- model = cbox->model();
- d = 0;
- selectedRow = 0;
- while (true) {
- QString name = DeviceConfig::DeviceName(isamem_get_device(d), isamem_get_internal_name(d), 0);
- if (name.isEmpty()) {
- break;
- }
+ // ISA Memory Expansion Card
+ QComboBox * cbox[ISAMEM_MAX] = { 0 };
+ QAbstractItemModel *models[ISAMEM_MAX] = { 0 };
+ int removeRows_[ISAMEM_MAX] = { 0 };
+ int selectedRows[ISAMEM_MAX] = { 0 };
- if (!device_is_valid(isamem_get_device(d), machineId)) {
- break;
- }
+ for (uint8_t c = 0; c < ISAMEM_MAX; ++c) {
+ cbox[c] = findChild(QString("comboBoxCard%1").arg(c + 1));
+ models[c] = cbox[c]->model();
+ removeRows_[c] = models[c]->rowCount();
+ }
- int row = Models::AddEntry(model, name, d);
- if (d == isamem_type[c]) {
- selectedRow = row;
+ d = 0;
+ while (true) {
+ const QString name = DeviceConfig::DeviceName(isamem_get_device(d),
+ isamem_get_internal_name(d), 0);
+
+ if (name.isEmpty())
+ break;
+
+ if (device_is_valid(isamem_get_device(d), machineId)) {
+ for (uint8_t c = 0; c < ISAMEM_MAX; ++c) {
+ int row = Models::AddEntry(models[c], name, d);
+
+ if (d == isamem_type[c])
+ selectedRows[c] = row - removeRows_[c];
}
- ++d;
}
- cbox->setCurrentIndex(-1);
- cbox->setCurrentIndex(selectedRow);
- cbox->setEnabled(machineHasIsa);
- findChild(QString("pushButtonConfigureCard%1").arg(c + 1))->setEnabled((isamem_type[c] != 0) && isamem_has_config(isamem_type[c]) && machineHasIsa);
+
+ d++;
+ }
+
+ for (uint8_t c = 0; c < ISAMEM_MAX; ++c) {
+ models[c]->removeRows(0, removeRows_[c]);
+ cbox[c]->setEnabled(models[c]->rowCount() > 1);
+ cbox[c]->setCurrentIndex(-1);
+ cbox[c]->setCurrentIndex(selectedRows[c]);
+ findChild(QString("pushButtonConfigureCard%1").arg(c + 1))->setEnabled((isamem_type[c] != 0) &&
+ isamem_has_config(isamem_type[c]) && machineHasIsa);
}
}
diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp
index cb1ab794a..f68106dc9 100644
--- a/src/qt/qt_settingsports.cpp
+++ b/src/qt/qt_settingsports.cpp
@@ -73,34 +73,49 @@ SettingsPorts::onCurrentMachineChanged(int machineId)
{
this->machineId = machineId;
- for (int i = 0; i < PARALLEL_MAX; i++) {
- auto *cbox = findChild(QString("comboBoxLpt%1").arg(i + 1));
- auto *model = cbox->model();
- const auto removeRows = model->rowCount();
- int c = 0;
- int selectedRow = 0;
- while (true) {
- const char *lptName = lpt_device_get_name(c);
- if (lptName == nullptr) {
- break;
- }
+ int c = 0;
- int row = Models::AddEntry(model, tr(lptName), c);
- if (c == lpt_ports[i].device) {
- selectedRow = row - removeRows;
- }
- c++;
+ // LPT Device
+ QComboBox * cbox[PARALLEL_MAX] = { 0 };
+ QAbstractItemModel *models[PARALLEL_MAX] = { 0 };
+ int removeRows_[PARALLEL_MAX] = { 0 };
+ int selectedRows[PARALLEL_MAX] = { 0 };
+
+ for (uint8_t i = 0; i < PARALLEL_MAX; ++i) {
+ cbox[i] = findChild(QString("comboBoxLpt%1").arg(i + 1));
+ models[i] = cbox[i]->model();
+ removeRows_[i] = models[i]->rowCount();
+ }
+
+ while (true) {
+ const char *lptName = lpt_device_get_name(c);
+
+ if (lptName == nullptr)
+ break;
+
+ const QString name = tr(lptName);
+
+ for (uint8_t i = 0; i < PARALLEL_MAX; ++i) {
+ int row = Models::AddEntry(models[i], name, c);
+
+ if (c == lpt_ports[i].device)
+ selectedRows[i] = row - removeRows_[i];
}
- model->removeRows(0, removeRows);
- cbox->setEnabled(model->rowCount() > 0);
- cbox->setCurrentIndex(-1);
- cbox->setCurrentIndex(selectedRow);
+
+ c++;
+ }
+
+ for (uint8_t i = 0; i < PARALLEL_MAX; ++i) {
+ models[i]->removeRows(0, removeRows_[i]);
+ cbox[i]->setEnabled(models[i]->rowCount() > 1);
+ cbox[i]->setCurrentIndex(-1);
+ cbox[i]->setCurrentIndex(selectedRows[i]);
auto *checkBox = findChild(QString("checkBoxParallel%1").arg(i + 1));
if (checkBox != NULL)
checkBox->setChecked(lpt_ports[i].enabled > 0);
- if (cbox != NULL)
- cbox->setEnabled(lpt_ports[i].enabled > 0);
+ if (cbox[i] != NULL)
+ cbox[i]->setEnabled(lpt_ports[i].enabled > 0);
}
for (int i = 0; i < SERIAL_MAX; i++) {
diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp
index cca903076..3e1240888 100644
--- a/src/qt/qt_settingssound.cpp
+++ b/src/qt/qt_settingssound.cpp
@@ -73,46 +73,51 @@ SettingsSound::onCurrentMachineChanged(const int machineId)
{
this->machineId = machineId;
- int c;
- int selectedRow;
+ int c;
+ int selectedRow;
// Sound Card
+ QComboBox * cbox[SOUND_CARD_MAX] = { 0 };
+ QAbstractItemModel *models[SOUND_CARD_MAX] = { 0 };
+ int removeRows_[SOUND_CARD_MAX] = { 0 };
+ int selectedRows[SOUND_CARD_MAX] = { 0 };
+ int m_has_snd = machine_has_flags(machineId, MACHINE_SOUND);
+
for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) {
- QComboBox *cbox = findChild(QString("comboBoxSoundCard%1").arg(i + 1));
- c = 0;
- auto model = cbox->model();
- auto removeRows = model->rowCount();
- selectedRow = 0;
+ cbox[i] = findChild(QString("comboBoxSoundCard%1").arg(i + 1));
+ models[i] = cbox[i]->model();
+ removeRows_[i] = models[i]->rowCount();
+ }
- while (true) {
- /* Skip "internal" if machine doesn't have it or this is not the primary card. */
- if ((c == 1) && ((i > 0) || (machine_has_flags(machineId, MACHINE_SOUND) == 0))) {
- c++;
- continue;
- }
+ c = 0;
+ while (true) {
+ const QString name = DeviceConfig::DeviceName(sound_card_getdevice(c),
+ sound_card_get_internal_name(c), 1);
- const QString name = DeviceConfig::DeviceName(sound_card_getdevice(c), sound_card_get_internal_name(c), 1);
- if (name.isEmpty()) {
- break;
- }
+ if (name.isEmpty())
+ break;
- if (sound_card_available(c)) {
- const device_t *sound_dev = sound_card_getdevice(c);
- if (device_is_valid(sound_dev, machineId)) {
- int row = Models::AddEntry(model, name, c);
- if (c == sound_card_current[i]) {
- selectedRow = row - removeRows;
+ if (sound_card_available(c)) {
+ if (device_is_valid(sound_card_getdevice(c), machineId)) {
+ for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) {
+ if ((c != 1) || ((i == 0) && m_has_snd)) {
+ int row = Models::AddEntry(models[i], name, c);
+
+ if (c == sound_card_current[i])
+ selectedRows[i] = row - removeRows_[i];
}
}
}
-
- c++;
}
- model->removeRows(0, removeRows);
- cbox->setEnabled(model->rowCount() > 0);
- cbox->setCurrentIndex(-1);
- cbox->setCurrentIndex(selectedRow);
+ c++;
+ }
+
+ for (uint8_t i = 0; i < SOUND_CARD_MAX; ++i) {
+ models[i]->removeRows(0, removeRows_[i]);
+ cbox[i]->setEnabled(models[i]->rowCount() > 1);
+ cbox[i]->setCurrentIndex(-1);
+ cbox[i]->setCurrentIndex(selectedRows[i]);
}
// Midi Out
diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp
index 4adfe1546..9bd1bda6f 100644
--- a/src/qt/qt_settingsstoragecontrollers.cpp
+++ b/src/qt/qt_settingsstoragecontrollers.cpp
@@ -171,35 +171,45 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId)
ui->comboBoxCDInterface->setCurrentIndex(-1);
ui->comboBoxCDInterface->setCurrentIndex(selectedRow);
+ // SCSI Card
+ QComboBox * cbox[SCSI_CARD_MAX] = { 0 };
+ QAbstractItemModel *models[SCSI_CARD_MAX] = { 0 };
+ int removeRows_[SCSI_CARD_MAX] = { 0 };
+ int selectedRows[SCSI_CARD_MAX] = { 0 };
+
for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) {
- QComboBox *cbox = findChild(QString("comboBoxSCSI%1").arg(i + 1));
- c = 0;
- model = cbox->model();
- removeRows = model->rowCount();
- selectedRow = 0;
+ cbox[i] = findChild(QString("comboBoxSCSI%1").arg(i + 1));
+ models[i] = cbox[i]->model();
+ removeRows_[i] = models[i]->rowCount();
+ }
- while (true) {
- QString name = DeviceConfig::DeviceName(scsi_card_getdevice(c), scsi_card_get_internal_name(c), 1);
- if (name.isEmpty()) {
- break;
- }
+ c = 0;
+ while (true) {
+ const QString name = DeviceConfig::DeviceName(scsi_card_getdevice(c),
+ scsi_card_get_internal_name(c), 1);
- if (scsi_card_available(c)) {
- const device_t *scsi_dev = scsi_card_getdevice(c);
- if (device_is_valid(scsi_dev, machineId)) {
- int row = Models::AddEntry(model, name, c);
- if (c == scsi_card_current[i]) {
- selectedRow = row - removeRows;
- }
+ if (name.isEmpty())
+ break;
+
+ if (scsi_card_available(c)) {
+ if (device_is_valid(scsi_card_getdevice(c), machineId)) {
+ for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) {
+ int row = Models::AddEntry(models[i], name, c);
+
+ if (c == scsi_card_current[i])
+ selectedRows[i] = row - removeRows_[i];
}
}
- c++;
}
- model->removeRows(0, removeRows);
- cbox->setEnabled(model->rowCount() > 0);
- cbox->setCurrentIndex(-1);
- cbox->setCurrentIndex(selectedRow);
+ c++;
+ }
+
+ for (uint8_t i = 0; i < SCSI_CARD_MAX; ++i) {
+ models[i]->removeRows(0, removeRows_[i]);
+ cbox[i]->setEnabled(models[i]->rowCount() > 1);
+ cbox[i]->setCurrentIndex(-1);
+ cbox[i]->setCurrentIndex(selectedRows[i]);
}
int is_at = IS_AT(machineId);
diff --git a/src/qt/qt_vulkanrenderer.cpp b/src/qt/qt_vulkanrenderer.cpp
index 39830569c..2306661ec 100644
--- a/src/qt/qt_vulkanrenderer.cpp
+++ b/src/qt/qt_vulkanrenderer.cpp
@@ -970,17 +970,11 @@ VulkanRenderer2::startNextFrame()
m_devFuncs->vkCmdBindVertexBuffers(cb, 0, 1, &m_buf, &vbOffset);
VkViewport viewport;
- if (dpi_scale) {
- viewport.x = destination.x() * m_window->devicePixelRatio();
- viewport.y = destination.y() * m_window->devicePixelRatio();
- viewport.width = destination.width() * m_window->devicePixelRatio();
- viewport.height = destination.height() * m_window->devicePixelRatio();
- } else {
- viewport.x = destination.x();
- viewport.y = destination.y();
- viewport.width = destination.width();
- viewport.height = destination.height();
- }
+ viewport.x = destination.x();
+ viewport.y = destination.y();
+ viewport.width = destination.width();
+ viewport.height = destination.height();
+
viewport.minDepth = 0;
viewport.maxDepth = 1;
m_devFuncs->vkCmdSetViewport(cb, 0, 1, &viewport);
diff --git a/src/qt/qt_vulkanwindowrenderer.cpp b/src/qt/qt_vulkanwindowrenderer.cpp
index ab46b5961..d0fbb39a3 100644
--- a/src/qt/qt_vulkanwindowrenderer.cpp
+++ b/src/qt/qt_vulkanwindowrenderer.cpp
@@ -846,6 +846,7 @@ VulkanWindowRenderer::createRenderer()
void
VulkanWindowRenderer::resizeEvent(QResizeEvent *event)
{
+ this->pixelRatio = devicePixelRatio();
onResize(width(), height());
QVulkanWindow::resizeEvent(event);
@@ -868,8 +869,10 @@ VulkanWindowRenderer::onBlit(int buf_idx, int x, int y, int w, int h)
if (isExposed())
requestUpdate();
buf_usage[0].clear();
- if (origSource != source)
+ if (origSource != source) {
+ this->pixelRatio = devicePixelRatio();
onResize(this->width(), this->height());
+ }
}
uint32_t
diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c
index 9ae65be74..246f185e8 100644
--- a/src/scsi/scsi_cdrom.c
+++ b/src/scsi/scsi_cdrom.c
@@ -680,8 +680,7 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev)
/* Seek time is in us. */
period = cdrom_seek_time(dev->drv);
- scsi_cdrom_log(dev->log, "Seek period: %" PRIu64 " us\n",
- (uint64_t) period);
+ scsi_cdrom_log(dev->log, "Seek period: %lf us\n", period);
dev->callback += period;
/* 44100 * 16 bits * 2 channels = 176400 bytes per second */
@@ -696,21 +695,17 @@ scsi_cdrom_set_period(scsi_cdrom_t *dev)
}
period = 1000000.0 / bytes_per_second;
- scsi_cdrom_log(dev->log, "Byte transfer period: %" PRIu64 " us\n",
- (uint64_t) period);
+ scsi_cdrom_log(dev->log, "Byte transfer period: %lf us\n", period);
if (dev->was_cached == -1)
period *= (double) dev->packet_len;
else {
const int num = ((dev->drv->bus_type == CDROM_BUS_SCSI) ||
- (dev->block_len == 0)) ?
- dev->requested_blocks :
- ((scsi_cdrom_current_mode(dev) == 2) ? 1 :
- (dev->packet_len / dev->block_len));
+ (dev->block_len == 0)) ? dev->sectors_num :
+ ((scsi_cdrom_current_mode(dev) == 2) ? 1 : dev->sectors_num);
period *= ((double) num) * 2352.0;
}
- scsi_cdrom_log(dev->log, "Sector transfer period: %" PRIu64 " us\n",
- (uint64_t) period);
+ scsi_cdrom_log(dev->log, "Sector transfer period: %lf us\n", period);
dev->callback += period;
}
scsi_cdrom_set_callback(dev);
@@ -800,7 +795,10 @@ scsi_cdrom_data_command_finish(scsi_cdrom_t *dev, int len, int block_len, int al
scsi_cdrom_command_write_dma(dev);
} else {
scsi_cdrom_update_request_length(dev, len, block_len);
- if (direction == 0)
+ if ((dev->drv->bus_type != CDROM_BUS_SCSI) &&
+ (dev->tf->request_length == 0))
+ scsi_cdrom_command_complete(dev);
+ else if (direction == 0)
scsi_cdrom_command_read(dev);
else
scsi_cdrom_command_write(dev);
@@ -1048,6 +1046,8 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int
int num = (dev->drv->bus_type == CDROM_BUS_SCSI) ?
dev->requested_blocks : 1;
+ dev->sectors_num = 0;
+
if (dev->drv->cd_status == CD_STATUS_EMPTY)
scsi_cdrom_not_ready(dev);
else if (dev->sector_pos > dev->drv->cdrom_capacity) {
@@ -1055,7 +1055,7 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int
ret = -1;
} else {
ret = 1;
- for (int i = 0; (i < num) && (ret > 0); i++) {
+ for (int i = 0; (i < num) && (ret > 0) && (dev->sector_len > 0); i++) {
ret = cdrom_readsector_raw(dev->drv, dev->buffer + dev->buffer_pos,
dev->sector_pos, msf, type,
flags, &temp_len, vendor_type);
@@ -1070,7 +1070,11 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int
if ((dev->drv->bus_type != CDROM_BUS_SCSI) &&
(scsi_cdrom_current_mode(dev) != 2)) {
- num = (dev->packet_len / dev->block_len);
+ num = (dev->tf->request_length < dev->block_len) ?
+ dev->block_len : dev->tf->request_length;
+ num = (num / dev->block_len) * dev->block_len;
+ if (num > dev->sector_len)
+ num = dev->sector_len;
}
}
@@ -1078,6 +1082,7 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int
dev->drv->seek_pos = dev->sector_pos;
dev->sector_len--;
+ dev->sectors_num++;
dev->buffer_pos += temp_len;
}
@@ -2416,6 +2421,7 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb)
int32_t *BufLen;
dev->was_cached = -1;
+ dev->sectors_num = 1;
if (dev->drv->bus_type == CDROM_BUS_SCSI) {
BufLen = &scsi_devices[scsi_bus][scsi_id].buffer_length;
diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c
index 8528db1fb..0a035a23d 100644
--- a/src/scsi/scsi_disk.c
+++ b/src/scsi/scsi_disk.c
@@ -570,7 +570,10 @@ scsi_disk_data_command_finish(scsi_disk_t *dev, int len, const int block_len,
scsi_disk_command_write_dma(dev);
} else {
scsi_disk_update_request_length(dev, len, block_len);
- if (direction == 0)
+ if ((dev->drv->bus_type != HDD_BUS_SCSI) &&
+ (dev->tf->request_length == 0))
+ scsi_disk_command_complete(dev);
+ else if (direction == 0)
scsi_disk_command_read(dev);
else
scsi_disk_command_write(dev);
diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c
index c500abfbc..6f0b7aacb 100644
--- a/src/scsi/scsi_spock.c
+++ b/src/scsi/scsi_spock.c
@@ -1050,7 +1050,7 @@ spock_callback(void *priv)
spock_execute_cmd(scsi, scb);
}
- if (scsi->attention_wait) {
+ if (scsi->attention_wait && ((scsi->scb_state == 0) || (scsi->attention_pending & 0xf0) == 0xe0)) {
scsi->attention_wait--;
if (!scsi->attention_wait) {
scsi->attention = scsi->attention_pending;
diff --git a/src/scsi/scsi_t128.c b/src/scsi/scsi_t128.c
index 3f273d1bb..94166054c 100644
--- a/src/scsi/scsi_t128.c
+++ b/src/scsi/scsi_t128.c
@@ -130,12 +130,12 @@ t128_read(uint32_t addr, void *priv)
(t128->host_pos < MIN(512, dev->buffer_length))) {
ret = t128->buffer[t128->host_pos++];
- t128_log("T128 Read transfer: pos=%i, addr=%x.\n",
- t128->host_pos, addr & 0x1ff);
+ t128_log("T128 Read transfer: pos=%i, addr=%x, enabled timer=%d.\n",
+ t128->host_pos, addr & 0x1ff, timer_is_enabled(&t128->timer));
if (t128->host_pos == MIN(512, dev->buffer_length)) {
- t128_log("T128 Transfer busy read, status=%02x, period=%lf, enabled=%d.\n",
- t128->status, scsi_bus->period, timer_is_enabled(&t128->timer));
+ t128_log("T128 Transfer busy read, status=%02x, period=%lf, enabled=%d, block=%d.\n",
+ t128->status, scsi_bus->period, timer_is_enabled(&t128->timer), scsi_bus->data_pos);
t128->status &= ~0x04;
if (!t128->block_loaded) {
@@ -192,10 +192,6 @@ t128_dma_send_ext(void *priv, void *ext_priv)
t128_log("T128 DMA OUT, len=%d.\n", dev->buffer_length);
memset(t128->buffer, 0, MIN(512, dev->buffer_length));
t128->host_pos = 0;
- t128->block_count = dev->buffer_length >> 9;
-
- if (dev->buffer_length < 512)
- t128->block_count = 1;
t128->block_loaded = 1;
t128->status |= 0x04;
@@ -215,10 +211,6 @@ t128_dma_initiator_receive_ext(void *priv, void *ext_priv)
t128_log("T128 DMA IN, len=%d.\n", dev->buffer_length);
memset(t128->buffer, 0, MIN(512, dev->buffer_length));
t128->host_pos = MIN(512, dev->buffer_length);
- t128->block_count = dev->buffer_length >> 9;
-
- if (dev->buffer_length < 512)
- t128->block_count = 1;
t128->block_loaded = 1;
t128->status &= ~0x04;
@@ -295,9 +287,9 @@ t128_callback(void *priv)
t128->status &= ~0x02;
t128->pos = 0;
t128->host_pos = 0;
- t128->block_count = (t128->block_count - 1) & 0xff;
+ scsi_bus->data_repeat = 0;
t128_log("T128 Remaining blocks to be written=%d\n", t128->block_count);
- if (!t128->block_count) {
+ if (scsi_bus->data_pos >= dev->buffer_length) {
t128->block_loaded = 0;
ncr->tcr |= TCR_LAST_BYTE_SENT;
ncr->isr |= STATUS_END_OF_DMA;
@@ -344,11 +336,11 @@ t128_callback(void *priv)
t128->status &= ~0x02;
t128->pos = 0;
t128->host_pos = 0;
- t128->block_count = (t128->block_count - 1) & 0xff;
- t128_log("T128 Remaining blocks to be read=%d\n", t128->block_count);
- if (!t128->block_count) {
- t128->block_loaded = 0;
+ scsi_bus->data_repeat = 0;
+ t128_log("T128 blocks read=%d, total len=%d\n", scsi_bus->data_pos, dev->buffer_length);
+ if (scsi_bus->data_pos >= dev->buffer_length) {
scsi_bus->bus_out |= BUS_REQ;
+ t128->block_loaded = 0;
timer_on_auto(&t128->timer, 10.0);
t128_log("IO End of read transfer\n");
}
@@ -472,6 +464,7 @@ t128_init(const device_t *info)
ncr->bus = scsi_get_bus();
scsi_bus = &ncr->scsibus;
+ t128->type = info->local;
if (info->flags & DEVICE_MCA) {
rom_init(&t128->bios_rom, T128_ROM,
diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt
index 0a04b0ff1..d575717a0 100644
--- a/src/sound/CMakeLists.txt
+++ b/src/sound/CMakeLists.txt
@@ -180,6 +180,9 @@ endif()
add_subdirectory(ymfm)
target_link_libraries(86Box ymfm)
+add_subdirectory(saasound)
+target_link_libraries(86Box saasound)
+
if(GUSMAX)
target_compile_definitions(snd PRIVATE USE_GUSMAX)
endif()
diff --git a/src/sound/saasound/CMakeLists.txt b/src/sound/saasound/CMakeLists.txt
new file mode 100644
index 000000000..2db75493e
--- /dev/null
+++ b/src/sound/saasound/CMakeLists.txt
@@ -0,0 +1,16 @@
+add_library(saasound OBJECT
+ SAAAmp.cpp
+ SAAAmp.h
+ SAADevice.cpp
+ SAADevice.h
+ SAAEnv.cpp
+ SAAEnv.h
+ SAAFreq.cpp
+ SAAFreq.h
+ SAAImpl.cpp
+ SAAImpl.h
+ SAANoise.cpp
+ SAANoise.h
+ SAASndC.cpp
+ SAASndC.h
+ SAASound.cpp)
\ No newline at end of file
diff --git a/src/sound/saasound/SAAAmp.cpp b/src/sound/saasound/SAAAmp.cpp
new file mode 100755
index 000000000..8f2473fb1
--- /dev/null
+++ b/src/sound/saasound/SAAAmp.cpp
@@ -0,0 +1,203 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAAAmp.cpp: implementation of the CSAAAmp class.
+// This class handles Tone/Noise mixing, Envelope application and
+// amplification.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SAASound.h"
+#include "types.h"
+#include "SAANoise.h"
+#include "SAAEnv.h"
+#include "SAAFreq.h"
+#include "SAAAmp.h"
+#include "defns.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CSAAAmp::CSAAAmp(CSAAFreq * const ToneGenerator, const CSAANoise * const NoiseGenerator, const CSAAEnv * const EnvGenerator)
+:
+m_pcConnectedToneGenerator(ToneGenerator),
+m_pcConnectedNoiseGenerator(NoiseGenerator),
+m_pcConnectedEnvGenerator(EnvGenerator),
+m_bUseEnvelope(EnvGenerator != NULL)
+{
+ leftlevel = 0;
+ leftlevela0x0e = 0;
+ rightlevel = 0;
+ rightlevela0x0e = 0;
+ m_nMixMode = 0;
+ m_bMute=true;
+ m_bSync = false;
+ m_nOutputIntermediate=0;
+ last_level_byte=0;
+ SetAmpLevel(0x00);
+
+}
+
+CSAAAmp::~CSAAAmp()
+{
+ // Nothing to do
+}
+
+void CSAAAmp::SetAmpLevel(BYTE level_byte)
+{
+ // if level unchanged since last call then do nothing
+ if (level_byte != last_level_byte)
+ {
+ last_level_byte = level_byte;
+ leftlevel = level_byte & 0x0f;
+ leftlevela0x0e = leftlevel & 0x0e;
+
+ rightlevel = (level_byte >> 4) & 0x0f;
+ rightlevela0x0e = rightlevel & 0x0e;
+ }
+
+}
+
+void CSAAAmp::SetToneMixer(BYTE bEnabled)
+{
+ if (bEnabled == 0)
+ {
+ // clear mixer bit
+ m_nMixMode &= ~(0x01);
+ }
+ else
+ {
+ // set mixer bit
+ m_nMixMode |= 0x01;
+ }
+}
+
+void CSAAAmp::SetNoiseMixer(BYTE bEnabled)
+{
+ if (bEnabled == 0)
+ {
+ m_nMixMode &= ~(0x02);
+ }
+ else
+ {
+ m_nMixMode |= 0x02;
+ }
+}
+
+void CSAAAmp::Mute(bool bMute)
+{
+ // m_bMute refers to the GLOBAL mute setting (register 28 bit 0)
+ // NOT the per-channel mixer settings !!
+ m_bMute = bMute;
+}
+
+void CSAAAmp::Sync(bool bSync)
+{
+ // m_bSync refers to the GLOBAL sync setting (register 28 bit 1)
+ m_bSync = bSync;
+}
+
+void CSAAAmp::Tick(void)
+{
+ // updates m_nOutputIntermediate to 0, 1 or 2
+ //
+
+ // connected oscillator always ticks (this isn't really connected to the amp)
+ int level = m_pcConnectedToneGenerator->Tick();
+
+ switch (m_nMixMode)
+ {
+ case 0:
+ // no tone or noise for this channel
+ m_nOutputIntermediate = 0;
+ break;
+ case 1:
+ // tone only for this channel
+ m_nOutputIntermediate = level * 2;
+ // NOTE: ConnectedToneGenerator returns either 0 or 1
+ break;
+ case 2:
+ // noise only for this channel
+ m_nOutputIntermediate = m_pcConnectedNoiseGenerator->Level() * 2;
+ // NOTE: ConnectedNoiseGenerator()->Level() returns either 0 or 1
+ break;
+ case 3:
+ // tone+noise for this channel ... mixing algorithm :
+ // tone noise output
+ // 0 0 0
+ // 1 0 2
+ // 0 1 0
+ // 1 1 1
+ // = 2 * tone - 1 * (tone & noise)
+ // = tone * (2 - noise)
+ m_nOutputIntermediate = level * (2 - m_pcConnectedNoiseGenerator->Level());
+ break;
+ }
+ // intermediate is between 0 and 2
+}
+
+inline int CSAAAmp::EffectiveAmplitude(int amp, int env) const
+{
+ // Return the effective amplitude of the low-pass-filtered result of the logical
+ // AND of the amplitude PDM and envelope PDM patterns. This is a more accurate
+ // evaluation of the SAA than simply returning amp * env , based on how the SAA
+ // implements pulse-density modulation.
+ static const int pdm[16][16] = {
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ {0,0,0,0,2,2,2,2,2,2,2,2,4,4,4,4},
+ {0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8},
+ {0,1,1,2,4,5,5,6,6,7,7,8,10,11,11,12},
+ {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
+ {0,1,2,3,6,7,8,9,10,11,12,13,16,17,18,19},
+ {0,2,3,5,6,8,9,11,12,14,15,17,18,20,21,23},
+ {0,2,3,5,8,10,11,13,14,16,17,19,22,24,25,27},
+ {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30},
+ {0,2,4,6,10,12,14,16,18,20,22,24,28,30,32,34},
+ {0,3,5,8,10,13,15,18,20,23,25,28,30,33,35,38},
+ {0,3,5,8,12,15,17,20,22,25,27,30,34,37,39,42},
+ {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45},
+ {0,3,6,9,14,17,20,23,26,29,32,35,40,43,46,49},
+ {0,4,7,11,14,18,21,25,28,32,35,39,42,46,49,53},
+ {0,4,7,11,16,20,23,27,30,34,37,41,46,50,53,57}
+ };
+
+ return(pdm[amp][env] * 4);
+}
+
+void CSAAAmp::TickAndOutputStereo(unsigned int & left, unsigned int & right)
+{
+ // This returns a value between 0 and 480 inclusive.
+ // This represents the full dynamic range of one output mixer (tone, or noise+tone, at full volume,
+ // without envelopes enabled). Note that, with envelopes enabled, the actual dynamic range
+ // is reduced on-chip to just over 88% of this (424), so the "loudest" output requires disabling envs.
+ // NB for 6 channels at full volume, with simple additive mixing, you would see a combined
+ // output of 2880, and a multiplier of 11 (=31680) fits comfortably within 16-bit signed output range.
+
+ if (m_bSync)
+ {
+ // TODO check this
+ left = right = 0;
+ return;
+ }
+
+ // first, do the Tick:
+ Tick();
+
+ // now calculate the returned amplitude for this sample:
+ ////////////////////////////////////////////////////////
+
+ if (m_bMute)
+ {
+ left = right = 0;
+ }
+ else if (m_bUseEnvelope && m_pcConnectedEnvGenerator->IsActive())
+ {
+ left = EffectiveAmplitude(m_pcConnectedEnvGenerator->LeftLevel(), leftlevela0x0e) * (2 - m_nOutputIntermediate);
+ right = EffectiveAmplitude(m_pcConnectedEnvGenerator->RightLevel(), rightlevela0x0e) * (2 - m_nOutputIntermediate);
+ }
+ else
+ {
+ left = leftlevel * m_nOutputIntermediate * 16;
+ right = rightlevel * m_nOutputIntermediate * 16;
+ }
+}
diff --git a/src/sound/saasound/SAAAmp.h b/src/sound/saasound/SAAAmp.h
new file mode 100755
index 000000000..4a6761f21
--- /dev/null
+++ b/src/sound/saasound/SAAAmp.h
@@ -0,0 +1,44 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAAAmp.h: interface for the CSAAAmp class.
+// This class handles Tone/Noise mixing, Envelope application and
+// amplification.
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAAAMP_H_INCLUDED
+#define SAAAMP_H_INCLUDED
+
+class CSAAAmp
+{
+private:
+ int leftlevel;
+ int leftlevela0x0e;
+ int rightlevel;
+ int rightlevela0x0e;
+ int m_nOutputIntermediate;
+ unsigned int m_nMixMode;
+ CSAAFreq * const m_pcConnectedToneGenerator; // not const because amp calls ->Tick()
+ const CSAANoise * const m_pcConnectedNoiseGenerator;
+ const CSAAEnv * const m_pcConnectedEnvGenerator;
+ const bool m_bUseEnvelope;
+ mutable bool m_bMute;
+ mutable bool m_bSync;
+ mutable BYTE last_level_byte;
+ int EffectiveAmplitude(int amp, int env) const;
+
+public:
+ CSAAAmp(CSAAFreq * const ToneGenerator, const CSAANoise * const NoiseGenerator, const CSAAEnv * const EnvGenerator);
+ ~CSAAAmp();
+
+ void SetAmpLevel(BYTE level_byte); // really just a BYTE
+ void SetToneMixer(BYTE bEnabled);
+ void SetNoiseMixer(BYTE bEnabled);
+ void Mute(bool bMute);
+ void Sync(bool bSync);
+ void Tick(void);
+ void TickAndOutputStereo(unsigned int & left, unsigned int & right);
+
+};
+
+#endif // SAAAMP_H_INCLUDED
diff --git a/src/sound/saasound/SAAConfig.h b/src/sound/saasound/SAAConfig.h
new file mode 100644
index 000000000..a655ec59f
--- /dev/null
+++ b/src/sound/saasound/SAAConfig.h
@@ -0,0 +1,41 @@
+// Part of SAASound copyright 2020 Dave Hooper
+//
+// SAAConfig.h: configuration file handler class
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "defns.h"
+#ifdef USE_CONFIG_FILE
+
+#ifndef SAA_CONFIG_H_INCLUDED
+#define SAA_CONFIG_H_INCLUDED
+
+#define INI_READONLY
+#define INI_ANSIONLY /*nb not really 'ANSI', this just forces all read/write to use 8-bit char*/
+#include "minIni/minIni.h"
+
+class SAAConfig
+{
+private:
+ minIni m_minIni;
+ bool m_bHasReadConfig;
+
+public:
+ bool m_bGenerateRegisterLogs;
+ bool m_bGeneratePcmLogs;
+ bool m_bGeneratePcmSeparateChannels;
+ t_string m_strRegisterLogPath;
+ t_string m_strPcmOutputPath;
+ unsigned int m_nOversample;
+ bool m_bHighpass;
+ double m_nBoost;
+
+ SAAConfig();
+ void ReadConfig();
+
+ t_string getChannelPcmOutputPath(int);
+};
+
+#endif // SAA_CONFIG_H_INCLUDED
+
+#endif // USE_CONFIG_FILE
\ No newline at end of file
diff --git a/src/sound/saasound/SAADevice.cpp b/src/sound/saasound/SAADevice.cpp
new file mode 100644
index 000000000..718b05a95
--- /dev/null
+++ b/src/sound/saasound/SAADevice.cpp
@@ -0,0 +1,392 @@
+// Part of SAASound copyright 2020 Dave Hooper
+//
+// SAADevice.cpp: connecting the subcomponents of the SAA1099 together.
+// This class handles device inputs and outputs (clocking, data and
+// address bus, and simulated output)
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SAASound.h"
+#include "types.h"
+#include "SAAEnv.h"
+#include "SAANoise.h"
+#include "SAAFreq.h"
+#include "SAAAmp.h"
+#include "SAASound.h"
+#include "SAAImpl.h"
+#include "defns.h"
+
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CSAADevice::CSAADevice()
+ :
+ m_nCurrentSaaReg(0),
+ m_bOutputEnabled(false),
+ m_bSync(false),
+ m_bHighpass(true),
+ m_nOversample(0),
+ m_Noise0(0xffffffff),
+ m_Noise1(0xffffffff),
+ m_Env0(),
+ m_Env1(),
+ m_Osc0(&m_Noise0, NULL),
+ m_Osc1(NULL, &m_Env0),
+ m_Osc2(NULL, NULL),
+ m_Osc3(&m_Noise1, NULL),
+ m_Osc4(NULL, &m_Env1),
+ m_Osc5(NULL, NULL),
+ m_Amp0(&m_Osc0, &m_Noise0, NULL),
+ m_Amp1(&m_Osc1, &m_Noise0, NULL),
+ m_Amp2(&m_Osc2, &m_Noise0, &m_Env0),
+ m_Amp3(&m_Osc3, &m_Noise1, NULL),
+ m_Amp4(&m_Osc4, &m_Noise1, NULL),
+ m_Amp5(&m_Osc5, &m_Noise1, &m_Env1)
+{
+ // Create and link up the objects that make up the emulator
+ Noise[0] = &m_Noise0;
+ Noise[1] = &m_Noise1;
+ Env[0] = &m_Env0;
+ Env[1] = &m_Env1;
+
+ // Create oscillators (tone generators) and link to noise generators and
+ // envelope controllers
+ Osc[0] = &m_Osc0;
+ Osc[1] = &m_Osc1;
+ Osc[2] = &m_Osc2;
+ Osc[3] = &m_Osc3;
+ Osc[4] = &m_Osc4;
+ Osc[5] = &m_Osc5;
+
+ // Create amplification/mixing stages and link to appropriate oscillators,
+ // noise generators and envelope controllers
+ Amp[0] = &m_Amp0;
+ Amp[1] = &m_Amp1;
+ Amp[2] = &m_Amp2;
+ Amp[3] = &m_Amp3;
+ Amp[4] = &m_Amp4;
+ Amp[5] = &m_Amp5;
+
+ _SetClockRate(EXTERNAL_CLK_HZ);
+ _SetOversample(DEFAULT_OVERSAMPLE);
+}
+
+CSAADevice::~CSAADevice()
+{
+}
+
+//////////////////////////////////////////////////////////////////////
+// CSAASound members
+//////////////////////////////////////////////////////////////////////
+
+void CSAADevice::_SetClockRate(unsigned int nClockRate)
+{
+ m_Osc0._SetClockRate(nClockRate);
+ m_Osc1._SetClockRate(nClockRate);
+ m_Osc2._SetClockRate(nClockRate);
+ m_Osc3._SetClockRate(nClockRate);
+ m_Osc4._SetClockRate(nClockRate);
+ m_Osc5._SetClockRate(nClockRate);
+ m_Noise0._SetClockRate(nClockRate);
+ m_Noise1._SetClockRate(nClockRate);
+}
+
+void CSAADevice::_SetSampleRate(unsigned int nSampleRate)
+{
+ m_Osc0._SetSampleRate(nSampleRate);
+ m_Osc1._SetSampleRate(nSampleRate);
+ m_Osc2._SetSampleRate(nSampleRate);
+ m_Osc3._SetSampleRate(nSampleRate);
+ m_Osc4._SetSampleRate(nSampleRate);
+ m_Osc5._SetSampleRate(nSampleRate);
+ m_Noise0._SetSampleRate(nSampleRate);
+ m_Noise1._SetSampleRate(nSampleRate);
+}
+
+void CSAADevice::_SetOversample(unsigned int nOversample)
+{
+ if (((int) nOversample) != m_nOversample)
+ {
+ m_nOversample = nOversample;
+ m_Osc0._SetOversample(nOversample);
+ m_Osc1._SetOversample(nOversample);
+ m_Osc2._SetOversample(nOversample);
+ m_Osc3._SetOversample(nOversample);
+ m_Osc4._SetOversample(nOversample);
+ m_Osc5._SetOversample(nOversample);
+ m_Noise0._SetOversample(nOversample);
+ m_Noise1._SetOversample(nOversample);
+ }
+}
+
+void CSAADevice::_WriteData(BYTE nData)
+{
+#if defined(DEBUG) || defined(DEBUGSAA)
+ m_Reg[m_nCurrentSaaReg] = nData;
+#endif
+
+ // route nData to the appropriate place
+ switch (m_nCurrentSaaReg)
+ {
+ // Amplitude data (==> Amp)
+ case 0:
+ m_Amp0.SetAmpLevel(nData);
+ break;
+ case 1:
+ m_Amp1.SetAmpLevel(nData);
+ break;
+ case 2:
+ m_Amp2.SetAmpLevel(nData);
+ break;
+ case 3:
+ m_Amp3.SetAmpLevel(nData);
+ break;
+ case 4:
+ m_Amp4.SetAmpLevel(nData);
+ break;
+ case 5:
+ m_Amp5.SetAmpLevel(nData);
+ break;
+
+ // Freq data (==> Osc)
+ case 8:
+ m_Osc0.SetFreqOffset(nData);
+ break;
+ case 9:
+ m_Osc1.SetFreqOffset(nData);
+ break;
+ case 10:
+ m_Osc2.SetFreqOffset(nData);
+ break;
+ case 11:
+ m_Osc3.SetFreqOffset(nData);
+ break;
+ case 12:
+ m_Osc4.SetFreqOffset(nData);
+ break;
+ case 13:
+ m_Osc5.SetFreqOffset(nData);
+ break;
+
+ // Freq octave data (==> Osc) for channels 0,1
+ case 16:
+ m_Osc0.SetFreqOctave(nData & 0x07);
+ m_Osc1.SetFreqOctave((nData >> 4) & 0x07);
+ break;
+
+ // Freq octave data (==> Osc) for channels 2,3
+ case 17:
+ m_Osc2.SetFreqOctave(nData & 0x07);
+ m_Osc3.SetFreqOctave((nData >> 4) & 0x07);
+ break;
+
+ // Freq octave data (==> Osc) for channels 4,5
+ case 18:
+ m_Osc4.SetFreqOctave(nData & 0x07);
+ m_Osc5.SetFreqOctave((nData >> 4) & 0x07);
+ break;
+
+ // Tone mixer control (==> Amp)
+ case 20:
+ m_Amp0.SetToneMixer(nData & 0x01);
+ m_Amp1.SetToneMixer(nData & 0x02);
+ m_Amp2.SetToneMixer(nData & 0x04);
+ m_Amp3.SetToneMixer(nData & 0x08);
+ m_Amp4.SetToneMixer(nData & 0x10);
+ m_Amp5.SetToneMixer(nData & 0x20);
+ break;
+
+ // Noise mixer control (==> Amp)
+ case 21:
+ m_Amp0.SetNoiseMixer(nData & 0x01);
+ m_Amp1.SetNoiseMixer(nData & 0x02);
+ m_Amp2.SetNoiseMixer(nData & 0x04);
+ m_Amp3.SetNoiseMixer(nData & 0x08);
+ m_Amp4.SetNoiseMixer(nData & 0x10);
+ m_Amp5.SetNoiseMixer(nData & 0x20);
+ break;
+
+ // Noise frequency/source control (==> Noise)
+ case 22:
+ m_Noise0.SetSource(nData & 0x03);
+ m_Noise1.SetSource((nData >> 4) & 0x03);
+ break;
+
+ // Envelope control data (==> Env) for envelope controller #0
+ case 24:
+ m_Env0.SetEnvControl(nData);
+ break;
+
+ // Envelope control data (==> Env) for envelope controller #1
+ case 25:
+ m_Env1.SetEnvControl(nData);
+ break;
+
+ // Global enable and reset (sync) controls
+ case 28:
+ {
+ // Reset (sync) bit
+ bool bSync = bool(nData & 0x02);
+ if (bSync != m_bSync)
+ {
+ // Sync all devices
+ // This amounts to telling them all to reset to a
+ // known state, which is also a state that doesn't change
+ // (i.e. no audio output, although there are some exceptions)
+ // bSync=true => all devices are sync (aka reset);
+ // bSync=false => all devices are allowed to run and generate changing output
+ m_Osc0.Sync(bSync);
+ m_Osc1.Sync(bSync);
+ m_Osc2.Sync(bSync);
+ m_Osc3.Sync(bSync);
+ m_Osc4.Sync(bSync);
+ m_Osc5.Sync(bSync);
+ m_Noise0.Sync(bSync);
+ m_Noise1.Sync(bSync);
+ m_Amp0.Sync(bSync);
+ m_Amp1.Sync(bSync);
+ m_Amp2.Sync(bSync);
+ m_Amp3.Sync(bSync);
+ m_Amp4.Sync(bSync);
+ m_Amp5.Sync(bSync);
+ m_bSync = bSync;
+ }
+
+ // Global mute bit
+ bool bOutputEnabled = bool(nData & 0x01);
+ if (bOutputEnabled != m_bOutputEnabled)
+ {
+ // unmute all amps - sound 'enabled'
+ m_Amp0.Mute(!bOutputEnabled);
+ m_Amp1.Mute(!bOutputEnabled);
+ m_Amp2.Mute(!bOutputEnabled);
+ m_Amp3.Mute(!bOutputEnabled);
+ m_Amp4.Mute(!bOutputEnabled);
+ m_Amp5.Mute(!bOutputEnabled);
+ m_bOutputEnabled = bOutputEnabled;
+ }
+ }
+ break;
+
+ default:
+ // anything else means data is being written to a register
+ // that is not used within the SAA-1099 architecture
+ // hence, we ignore it.
+ {}
+ }
+}
+
+void CSAADevice::_WriteAddress(BYTE nReg)
+{
+ m_nCurrentSaaReg = nReg & 31;
+ if (m_nCurrentSaaReg == 24)
+ {
+ m_Env0.ExternalClock();
+ }
+ else if (m_nCurrentSaaReg == 25)
+ {
+ m_Env1.ExternalClock();
+ }
+}
+
+#if 1
+BYTE CSAADevice::_ReadAddress(void)
+{
+ // Not a real hardware function of the SAA-1099, which is write-only
+ // However, this is used by SAAImpl to generate debug logs (if enabled)
+ return(m_nCurrentSaaReg);
+}
+#endif
+#if defined(DEBUG)
+BYTE CSAADevice::_ReadData(void)
+{
+ // Not a real hardware function of the SAA-1099, which is write-only
+ // This is only compiled for Debug builds
+ return(m_Reg[m_nCurrentSaaReg]);
+}
+#endif
+
+void CSAADevice::_TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed)
+{
+ unsigned int temp_left, temp_right;
+ unsigned int accum_left = 0, accum_right = 0;
+ for (int i = 1 << m_nOversample; i > 0; i--)
+ {
+ m_Noise0.Tick();
+ m_Noise1.Tick();
+ m_Amp0.TickAndOutputStereo(temp_left, temp_right);
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp1.TickAndOutputStereo(temp_left, temp_right);
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp2.TickAndOutputStereo(temp_left, temp_right);
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp3.TickAndOutputStereo(temp_left, temp_right);
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp4.TickAndOutputStereo(temp_left, temp_right);
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp5.TickAndOutputStereo(temp_left, temp_right);
+ accum_left += temp_left;
+ accum_right += temp_right;
+ }
+ left_mixed = accum_left;
+ right_mixed = accum_right;
+}
+
+void CSAADevice::_TickAndOutputSeparate(unsigned int& left_mixed, unsigned int& right_mixed,
+ unsigned int& left0, unsigned int& right0,
+ unsigned int& left1, unsigned int& right1,
+ unsigned int& left2, unsigned int& right2,
+ unsigned int& left3, unsigned int& right3,
+ unsigned int& left4, unsigned int& right4,
+ unsigned int& left5, unsigned int& right5
+)
+{
+ unsigned int temp_left, temp_right;
+ unsigned int accum_left = 0, accum_right = 0;
+ left0 = left1 = left2 = left3 = left4 = left5 = 0;
+ right0 = right1 = right2 = right3 = right4 = right5 = 0;
+ for (int i = 1 << m_nOversample; i > 0; i--)
+ {
+ m_Noise0.Tick();
+ m_Noise1.Tick();
+ m_Amp0.TickAndOutputStereo(temp_left, temp_right);
+ left0 += temp_left;
+ right0 += temp_right;
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp1.TickAndOutputStereo(temp_left, temp_right);
+ left1 += temp_left;
+ right1 += temp_right;
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp2.TickAndOutputStereo(temp_left, temp_right);
+ left2 += temp_left;
+ right2 += temp_right;
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp3.TickAndOutputStereo(temp_left, temp_right);
+ left3 += temp_left;
+ right3 += temp_right;
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp4.TickAndOutputStereo(temp_left, temp_right);
+ left4 += temp_left;
+ right4 += temp_right;
+ accum_left += temp_left;
+ accum_right += temp_right;
+ m_Amp5.TickAndOutputStereo(temp_left, temp_right);
+ left5 += temp_left;
+ right5 += temp_right;
+ accum_left += temp_left;
+ accum_right += temp_right;
+ }
+ left_mixed = accum_left;
+ right_mixed = accum_right;
+}
\ No newline at end of file
diff --git a/src/sound/saasound/SAADevice.h b/src/sound/saasound/SAADevice.h
new file mode 100644
index 000000000..7b697821f
--- /dev/null
+++ b/src/sound/saasound/SAADevice.h
@@ -0,0 +1,69 @@
+// Part of SAASound copyright 2020 Dave Hooper
+//
+// SAADevice.h: connecting the subcomponents of the SAA1099 together.
+// This class handles device inputs and outputs (clocking, data and
+// address bus, and simulated output)
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAADEVICE_H_INCLUDED
+#define SAADEVICE_H_INCLUDED
+
+#include "SAASound.h"
+#include "SAANoise.h"
+#include "SAAEnv.h"
+#include "SAAFreq.h"
+#include "SAAAmp.h"
+
+class CSAADevice
+{
+private:
+ int m_nCurrentSaaReg;
+ bool m_bOutputEnabled;
+ bool m_bSync;
+ bool m_bHighpass;
+ int m_nOversample;
+
+ CSAANoise m_Noise0, m_Noise1;
+ CSAAEnv m_Env0, m_Env1;
+ CSAAFreq m_Osc0, m_Osc1, m_Osc2, m_Osc3, m_Osc4, m_Osc5;
+ CSAAAmp m_Amp0, m_Amp1, m_Amp2, m_Amp3, m_Amp4, m_Amp5;
+
+ CSAANoise* Noise[2];
+ CSAAEnv* Env[2];
+ CSAAFreq* Osc[6];
+ CSAAAmp* Amp[6];
+
+#if defined(DEBUG) || defined(DEBUGSAA)
+ BYTE m_Reg[32];
+#endif
+
+public:
+ CSAADevice();
+ ~CSAADevice();
+
+ void _WriteAddress(BYTE nReg);
+ void _WriteData(BYTE nData);
+#if 1
+ BYTE _ReadAddress(void);
+#endif
+#if defined(DEBUG)
+ BYTE _ReadData(void);
+#endif
+
+ void _SetClockRate(unsigned int nClockRate);
+ void _SetSampleRate(unsigned int nSampleRate);
+ void _SetOversample(unsigned int nOversample);
+ void _TickAndOutputStereo(unsigned int& left_mixed, unsigned int& right_mixed);
+ void _TickAndOutputSeparate(unsigned int& left_mixed, unsigned int& right_mixed,
+ unsigned int& left0, unsigned int& right0,
+ unsigned int& left1, unsigned int& right1,
+ unsigned int& left2, unsigned int& right2,
+ unsigned int& left3, unsigned int& right3,
+ unsigned int& left4, unsigned int& right4,
+ unsigned int& left5, unsigned int& right5
+ );
+
+};
+
+#endif // SAADEVICE_H_INCLUDED
\ No newline at end of file
diff --git a/src/sound/saasound/SAAEnv.cpp b/src/sound/saasound/SAAEnv.cpp
new file mode 100755
index 000000000..049f51f96
--- /dev/null
+++ b/src/sound/saasound/SAAEnv.cpp
@@ -0,0 +1,380 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAAEnv.cpp: implementation of the CSAAEnv class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SAASound.h"
+#include "types.h"
+#include "SAAEnv.h"
+
+
+//////////////////////////////////////////////////////////////////////
+// Static member initialisation
+//////////////////////////////////////////////////////////////////////
+
+const ENVDATA CSAAEnv::cs_EnvData[8] =
+{
+ {1,false, { {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
+ {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}},
+ {1,true, { {{15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15},{15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}},
+ {{14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14},{14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14}}}},
+ {1,false, { {{15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
+ {{14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}},
+ {1,true, { {{15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
+ {{14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}},
+ {2,false, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}},
+ {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}}}},
+ {2,true, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}},
+ {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,0}}}},
+ {1,false, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
+ {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}},
+ {1,true, { {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},
+ {{0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}}
+};
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CSAAEnv::CSAAEnv()
+:
+m_bEnabled(false),
+m_nPhase(0),
+m_nPhasePosition(0),
+m_bEnvelopeEnded(true),
+m_nResolution(1),
+m_bNewData(false),
+m_nNextData(0)
+{
+ // initialise itself with the value 'zero'
+ SetEnvControl(0);
+}
+
+CSAAEnv::~CSAAEnv()
+{
+ // Nothing to do
+}
+
+void CSAAEnv::InternalClock(void)
+{
+ // will only do something if envelope clock mode is set to internal
+ // and the env control is enabled
+ if (m_bEnabled && (!m_bClockExternally)) Tick();
+}
+
+void CSAAEnv::ExternalClock(void)
+{
+ // will only do something if envelope clock mode is set to external
+ // and the env control is enabled
+ if (m_bClockExternally && m_bEnabled) Tick();
+}
+
+void CSAAEnv::SetEnvControl(int nData)
+{
+ // process immediate stuff first:
+ // start with the Enabled flag. if env is disabled,
+ // there's not much to do
+ bool bEnabled = ((nData & 0x80)==0x80);
+ if (!bEnabled && !m_bEnabled)
+ return;
+ m_bEnabled = bEnabled;
+ if (!m_bEnabled)
+ {
+ // env control was enabled, and now disabled
+ // Any subsequent env control changes are immediate.
+ m_bEnvelopeEnded = true;
+ return;
+ }
+
+ // Resolution (3bit/4bit) is also immediately processed
+ int new_resolution = ((nData & 0x10) == 0x10) ? 2 : 1;
+ // NOTE: undocumented behaviour when changing resolution mid-waveform
+ // Empirically, the following matches observations:
+ // * When ticking the env generator with 4-bit resolution, the position += 1
+ // * When ticking the env generator with 3-bit resolution, the position += 2
+ // * When changing between 4-bit resolution and 3-bit resolution
+ // without ticking the env generator, the position is unchanged
+ // (although, effectively, the LSB is ignored. Purely as an implementation
+ // detail, I'm implementing this as clearing the LSB ie LSB=0; see next point)
+ // * When changing between 3-bit resolution and 4-bit resolution
+ // without ticking the env generator, the position LSB is set to 1
+ // See test case: envext_34b
+ //
+ if (m_nResolution == 1 && new_resolution == 2)
+ {
+ // change from 4-bit to 3-bit
+ m_nPhasePosition &= 0xe;
+ }
+ else if (m_nResolution == 2 && new_resolution == 1)
+ {
+ // change from 3-bit to 4-bit
+ m_nPhasePosition |= 0x1;
+ }
+ m_nResolution = new_resolution;
+
+ // now buffered stuff: but only if it's ok to, and only if the
+ // envgenerator is not disabled. otherwise it just stays buffered until
+ // the Tick() function sets m_bEnvelopeEnded to true and realises there is
+ // already some new data waiting
+ if (m_bEnvelopeEnded)
+ {
+ SetNewEnvData(nData); // also does the SetLevels() call for us.
+ m_bNewData=false;
+ }
+ else
+ {
+ // since the 'next resolution' changes arrive unbuffered, we
+ // may need to change the current level because of this:
+ SetLevels();
+
+ // store current new data, and set the newdata flag:
+ m_bNewData = true;
+ m_nNextData = nData;
+ }
+
+}
+
+int CSAAEnv::LeftLevel(void) const
+{
+ return m_nLeftLevel;
+}
+
+int CSAAEnv::RightLevel(void) const
+{
+ return m_nRightLevel;
+}
+
+inline void CSAAEnv::Tick(void)
+{
+ // if disabled, do nothing
+ if (!m_bEnabled) // m_bEnabled is set directly, not buffered, so this is ok
+ {
+ // for sanity, reset stuff:
+ m_bEnvelopeEnded = true;
+ m_nPhase = 0;
+ m_nPhasePosition = 0;
+ return;
+ }
+
+ // else : m_bEnabled
+
+
+ if (m_bEnvelopeEnded)
+ {
+ // do nothing
+ // (specifically, don't change the values of m_bEnvelopeEnded,
+ // m_nPhase and m_nPhasePosition, as these will still be needed
+ // by SetLevels() should it be called again)
+
+ return;
+ }
+
+
+ // else : !m_bEnvelopeEnded
+ // Continue playing the same envelope ...
+ // increments the phaseposition within an envelope.
+ // also handles looping and resolution appropriately.
+ // Changes the level of the envelope accordingly
+ // through calling SetLevels() . This must be called after making
+ // any changes that will affect the output levels of the env controller!!
+ // SetLevels also handles left-right channel inverting
+
+ // increment phase position
+ m_nPhasePosition += m_nResolution;
+
+ // if this means we've gone past 16 (the end of a phase)
+ // then change phase, and if necessary, loop
+ // Refer to datasheet for meanings of (3) and (4) in following text
+ // w.r.t SAA1099 envelopes
+
+ // Note that we will always reach position (3) or (4), even if we keep toggling
+ // resolution from 4-bit to 3-bit and back, because the counter will always wrap to 0.
+ // In fact it's quite elegant:
+ // No matter how you increment and toggle and increment and toggle, the counter
+ // will at some point be either 0xe (either 4-bit mode or 3-bit mode) or 0xf (4-bit mode only).
+ // Depending on the mode, even if you change the mode, the next increment,
+ // or the one after it, will then take it to 0.
+ // 0xe + 2 (3bit mode) => 0x0
+ // 0xe + 1 (4bit mode) => 0xf
+ // 0xf + 1 (4bit mode) => 0x0
+ // 0xe -> (toggle 3bit mode to 4bit mode) => 0xf
+ // 0xe -> (toggle 4bit mode to 3bit mode) => 0xe
+ // 0xf -> (toggle 4bit mode to 3bit mode) => 0xe
+ //
+ // but there is a subtlety (of course), which is that any changes at point (3)
+ // can take place immediately you hit point (3), but changes at point (4) are actually
+ // only acted upon when the counter transitions from 0xe (or 0xf) to 0x0 (which also
+ // means that, for these looping envelopes, which are the ones that have a point(4),
+ // immediately after the counter wrapping to 0x0, a write to the env data register will
+ // NOT set the waveform and will NOT reset the phase/phaseposition (even though it
+ // will still let you toggle the 4bit/3bit mode, which will change the phaseposition LSB!)
+ // See test case: envext_34c
+
+ bool bProcessNewDataIfAvailable = false;
+ if (m_nPhasePosition >= 16)
+ {
+ m_nPhase++;
+
+ // if we should loop, then do so - and we've reached position (4)
+ // otherwise, if we shouldn't loop,
+ // then we've reached position (3) and so we say that
+ // we're ok for new data.
+ if (m_nPhase == m_nNumberOfPhases)
+ {
+ // at position (3) or (4)
+ if (!m_bLooping)
+ {
+ // position (3) only
+ // note that it seems that the sustain level is ALWAYS zero
+ // in the case of non-looping waveforms
+ m_bEnvelopeEnded = true;
+ bProcessNewDataIfAvailable = true;
+ }
+ else
+ {
+ // position (4) only
+ // note that any data already latched is ONLY acted upon
+ // at THIS point. If (after this Tick has completed) any new
+ // env data is written, it will NOT be acted upon, until
+ // we get back to position (4) again.
+ // this is why m_bEnvelopeEnded (which affects the behaviour
+ // of the SetEnvControl method) is FALSE here.
+ // See test case: envext_34c (as noted earlier)
+ m_bEnvelopeEnded = false;
+ // set phase pointer to start of envelope for loop
+ // and reset m_nPhasePosition
+ m_nPhase=0;
+ m_nPhasePosition -= 16;
+ bProcessNewDataIfAvailable = true;
+ }
+ }
+ else // (m_nPhase < m_nNumberOfPhases)
+ {
+ // not at position (3) or (4) ...
+ // (i.e., we're in the middle of an envelope with
+ // more than one phase. Specifically, we're in
+ // the middle of envelope 4 or 5 - the
+ // triangle envelopes - but that's not important)
+
+ // any commands sent to this envelope controller
+ // will be buffered. Set the flag to indicate this.
+ m_bEnvelopeEnded = false;
+ m_nPhasePosition -= 16;
+ }
+ }
+ else // (m_nPhasePosition < 16)
+ {
+ // still within the same phase;
+ // but, importantly, we are no longer at the start of the phase ...
+ // so new data cannot be acted on immediately, and must
+ // be buffered
+ m_bEnvelopeEnded = false;
+ // Phase and PhasePosition have already been updated.
+ // SetLevels() will need to be called to actually calculate
+ // the output 'level' of this envelope controller
+ }
+
+
+ // if we have new (buffered) data, now is the time to act on it
+ if (m_bNewData && bProcessNewDataIfAvailable)
+ {
+ m_bNewData = false;
+ SetNewEnvData(m_nNextData);
+ }
+ else
+ {
+ // ok, we didn't have any new buffered date to act on,
+ // so we just call SetLevels() to calculate the output level
+ // for whatever the current envelope is
+ SetLevels();
+ }
+
+}
+
+inline void CSAAEnv::SetLevels(void)
+{
+ // sets m_nLeftLevel
+ // Also sets m_nRightLevel in terms of m_nLeftLevel
+ // and m_bInvertRightChannel
+
+ // m_nResolution: 1 means 4-bit resolution; 2 means 3-bit resolution. Resolution of envelope waveform.
+
+ // Note that this is handled 'immediately', and doesn't wait for synchronisation of
+ // the envelope waveform (this is important, see test case EnvExt_imm)
+ // It is therefore possible to switch between 4-bit and 3-bit resolution in the middle of
+ // an envelope waveform. if you are at an 'odd' phase position, you would be able to hear
+ // the difference. if you are at an 'even' phase position, the volume level for 4-bit
+ // and 3-bit would be the same.
+ // NOTE: additional test cases are required.
+
+ switch (m_nResolution)
+ {
+ case 1: // 4 bit res waveforms
+ default:
+ {
+ // special case: if envelope is not a looping one, and we're at the end
+ // then our level should be zero (all of the non-looping waveforms have
+ // a sustain level of zero):
+ if (m_bEnvelopeEnded && !m_bLooping)
+ m_nLeftLevel = 0;
+ else
+ m_nLeftLevel = m_pEnvData->nLevels[0][m_nPhase][m_nPhasePosition];
+
+ if (m_bInvertRightChannel)
+ m_nRightLevel = 15-m_nLeftLevel;
+ else
+ m_nRightLevel = m_nLeftLevel;
+ break;
+ }
+ case 2: // 3 bit res waveforms
+ {
+ // special case: if envelope is not a looping one, and we're at the end
+ // then our level should be zero (all of the non-looping waveforms have
+ // a sustain level of zero):
+ if (m_bEnvelopeEnded && !m_bLooping)
+ m_nLeftLevel = 0;
+ else
+ m_nLeftLevel = m_pEnvData->nLevels[1][m_nPhase][m_nPhasePosition];
+ if (m_bInvertRightChannel)
+ m_nRightLevel = 14-m_nLeftLevel;
+ else
+ m_nRightLevel = m_nLeftLevel;
+ break;
+ }
+ }
+}
+
+
+inline void CSAAEnv::SetNewEnvData(int nData)
+{
+ // loads envgenerator's registers according to the bits set
+ // in nData
+
+ m_nPhase = 0;
+ m_nPhasePosition = 0;
+ m_pEnvData = &(cs_EnvData[(nData >> 1) & 0x07]);
+ m_bInvertRightChannel = ((nData & 0x01) == 0x01);
+ m_bClockExternally = ((nData & 0x20) == 0x20);
+ m_nNumberOfPhases = m_pEnvData->nNumberOfPhases;
+ m_bLooping = m_pEnvData->bLooping;
+ m_nResolution = (((nData & 0x10)==0x10) ? 2 : 1);
+ m_bEnabled = ((nData & 0x80) == 0x80);
+ if (m_bEnabled)
+ {
+ m_bEnvelopeEnded = false;
+ // is this right?
+ // YES. See test case EnvExt_34c (setting data multiple times
+ // when at a point (3) resets the waveform so you're no longer
+ // at a point (3).
+ }
+ else
+ {
+ // DISABLED - so set stuff accordingly
+ m_bEnvelopeEnded = true;
+ m_nPhase = 0;
+ m_nPhasePosition = 0;
+ }
+
+ SetLevels();
+}
diff --git a/src/sound/saasound/SAAEnv.h b/src/sound/saasound/SAAEnv.h
new file mode 100755
index 000000000..131659c06
--- /dev/null
+++ b/src/sound/saasound/SAAEnv.h
@@ -0,0 +1,54 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAAEnv.h: interface for the CSAAEnv class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAAENV_H_INCLUDED
+#define SAAENV_H_INCLUDED
+
+class CSAAEnv
+{
+private:
+ int m_nLeftLevel, m_nRightLevel;
+ ENVDATA const * m_pEnvData;
+
+ bool m_bEnabled;
+ bool m_bInvertRightChannel;
+ BYTE m_nPhase;
+ BYTE m_nPhasePosition;
+ bool m_bEnvelopeEnded;
+ char m_nPhaseAdd[2];
+ char m_nCurrentPhaseAdd;
+ bool m_bLooping;
+ char m_nNumberOfPhases;
+ char m_nResolution;
+ char m_nInitialLevel;
+ bool m_bNewData;
+ BYTE m_nNextData;
+ bool m_bClockExternally;
+ static const ENVDATA cs_EnvData[8];
+
+ void Tick(void);
+ void SetLevels(void);
+ void SetNewEnvData(int nData);
+
+public:
+ CSAAEnv();
+ ~CSAAEnv();
+
+ void InternalClock(void);
+ void ExternalClock(void);
+ void SetEnvControl(int nData); // really just a BYTE
+ int LeftLevel(void) const;
+ int RightLevel(void) const;
+ bool IsActive(void) const;
+
+};
+
+inline bool CSAAEnv::IsActive(void) const
+{
+ return m_bEnabled;
+}
+
+#endif // SAAENV_H_INCLUDED
diff --git a/src/sound/saasound/SAAFreq.cpp b/src/sound/saasound/SAAFreq.cpp
new file mode 100755
index 000000000..61a04f6ad
--- /dev/null
+++ b/src/sound/saasound/SAAFreq.cpp
@@ -0,0 +1,287 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAAFreq.cpp: implementation of the CSAAFreq class.
+// only 7-bit fractional accuracy on oscillator periods. I may consider fixing that.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SAASound.h"
+#include "types.h"
+#include "SAANoise.h"
+#include "SAAEnv.h"
+#include "SAAFreq.h"
+#include "defns.h"
+
+#ifdef SAAFREQ_FIXED_CLOCKRATE
+// 'load in' the data for the static frequency lookup table
+// precomputed for a fixed clockrate
+// See: tools/freqdat.py
+const unsigned long CSAAFreq::m_FreqTable[2048] = {
+#include "SAAFreq.dat"
+};
+#else
+unsigned long CSAAFreq::m_FreqTable[2048];
+unsigned long CSAAFreq::m_nClockRate = 0;
+#endif // SAAFREQ_FIXED_CLOCKRATE
+
+const int INITIAL_LEVEL = 1;
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CSAAFreq::CSAAFreq(CSAANoise * const NoiseGenerator, CSAAEnv * const EnvGenerator)
+:
+m_nCounter(0),
+m_nAdd(0),
+m_nCounter_low(0),
+m_nOversample(0),
+m_nCounterLimit_low(1),
+m_nLevel(INITIAL_LEVEL),
+m_nCurrentOffset(0),
+m_nCurrentOctave(0),
+m_nNextOffset(0),
+m_nNextOctave(0),
+m_bIgnoreOffsetData(false),
+m_bNewData(false),
+m_bSync(false),
+m_nSampleRate(SAMPLE_RATE_HZ),
+m_pcConnectedNoiseGenerator(NoiseGenerator),
+m_pcConnectedEnvGenerator(EnvGenerator),
+m_nConnectedMode((NoiseGenerator == NULL) ? ((EnvGenerator == NULL) ? 0 : 1) : 2)
+{
+ _SetClockRate(EXTERNAL_CLK_HZ);
+ SetAdd(); // current octave, current offset
+}
+
+CSAAFreq::~CSAAFreq()
+{
+ // Nothing to do
+}
+
+void CSAAFreq::SetFreqOffset(BYTE nOffset)
+{
+ // nOffset between 0 and 255
+
+ if (!m_bSync)
+ {
+ m_nNextOffset = nOffset;
+ m_bNewData=true;
+ if (m_nNextOctave==m_nCurrentOctave)
+ {
+ // According to Philips, if you send the SAA-1099
+ // new Octave data and then new Offset data in that
+ // order, on the next half-cycle of the current frequency
+ // generator, ONLY the octave data is acted upon.
+ // The offset data will be acted upon next time.
+
+ // ?? TEST CASE : if you set the octave and then the offset
+ // but the octave you set it to is the same one it already was.
+ // Will this ignore the offset data?
+ // Do you get the same behaviour if you set offset THEN octave
+ // even if you set octave to the same value it was before?
+
+ m_bIgnoreOffsetData=true;
+ }
+ }
+ else
+ {
+ // updates straightaway if m_bSync
+ m_bNewData=false;
+ m_bIgnoreOffsetData = false;
+ m_nCurrentOffset = nOffset;
+ m_nNextOffset = nOffset;
+ m_nCurrentOctave = m_nNextOctave;
+ SetAdd();
+ }
+
+}
+
+void CSAAFreq::SetFreqOctave(BYTE nOctave)
+{
+ // nOctave between 0 and 7
+
+ if (!m_bSync)
+ {
+ m_nNextOctave = nOctave;
+ m_bNewData=true;
+ m_bIgnoreOffsetData = false;
+ }
+ else
+ {
+ // updates straightaway if m_bSync
+ m_bNewData=false;
+ m_bIgnoreOffsetData = false;
+ m_nCurrentOctave = nOctave;
+ m_nNextOctave = nOctave;
+ m_nCurrentOffset = m_nNextOffset;
+ SetAdd();
+ }
+}
+
+void CSAAFreq::UpdateOctaveOffsetData(void)
+{
+ // loads the buffered new octave and new offset data into the current registers
+ // and sets up the new frequency for this frequency generator (i.e. sets up m_nAdd)
+ // - called during Sync, and called when waveform half-cycle completes
+
+ // How the SAA-1099 really treats new data:
+ // if only new octave data is present,
+ // then set new period based on just the octave data
+ // Otherwise, if only new offset data is present,
+ // then set new period based on just the offset data
+ // Otherwise, if new octave data is present, and new offset data is present,
+ // and the offset data was set BEFORE the octave data,
+ // then set new period based on both the octave and offset data
+ // Else, if the offset data came AFTER the new octave data
+ // then set new period based on JUST THE OCTAVE DATA, and continue
+ // signalling the offset data as 'new', so it will be acted upon
+ // next half-cycle
+ //
+ // Weird, I know. But that's how it works. Philips even documented as much.
+
+ if (!m_bNewData)
+ {
+ // optimise for the most common case! No new data!
+ return;
+ }
+
+ m_nCurrentOctave=m_nNextOctave;
+ if (!m_bIgnoreOffsetData)
+ {
+ m_nCurrentOffset=m_nNextOffset;
+ m_bNewData=false;
+ }
+ m_bIgnoreOffsetData=false;
+
+ SetAdd();
+}
+
+void CSAAFreq::_SetSampleRate(unsigned int nSampleRate)
+{
+ m_nSampleRate = nSampleRate;
+}
+
+void CSAAFreq::_SetOversample(unsigned int oversample)
+{
+ // oversample is a power of 2 i.e.
+ // if oversample == 2 then 4x oversample
+ // if oversample == 6 then 64x oversample
+ if (oversample < m_nOversample)
+ {
+ m_nCounter_low <<= (m_nOversample - oversample);
+ }
+ else
+ {
+ m_nCounter_low >>= (oversample - m_nOversample);
+ }
+
+ m_nCounterLimit_low = 1<= (m_nSampleRate<<12))
+ {
+ m_nCounter -= (m_nSampleRate<<12);
+ m_nCounter_low++;
+ if (m_nCounter_low >= m_nCounterLimit_low)
+ {
+ // period elapsed for (at least) one half-cycle of
+ // current frequency
+ m_nCounter_low = 0;
+ // flip state - from 0 to 1 or vice versa
+ m_nLevel = 1 - m_nLevel;
+
+ // trigger any connected devices
+ switch (m_nConnectedMode)
+ {
+ case 1:
+ // env trigger
+ m_pcConnectedEnvGenerator->InternalClock();
+ break;
+
+ case 2:
+ // noise trigger
+ m_pcConnectedNoiseGenerator->Trigger();
+ break;
+
+ default:
+ // do nothing
+ break;
+ }
+
+ // get new frequency (set period length m_nAdd) if new data is waiting:
+ UpdateOctaveOffsetData();
+ }
+ }
+
+ return m_nLevel;
+}
+
+void CSAAFreq::SetAdd(void)
+{
+ // nOctave between 0 and 7; nOffset between 0 and 255
+
+ // Used to be:
+ // m_nAdd = (15625 << nOctave) / (511 - nOffset);
+ // Now just table lookup:
+ m_nAdd = m_FreqTable[m_nCurrentOctave<<8 | m_nCurrentOffset];
+}
+
+void CSAAFreq::Sync(bool bSync)
+{
+ m_bSync = bSync;
+
+ // update straightaway if m_bSync
+ if (m_bSync)
+ {
+ m_nCounter = 0;
+ m_nCounter_low = 0;
+
+ // this seems to need to be required to make the Fred59 SPACE DEMO audio work correctly
+ m_nLevel = INITIAL_LEVEL;
+
+ m_nCurrentOctave=m_nNextOctave;
+ m_nCurrentOffset=m_nNextOffset;
+ SetAdd();
+ }
+}
diff --git a/src/sound/saasound/SAAFreq.dat b/src/sound/saasound/SAAFreq.dat
new file mode 100755
index 000000000..04fb9081a
--- /dev/null
+++ b/src/sound/saasound/SAAFreq.dat
@@ -0,0 +1,141 @@
+/*
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// Precalculated oscillator frequency period steps
+// Higher scaling for better accuracy.
+//
+// After construction, it's important to SetSampleRate before
+// trying to use the generator.
+// (Just because the CSAANoise object has a default samplerate
+// doesn't mean you should rely on it)
+//
+//////////////////////////////////////////////////////////////////////
+*/
+ 250489 , 250980 , 251473 , 251969 , 252465 , 252964 , 253465 , 253968 , 254473 , 254980 , 255489 , 256000 , 256513 , 257028 , 257545 , 258065 ,
+ 258586 , 259109 , 259635 , 260163 , 260692 , 261224 , 261759 , 262295 , 262834 , 263374 , 263918 , 264463 , 265010 , 265560 , 266112 , 266667 ,
+ 267223 , 267782 , 268344 , 268908 , 269474 , 270042 , 270613 , 271186 , 271762 , 272340 , 272921 , 273504 , 274090 , 274678 , 275269 , 275862 ,
+ 276458 , 277056 , 277657 , 278261 , 278867 , 279476 , 280088 , 280702 , 281319 , 281938 , 282561 , 283186 , 283814 , 284444 , 285078 , 285714 ,
+ 286353 , 286996 , 287640 , 288288 , 288939 , 289593 , 290249 , 290909 , 291572 , 292237 , 292906 , 293578 , 294253 , 294931 , 295612 , 296296 ,
+ 296984 , 297674 , 298368 , 299065 , 299766 , 300469 , 301176 , 301887 , 302600 , 303318 , 304038 , 304762 , 305489 , 306220 , 306954 , 307692 ,
+ 308434 , 309179 , 309927 , 310680 , 311436 , 312195 , 312958 , 313725 , 314496 , 315271 , 316049 , 316832 , 317618 , 318408 , 319202 , 320000 ,
+ 320802 , 321608 , 322418 , 323232 , 324051 , 324873 , 325700 , 326531 , 327366 , 328205 , 329049 , 329897 , 330749 , 331606 , 332468 , 333333 ,
+ 334204 , 335079 , 335958 , 336842 , 337731 , 338624 , 339523 , 340426 , 341333 , 342246 , 343164 , 344086 , 345013 , 345946 , 346883 , 347826 ,
+ 348774 , 349727 , 350685 , 351648 , 352617 , 353591 , 354571 , 355556 , 356546 , 357542 , 358543 , 359551 , 360563 , 361582 , 362606 , 363636 ,
+ 364672 , 365714 , 366762 , 367816 , 368876 , 369942 , 371014 , 372093 , 373178 , 374269 , 375367 , 376471 , 377581 , 378698 , 379822 , 380952 ,
+ 382090 , 383234 , 384384 , 385542 , 386707 , 387879 , 389058 , 390244 , 391437 , 392638 , 393846 , 395062 , 396285 , 397516 , 398754 , 400000 ,
+ 401254 , 402516 , 403785 , 405063 , 406349 , 407643 , 408946 , 410256 , 411576 , 412903 , 414239 , 415584 , 416938 , 418301 , 419672 , 421053 ,
+ 422442 , 423841 , 425249 , 426667 , 428094 , 429530 , 430976 , 432432 , 433898 , 435374 , 436860 , 438356 , 439863 , 441379 , 442907 , 444444 ,
+ 445993 , 447552 , 449123 , 450704 , 452297 , 453901 , 455516 , 457143 , 458781 , 460432 , 462094 , 463768 , 465455 , 467153 , 468864 , 470588 ,
+ 472325 , 474074 , 475836 , 477612 , 479401 , 481203 , 483019 , 484848 , 486692 , 488550 , 490421 , 492308 , 494208 , 496124 , 498054 , 500000 ,
+ 500978 , 501961 , 502947 , 503937 , 504931 , 505929 , 506931 , 507937 , 508946 , 509960 , 510978 , 512000 , 513026 , 514056 , 515091 , 516129 ,
+ 517172 , 518219 , 519270 , 520325 , 521385 , 522449 , 523517 , 524590 , 525667 , 526749 , 527835 , 528926 , 530021 , 531120 , 532225 , 533333 ,
+ 534447 , 535565 , 536688 , 537815 , 538947 , 540084 , 541226 , 542373 , 543524 , 544681 , 545842 , 547009 , 548180 , 549356 , 550538 , 551724 ,
+ 552916 , 554113 , 555315 , 556522 , 557734 , 558952 , 560175 , 561404 , 562637 , 563877 , 565121 , 566372 , 567627 , 568889 , 570156 , 571429 ,
+ 572707 , 573991 , 575281 , 576577 , 577878 , 579186 , 580499 , 581818 , 583144 , 584475 , 585812 , 587156 , 588506 , 589862 , 591224 , 592593 ,
+ 593968 , 595349 , 596737 , 598131 , 599532 , 600939 , 602353 , 603774 , 605201 , 606635 , 608076 , 609524 , 610979 , 612440 , 613909 , 615385 ,
+ 616867 , 618357 , 619855 , 621359 , 622871 , 624390 , 625917 , 627451 , 628993 , 630542 , 632099 , 633663 , 635236 , 636816 , 638404 , 640000 ,
+ 641604 , 643216 , 644836 , 646465 , 648101 , 649746 , 651399 , 653061 , 654731 , 656410 , 658098 , 659794 , 661499 , 663212 , 664935 , 666667 ,
+ 668407 , 670157 , 671916 , 673684 , 675462 , 677249 , 679045 , 680851 , 682667 , 684492 , 686327 , 688172 , 690027 , 691892 , 693767 , 695652 ,
+ 697548 , 699454 , 701370 , 703297 , 705234 , 707182 , 709141 , 711111 , 713092 , 715084 , 717087 , 719101 , 721127 , 723164 , 725212 , 727273 ,
+ 729345 , 731429 , 733524 , 735632 , 737752 , 739884 , 742029 , 744186 , 746356 , 748538 , 750733 , 752941 , 755162 , 757396 , 759644 , 761905 ,
+ 764179 , 766467 , 768769 , 771084 , 773414 , 775758 , 778116 , 780488 , 782875 , 785276 , 787692 , 790123 , 792570 , 795031 , 797508 , 800000 ,
+ 802508 , 805031 , 807571 , 810127 , 812698 , 815287 , 817891 , 820513 , 823151 , 825806 , 828479 , 831169 , 833876 , 836601 , 839344 , 842105 ,
+ 844884 , 847682 , 850498 , 853333 , 856187 , 859060 , 861953 , 864865 , 867797 , 870748 , 873720 , 876712 , 879725 , 882759 , 885813 , 888889 ,
+ 891986 , 895105 , 898246 , 901408 , 904594 , 907801 , 911032 , 914286 , 917563 , 920863 , 924188 , 927536 , 930909 , 934307 , 937729 , 941176 ,
+ 944649 , 948148 , 951673 , 955224 , 958801 , 962406 , 966038 , 969697 , 973384 , 977099 , 980843 , 984615 , 988417 , 992248 , 996109 , 1000000 ,
+ 1001957 , 1003922 , 1005894 , 1007874 , 1009862 , 1011858 , 1013861 , 1015873 , 1017893 , 1019920 , 1021956 , 1024000 , 1026052 , 1028112 , 1030181 , 1032258 ,
+ 1034343 , 1036437 , 1038540 , 1040650 , 1042770 , 1044898 , 1047035 , 1049180 , 1051335 , 1053498 , 1055670 , 1057851 , 1060041 , 1062241 , 1064449 , 1066667 ,
+ 1068894 , 1071130 , 1073375 , 1075630 , 1077895 , 1080169 , 1082452 , 1084746 , 1087049 , 1089362 , 1091684 , 1094017 , 1096360 , 1098712 , 1101075 , 1103448 ,
+ 1105832 , 1108225 , 1110629 , 1113043 , 1115468 , 1117904 , 1120350 , 1122807 , 1125275 , 1127753 , 1130243 , 1132743 , 1135255 , 1137778 , 1140312 , 1142857 ,
+ 1145414 , 1147982 , 1150562 , 1153153 , 1155756 , 1158371 , 1160998 , 1163636 , 1166287 , 1168950 , 1171625 , 1174312 , 1177011 , 1179724 , 1182448 , 1185185 ,
+ 1187935 , 1190698 , 1193473 , 1196262 , 1199063 , 1201878 , 1204706 , 1207547 , 1210402 , 1213270 , 1216152 , 1219048 , 1221957 , 1224880 , 1227818 , 1230769 ,
+ 1233735 , 1236715 , 1239709 , 1242718 , 1245742 , 1248780 , 1251834 , 1254902 , 1257985 , 1261084 , 1264198 , 1267327 , 1270471 , 1273632 , 1276808 , 1280000 ,
+ 1283208 , 1286432 , 1289673 , 1292929 , 1296203 , 1299492 , 1302799 , 1306122 , 1309463 , 1312821 , 1316195 , 1319588 , 1322997 , 1326425 , 1329870 , 1333333 ,
+ 1336815 , 1340314 , 1343832 , 1347368 , 1350923 , 1354497 , 1358090 , 1361702 , 1365333 , 1368984 , 1372654 , 1376344 , 1380054 , 1383784 , 1387534 , 1391304 ,
+ 1395095 , 1398907 , 1402740 , 1406593 , 1410468 , 1414365 , 1418283 , 1422222 , 1426184 , 1430168 , 1434174 , 1438202 , 1442254 , 1446328 , 1450425 , 1454545 ,
+ 1458689 , 1462857 , 1467049 , 1471264 , 1475504 , 1479769 , 1484058 , 1488372 , 1492711 , 1497076 , 1501466 , 1505882 , 1510324 , 1514793 , 1519288 , 1523810 ,
+ 1528358 , 1532934 , 1537538 , 1542169 , 1546828 , 1551515 , 1556231 , 1560976 , 1565749 , 1570552 , 1575385 , 1580247 , 1585139 , 1590062 , 1595016 , 1600000 ,
+ 1605016 , 1610063 , 1615142 , 1620253 , 1625397 , 1630573 , 1635783 , 1641026 , 1646302 , 1651613 , 1656958 , 1662338 , 1667752 , 1673203 , 1678689 , 1684211 ,
+ 1689769 , 1695364 , 1700997 , 1706667 , 1712375 , 1718121 , 1723906 , 1729730 , 1735593 , 1741497 , 1747440 , 1753425 , 1759450 , 1765517 , 1771626 , 1777778 ,
+ 1783972 , 1790210 , 1796491 , 1802817 , 1809187 , 1815603 , 1822064 , 1828571 , 1835125 , 1841727 , 1848375 , 1855072 , 1861818 , 1868613 , 1875458 , 1882353 ,
+ 1889299 , 1896296 , 1903346 , 1910448 , 1917603 , 1924812 , 1932075 , 1939394 , 1946768 , 1954198 , 1961686 , 1969231 , 1976834 , 1984496 , 1992218 , 2000000 ,
+ 2003914 , 2007843 , 2011788 , 2015748 , 2019724 , 2023715 , 2027723 , 2031746 , 2035785 , 2039841 , 2043912 , 2048000 , 2052104 , 2056225 , 2060362 , 2064516 ,
+ 2068687 , 2072874 , 2077079 , 2081301 , 2085540 , 2089796 , 2094070 , 2098361 , 2102669 , 2106996 , 2111340 , 2115702 , 2120083 , 2124481 , 2128898 , 2133333 ,
+ 2137787 , 2142259 , 2146751 , 2151261 , 2155789 , 2160338 , 2164905 , 2169492 , 2174098 , 2178723 , 2183369 , 2188034 , 2192719 , 2197425 , 2202151 , 2206897 ,
+ 2211663 , 2216450 , 2221258 , 2226087 , 2230937 , 2235808 , 2240700 , 2245614 , 2250549 , 2255507 , 2260486 , 2265487 , 2270510 , 2275556 , 2280624 , 2285714 ,
+ 2290828 , 2295964 , 2301124 , 2306306 , 2311512 , 2316742 , 2321995 , 2327273 , 2332574 , 2337900 , 2343249 , 2348624 , 2354023 , 2359447 , 2364896 , 2370370 ,
+ 2375870 , 2381395 , 2386946 , 2392523 , 2398126 , 2403756 , 2409412 , 2415094 , 2420804 , 2426540 , 2432304 , 2438095 , 2443914 , 2449761 , 2455635 , 2461538 ,
+ 2467470 , 2473430 , 2479419 , 2485437 , 2491484 , 2497561 , 2503667 , 2509804 , 2515971 , 2522167 , 2528395 , 2534653 , 2540943 , 2547264 , 2553616 , 2560000 ,
+ 2566416 , 2572864 , 2579345 , 2585859 , 2592405 , 2598985 , 2605598 , 2612245 , 2618926 , 2625641 , 2632391 , 2639175 , 2645995 , 2652850 , 2659740 , 2666667 ,
+ 2673629 , 2680628 , 2687664 , 2694737 , 2701847 , 2708995 , 2716180 , 2723404 , 2730667 , 2737968 , 2745308 , 2752688 , 2760108 , 2767568 , 2775068 , 2782609 ,
+ 2790191 , 2797814 , 2805479 , 2813187 , 2820937 , 2828729 , 2836565 , 2844444 , 2852368 , 2860335 , 2868347 , 2876404 , 2884507 , 2892655 , 2900850 , 2909091 ,
+ 2917379 , 2925714 , 2934097 , 2942529 , 2951009 , 2959538 , 2968116 , 2976744 , 2985423 , 2994152 , 3002933 , 3011765 , 3020649 , 3029586 , 3038576 , 3047619 ,
+ 3056716 , 3065868 , 3075075 , 3084337 , 3093656 , 3103030 , 3112462 , 3121951 , 3131498 , 3141104 , 3150769 , 3160494 , 3170279 , 3180124 , 3190031 , 3200000 ,
+ 3210031 , 3220126 , 3230284 , 3240506 , 3250794 , 3261146 , 3271565 , 3282051 , 3292605 , 3303226 , 3313916 , 3324675 , 3335505 , 3346405 , 3357377 , 3368421 ,
+ 3379538 , 3390728 , 3401993 , 3413333 , 3424749 , 3436242 , 3447811 , 3459459 , 3471186 , 3482993 , 3494881 , 3506849 , 3518900 , 3531034 , 3543253 , 3555556 ,
+ 3567944 , 3580420 , 3592982 , 3605634 , 3618375 , 3631206 , 3644128 , 3657143 , 3670251 , 3683453 , 3696751 , 3710145 , 3723636 , 3737226 , 3750916 , 3764706 ,
+ 3778598 , 3792593 , 3806691 , 3820896 , 3835206 , 3849624 , 3864151 , 3878788 , 3893536 , 3908397 , 3923372 , 3938462 , 3953668 , 3968992 , 3984436 , 4000000 ,
+ 4007828 , 4015686 , 4023576 , 4031496 , 4039448 , 4047431 , 4055446 , 4063492 , 4071571 , 4079681 , 4087824 , 4096000 , 4104208 , 4112450 , 4120724 , 4129032 ,
+ 4137374 , 4145749 , 4154158 , 4162602 , 4171079 , 4179592 , 4188139 , 4196721 , 4205339 , 4213992 , 4222680 , 4231405 , 4240166 , 4248963 , 4257796 , 4266667 ,
+ 4275574 , 4284519 , 4293501 , 4302521 , 4311579 , 4320675 , 4329810 , 4338983 , 4348195 , 4357447 , 4366738 , 4376068 , 4385439 , 4394850 , 4404301 , 4413793 ,
+ 4423326 , 4432900 , 4442516 , 4452174 , 4461874 , 4471616 , 4481400 , 4491228 , 4501099 , 4511013 , 4520971 , 4530973 , 4541020 , 4551111 , 4561247 , 4571429 ,
+ 4581655 , 4591928 , 4602247 , 4612613 , 4623025 , 4633484 , 4643991 , 4654545 , 4665148 , 4675799 , 4686499 , 4697248 , 4708046 , 4718894 , 4729792 , 4740741 ,
+ 4751740 , 4762791 , 4773893 , 4785047 , 4796253 , 4807512 , 4818824 , 4830189 , 4841608 , 4853081 , 4864608 , 4876190 , 4887828 , 4899522 , 4911271 , 4923077 ,
+ 4934940 , 4946860 , 4958838 , 4970874 , 4982968 , 4995122 , 5007335 , 5019608 , 5031941 , 5044335 , 5056790 , 5069307 , 5081886 , 5094527 , 5107232 , 5120000 ,
+ 5132832 , 5145729 , 5158690 , 5171717 , 5184810 , 5197970 , 5211196 , 5224490 , 5237852 , 5251282 , 5264781 , 5278351 , 5291990 , 5305699 , 5319481 , 5333333 ,
+ 5347258 , 5361257 , 5375328 , 5389474 , 5403694 , 5417989 , 5432361 , 5446809 , 5461333 , 5475936 , 5490617 , 5505376 , 5520216 , 5535135 , 5550136 , 5565217 ,
+ 5580381 , 5595628 , 5610959 , 5626374 , 5641873 , 5657459 , 5673130 , 5688889 , 5704735 , 5720670 , 5736695 , 5752809 , 5769014 , 5785311 , 5801700 , 5818182 ,
+ 5834758 , 5851429 , 5868195 , 5885057 , 5902017 , 5919075 , 5936232 , 5953488 , 5970845 , 5988304 , 6005865 , 6023529 , 6041298 , 6059172 , 6077151 , 6095238 ,
+ 6113433 , 6131737 , 6150150 , 6168675 , 6187311 , 6206061 , 6224924 , 6243902 , 6262997 , 6282209 , 6301538 , 6320988 , 6340557 , 6360248 , 6380062 , 6400000 ,
+ 6420063 , 6440252 , 6460568 , 6481013 , 6501587 , 6522293 , 6543131 , 6564103 , 6585209 , 6606452 , 6627832 , 6649351 , 6671010 , 6692810 , 6714754 , 6736842 ,
+ 6759076 , 6781457 , 6803987 , 6826667 , 6849498 , 6872483 , 6895623 , 6918919 , 6942373 , 6965986 , 6989761 , 7013699 , 7037801 , 7062069 , 7086505 , 7111111 ,
+ 7135889 , 7160839 , 7185965 , 7211268 , 7236749 , 7262411 , 7288256 , 7314286 , 7340502 , 7366906 , 7393502 , 7420290 , 7447273 , 7474453 , 7501832 , 7529412 ,
+ 7557196 , 7585185 , 7613383 , 7641791 , 7670412 , 7699248 , 7728302 , 7757576 , 7787072 , 7816794 , 7846743 , 7876923 , 7907336 , 7937984 , 7968872 , 8000000 ,
+ 8015656 , 8031373 , 8047151 , 8062992 , 8078895 , 8094862 , 8110891 , 8126984 , 8143141 , 8159363 , 8175649 , 8192000 , 8208417 , 8224900 , 8241449 , 8258065 ,
+ 8274747 , 8291498 , 8308316 , 8325203 , 8342159 , 8359184 , 8376278 , 8393443 , 8410678 , 8427984 , 8445361 , 8462810 , 8480331 , 8497925 , 8515593 , 8533333 ,
+ 8551148 , 8569038 , 8587002 , 8605042 , 8623158 , 8641350 , 8659619 , 8677966 , 8696391 , 8714894 , 8733475 , 8752137 , 8770878 , 8789700 , 8808602 , 8827586 ,
+ 8846652 , 8865801 , 8885033 , 8904348 , 8923747 , 8943231 , 8962801 , 8982456 , 9002198 , 9022026 , 9041943 , 9061947 , 9082040 , 9102222 , 9122494 , 9142857 ,
+ 9163311 , 9183857 , 9204494 , 9225225 , 9246050 , 9266968 , 9287982 , 9309091 , 9330296 , 9351598 , 9372998 , 9394495 , 9416092 , 9437788 , 9459584 , 9481481 ,
+ 9503480 , 9525581 , 9547786 , 9570093 , 9592506 , 9615023 , 9637647 , 9660377 , 9683215 , 9706161 , 9729216 , 9752381 , 9775656 , 9799043 , 9822542 , 9846154 ,
+ 9869880 , 9893720 , 9917676 , 9941748 , 9965937 , 9990244 , 10014670 , 10039216 , 10063882 , 10088670 , 10113580 , 10138614 , 10163772 , 10189055 , 10214464 , 10240000 ,
+ 10265664 , 10291457 , 10317380 , 10343434 , 10369620 , 10395939 , 10422392 , 10448980 , 10475703 , 10502564 , 10529563 , 10556701 , 10583979 , 10611399 , 10638961 , 10666667 ,
+ 10694517 , 10722513 , 10750656 , 10778947 , 10807388 , 10835979 , 10864721 , 10893617 , 10922667 , 10951872 , 10981233 , 11010753 , 11040431 , 11070270 , 11100271 , 11130435 ,
+ 11160763 , 11191257 , 11221918 , 11252747 , 11283747 , 11314917 , 11346260 , 11377778 , 11409471 , 11441341 , 11473389 , 11505618 , 11538028 , 11570621 , 11603399 , 11636364 ,
+ 11669516 , 11702857 , 11736390 , 11770115 , 11804035 , 11838150 , 11872464 , 11906977 , 11941691 , 11976608 , 12011730 , 12047059 , 12082596 , 12118343 , 12154303 , 12190476 ,
+ 12226866 , 12263473 , 12300300 , 12337349 , 12374622 , 12412121 , 12449848 , 12487805 , 12525994 , 12564417 , 12603077 , 12641975 , 12681115 , 12720497 , 12760125 , 12800000 ,
+ 12840125 , 12880503 , 12921136 , 12962025 , 13003175 , 13044586 , 13086262 , 13128205 , 13170418 , 13212903 , 13255663 , 13298701 , 13342020 , 13385621 , 13429508 , 13473684 ,
+ 13518152 , 13562914 , 13607973 , 13653333 , 13698997 , 13744966 , 13791246 , 13837838 , 13884746 , 13931973 , 13979522 , 14027397 , 14075601 , 14124138 , 14173010 , 14222222 ,
+ 14271777 , 14321678 , 14371930 , 14422535 , 14473498 , 14524823 , 14576512 , 14628571 , 14681004 , 14733813 , 14787004 , 14840580 , 14894545 , 14948905 , 15003663 , 15058824 ,
+ 15114391 , 15170370 , 15226766 , 15283582 , 15340824 , 15398496 , 15456604 , 15515152 , 15574144 , 15633588 , 15693487 , 15753846 , 15814672 , 15875969 , 15937743 , 16000000 ,
+ 16031311 , 16062745 , 16094303 , 16125984 , 16157791 , 16189723 , 16221782 , 16253968 , 16286282 , 16318725 , 16351297 , 16384000 , 16416834 , 16449799 , 16482897 , 16516129 ,
+ 16549495 , 16582996 , 16616633 , 16650407 , 16684318 , 16718367 , 16752556 , 16786885 , 16821355 , 16855967 , 16890722 , 16925620 , 16960663 , 16995851 , 17031185 , 17066667 ,
+ 17102296 , 17138075 , 17174004 , 17210084 , 17246316 , 17282700 , 17319239 , 17355932 , 17392781 , 17429787 , 17466951 , 17504274 , 17541756 , 17579399 , 17617204 , 17655172 ,
+ 17693305 , 17731602 , 17770065 , 17808696 , 17847495 , 17886463 , 17925602 , 17964912 , 18004396 , 18044053 , 18083885 , 18123894 , 18164080 , 18204444 , 18244989 , 18285714 ,
+ 18326622 , 18367713 , 18408989 , 18450450 , 18492099 , 18533937 , 18575964 , 18618182 , 18660592 , 18703196 , 18745995 , 18788991 , 18832184 , 18875576 , 18919169 , 18962963 ,
+ 19006961 , 19051163 , 19095571 , 19140187 , 19185012 , 19230047 , 19275294 , 19320755 , 19366430 , 19412322 , 19458432 , 19504762 , 19551313 , 19598086 , 19645084 , 19692308 ,
+ 19739759 , 19787440 , 19835351 , 19883495 , 19931873 , 19980488 , 20029340 , 20078431 , 20127764 , 20177340 , 20227160 , 20277228 , 20327543 , 20378109 , 20428928 , 20480000 ,
+ 20531328 , 20582915 , 20634761 , 20686869 , 20739241 , 20791878 , 20844784 , 20897959 , 20951407 , 21005128 , 21059126 , 21113402 , 21167959 , 21222798 , 21277922 , 21333333 ,
+ 21389034 , 21445026 , 21501312 , 21557895 , 21614776 , 21671958 , 21729443 , 21787234 , 21845333 , 21903743 , 21962466 , 22021505 , 22080863 , 22140541 , 22200542 , 22260870 ,
+ 22321526 , 22382514 , 22443836 , 22505495 , 22567493 , 22629834 , 22692521 , 22755556 , 22818942 , 22882682 , 22946779 , 23011236 , 23076056 , 23141243 , 23206799 , 23272727 ,
+ 23339031 , 23405714 , 23472779 , 23540230 , 23608069 , 23676301 , 23744928 , 23813953 , 23883382 , 23953216 , 24023460 , 24094118 , 24165192 , 24236686 , 24308605 , 24380952 ,
+ 24453731 , 24526946 , 24600601 , 24674699 , 24749245 , 24824242 , 24899696 , 24975610 , 25051988 , 25128834 , 25206154 , 25283951 , 25362229 , 25440994 , 25520249 , 25600000 ,
+ 25680251 , 25761006 , 25842271 , 25924051 , 26006349 , 26089172 , 26172524 , 26256410 , 26340836 , 26425806 , 26511327 , 26597403 , 26684039 , 26771242 , 26859016 , 26947368 ,
+ 27036304 , 27125828 , 27215947 , 27306667 , 27397993 , 27489933 , 27582492 , 27675676 , 27769492 , 27863946 , 27959044 , 28054795 , 28151203 , 28248276 , 28346021 , 28444444 ,
+ 28543554 , 28643357 , 28743860 , 28845070 , 28946996 , 29049645 , 29153025 , 29257143 , 29362007 , 29467626 , 29574007 , 29681159 , 29789091 , 29897810 , 30007326 , 30117647 ,
+ 30228782 , 30340741 , 30453532 , 30567164 , 30681648 , 30796992 , 30913208 , 31030303 , 31148289 , 31267176 , 31386973 , 31507692 , 31629344 , 31751938 , 31875486 , 32000000 ,
+ 32062622 , 32125490 , 32188605 , 32251969 , 32315582 , 32379447 , 32443564 , 32507937 , 32572565 , 32637450 , 32702595 , 32768000 , 32833667 , 32899598 , 32965795 , 33032258 ,
+ 33098990 , 33165992 , 33233266 , 33300813 , 33368635 , 33436735 , 33505112 , 33573770 , 33642710 , 33711934 , 33781443 , 33851240 , 33921325 , 33991701 , 34062370 , 34133333 ,
+ 34204593 , 34276151 , 34348008 , 34420168 , 34492632 , 34565401 , 34638478 , 34711864 , 34785563 , 34859574 , 34933902 , 35008547 , 35083512 , 35158798 , 35234409 , 35310345 ,
+ 35386609 , 35463203 , 35540130 , 35617391 , 35694989 , 35772926 , 35851204 , 35929825 , 36008791 , 36088106 , 36167770 , 36247788 , 36328160 , 36408889 , 36489978 , 36571429 ,
+ 36653244 , 36735426 , 36817978 , 36900901 , 36984199 , 37067873 , 37151927 , 37236364 , 37321185 , 37406393 , 37491991 , 37577982 , 37664368 , 37751152 , 37838337 , 37925926 ,
+ 38013921 , 38102326 , 38191142 , 38280374 , 38370023 , 38460094 , 38550588 , 38641509 , 38732861 , 38824645 , 38916865 , 39009524 , 39102625 , 39196172 , 39290168 , 39384615 ,
+ 39479518 , 39574879 , 39670702 , 39766990 , 39863747 , 39960976 , 40058680 , 40156863 , 40255528 , 40354680 , 40454321 , 40554455 , 40655087 , 40756219 , 40857855 , 40960000 ,
+ 41062657 , 41165829 , 41269521 , 41373737 , 41478481 , 41583756 , 41689567 , 41795918 , 41902813 , 42010256 , 42118252 , 42226804 , 42335917 , 42445596 , 42555844 , 42666667 ,
+ 42778068 , 42890052 , 43002625 , 43115789 , 43229551 , 43343915 , 43458886 , 43574468 , 43690667 , 43807487 , 43924933 , 44043011 , 44161725 , 44281081 , 44401084 , 44521739 ,
+ 44643052 , 44765027 , 44887671 , 45010989 , 45134986 , 45259669 , 45385042 , 45511111 , 45637883 , 45765363 , 45893557 , 46022472 , 46152113 , 46282486 , 46413598 , 46545455 ,
+ 46678063 , 46811429 , 46945559 , 47080460 , 47216138 , 47352601 , 47489855 , 47627907 , 47766764 , 47906433 , 48046921 , 48188235 , 48330383 , 48473373 , 48617211 , 48761905 ,
+ 48907463 , 49053892 , 49201201 , 49349398 , 49498489 , 49648485 , 49799392 , 49951220 , 50103976 , 50257669 , 50412308 , 50567901 , 50724458 , 50881988 , 51040498 , 51200000 ,
+ 51360502 , 51522013 , 51684543 , 51848101 , 52012698 , 52178344 , 52345048 , 52512821 , 52681672 , 52851613 , 53022654 , 53194805 , 53368078 , 53542484 , 53718033 , 53894737 ,
+ 54072607 , 54251656 , 54431894 , 54613333 , 54795987 , 54979866 , 55164983 , 55351351 , 55538983 , 55727891 , 55918089 , 56109589 , 56302405 , 56496552 , 56692042 , 56888889 ,
+ 57087108 , 57286713 , 57487719 , 57690141 , 57893993 , 58099291 , 58306050 , 58514286 , 58724014 , 58935252 , 59148014 , 59362319 , 59578182 , 59795620 , 60014652 , 60235294 ,
+ 60457565 , 60681481 , 60907063 , 61134328 , 61363296 , 61593985 , 61826415 , 62060606 , 62296578 , 62534351 , 62773946 , 63015385 , 63258687 , 63503876 , 63750973 , 64000000
diff --git a/src/sound/saasound/SAAFreq.h b/src/sound/saasound/SAAFreq.h
new file mode 100755
index 000000000..478754621
--- /dev/null
+++ b/src/sound/saasound/SAAFreq.h
@@ -0,0 +1,72 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAAFreq.h: interface for the CSAAFreq class.
+// Note about Samplerates: 0=44100, 1=22050; 2=11025
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAAFREQ_H_INCLUDE
+#define SAAFREQ_H_INCLUDE
+
+#include "defns.h"
+
+class CSAAFreq
+{
+private:
+#ifdef SAAFREQ_FIXED_CLOCKRATE
+ // 'load in' the data for the static frequency lookup table
+ // precomputed for a fixed clockrate
+ // See: tools/freqdat.py
+ const static unsigned long m_FreqTable[2048];
+#else
+ // we'll calculate the frequency lookup table at runtime.
+ static unsigned long m_FreqTable[2048];
+ static unsigned long m_nClockRate;
+#endif
+
+ unsigned long m_nCounter;
+ unsigned long m_nAdd;
+ unsigned long m_nCounter_low;
+ unsigned int m_nOversample;
+ unsigned long m_nCounterLimit_low;
+ int m_nLevel;
+
+ int m_nCurrentOffset;
+ int m_nCurrentOctave;
+ int m_nNextOffset;
+ int m_nNextOctave;
+ bool m_bIgnoreOffsetData;
+ bool m_bNewData;
+ bool m_bSync;
+
+ unsigned long m_nSampleRate;
+ CSAANoise * const m_pcConnectedNoiseGenerator;
+ CSAAEnv * const m_pcConnectedEnvGenerator;
+ const int m_nConnectedMode; // 0 = nothing; 1 = envgenerator; 2 = noisegenerator
+
+ void UpdateOctaveOffsetData(void);
+ void SetAdd(void);
+
+public:
+ CSAAFreq(CSAANoise * const pcNoiseGenerator, CSAAEnv * const pcEnvGenerator);
+ ~CSAAFreq();
+ void SetFreqOffset(BYTE nOffset);
+ void SetFreqOctave(BYTE nOctave);
+ void _SetSampleRate(unsigned int nSampleRate);
+ void _SetOversample(unsigned int oversample);
+ void _SetClockRate(int nClockRate);
+ void Sync(bool bSync);
+ int Tick(void);
+ int Level(void) const;
+
+};
+
+inline int CSAAFreq::Level(void) const
+{
+ if (m_bSync)
+ return 1;
+
+ return m_nLevel;
+}
+
+#endif // SAAFREQ_H_INCLUDE
diff --git a/src/sound/saasound/SAAImpl.cpp b/src/sound/saasound/SAAImpl.cpp
new file mode 100644
index 000000000..f136eefc6
--- /dev/null
+++ b/src/sound/saasound/SAAImpl.cpp
@@ -0,0 +1,489 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAAImpl.cpp: implementation of the CSAASound class.
+// the bones of the 'virtual SAA-1099' emulation
+//
+// the actual sound generation is carried out in the other classes;
+// this class provides the output stage and the external interface only
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SAASound.h"
+
+#include "types.h"
+#include "SAAImpl.h"
+#include "defns.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CSAASoundInternal::CSAASoundInternal()
+ :
+m_chip(),
+m_uParam(0),
+m_uParamRate(0),
+m_nClockRate(EXTERNAL_CLK_HZ),
+m_nSampleRate(SAMPLE_RATE_HZ),
+m_nOversample(DEFAULT_OVERSAMPLE),
+#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE)
+m_bHighpass(false),
+m_nDebugSample(0)
+#else
+m_bHighpass(false)
+#endif
+{
+#ifdef USE_CONFIG_FILE
+ m_Config.ReadConfig();
+#endif
+
+#if defined(DEBUGSAA)
+ m_dbgfile.open(_T(DEBUG_SAA_REGISTER_LOG), std::ios_base::out);
+ m_pcmfile.open(_T(DEBUG_SAA_PCM_LOG), std::ios_base::out | std::ios_base::binary);
+#elif defined(USE_CONFIG_FILE)
+ if (m_Config.m_bGenerateRegisterLogs)
+ m_dbgfile.open(m_Config.m_strRegisterLogPath, std::ios_base::out);
+ if (m_Config.m_bGeneratePcmLogs)
+ m_pcmfile.open(m_Config.m_strPcmOutputPath, std::ios_base::out | std::ios_base::binary);
+
+ if (m_Config.m_bGeneratePcmLogs && m_Config.m_bGeneratePcmSeparateChannels)
+ {
+ for (int i = 0; i < 6; i++)
+ {
+ m_channel_pcmfile[i].open(m_Config.getChannelPcmOutputPath(i), std::ios_base::out | std::ios_base::binary);
+ }
+ }
+
+
+#endif
+ // set parameters
+ // TODO support defaults and overrides from config file
+ // m_chip.SetSoundParameters(SAAP_FILTER | SAAP_11025 | SAAP_8BIT | SAAP_MONO);
+ // reset the virtual SAA
+ // m_chip.Clear();
+
+ m_chip._SetClockRate(m_nClockRate);
+ m_chip._SetOversample(m_nOversample);
+}
+
+CSAASoundInternal::~CSAASoundInternal()
+{
+ //
+}
+
+//////////////////////////////////////////////////////////////////////
+// CSAASound members
+//////////////////////////////////////////////////////////////////////
+
+void CSAASoundInternal::SetClockRate(unsigned int nClockRate)
+{
+ m_nClockRate = nClockRate;
+ m_chip._SetClockRate(m_nClockRate);
+}
+
+void CSAASoundInternal::Clear(void)
+{
+ // reinitialises virtual SAA:
+ // sets reg 28 to 0x02; - sync and disabled
+ // sets regs 00-31 (except 28) to 0x00;
+ // sets reg 28 to 0x00;
+ // sets current reg to 0
+ WriteAddressData(28,2);
+ for (int i=31; i>=0; i--)
+ {
+ if (i!=28) WriteAddressData(i,0);
+ }
+ WriteAddressData(28,0);
+ WriteAddress(0);
+}
+
+void CSAASoundInternal::WriteData(BYTE nData)
+{
+ // originated from an OUT 255,d call
+ m_chip._WriteData(nData);
+#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE)
+#ifdef USE_CONFIG_FILE
+ if (m_Config.m_bGenerateRegisterLogs)
+ {
+#endif
+ m_dbgfile << m_nDebugSample << " " << (int)m_chip._ReadAddress() << ":" << (int)nData << std::endl;
+#ifdef USE_CONFIG_FILE
+ }
+#endif
+#endif
+}
+
+void CSAASoundInternal::WriteAddress(BYTE nReg)
+{
+ // originated from an OUT 511,r call
+ m_chip._WriteAddress(nReg);
+#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE)
+#ifdef USE_CONFIG_FILE
+ if (m_Config.m_bGenerateRegisterLogs)
+ {
+#endif
+ m_dbgfile << m_nDebugSample << " " << (int)nReg << ":";
+ if (nReg==24)
+ {
+ m_dbgfile << "";
+ }
+ else if (nReg==25)
+ {
+ m_dbgfile << "";
+ }
+ m_dbgfile << std::endl;
+#ifdef USE_CONFIG_FILE
+ }
+#endif
+#endif
+}
+
+void CSAASoundInternal::WriteAddressData(BYTE nReg, BYTE nData)
+{
+ // performs WriteAddress(nReg) followed by WriteData(nData)
+ m_chip._WriteAddress(nReg);
+ m_chip._WriteData(nData);
+}
+
+#if 1
+BYTE CSAASoundInternal::ReadAddress(void)
+{
+ // Not a real hardware function of the SAA-1099, which is write-only
+ return(m_chip._ReadAddress());
+}
+#else
+BYTE CSAASoundInternal::ReadAddress(void)
+{
+ // Not a real hardware function of the SAA-1099, which is write-only
+ return(0);
+}
+#endif
+
+void CSAASoundInternal::SetSoundParameters(SAAPARAM uParam)
+{
+ // set samplerate properties from uParam (deprecated but still supported)
+ unsigned int nSampleRate = m_nSampleRate;
+ switch (uParam & SAAP_MASK_SAMPLERATE)
+ {
+ case SAAP_44100:
+ nSampleRate = 44100;
+ m_uParamRate = (m_uParamRate & ~SAAP_MASK_SAMPLERATE) | SAAP_44100;
+ break;
+ case SAAP_22050:
+ nSampleRate = 22050;
+ m_uParamRate = (m_uParamRate & ~SAAP_MASK_SAMPLERATE) | SAAP_22050;
+ break;
+ case SAAP_11025:
+ nSampleRate = 11025;
+ m_uParamRate = (m_uParamRate & ~SAAP_MASK_SAMPLERATE) | SAAP_11025;
+ break;
+ case 0:// change nothing!
+ default:
+ break;
+ }
+
+ if (nSampleRate != m_nSampleRate)
+ {
+ m_nSampleRate = nSampleRate;
+ m_chip._SetSampleRate(m_nSampleRate);
+ }
+
+ // set filter properties from uParam
+ m_uParam = (m_uParam & ~SAAP_MASK_FILTER) | (uParam & SAAP_MASK_FILTER);
+
+ m_bHighpass=true;
+}
+
+void CSAASoundInternal::SetSampleRate(unsigned int nSampleRate)
+{
+ if (nSampleRate != m_nSampleRate)
+ {
+ m_nSampleRate = nSampleRate;
+ m_chip._SetSampleRate(m_nSampleRate);
+ }
+}
+
+void CSAASoundInternal::SetOversample(unsigned int nOversample)
+{
+ if (nOversample != m_nOversample)
+ {
+ m_nOversample = nOversample;
+ m_chip._SetOversample(m_nOversample);
+ }
+}
+
+SAAPARAM CSAASoundInternal::GetCurrentSoundParameters(void)
+{
+ return m_uParam | m_uParamRate;
+}
+
+unsigned short CSAASoundInternal::GetCurrentBytesPerSample(void)
+{
+ // 16 bit stereo => 4 bytes per sample
+ return 4;
+}
+
+/*static*/ unsigned short CSAASound::GetBytesPerSample(SAAPARAM uParam)
+{
+ // 16 bit stereo => 4 bytes per sample
+ switch (uParam & (SAAP_MASK_CHANNELS | SAAP_MASK_BITDEPTH))
+ {
+ case SAAP_STEREO | SAAP_16BIT:
+ return 4;
+ default:
+ return 0;
+ }
+}
+
+unsigned long CSAASoundInternal::GetCurrentSampleRate(void)
+{
+ return CSAASound::GetSampleRate(m_uParamRate);
+}
+
+/*static*/ unsigned long CSAASound::GetSampleRate(SAAPARAM uParam) // static member function
+{
+ switch (uParam & SAAP_MASK_SAMPLERATE)
+ {
+ case SAAP_11025:
+ return 11025;
+ case SAAP_22050:
+ return 22050;
+ case SAAP_44100:
+ return 44100;
+ default:
+ return 0;
+ }
+}
+
+#if defined(USE_CONFIG_FILE) || (defined(DEFAULT_BOOST) && DEFAULT_BOOST>1)
+#define DO_BOOST
+#endif
+
+void scale_for_output(unsigned int left_input, unsigned int right_input,
+ double oversample_scalar, bool highpass, double boost,
+ double& filterout_z1_left, double& filterout_z1_right,
+ BYTE* &pBuffer)
+{
+ double float_left = (double)left_input;
+ double float_right = (double)right_input;
+ float_left /= oversample_scalar;
+ float_right /= oversample_scalar;
+
+ // scale output into good range
+ float_left *= DEFAULT_UNBOOSTED_MULTIPLIER;
+ float_right *= DEFAULT_UNBOOSTED_MULTIPLIER;
+
+ if (highpass)
+ {
+ /* cutoff = 5 Hz (say)
+ const double b1 = exp(-2.0 * M_PI * (Fc/Fs))
+ const double a0 = 1.0 - b1;
+ */
+ const double b1 = 0.99928787;
+ const double a0 = 1.0 - b1;
+
+ filterout_z1_left = float_left * a0 + filterout_z1_left * b1;
+ filterout_z1_right = float_right * a0 + filterout_z1_right * b1;
+ float_left -= filterout_z1_left;
+ float_right -= filterout_z1_right;
+ }
+
+ // multiply by boost, if defined
+#if defined(DO_BOOST)
+ float_left *= boost;
+ float_right *= boost;
+#endif
+ // convert to 16-bit signed range with hard clipping
+ signed short left_output = (signed short)(float_left > 32767 ? 32767 : float_left < -32768 ? -32768 : float_left);
+ signed short right_output = (signed short)(float_right > 32767 ? 32767 : float_right < -32768 ? -32768 : float_right);
+
+ *pBuffer++ = left_output & 0x00ff;
+ *pBuffer++ = (left_output >> 8) & 0x00ff;
+ *pBuffer++ = right_output & 0x00ff;
+ *pBuffer++ = (right_output >> 8) & 0x00ff;
+}
+
+void CSAASoundInternal::GenerateMany(BYTE* pBuffer, unsigned long nSamples)
+{
+ unsigned int left_mixed, right_mixed;
+ static double filterout_z1_left_mixed = 0, filterout_z1_right_mixed = 0;
+
+#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE)
+ BYTE* pBufferStart = pBuffer;
+ unsigned long nTotalSamples = nSamples;
+#endif
+
+#if defined(DO_BOOST)
+#if defined(USE_CONFIG_FILE)
+ double nBoost = m_Config.m_nBoost;
+#else
+ double nBoost = DEFAULT_BOOST;
+#endif
+#else
+ double nBoost = 1.0;
+#endif
+
+ double oversample = double(1 << m_nOversample);
+
+#if defined(USE_CONFIG_FILE)
+ static double filterout_z1_left_0 = 0, filterout_z1_right_0 = 0;
+ static double filterout_z1_left_1 = 0, filterout_z1_right_1 = 0;
+ static double filterout_z1_left_2 = 0, filterout_z1_right_2 = 0;
+ static double filterout_z1_left_3 = 0, filterout_z1_right_3 = 0;
+ static double filterout_z1_left_4 = 0, filterout_z1_right_4 = 0;
+ static double filterout_z1_left_5 = 0, filterout_z1_right_5 = 0;
+
+ if (m_Config.m_bGeneratePcmLogs && m_Config.m_bGeneratePcmSeparateChannels)
+ {
+ unsigned int left0, right0, left1, right1, left2, right2, left3, right3, left4, right4, left5, right5;
+ BYTE* pChannelBufferPtr[6] = { m_pChannelBuffer[0], m_pChannelBuffer[1], m_pChannelBuffer[2], m_pChannelBuffer[3], m_pChannelBuffer[4], m_pChannelBuffer[5] };
+
+ while (nSamples--)
+ {
+ m_chip._TickAndOutputSeparate(left_mixed, right_mixed,
+ left0, right0,
+ left1, right1,
+ left2, right2,
+ left3, right3,
+ left4, right4,
+ left5, right5);
+ scale_for_output(left_mixed, right_mixed, oversample, m_bHighpass, nBoost, filterout_z1_left_mixed, filterout_z1_right_mixed, pBuffer);
+
+ // and the separate channels
+ scale_for_output(left0, right0, oversample, m_bHighpass, nBoost, filterout_z1_left_0, filterout_z1_right_0, pChannelBufferPtr[0]);
+ scale_for_output(left1, right1, oversample, m_bHighpass, nBoost, filterout_z1_left_1, filterout_z1_right_1, pChannelBufferPtr[1]);
+ scale_for_output(left2, right2, oversample, m_bHighpass, nBoost, filterout_z1_left_2, filterout_z1_right_2, pChannelBufferPtr[2]);
+ scale_for_output(left3, right3, oversample, m_bHighpass, nBoost, filterout_z1_left_3, filterout_z1_right_3, pChannelBufferPtr[3]);
+ scale_for_output(left4, right4, oversample, m_bHighpass, nBoost, filterout_z1_left_4, filterout_z1_right_4, pChannelBufferPtr[4]);
+ scale_for_output(left5, right5, oversample, m_bHighpass, nBoost, filterout_z1_left_5, filterout_z1_right_5, pChannelBufferPtr[5]);
+
+ // flush channel output PCM buffers when full
+ if (pChannelBufferPtr[0] >= m_pChannelBuffer[0] + CHANNEL_BUFFER_SIZE)
+ {
+ for (int i = 0; i < 6; i++)
+ {
+ m_channel_pcmfile[i].write((const char*)m_pChannelBuffer[i], CHANNEL_BUFFER_SIZE);
+ pChannelBufferPtr[i] = m_pChannelBuffer[i];
+ }
+ }
+ }
+ // flush remaining channel PCM output data
+ if (pChannelBufferPtr[0] >= m_pChannelBuffer[0])
+ {
+ for (int i = 0; i < 6; i++)
+ {
+ m_channel_pcmfile[i].write((const char*)m_pChannelBuffer[i], pChannelBufferPtr[i]-m_pChannelBuffer[i]);
+ }
+ }
+ }
+ else
+ {
+#endif
+ while (nSamples--)
+ {
+ m_chip._TickAndOutputStereo(left_mixed, right_mixed);
+ scale_for_output(left_mixed, right_mixed, oversample, m_bHighpass, nBoost, filterout_z1_left_mixed, filterout_z1_right_mixed, pBuffer);
+ }
+
+#if defined(USE_CONFIG_FILE)
+ }
+#endif
+
+#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE)
+#ifdef USE_CONFIG_FILE
+ if (m_Config.m_bGeneratePcmLogs)
+ {
+#endif
+ m_pcmfile.write((const char *)pBufferStart, nTotalSamples * (unsigned long)GetCurrentBytesPerSample());
+ m_nDebugSample += nTotalSamples;
+#ifdef USE_CONFIG_FILE
+ }
+#endif
+
+#endif
+}
+
+///////////////////////////////////////////////////////
+
+LPCSAASOUND SAAAPI CreateCSAASound(void)
+{
+ return (new CSAASoundInternal);
+}
+
+void SAAAPI DestroyCSAASound(LPCSAASOUND object)
+{
+ delete (object);
+}
+
+
+/* thoughts on lowpass filtering as part of oversampling.
+I tried this and really it didn't seem to make a lot of (audible) difference.
+
+// lowpass oversample filter adds complexity and not particularly audibly better than simple averaging.
+// use_lowpass_oversample_filter_average_output adds an additional averaging step to the output of the oversample
+// filter. this seems critical, because without this, the raw output of the lowpass filter is full of aliases
+// If use_lowpass_oversample_filter is False, then the _average_output flag is ignored.
+// Default, use_lowpass_oversample_filter is False, it sounds just fine really.
+
+//#define USE_LOWPASS_OVERSAMPLE_FILTER
+#undef USE_LOWPASS_OVERSAMPLE_FILTER
+//#define USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT
+#undef USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT
+
+#ifdef USE_LOWPASS_OVERSAMPLE_FILTER
+static double oversample_lp_filterout_z1_left_stages[10] = { 0,0,0,0,0,0,0,0,0,0 };
+static double oversample_lp_filterout_z1_right_stages[10] = { 0,0,0,0,0,0,0,0,0,0 };
+double averaged_filterout_left = 0.0, averaged_filterout_right = 0.0;
+const int nStages = 10;
+for (int i = 0; i < 1 << m_nOversample; i++)
+{
+ Noise[0]->Tick();
+ Noise[1]->Tick();
+ f_left = f_right = 0;
+ for (int c = 0; c < 6; c++)
+ {
+ Amp[c]->TickAndOutputStereo(temp_left, temp_right);
+ f_left += (double)temp_left;
+ f_right += (double)temp_right;
+ }
+ // apply lowpass here.
+ // HACK: ASSUME m_nOversample is 64 (I was experimenting only using the 64x oversample anyway)
+ // therefore Fs = 44100*64
+ // let's set Fc = 10kHz
+ // so Fc/Fs = 0.00354308390022675736961451247166
+ // const double b1 = exp(-2.0 * M_PI * (Fc/Fs))
+ // const double a0 = 1.0 - b1;
+ // const double b1 = 0.9779841137335348363722276130195;
+ const double b1 = 0.977;
+ const double a0 = 1.0 - b1;
+
+ oversample_lp_filterout_z1_left_stages[0] = f_left * a0 + oversample_lp_filterout_z1_left_stages[0] * b1;
+ for (int stage = 1; stage < nStages; stage++)
+ oversample_lp_filterout_z1_left_stages[stage] = oversample_lp_filterout_z1_left_stages[stage - 1] * a0 + oversample_lp_filterout_z1_left_stages[stage] * b1;
+ oversample_lp_filterout_z1_right_stages[0] = f_right * a0 + oversample_lp_filterout_z1_right_stages[0] * b1;
+ for (int stage = 1; stage < nStages; stage++)
+ oversample_lp_filterout_z1_right_stages[stage] = oversample_lp_filterout_z1_right_stages[stage - 1] * a0 + oversample_lp_filterout_z1_right_stages[stage] * b1;
+
+#ifdef USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT
+ averaged_filterout_left += oversample_lp_filterout_4z1_left;
+ averaged_filterout_right += oversample_lp_filterout_4z1_right;
+#endif
+}
+
+// by the end of this loop we will have computed the oversample lowpass filter m_nOversample times
+// and yielded exactly ONE sample output.
+#ifdef USE_LOWPASS_OVERSAMPLE_FILTER_AVERAGE_OUTPUT
+f_left = averaged_filterout_left / (1 << m_nOversample);
+f_right = averaged_filterout_right / (1 << m_nOversample);
+#else
+f_left = oversample_lp_filterout_z1_left_stages[nStages - 1];
+f_right = oversample_lp_filterout_z1_right_stages[nStages - 1];
+#endif
+
+#else
+ // do the simple 1/N averaging which is easier and sounds good enough
+
+#endif
+
+*/
+
diff --git a/src/sound/saasound/SAAImpl.h b/src/sound/saasound/SAAImpl.h
new file mode 100755
index 000000000..61fa79c58
--- /dev/null
+++ b/src/sound/saasound/SAAImpl.h
@@ -0,0 +1,75 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// This is the internal implementation (header file) of the SAASound object.
+// This is done so that the external interface to the object always stays the same
+// (SAASound.h) even though the internal object can change
+// .. Meaning future releases don't require relinking everyone elses code against
+// the updated saasound stuff
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAAIMPL_H_INCLUDED
+#define SAAIMPL_H_INCLUDED
+
+#include "SAASound.h"
+#include "SAADevice.h"
+#ifdef USE_CONFIG_FILE
+#include "SAAConfig.h"
+#endif
+
+#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE)
+#include
+#include
+#include
+
+#if defined(USE_CONFIG_FILE)
+const int CHANNEL_BUFFER_SIZE=1024;
+#endif
+#endif
+
+class CSAASoundInternal : public CSAASound
+{
+private:
+ CSAADevice m_chip;
+ int m_uParam, m_uParamRate;
+ unsigned int m_nClockRate;
+ unsigned int m_nSampleRate;
+ unsigned int m_nOversample;
+ bool m_bHighpass;
+#ifdef USE_CONFIG_FILE
+ SAAConfig m_Config;
+#endif
+#if defined(DEBUGSAA) || defined(USE_CONFIG_FILE)
+ unsigned long m_nDebugSample;
+ std::ofstream m_dbgfile, m_pcmfile;
+#if defined(USE_CONFIG_FILE)
+ std::ofstream m_channel_pcmfile[6];
+ BYTE m_pChannelBuffer[6][CHANNEL_BUFFER_SIZE];
+#endif
+#endif
+
+public:
+ CSAASoundInternal();
+ ~CSAASoundInternal();
+
+ void SetClockRate(unsigned int nClockRate);
+ void SetSampleRate(unsigned int nClockRate);
+ void SetOversample(unsigned int nOversample);
+ void SetSoundParameters(SAAPARAM uParam);
+ void WriteAddress(BYTE nReg);
+ void WriteData(BYTE nData);
+ void WriteAddressData(BYTE nReg, BYTE nData);
+ BYTE ReadAddress(void);
+ void Clear(void);
+
+ SAAPARAM GetCurrentSoundParameters(void);
+ unsigned long GetCurrentSampleRate(void);
+ static unsigned long GetSampleRate(SAAPARAM uParam);
+ unsigned short GetCurrentBytesPerSample(void);
+ static unsigned short GetBytesPerSample(SAAPARAM uParam);
+
+ void GenerateMany(BYTE * pBuffer, unsigned long nSamples);
+
+};
+
+#endif // SAAIMPL_H_INCLUDED
diff --git a/src/sound/saasound/SAANoise.cpp b/src/sound/saasound/SAANoise.cpp
new file mode 100755
index 000000000..1cf3458dd
--- /dev/null
+++ b/src/sound/saasound/SAANoise.cpp
@@ -0,0 +1,180 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAANoise.cpp: implementation of the CSAANoise class.
+// One noise generator
+//
+// After construction, it's important to SetSampleRate before
+// trying to use the generator.
+// (Just because the CSAANoise object has a default samplerate
+// doesn't mean you should rely on it)
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SAASound.h"
+
+#include "types.h"
+#include "SAANoise.h"
+#include "defns.h"
+
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CSAANoise::CSAANoise()
+:
+m_nCounter(0),
+m_nCounter_low(0),
+m_nOversample(0),
+m_nCounterLimit_low(1),
+m_bSync(false),
+m_nSampleRate(SAMPLE_RATE_HZ),
+m_nSourceMode(0),
+m_nRand(1)
+{
+ _SetClockRate(EXTERNAL_CLK_HZ);
+ m_nAdd = m_nAddBase;
+}
+
+CSAANoise::CSAANoise(unsigned long seed)
+:
+m_nCounter(0),
+m_nCounter_low(0),
+m_nOversample(0),
+m_nCounterLimit_low(1),
+m_bSync(false),
+m_nSampleRate(SAMPLE_RATE_HZ),
+m_nSourceMode(0),
+m_nRand(seed)
+{
+ _SetClockRate(EXTERNAL_CLK_HZ);
+ m_nAdd = m_nAddBase;
+}
+
+CSAANoise::~CSAANoise()
+{
+ // Nothing to do
+}
+
+void CSAANoise::_SetClockRate(int nClockRate)
+{
+ // at 8MHz the clock rate is 31.250kHZ
+ // This is simply the clock rate divided by 256 i.e. 2^8
+ // We then shift this by 2^12 (like the Freq) for better
+ // period accuracy. So that's the same as shifting by (12-8)
+ m_nAddBase = nClockRate << (12 - 8);
+}
+
+void CSAANoise::Seed(unsigned long seed)
+{
+ m_nRand = seed;
+}
+
+void CSAANoise::SetSource(int nSource)
+{
+ m_nSourceMode = nSource;
+ m_nAdd = m_nAddBase >> m_nSourceMode;
+}
+
+void CSAANoise::Trigger(void)
+{
+ // Trigger only does anything useful when we're
+ // clocking from the frequency generator - i.e
+ // if bUseFreqGen = true (i.e. SourceMode = 3)
+
+ // So if we're clocking from the noise generator
+ // clock (ie, SourceMode = 0, 1 or 2) then do nothing
+
+// No point actually checking m_bSync here ... because if sync is true,
+// then frequency generators won't actually be generating Trigger pulses
+// so we wouldn't even get here!
+ // EXCEPT - cool edge case: if sync is set, then actually the Noise Generator
+ // is triggered on EVERY CLOCK PULSE (i.e. 8MHz noise). So indeed it is correct
+ // to not check for sync here. NEEDS TEST CASE.
+
+ if (m_nSourceMode == 3)
+ {
+ ChangeLevel();
+ }
+}
+
+void CSAANoise::Tick(void)
+{
+ // Tick only does anything useful when we're
+ // clocking from the noise generator clock
+ // (ie, SourceMode = 0, 1 or 2)
+
+ // So, if SourceMode = 3 (ie, we're clocking from a
+ // frequency generator ==> bUseFreqGen = true)
+ // then do nothing
+ if ( (!m_bSync) && (m_nSourceMode!=3) )
+ {
+ m_nCounter += m_nAdd;
+ while (m_nCounter >= (m_nSampleRate<<12))
+ {
+ m_nCounter -= (m_nSampleRate<<12);
+ m_nCounter_low++;
+ if (m_nCounter_low >= m_nCounterLimit_low)
+ {
+ m_nCounter_low = 0;
+ ChangeLevel();
+ }
+ }
+ }
+}
+
+void CSAANoise::Sync(bool bSync)
+{
+ if (bSync)
+ {
+ m_nCounter = 0;
+ m_nCounter_low = 0;
+ }
+ m_bSync = bSync;
+}
+
+
+void CSAANoise::_SetSampleRate(int nSampleRate)
+{
+ m_nSampleRate = nSampleRate;
+}
+
+
+void CSAANoise::_SetOversample(unsigned int oversample)
+{
+ // oversample is a power of 2 i.e.
+ // if oversample == 2 then 4x oversample
+ // if oversample == 6 then 64x oversample
+ if (oversample < m_nOversample)
+ {
+ m_nCounter_low <<= (m_nOversample - oversample);
+ }
+ else
+ {
+ m_nCounter_low >>= (oversample - m_nOversample);
+ }
+
+ m_nCounterLimit_low = 1<> 1) ^ 0x20400;
+ }
+ else
+ {
+ m_nRand >>= 1;
+ }
+}
diff --git a/src/sound/saasound/SAANoise.h b/src/sound/saasound/SAANoise.h
new file mode 100755
index 000000000..61a65dee8
--- /dev/null
+++ b/src/sound/saasound/SAANoise.h
@@ -0,0 +1,54 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAANoise.h: interface for the CSAANoise class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAANOISE_H_INCLUDED
+#define SAANOISE_H_INCLUDED
+
+class CSAANoise
+{
+private:
+ unsigned long m_nCounter;
+ unsigned long m_nAdd;
+ unsigned long m_nCounter_low;
+ unsigned int m_nOversample;
+ unsigned long m_nCounterLimit_low;
+ bool m_bSync; // see description of "SYNC" bit of register 28
+ unsigned long m_nSampleRate; // = 44100 when RateMode=0, for example
+ int m_nSourceMode;
+ unsigned long m_nAddBase; // nAdd for 31.25 kHz noise at 44.1 kHz samplerate
+
+ // pseudo-random number generator
+ unsigned long m_nRand;
+
+ void ChangeLevel(void);
+
+
+public:
+ CSAANoise();
+ CSAANoise(unsigned long seed);
+ ~CSAANoise();
+
+ void SetSource(int nSource);
+ void Trigger(void);
+ void _SetSampleRate(int nSampleRate);
+ void _SetOversample(unsigned int oversample);
+ void _SetClockRate(int nClockRate);
+ void Seed(unsigned long seed);
+
+ void Tick(void);
+ int Level(void) const;
+ void Sync(bool bSync);
+
+};
+
+inline int CSAANoise::Level(void) const
+{
+ // returns 0 or 1
+ return (m_nRand & 0x00000001);
+}
+
+
+#endif // SAANOISE_H_INCLUDED
diff --git a/src/sound/saasound/SAASndC.cpp b/src/sound/saasound/SAASndC.cpp
new file mode 100755
index 000000000..9af0d76e7
--- /dev/null
+++ b/src/sound/saasound/SAASndC.cpp
@@ -0,0 +1,100 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// Thanks to this file (and associated header file) you can now
+// use CSAASound from within a standard 'C' program
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "SAASound.h"
+#include "types.h"
+#include "SAAEnv.h"
+#include "SAANoise.h"
+#include "SAAFreq.h"
+#include "SAAAmp.h"
+#include "SAASound.h"
+#include "SAAImpl.h"
+
+SAASND SAAAPI newSAASND(void)
+{
+ return (SAASND)(new CSAASoundInternal());
+}
+
+void SAAAPI deleteSAASND(SAASND object)
+{
+ delete (LPCSAASOUND)(object);
+}
+
+void SAAAPI SAASNDSetClockRate(SAASND object, unsigned int nClockRate)
+{
+ ((LPCSAASOUND)(object))->SetClockRate(nClockRate);
+}
+
+void SAAAPI SAASNDSetSoundParameters(SAASND object, SAAPARAM uParam)
+{
+ ((LPCSAASOUND)(object))->SetSoundParameters(uParam);
+}
+
+void SAAAPI SAASNDWriteAddress(SAASND object, BYTE nReg)
+{
+ ((LPCSAASOUND)(object))->WriteAddress(nReg);
+}
+
+void SAAAPI SAASNDWriteData(SAASND object, BYTE nData)
+{
+ ((LPCSAASOUND)(object))->WriteData(nData);
+}
+
+void SAAAPI SAASNDWriteAddressData(SAASND object, BYTE nReg, BYTE nData)
+{
+ ((LPCSAASOUND)(object))->WriteAddressData(nReg, nData);
+}
+
+void SAAAPI SAASNDClear(SAASND object)
+{
+ ((LPCSAASOUND)(object))->Clear();
+}
+
+SAAPARAM SAAAPI SAASNDGetCurrentSoundParameters(SAASND object)
+{
+ return ((LPCSAASOUND)(object))->GetCurrentSoundParameters();
+}
+
+unsigned short SAAAPI SAASNDGetCurrentBytesPerSample(SAASND object)
+{
+ return ((LPCSAASOUND)(object))->GetCurrentBytesPerSample();
+}
+
+unsigned short SAAAPI SAASNDGetBytesPerSample(SAAPARAM uParam)
+{
+ return CSAASound::GetBytesPerSample(uParam);
+}
+
+unsigned long SAAAPI SAASNDGetCurrentSampleRate(SAASND object)
+{
+ return ((LPCSAASOUND)(object))->GetCurrentSampleRate();
+}
+
+unsigned long SAAAPI SAASNDGetSampleRate(SAAPARAM uParam)
+{
+ return CSAASound::GetSampleRate(uParam);
+}
+
+void SAAAPI SAASNDGenerateMany(SAASND object, BYTE * pBuffer, unsigned long nSamples)
+{
+ ((LPCSAASOUND)(object))->GenerateMany(pBuffer, nSamples);
+}
+
+void SAAAPI SAASNDSetSampleRate(SAASND object, unsigned int nSampleRate)
+{
+ return ((LPCSAASOUND)(object))->SetSampleRate(nSampleRate);
+}
+
+void SAAAPI SAASNDSetOversample(SAASND object, unsigned int nOversample)
+{
+ return ((LPCSAASOUND)(object))->SetOversample(nOversample);
+}
+
+BYTE SAAAPI SAASNDReadAddress(SAASND object)
+{
+ return ((LPCSAASOUND)(object))->ReadAddress();
+}
diff --git a/src/sound/saasound/SAASndC.h b/src/sound/saasound/SAASndC.h
new file mode 100644
index 000000000..c6fd65765
--- /dev/null
+++ b/src/sound/saasound/SAASndC.h
@@ -0,0 +1,102 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// **********
+// * PUBLIC *
+// **********
+//
+// SAASndC.h: "C-style" interface for the CSAASound class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAASNDC_H_INCLUDED
+#define SAASNDC_H_INCLUDED
+
+#ifdef _MSC_VER
+#if _MSC_VER >= 1000
+#pragma once
+#endif // _MSC_VER >= 1000
+#endif
+
+#ifndef SAASOUND_H_INCLUDED
+
+// Parameters for use with SetSoundParameters, for example,
+// SetSoundParameters(SAAP_NOFILTER | SAAP_44100 | SAAP_16BIT | SAAP_STEREO);
+#define SAAP_FILTER_HIGHPASS_SIMPLE 0x00000400
+#define SAAP_FILTER_OVERSAMPLE64x 0x00000300
+#define SAAP_FILTER_OVERSAMPLE2x 0x00000200
+#define SAAP_FILTER SAAP_FILTER_OVERSAMPLE2x
+#define SAAP_NOFILTER 0x00000100
+#define SAAP_44100 0x00000030
+#define SAAP_22050 0x00000020
+#define SAAP_11025 0x00000010
+#define SAAP_16BIT 0x0000000c
+#define SAAP_8BIT 0x00000004
+#define SAAP_STEREO 0x00000003
+#define SAAP_MONO 0x00000001
+
+// Bitmasks for use with GetCurrentSoundParameters, for example,
+// unsigned long CurrentSampleRateParameter = GetCurrentSoundParameters()
+#define SAAP_MASK_FILTER 0x00000f00
+#define SAAP_MASK_FILTER_HIGHPASS 0x00000c00
+#define SAAP_MASK_FILTER_OVERSAMPLE 0x00000300
+#define SAAP_MASK_SAMPLERATE 0x000000030
+#define SAAP_MASK_BITDEPTH 0x0000000c
+#define SAAP_MASK_CHANNELS 0x00000003
+
+typedef unsigned long SAAPARAM;
+
+
+#ifndef BYTE
+#define BYTE unsigned char
+#endif
+
+#ifdef WIN32
+#ifndef WINAPI
+#define WINAPI __stdcall
+#endif
+#define EXTAPI __declspec(dllexport) WINAPI
+#else // Win32
+#ifndef WINAPI
+#define WINAPI /**/
+#endif
+#define EXTAPI /**/
+#endif // Win32
+
+#endif // SAASOUND_H_INCLUDED
+
+typedef void * SAASND;
+
+// the following are implemented as calls, etc, to a class.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SAASND EXTAPI newSAASND(void);
+void EXTAPI deleteSAASND(SAASND object);
+
+void EXTAPI SAASNDSetSoundParameters(SAASND object, SAAPARAM uParam);
+void EXTAPI SAASNDWriteAddress(SAASND object, BYTE nReg);
+void EXTAPI SAASNDWriteData(SAASND object, BYTE nData);
+void EXTAPI SAASNDWriteAddressData(SAASND object, BYTE nReg, BYTE nData);
+void EXTAPI SAASNDClear(SAASND object);
+BYTE EXTAPI SAASNDReadAddress(SAASND object);
+
+SAAPARAM EXTAPI SAASNDGetCurrentSoundParameters(SAASND object);
+unsigned short EXTAPI SAASNDGetCurrentBytesPerSample(SAASND object);
+unsigned short EXTAPI SAASNDGetBytesPerSample(SAAPARAM uParam);
+unsigned long EXTAPI SAASNDGetCurrentSampleRate(SAASND object);
+unsigned long EXTAPI SAASNDGetSampleRate(SAAPARAM uParam);
+
+void EXTAPI SAASNDGenerateMany(SAASND object, BYTE * pBuffer, unsigned long nSamples);
+
+void EXTAPI SAASNDSetClockRate(SAASND object, unsigned int nClockRate);
+void EXTAPI SAASNDSetSampleRate(SAASND object, unsigned int nSampleRate);
+void EXTAPI SAASNDSetOversample(SAASND object, unsigned int nOversample);
+
+
+#ifdef __cplusplus
+}; // extern "C"
+#endif
+
+#endif // SAASNDC_H_INCLUDED
diff --git a/src/sound/saasound/SAASound.cpp b/src/sound/saasound/SAASound.cpp
new file mode 100755
index 000000000..c5e33d862
--- /dev/null
+++ b/src/sound/saasound/SAASound.cpp
@@ -0,0 +1,13 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAASound.cpp - dummy function
+//
+//////////////////////////////////////////////////////////////////////
+
+#include
+
+// Provide something so the compiler doesn't optimise us out of existance
+int SomeFunction ()
+{
+ return 42;
+}
diff --git a/src/sound/saasound/SAASound.h b/src/sound/saasound/SAASound.h
new file mode 100644
index 000000000..a5e9265ac
--- /dev/null
+++ b/src/sound/saasound/SAASound.h
@@ -0,0 +1,130 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// SAASound.h: interface for the CSAASound class.
+//
+// This corresponds to the public (exported) DLL interface, so all
+// APIs and client factory methods belong here.
+//
+// Compatibility notes : the intention is for this to be fully backwards
+// compatible across minor and patch versions. Any backwards breaking changes
+// should be reflected as a major version increment. New functionality can be added
+// in minor versions so long as backwards compatiblity is maintained
+//
+// Version 3.3.0 (4th Dec 2018)
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef SAASOUND_H_INCLUDED
+#define SAASOUND_H_INCLUDED
+
+// define this if you want to output diagnostic text and PCM files
+//#define DEBUGSAA
+
+// Parameters for use with SetSoundParameters, for example,
+// SetSoundParameters(SAAP_NOFILTER | SAAP_44100 | SAA_16BIT | SAA_STEREO);
+// SAAP_FILTER_HIGHPASS_SIMPLE can be ORd with SAAP_FILTER_OVERSAMPLE64x/2x
+#define SAAP_FILTER_HIGHPASS_SIMPLE 0x00000400
+#define SAAP_FILTER_OVERSAMPLE64x 0x00000300
+#define SAAP_FILTER_OVERSAMPLE2x 0x00000200
+#define SAAP_FILTER SAAP_FILTER_OVERSAMPLE2x
+#define SAAP_NOFILTER 0x00000100
+#define SAAP_44100 0x00000030
+#define SAAP_22050 0x00000020
+#define SAAP_11025 0x00000010
+#define SAAP_16BIT 0x0000000c
+#define SAAP_8BIT 0x00000004
+#define SAAP_STEREO 0x00000003
+#define SAAP_MONO 0x00000001
+
+// Bitmasks for use with GetCurrentSoundParameters, for example,
+// unsigned long CurrentSampleRateParameter = GetCurrentSoundParameters()
+#define SAAP_MASK_FILTER 0x00000f00
+#define SAAP_MASK_FILTER_HIGHPASS 0x00000c00
+#define SAAP_MASK_FILTER_OVERSAMPLE 0x00000300
+#define SAAP_MASK_SAMPLERATE 0x000000030
+#define SAAP_MASK_BITDEPTH 0x0000000c
+#define SAAP_MASK_CHANNELS 0x00000003
+
+typedef unsigned long SAAPARAM;
+
+
+#ifndef BYTE
+#define BYTE unsigned char
+#endif
+
+#ifdef _WIN32
+#define SAAAPI _stdcall
+#else
+#define SAAAPI
+#endif
+
+
+#ifdef __cplusplus
+
+class CSAASound
+{
+public:
+ virtual ~CSAASound() { }
+
+ virtual void SetSoundParameters (SAAPARAM uParam) = 0;
+ virtual void WriteAddress (BYTE nReg) = 0;
+ virtual void WriteData (BYTE nData) = 0;
+ virtual void WriteAddressData (BYTE nReg, BYTE nData) = 0;
+ virtual void Clear () = 0;
+ virtual BYTE ReadAddress () = 0;
+
+ virtual SAAPARAM GetCurrentSoundParameters () = 0;
+ virtual unsigned long GetCurrentSampleRate () = 0;
+ static unsigned long GetSampleRate (SAAPARAM uParam);
+ virtual unsigned short GetCurrentBytesPerSample () = 0;
+ static unsigned short GetBytesPerSample (SAAPARAM uParam);
+
+ virtual void GenerateMany (BYTE * pBuffer, unsigned long nSamples) = 0;
+
+ virtual void SetClockRate(unsigned int nClockRate) = 0;
+ virtual void SetSampleRate(unsigned int nSampleRate) = 0;
+ virtual void SetOversample(unsigned int nOversample) = 0;
+};
+
+typedef class CSAASound * LPCSAASOUND;
+
+LPCSAASOUND SAAAPI CreateCSAASound(void);
+void SAAAPI DestroyCSAASound(LPCSAASOUND object);
+
+#endif // __cplusplus
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void * SAASND;
+
+// "C-style" interface for the CSAASound class
+SAASND SAAAPI newSAASND(void);
+void SAAAPI deleteSAASND(SAASND object);
+
+void SAAAPI SAASNDSetSoundParameters(SAASND object, SAAPARAM uParam);
+void SAAAPI SAASNDWriteAddress(SAASND object, BYTE nReg);
+void SAAAPI SAASNDWriteData(SAASND object, BYTE nData);
+void SAAAPI SAASNDWriteAddressData(SAASND object, BYTE nReg, BYTE nData);
+void SAAAPI SAASNDClear(SAASND object);
+
+SAAPARAM SAAAPI SAASNDGetCurrentSoundParameters(SAASND object);
+unsigned short SAAAPI SAASNDGetCurrentBytesPerSample(SAASND object);
+unsigned short SAAAPI SAASNDGetBytesPerSample(SAAPARAM uParam);
+unsigned long SAAAPI SAASNDGetCurrentSampleRate(SAASND object);
+unsigned long SAAAPI SAASNDGetSampleRate(SAAPARAM uParam);
+
+void SAAAPI SAASNDGenerateMany(SAASND object, BYTE * pBuffer, unsigned long nSamples);
+void SAAAPI SAASNDSetClockRate(SAASND object, unsigned int nClockRate);
+void SAAAPI SAASNDSetSampleRate(SAASND object, unsigned int nSampleRate);
+void SAAAPI SAASNDSetOversample(SAASND object, unsigned int nOversample);
+
+BYTE SAAAPI SAASNDReadAddress(SAASND object);
+
+#ifdef __cplusplus
+}; // extern "C"
+#endif
+
+#endif // SAASOUND_H_INCLUDED
diff --git a/src/sound/saasound/defns.h b/src/sound/saasound/defns.h
new file mode 100644
index 000000000..e81d1c819
--- /dev/null
+++ b/src/sound/saasound/defns.h
@@ -0,0 +1,59 @@
+// Part of SAASound copyright 2020 Dave Hooper
+//
+// defns.h: compile-time configuration parameters
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef DEFNS_H_INCLUDED
+#define DEFNS_H_INCLUDED
+
+#define HAVE_CONFIG_H
+#ifdef HAVE_CONFIG_H
+// using CMAKE
+#include "saasound_cmake_config.h"
+#else
+
+// initial default SAA1099 crystal clock rate in HZ (can be changed subsequently by calling SetClockRate)
+#define EXTERNAL_CLK_HZ 8000000
+
+// define SAAFREQ_FIXED_CLOCKRATE if the above external clock rate is the only supported clock rate
+// i.e. only support a single compile-time clock rate (=> this also prevents using the SetClockRate method)
+#undef SAAFREQ_FIXED_CLOCKRATE
+// #define SAAFREQ_FIXED_CLOCKRATE
+
+// initial default sample rate (audio samplerate)
+#define SAMPLE_RATE_HZ 44100
+
+// initial default oversample (audio quality) recommend 0<=oversample<=6
+#define DEFAULT_OVERSAMPLE 6
+
+// Whether to dump out a log of all register and value changes and raw output pcm
+//#define DEBUGSAA
+#undef DEBUGSAA
+
+// the (default) names of the register output and pcm output log files.
+// If you're using a config file, you can change these (or, if you enable
+// debugging via the config file settings, but leave the filenames unspecified,
+// it will use these defaults)
+#define DEBUG_SAA_REGISTER_LOG "debugsaa.txt"
+#define DEBUG_SAA_PCM_LOG "debugsaa.pcm"
+// Whether to include support for these debug logs via config file (only making
+// sense if USE_CONFIG_FILE is also defined)
+
+// Whether to support a startup configuration file that is parsed at load time
+// #undef USE_CONFIG_FILE
+#define USE_CONFIG_FILE
+
+// and if so, what is its location
+#ifdef USE_CONFIG_FILE
+#define CONFIG_FILE_PATH "SAASound.cfg"
+#endif // USE_CONFIG_FILE
+
+#define DEFAULT_UNBOOSTED_MULTIPLIER 11.35
+
+#define DEFAULT_BOOST 1
+
+
+#endif // HAVE_CONFIG_H
+
+#endif // DEFNS_H_INCLUDED
diff --git a/src/sound/saasound/resource.h b/src/sound/saasound/resource.h
new file mode 100755
index 000000000..0b893bf3a
--- /dev/null
+++ b/src/sound/saasound/resource.h
@@ -0,0 +1,15 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by SAASound.rc
+//
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/src/sound/saasound/saasound_cmake_config.h b/src/sound/saasound/saasound_cmake_config.h
new file mode 100644
index 000000000..da914a71b
--- /dev/null
+++ b/src/sound/saasound/saasound_cmake_config.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#define EXTERNAL_CLK_HZ 7159090
+/* #undef SAAFREQ_FIXED_CLOCKRATE */
+#define SAMPLE_RATE_HZ 44100
+#define DEFAULT_OVERSAMPLE 6
+#define DEFAULT_UNBOOSTED_MULTIPLIER 11.3
+#define DEFAULT_BOOST 1
+/* #undef DEBUGSAA */
+#define DEBUG_SAA_REGISTER_LOG "debugsaa.txt"
+#define DEBUG_SAA_PCM_LOG "debugsaa.pcm"
+
+/* #undef USE_CONFIG_FILE */
+#define CONFIG_FILE_PATH "SAASound.cfg"
diff --git a/src/sound/saasound/types.h b/src/sound/saasound/types.h
new file mode 100755
index 000000000..4eb62f485
--- /dev/null
+++ b/src/sound/saasound/types.h
@@ -0,0 +1,34 @@
+// Part of SAASound copyright 1998-2018 Dave Hooper
+//
+// handy typedefs
+//
+//////////////////////////////////////////////////////////////////////
+
+#ifndef TYPES_H_INCLUDED
+#define TYPES_H_INCLUDED
+
+#if defined(__i386__) || defined(WIN32) || \
+ (defined(__alpha__) || defined(__alpha)) || \
+ defined(__arm__) || \
+ (defined(__mips__) && defined(__MIPSEL__))
+#else
+#define __BIG_ENDIAN
+#endif
+
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+typedef struct
+{
+ int nNumberOfPhases;
+ bool bLooping;
+ int nLevels[2][2][16]; // [Resolution][Phase][Withinphase]
+} ENVDATA;
+
+#ifdef WIN32
+extern "C" void _stdcall OutputDebugStringA (char*);
+#endif
+
+#endif
diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c
index 8c1e45c40..2d994b08f 100644
--- a/src/sound/snd_ac97_via.c
+++ b/src/sound/snd_ac97_via.c
@@ -24,6 +24,7 @@
#include <86box/86box.h>
#include <86box/device.h>
#include <86box/io.h>
+#include <86box/dma.h>
#include <86box/mem.h>
#include <86box/pci.h>
#include <86box/pic.h>
@@ -31,10 +32,13 @@
#include <86box/sound.h>
#include <86box/timer.h>
#include <86box/plat_unused.h>
+#include "cpu.h"
typedef struct ac97_via_sgd_t {
uint8_t id;
uint8_t always_run;
+ uint8_t modem;
+ uint8_t pad;
struct _ac97_via_ *dev;
uint32_t entry_ptr;
@@ -63,7 +67,7 @@ typedef struct _ac97_via_ {
uint16_t audio_codec_base;
uint16_t modem_sgd_base;
uint16_t modem_codec_base;
- uint8_t sgd_regs[256];
+ uint8_t sgd_regs[2][256];
uint8_t pcm_enabled : 1;
uint8_t fm_enabled : 1;
uint8_t vsr_enabled : 1;
@@ -78,7 +82,7 @@ typedef struct _ac97_via_ {
int irq_pin;
ac97_codec_t *codec[2][2];
- ac97_via_sgd_t sgd[6];
+ ac97_via_sgd_t sgd[2][6];
int master_vol_l;
int master_vol_r;
@@ -105,7 +109,7 @@ ac97_via_log(const char *fmt, ...)
#endif
static void ac97_via_sgd_process(void *priv);
-static void ac97_via_update_codec(ac97_via_t *dev);
+static void ac97_via_update_codec(ac97_via_t *dev, int modem);
static void ac97_via_speed_changed(void *priv);
static void ac97_via_filter_cd_audio(int channel, double *buffer, void *priv);
@@ -160,29 +164,29 @@ ac97_via_write_control(void *priv, uint8_t modem, uint8_t val)
/* Start or stop PCM playback. */
i = (val & 0xf4) == 0xc4;
if (i && !dev->pcm_enabled)
- timer_advance_u64(&dev->sgd[0].poll_timer, dev->sgd[0].timer_latch);
+ timer_advance_u64(&dev->sgd[0][0].poll_timer, dev->sgd[0][0].timer_latch);
dev->pcm_enabled = i;
/* Start or stop FM playback. */
i = (val & 0xf2) == 0xc2;
if (i && !dev->fm_enabled)
- timer_advance_u64(&dev->sgd[2].poll_timer, dev->sgd[2].timer_latch);
+ timer_advance_u64(&dev->sgd[0][2].poll_timer, dev->sgd[0][2].timer_latch);
dev->fm_enabled = i;
/* Update primary audio codec state. */
if (dev->codec[0][0])
- ac97_via_update_codec(dev);
+ ac97_via_update_codec(dev, 0);
}
}
static void
-ac97_via_update_irqs(ac97_via_t *dev)
+ac97_via_update_irqs(ac97_via_t *dev, int modem)
{
/* Check interrupt flags in all SGDs. */
for (uint8_t i = 0x00; i < ((sizeof(dev->sgd) / sizeof(dev->sgd[0])) << 4); i += 0x10) {
/* Stop immediately if any flag is set. Doing it this way optimizes
rising edges for the playback SGD (0 - first to be checked). */
- if (dev->sgd_regs[i] & (dev->sgd_regs[i | 0x2] & 0x03)) {
+ if (dev->sgd_regs[modem][i] & (dev->sgd_regs[modem][i | 0x2] & 0x03)) {
pci_set_irq(dev->pci_slot, dev->irq_pin, &dev->irq_state);
return;
}
@@ -192,15 +196,15 @@ ac97_via_update_irqs(ac97_via_t *dev)
}
static void
-ac97_via_update_codec(ac97_via_t *dev)
+ac97_via_update_codec(ac97_via_t *dev, int modem)
{
/* Get primary audio codec. */
- ac97_codec_t *codec = dev->codec[0][0];
+ ac97_codec_t *codec = dev->codec[modem][0];
/* Update volumes according to codec registers. */
ac97_codec_getattn(codec, 0x02, &dev->master_vol_l, &dev->master_vol_r);
- ac97_codec_getattn(codec, 0x18, &dev->sgd[0].vol_l, &dev->sgd[0].vol_r);
- ac97_codec_getattn(codec, 0x18, &dev->sgd[2].vol_l, &dev->sgd[2].vol_r); /* VIAFMTSR sets Master, CD and PCM volumes to 0 dB */
+ ac97_codec_getattn(codec, 0x18, &dev->sgd[modem][0].vol_l, &dev->sgd[modem][0].vol_r);
+ ac97_codec_getattn(codec, 0x18, &dev->sgd[modem][2].vol_l, &dev->sgd[modem][2].vol_r); /* VIAFMTSR sets Master, CD and PCM volumes to 0 dB */
ac97_codec_getattn(codec, 0x12, &dev->cd_vol_l, &dev->cd_vol_r);
/* Update sample rate according to codec registers and the variable sample rate flag. */
@@ -211,9 +215,9 @@ uint8_t
ac97_via_sgd_read(uint16_t addr, void *priv)
{
const ac97_via_t *dev = (ac97_via_t *) priv;
-#ifdef ENABLE_AC97_VIA_LOG
+// #ifdef ENABLE_AC97_VIA_LOG
uint8_t modem = (addr & 0xff00) == dev->modem_sgd_base;
-#endif
+// #endif
addr &= 0xff;
uint8_t ret;
@@ -221,83 +225,83 @@ ac97_via_sgd_read(uint16_t addr, void *priv)
/* Process SGD channel registers. */
switch (addr & 0xf) {
case 0x4:
- ret = dev->sgd[addr >> 4].entry_ptr;
+ ret = dev->sgd[modem][addr >> 4].entry_ptr;
break;
case 0x5:
- ret = dev->sgd[addr >> 4].entry_ptr >> 8;
+ ret = dev->sgd[modem][addr >> 4].entry_ptr >> 8;
break;
case 0x6:
- ret = dev->sgd[addr >> 4].entry_ptr >> 16;
+ ret = dev->sgd[modem][addr >> 4].entry_ptr >> 16;
break;
case 0x7:
- ret = dev->sgd[addr >> 4].entry_ptr >> 24;
+ ret = dev->sgd[modem][addr >> 4].entry_ptr >> 24;
break;
case 0xc:
- ret = dev->sgd[addr >> 4].sample_count;
+ ret = dev->sgd[modem][addr >> 4].sample_count;
break;
case 0xd:
- ret = dev->sgd[addr >> 4].sample_count >> 8;
+ ret = dev->sgd[modem][addr >> 4].sample_count >> 8;
break;
case 0xe:
- ret = dev->sgd[addr >> 4].sample_count >> 16;
+ ret = dev->sgd[modem][addr >> 4].sample_count >> 16;
break;
default:
- ret = dev->sgd_regs[addr];
+ ret = dev->sgd_regs[modem][addr];
break;
}
} else {
/* Process regular registers. */
switch (addr) {
case 0x84:
- ret = (dev->sgd_regs[0x00] & 0x01);
- ret |= (dev->sgd_regs[0x10] & 0x01) << 1;
- ret |= (dev->sgd_regs[0x20] & 0x01) << 2;
+ ret = (dev->sgd_regs[modem][0x00] & 0x01);
+ ret |= (dev->sgd_regs[modem][0x10] & 0x01) << 1;
+ ret |= (dev->sgd_regs[modem][0x20] & 0x01) << 2;
- ret |= (dev->sgd_regs[0x00] & 0x02) << 3;
- ret |= (dev->sgd_regs[0x10] & 0x02) << 4;
- ret |= (dev->sgd_regs[0x20] & 0x02) << 5;
+ ret |= (dev->sgd_regs[modem][0x00] & 0x02) << 3;
+ ret |= (dev->sgd_regs[modem][0x10] & 0x02) << 4;
+ ret |= (dev->sgd_regs[modem][0x20] & 0x02) << 5;
break;
case 0x85:
- ret = (dev->sgd_regs[0x00] & 0x04) >> 2;
- ret |= (dev->sgd_regs[0x10] & 0x04) >> 1;
- ret |= (dev->sgd_regs[0x20] & 0x04);
+ ret = (dev->sgd_regs[modem][0x00] & 0x04) >> 2;
+ ret |= (dev->sgd_regs[modem][0x10] & 0x04) >> 1;
+ ret |= (dev->sgd_regs[modem][0x20] & 0x04);
- ret |= (dev->sgd_regs[0x00] & 0x80) >> 3;
- ret |= (dev->sgd_regs[0x10] & 0x80) >> 2;
- ret |= (dev->sgd_regs[0x20] & 0x80) >> 1;
+ ret |= (dev->sgd_regs[modem][0x00] & 0x80) >> 3;
+ ret |= (dev->sgd_regs[modem][0x10] & 0x80) >> 2;
+ ret |= (dev->sgd_regs[modem][0x20] & 0x80) >> 1;
break;
case 0x86:
- ret = (dev->sgd_regs[0x40] & 0x01);
- ret |= (dev->sgd_regs[0x50] & 0x01) << 1;
+ ret = (dev->sgd_regs[modem][0x40] & 0x01);
+ ret |= (dev->sgd_regs[modem][0x50] & 0x01) << 1;
- ret |= (dev->sgd_regs[0x40] & 0x02) << 3;
- ret |= (dev->sgd_regs[0x50] & 0x02) << 4;
+ ret |= (dev->sgd_regs[modem][0x40] & 0x02) << 3;
+ ret |= (dev->sgd_regs[modem][0x50] & 0x02) << 4;
break;
case 0x87:
- ret = (dev->sgd_regs[0x40] & 0x04) >> 2;
- ret |= (dev->sgd_regs[0x50] & 0x04) >> 1;
+ ret = (dev->sgd_regs[modem][0x40] & 0x04) >> 2;
+ ret |= (dev->sgd_regs[modem][0x50] & 0x04) >> 1;
- ret |= (dev->sgd_regs[0x40] & 0x80) >> 3;
- ret |= (dev->sgd_regs[0x50] & 0x80) >> 2;
+ ret |= (dev->sgd_regs[modem][0x40] & 0x80) >> 3;
+ ret |= (dev->sgd_regs[modem][0x50] & 0x80) >> 2;
break;
default:
- ret = dev->sgd_regs[addr];
+ ret = dev->sgd_regs[modem][addr];
break;
}
}
- ac97_via_log("AC97 VIA %d: sgd_read(%02X) = %02X\n", modem, addr, ret);
+ ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: sgd_read(%02X) = %02X\n", CS, cpu_state.pc, msw & 1, modem, addr, ret);
return ret;
}
@@ -311,7 +315,9 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv)
ac97_codec_t *codec;
addr &= 0xff;
- ac97_via_log("AC97 VIA %d: sgd_write(%02X, %02X)\n", modem, addr, val);
+ ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: sgd_write(%02X, %02X)\n", CS, cpu_state.pc, msw & 1, modem, addr, val);
+
+ // if ((CS == 0x10000) && (cpu_state.pc == 0x000073d1))
/* Check function-specific read only registers. */
if ((addr >= (modem ? 0x00 : 0x40)) && (addr < (modem ? 0x40 : 0x60)))
@@ -324,42 +330,42 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv)
switch (addr & 0xf) {
case 0x0:
/* Clear RWC status bits. */
- dev->sgd_regs[addr] &= ~(val & 0x07);
+ dev->sgd_regs[modem][addr] &= ~(val & 0x07);
/* Update status interrupts. */
- ac97_via_update_irqs(dev);
+ ac97_via_update_irqs(dev, modem);
return;
case 0x1:
/* Start SGD if requested. */
if (val & 0x80) {
- if (dev->sgd_regs[addr & 0xf0] & 0x80) {
+ if (dev->sgd_regs[modem][addr & 0xf0] & 0x80) {
/* Queue SGD trigger if already running. */
- dev->sgd_regs[addr & 0xf0] |= 0x08;
+ dev->sgd_regs[modem][addr & 0xf0] |= 0x08;
} else {
/* Start SGD immediately. */
- dev->sgd_regs[addr & 0xf0] = (dev->sgd_regs[addr & 0xf0] & ~0x47) | 0x80;
+ dev->sgd_regs[modem][addr & 0xf0] = (dev->sgd_regs[modem][addr & 0xf0] & ~0x47) | 0x80;
/* Start at the specified entry pointer. */
- dev->sgd[addr >> 4].entry_ptr = *((uint32_t *) &dev->sgd_regs[(addr & 0xf0) | 0x4]) & 0xfffffffe;
- dev->sgd[addr >> 4].restart = 2;
+ dev->sgd[modem][addr >> 4].entry_ptr = *((uint32_t *) &dev->sgd_regs[modem][(addr & 0xf0) | 0x4]) & 0xfffffffe;
+ dev->sgd[modem][addr >> 4].restart = 2;
/* Start the actual SGD process. */
- ac97_via_sgd_process(&dev->sgd[addr >> 4]);
+ ac97_via_sgd_process(&dev->sgd[modem][addr >> 4]);
}
}
/* Stop SGD if requested. */
if (val & 0x40)
- dev->sgd_regs[addr & 0xf0] &= ~0x88;
+ dev->sgd_regs[modem][addr & 0xf0] &= ~0x88;
val &= 0x08;
/* (Un)pause SGD if requested. */
if (val & 0x08)
- dev->sgd_regs[addr & 0xf0] |= 0x40;
+ dev->sgd_regs[modem][addr & 0xf0] |= 0x40;
else
- dev->sgd_regs[addr & 0xf0] &= ~0x40;
+ dev->sgd_regs[modem][addr & 0xf0] &= ~0x40;
break;
@@ -387,7 +393,7 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv)
case 0x82:
/* Determine the selected codec. */
- i = !!(dev->sgd_regs[0x83] & 0x40);
+ i = !!(dev->sgd_regs[modem][0x83] & 0x40);
codec = dev->codec[modem][i];
/* Keep value in register if this codec is not present. */
@@ -395,20 +401,20 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv)
/* Read from or write to codec. */
if (val & 0x80) {
if (val & 1) { /* return 0x0000 on unaligned reads (real 686B behavior) */
- dev->sgd_regs[0x80] = dev->sgd_regs[0x81] = 0x00;
+ dev->sgd_regs[modem][0x80] = dev->sgd_regs[modem][0x81] = 0x00;
} else {
- *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[0x80]) = ac97_codec_readw(codec, val);
+ *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[modem][0x80]) = ac97_codec_readw(codec, val);
}
/* Flag data/status/index for this codec as valid. */
- dev->sgd_regs[0x83] |= 0x02 << (i << 1);
+ dev->sgd_regs[modem][0x83] |= 0x02 << (i << 1);
} else if (!(val & 1)) { /* do nothing on unaligned writes */
ac97_codec_writew(codec, val,
- *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[0x80]));
+ *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[modem][0x80]));
/* Update primary audio codec state if that codec was written to. */
if (!modem && !i) {
- ac97_via_update_codec(dev);
+ ac97_via_update_codec(dev, 0);
/* Set up CD audio filter if CD volume was written to. Setting it
up at init prevents CD audio from working on other cards, but
@@ -424,9 +430,9 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv)
case 0x83:
/* Clear RWC status bits. */
#if 0 /* race condition with Linux accessing a register and clearing status bits on the same dword write */
- val = (dev->sgd_regs[addr] & ~(val & 0x0a)) | (val & 0xc0);
+ val = ((dev->sgd_regs[modem][addr] & 0x3f) & ~(val & 0x0a)) | (val & 0xc0);
#else
- val = dev->sgd_regs[addr] | (val & 0xc0);
+ val = (dev->sgd_regs[modem][addr] & 0x3f) | (val & 0xc0);
#endif
break;
@@ -435,7 +441,7 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv)
}
}
- dev->sgd_regs[addr] = val;
+ dev->sgd_regs[modem][addr] = val;
}
void
@@ -479,6 +485,8 @@ ac97_via_codec_read(uint16_t addr, void *priv)
ac97_via_log("AC97 VIA %d: codec_read(%02X) = %02X\n", modem, addr, ret);
+ ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: codec_read(%02X) = %02X\n", CS, cpu_state.pc, msw & 1, modem, addr, ret);
+
return ret;
}
@@ -489,6 +497,8 @@ ac97_via_codec_write(uint16_t addr, uint8_t val, void *priv)
uint8_t modem = (addr & 0xff00) == dev->modem_codec_base;
addr &= 0xff;
+ ac97_via_log("[%04X:%08X] [%i] AC97 VIA %d: codec_write(%02X, %02X)\n", CS, cpu_state.pc, msw & 1, modem, addr, val);
+
ac97_via_log("AC97 VIA %d: codec_write(%02X, %02X)\n", modem, addr, val);
/* Unknown behavior, maybe it does write to the shadow registers? */
@@ -501,12 +511,12 @@ ac97_via_remap_audio_codec(void *priv, uint16_t new_io_base, uint8_t enable)
ac97_via_t *dev = (ac97_via_t *) priv;
if (dev->audio_codec_base)
- io_removehandler(dev->audio_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
+ io_removehandler(dev->audio_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
dev->audio_codec_base = new_io_base;
if (dev->audio_codec_base && enable)
- io_sethandler(dev->audio_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
+ io_sethandler(dev->audio_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
}
void
@@ -515,19 +525,24 @@ ac97_via_remap_modem_codec(void *priv, uint16_t new_io_base, uint8_t enable)
ac97_via_t *dev = (ac97_via_t *) priv;
if (dev->modem_codec_base)
- io_removehandler(dev->modem_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
+ io_removehandler(dev->modem_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
dev->modem_codec_base = new_io_base;
if (dev->modem_codec_base && enable)
- io_sethandler(dev->modem_codec_base, 256, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
+ io_sethandler(dev->modem_codec_base, 4, ac97_via_codec_read, NULL, NULL, ac97_via_codec_write, NULL, NULL, dev);
}
static void
ac97_via_update_stereo(ac97_via_t *dev, ac97_via_sgd_t *sgd)
{
+#ifdef OLD_CODE
int32_t l = (((sgd->out_l * sgd->vol_l) >> 15) * dev->master_vol_l) >> 15;
int32_t r = (((sgd->out_r * sgd->vol_r) >> 15) * dev->master_vol_r) >> 15;
+#else
+ int32_t l = (((sgd->out_l * sgd->vol_l) / 208925) * dev->master_vol_l) >> 15;
+ int32_t r = (((sgd->out_r * sgd->vol_r) / 208925) * dev->master_vol_r) >> 15;
+#endif
if (l < -32768)
l = -32768;
@@ -551,12 +566,12 @@ ac97_via_sgd_process(void *priv)
ac97_via_t *dev = sgd->dev;
/* Stop if this SGD is not active. */
- uint8_t sgd_status = dev->sgd_regs[sgd->id] & 0xc4;
+ uint8_t sgd_status = dev->sgd_regs[sgd->modem][sgd->id] & 0xc4;
if (!(sgd_status & 0x80))
return;
/* Schedule next run. */
- timer_on_auto(&sgd->dma_timer, 10.0);
+ timer_on_auto(&sgd->dma_timer, 1.0);
/* Process SGD if it's active, and the FIFO has room or is disabled. */
if (((sgd_status & 0xc7) == 0x80) && (sgd->always_run || ((sgd->fifo_end - sgd->fifo_pos) <= (sizeof(sgd->fifo) - 4)))) {
@@ -564,13 +579,15 @@ ac97_via_sgd_process(void *priv)
if (sgd->restart) {
/* (Re)load entry pointer if required. */
if (sgd->restart & 2)
- sgd->entry_ptr = *((uint32_t *) &dev->sgd_regs[sgd->id | 0x4]) & 0xfffffffe; /* TODO: probe real hardware - does "even addr" actually mean dword aligned? */
+ sgd->entry_ptr = *((uint32_t *) &dev->sgd_regs[sgd->modem][sgd->id | 0x4]) & 0xfffffffe; /* TODO: probe real hardware - does "even addr" actually mean dword aligned? */
sgd->restart = 0;
/* Read entry. */
- sgd->sample_ptr = mem_readl_phys(sgd->entry_ptr);
+ // sgd->sample_ptr = mem_readl_phys(sgd->entry_ptr);
+ dma_bm_read(sgd->entry_ptr, (uint8_t *) &sgd->sample_ptr, 4, 4);
sgd->entry_ptr += 4;
- sgd->sample_count = mem_readl_phys(sgd->entry_ptr);
+ // sgd->sample_count = mem_readl_phys(sgd->entry_ptr);
+ dma_bm_read(sgd->entry_ptr, (uint8_t *) &sgd->sample_count, 4, 4);
sgd->entry_ptr += 4;
#ifdef ENABLE_AC97_VIA_LOG
if (((sgd->sample_ptr == 0xffffffff) && (sgd->sample_count == 0xffffffff)) || ((sgd->sample_ptr == 0x00000000) && (sgd->sample_count == 0x00000000)))
@@ -588,10 +605,12 @@ ac97_via_sgd_process(void *priv)
if (sgd->id & 0x10) {
/* Write channel: read data from FIFO. */
- mem_writel_phys(sgd->sample_ptr, *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]));
+ // mem_writel_phys(sgd->sample_ptr, *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]));
+ dma_bm_write(sgd->sample_ptr, &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)], 4, 4);
} else {
/* Read channel: write data to FIFO. */
- *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]) = mem_readl_phys(sgd->sample_ptr);
+ // *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]) = mem_readl_phys(sgd->sample_ptr);
+ dma_bm_read(sgd->sample_ptr, &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)], 4, 4);
}
sgd->fifo_end += 4;
sgd->sample_ptr += 4;
@@ -608,17 +627,17 @@ ac97_via_sgd_process(void *priv)
ac97_via_log(" with STOP");
/* Raise STOP to pause SGD. */
- dev->sgd_regs[sgd->id] |= 0x04;
+ dev->sgd_regs[sgd->modem][sgd->id] |= 0x04;
}
if (sgd->entry_flags & 0x40) {
ac97_via_log(" with FLAG");
/* Raise FLAG to pause SGD. */
- dev->sgd_regs[sgd->id] |= 0x01;
+ dev->sgd_regs[sgd->modem][sgd->id] |= 0x01;
#ifdef ENABLE_AC97_VIA_LOG
- if (dev->sgd_regs[sgd->id | 0x2] & 0x01)
+ if (dev->sgd_regs[sgd->modem][sgd->id | 0x2] & 0x01)
ac97_via_log(" interrupt");
#endif
}
@@ -627,19 +646,19 @@ ac97_via_sgd_process(void *priv)
ac97_via_log(" with EOL");
/* Raise EOL. */
- dev->sgd_regs[sgd->id] |= 0x02;
+ dev->sgd_regs[sgd->modem][sgd->id] |= 0x02;
#ifdef ENABLE_AC97_VIA_LOG
- if (dev->sgd_regs[sgd->id | 0x2] & 0x02)
+ if (dev->sgd_regs[sgd->modem][sgd->id | 0x2] & 0x02)
ac97_via_log(" interrupt");
#endif
/* Restart SGD if a trigger is queued or auto-start is enabled. */
- if ((dev->sgd_regs[sgd->id] & 0x08) || (dev->sgd_regs[sgd->id | 0x2] & 0x80)) {
+ if ((dev->sgd_regs[sgd->modem][sgd->id] & 0x08) || (dev->sgd_regs[sgd->modem][sgd->id | 0x2] & 0x80)) {
ac97_via_log(" restart");
/* Un-queue trigger. */
- dev->sgd_regs[sgd->id] &= ~0x08;
+ dev->sgd_regs[sgd->modem][sgd->id] &= ~0x08;
/* Go back to the starting block on the next run. */
sgd->restart = 2;
@@ -647,13 +666,13 @@ ac97_via_sgd_process(void *priv)
ac97_via_log(" finish");
/* Terminate SGD. */
- dev->sgd_regs[sgd->id] &= ~0x80;
+ dev->sgd_regs[sgd->modem][sgd->id] &= ~0x80;
}
}
ac97_via_log("\n");
/* Fire any requested status interrupts. */
- ac97_via_update_irqs(dev);
+ ac97_via_update_irqs(dev, sgd->modem);
}
}
}
@@ -662,7 +681,7 @@ static void
ac97_via_poll_stereo(void *priv)
{
ac97_via_t *dev = (ac97_via_t *) priv;
- ac97_via_sgd_t *sgd = &dev->sgd[0]; /* Audio Read */
+ ac97_via_sgd_t *sgd = &dev->sgd[0][0]; /* Audio Read */
/* Schedule next run if PCM playback is enabled. */
if (dev->pcm_enabled)
@@ -672,7 +691,7 @@ ac97_via_poll_stereo(void *priv)
ac97_via_update_stereo(dev, sgd);
/* Feed next sample from the FIFO. */
- switch (dev->sgd_regs[sgd->id | 0x2] & 0x30) {
+ switch (dev->sgd_regs[0][sgd->id | 0x2] & 0x30) {
case 0x00: /* Mono, 8-bit PCM */
if ((sgd->fifo_end - sgd->fifo_pos) >= 1) {
sgd->out_l = sgd->out_r = (sgd->fifo[sgd->fifo_pos++ & (sizeof(sgd->fifo) - 1)] ^ 0x80) << 8;
@@ -718,7 +737,7 @@ static void
ac97_via_poll_fm(void *priv)
{
ac97_via_t *dev = (ac97_via_t *) priv;
- ac97_via_sgd_t *sgd = &dev->sgd[2]; /* FM Read */
+ ac97_via_sgd_t *sgd = &dev->sgd[0][2]; /* FM Read */
/* Schedule next run if FM playback is enabled. */
if (dev->fm_enabled)
@@ -746,15 +765,15 @@ ac97_via_get_buffer(int32_t *buffer, int len, void *priv)
{
ac97_via_t *dev = (ac97_via_t *) priv;
- ac97_via_update_stereo(dev, &dev->sgd[0]);
- ac97_via_update_stereo(dev, &dev->sgd[2]);
+ ac97_via_update_stereo(dev, &dev->sgd[0][0]);
+ ac97_via_update_stereo(dev, &dev->sgd[0][2]);
for (int c = 0; c < len * 2; c++) {
- buffer[c] += dev->sgd[0].buffer[c] / 2;
- buffer[c] += dev->sgd[2].buffer[c] / 2;
+ buffer[c] += dev->sgd[0][0].buffer[c] / 2;
+ buffer[c] += dev->sgd[0][2].buffer[c] / 2;
}
- dev->sgd[0].pos = dev->sgd[2].pos = 0;
+ dev->sgd[0][0].pos = dev->sgd[0][2].pos = 0;
}
static void
@@ -780,8 +799,8 @@ ac97_via_speed_changed(void *priv)
else
freq = (double) SOUND_FREQ;
- dev->sgd[0].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / freq));
- dev->sgd[2].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 24000.0)); /* FM operates at a fixed 24 KHz */
+ dev->sgd[0][0].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / freq));
+ dev->sgd[0][2].timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / 24000.0)); /* FM operates at a fixed 24 KHz */
}
static void *
@@ -799,19 +818,23 @@ ac97_via_init(UNUSED(const device_t *info))
/* Set up SGD channels. */
for (uint8_t i = 0; i < (sizeof(dev->sgd) / sizeof(dev->sgd[0])); i++) {
- dev->sgd[i].id = i << 4;
- dev->sgd[i].dev = dev;
+ for (uint8_t j = 0; j < 2; j++) {
+ dev->sgd[j][i].id = i << 4;
+ dev->sgd[j][i].dev = dev;
- /* Disable the FIFO on SGDs we don't care about. */
- if ((i != 0) && (i != 2))
- dev->sgd[i].always_run = 1;
+ dev->sgd[j][i].modem = j;
- timer_add(&dev->sgd[i].dma_timer, ac97_via_sgd_process, &dev->sgd[i], 0);
+ /* Disable the FIFO on SGDs we don't care about. */
+ if ((i != 0) && (i != 2))
+ dev->sgd[j][i].always_run = 1;
+
+ timer_add(&dev->sgd[j][i].dma_timer, ac97_via_sgd_process, &dev->sgd[j][i], 0);
+ }
}
/* Set up playback pollers. */
- timer_add(&dev->sgd[0].poll_timer, ac97_via_poll_stereo, dev, 0);
- timer_add(&dev->sgd[2].poll_timer, ac97_via_poll_fm, dev, 0);
+ timer_add(&dev->sgd[0][0].poll_timer, ac97_via_poll_stereo, dev, 0);
+ timer_add(&dev->sgd[0][2].poll_timer, ac97_via_poll_fm, dev, 0);
ac97_via_speed_changed(dev);
/* Set up playback handler. */
diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c
index 87755a96c..202fd891a 100644
--- a/src/sound/snd_ad1848.c
+++ b/src/sound/snd_ad1848.c
@@ -19,11 +19,12 @@
* Copyright 2021-2025 RichardG.
*/
#include
+#include
#include
#include
#include
#include
-
+#define HAVE_STDARG_H
#include <86box/86box.h>
#include <86box/dma.h>
#include <86box/pic.h>
@@ -36,6 +37,24 @@
#define CS4232 0x02
#define CS4236 0x03
+#ifdef ENABLE_AD1848_LOG
+int ad1848_do_log = ENABLE_AD1848_LOG;
+
+static void
+ad1848_log(const char *fmt, ...)
+{
+ va_list ap;
+
+ if (ad1848_do_log) {
+ va_start(ap, fmt);
+ pclog_ex(fmt, ap);
+ va_end(ap);
+ }
+}
+#else
+# define ad1848_log(fmt, ...)
+#endif
+
static int ad1848_vols_7bits[128];
static double ad1848_vols_5bits_aux_gain[32];
@@ -46,12 +65,14 @@ extern uint8_t adjustMap4[64];
void
ad1848_setirq(ad1848_t *ad1848, int irq)
{
+ ad1848_log("AD1848: setirq(%d)\n", irq);
ad1848->irq = irq;
}
void
ad1848_setdma(ad1848_t *ad1848, int newdma)
{
+ ad1848_log("AD1848: setdma(%d)\n", newdma);
ad1848->dma = newdma;
}
@@ -62,6 +83,7 @@ ad1848_updatevolmask(ad1848_t *ad1848)
ad1848->wave_vol_mask = 0x7f;
else
ad1848->wave_vol_mask = 0x3f;
+ ad1848_log("AD1848: updatevolmask(%02X)\n", ad1848->wave_vol_mask);
}
static double
@@ -99,6 +121,8 @@ ad1848_get_default_freq(ad1848_t *ad1848)
break;
}
+ ad1848_log("AD1848: Frequency %f through default path\n", freq);
+
return freq;
}
@@ -136,6 +160,8 @@ ad1848_updatefreq(ad1848_t *ad1848)
freq /= 2558.0;
break;
}
+
+ ad1848_log("AD1848: Frequency %f through CS4236B+ path\n", freq);
} else if (ad1848->regs[22] & 0x80) {
const uint8_t set = (ad1848->regs[22] >> 1) & 0x3f;
freq = (ad1848->regs[22] & 1) ? 33868800.0 : 49152000.0;
@@ -153,6 +179,8 @@ ad1848_updatefreq(ad1848_t *ad1848)
freq /= 256 * set;
break;
}
+
+ ad1848_log("AD1848: Frequency %f through CS4232+ path\n", freq);
} else
freq = ad1848_get_default_freq(ad1848);
} else
@@ -182,18 +210,16 @@ ad1848_read(uint16_t addr, void *priv)
ad1848->regs[ad1848->index] = ret;
break;
- case 18:
- case 19:
+ case 18 ... 19:
if (ad1848->type >= AD1848_TYPE_CS4236B) {
if ((ad1848->xregs[4] & 0x14) == 0x14) /* FM remapping */
- ret = ad1848->xregs[ad1848->index - 12]; /* real FM volume on registers 6 and 7 */
+ ret = ad1848->xregs[6 | (ad1848->index & 1)]; /* real FM volume on registers 6 and 7 */
else if (ad1848->wten && !(ad1848->xregs[4] & 0x08)) /* wavetable remapping */
- ret = ad1848->xregs[ad1848->index - 2]; /* real wavetable volume on registers 16 and 17 */
+ ret = ad1848->xregs[16 | (ad1848->index & 1)]; /* real wavetable volume on registers 16 and 17 */
}
break;
- case 20:
- case 21:
+ case 20 ... 21:
/* Backdoor to the Control/RAM registers on CS4235+. */
if ((ad1848->type >= AD1848_TYPE_CS4235) && (ad1848->xregs[18] & 0x80))
ret = ad1848->cram_read(ad1848->index - 15, ad1848->cram_priv);
@@ -229,13 +255,16 @@ ad1848_read(uint16_t addr, void *priv)
default:
break;
}
+ ad1848_log("AD1848: read(X%d) = %02X\n", ad1848->xindex, ret);
+ return ret;
}
break;
default:
break;
}
- break;
+ ad1848_log("AD1848: read(I%d) = %02X\n", ad1848->index, ret);
+ return ret;
case 2:
ret = ad1848->status;
@@ -245,6 +274,8 @@ ad1848_read(uint16_t addr, void *priv)
break;
}
+ ad1848_log("AD1848: read(%04X) = %02X\n", addr, ret);
+
return ret;
}
@@ -295,7 +326,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
break;
case 11:
- return;
+ goto readonly_i;
case 12:
if (ad1848->type >= AD1848_TYPE_CS4248) {
@@ -307,19 +338,19 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
ad1848->fmt_mask &= ~0x80;
}
}
- return;
+ goto readonly_i;
case 14:
ad1848->count = ad1848->regs[15] | (val << 8);
break;
- case 18:
- case 19:
+ case 18 ... 19:
if (ad1848->type >= AD1848_TYPE_CS4236B) {
if (ad1848->type >= AD1848_TYPE_CS4235) {
if (ad1848->xregs[18] & 0x20) /* AUX1 remapping */
ad1848->regs[ad1848->index & 3] = val; /* also controls AUX1 on registers 2 and 3 */
} else {
+ temp = 0;
if ((ad1848->xregs[4] & 0x14) == 0x14) { /* FM remapping */
ad1848->xregs[6 | (ad1848->index & 1)] = val; /* real FM volume on extended registers 6 and 7 */
temp = 1;
@@ -343,7 +374,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
/* Stop here if any remapping is enabled. */
if (temp)
- return;
+ goto readonly_i;
}
/* HACK: the Windows 9x driver's "Synth" control writes to this
@@ -362,8 +393,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
}
break;
- case 20:
- case 21:
+ case 20 ... 21:
/* Backdoor to the Control/RAM registers on CS4235+. */
if ((ad1848->type >= AD1848_TYPE_CS4235) && (ad1848->xregs[18] & 0x80)) {
ad1848->cram_write(ad1848->index - 15, val, ad1848->cram_priv);
@@ -421,7 +451,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
break;
case 25:
- return;
+ goto readonly_x;
case 26 ... 28:
case 30:
@@ -438,6 +468,8 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
if (updatefreq)
ad1848_updatefreq(ad1848);
+readonly_x:
+ ad1848_log("AD1848: write(X%d, %02X)\n", ad1848->xindex, val);
return;
}
break;
@@ -451,14 +483,14 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
break;
case 25:
- return;
+ goto readonly_i;
case 27:
if ((ad1848->type != AD1848_TYPE_CS4232) && (ad1848->type != AD1848_TYPE_CS4236))
- return;
+ goto readonly_i;
break;
case 29:
if ((ad1848->type != AD1848_TYPE_CS4232) && (ad1848->type != AD1848_TYPE_CS4236))
- return;
+ goto readonly_i;
break;
default:
@@ -480,7 +512,9 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
else
ad1848->cd_vol_r = ad1848_vols_5bits_aux_gain[ad1848->regs[temp] & 0x1f];
- break;
+readonly_i:
+ ad1848_log("AD1848: write(I%d, %02X)\n", ad1848->index, val);
+ return;
case 2:
ad1848->status &= 0xfe;
@@ -490,6 +524,8 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv)
default:
break;
}
+
+ ad1848_log("AD1848: write(%04X, %02X)\n", addr, val);
}
void
@@ -743,6 +779,8 @@ ad1848_init(ad1848_t *ad1848, uint8_t type)
uint8_t c;
double attenuation;
+ ad1848_log("AD1848: init(%02X)\n", type);
+
ad1848->status = 0xcc;
ad1848->index = ad1848->trd = 0;
ad1848->mce = 0x40;
diff --git a/src/sound/snd_cms.c b/src/sound/snd_cms.c
index 66dff80f3..9491e3076 100644
--- a/src/sound/snd_cms.c
+++ b/src/sound/snd_cms.c
@@ -8,6 +8,7 @@
#include <86box/86box.h>
#include <86box/device.h>
#include <86box/io.h>
+#include "saasound/SAASound.h"
#include <86box/snd_cms.h>
#include <86box/sound.h>
#include <86box/plat_unused.h>
@@ -15,62 +16,13 @@
void
cms_update(cms_t *cms)
{
- for (; cms->pos < sound_pos_global; cms->pos++) {
- int16_t out_l = 0;
- int16_t out_r = 0;
-
- for (uint8_t c = 0; c < 4; c++) {
- switch (cms->noisetype[c >> 1][c & 1]) {
- case 0:
- cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK / 256;
- break;
- case 1:
- cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK / 512;
- break;
- case 2:
- cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK / 1024;
- break;
- case 3:
- cms->noisefreq[c >> 1][c & 1] = cms->freq[c >> 1][(c & 1) * 3];
- break;
-
- default:
- break;
- }
- }
- for (uint8_t c = 0; c < 2; c++) {
- if (cms->regs[c][0x1C] & 1) {
- for (uint8_t d = 0; d < 6; d++) {
- if (cms->regs[c][0x14] & (1 << d)) {
- if (cms->stat[c][d])
- out_l += (cms->vol[c][d][0] * 90);
- if (cms->stat[c][d])
- out_r += (cms->vol[c][d][1] * 90);
- cms->count[c][d] += cms->freq[c][d];
- if (cms->count[c][d] >= 24000) {
- cms->count[c][d] -= 24000;
- cms->stat[c][d] ^= 1;
- }
- } else if (cms->regs[c][0x15] & (1 << d)) {
- if (cms->noise[c][d / 3] & 1)
- out_l += (cms->vol[c][d][0] * 90);
- if (cms->noise[c][d / 3] & 1)
- out_r += (cms->vol[c][d][0] * 90);
- }
- }
- for (uint8_t d = 0; d < 2; d++) {
- cms->noisecount[c][d] += cms->noisefreq[c][d];
- while (cms->noisecount[c][d] >= 24000) {
- cms->noisecount[c][d] -= 24000;
- cms->noise[c][d] <<= 1;
- if (!(((cms->noise[c][d] & 0x4000) >> 8) ^ (cms->noise[c][d] & 0x40)))
- cms->noise[c][d] |= 1;
- }
- }
- }
- }
- cms->buffer[cms->pos << 1] = out_l;
- cms->buffer[(cms->pos << 1) + 1] = out_r;
+ if (cms->pos < wavetable_pos_global) {
+ SAASNDGenerateMany(cms->saasound, (unsigned char*)&cms->buffer[cms->pos], wavetable_pos_global - cms->pos);
+ cms->pos = wavetable_pos_global;
+ }
+ if (cms->pos2 < wavetable_pos_global) {
+ SAASNDGenerateMany(cms->saasound2, (unsigned char*)&cms->buffer2[cms->pos2], wavetable_pos_global - cms->pos2);
+ cms->pos2 = wavetable_pos_global;
}
}
@@ -82,68 +34,44 @@ cms_get_buffer(int32_t *buffer, int len, void *priv)
cms_update(cms);
for (int c = 0; c < len * 2; c++)
- buffer[c] += cms->buffer[c];
+ buffer[c] += (cms->buffer[c] / 2);
cms->pos = 0;
}
+void
+cms_get_buffer_2(int32_t *buffer, int len, void *priv)
+{
+ cms_t *cms = (cms_t *) priv;
+
+ cms_update(cms);
+
+ for (int c = 0; c < len * 2; c++)
+ buffer[c] += (cms->buffer2[c] / 2);
+
+ cms->pos2 = 0;
+}
+
void
cms_write(uint16_t addr, uint8_t val, void *priv)
{
cms_t *cms = (cms_t *) priv;
- int voice;
- int chip = (addr & 2) >> 1;
switch (addr & 0xf) {
case 0x1: /* SAA #1 Register Select Port */
- cms->addrs[0] = val & 31;
+ SAASNDWriteAddress(cms->saasound, val & 31);
break;
case 0x3: /* SAA #2 Register Select Port */
- cms->addrs[1] = val & 31;
+ SAASNDWriteAddress(cms->saasound2, val & 31);
break;
case 0x0: /* SAA #1 Data Port */
+ cms_update(cms);
+ SAASNDWriteData(cms->saasound, val);
+ break;
case 0x2: /* SAA #2 Data Port */
cms_update(cms);
- cms->regs[chip][cms->addrs[chip] & 31] = val;
- switch (cms->addrs[chip] & 31) {
- case 0x00:
- case 0x01:
- case 0x02: /*Volume*/
- case 0x03:
- case 0x04:
- case 0x05:
- voice = cms->addrs[chip] & 7;
- cms->vol[chip][voice][0] = val & 0xf;
- cms->vol[chip][voice][1] = val >> 4;
- break;
- case 0x08:
- case 0x09:
- case 0x0A: /*Frequency*/
- case 0x0B:
- case 0x0C:
- case 0x0D:
- voice = cms->addrs[chip] & 7;
- cms->latch[chip][voice] = (cms->latch[chip][voice] & 0x700) | val;
- cms->freq[chip][voice] = (MASTER_CLOCK / 512 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255));
- break;
- case 0x10:
- case 0x11:
- case 0x12: /*Octave*/
- voice = (cms->addrs[chip] & 3) << 1;
- cms->latch[chip][voice] = (cms->latch[chip][voice] & 0xFF) | ((val & 7) << 8);
- cms->latch[chip][voice + 1] = (cms->latch[chip][voice + 1] & 0xFF) | ((val & 0x70) << 4);
- cms->freq[chip][voice] = (MASTER_CLOCK / 512 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255));
- cms->freq[chip][voice + 1] = (MASTER_CLOCK / 512 << (cms->latch[chip][voice + 1] >> 8)) / (511 - (cms->latch[chip][voice + 1] & 255));
- break;
- case 0x16: /*Noise*/
- cms->noisetype[chip][0] = val & 3;
- cms->noisetype[chip][1] = (val >> 4) & 3;
- break;
-
- default:
- break;
- }
+ SAASNDWriteData(cms->saasound2, val);
break;
case 0x6: /* GameBlaster Write Port */
@@ -163,9 +91,9 @@ cms_read(uint16_t addr, void *priv)
switch (addr & 0xf) {
case 0x1: /* SAA #1 Register Select Port */
- return cms->addrs[0];
+ return SAASNDReadAddress(cms->saasound);
case 0x3: /* SAA #2 Register Select Port */
- return cms->addrs[1];
+ return SAASNDReadAddress(cms->saasound2);
case 0x4: /* GameBlaster Read port (Always returns 0x7F) */
return 0x7f;
case 0xa: /* GameBlaster Read Port */
@@ -185,7 +113,12 @@ cms_init(UNUSED(const device_t *info))
uint16_t addr = device_get_config_hex16("base");
io_sethandler(addr, 0x0010, cms_read, NULL, NULL, cms_write, NULL, NULL, cms);
- sound_add_handler(cms_get_buffer, cms);
+ cms->saasound = newSAASND();
+ SAASNDSetSoundParameters(cms->saasound, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO);
+ cms->saasound2 = newSAASND();
+ SAASNDSetSoundParameters(cms->saasound2, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO);
+ wavetable_add_handler(cms_get_buffer, cms);
+ wavetable_add_handler(cms_get_buffer_2, cms);
return cms;
}
@@ -194,6 +127,9 @@ cms_close(void *priv)
{
cms_t *cms = (cms_t *) priv;
+ deleteSAASND(cms->saasound);
+ deleteSAASND(cms->saasound2);
+
free(cms);
}
diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c
index 675582367..cfefc8df5 100644
--- a/src/sound/snd_pas16.c
+++ b/src/sound/snd_pas16.c
@@ -792,7 +792,14 @@ pas16_in(uint16_t port, void *priv)
if ((scsi_bus->tx_mode == PIO_TX_BUS) && !(ret & 0x80))
ret |= 0x80;
- pas16_log("5C01 read ret=%02x, status=%02x, txmode=%x.\n", ret, pas16->scsi->status & 0x06, scsi_bus->tx_mode);
+ if (ret & 0x80) {
+ if (scsi_bus->data_repeat < MIN(511, scsi_bus->total_len))
+ scsi_bus->data_repeat++;
+ } else {
+ if (scsi_bus->data_repeat == MIN(511, scsi_bus->total_len))
+ ret = 0x00;
+ }
+ pas16_log("%04X:%08X: Port %04x read ret=%02x, status=%02x, txmode=%x, repeat=%d.\n", CS, cpu_state.pc, port + pas16->base, ret, pas16->scsi->status & 0x06, scsi_bus->tx_mode, scsi_bus->data_repeat);
}
break;
case 0x5c03:
@@ -1749,7 +1756,7 @@ static uint16_t
pas16_readdmaw_stereo(pas16_t *pas16)
{
uint16_t ret;
- uint16_t ticks = (pas16->sys_conf_1 & 0x02) ? (1 + (pas16->dma < 5)) : 2;
+ uint16_t ticks = (pas16->sys_conf_1 & 0x02) ? (1 + (pas16->dma < 5)) : 1;
ret = pas16_dma_readw(pas16, ticks);
diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c
index e89946486..4a17fe20b 100644
--- a/src/sound/snd_sb.c
+++ b/src/sound/snd_sb.c
@@ -41,6 +41,7 @@
#include <86box/sound.h>
#include "cpu.h"
#include <86box/timer.h>
+#include "saasound/SAASound.h"
#include <86box/snd_sb.h>
#include <86box/plat_unused.h>
@@ -145,6 +146,42 @@ sb_log(const char *fmt, ...)
# define sb_log(fmt, ...)
#endif
+void
+sb_cms_get_buffer(int32_t *buffer, int len, void *priv)
+{
+ sb_t *sb = (sb_t *) priv;
+
+ cms_update(&sb->cms);
+
+ for (int c = 0; c < len * 2; c++) {
+ if (sb->mixer_enabled) {
+ buffer[c] += sb->cms.buffer[c] * sb->mixer_sb2.fm;
+ }
+ else
+ buffer[c] += sb->cms.buffer[c];
+ }
+
+ sb->cms.pos = 0;
+}
+
+void
+sb_cms_get_buffer_2(int32_t *buffer, int len, void *priv)
+{
+ sb_t *sb = (sb_t *) priv;
+
+ cms_update(&sb->cms);
+
+ for (int c = 0; c < len * 2; c++) {
+ if (sb->mixer_enabled) {
+ buffer[c] += sb->cms.buffer2[c] * sb->mixer_sb2.fm;
+ }
+ else
+ buffer[c] += sb->cms.buffer2[c];
+ }
+
+ sb->cms.pos2 = 0;
+}
+
/* SB 1, 1.5, MCV, and 2 do not have a mixer, so signal is hardwired. */
static void
sb_get_buffer_sb2(int32_t *buffer, int len, void *priv)
@@ -155,23 +192,10 @@ sb_get_buffer_sb2(int32_t *buffer, int len, void *priv)
sb_dsp_update(&sb->dsp);
- if (sb->cms_enabled)
- cms_update(&sb->cms);
-
for (int c = 0; c < len * 2; c += 2) {
double out_l = 0.0;
double out_r = 0.0;
- if (sb->cms_enabled) {
- out_l += sb->cms.buffer[c];
- out_r += sb->cms.buffer[c + 1];
- }
-
- if (sb->cms_enabled && sb->mixer_enabled) {
- out_l *= mixer->fm;
- out_r *= mixer->fm;
- }
-
/* TODO: Recording: I assume it has direct mic and line in like SB2.
It is unclear from the docs if it has a filter, but it probably does. */
/* TODO: Recording: Mic and line In with AGC. */
@@ -192,9 +216,6 @@ sb_get_buffer_sb2(int32_t *buffer, int len, void *priv)
}
sb->dsp.pos = 0;
-
- if (sb->cms_enabled)
- sb->cms.pos = 0;
}
static void
@@ -2890,6 +2911,13 @@ sb_init(UNUSED(const device_t *info))
cms_read, NULL, NULL,
cms_write, NULL, NULL,
&sb->cms);
+
+ sb->cms.saasound = newSAASND();
+ SAASNDSetSoundParameters(sb->cms.saasound, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO);
+ sb->cms.saasound2 = newSAASND();
+ SAASNDSetSoundParameters(sb->cms.saasound2, SAAP_44100 | SAAP_16BIT | SAAP_NOFILTER | SAAP_STEREO);
+ wavetable_add_handler(sb_cms_get_buffer, sb);
+ wavetable_add_handler(sb_cms_get_buffer_2, sb);
}
if (mixer_addr > 0x000) {
@@ -4044,6 +4072,11 @@ sb_close(void *priv)
sb_t *sb = (sb_t *) priv;
sb_dsp_close(&sb->dsp);
+ if (sb->cms_enabled) {
+ deleteSAASND(sb->cms.saasound);
+ deleteSAASND(sb->cms.saasound2);
+ }
+
free(sb);
}
diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c
index efb05a307..8925f01da 100644
--- a/src/video/vid_8514a.c
+++ b/src/video/vid_8514a.c
@@ -334,6 +334,13 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
{
ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
+ if (port & 0x8000) {
+ if ((port != 0xe2e8) && (port != 0xe2e9) && (port != 0xe6e8) && (port != 0xe6e9)) {
+ if (port & 0x4000)
+ port &= ~0x4000;
+ }
+ }
+
switch (port) {
case 0x2e8:
WRITE8(port, dev->htotal, val);
@@ -357,13 +364,13 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
case 0xae8:
WRITE8(port, dev->hsync_start, val);
- pclog("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_start=%d.\n", port, val, (val + 1) << 3);
+ ibm8514_log("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_start=%d.\n", port, val, (val + 1) << 3);
svga_recalctimings(svga);
break;
case 0xee8:
WRITE8(port, dev->hsync_width, val);
- pclog("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_width=%d, hsyncpol=%02x.\n", port, val & 0x1f, ((val & 0x1f) + 1) << 3, val & 0x20);
+ ibm8514_log("IBM 8514/A compatible: (0x%04x): val=0x%02x, hsync_width=%d, hsyncpol=%02x.\n", port, val & 0x1f, ((val & 0x1f) + 1) << 3, val & 0x20);
svga_recalctimings(svga);
break;
@@ -499,19 +506,16 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
break;
case 0x82e8:
- case 0xc2e8:
if (len == 2)
dev->accel.cur_y = val & 0x7ff;
break;
case 0x86e8:
- case 0xc6e8:
if (len == 2)
dev->accel.cur_x = val & 0x7ff;
break;
case 0x8ae8:
- case 0xcae8:
if (len == 2) {
dev->accel.desty = val & 0x7ff;
dev->accel.desty_axstp = val & 0x3fff;
@@ -521,7 +525,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
break;
case 0x8ee8:
- case 0xcee8:
if (len == 2) {
dev->accel.destx = val & 0x7ff;
dev->accel.destx_distp = val & 0x3fff;
@@ -531,12 +534,8 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
break;
case 0x92e8:
- if (len == 2)
- dev->test = val;
- fallthrough;
-
- case 0xd2e8:
if (len == 2) {
+ dev->test = val;
dev->accel.err_term = val & 0x3fff;
if (val & 0x2000)
dev->accel.err_term |= ~0x1fff;
@@ -544,7 +543,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
break;
case 0x96e8:
- case 0xd6e8:
if (len == 2) {
dev->accel.maj_axis_pcnt = val & 0x7ff;
dev->accel.maj_axis_pcnt_no_limit = val;
@@ -552,7 +550,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
break;
case 0x9ae8:
- case 0xdae8:
dev->accel.ssv_state = 0;
if (len == 2) {
dev->data_available = 0;
@@ -562,13 +559,12 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
if (dev->accel.cmd & 0x100)
dev->accel.cmd_back = 0;
- ibm8514_log("8514/A CMD=%04x, back=%d, frgd color=%04x, frgdmix=%02x, pixcntl=%02x.\n", dev->accel.cmd, dev->accel.cmd_back, dev->accel.frgd_color, dev->accel.frgd_mix, dev->accel.multifunc[0x0a]);
+ ibm8514_log("8514/A CMD=%04x, frgd color=%04x, frgdmix=%02x, pixcntl=%02x.\n", dev->accel.cmd, dev->accel.frgd_color, dev->accel.frgd_mix, dev->accel.multifunc[0x0a]);
ibm8514_accel_start(-1, 0, -1, 0, svga, len);
}
break;
case 0x9ee8:
- case 0xdee8:
dev->accel.ssv_state = 1;
if (len == 2) {
dev->accel.short_stroke = val;
@@ -628,35 +624,29 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
break;
case 0xaae8:
- case 0xeae8:
if (len == 2)
dev->accel.wrt_mask = val;
break;
case 0xaee8:
- case 0xeee8:
if (len == 2)
dev->accel.rd_mask = val;
break;
case 0xb2e8:
- case 0xf2e8:
if (len == 2)
dev->accel.color_cmp = val;
break;
case 0xb6e8:
- case 0xf6e8:
dev->accel.bkgd_mix = val & 0xff;
break;
case 0xbae8:
- case 0xfae8:
dev->accel.frgd_mix = val & 0xff;
break;
case 0xbee8:
- case 0xfee8:
if (len == 2) {
dev->accel.multifunc_cntl = val;
dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff;
@@ -765,10 +755,12 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len)
{
ibm8514_t *dev = (ibm8514_t *) svga->dev8514;
- if (dev->accel.cmd_back) {
- dev->fifo_idx++;
- if (dev->fifo_idx > 8)
- dev->fifo_idx = 8;
+ if (port & 0x8000) {
+ if (dev->accel.cmd_back) {
+ dev->fifo_idx++;
+ if (dev->fifo_idx > 8)
+ dev->fifo_idx = 8;
+ }
}
ibm8514_accel_out_fifo(svga, port, val, len);
@@ -799,13 +791,11 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len)
switch (port) {
case 0x82e8:
- case 0xc2e8:
if (len == 2)
temp = dev->accel.cur_y;
break;
case 0x86e8:
- case 0xc6e8:
if (len == 2)
temp = dev->accel.cur_x;
break;
@@ -821,7 +811,6 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len)
break;
case 0x9ae8:
- case 0xdae8:
if (len == 2) {
if (dev->fifo_idx <= 8) {
for (int i = 1; i <= dev->fifo_idx; i++)
@@ -834,15 +823,26 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len)
if (dev->force_busy)
temp |= 0x0200; /*Hardware busy*/
- dev->force_busy = 0;
+
if (dev->data_available) {
temp |= 0x0100; /*Read Data available*/
- dev->data_available = 0;
+ switch (dev->accel.cmd >> 13) {
+ case 2:
+ case 3:
+ case 4:
+ case 6:
+ if (dev->accel.sy < 0)
+ dev->data_available = 0;
+ break;
+ default:
+ if (!dev->accel.sy)
+ dev->data_available = 0;
+ break;
+ }
}
}
break;
case 0x9ae9:
- case 0xdae9:
if (len == 1) {
dev->fifo_idx = 0;
@@ -850,9 +850,22 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len)
temp |= 0x02; /*Hardware busy*/
dev->force_busy2 = 0;
+
if (dev->data_available2) {
temp |= 0x01; /*Read Data available*/
- dev->data_available2 = 0;
+ switch (dev->accel.cmd >> 13) {
+ case 2:
+ case 3:
+ case 4:
+ case 6:
+ if (dev->accel.sy < 0)
+ dev->data_available2 = 0;
+ break;
+ default:
+ if (!dev->accel.sy)
+ dev->data_available2 = 0;
+ break;
+ }
}
}
break;
@@ -931,10 +944,10 @@ ibm8514_accel_in(uint16_t port, svga_t *svga)
if (cmd == 6) {
if ((dev->subsys_cntl & INT_GE_BSY) &&
!(dev->subsys_stat & INT_GE_BSY) &&
- (dev->accel.dx_ibm >= clip_l) &&
- (dev->accel.dx_ibm <= clip_r_ibm) &&
- (dev->accel.dy_ibm >= clip_t) &&
- (dev->accel.dy_ibm <= clip_b_ibm))
+ (dev->accel.dx >= clip_l) &&
+ (dev->accel.dx <= clip_r_ibm) &&
+ (dev->accel.dy >= clip_t) &&
+ (dev->accel.dy <= clip_b_ibm))
temp |= INT_GE_BSY;
} else {
if ((dev->subsys_cntl & INT_GE_BSY) &&
@@ -946,7 +959,7 @@ ibm8514_accel_in(uint16_t port, svga_t *svga)
temp |= INT_GE_BSY;
}
- if (dev->accel.cmd_back) {
+ if (!dev->fifo_idx) {
dev->force_busy = 0;
dev->force_busy2 = 0;
dev->data_available = 0;
@@ -1005,6 +1018,8 @@ ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t
dev->accel.ssv_len_back = dev->accel.ssv_len;
if (ibm8514_cpu_src(svga)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return; /*Wait for data from CPU*/
@@ -1051,11 +1066,6 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
rd_mask_polygon &= 0xff;
}
- if (!dev->accel.cmd_back) {
- dev->force_busy = 1;
- dev->force_busy2 = 1;
- }
-
frgd_mix = (dev->accel.frgd_mix >> 5) & 3;
bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3;
@@ -1223,8 +1233,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
cpu_dat >>= 8;
if (!dev->accel.ssv_len) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -1320,8 +1334,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
cpu_dat >>= 8;
if (!dev->accel.ssv_len) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -1385,10 +1403,14 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
dev->accel.output = 1;
}
}
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return; /*Wait for data from CPU*/
} else if (ibm8514_cpu_dest(svga)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return;
@@ -1496,8 +1518,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
}
if (!dev->accel.sy) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
if (!cpu_input) {
dev->accel.cur_x = dev->accel.cx;
dev->accel.cur_y = dev->accel.cy;
@@ -1617,8 +1643,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
cpu_dat >>= 8;
if (!dev->accel.sy) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -1721,8 +1751,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
cpu_dat >>= 8;
if (!dev->accel.sy) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
if (!cpu_input) {
dev->accel.cur_x = dev->accel.cx;
dev->accel.cur_y = dev->accel.cy;
@@ -1827,6 +1861,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
}
}
}
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return; /*Wait for data from CPU*/
@@ -1844,6 +1880,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
}
}
ibm8514_log("INPUT=%d.\n", dev->accel.input);
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return; /*Wait for data from CPU*/
@@ -2003,8 +2041,10 @@ skip_vector_rect_write:
dev->accel.x_count = 0;
if (dev->accel.sy < 0) {
- dev->accel.cmd_back = 1;
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
}
return;
}
@@ -2015,6 +2055,7 @@ skip_vector_rect_write:
ibm8514_log("Vectored Rectangle with normal processing (TODO).\n");
} else { /*Normal Rectangle*/
if (cpu_input) {
+ ibm8514_log("Normal Pixel Rectangle Fill Transfer SY=%d.\n", dev->accel.sy);
while (count-- && (dev->accel.sy >= 0)) {
if ((dev->accel.cx >= clip_l) &&
(dev->accel.cx <= clip_r) &&
@@ -2164,9 +2205,11 @@ skip_nibble_rect_write:
dev->accel.x_count = 0;
if (dev->accel.sy < 0) {
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
}
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
return;
}
}
@@ -2252,8 +2295,8 @@ skip_nibble_rect_write:
dev->accel.sy--;
if (dev->accel.sy < 0) {
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
}
return;
}
@@ -2338,8 +2381,8 @@ skip_nibble_rect_write:
dev->accel.cur_x = dev->accel.cx;
dev->accel.cur_y = dev->accel.cy;
}
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -2450,10 +2493,10 @@ skip_nibble_rect_write:
if (dev->accel.sy < 0) {
ibm8514_log(".\n");
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
dev->accel.cur_x = dev->accel.cx;
dev->accel.cur_y = dev->accel.cy;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -2540,8 +2583,8 @@ skip_nibble_rect_write:
dev->accel.cur_x = dev->accel.cx;
dev->accel.cur_y = dev->accel.cy;
}
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -2571,10 +2614,14 @@ skip_nibble_rect_write:
ibm8514_log("Polygon Boundary activated=%04x, len=%d, cur(%d,%d), frgdmix=%02x, err=%d, clipping: l=%d, r=%d, t=%d, b=%d, pixcntl=%02x.\n", dev->accel.cmd, dev->accel.sy, dev->accel.cx, dev->accel.cy, dev->accel.frgd_mix & 0x1f, dev->accel.err_term, clip_l, clip_r, clip_t, clip_b, dev->accel.multifunc[0x0a]);
if (ibm8514_cpu_src(svga)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return; /*Wait for data from CPU*/
} else if (ibm8514_cpu_dest(svga)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return;
@@ -2643,8 +2690,12 @@ skip_nibble_rect_write:
cpu_dat >>= 8;
if (!dev->accel.sy) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -2748,8 +2799,12 @@ skip_nibble_rect_write:
cpu_dat >>= 8;
if (!dev->accel.sy) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -2796,8 +2851,13 @@ skip_nibble_rect_write:
{
dev->accel.x_count = 0;
- dev->accel.dx_ibm = dev->accel.destx;
- dev->accel.dy_ibm = dev->accel.desty;
+ dev->accel.dx = dev->accel.destx;
+ if (dev->accel.destx >= 0x600)
+ dev->accel.dx |= ~0x5ff;
+
+ dev->accel.dy = dev->accel.desty;
+ if (dev->accel.desty >= 0x600)
+ dev->accel.dy |= ~0x5ff;
dev->accel.cx = dev->accel.cur_x;
if (dev->accel.cur_x >= 0x600)
@@ -2812,13 +2872,13 @@ skip_nibble_rect_write:
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.fill_state = 0;
@@ -2836,23 +2896,27 @@ skip_nibble_rect_write:
}
}
}
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return; /*Wait for data from CPU*/
} else if (ibm8514_cpu_dest(svga)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return; /*Wait for data from CPU*/
} else
- ibm8514_log("BitBLT normal: Parameters: DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, dstheight=%d, clipl=%d, clipr=%d, clipt=%d, clipb=%d.\n", dev->accel.dx_ibm, dev->accel.dy_ibm, dev->accel.cx, dev->accel.cy, dev->accel.sx, dev->accel.sy, clip_l, clip_r, clip_t, clip_b);
+ ibm8514_log("BitBLT normal: Parameters: DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, dstheight=%d, clipl=%d, clipr=%d, clipt=%d, clipb=%d.\n", dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, dev->accel.sx, dev->accel.sy, clip_l, clip_r, clip_t, clip_b);
}
if (cpu_input) {
while (count-- && (dev->accel.sy >= 0)) {
- if ((dev->accel.dx_ibm >= clip_l) &&
- (dev->accel.dx_ibm <= clip_r) &&
- (dev->accel.dy_ibm >= clip_t) &&
- (dev->accel.dy_ibm <= clip_b)) {
+ if ((dev->accel.dx >= clip_l) &&
+ (dev->accel.dx <= clip_r) &&
+ (dev->accel.dy >= clip_t) &&
+ (dev->accel.dy <= clip_b)) {
if (pixcntl == 3) {
if (!(dev->accel.cmd & 0x10) && ((frgd_mix != 3) || (bkgd_mix != 3))) {
READ(dev->accel.src + dev->accel.cx, mix_dat);
@@ -2916,7 +2980,7 @@ skip_nibble_rect_write:
}
}
- READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ READ(dev->accel.dest + dev->accel.dx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -2932,20 +2996,20 @@ skip_nibble_rect_write:
goto skip_nibble_bitblt_write;
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
- WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
} else {
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
- WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
}
}
}
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm++;
+ dev->accel.dx++;
dev->accel.cx++;
} else {
- dev->accel.dx_ibm--;
+ dev->accel.dx--;
dev->accel.cx--;
}
@@ -2972,30 +3036,30 @@ skip_nibble_bitblt_write:
dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff;
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm -= (dev->accel.sx + 1);
+ dev->accel.dx -= (dev->accel.sx + 1);
dev->accel.cx -= (dev->accel.sx + 1);
} else {
- dev->accel.dx_ibm += (dev->accel.sx + 1);
+ dev->accel.dx += (dev->accel.sx + 1);
dev->accel.cx += (dev->accel.sx + 1);
}
if (dev->accel.cmd & 0x80) {
- dev->accel.dy_ibm++;
+ dev->accel.dy++;
dev->accel.cy++;
} else {
- dev->accel.dy_ibm--;
+ dev->accel.dy--;
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.sy--;
@@ -3003,6 +3067,8 @@ skip_nibble_bitblt_write:
if (dev->accel.sy < 0) {
dev->accel.cmd_back = 1;
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
dev->fifo_idx = 0;
}
return;
@@ -3018,10 +3084,10 @@ skip_nibble_bitblt_write:
mix_dat >>= 8;
dev->accel.temp_cnt = 8;
}
- if ((dev->accel.dx_ibm >= clip_l) &&
- (dev->accel.dx_ibm <= clip_r) &&
- (dev->accel.dy_ibm >= clip_t) &&
- (dev->accel.dy_ibm <= clip_b)) {
+ if ((dev->accel.dx >= clip_l) &&
+ (dev->accel.dx <= clip_r) &&
+ (dev->accel.dy >= clip_t) &&
+ (dev->accel.dy <= clip_b)) {
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
case 0:
src_dat = bkgd_color;
@@ -3040,7 +3106,7 @@ skip_nibble_bitblt_write:
break;
}
- READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ READ(dev->accel.dest + dev->accel.dx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -3052,7 +3118,7 @@ skip_nibble_bitblt_write:
old_dest_dat = dest_dat;
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
- WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
}
}
@@ -3063,10 +3129,10 @@ skip_nibble_bitblt_write:
}
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm++;
+ dev->accel.dx++;
dev->accel.cx++;
} else {
- dev->accel.dx_ibm--;
+ dev->accel.dx--;
dev->accel.cx--;
}
@@ -3075,30 +3141,30 @@ skip_nibble_bitblt_write:
dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff;
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm -= (dev->accel.sx + 1);
+ dev->accel.dx -= (dev->accel.sx + 1);
dev->accel.cx -= (dev->accel.sx + 1);
} else {
- dev->accel.dx_ibm += (dev->accel.sx + 1);
+ dev->accel.dx += (dev->accel.sx + 1);
dev->accel.cx += (dev->accel.sx + 1);
}
if (dev->accel.cmd & 0x80) {
- dev->accel.dy_ibm++;
+ dev->accel.dy++;
dev->accel.cy++;
} else {
- dev->accel.dy_ibm--;
+ dev->accel.dy--;
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.sy--;
@@ -3117,10 +3183,10 @@ skip_nibble_bitblt_write:
dev->accel.temp_cnt = 8;
mix_dat = old_mix_dat;
}
- if ((dev->accel.dx_ibm >= clip_l) &&
- (dev->accel.dx_ibm <= clip_r) &&
- (dev->accel.dy_ibm >= clip_t) &&
- (dev->accel.dy_ibm <= clip_b)) {
+ if ((dev->accel.dx >= clip_l) &&
+ (dev->accel.dx <= clip_r) &&
+ (dev->accel.dy >= clip_t) &&
+ (dev->accel.dy <= clip_b)) {
switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) {
case 0:
src_dat = bkgd_color;
@@ -3139,7 +3205,7 @@ skip_nibble_bitblt_write:
break;
}
- READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ READ(dev->accel.dest + dev->accel.dx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -3151,7 +3217,7 @@ skip_nibble_bitblt_write:
old_dest_dat = dest_dat;
MIX(mix_dat & 0x01, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
- WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
}
}
@@ -3159,10 +3225,10 @@ skip_nibble_bitblt_write:
mix_dat >>= 1;
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm++;
+ dev->accel.dx++;
dev->accel.cx++;
} else {
- dev->accel.dx_ibm--;
+ dev->accel.dx--;
dev->accel.cx--;
}
@@ -3171,38 +3237,38 @@ skip_nibble_bitblt_write:
dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff;
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm -= (dev->accel.sx + 1);
+ dev->accel.dx -= (dev->accel.sx + 1);
dev->accel.cx -= (dev->accel.sx + 1);
} else {
- dev->accel.dx_ibm += (dev->accel.sx + 1);
+ dev->accel.dx += (dev->accel.sx + 1);
dev->accel.cx += (dev->accel.sx + 1);
}
if (dev->accel.cmd & 0x80) {
- dev->accel.dy_ibm++;
+ dev->accel.dy++;
dev->accel.cy++;
} else {
- dev->accel.dy_ibm--;
+ dev->accel.dy--;
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.sy--;
if (dev->accel.sy < 0) {
- dev->accel.destx = dev->accel.dx_ibm;
- dev->accel.desty = dev->accel.dy_ibm;
- dev->accel.cmd_back = 1;
+ dev->accel.destx = dev->accel.dx;
+ dev->accel.desty = dev->accel.dy;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -3214,16 +3280,36 @@ skip_nibble_bitblt_write:
int64_t dx;
cx = (int64_t) dev->accel.cx;
- dx = (int64_t) dev->accel.dx_ibm;
+ dx = (int64_t) dev->accel.dx;
while (1) {
if ((dx >= (((int64_t)clip_l) * 3)) &&
(dx <= (((uint64_t)clip_r) * 3)) &&
- (dev->accel.dy_ibm >= (clip_t << 1)) &&
- (dev->accel.dy_ibm <= (clip_b << 1))) {
+ (dev->accel.dy >= (clip_t << 1)) &&
+ (dev->accel.dy <= (clip_b << 1))) {
+ switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
+ case 0:
+ src_dat = bkgd_color;
+ break;
+ case 1:
+ src_dat = frgd_color;
+ break;
+ case 2:
+ src_dat = 0;
+ break;
+ case 3:
+ READ(dev->accel.src + cx, src_dat);
+ break;
+
+ default:
+ break;
+ }
+
READ(dev->accel.src + cx, src_dat);
READ(dev->accel.dest + dx, dest_dat);
- dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask);
+ old_dest_dat = dest_dat;
+ MIX(mix_dat & mix_mask, dest_dat, src_dat);
+ dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
WRITE(dev->accel.dest + dx, dest_dat);
}
@@ -3232,17 +3318,17 @@ skip_nibble_bitblt_write:
dev->accel.sx--;
if (dev->accel.sx < 0) {
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
} else {
while (count-- && dev->accel.sy >= 0) {
- if ((dev->accel.dx_ibm >= clip_l) &&
- (dev->accel.dx_ibm <= clip_r) &&
- (dev->accel.dy_ibm >= clip_t) &&
- (dev->accel.dy_ibm <= clip_b)) {
+ if ((dev->accel.dx >= clip_l) &&
+ (dev->accel.dx <= clip_r) &&
+ (dev->accel.dy >= clip_t) &&
+ (dev->accel.dy <= clip_b)) {
if (pixcntl == 3) {
if (!(dev->accel.cmd & 0x10) && ((frgd_mix != 3) || (bkgd_mix != 3))) {
READ(dev->accel.src + dev->accel.cx, mix_dat);
@@ -3276,7 +3362,7 @@ skip_nibble_bitblt_write:
break;
}
- READ(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
+ READ(dev->accel.dest + dev->accel.dx, dest_dat);
if ((compare_mode == 0) ||
((compare_mode == 0x10) && (dest_dat >= compare)) ||
@@ -3288,15 +3374,8 @@ skip_nibble_bitblt_write:
old_dest_dat = dest_dat;
MIX(mix_dat & mix_mask, dest_dat, src_dat);
dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask);
-
- if (dev->accel.cmd & 0x04) {
- if (dev->accel.sx) {
- WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
- }
- } else {
- WRITE(dev->accel.dest + dev->accel.dx_ibm, dest_dat);
- ibm8514_log("BitBLT DX=%d, DY=%d, data=%02x, old=%02x, src=%02x, frmix=%02x, bkmix=%02x, pixcntl=%d.\n", dev->accel.dx_ibm, dev->accel.dy_ibm, dest_dat, old_dest_dat, src_dat, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, pixcntl);
- }
+ WRITE(dev->accel.dest + dev->accel.dx, dest_dat);
+ ibm8514_log("BitBLT DX=%d, DY=%d, data=%02x, old=%02x, src=%02x, frmix=%02x, bkmix=%02x, pixcntl=%d.\n", dev->accel.dx, dev->accel.dy, dest_dat, old_dest_dat, src_dat, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, pixcntl);
}
}
@@ -3304,10 +3383,10 @@ skip_nibble_bitblt_write:
mix_dat |= 1;
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm++;
+ dev->accel.dx++;
dev->accel.cx++;
} else {
- dev->accel.dx_ibm--;
+ dev->accel.dx--;
dev->accel.cx--;
}
@@ -3317,38 +3396,38 @@ skip_nibble_bitblt_write:
dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff;
if (dev->accel.cmd & 0x20) {
- dev->accel.dx_ibm -= (dev->accel.sx + 1);
+ dev->accel.dx -= (dev->accel.sx + 1);
dev->accel.cx -= (dev->accel.sx + 1);
} else {
- dev->accel.dx_ibm += (dev->accel.sx + 1);
+ dev->accel.dx += (dev->accel.sx + 1);
dev->accel.cx += (dev->accel.sx + 1);
}
if (dev->accel.cmd & 0x80) {
- dev->accel.dy_ibm++;
+ dev->accel.dy++;
dev->accel.cy++;
} else {
- dev->accel.dy_ibm--;
+ dev->accel.dy--;
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
- dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy_ibm * dev->pitch);
+ dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.sy--;
if (dev->accel.sy < 0) {
- dev->accel.destx = dev->accel.dx_ibm;
- dev->accel.desty = dev->accel.dy_ibm;
- dev->accel.cmd_back = 1;
+ dev->accel.destx = dev->accel.dx;
+ dev->accel.desty = dev->accel.dy;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -3846,10 +3925,7 @@ ibm8514_recalctimings(svga_t *svga)
else
svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0;
- if (dev->dispend == 766)
- dev->dispend += 2;
-
- if (dev->dispend == 478)
+ if ((dev->dispend == 478) || (dev->dispend == 766))
dev->dispend += 2;
if (dev->interlace)
@@ -3990,6 +4066,7 @@ ibm8514_init(const device_t *info)
default:
dev->extensions = 0;
ibm8514_io_set(svga);
+ dev->accel.cmd_back = 1;
if (dev->type & DEVICE_MCA) {
dev->pos_regs[0] = 0x7f;
diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c
index 24935e3a2..4ec9afff8 100644
--- a/src/video/vid_ati_mach64.c
+++ b/src/video/vid_ati_mach64.c
@@ -3768,6 +3768,9 @@ mach64_ext_outb(uint16_t port, uint8_t val, void *priv)
case 0x6aee:
case 0x6aef:
WRITE8(port, mach64->config_cntl, val);
+ if (!mach64->pci)
+ mach64->linear_base = (mach64->config_cntl & 0x3ff0) << 18;
+
mach64_updatemapping(mach64);
break;
diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c
index 9f1bb99d6..9f92ebde1 100644
--- a/src/video/vid_ati_mach8.c
+++ b/src/video/vid_ati_mach8.c
@@ -69,6 +69,7 @@ static uint8_t ati8514_accel_inb(uint16_t port, void *priv);
static uint16_t ati8514_accel_inw(uint16_t port, void *priv);
static uint32_t ati8514_accel_inl(uint16_t port, void *priv);
+static void mach_set_resolution(mach_t *mach, svga_t *svga);
static void mach32_updatemapping(mach_t *mach, svga_t *svga);
static __inline void mach32_writew_linear(uint32_t addr, uint16_t val, mach_t *mach);
static __inline void mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t *svga);
@@ -326,12 +327,6 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
bkgd_sel = (mach->accel.dp_config >> 7) & 3;
mono_src = (mach->accel.dp_config >> 5) & 3;
- if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) {
- mach->force_busy = 1;
- dev->force_busy = 1;
- dev->force_busy2 = 1;
- }
-
if (cpu_input) {
if (dev->bpp) {
if ((mach->accel.dp_config & 0x200) && (count == 2))
@@ -339,12 +334,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
}
}
- if ((dev->accel_bpp == 8) || (dev->accel_bpp == 15) || (dev->accel_bpp == 16) || (dev->accel_bpp == 24))
- mach_log("RdMask=%04x, DPCONFIG=%04x, Clipping: l=%d, r=%d, t=%d, b=%d, LineDrawOpt=%04x, BPP=%d, CMDType = %d, offs=%08x, cnt = %d, input = %d, mono_src = %d, frgdsel = %d, d(%d,%d), dstxend = %d, pitch = %d, extcrt = %d, rw = %x, monopattern = %x.\n",
- dev->accel.rd_mask, mach->accel.dp_config, clip_l, clip_r, clip_t, clip_b, mach->accel.linedraw_opt, dev->accel_bpp, cmd_type, mach->accel.ge_offset, count, cpu_input, mono_src, frgd_sel, dev->accel.cur_x, dev->accel.cur_y,
- mach->accel.dest_x_end, dev->ext_pitch, dev->ext_crt_pitch, mach->accel.dp_config & 1, mach->accel.mono_pattern_enable);
-
- mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i.\n", cmd_type, frgd_sel, bkgd_sel, mono_src);
+ mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i, dpconfig = %04x, cur_x = %d, cur_y = %d.\n", cmd_type, frgd_sel, bkgd_sel, mono_src, mach->accel.dp_config, dev->accel.cur_x, dev->accel.cur_y);
switch (cmd_type) {
case 1: /*Extended Raw Linedraw from bres_count register (0x96ee)*/
@@ -376,12 +366,18 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.linedraw_opt,
mach->accel.dp_config, mach->accel.max_waitstates & 0x100);
- if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) {
+ if (!dev->accel.cmd_back) {
if (mach_pixel_write(mach)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return;
} else if (mach_pixel_read(mach)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return;
@@ -550,12 +546,22 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
}
if ((mono_src == 1) && !count) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ mach->force_busy = 0;
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
} else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ mach->force_busy = 0;
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -777,12 +783,22 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
}
if ((mono_src == 1) && !count) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
} else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -900,14 +916,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
}
dev->accel.sy = 0;
- if (mach->accel.dp_config & 0x02)
- dev->accel.dest = (dev->accel.dy * dev->pitch);
- else {
- if (dev->bpp)
- dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
- else
- dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
- }
+ if (dev->bpp)
+ dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
+ else
+ dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
mach->accel.src_stepx = 0;
/*Source Width*/
@@ -980,12 +992,18 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
}
}
- if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) {
+ if (!dev->accel.cmd_back) {
if (mach_pixel_write(mach)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return;
} else if (mach_pixel_read(mach)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return;
@@ -1004,16 +1022,26 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
if (mach->accel.dy_end == mach->accel.dy_start) {
mach_log("No DEST.\n");
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
if ((mono_src == 3) || (bkgd_sel == 3) || (frgd_sel == 3)) {
if (mach->accel.sx_end == mach->accel.sx_start) {
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
mach_log("No SRC.\n");
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -1024,8 +1052,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
mono_src, frgd_sel, bkgd_sel, dev->pitch);
if (dev->accel.sy == mach->accel.height) {
mach_log("No Blit on DPCONFIG=3251.\n");
- dev->accel.cmd_back = 1;
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -1242,8 +1273,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
}
if (dev->accel.sy >= mach->accel.height) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
if ((mono_src == 2) || (mono_src == 3) || (frgd_sel == 3) || (bkgd_sel == 3) || (mach->accel.dp_config & 0x02))
return;
if ((mono_src == 1) && (frgd_sel == 5) && (dev->accel_bpp == 24))
@@ -1283,14 +1319,20 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
dev->accel.cur_x, dev->accel.cur_y, dev->accel.dx, dev->accel.dy, mach->accel.cx_end_line,
mach->accel.cy_end_line, mach->accel.bleft, mach->accel.bright, mach->accel.btop, mach->accel.bbottom);
- if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) {
+ if (!dev->accel.cmd_back) {
if (mach_pixel_write(mach)) {
mach_log("Write PIXTRANS.\n");
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return;
} else if (mach_pixel_read(mach)) {
mach_log("Read PIXTRANS.\n");
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return;
@@ -1402,8 +1444,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f);
if (!count) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -1573,8 +1620,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f);
if (dev->accel.sx >= mach->accel.width) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -1698,8 +1750,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f);
if (!count) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -1857,8 +1914,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f);
if (dev->accel.sx >= mach->accel.width) {
- dev->accel.cmd_back = 1;
+ if (cpu_input) {
+ dev->force_busy = 0;
+ dev->force_busy2 = 0;
+ mach->force_busy = 0;
+ }
dev->fifo_idx = 0;
+ dev->accel.cmd_back = 1;
break;
}
@@ -1990,14 +2052,38 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
else
dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch));
- mach_log("ScanToX: Parameters=%04x: DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, srcwidth=%d, height=%d, clipl=%d, clipr=%d, clipt=%d, clipb=%d, frmix=%02x.\n", mach->accel.dp_config, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.src_width, dev->accel.sy, clip_l, clip_r, clip_t, clip_b, dev->accel.frgd_mix & 0x1f);
+ if ((dev->accel_bpp >= 24) && (frgd_sel == 5)) {
+ if (mach->accel.patt_len == 0x17)
+ mach->accel.color_pattern_idx = 0;
- if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) {
+ dev->accel.x1 = dev->accel.dx + mach->accel.width;
+ if (dev->accel.x1 == dev->pitch)
+ dev->accel.x2 = mach->accel.width & 1;
+ else if ((dev->accel.x1 == mach->accel.width) && (dev->accel.dy & 1) && !dev->accel.y1 && dev->accel.x2) {
+ if (mach->accel.patt_len == 0x17)
+ mach->accel.color_pattern_idx = 3;
+
+ dev->accel.x3 = 1;
+ } else
+ dev->accel.x3 = 0;
+ }
+ dev->accel.y1 = 0;
+
+ mach_log("ScanToX: Parameters=%04x: xbit=%d, ybit=%d, widthbit=%d, DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, srcwidth=%d, height=%d, frmix=%02x.\n",
+ mach->accel.dp_config, dev->accel.dx & 1, dev->accel.dy & 1, mach->accel.width & 1, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.src_width, dev->accel.sy, dev->accel.frgd_mix & 0x1f);
+
+ if (!dev->accel.cmd_back) {
if (mach_pixel_write(mach)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 0;
dev->data_available2 = 0;
return;
} else if (mach_pixel_read(mach)) {
+ dev->force_busy = 1;
+ dev->force_busy2 = 1;
+ mach->force_busy = 1;
dev->data_available = 1;
dev->data_available2 = 1;
return;
@@ -2136,10 +2222,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
mach->accel.sx++;
if (mach->accel.sx >= mach->accel.src_width) {
mach->accel.sx = 0;
- if (mach->accel.src_stepx == -1) {
+ if (mach->accel.src_stepx == -1)
dev->accel.cx += mach->accel.src_width;
- } else
+ else
dev->accel.cx -= mach->accel.src_width;
+
dev->accel.cy += (mach->accel.src_y_dir ? 1 : -1);
if (dev->bpp)
dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * (dev->pitch));
@@ -2147,13 +2234,24 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch));
}
+ mach_log("ColorIdx=%d, data=%02x, DestX=%d, DestY=%d.\n", mach->accel.color_pattern_idx, mach->accel.color_pattern[mach->accel.color_pattern_idx], dev->accel.dx, dev->accel.dy & 1);
if (dev->bpp)
mach->accel.color_pattern_idx += 2;
else
mach->accel.color_pattern_idx++;
- if (mach->accel.color_pattern_idx > mach->accel.patt_len)
- mach->accel.color_pattern_idx = 0;
+ if ((dev->accel_bpp >= 24) && (frgd_sel == 5) && (mach->accel.patt_len == 0x17)) {
+ if (dev->accel.x3) {
+ if (mach->accel.color_pattern_idx == 9)
+ mach->accel.color_pattern_idx = 3;
+ } else {
+ if (mach->accel.color_pattern_idx == 6)
+ mach->accel.color_pattern_idx = 0;
+ }
+ } else {
+ if (mach->accel.color_pattern_idx > mach->accel.patt_len)
+ mach->accel.color_pattern_idx = 0;
+ }
dev->accel.dx += mach->accel.stepx;
dev->accel.sx++;
@@ -2171,11 +2269,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3
if (dev->accel.sy >= 0)
dev->accel.sy--;
- dev->accel.cmd_back = 1;
dev->fifo_idx = 0;
dev->force_busy = 0;
dev->force_busy2 = 0;
mach->force_busy = 0;
+ dev->accel.cmd_back = 1;
return;
}
}
@@ -2221,7 +2319,7 @@ mach_accel_out_pixtrans(svga_t *svga, mach_t *mach, ibm8514_t *dev, uint16_t val
case 0x200: /*16-bit size*/
if (mono_src == 2) {
if ((frgd_sel != 2) && (bkgd_sel != 2)) {
- if (((mach->accel.dp_config & 0x1000) && !swap) || swap) {
+ if (((mach->accel.dp_config & 0x1000) && !swap) || (!(mach->accel.dp_config & 0x1000) && swap)) {
mach_log("16-bit bus size swap.\n");
val = (val >> 8) | (val << 8);
}
@@ -2250,7 +2348,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
if (((addr & 0xFFF0) == 0x3D0 || (addr & 0xFFF0) == 0x3B0) && !(svga->miscout & 1))
addr ^= 0x60;
- if (((dev->disp_cntl & 0x60) == 0x20) && ((dev->local & 0xff) >= 0x02)) {
+ if (((dev->disp_cntl & 0x60) == 0x20) && ATI_MACH32) {
if ((addr >= 0x3c6) && (addr <= 0x3c9)) {
mach_log("VGA DAC write regs=%03x, on=%d, display control=%02x, on1=%x, clocksel=%02x.\n",
addr, dev->on, dev->disp_cntl & 0x60, dev->accel.advfunc_cntl & 0x01, mach->accel.clock_sel & 0x01);
@@ -2281,7 +2379,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
}
break;
case 0xad:
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if ((old ^ val) & 0x0c) {
mach_log("ATI AD bits 2-3.\n");
svga_recalctimings(svga);
@@ -2301,14 +2399,14 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
if (mach->regs[0xbe] & 0x08) { /* Read/write bank mode */
mach->bank_r = (((mach->regs[0xb2] & 1) << 3) | ((mach->regs[0xb2] & 0xe0) >> 5));
mach->bank_w = ((mach->regs[0xb2] & 0x1e) >> 1);
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
mach->bank_r |= ((mach->regs[0xae] & 0x0c) << 2);
mach->bank_w |= ((mach->regs[0xae] & 3) << 4);
}
mach_log("Separate B2Bank = %02x, AEbank = %02x.\n", mach->regs[0xb2], mach->regs[0xae]);
} else { /* Single bank mode */
mach->bank_w = ((mach->regs[0xb2] & 0x1e) >> 1);
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
mach->bank_w |= ((mach->regs[0xae] & 3) << 4);
mach->bank_r = mach->bank_w;
@@ -2338,7 +2436,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
}
break;
case 0xb8:
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if ((old ^ val) & 0x40) {
mach_log("ATI B8 bit 6.\n");
svga_recalctimings(svga);
@@ -2367,12 +2465,12 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
rs2 = !!(mach->accel.ext_ge_config & 0x1000);
rs3 = !!(mach->accel.ext_ge_config & 0x2000);
mach_log("8514/A RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr);
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->regs[0xb0] & 0x20) { /*ATI extended 8514/A mode.*/
mach_log("Extended 8514/A mode.\n");
dev->vendor_mode = 1;
dev->on |= 0x01;
- svga_recalctimings(svga);
+ mach_set_resolution(mach, svga);
mach32_updatemapping(mach, svga);
}
if (dev->on)
@@ -2394,12 +2492,12 @@ mach_out(uint16_t addr, uint8_t val, void *priv)
rs2 = !!(mach->regs[0xa0] & 0x20);
rs3 = !!(mach->regs[0xa0] & 0x40);
mach_log("VGA RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr);
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (svga->attrregs[0x10] & 0x40) {
mach_log("VGA mode.\n");
dev->vendor_mode = 0;
dev->on &= ~0x01;
- svga_recalctimings(svga);
+ mach_set_resolution(mach, svga);
mach32_updatemapping(mach, svga);
}
if (dev->on)
@@ -2495,7 +2593,7 @@ mach_in(uint16_t addr, void *priv)
case 0xb0:
temp = mach->regs[0xb0] | 0x80;
temp &= ~0x18;
- if ((dev->local & 0xff) >= 0x02) { /*Mach32 VGA 1MB memory*/
+ if (ATI_MACH32) { /*Mach32 VGA 1MB memory*/
temp |= 0x08;
} else { /*ATI 28800 VGA 512kB memory*/
temp |= 0x10;
@@ -2524,7 +2622,7 @@ mach_in(uint16_t addr, void *priv)
case 0x2ed:
rs2 = !!(mach->accel.ext_ge_config & 0x1000);
rs3 = !!(mach->accel.ext_ge_config & 0x2000);
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (dev->on)
temp = svga_in(addr, svga);
else {
@@ -2663,6 +2761,11 @@ ati_render_32bpp(svga_t *svga)
}
}
+/*The situation is the following:
+ When ATI mode is selected, allow complete auto-detection.
+ But when 8514/A mode is selected, allow detection based on the shadow register sets.
+*/
+
static void
mach_set_resolution(mach_t *mach, svga_t *svga)
{
@@ -2671,6 +2774,9 @@ mach_set_resolution(mach_t *mach, svga_t *svga)
dev->hdisp = (dev->hdisped + 1) << 3;
dev->h_total = dev->htotal + 1;
+ if (dev->h_total == 1) /*Default to 1024x768 87hz 8514/A htotal timings if it goes to 0.*/
+ dev->h_total = 0x9e;
+
dev->vdisp = (dev->v_disp + 1) >> 1;
if ((dev->vdisp == 478) || (dev->vdisp == 598) || (dev->vdisp == 766) || (dev->vdisp == 1022))
dev->vdisp += 2;
@@ -2683,17 +2789,69 @@ mach_set_resolution(mach_t *mach, svga_t *svga)
if (dev->interlace)
dev->v_syncstart >>= 1;
- mach_log("Shadow set ATI=%x, shadow set 8514/A=%x, resolution h=%d, v=%d.\n", mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp);
- if ((mach->accel.clock_sel & 0x01) || dev->bpp || ((mach->accel.ext_ge_config & 0x30) == 0x30)) /*ATI and 15bpp+ mode*/
- svga_recalctimings(svga);
- else { /*8514/A mode*/
- if (mach->resolution_crt == 0x02) {
- if (!(dev->accel.advfunc_cntl & 0x04)) {
- dev->hdisp = 640;
- dev->vdisp = 480;
+ mach_log("Shadow set ATI=%x, shadow set 8514/A=%x, resolution h=%d, v=%d, vtotal=%d, vsyncstart=%d.\n", mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, dev->v_total, dev->v_syncstart);
+ switch (mach->shadow_set & 0x03) {
+ case 0x00: /*Primary CRT Register set*/
+ if (dev->on) {
+ if (mach->crt_resolution == 0x01) {
+ if (ATI_8514A_ULTRA) {
+ if (dev->accel.advfunc_cntl & 0x04) {
+ if (dev->hdisp == 640) {
+ dev->hdisp = 1024;
+ dev->vdisp = 768;
+ svga_recalctimings(svga);
+ }
+ } else {
+ if (dev->hdisp == 1024) {
+ dev->hdisp = 640;
+ dev->vdisp = 480;
+ svga_recalctimings(svga);
+ }
+ }
+ } else
+ svga_recalctimings(svga);
+ } else if (mach->crt_resolution == 0x02) {
+ if (dev->accel.advfunc_cntl & 0x04) {
+ if (dev->hdisp == 640) {
+ dev->hdisp = 1024;
+ dev->vdisp = 768;
+ svga_recalctimings(svga);
+ }
+ } else {
+ if (dev->hdisp == 1024) {
+ dev->hdisp = 640;
+ dev->vdisp = 480;
+ svga_recalctimings(svga);
+ }
+ }
+ } else
+ svga_recalctimings(svga);
+ }
+ break;
+ case 0x01: /*Shadow 640x480 CRT register set*/
+ if (dev->on) {
+ if (!(dev->accel.advfunc_cntl & 0x04)) {
+ if (dev->hdisp == 1024) {
+ dev->hdisp = 640;
+ dev->vdisp = 480;
+ }
+ }
svga_recalctimings(svga);
}
- }
+ break;
+ case 0x02: /*Shadow 1024x768 CRT register set*/
+ if (dev->on) {
+ if (dev->accel.advfunc_cntl & 0x04) {
+ if (dev->hdisp == 640) {
+ dev->hdisp = 1024;
+ dev->vdisp = 768;
+ }
+ }
+ svga_recalctimings(svga);
+ }
+ break;
+ default:
+ break;
}
}
@@ -2726,6 +2884,7 @@ ati8514_recalctimings(svga_t *svga)
if (dev->interlace)
dev->dispend >>= 1;
+ mach->crt_resolution = 0x00;
mach_log("cntl=%d, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d.\n",
dev->accel.advfunc_cntl & 0x04, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset,
mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 3, dev->interlace);
@@ -2739,7 +2898,6 @@ ati8514_recalctimings(svga_t *svga)
}
}
dev->accel_bpp = 8;
- mach->resolution_crt = 0;
svga->render8514 = ibm8514_render_8bpp;
}
}
@@ -2756,7 +2914,7 @@ mach_recalctimings(svga_t *svga)
clock_sel = ((svga->miscout >> 2) & 3) | ((mach->regs[0xbe] & 0x10) >> 1) | ((mach->regs[0xb9] & 2) << 1);
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->regs[0xad] & 0x04)
svga->ma_latch |= 0x40000;
@@ -2785,7 +2943,7 @@ mach_recalctimings(svga_t *svga)
} else
svga->packed_4bpp = 0;
- if ((dev->local & 0xff) < 0x02) {
+ if (!ATI_MACH32) {
if ((mach->regs[0xb6] & 0x18) == 0x08) {
svga->hdisp <<= 1;
svga->htotal <<= 1;
@@ -2795,15 +2953,15 @@ mach_recalctimings(svga_t *svga)
svga->ati_4color = 0;
}
- mach_log("ON?=%d, override=%d.\n", dev->on, svga->override);
+ mach_log("ON=%d, override=%d, gelo=%04x, gehi=%04x, vgahdisp=%d.\n", dev->on, svga->override, mach->accel.ge_offset_lo, mach->accel.ge_offset_hi, svga->hdisp);
if (dev->on) {
- mach_log("8514/A ON, extpitch=%d, devma=%x, vgamalatch=%x.\n", dev->ext_pitch, dev->ma, svga->ma_latch);
- dev->ma_latch = (mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2;
+ dev->ma_latch = 0; /*(mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2;*/
dev->pitch = dev->ext_pitch;
dev->rowoffset = dev->ext_crt_pitch;
dev->rowcount = !!(dev->disp_cntl & 0x08);
dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16));
mach->accel.ge_offset = dev->accel.ge_offset;
+ mach_log("8514/A ON, extpitch=%d, geoffset=%x, 8514malatch=%x, vgamalatch=%x.\n", dev->ext_pitch, mach->accel.ge_offset, dev->ma_latch, svga->ma_latch);
mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x, interlace=%x.\n",
dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04,
@@ -2823,7 +2981,8 @@ mach_recalctimings(svga_t *svga)
if (dev->interlace)
dev->dispend >>= 1;
- if ((dev->local & 0xff) >= 0x02) {
+ mach->crt_resolution = 0x00;
+ if (ATI_MACH32) {
mach_log("cntl=%d, clksel=%x, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d, vgahdisp=%d.\n",
dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0x01, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset,
mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 3, dev->interlace, svga->hdisp);
@@ -2864,7 +3023,6 @@ mach_recalctimings(svga_t *svga)
dev->h_disp, dev->dispend, dev->pitch, dev->ext_crt_pitch, mach->accel.ext_ge_config & 0xcec0,
dev->accel_bpp, mach->shadow_set & 3, svga->hdisp);
- mach->resolution_crt = 0;
switch (dev->accel_bpp) {
case 8:
svga->render8514 = ibm8514_render_8bpp;
@@ -2902,7 +3060,6 @@ mach_recalctimings(svga_t *svga)
}
}
dev->accel_bpp = 8;
- mach->resolution_crt = 0;
svga->render8514 = ibm8514_render_8bpp;
}
} else {
@@ -2913,7 +3070,7 @@ mach_recalctimings(svga_t *svga)
if ((svga->gdcreg[5] & 0x40) || (svga->attrregs[0x10] & 0x40) || (mach->regs[0xb0] & 0x20)) {
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel, svga->clock_gen);
mach_log("VGA clock=%02x.\n", mach->regs[0xa7] & 0x80);
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->regs[0xb8] & 0x40)
svga->clock *= 2;
} else {
@@ -2956,6 +3113,15 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
int bkgd_sel;
int mono_src;
+ if (port & 0x8000) {
+ if ((port & 0x06) != 0x06) {
+ if ((port != 0xe2e8) && (port != 0xe2e9) && (port != 0xe6e8) && (port != 0xe6e9)) {
+ if (port & 0x4000)
+ port &= ~0x4000;
+ }
+ }
+ }
+
mach_log("[%04X:%08X]: Port FIFO OUT=%04x, val=%04x, len=%d.\n", CS, cpu_state.pc, port, val, len);
switch (port) {
@@ -2973,7 +3139,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
if (!(mach->shadow_cntl & 0x04)) {
WRITE8(port, dev->hsync_start, val);
}
- svga_recalctimings(svga);
+ mach_set_resolution(mach, svga);
}
break;
@@ -2982,28 +3148,31 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
if (!(mach->shadow_cntl & 0x04)) {
WRITE8(port, dev->hsync_width, val);
}
- svga_recalctimings(svga);
+ mach_set_resolution(mach, svga);
}
break;
case 0x1ee8:
case 0x1ee9:
if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) /*For 8514/A mode, take the shadow sets into account.*/
- svga_recalctimings(svga);
+ mach_set_resolution(mach, svga);
break;
case 0x6e8:
if (len == 2) {
mach_log("HDISP and HTOTAL=%04x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01);
if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
- if (!(mach->shadow_cntl & 0x08)) {
- WRITE8(port, dev->hdisped, val);
- }
-
if (!(mach->shadow_cntl & 0x04))
dev->htotal = (val >> 8) & 0xff;
- mach_set_resolution(mach, svga);
+ if (!(mach->shadow_cntl & 0x08)) {
+ if (dev->htotal || (mach->accel.clock_sel & 0x01)) {
+ WRITE8(port, dev->hdisped, val);
+ }
+ }
+
+ if (dev->htotal || (mach->accel.clock_sel & 0x01))
+ mach_set_resolution(mach, svga);
}
} else {
mach_log("HDISP and HTOTAL=%02x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01);
@@ -3016,9 +3185,6 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
if (!(mach->shadow_cntl & 0x08)) {
WRITE8(port, dev->hdisped, val);
}
- if (mach->resolution_crt == 0x00)
- mach->resolution_crt = 0x02;
-
mach_set_resolution(mach, svga);
}
}
@@ -3030,9 +3196,9 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
if (len == 1) {
mach_log("HDISP and HTOTAL+1=%02x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01);
if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
- if (!(mach->shadow_cntl & 0x04)) {
+ if (!(mach->shadow_cntl & 0x04))
dev->htotal = val;
- }
+
mach_set_resolution(mach, svga);
}
}
@@ -3074,8 +3240,14 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
case 0x16e8:
if (len == 2) {
- if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) {
- if (!(mach->shadow_cntl & 0x20)) { /*For 8514/A mode, take the shadow sets into account.*/
+ if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
+ if (!(mach->shadow_cntl & 0x20)) {
+ dev->v_disp = val;
+ dev->v_disp &= 0x1fff;
+ }
+ mach_set_resolution(mach, svga);
+ } else if (!(mach->accel.clock_sel & 0x01) && ((mach->shadow_set & 0x03) == 0x00) && dev->on) { /*Still write the parameter even after going to 8514/A mode if needed*/
+ if (!(mach->shadow_cntl & 0x20)) {
dev->v_disp = val;
dev->v_disp &= 0x1fff;
}
@@ -3084,8 +3256,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
mach_log("ATI 8514/A: V_DISP write 16E8=%d, vdisp2=%d.\n", dev->v_disp, dev->v_disp2);
mach_log("ATI 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val);
} else {
- if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) {
- if (!(mach->shadow_cntl & 0x20)) { /*For 8514/A mode, take the shadow sets into account.*/
+ if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
+ if (!(mach->shadow_cntl & 0x20)) {
WRITE8(port, dev->v_disp, val);
dev->v_disp &= 0x1fff;
}
@@ -3095,8 +3267,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
break;
case 0x16e9:
if (len == 1) {
- if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) {
- if (!(mach->shadow_cntl & 0x20)) { /*For 8514/A mode, take the shadow sets into account.*/
+ if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
+ if (!(mach->shadow_cntl & 0x20)) {
WRITE8(port, dev->v_disp, val);
dev->v_disp &= 0x1fff;
}
@@ -3109,8 +3281,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
case 0x1ae8:
if (len == 2) {
- if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) {
- if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/
+ if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
+ if (!(mach->shadow_cntl & 0x10)) {
dev->v_sync_start = val;
dev->v_sync_start &= 0x1fff;
}
@@ -3119,8 +3291,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
mach_log("ATI 8514/A: V_SYNCSTART write 1AE8 = %d\n", dev->v_syncstart);
mach_log("ATI 8514/A: (0x%04x): vsyncstart=0x%02x.\n", port, val);
} else {
- if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) {
- if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/
+ if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
+ if (!(mach->shadow_cntl & 0x10)) {
WRITE8(port, dev->v_sync_start, val);
dev->v_sync_start &= 0x1fff;
}
@@ -3130,8 +3302,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
break;
case 0x1ae9:
if (len == 1) {
- if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) {
- if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/
+ if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/
+ if (!(mach->shadow_cntl & 0x10)) {
WRITE8(port, dev->v_sync_start, val);
dev->v_sync_start &= 0x1fff;
}
@@ -3152,7 +3324,6 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
svga_recalctimings(svga);
break;
-
case 0x42e8:
case 0x42e9:
mach_log("VBLANK stat=%02x, val=%02x.\n", dev->subsys_stat, val);
@@ -3176,31 +3347,31 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
case 0x4ae8:
dev->accel.advfunc_cntl = val;
- dev->on = dev->accel.advfunc_cntl & 0x01;
+ dev->on = val & 0x01;
dev->vendor_mode = 0;
- mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n",
- CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp);
+ mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d, extmode=%02x.\n",
+ CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, mach->regs[0xb0] & 0x20);
- if ((dev->local & 0xff) < 0x02) {
- dev->ext_crt_pitch = 128;
- mach_set_resolution(mach, svga);
- } else {
+ if (ATI_MACH32) {
+ if ((mach->regs[0xb0] & 0x20) || (dev->accel_bpp >= 15)) { /*Account for the extended ATI 8514/A mode here too*/
+ dev->on |= 0x01;
+ dev->vendor_mode = 1;
+ }
mach_set_resolution(mach, svga);
mach32_updatemapping(mach, svga);
+ } else {
+ dev->ext_crt_pitch = 128;
+ mach_set_resolution(mach, svga);
}
mach_log("Vendor IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480");
break;
case 0x82e8:
case 0x86e8:
- case 0xc2e8:
- case 0xc6e8:
- case 0xf6ee:
ibm8514_accel_out_fifo(svga, port, val, len);
break;
case 0x8ae8:
- case 0xcae8:
ibm8514_accel_out_fifo(svga, port, val, len);
if (len == 2) {
mach_log("SRCY=%d.\n", val & 0x07ff);
@@ -3209,7 +3380,6 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
break;
case 0x8ee8:
- case 0xcee8:
ibm8514_accel_out_fifo(svga, port, val, len);
if (len == 2) {
mach_log("SRCX=%d.\n", val & 0x07ff);
@@ -3218,64 +3388,55 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
break;
case 0x92e8:
- case 0xd2e8:
ibm8514_accel_out_fifo(svga, port, val, len);
break;
case 0x96e8:
- case 0xd6e8:
ibm8514_accel_out_fifo(svga, port, val, len);
if (len == 2)
mach->accel.test = val & 0x1fff;
break;
case 0x9ae8:
- case 0xdae8:
mach->accel.cmd_type = -1;
ibm8514_accel_out_fifo(svga, port, val, len);
break;
case 0x9ee8:
- case 0xdee8:
ibm8514_accel_out_fifo(svga, port, val, len);
break;
case 0xa2e8:
case 0xe2e8:
if (port == 0xe2e8) {
+ mach_log("%04X: Background Color=%04x.\n", port, val);
if (len == 2) {
- if (dev->accel.cmd_back) {
- if (mach->accel.cmd_type == 5) {
- if (dev->accel.sy >= 0) {
- if (mach_pixel_read(mach))
- break;
-
- mach_accel_out_pixtrans(svga, mach, dev, val);
- } else
- dev->accel.bkgd_color = val;
- } else
- dev->accel.bkgd_color = val;
-
- mach_log("%04X: CMDBack BKGDCOLOR, sy=%d, height=%d, val=%04x.\n", port, dev->accel.sy, mach->accel.height, val);
- } else {
+ if (!dev->accel.cmd_back) {
if (mach->accel.cmd_type >= 0) {
if (mach_pixel_read(mach))
break;
+ mach_log("ATI transfer.\n");
mach_accel_out_pixtrans(svga, mach, dev, val);
} else {
if (ibm8514_cpu_dest(svga))
break;
+ mach_log("IBM transfer.\n");
ibm8514_accel_out_pixtrans(svga, port, val, len);
}
+ } else {
+ dev->accel.bkgd_color = val;
+ mach_log("%04X: CMDBack BKGDCOLOR, sy=%d, height=%d, cmdtype=%d, val=%04x.\n", port, dev->accel.sy, mach->accel.height, mach->accel.cmd_type, val);
}
} else {
- if (mach->accel.cmd_type >= 0) {
- if (mach_pixel_read(mach))
- break;
+ if (dev->accel.cmd & 0x100) {
+ if (mach->accel.cmd_type >= 0) {
+ if (mach_pixel_read(mach))
+ break;
- mach->accel.pix_trans[1] = val;
+ mach->accel.pix_trans[1] = val;
+ }
}
}
} else {
@@ -3289,42 +3450,39 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
case 0xa6e8:
case 0xe6e8:
if (port == 0xe6e8) {
+ mach_log("%04X: Foreground Color=%04x.\n", port, val);
if (len == 2) {
- if (dev->accel.cmd_back) {
- if (mach->accel.cmd_type == 5) {
- if (dev->accel.sy >= 0) {
- if (mach_pixel_read(mach))
- break;
-
- mach_accel_out_pixtrans(svga, mach, dev, val);
- } else
- dev->accel.frgd_color = val;
- } else
- dev->accel.frgd_color = val;
- } else {
+ if (!dev->accel.cmd_back) {
if (mach->accel.cmd_type >= 0) {
if (mach_pixel_read(mach))
break;
+ mach_log("ATI transfer.\n");
mach_accel_out_pixtrans(svga, mach, dev, val);
} else {
if (ibm8514_cpu_dest(svga))
break;
+ mach_log("IBM transfer.\n");
ibm8514_accel_out_pixtrans(svga, port, val, len);
}
- }
+ } else
+ dev->accel.frgd_color = val;
} else {
- if (mach->accel.cmd_type >= 0) {
- if (mach_pixel_read(mach))
- break;
+ if (!dev->accel.cmd_back) {
+ if (mach->accel.cmd_type >= 0) {
+ if (mach_pixel_read(mach))
+ break;
- mach->accel.pix_trans[1] = val;
+ mach->accel.pix_trans[1] = val;
+ }
}
}
} else {
if (len == 2)
dev->accel.frgd_color = val;
+
+ mach_log("%04X: Foreground Color=%04x.\n", port, val);
}
break;
@@ -3332,40 +3490,42 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
case 0xe6e9:
mach_log("Write PORT=%04x, 8514/A=%x, val=%04x, len=%d.\n", port, dev->accel.cmd_back, val, len);
if (len == 1) {
- if (mach->accel.cmd_type >= 0) {
- if (mach_pixel_read(mach))
- break;
+ if (!dev->accel.cmd_back) {
+ if (mach->accel.cmd_type >= 0) {
+ if (mach_pixel_read(mach))
+ break;
- mach->accel.pix_trans[0] = val;
- frgd_sel = (mach->accel.dp_config >> 13) & 7;
- bkgd_sel = (mach->accel.dp_config >> 7) & 3;
- mono_src = (mach->accel.dp_config >> 5) & 3;
+ mach->accel.pix_trans[0] = val;
+ frgd_sel = (mach->accel.dp_config >> 13) & 7;
+ bkgd_sel = (mach->accel.dp_config >> 7) & 3;
+ mono_src = (mach->accel.dp_config >> 5) & 3;
- switch (mach->accel.dp_config & 0x200) {
- case 0x000: /*8-bit size*/
- if (mono_src == 2) {
- if ((frgd_sel != 2) && (bkgd_sel != 2)) {
- mach_accel_start(mach->accel.cmd_type, 1, 8, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev);
+ switch (mach->accel.dp_config & 0x200) {
+ case 0x000: /*8-bit size*/
+ if (mono_src == 2) {
+ if ((frgd_sel != 2) && (bkgd_sel != 2)) {
+ mach_accel_start(mach->accel.cmd_type, 1, 8, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev);
+ } else
+ mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev);
} else
mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev);
- } else
- mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev);
- break;
- case 0x200: /*16-bit size*/
- if (mono_src == 2) {
- if ((frgd_sel != 2) && (bkgd_sel != 2)) {
- if (mach->accel.dp_config & 0x1000)
- mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[1] | (mach->accel.pix_trans[0] << 8), 0, svga, mach, dev);
- else
- mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev);
+ break;
+ case 0x200: /*16-bit size*/
+ if (mono_src == 2) {
+ if ((frgd_sel != 2) && (bkgd_sel != 2)) {
+ if (mach->accel.dp_config & 0x1000)
+ mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[1] | (mach->accel.pix_trans[0] << 8), 0, svga, mach, dev);
+ else
+ mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, svga, mach, dev);
+ } else
+ mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev);
} else
mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev);
- } else
- mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), svga, mach, dev);
- break;
+ break;
- default:
- break;
+ default:
+ break;
+ }
}
}
}
@@ -3377,20 +3537,14 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
case 0xb2e8:
case 0xb6e8:
case 0xbae8:
- case 0xeae8:
- case 0xeee8:
- case 0xf2e8:
- case 0xf6e8:
- case 0xfae8:
ibm8514_accel_out_fifo(svga, port, val, len);
break;
case 0xbee8:
- case 0xfee8:
ibm8514_accel_out_fifo(svga, port, val, len);
if (len == 2) {
if ((dev->accel.multifunc_cntl >> 12) == 5) {
- if ((dev->local & 0xff) < 0x02)
+ if (!ATI_MACH32)
dev->ext_crt_pitch = 128;
}
}
@@ -3514,12 +3668,12 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
else
dev->ext_crt_pitch <<= 1;
}
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
dev->on |= 0x01;
dev->vendor_mode = 1;
}
svga_recalctimings(svga);
- if ((dev->local & 0xff) >= 0x01)
+ if (ATI_GRAPHICS_ULTRA || ATI_MACH32)
mach32_updatemapping(mach, svga);
mach_log("ATI 8514/A: (0x%04x) CRT Pitch, val=0x%02x, crtpitch=%x, len=%d, extended 8514/A mode=%02x.\n", port, val, dev->ext_crt_pitch, len, mach->regs[0xb0] & 0x20);
@@ -3548,17 +3702,17 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
else {
WRITE8(port, mach->local_cntl, val);
}
- if ((dev->local & 0xff) >= 0x01)
+ if (ATI_GRAPHICS_ULTRA || ATI_MACH32)
mach32_updatemapping(mach, svga);
break;
case 0x36ee:
case 0x36ef:
if (len == 2) {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
mach->misc = val;
} else {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
WRITE8(port, mach->misc, val);
}
mach->misc &= 0xfff0;
@@ -3621,7 +3775,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
mach_log("Vendor ATI mode set %s resolution.\n",
(dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480");
svga_recalctimings(svga);
- if ((dev->local & 0xff) >= 0x01)
+ if (ATI_GRAPHICS_ULTRA || ATI_MACH32)
mach32_updatemapping(mach, svga);
break;
@@ -3656,11 +3810,19 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
if ((mach->shadow_set & 0x03) == 0x00)
mach_log("Primary CRT register set.\n");
else if ((mach->shadow_set & 0x03) == 0x01) {
+ mach->crt_resolution = 0x01;
mach_log("CRT Shadow Set 1: 640x480.\n");
- mach->resolution_crt = 0x01;
} else if ((mach->shadow_set & 0x03) == 0x02) {
+ mach->crt_resolution = 0x02;
mach_log("CRT Shadow Set 2: 1024x768.\n");
- mach->resolution_crt = 0x02;
+ }
+
+ if (ATI_MACH32) {
+ mach_log("Load both SRC/DST GE Offset/Pitch=%03x, offset=%08x.\n", mach->shadow_set & 0x300, dev->accel.ge_offset);
+ if ((mach->shadow_set & 0x300) == 0x000) {
+ mach->accel.ge_offset_lo = 0x0000;
+ mach->accel.ge_offset_hi = 0x0000;
+ }
}
break;
@@ -3675,7 +3837,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
if (!mach->pci_bus)
mach->linear_base = (mach->memory_aperture & 0xff00) << 12;
- if ((dev->local & 0xff) >= 0x01)
+ if (ATI_GRAPHICS_ULTRA || ATI_MACH32)
mach32_updatemapping(mach, svga);
break;
@@ -3729,7 +3891,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
else {
WRITE8(port, mach->accel.ext_ge_config, val);
}
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->accel.crt_pitch & 0xff)
dev->ext_crt_pitch = mach->accel.crt_pitch & 0xff;
@@ -3784,10 +3946,14 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
case 0x8eee:
if (len == 2) {
+ frgd_sel = (mach->accel.dp_config >> 13) & 7;
+
if (mach->accel.patt_data_idx_reg < 0x10) {
mach->accel.color_pattern[mach->accel.patt_data_idx] = val & 0xff;
mach->accel.color_pattern[mach->accel.patt_data_idx + 1] = (val >> 8) & 0xff;
mach_log("Write Port 8eee: Color Pattern Word Data[%d]=%04x.\n", mach->accel.patt_data_idx, val);
+ if ((dev->accel_bpp >= 24) && (frgd_sel == 5) && (mach->accel.patt_len == 0x17))
+ dev->accel.y1 = 1;
} else {
mach->accel.mono_pattern_normal[mach->accel.patt_data_idx - 0x10] = val & 0xff;
mach->accel.mono_pattern_normal[(mach->accel.patt_data_idx + 1) - 0x10] = (val >> 8) & 0xff;
@@ -4031,6 +4197,9 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u
if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach))
dev->accel.cmd_back = 0;
+ if ((mach->accel.cmd_type == 3) && !dev->accel.cmd_back && (mach->accel.dp_config == 0x0000)) /*Avoid a hang with a dummy command.*/
+ dev->accel.cmd_back = 1;
+
mach_log("LineDraw type=%x, dpconfig=%04x.\n", mach->accel.cmd_type, mach->accel.dp_config);
mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, svga, mach, dev);
mach->accel.line_idx = (mach->accel.line_idx == 5) ? 4 : 2;
@@ -4093,9 +4262,6 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
if (dev->force_busy)
temp |= 0x0200; /*Hardware busy*/
- if (dev->accel.cmd_back)
- dev->force_busy = 0;
-
if (dev->data_available) {
temp |= 0x0100; /*Read Data available*/
if (mach->accel.cmd_type >= 0) {
@@ -4166,11 +4332,11 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
case 4:
case 6:
if (dev->accel.sy < 0)
- dev->data_available = 0;
+ dev->data_available2 = 0;
break;
default:
if (!dev->accel.sy)
- dev->data_available = 0;
+ dev->data_available2 = 0;
break;
}
}
@@ -4407,46 +4573,46 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
case 0xdaee:
if (len == 2) {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
temp = mach->accel.src_x;
} else {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
temp = mach->accel.src_x & 0xff;
}
break;
case 0xdaef:
if (len == 1) {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
temp = mach->accel.src_x >> 8;
}
break;
case 0xdeee:
if (len == 2) {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
temp = mach->accel.src_y;
} else {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
temp = mach->accel.src_y & 0xff;
}
break;
case 0xdeef:
if (len == 1) {
- if ((dev->local & 0xff) >= 0x02)
+ if (ATI_MACH32)
temp = mach->accel.src_y >> 8;
}
break;
case 0xfaee:
if (len == 2) {
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->pci_bus)
temp = 0x0017;
else
temp = 0x22f7;
}
} else {
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->pci_bus)
temp = 0x17;
else
@@ -4456,7 +4622,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in
break;
case 0xfaef:
if (len == 1) {
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->pci_bus)
temp = 0x00;
else
@@ -4509,10 +4675,10 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
if (cmd == 6) {
if ((dev->subsys_cntl & INT_GE_BSY) &&
!(dev->subsys_stat & INT_GE_BSY) &&
- (dev->accel.dx_ibm >= clip_l) &&
- (dev->accel.dx_ibm <= clip_r_ibm) &&
- (dev->accel.dy_ibm >= clip_t) &&
- (dev->accel.dy_ibm <= clip_b_ibm))
+ (dev->accel.dx >= clip_l) &&
+ (dev->accel.dx <= clip_r_ibm) &&
+ (dev->accel.dy >= clip_t) &&
+ (dev->accel.dy <= clip_b_ibm))
temp |= INT_GE_BSY;
} else {
if ((dev->subsys_cntl & INT_GE_BSY) &&
@@ -4551,7 +4717,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
}
}
- if (dev->accel.cmd_back) {
+ if (!dev->fifo_idx) {
dev->force_busy = 0;
dev->force_busy2 = 0;
mach->force_busy = 0;
@@ -4589,7 +4755,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
mach_log("FIFO Test IDX=%d, Data=%04x.\n", mach->fifo_test_idx, mach->fifo_test_data[mach->fifo_test_idx]);
READ8(port, mach->fifo_test_data[mach->fifo_test_idx]);
if (!mach->fifo_test_idx && ((mach->accel.dp_config == 0xaaaa) || (mach->accel.dp_config == 0x5555)))
- mach->accel.dp_config = 0x2211;
+ mach->accel.dp_config = 0x2011;
break;
case 0x22ee:
@@ -4604,7 +4770,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
case 0x36ee:
case 0x36ef:
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
READ8(port, mach->misc);
if (!(port & 1)) {
temp &= ~0x0c;
@@ -4662,6 +4828,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
temp = 0x0000;
}
} else {
+ mach_log("ScratchPad0=%x.\n", mach->accel.scratch0);
if (mach->accel.scratch0 == 0x1234)
temp = 0x0000;
}
@@ -4688,7 +4855,6 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev)
if (mach->force_busy)
temp |= 0x20;
- mach->force_busy = 0;
if (ati_eeprom_read(&mach->eeprom))
temp |= 0x40;
@@ -5148,7 +5314,7 @@ mach32_write(uint32_t addr, uint8_t val, void *priv)
return;
}
- if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
+ if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
addr <<= 1;
switch (addr & 0x06) {
case 0x00:
@@ -5188,7 +5354,7 @@ mach32_writew(uint32_t addr, uint16_t val, void *priv)
return;
}
- if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
+ if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
addr <<= 1;
if (addr & 0x04) {
mach32_write_common(addr - 2, val & 0x0f, 0, mach, svga);
@@ -5223,7 +5389,7 @@ mach32_writel(uint32_t addr, uint32_t val, void *priv)
return;
}
- if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
+ if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
addr <<= 1;
mach32_write_common(addr, val & 0x0f, 0, mach, svga);
mach32_write_common(addr + 1, (val >> 4) & 0x0f, 0, mach, svga);
@@ -5639,7 +5805,7 @@ mach32_read(uint32_t addr, void *priv)
(void) xga_read_test(addr, svga);
addr = (addr & svga->banked_mask) + svga->read_bank;
- if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
+ if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
addr <<= 1;
switch (addr & 0x06) {
case 0x00:
@@ -5676,7 +5842,7 @@ mach32_readw(uint32_t addr, void *priv)
(void) xga_read_test(addr, svga);
addr = (addr & svga->banked_mask) + svga->read_bank;
- if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
+ if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
addr <<= 1;
if (addr & 0x04) {
ret = mach32_read_common(addr - 2, 0, mach, svga) & 0x0f;
@@ -5708,7 +5874,7 @@ mach32_readl(uint32_t addr, void *priv)
(void) xga_read_test(addr, svga);
addr = (addr & svga->banked_mask) + svga->read_bank;
- if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
+ if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) {
addr <<= 1;
ret = mach32_read_common(addr, 0, mach, svga) & 0x0f;
ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 4);
@@ -5998,12 +6164,13 @@ mach32_updatemapping(mach_t *mach, svga_t *svga)
case 0xC: /*32k at B8000*/
mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000);
svga->banked_mask = 0x7fff;
- if (((dev->local & 0xff) >= 0x02) && !(dev->accel.advfunc_cntl & 0x01) && !(mach->accel.clock_sel & 0x01)) {
+ if (ATI_MACH32 && !(dev->accel.advfunc_cntl & 0x01) && !(mach->accel.clock_sel & 0x01)) {
if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) {
if (svga->attrregs[0x10] & 0x40) {
dev->vendor_mode = 0;
dev->on &= ~0x01;
- svga_recalctimings(svga);
+ mach_log("No 8514/A mode on b8000.\n");
+ mach_set_resolution(mach, svga);
}
}
}
@@ -6035,7 +6202,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga)
mem_mapping_disable(&mach->mmio_linear_mapping);
}
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (dev->on && dev->vendor_mode) {
mach_log("Mach32 banked mapping.\n");
mem_mapping_disable(&svga->mapping);
@@ -6216,6 +6383,7 @@ ati8514_io_set(svga_t *svga)
io_sethandler(0x7eee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0x82ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0x86ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
+ io_sethandler(0x8aee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0x8eee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0x92ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0x96ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
@@ -6238,6 +6406,7 @@ ati8514_io_set(svga_t *svga)
io_sethandler(0xdeee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0xe2ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0xe6ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
+ io_sethandler(0xeaee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0xeeee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0xf2ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
io_sethandler(0xf6ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga);
@@ -6331,6 +6500,7 @@ mach_io_remove(mach_t *mach)
io_removehandler(0x7eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0x82ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0x86ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
+ io_removehandler(0x8aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0x8eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0x92ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0x96ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
@@ -6353,6 +6523,7 @@ mach_io_remove(mach_t *mach)
io_removehandler(0xdeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0xe2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0xe6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
+ io_removehandler(0xeaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0xeeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0xf2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
io_removehandler(0xf6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach);
@@ -6815,9 +6986,8 @@ mach8_init(const device_t *info)
mach->ramdac_type = mach->pci_bus ? device_get_config_int("ramdac") : 1;
dev->vram_amount = device_get_config_int("memory");
dev->vram_512k_8514 = dev->vram_amount == 512;
- dev->accel.cmd_back = 1;
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
if (mach->pci_bus) {
if (mach->has_bios) {
rom_init(&mach->bios_rom,
@@ -6852,7 +7022,7 @@ mach8_init(const device_t *info)
0xc0000, 0x8000, 0x7fff,
0, MEM_MAPPING_EXTERNAL);
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
svga_init(info, svga, mach, dev->vram_amount << 10, /*default: 2MB for Mach32*/
mach_recalctimings,
mach_in, mach_out,
@@ -6939,8 +7109,9 @@ mach8_init(const device_t *info)
io_sethandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach);
mach_io_set(mach);
mach->accel.cmd_type = -2;
+ dev->accel.cmd_back = 1;
- if ((dev->local & 0xff) >= 0x02) {
+ if (ATI_MACH32) {
svga->decode_mask = (4 << 20) - 1;
mach->cursor_col_1 = 0xff;
mach->ext_cur_col_1_r = 0xff;
@@ -6985,19 +7156,27 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514)
mach_t *mach = (mach_t *) ext8514;
ibm8514_t *dev = (ibm8514_t *) dev8514;
+ /*Init as 1024x768 87hz interlaced first, per 8514/A.*/
dev->on = 0;
dev->ext_pitch = 1024;
dev->ext_crt_pitch = 0x80;
dev->accel_bpp = 8;
dev->rowoffset = 0x80;
- dev->hdisp = 1024;
- dev->vdisp = 768;
+ dev->hdisped = 0x7f;
+ dev->v_disp = 0x05ff;
+ dev->htotal = 0x9d;
+ dev->v_total_reg = 0x0668;
+ dev->v_sync_start = 0x0600;
+ dev->disp_cntl = 0x33;
+ mach->accel.clock_sel = 0x1c;
+ mach->shadow_set = 0x02;
+ mach->crt_resolution = 0x02;
+ dev->accel.cmd_back = 1;
io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga);
ati8514_io_set(svga);
mach->accel.cmd_type = -2;
mach->mca_bus = !!(dev->type & DEVICE_MCA);
- dev->accel.cmd_back = 1;
mach->config1 = 0x08 | 0x80;
diff --git a/src/video/vid_bochs_vbe.c b/src/video/vid_bochs_vbe.c
index 84fb110c6..6dc015fb0 100644
--- a/src/video/vid_bochs_vbe.c
+++ b/src/video/vid_bochs_vbe.c
@@ -338,20 +338,13 @@ bochs_vbe_recalctimings(svga_t* svga)
svga->rowoffset = (dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] / 2) >> 3;
svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) +
(dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] >> 3);
+
+ svga->fullchange = 3;
} else {
svga->rowoffset = dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8));
svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) +
- (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)));
- }
- if (svga->ma_latch != dev->ma_latch_old) {
- if (svga->bpp == 4) {
- svga->maback = (svga->maback - (dev->ma_latch_old << 2)) +
- (svga->ma_latch << 2);
- } else {
- svga->maback = (svga->maback - (dev->ma_latch_old)) +
- (svga->ma_latch);
- dev->ma_latch_old = svga->ma_latch;
- }
+ (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)));
+ svga->fullchange = 3;
}
if (svga->bpp == 4)
@@ -482,18 +475,10 @@ bochs_vbe_outw(const uint16_t addr, const uint16_t val, void *priv)
} else {
svga->rowoffset = dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8));
svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) +
- (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)));
- }
- if (svga->ma_latch != dev->ma_latch_old) {
- if (svga->bpp == 4) {
- svga->maback = (svga->maback - (dev->ma_latch_old << 2)) +
- (svga->ma_latch << 2);
- } else {
- svga->maback = (svga->maback - (dev->ma_latch_old)) +
- (svga->ma_latch);
- dev->ma_latch_old = svga->ma_latch;
- }
+ (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)));
}
+
+ svga->fullchange = 3;
}
else
svga_recalctimings(&dev->svga);
@@ -686,7 +671,7 @@ bochs_vbe_pci_read(const int func, const int addr, void *priv)
ret = dev->pci_rom_enable & 0x01;
break;
case 0x32:
- ret = dev->rom_addr & 0xff;
+ ret = dev->rom_addr & 0xfc;
break;
case 0x33:
ret = (dev->rom_addr & 0xff00) >> 8;
@@ -743,6 +728,7 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
mem_mapping_disable(&dev->linear_mapping_2);
mem_mapping_disable(&dev->linear_mapping);
mem_mapping_disable(&dev->svga.mapping);
+ mem_mapping_disable(&dev->bios_rom.mapping);
if (dev->pci_conf_status & PCI_COMMAND_IO) {
io_sethandler(0x03c0, 0x0020, bochs_vbe_in, NULL, NULL,
bochs_vbe_out, NULL, NULL, dev);
@@ -751,11 +737,13 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
}
if (dev->pci_conf_status & PCI_COMMAND_MEM) {
mem_mapping_enable(&dev->svga.mapping);
- if (dev->pci_regs[0x13] != 0x00) {
+ if ((dev->pci_regs[0x13] != 0x00) && (dev->pci_regs[0x13] != 0xff)) {
mem_mapping_enable(&dev->linear_mapping);
if (dev->pci_regs[0x13] != 0xe0)
mem_mapping_enable(&dev->linear_mapping_2);
}
+ if (dev->pci_rom_enable && (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8))
+ mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
}
break;
case 0x13:
@@ -764,7 +752,7 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
mem_mapping_disable(&dev->linear_mapping_2);
mem_mapping_disable(&dev->linear_mapping);
- if ((dev->pci_conf_status & PCI_COMMAND_MEM) && (val != 0x00)) {
+ if ((dev->pci_conf_status & PCI_COMMAND_MEM) && (val != 0x00) && (val != 0xff)) {
mem_mapping_set_addr(&dev->linear_mapping, val << 24, 0x01000000);
if (val != 0xe0)
mem_mapping_set_addr(&dev->linear_mapping_2, 0xe0000000, 0x01000000);
@@ -776,18 +764,26 @@ bochs_vbe_pci_write(const int func, const int addr, const uint8_t val, void *pri
case 0x30:
dev->pci_rom_enable = val & 0x01;
mem_mapping_disable(&dev->bios_rom.mapping);
- if (dev->pci_rom_enable)
+ if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) &&
+ (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) {
mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
+ }
break;
case 0x32:
dev->rom_addr = (dev->rom_addr & 0xff00) | (val & 0xfc);
- if (dev->pci_rom_enable)
+ mem_mapping_disable(&dev->bios_rom.mapping);
+ if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) &&
+ (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) {
mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
+ }
break;
case 0x33:
dev->rom_addr = (dev->rom_addr & 0x00ff) | (val << 8);
- if (dev->pci_rom_enable)
+ mem_mapping_disable(&dev->bios_rom.mapping);
+ if (dev->pci_rom_enable && (dev->pci_conf_status & PCI_COMMAND_MEM) &&
+ (dev->rom_addr != 0x0000) && (dev->rom_addr < 0xfff8)) {
mem_mapping_set_addr(&dev->bios_rom.mapping, dev->rom_addr << 16, 0x10000);
+ }
break;
}
}
diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c
index f002ef999..8333e522e 100644
--- a/src/video/vid_ega.c
+++ b/src/video/vid_ega.c
@@ -67,8 +67,10 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
ega_t *ega = (ega_t *) priv;
uint8_t o;
uint8_t old;
- uint8_t gdcmask = (ega->actual_type == EGA_SUPEREGA) ? 0xff : 0x0f;
- uint8_t crtcmask = (ega->actual_type == EGA_SUPEREGA) ? 0xff : 0x1f;
+ int type = ega_type;
+ int atype = ega->actual_type;
+ uint8_t gdcmask = (ega_type == EGA_SUPEREGA) ? 0xff : 0x0f;
+ uint8_t crtcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x1f;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1))
addr ^= 0x60;
@@ -94,7 +96,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
case 0x3c0:
case 0x3c1:
- if (ega->actual_type == EGA_SUPEREGA)
+ if (atype == EGA_SUPEREGA)
val &= 0x7f; /* Bit 7 indicates the flipflop status (read only) */
if (!ega->attrff) {
ega->attraddr = val & 31;
@@ -110,7 +112,8 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
ega->attrregs[ega->attraddr & 31] = val;
if (ega->attraddr < 16)
ega->fullchange = changeframecount;
- if (ega->attraddr == 0x10 || ega->attraddr == 0x14 || ega->attraddr < 0x10) {
+ int is_attr14 = ega->chipset && (ega->attraddr == 0x14);
+ if ((ega->attraddr == 0x10) || is_attr14 || (ega->attraddr < 0x10)) {
for (uint8_t c = 0; c < 16; c++) {
if (ega->chipset) {
if (ega->attrregs[0x10] & 0x80)
@@ -143,12 +146,13 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
ega->pallook = ega->vres ? pallook16 : pallook64;
ega->vidclock = val & 4;
ega->miscout = val;
- ega->overscan_color = ega->vres ? pallook16[ega->attrregs[0x11] & 0x0f] : pallook64[ega->attrregs[0x11] & 0x3f];
+ ega->overscan_color = ega->vres ? pallook16[ega->attrregs[0x11] & 0x0f] :
+ pallook64[ega->attrregs[0x11] & 0x3f];
io_removehandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
if (!(val & 1))
io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
ega_recalctimings(ega);
- if ((ega_type == EGA_TYPE_COMPAQ) && !(val & 0x02))
+ if ((type == EGA_TYPE_COMPAQ) && !(val & 0x02))
mem_mapping_disable(&ega->mapping);
else switch (ega->gdcreg[6] & 0xc) {
case 0x0: /*128k at A0000*/
@@ -198,7 +202,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
}
break;
case 0x3c6:
- if (ega_type == EGA_TYPE_COMPAQ)
+ if (type == EGA_TYPE_COMPAQ)
ega->ctl_mode = val;
break;
case 0x3ce:
@@ -219,7 +223,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
ega->chain2_read = val & 0x10;
break;
case 6:
- if ((ega_type == EGA_TYPE_COMPAQ) && !(ega->miscout & 0x02))
+ if ((type == EGA_TYPE_COMPAQ) && !(ega->miscout & 0x02))
mem_mapping_disable(&ega->mapping);
else switch (val & 0xc) {
case 0x0: /*128k at A0000*/
@@ -265,28 +269,34 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
if (ega->chipset)
ega->crtcreg = val & 0x3f;
else
- ega->crtcreg = val & crtcmask;
+ ega->crtcreg = val;
return;
case 0x3d1:
- case 0x3d5:
+ case 0x3d5: {
+ int idx = ega->crtcreg;
+
if (ega->chipset) {
if ((ega->crtcreg < 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80))
return;
if ((ega->crtcreg == 7) && (ega->crtc[0x11] & 0x80) && !(ega->regs[0xb4] & 0x80))
val = (ega->crtc[7] & ~0x10) | (val & 0x10);
} else {
- if ((ega->crtcreg < 7) && (ega->crtc[0x11] & 0x80))
+ idx &= crtcmask;
+ if ((idx >= 0x19) & (idx <= 0xf6))
return;
- if ((ega->crtcreg == 7) && (ega->crtc[0x11] & 0x80))
+ if ((idx < 7) && (ega->crtc[0x11] & 0x80))
+ return;
+ if ((idx == 7) && (ega->crtc[0x11] & 0x80))
val = (ega->crtc[7] & ~0x10) | (val & 0x10);
}
- old = ega->crtc[ega->crtcreg];
- ega->crtc[ega->crtcreg] = val;
+ old = ega->crtc[idx];
+ ega->crtc[idx] = val;
if (old != val) {
- if (ega->crtcreg < 0xe || ega->crtcreg > 0x10) {
- if ((ega->crtcreg == 0xc) || (ega->crtcreg == 0xd)) {
+ if ((idx < 0xe) || (idx > 0x10)) {
+ if ((idx == 0xc) || (idx == 0xd)) {
ega->fullchange = 3;
- ega->ma_latch = ((ega->crtc[0xc] << 8) | ega->crtc[0xd]) + ((ega->crtc[8] & 0x60) >> 5);
+ ega->ma_latch = ((ega->crtc[0xc] << 8) | ega->crtc[0xd]) +
+ ((ega->crtc[8] & 0x60) >> 5);
} else {
ega->fullchange = changeframecount;
ega_recalctimings(ega);
@@ -295,7 +305,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv)
}
break;
- default:
+ } default:
break;
}
}
@@ -304,8 +314,11 @@ uint8_t
ega_in(uint16_t addr, void *priv)
{
ega_t *ega = (ega_t *) priv;
- uint8_t gdcmask = (ega->actual_type == EGA_SUPEREGA) ? 0xff : 0x0f;
- uint8_t ret = 0xff;
+ uint8_t ret = 0xff;
+ int type = ega_type;
+ int atype = ega->actual_type;
+ uint8_t gdcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x0f;
+ uint8_t crtcmask = (atype == EGA_SUPEREGA) ? 0xff : 0x1f;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1))
addr ^= 0x60;
@@ -329,48 +342,68 @@ ega_in(uint16_t addr, void *priv)
break;
case 0x3c0:
- if (ega_type == EGA_TYPE_OTHER)
- ret = ega->attraddr | ega->attr_palette_enable;
- if (ega->actual_type == EGA_SUPEREGA && ega->attrff)
- ret |= 0x80; /* Bit 7 indicates the flipflop status (read only) */
- break;
case 0x3c1:
- if (ega_type == EGA_TYPE_OTHER)
- ret = ega->attrregs[ega->attraddr];
+ if (type == EGA_TYPE_OTHER) {
+ int data = (atype == EGA_SUPEREGA) ? (ega->attrff & 1) : (addr & 1);
+ if (data)
+ ret = ega->attrregs[ega->attraddr];
+ else
+ ret = ega->attraddr | ega->attr_palette_enable;
+ if (atype == EGA_SUPEREGA)
+ /* Bit 7 indicates the flipflop status (read only) */
+ ret = (ret & 0x3f) | (ega->attrff ? 0x80 : 0x00);
+ }
break;
case 0x3c2:
ret = (egaswitches & (8 >> egaswitchread)) ? 0x10 : 0x00;
break;
case 0x3c4:
- if (ega_type == EGA_TYPE_OTHER)
- ret = ega->seqaddr;
+ if (type == EGA_TYPE_OTHER) {
+ if (atype == EGA_SUPEREGA)
+ ret = 0x1f | ((ega->miscout & 0x01) << 5);
+ else
+ ret = ega->seqaddr;
+ }
break;
case 0x3c5:
- if (ega_type == EGA_TYPE_OTHER)
- ret = ega->seqregs[ega->seqaddr & 0xf];
+ if (type == EGA_TYPE_OTHER) {
+ if ((ega->seqaddr & 0x0f) > 0x04)
+ ret = ega->chipset ? ega->seqregs[ega->seqaddr & 0xf] : 0xff;
+ else
+ ret = ega->seqregs[ega->seqaddr & 0xf];
+ }
break;
case 0x3c6:
- if (ega_type == EGA_TYPE_COMPAQ)
+ if (type == EGA_TYPE_COMPAQ)
ret = ega->ctl_mode;
break;
case 0x3c8:
- if (ega_type == EGA_TYPE_OTHER)
+ if (type == EGA_TYPE_OTHER)
ret = 2;
break;
case 0x3cc:
- if (ega_type == EGA_TYPE_OTHER)
+ if (type == EGA_TYPE_OTHER)
ret = ega->miscout;
break;
case 0x3ce:
- if (ega_type == EGA_TYPE_OTHER)
+ if (ega_type == EGA_TYPE_OTHER) {
ret = ega->gdcaddr;
+ if (atype == EGA_SUPEREGA) {
+ ret = (ret & 0x0f) | 0xe0;
+ if ((ega->gdcaddr & 0xe0) == 0xe0)
+ ret |= 0x10;
+ }
+ }
break;
case 0x3cf:
- if (ega_type == EGA_TYPE_OTHER) {
+ if (type == EGA_TYPE_OTHER) {
switch (ega->gdcaddr & gdcmask) {
default:
ret = ega->gdcreg[ega->gdcaddr & gdcmask];
break;
+ case 0x09 ... 0xf7:
+ ret = ega->chipset ? ega->gdcreg[ega->gdcaddr & gdcmask] : 0xff;
+ break;
case 0xf8:
ret = ega->la;
break;
@@ -388,12 +421,18 @@ ega_in(uint16_t addr, void *priv)
break;
case 0x3d0:
case 0x3d4:
- if (ega_type == EGA_TYPE_OTHER)
+ if (ega_type == EGA_TYPE_OTHER) {
ret = ega->crtcreg;
+ if (atype == EGA_SUPEREGA) {
+ ret = (ret & 0x1f) | 0xc0;
+ if ((ega->crtcreg & 0xc0) == 0xc0)
+ ret |= 0x20;
+ }
+ }
break;
case 0x3d1:
case 0x3d5:
- switch (ega->crtcreg) {
+ switch (ega->crtcreg & crtcmask) {
case 0xc:
case 0xd:
case 0xe:
@@ -402,28 +441,33 @@ ega_in(uint16_t addr, void *priv)
break;
case 0x10:
- if (ega_type == EGA_TYPE_OTHER)
+ if (type == EGA_TYPE_OTHER)
ret = ega->crtc[ega->crtcreg];
else
ret = ega->light_pen >> 8;
break;
case 0x11:
- if (ega_type == EGA_TYPE_OTHER)
+ if (type == EGA_TYPE_OTHER)
ret = ega->crtc[ega->crtcreg];
else
ret = ega->light_pen & 0xff;
break;
+ case 0x19 ... 0xf6:
+ if (type == EGA_TYPE_OTHER)
+ ret = ega->chipset ? ega->crtc[ega->crtcreg] : 0xff;
+ break;
+
default:
- if (ega_type == EGA_TYPE_OTHER)
+ if (type == EGA_TYPE_OTHER)
ret = ega->crtc[ega->crtcreg];
break;
}
break;
case 0x3da:
ega->attrff = 0;
- if (ega_type == EGA_TYPE_COMPAQ) {
+ if (type == EGA_TYPE_COMPAQ) {
ret = ega->stat & 0xcf;
switch ((ega->attrregs[0x12] >> 4) & 0x03) {
case 0x00:
@@ -629,7 +673,8 @@ ega_recalctimings(ega_t *ega)
disptime = (double) (ega->crtc[0] + 2);
_dispontime = (double) (ega->crtc[1] + 1);
}
- if ((ega->actual_type == EGA_SUPEREGA) && (ega->crtc[0xf9] & 0x01)) {
+ if ((ega->actual_type == EGA_SUPEREGA) && (ega->crtc[0x17] & 0x10) &&
+ (ega->crtc[0xf9] & 0x01)) {
disptime *= 2.0;
_dispontime *= 2.0;
}
@@ -783,10 +828,7 @@ ega_poll(void *priv)
ega->y_add *= ega->vres + 1;
for (y = 0; y <= ega->vres; y++) {
/* Render scanline */
- if (ega->render_override)
- ega->render_override(ega->priv_parent);
- else
- ega->render(ega);
+ ega->render(ega);
/* Render overscan */
ega->x_add = (overscan_x >> 1);
diff --git a/src/video/vid_ega_render.c b/src/video/vid_ega_render.c
index 10667084a..8a73ffbbb 100644
--- a/src/video/vid_ega_render.c
+++ b/src/video/vid_ega_render.c
@@ -107,6 +107,11 @@ ega_render_overscan_right(ega_t *ega)
void
ega_render_text(ega_t *ega)
{
+ if (ega->render_override) {
+ ega->render_override(ega->priv_parent);
+ return;
+ }
+
if ((ega->displine + ega->y_add) < 0)
return;
diff --git a/src/video/vid_jega.c b/src/video/vid_jega.c
index 11c9cbf8d..4240f5e98 100644
--- a/src/video/vid_jega.c
+++ b/src/video/vid_jega.c
@@ -428,7 +428,8 @@ jega_out(uint16_t addr, uint8_t val, void *priv)
}
} else {
jega->attrregs[jega->attraddr & 31] = val;
- if (jega->attraddr < 0x10) {
+ int is_attr14 = jega->is_vga ? (jega->attraddr == 0x14) : 0;
+ if (is_attr14 || (jega->attraddr < 0x10)) {
for (uint8_t c = 0; c < 16; c++) {
if (jega->is_vga) {
if (jega->attrregs[0x10] & 0x80)
@@ -464,21 +465,40 @@ jega_out(uint16_t addr, uint8_t val, void *priv)
case 0x3d5:
/* Data */
if (jega->regs_index != RINVALID_INDEX) {
+ if ((jega->regs_index < 7) && (jega->regs[0x11] & 0x80))
+ return;
+ if ((jega->regs_index == 7) && (jega->regs[0x11] & 0x80))
+ val = (jega->regs[7] & ~0x10) | (val & 0x10);
+ /*
+ Do not allow cursor updates if neither master nor slave is
+ active - the AX Windows 3.0 386 Enhanced Mode DOS grabber
+ relies on this for the cursor position to behave correctly.
+ */
+ if ((jega->regs_index >= 0x0e) && (jega->regs_index <= 0x0f) && !(jega->regs[RMOD1] & 0x0c))
+ return;
jega->regs[jega->regs_index] = val;
jega_log("JEGA Out %04X(%02X) %02Xh(%d) %04X:%04X\n", addr, jega->regs_index, val, val, cs >> 4, cpu_state.pc);
switch (jega->regs_index) {
case RMOD1:
/* if the value is changed */
- if (jega->is_vga) {
- if (val & 0x40)
- jega->vga.svga.render_override = NULL;
- else
- jega->vga.svga.render_override = jega_render_text;
- } else {
- if (val & 0x40)
- jega->ega.render_override = NULL;
- else
- jega->ega.render_override = jega_render_text;
+ /*
+ Do not allow override toggling unless it's on master and
+ only override the text renderer - the AX Windows 3.0 386
+ Enhanced Mode DOS grabber relies on this for the grabbing
+ to behave correctly.
+ */
+ if (val & 0x08) {
+ if (jega->is_vga) {
+ if (val & 0x40)
+ jega->vga.svga.render_override = NULL;
+ else
+ jega->vga.svga.render_override = jega_render_text;
+ } else {
+ if (val & 0x40)
+ jega->ega.render_override = NULL;
+ else
+ jega->ega.render_override = jega_render_text;
+ }
}
break;
case RDAGS:
diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c
index 98db5f9fa..9a95e6ce6 100644
--- a/src/video/vid_ps55da2.c
+++ b/src/video/vid_ps55da2.c
@@ -66,7 +66,7 @@
#define DA2_MASK_VRAM 0xfffff /* 0xFFFFF */
#define DA2_MASK_VRAMPLANE 0x1ffff /* 0x1FFFF */
#define DA2_PIXELCLOCK 29000000.0 /* 58 MHz interlaced */
-#define DA2_BLT_MEMSIZE 0x100
+#define DA2_BLT_MEMSIZE 0x10
#define DA2_BLT_REGSIZE 0x40
#define DA2_DEBUG_BLTLOG_SIZE (DA2_BLT_REGSIZE + 1)
#define DA2_DEBUG_BLTLOG_MAX (256 * 1024)
@@ -112,18 +112,26 @@
EFD8h * Display Adapter/J [Atlas-SP2]
[Japanese DOS and Display Adapter compatibility]
- | POS ID | Adapter Name | K3.31 | J4.04 | J4.08 | OS2 J1.3 | Win3 |
- |------------|-----------------------------|:-----:|:-----:|:-----:|:--------:|:----:|
- | EFFFh | Display Adapter | X | | | | |
- | FFEDh | ? [Atlas EVT] | X | | | | |
- | FFFDh | ? [LDT EVT] | X | | | | |
- | EFFEh | Display Adapter II,III,V,B2 | X | X | X | X | X |
- | E013h | ? [LDT] | X | X | X | X | |
- | ECCEh | Display Adapter IV | | X | X | X | |
- | ECECh | Display Adapter IV,B1 | | X | X | X | X |
- | 9000-901Fh | Display Adapter A1,A2 | | X | X | | X |
- | EFD8h | Display Adapter /J | | | X | X | X |
-*/
+ | | | 5605JBK | 5605PAA | 5605PCA | 5605PDE | 5605PAW | 5605PXB |
+ | POS ID | Adapter Name | K3.31 | J4.05 | J4.08 | J1.33 | 3.02 | 2.0 |
+ |------------|-----------------------------|:-------:|:-------:|:-------:|:-------:|:-------:|:-------:|
+ | EFFFh | Display Adapter | X | | | | | |
+ | FFEDh | ? [Atlas EVT] | X | | | | | |
+ | FFFDh | ? [LDT EVT] | X | | | | | |
+ | EFFEh | Display Adapter II,III,V,B2 | X | X | X | X | X | X |
+ | E013h | ? [LDT] | X | X | X | X | | X |
+ | ECCEh | Display Adapter IV | | X | X | X | | X |
+ | ECECh | Display Adapter IV,B1 | | X | X | X | X | X |
+ | 9000-901Fh | Display Adapter A1,A2 | | X | X | | X | X |
+ | EFD8h | Display Adapter /J | | | X | X | X | X |
+
+ - 5605JBK : Japanese DOS K3.3, K3.4 (for PS/55 model 55xx-S, T, V, Z)
+ - 5605PAA : DOS J4.0
+ - 5605PCA : DOS J4.0 (with MKK)
+ - 5605PDE : OS/2 Extended Edition J1.3
+ - 5605PAW : Japanese Microsoft Windows 3.0 (IBMJ OEM)
+ - 5605PXB : DOS/V Extension V2.0
+ */
/* IO 3E0/3E1:0Ah Hardware Configuration Value L (imported from OS/2 DDK) */
#define OldLSI 0x20 /* 1 = DA-2, 0 = DA-3 */
// #define Mon_ID3 0x10
@@ -162,8 +170,10 @@
#define LF_INDEX 0x3e2
#define LF_DATA 0x3e3
#define LF_MMIO_SEL 0x08 /* added */
+#define LF_MMIO_09 0x09 /* added */
#define LF_MMIO_ADDR 0x0A /* added */
#define LF_MMIO_MODE 0x0B /* added */
+#define LF_PD_RESET 0x18 /* added */
#define LC_INDEX 0x3E4
#define LC_DATA 0x3E5
#define LC_HORIZONTAL_TOTAL 0x00
@@ -254,8 +264,8 @@
#endif
#ifdef ENABLE_DA2_LOG
-// # define ENABLE_DA2_DEBUGIO 1
-// # define ENABLE_DA2_DEBUGBLT 1
+# define ENABLE_DA2_DEBUGIO 1
+# define ENABLE_DA2_DEBUGBLT 1
// # define ENABLE_DA2_DEBUGVRAM 1
// # define ENABLE_DA2_DEBUGFULLSCREEN 1
// # define ENABLE_DA2_DEBUGMONWAIT 1
@@ -282,8 +292,15 @@ da2_log(const char *fmt, ...)
#endif
#ifdef ENABLE_DA2_DEBUGBLT
# define da2_bltlog da2_log
+# define ENABLE_DA2_DEBUGBLT_DETAIL 1
+# ifdef ENABLE_DA2_DEBUGBLT_DETAIL
+# define da2_bltreglog da2_log
+# else
+# define da2_bltreglog(fmt, ...)
+# endif
#else
# define da2_bltlog(fmt, ...)
+# define da2_bltreglog(fmt, ...)
#endif
typedef struct da2_t {
@@ -291,7 +308,9 @@ typedef struct da2_t {
uint8_t ioctl[16];
uint8_t fctl[32];
- uint16_t crtc[128];
+ uint16_t crtc[32];
+ uint16_t crtc_vpreg[128];
+ uint8_t crtc_vpsel;
uint8_t gdcreg[64];
uint8_t reg3ee[16];
int gdcaddr;
@@ -327,7 +346,7 @@ typedef struct da2_t {
int vtotal, dispend, vsyncstart, split, vblankstart;
int hdisp, htotal, hdisp_time, rowoffset;
- int lowres, interlace;
+ int lowres;
int rowcount;
double clock;
uint32_t ma_latch, ca_adj;
@@ -342,7 +361,7 @@ typedef struct da2_t {
uint32_t ma, maback, ca;
int vc;
int sc;
- int linepos, vslines, linecountff, oddeven;
+ int linepos, vslines, linecountff;
int con, cursoron, blink, blinkconf;
int scrollcache;
int char_width;
@@ -380,6 +399,7 @@ typedef struct da2_t {
int raster_op;
uint8_t payload[DA2_BLT_MEMSIZE];
int payload_addr;
+ int payload_opsize;
int32_t reg[DA2_BLT_REGSIZE]; // must be signed int
#ifdef ENABLE_DA2_DEBUGBLT
int32_t *debug_reg; // for debug
@@ -403,6 +423,7 @@ typedef struct da2_t {
int32_t maskl, maskr;
int32_t count;
int32_t d;
+ int8_t destoption;
int octdir;
int x, y, wx1, wx2, wy1, wy2;
} bitblt;
@@ -428,12 +449,12 @@ static void da2_bitblt_exec(void *p);
static void da2_updatevidselector(da2_t *da2);
static void da2_reset_ioctl(da2_t *da2);
static void da2_reset(void *priv);
-static uint16_t rightRotate(uint16_t data, uint8_t count);
+static uint16_t da2_rightrotate(uint16_t data, uint8_t count);
typedef union {
uint32_t d;
uint8_t b[4];
-} DA2_VidSeq32;
+} vidseq32;
typedef struct {
uint32_t p8[8];
@@ -441,7 +462,7 @@ typedef struct {
/* safety read for internal functions */
static uint32_t
-DA2_vram_r(uint32_t addr, da2_t *da2)
+da2_vram_r(uint32_t addr, da2_t *da2)
{
if (addr & ~DA2_MASK_VRAM)
return DA2_INVALIDACCESS32;
@@ -449,16 +470,49 @@ DA2_vram_r(uint32_t addr, da2_t *da2)
}
/* safety write for internal functions */
static void
-DA2_vram_w(uint32_t addr, uint8_t val, da2_t *da2)
+da2_vram_w(uint32_t addr, uint8_t val, da2_t *da2)
{
if (addr & ~DA2_MASK_VRAM)
return;
da2->vram[addr] = val;
return;
}
+
+/*
+Param Desc
+01 Color
+03 Bit Shift
+04 Select plane?
+05 Direction (1000h or 1100h) + Command? (40 or 48)
+08 Mask Left
+09 Mask Right
+0A Plane Mask?
+0B ROP
+ 2000 NOT Source
+ 200 Source / Pattern
+ 20 NOT Dest
+ 10 NOT Pattern
+ 8 ?
+ 0-3 Bit op (0 None, 1 AND, 2 OR, 3 XOR)
+0D
+20 Exec (1) or Exec without reset regs? (21h)
+21 Dest Pitch
+22 Src Pitch
+23 Tile W
+28 Tile H
+29 Dest Addr
+2A Src Addr
+2B Tile Addr
+2D Octant for line drawing
+2F Dest Write Option
+32 wx1, Dest X
+33 wx2, Size W
+34 wy1, Dest Y
+35 wy2, Size H
+*/
/* write pixel data with rop (Note: bitmask must be in big endian) */
static void
-DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *srcpx, da2_t *da2)
+da2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *srcpx, da2_t *da2)
{
uint32_t writepx[8];
destaddr &= 0xfffffffe; /* align to word address to work bit shift correctly */
@@ -467,20 +521,25 @@ DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *s
destaddr <<= 3;
/* read destination data with big endian order */
for (int i = 0; i < 8; i++)
- writepx[i] = DA2_vram_r((destaddr + 24) | i, da2)
- | (DA2_vram_r((destaddr + 16) | i, da2) << 8)
- | (DA2_vram_r((destaddr + 8) | i, da2) << 16)
- | (DA2_vram_r((destaddr + 0) | i, da2) << 24);
+ writepx[i] = da2_vram_r((destaddr + 24) | i, da2)
+ | (da2_vram_r((destaddr + 16) | i, da2) << 8)
+ | (da2_vram_r((destaddr + 8) | i, da2) << 16)
+ | (da2_vram_r((destaddr + 0) | i, da2) << 24);
- DA2_VidSeq32 mask32in;
+ vidseq32 mask32in;
mask32in.d = (uint32_t) mask;
- DA2_VidSeq32 mask32;
+ vidseq32 mask32;
mask32.b[3] = mask32in.b[0];
mask32.b[2] = mask32in.b[1];
mask32.d &= 0xffff0000;
for (int i = 0; i < 8; i++) {
if (da2->bitblt.bitshift_destr > 0)
srcpx->p8[i] <<= 16 - da2->bitblt.bitshift_destr;
+// #ifdef ENABLE_DA2_DEBUGBLT
+// if (i == 0) {
+// pclog("writeplane: src %08X mask %08X dest %08X\n", srcpx->p8[i], mask32.d, writepx[i]);
+// }
+// #endif
if (da2->bitblt.raster_op & 0x2010) /* NOT Src or NOT Pattern */
srcpx->p8[i] = ~srcpx->p8[i] & mask32.d;
if (da2->bitblt.raster_op & 0x20) /* Dest NOT */
@@ -502,98 +561,139 @@ DA2_WritePlaneDataWithBitmask(uint32_t destaddr, const uint16_t mask, pixel32 *s
}
}
for (int i = 0; i < 8; i++) {
- DA2_vram_w(destaddr | i, (writepx[i] >> 24) & 0xff, da2);
- DA2_vram_w((destaddr + 8) | i, (writepx[i] >> 16) & 0xff, da2);
+ da2_vram_w(destaddr | i, (writepx[i] >> 24) & 0xff, da2);
+ da2_vram_w((destaddr + 8) | i, (writepx[i] >> 16) & 0xff, da2);
}
}
static void
-DA2_DrawColorWithBitmask(uint32_t destaddr, uint8_t color, uint16_t mask, da2_t *da2)
+da2_DrawColorWithBitmask(uint32_t destaddr, uint8_t color, uint16_t mask, da2_t *da2)
{
pixel32 srcpx;
/* fill data with input color */
for (int i = 0; i < 8; i++)
srcpx.p8[i] = (color & (1 << i)) ? 0xffffffff : 0; /* read in word */
- DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2);
+ da2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2);
}
-/*
-Param Desc
-01 Color
-03 Bit Shift
-04 Select plane?
-05 Dir(1000h or 1100h) + Command?(40 or 48)
-08 Mask Left
-09 Mask Right
-0A Plane Mask?
-0B ROP
- 2000 NOT Source
- 200 Source / Pattern
- 20 NOT Dest
- 10 NOT Pattern
- 8 ?
- 0-3 Bit op (0 None, 1 AND, 2 OR, 3 XOR)
-0D
-20 Exec (1) or Exec without reset regs? (21h)
-21 ?
-22 ?
-23 Tile W
-28 Tile H
-29 Dest Addr
-2A Src Addr
-2B Tile Addr
-33 Size W
-35 Size H
-*/
static void
-DA2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2)
+da2_CopyPlaneDataWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2)
{
pixel32 srcpx;
srcaddr &= 0xfffffffe;
srcaddr <<= 3;
for (int i = 0; i < 8; i++)
- srcpx.p8[i] = DA2_vram_r((srcaddr + 24) | i, da2)
- | (DA2_vram_r((srcaddr + 16) | i, da2) << 8)
- | (DA2_vram_r((srcaddr + 8) | i, da2) << 16)
- | (DA2_vram_r((srcaddr + 0) | i, da2) << 24);
+ srcpx.p8[i] = da2_vram_r((srcaddr + 24) | i, da2)
+ | (da2_vram_r((srcaddr + 16) | i, da2) << 8)
+ | (da2_vram_r((srcaddr + 8) | i, da2) << 16)
+ | (da2_vram_r((srcaddr + 0) | i, da2) << 24);
- DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2);
+ da2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2);
}
+/* get font data for bitblt operation */
+static uint32_t
+getRAMFont(int32_t code, int line, int x, void *p)
+{
+ da2_t *da2 = (da2_t *) p;
+ uint32_t font = 0;
+#ifdef RESERVED_FOR_FUTURE_USE
+ int fline = line - 2; /* Start line of drawing character (line >= 1 AND line < 24 + 1 ) */
+#endif
+ if (code < 0x100) { /* SBCS 13x29 */
+ code *= 0x40;
+ code += DA2_GAIJIRAM_SBCS + (line * 2) + x;
+ font = da2->mmio.ram[code];
+ font <<= 8;
+ font |= da2->mmio.ram[code + 1];
+ font <<= 16;
+ } else if ((code >= 0xb000) && (code <= 0xb75f)) { /* DBCS 26x29 */
+ /* convert code->address in gaiji memory */
+ code -= 0xb000;
+ code = (code * 0x80) + (line * 4) + x;
+ font = da2->mmio.ram[code];
+ font <<= 8;
+ font |= da2->mmio.ram[code + 1];
+ font <<= 8;
+ font |= da2->mmio.ram[code + 2];
+ font <<= 8;
+ font |= da2->mmio.ram[code + 3];
+ }
+ else
+ font = 0;
+ return font;
+}
+#ifdef RESERVED_FOR_FUTURE_USE
+/* Reverse the bit order of attribute code IBGR to IRGB(used in Mode 3 and Cursor Color) */
+static int8_t
+IBGRtoIRGB(uint8_t attr)
+{
+ attr = ((attr & 0x01) << 6) | ((attr & 0x02) << 4) | ((attr & 0x04) << 2) | ((attr & 0x08) << 4);
+ return attr >>= 4;
+}
+#endif
static void
-DA2_PutcharWithBitmask(uint32_t srcaddr, uint32_t destaddr, uint16_t mask, da2_t *da2)
+da2_PutcharWithBitmask(uint32_t codeIBMJ, int width, uint16_t attr, int line, uint32_t destaddr, uint16_t maskl, uint16_t maskr, da2_t *da2)
{
pixel32 srcpx;
- if (srcaddr >= DA2_FONTROM_SIZE) {
- da2_log("DA2 Putchar Addr Error %x\n", srcaddr);
- return;
+ uint8_t fg = (~attr >> 8) & 0x0f;
+ uint8_t bg = (~attr >> 12) & 0x0f;
+ uint32_t font = getRAMFont(codeIBMJ, line, 0, da2);
+ uint32_t fontinv;
+ if (width <= 2) {
+ fontinv = ~font;
+ for (int i = 0; i < 8; i++) {
+ srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0;
+ srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0;
+ }
+ da2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2);
+ for (int i = 0; i < 8; i++) {
+ srcpx.p8[i] = (fg & (1 << i)) ? font : 0;
+ srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0;
+ }
+ da2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2);
+ } else {
+ font = (font & 0xfff80000) | ((font & 0x0000ffff) << 3);
+ fontinv = ~font;
+ for (int i = 0; i < 8; i++) {
+ srcpx.p8[i] = (fg & (1 << i)) ? font >> 16 : 0;
+ srcpx.p8[i] |= (bg & (1 << i)) ? fontinv >> 16 : 0;
+ }
+ da2_WritePlaneDataWithBitmask(destaddr, maskl, &srcpx, da2);
+ for (int i = 0; i < 8; i++) {
+ srcpx.p8[i] = (fg & (1 << i)) ? font : 0;
+ srcpx.p8[i] |= (bg & (1 << i)) ? fontinv : 0;
+ }
+ if (da2->bitblt.destoption & 0x20) {
+ da2_WritePlaneDataWithBitmask(destaddr + 2, maskr, &srcpx, da2);
+ } else {
+ da2_WritePlaneDataWithBitmask(destaddr + 2, 0xffff, &srcpx, da2);
+ for (int i = 0; i < 8; i++) {
+ srcpx.p8[i] = (fg & (1 << i)) ? font << 16 : 0;
+ srcpx.p8[i] |= (bg & (1 << i)) ? fontinv << 16 : 0;
+ }
+ da2_WritePlaneDataWithBitmask(destaddr + 4, maskr, &srcpx, da2);
+ }
}
- for (int i = 0; i < 8; i++)
- srcpx.p8[i] = ((uint32_t) da2->mmio.font[srcaddr] << 24)
- | ((uint32_t) da2->mmio.font[srcaddr + 1] << 16)
- | ((uint32_t) da2->mmio.font[srcaddr + 2] << 8)
- | ((uint32_t) da2->mmio.font[srcaddr + 3] << 0);
-
- DA2_WritePlaneDataWithBitmask(destaddr, mask, &srcpx, da2);
}
#ifdef ENABLE_DA2_DEBUGBLT
-uint8_t
+static uint8_t
pixel1tohex(uint32_t addr, int index, da2_t *da2)
{
uint8_t pixeldata = 0;
for (int j = 0; j < 8; j++) {
- if (DA2_vram_r(((addr << 3) | j) & (1 << (7 - index)), da2))
+ if (da2_vram_r(((addr << 3) | j) & (1 << (7 - index)), da2))
pixeldata++;
}
return pixeldata;
}
-void
+static void
print_pixelbyte(uint32_t addr, da2_t *da2)
{
for (int i = 0; i < 8; i++) {
pclog("%X", pixel1tohex(addr, i, da2));
}
}
-void
+static void
print_bytetobin(uint8_t b)
{
for (int i = 0; i < 8; i++) {
@@ -605,17 +705,17 @@ print_bytetobin(uint8_t b)
}
}
/* Convert internal char code to Shift JIS code */
-inline int
+static int
isKanji1(uint8_t chr)
{
return (chr >= 0x81 && chr <= 0x9f) || (chr >= 0xe0 && chr <= 0xfc);
}
-inline int
+static int
isKanji2(uint8_t chr)
{
return (chr >= 0x40 && chr <= 0x7e) || (chr >= 0x80 && chr <= 0xfc);
}
-uint16_t
+static uint16_t
IBMJtoSJIS(uint16_t knj)
{
if (knj < 0x100)
@@ -646,241 +746,237 @@ IBMJtoSJIS(uint16_t knj)
return knj;
}
#endif
+
static void
-da2_bitblt_load(da2_t *da2)
+da2_bitblt_parse(da2_t *da2)
{
uint32_t value32;
uint64_t value64;
-#ifdef ENABLE_DA2_DEBUGBLT
- da2_log("bltload: loading params\n");
- da2_log("BitBlt memory:\n");
- if (da2->bitblt.payload[0] != 0)
- for (int j = 0; j < DA2_BLT_MEMSIZE / 8; j++)
- {
- int i = j * 8;
- da2_log("%02x %02x %02x %02x %02x %02x %02x %02x \n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], da2->bitblt.payload[i + 2], da2->bitblt.payload[i + 3],
- da2->bitblt.payload[i + 4], da2->bitblt.payload[i + 5], da2->bitblt.payload[i + 6], da2->bitblt.payload[i + 7]);
- }
-#endif
- int i = 0;
- while (i < da2->bitblt.payload_addr) {
- if (da2->bitblt.reg[0x20] & 0x1)
+ switch (da2->bitblt.payload[0]) {
+ case 0x88:
+ case 0x89:
+ case 0x95:
+ value32 = da2->bitblt.payload[3];
+ value32 <<= 8;
+ value32 |= da2->bitblt.payload[2];
+ da2_bltreglog("[%02x] %02x: %04x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32);
+ da2->bitblt.reg[da2->bitblt.payload[1]] = value32;
+ break;
+ case 0x91:
+ value32 = da2->bitblt.payload[5];
+ value32 <<= 8;
+ value32 |= da2->bitblt.payload[4];
+ value32 <<= 8;
+ value32 |= da2->bitblt.payload[3];
+ value32 <<= 8;
+ value32 |= da2->bitblt.payload[2];
+ da2_bltreglog("[%02x] %02x: %08x (%d)\n", da2->bitblt.payload[0], da2->bitblt.payload[1], value32, value32);
+ da2->bitblt.reg[da2->bitblt.payload[1]] = value32;
+ break;
+ case 0x99:
+ value64 = da2->bitblt.payload[7];
+ value64 <<= 8;
+ value64 = da2->bitblt.payload[6];
+ value64 <<= 8;
+ value64 = da2->bitblt.payload[5];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[4];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[3];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[2];
+ da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3],
+ da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7]);
+ da2->bitblt.reg[da2->bitblt.payload[1]] = value64;
+ break;
+ case 0xa1:
+ value64 = da2->bitblt.payload[9];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[8];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[7];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[6];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[5];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[4];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[3];
+ value64 <<= 8;
+ value64 |= da2->bitblt.payload[2];
+ da2_bltreglog("[%02x] %02x: %02x %02x %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[0], da2->bitblt.payload[1], da2->bitblt.payload[2], da2->bitblt.payload[3],
+ da2->bitblt.payload[4], da2->bitblt.payload[5], da2->bitblt.payload[6], da2->bitblt.payload[7], da2->bitblt.payload[8], da2->bitblt.payload[9]);
+ da2->bitblt.reg[da2->bitblt.payload[1]] = value64;
+ break;
+ case 0x00: /* Win 3.0 Clock writes invalid zero data. */
+ break;
+ default:
+ da2_log("bltload: Unknown PreOP!\n");
break;
- switch (da2->bitblt.payload[i]) {
- case 0x88:
- case 0x89:
- case 0x95:
- value32 = da2->bitblt.payload[i + 3];
- value32 <<= 8;
- value32 |= da2->bitblt.payload[i + 2];
- da2_bltlog("[%02x] %02x: %04x (%d)\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], value32, value32);
- da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value32;
- // da2->gdcreg[da2->bitblt.payload[i + 1]] = value32;
- i += 3;
- break;
- case 0x91:
- value32 = da2->bitblt.payload[i + 5];
- value32 <<= 8;
- value32 |= da2->bitblt.payload[i + 4];
- value32 <<= 8;
- value32 |= da2->bitblt.payload[i + 3];
- value32 <<= 8;
- value32 |= da2->bitblt.payload[i + 2];
- da2_bltlog("[%02x] %02x: %08x (%d)\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], value32, value32);
- da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value32;
- // da2->gdcreg[da2->bitblt.payload[i + 1]] = value32;
- i += 5;
- break;
- case 0x99:
- value64 = da2->bitblt.payload[i + 7];
- value64 <<= 8;
- value64 = da2->bitblt.payload[i + 6];
- value64 <<= 8;
- value64 = da2->bitblt.payload[i + 5];
- value64 <<= 8;
- value64 |= da2->bitblt.payload[i + 4];
- value64 <<= 8;
- value64 |= da2->bitblt.payload[i + 3];
- value64 <<= 8;
- value64 |= da2->bitblt.payload[i + 2];
- da2_bltlog("[%02x] %02x: %02x %02x %02x %02x %02x %02x\n", da2->bitblt.payload[i], da2->bitblt.payload[i + 1], da2->bitblt.payload[i + 2], da2->bitblt.payload[i + 3],
- da2->bitblt.payload[i + 4], da2->bitblt.payload[i + 5], da2->bitblt.payload[i + 6], da2->bitblt.payload[i + 7]);
- da2->bitblt.reg[da2->bitblt.payload[i + 1]] = value64;
- // da2->gdcreg[da2->bitblt.payload[i + 1]] = value64;
- i += 7;
- break;
- case 0x00:
- break;
- default:
- da2_log("bltload: Unknown PreOP!\n");
- break;
- }
- i++;
}
- da2->bitblt.exec = DA2_BLT_CIDLE;
+ if (da2->bitblt.reg[0x20] & 0x01) { /* Execute Bitblt immediately (for OS/2 J1.3) */
+ da2->bitblt.exec = DA2_BLT_CLOAD;
+ da2_bitblt_exec(da2);
+ }
/* clear payload memory */
memset(da2->bitblt.payload, 0x00, DA2_BLT_MEMSIZE);
da2->bitblt.payload_addr = 0;
- /* [89] 20: 0001 (1) then execute payload */
- if (da2->bitblt.reg[0x20] & 0x1) {
-#ifdef ENABLE_DA2_DEBUGBLT
- for (i = 0; i < DA2_DEBUG_BLTLOG_SIZE; i++) {
- da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip + i] = da2->bitblt.reg[i];
- }
- da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * (da2->bitblt.debug_reg_ip + 1) - 1] = 0;
- da2->bitblt.debug_reg_ip++;
- if ((DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip) >= DA2_DEBUG_BLTLOG_MAX)
- da2->bitblt.debug_reg_ip = 0;
- da2->bitblt.debug_exesteps = 0;
-#endif
- da2_log("bltload_exec: %x, rop: %x CS:PC=%4x:%4x\n", da2->bitblt.reg[0x5], da2->bitblt.reg[0x0b], CS, cpu_state.pc);
- da2->bitblt.bitshift_destr = ((da2->bitblt.reg[0x3] >> 4) & 0x0f); /* set bit shift */
- da2->bitblt.raster_op = da2->bitblt.reg[0x0b];
- da2->bitblt.destaddr = da2->bitblt.reg[0x29];
- da2->bitblt.size_x = da2->bitblt.reg[0x33];
- da2->bitblt.size_y = da2->bitblt.reg[0x35];
- da2->bitblt.destpitch = da2->bitblt.reg[0x21];
- da2->bitblt.srcpitch = da2->bitblt.reg[0x22];
- if (da2->bitblt.reg[0x2F] == 0x90) /* destaddr -= 2, length += 1; */
- {
- da2->bitblt.destaddr -= 2;
- da2->bitblt.size_x += 1;
- da2->bitblt.destpitch -= 2;
- da2->bitblt.srcpitch -= 2;
- }
- da2->bitblt.fcolor = da2->bitblt.reg[0x0];
- da2->bitblt.maskl = da2->bitblt.reg[0x8];
- da2->bitblt.maskr = da2->bitblt.reg[0x9];
- da2->bitblt.x = 0;
- da2->bitblt.y = 0;
- da2->bitblt.exec = DA2_BLT_CDONE;
+ da2->bitblt.indata = 0;
+}
- /* Put DBCS char used by OS/2 (i'm not sure what the condition is) */
- if (da2->bitblt.reg[0x10] == 0xbc04) {
- da2->bitblt.exec = DA2_BLT_CPUTCHAR;
- /* Todo: addressing */
- // if (da2->bitblt.reg[0x2F] == 0x90) /* destaddr -= 2, length += 1; */
- //{
- // da2->bitblt.destaddr += 2;
- // da2->bitblt.size_x -= 1;
- // da2->bitblt.destpitch += 2;
- // da2->bitblt.srcpitch += 2;
- // }
- da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + 2;
- da2->bitblt.destaddr += 2;
- da2->bitblt.srcpitch = 0;
- da2->bitblt.bitshift_destr += 1;
+static void
+da2_bitblt_load(da2_t *da2)
+{
+ da2->bitblt.reg[0x20] = 0; /* need to stop execution */
#ifdef ENABLE_DA2_DEBUGBLT
- uint32_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8;
- uint32_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff;
- da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d, c=%c%c\n",
- da2->bitblt.srcaddr, da2->bitblt.destaddr,
- da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
- da2->bitblt.size_x, da2->bitblt.size_y, sjis_h, sjis_l);
+ for (int i = 0; i < DA2_DEBUG_BLTLOG_SIZE; i++) {
+ da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip + i] = da2->bitblt.reg[i];
+ }
+ da2->bitblt.debug_reg[DA2_DEBUG_BLTLOG_SIZE * (da2->bitblt.debug_reg_ip + 1) - 1] = 0;
+ da2->bitblt.debug_reg_ip++;
+ if ((DA2_DEBUG_BLTLOG_SIZE * da2->bitblt.debug_reg_ip) >= DA2_DEBUG_BLTLOG_MAX)
+ da2->bitblt.debug_reg_ip = 0;
+ da2->bitblt.debug_exesteps = 0;
#endif
- }
- /* Put SBCS char used by OS/2 */
- else if (da2->bitblt.reg[0x10] == 0x0004 || da2->bitblt.reg[0x10] == 0x0E04) {
- da2->bitblt.exec = DA2_BLT_CPUTCHAR;
- da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 64 + 2 + DA2_FONTROM_BASESBCS;
- da2->bitblt.destaddr += 2;
- da2->bitblt.srcpitch = 0;
- da2->bitblt.bitshift_destr += 1;
+ da2->bitblt.bitshift_destr = ((da2->bitblt.reg[0x03] >> 4) & 0x0f); /* set bit shift */
+ da2->bitblt.raster_op = da2->bitblt.reg[0x0b];
+ da2->bitblt.destaddr = da2->bitblt.reg[0x29];
+ da2->bitblt.size_x = da2->bitblt.reg[0x33];
+ da2->bitblt.size_y = da2->bitblt.reg[0x35];
+ da2->bitblt.destpitch = da2->bitblt.reg[0x21];
+ da2->bitblt.srcpitch = da2->bitblt.reg[0x22];
+ /*
+ DOS/V Extension 1040x725 some DBCS uses 0xB0 others 0x90
+ */
+ da2->bitblt.destoption = da2->bitblt.reg[0x2F];
+ if (da2->bitblt.destoption & 0x10) /* destaddr -= 2, length += 1; */
+ {
+ da2->bitblt.destaddr -= 2;
+ da2->bitblt.size_x += 1;
+ da2->bitblt.destpitch -= 2;
+ da2->bitblt.srcpitch -= 2;
+ }
+ da2->bitblt.fcolor = da2->bitblt.reg[0x0];
+ da2->bitblt.maskl = da2->bitblt.reg[0x8];
+ da2->bitblt.maskr = da2->bitblt.reg[0x9];
+ da2->bitblt.x = 0;
+ da2->bitblt.y = 0;
+ da2->bitblt.exec = DA2_BLT_CDONE;
+
+ /* Put DBCS char used by OS/2 and DOS/V Extension */
+ if (!(da2->bitblt.reg[0xb] & 0x08)) {
+ da2->bitblt.exec = DA2_BLT_CPUTCHAR;
+ da2->bitblt.fcolor = da2->bitblt.reg[0x1];
+ da2->bitblt.srcaddr = da2->bitblt.reg[0x12];
+ da2->bitblt.destaddr += 2;
#ifdef ENABLE_DA2_DEBUGBLT
- uint32_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8;
- uint32_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff;
- da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d, c=%c%c\n",
- da2->bitblt.srcaddr, da2->bitblt.destaddr,
- da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
- da2->bitblt.size_x, da2->bitblt.size_y, sjis_h, sjis_l);
+ uint8_t sjis_h = IBMJtoSJIS(da2->bitblt.reg[0x12]) >> 8;
+ uint8_t sjis_l = IBMJtoSJIS(da2->bitblt.reg[0x12]) & 0xff;
+ if (da2->bitblt.reg[0x12] < 0x100) {
+ sjis_h = 0x20;
+ sjis_l = da2->bitblt.reg[0x12];
+ } else {
+ if (!(isKanji1(sjis_h)))
+ sjis_h = 0x3f;
+ if (!(isKanji2(sjis_l)))
+ sjis_l = 0x3f;
+ }
+ da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d, c=%c%c\n",
+ da2->bitblt.srcaddr, da2->bitblt.destaddr,
+ da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
+ da2->bitblt.size_x, da2->bitblt.size_y, sjis_h, sjis_l);
+#else
+ da2_log("put char src=%x, dest=%x, x=%d, y=%d, w=%d, h=%d\n",
+ da2->bitblt.srcaddr, da2->bitblt.destaddr,
+ da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
+ da2->bitblt.size_x, da2->bitblt.size_y);
#endif
- }
- /* Draw a line */
- else if (da2->bitblt.reg[0x5] == 0x43) {
- da2->bitblt.exec = DA2_BLT_CLINE;
- da2->bitblt.dest_x = (da2->bitblt.reg[0x32] & 0xffff);
- da2->bitblt.dest_y = (da2->bitblt.reg[0x34] & 0xffff);
- da2->bitblt.wx1 = (da2->bitblt.reg[0x32]) >> 16;
- da2->bitblt.wx2 = (da2->bitblt.reg[0x33]) >> 16;
- da2->bitblt.wy1 = (da2->bitblt.reg[0x34]) >> 16;
- da2->bitblt.wy2 = (da2->bitblt.reg[0x35]) >> 16;
- da2->bitblt.size_x = abs((int16_t)(da2->bitblt.reg[0x33] & 0xffff) - da2->bitblt.dest_x);
- da2->bitblt.size_y = abs((int16_t)(da2->bitblt.reg[0x35] & 0xffff) - da2->bitblt.dest_y);
- da2->bitblt.count = 0;
- da2->bitblt.octdir = da2->bitblt.reg[0x2D];
- da2->bitblt.bitshift_destr = 0;
- if (da2->bitblt.octdir & 0x04) /* dX > dY */
- da2->bitblt.d = 2 * da2->bitblt.size_y - da2->bitblt.size_x;
- else
- da2->bitblt.d = 2 * da2->bitblt.size_x - da2->bitblt.size_y;
- da2->bitblt.x = da2->bitblt.dest_x;
- da2->bitblt.y = da2->bitblt.dest_y;
- da2_log("drawline x=%d, y=%d, dx=%d, dy=%d, oct=%dn",
- da2->bitblt.dest_x, da2->bitblt.dest_y,
- da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.octdir);
- da2_log(" x1=%d, x2=%d, y1=%d, y2=%d\n",
- da2->bitblt.reg[0x32] & 0x7ff, da2->bitblt.reg[0x33] & 0x7ff,
- da2->bitblt.reg[0x34] & 0x7ff, da2->bitblt.reg[0x35] & 0x7ff);
- da2_log(" ux1=%d,ux2=%d,uy1=%d,uy2=%d\n",
- (da2->bitblt.reg[0x32] >> 16) & 0x7ff, (da2->bitblt.reg[0x33] >> 16) & 0x7ff,
- (da2->bitblt.reg[0x34] >> 16) & 0x7ff, (da2->bitblt.reg[0x35] >> 16) & 0x7ff);
- }
- /* Fill a rectangle (or draw a horizontal / vertical line) */
- else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x40 && da2->bitblt.reg[0x3D] == 0) {
- da2_log("fillrect x=%d, y=%d, w=%d, h=%d, c=%d, 2f=%x, rowcount=%x\n",
- da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
- da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.reg[0x0], da2->bitblt.reg[0x2F], da2->rowoffset * 2);
- da2->bitblt.exec = DA2_BLT_CFILLRECT;
- da2->bitblt.destaddr += 2;
- }
- /* Tiling a rectangle ??(transfer tile data multiple times) os/2 only */
- else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x0040 && da2->bitblt.reg[0x3D] == 0x40) {
- da2->bitblt.exec = DA2_BLT_CFILLTILE;
- da2->bitblt.destaddr += 2;
- da2->bitblt.srcaddr = da2->bitblt.reg[0x2B];
- da2->bitblt.tile_w = da2->bitblt.reg[0x28];
- da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
- da2->bitblt.srcaddr, da2->bitblt.destaddr,
- da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2),
- da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
- da2->bitblt.size_x, da2->bitblt.size_y);
- }
- /* Tiling a rectangle (transfer tile data multiple times) */
- else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x40) {
- da2->bitblt.exec = DA2_BLT_CFILLTILE;
- da2->bitblt.destaddr += 2;
- da2->bitblt.srcaddr = da2->bitblt.reg[0x2B];
- da2->bitblt.tile_w = da2->bitblt.reg[0x28];
- da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
- da2->bitblt.srcaddr, da2->bitblt.destaddr,
- da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2),
- da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
- da2->bitblt.size_x, da2->bitblt.size_y);
- }
- /* Block copy */
- else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x00) {
- da2->bitblt.exec = DA2_BLT_CCOPYF;
- da2->bitblt.srcaddr = da2->bitblt.reg[0x2A];
- da2->bitblt.destaddr += 2;
- da2_log("copy block src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
- da2->bitblt.srcaddr, da2->bitblt.destaddr,
- da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2),
- da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
- da2->bitblt.size_x, da2->bitblt.size_y);
- }
- /* Block copy but reversed direction */
- else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1140 && da2->bitblt.reg[0x3D] == 0x00) {
- da2->bitblt.exec = DA2_BLT_CCOPYR;
- da2->bitblt.srcaddr = da2->bitblt.reg[0x2A];
- da2->bitblt.destaddr -= 2;
- da2->bitblt.srcaddr -= 2;
- da2_log("copy blockR src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
- da2->bitblt.srcaddr, da2->bitblt.destaddr,
- da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2),
- da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
- da2->bitblt.size_x, da2->bitblt.size_y);
- // da2_log(" mask8=%x, mask9=%x\n", da2->bitblt.reg[0x8], da2->bitblt.reg[0x9]);
- }
+ }
+ /* Draw a line */
+ else if (da2->bitblt.reg[0x5] == 0x43) {
+ da2->bitblt.exec = DA2_BLT_CLINE;
+ da2->bitblt.dest_x = (da2->bitblt.reg[0x32] & 0xffff);
+ da2->bitblt.dest_y = (da2->bitblt.reg[0x34] & 0xffff);
+ da2->bitblt.wx1 = (da2->bitblt.reg[0x32]) >> 16;
+ da2->bitblt.wx2 = (da2->bitblt.reg[0x33]) >> 16;
+ da2->bitblt.wy1 = (da2->bitblt.reg[0x34]) >> 16;
+ da2->bitblt.wy2 = (da2->bitblt.reg[0x35]) >> 16;
+ da2->bitblt.size_x = abs((int16_t) (da2->bitblt.reg[0x33] & 0xffff) - da2->bitblt.dest_x);
+ da2->bitblt.size_y = abs((int16_t) (da2->bitblt.reg[0x35] & 0xffff) - da2->bitblt.dest_y);
+ da2->bitblt.count = 0;
+ da2->bitblt.octdir = da2->bitblt.reg[0x2D];
+ da2->bitblt.bitshift_destr = 0;
+ if (da2->bitblt.octdir & 0x04) /* dX > dY */
+ da2->bitblt.d = 2 * da2->bitblt.size_y - da2->bitblt.size_x;
+ else
+ da2->bitblt.d = 2 * da2->bitblt.size_x - da2->bitblt.size_y;
+ da2->bitblt.x = da2->bitblt.dest_x;
+ da2->bitblt.y = da2->bitblt.dest_y;
+ da2_log("drawline x=%d, y=%d, dx=%d, dy=%d, oct=%dn",
+ da2->bitblt.dest_x, da2->bitblt.dest_y,
+ da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.octdir);
+ da2_log(" x1=%d, x2=%d, y1=%d, y2=%d\n",
+ da2->bitblt.reg[0x32] & 0x7ff, da2->bitblt.reg[0x33] & 0x7ff,
+ da2->bitblt.reg[0x34] & 0x7ff, da2->bitblt.reg[0x35] & 0x7ff);
+ da2_log(" ux1=%d,ux2=%d,uy1=%d,uy2=%d\n",
+ (da2->bitblt.reg[0x32] >> 16) & 0x7ff, (da2->bitblt.reg[0x33] >> 16) & 0x7ff,
+ (da2->bitblt.reg[0x34] >> 16) & 0x7ff, (da2->bitblt.reg[0x35] >> 16) & 0x7ff);
+ }
+ /* Fill a rectangle (or draw a horizontal / vertical line) */
+ else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x40 && da2->bitblt.reg[0x3D] == 0) {
+ da2_log("fillrect x=%d, y=%d, w=%d, h=%d, c=%d, 2f=%x, rowcount=%x\n",
+ da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
+ da2->bitblt.size_x, da2->bitblt.size_y, da2->bitblt.reg[0x0], da2->bitblt.reg[0x2F], da2->rowoffset * 2);
+ da2->bitblt.exec = DA2_BLT_CFILLRECT;
+ da2->bitblt.destaddr += 2;
+ }
+ /* Tiling a rectangle ??(transfer tile data multiple times) os/2 only */
+ else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x0040 && da2->bitblt.reg[0x3D] == 0x40) {
+ da2->bitblt.exec = DA2_BLT_CFILLTILE;
+ da2->bitblt.destaddr += 2;
+ da2->bitblt.srcaddr = da2->bitblt.reg[0x2B];
+ da2->bitblt.tile_w = da2->bitblt.reg[0x28];
+ da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
+ da2->bitblt.srcaddr, da2->bitblt.destaddr,
+ da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2),
+ da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
+ da2->bitblt.size_x, da2->bitblt.size_y);
+ }
+ /* Tiling a rectangle (transfer tile data multiple times) */
+ else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x40) {
+ da2->bitblt.exec = DA2_BLT_CFILLTILE;
+ da2->bitblt.destaddr += 2;
+ da2->bitblt.srcaddr = da2->bitblt.reg[0x2B];
+ da2->bitblt.tile_w = da2->bitblt.reg[0x28];
+ da2_log("copy tile src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
+ da2->bitblt.srcaddr, da2->bitblt.destaddr,
+ da2->bitblt.reg[0x2B] % (da2->rowoffset * 2), da2->bitblt.reg[0x2B] / (da2->rowoffset * 2),
+ da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
+ da2->bitblt.size_x, da2->bitblt.size_y);
+ }
+ /* Block copy */
+ else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1040 && da2->bitblt.reg[0x3D] == 0x00) {
+ da2->bitblt.exec = DA2_BLT_CCOPYF;
+ da2->bitblt.srcaddr = da2->bitblt.reg[0x2A];
+ da2->bitblt.destaddr += 2;
+ da2_log("copy block src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
+ da2->bitblt.srcaddr, da2->bitblt.destaddr,
+ da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2),
+ da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
+ da2->bitblt.size_x, da2->bitblt.size_y);
+ }
+ /* Block copy but reversed direction */
+ else if ((da2->bitblt.reg[0x5] & 0xfff0) == 0x1140 && da2->bitblt.reg[0x3D] == 0x00) {
+ da2->bitblt.exec = DA2_BLT_CCOPYR;
+ da2->bitblt.srcaddr = da2->bitblt.reg[0x2A];
+ da2->bitblt.destaddr -= 2;
+ da2->bitblt.srcaddr -= 2;
+ da2_log("copy blockR src=%x, dest=%x, x1=%d, y1=%d, x2=%d, y2=%d, w=%d, h=%d\n",
+ da2->bitblt.srcaddr, da2->bitblt.destaddr,
+ da2->bitblt.reg[0x2A] % (da2->rowoffset * 2), da2->bitblt.reg[0x2A] / (da2->rowoffset * 2),
+ da2->bitblt.reg[0x29] % (da2->rowoffset * 2), da2->bitblt.reg[0x29] / (da2->rowoffset * 2),
+ da2->bitblt.size_x, da2->bitblt.size_y);
}
}
static void
@@ -888,10 +984,12 @@ da2_bitblt_exec(void *p)
{
da2_t *da2 = (da2_t *) p;
// timer_set_delay_u64(&da2->bitblt.timer, da2->bitblt.timerspeed);
-#ifdef ENABLE_DA2_DEBUGBLT
- if(!(da2->bitblt.debug_exesteps & 0xff))
+#ifdef ENABLE_DA2_DEBUGBLT_DETAIL
+ if (!(da2->bitblt.debug_exesteps & 0xff))
da2_log("bitblt_exec: %d %d\n", da2->bitblt.exec, da2->bitblt.debug_exesteps);
da2->bitblt.debug_exesteps++;
+#else
+ da2_log("bltload_exec: %x, CS:PC=%4x:%4x\n", da2->bitblt.exec, CS, cpu_state.pc);
#endif
switch (da2->bitblt.exec) {
case DA2_BLT_CIDLE:
@@ -899,69 +997,69 @@ da2_bitblt_exec(void *p)
break;
case DA2_BLT_CLOAD:
da2_bitblt_load(da2);
- da2->bitblt.indata = 0;
+ // da2->bitblt.indata = 0;
break;
case DA2_BLT_CLINE:
- /* Draw a dot */
- // outb(0x680, da2->bitblt.octdir);
- da2_bltlog("point: %d %d %d %d %d\n", da2->bitblt.x, da2->bitblt.y, da2->bitblt.d, da2->bitblt.x, da2->bitblt.y);
- int destaddr = da2->bitblt.y * (da2->rowoffset * 2) + da2->bitblt.x / 8;
- int pixelmask = da2->bitblt.x % 16;
- if (pixelmask >= 8)
- pixelmask = (0x8000 >> (pixelmask - 8));
- else
- pixelmask = (0x80 >> pixelmask);
-
- /* check the current position is inside the window */
- if (da2->bitblt.x < da2->bitblt.wx1 || da2->bitblt.x > da2->bitblt.wx2
- || da2->bitblt.y < da2->bitblt.wy1 || da2->bitblt.y > da2->bitblt.wy2)
- ;
- else
- DA2_DrawColorWithBitmask(destaddr, da2->bitblt.fcolor, pixelmask, da2);
- // da2_log("draw: %x %x %x\n", destaddr, da2->bitblt.fcolor, pixelmask);
- da2->bitblt.count++;
+ {
+ /* Draw a dot */
+ da2_bltlog("point: %d %d %d %d %d\n", da2->bitblt.x, da2->bitblt.y, da2->bitblt.d, da2->bitblt.x, da2->bitblt.y);
+ int destaddr = da2->bitblt.y * (da2->rowoffset * 2) + da2->bitblt.x / 8;
+ int pixelmask = da2->bitblt.x % 16;
+ if (pixelmask >= 8)
+ pixelmask = (0x8000 >> (pixelmask - 8));
+ else
+ pixelmask = (0x80 >> pixelmask);
- /* calculate the next position with Bresenham's line algorithm */
- if (da2->bitblt.octdir & 0x04) { /* dX > dY */
- if (da2->bitblt.octdir & 0x02) {
- da2->bitblt.x++;
- } else {
- da2->bitblt.x--;
- }
- if (da2->bitblt.d >= 0) {
- da2->bitblt.d -= (2 * da2->bitblt.size_x);
- if (da2->bitblt.octdir & 0x01) {
- da2->bitblt.y++;
- } else {
- da2->bitblt.y--;
- }
- }
- da2->bitblt.d += (2 * da2->bitblt.size_y);
- if (da2->bitblt.count >= da2->bitblt.size_x)
- da2->bitblt.exec = DA2_BLT_CDONE;
- } else {
- if (da2->bitblt.octdir & 0x01) {
- da2->bitblt.y++;
- } else {
- da2->bitblt.y--;
- }
- if (da2->bitblt.d >= 0) {
- da2->bitblt.d -= (2 * da2->bitblt.size_y);
+ /* check the current position is inside the window */
+ if (da2->bitblt.x < da2->bitblt.wx1 || da2->bitblt.x > da2->bitblt.wx2
+ || da2->bitblt.y < da2->bitblt.wy1 || da2->bitblt.y > da2->bitblt.wy2)
+ ;
+ else
+ da2_DrawColorWithBitmask(destaddr, da2->bitblt.fcolor, pixelmask, da2);
+ da2->bitblt.count++;
+
+ /* calculate the next position with Bresenham's line algorithm */
+ if (da2->bitblt.octdir & 0x04) { /* dX > dY */
if (da2->bitblt.octdir & 0x02) {
da2->bitblt.x++;
} else {
da2->bitblt.x--;
}
+ if (da2->bitblt.d >= 0) {
+ da2->bitblt.d -= (2 * da2->bitblt.size_x);
+ if (da2->bitblt.octdir & 0x01) {
+ da2->bitblt.y++;
+ } else {
+ da2->bitblt.y--;
+ }
+ }
+ da2->bitblt.d += (2 * da2->bitblt.size_y);
+ if (da2->bitblt.count >= da2->bitblt.size_x)
+ da2->bitblt.exec = DA2_BLT_CDONE;
+ } else {
+ if (da2->bitblt.octdir & 0x01) {
+ da2->bitblt.y++;
+ } else {
+ da2->bitblt.y--;
+ }
+ if (da2->bitblt.d >= 0) {
+ da2->bitblt.d -= (2 * da2->bitblt.size_y);
+ if (da2->bitblt.octdir & 0x02) {
+ da2->bitblt.x++;
+ } else {
+ da2->bitblt.x--;
+ }
+ }
+ da2->bitblt.d += (2 * da2->bitblt.size_x);
+ if (da2->bitblt.count >= da2->bitblt.size_y)
+ da2->bitblt.exec = DA2_BLT_CDONE;
}
- da2->bitblt.d += (2 * da2->bitblt.size_x);
- if (da2->bitblt.count >= da2->bitblt.size_y)
- da2->bitblt.exec = DA2_BLT_CDONE;
+ break;
}
- break;
case DA2_BLT_CFILLRECT:
// da2_log("%x %x %x\n", da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y);
if (da2->bitblt.x >= da2->bitblt.size_x - 1) {
- DA2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskr, da2);
+ da2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskr, da2);
if (da2->bitblt.y >= da2->bitblt.size_y - 1) {
da2->bitblt.exec = DA2_BLT_CDONE;
}
@@ -969,36 +1067,38 @@ da2_bitblt_exec(void *p)
da2->bitblt.y++;
da2->bitblt.destaddr += da2->bitblt.destpitch + 2;
} else if (da2->bitblt.x == 0) {
- DA2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskl, da2);
+ da2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, da2->bitblt.maskl, da2);
da2->bitblt.x++;
} else {
- DA2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, 0xffff, da2);
+ da2_DrawColorWithBitmask(da2->bitblt.destaddr, da2->bitblt.fcolor, 0xffff, da2);
da2->bitblt.x++;
}
da2->bitblt.destaddr += 2;
break;
- case DA2_BLT_CFILLTILE: {
- int32_t tileaddr = da2->bitblt.srcaddr + (da2->bitblt.y % da2->bitblt.tile_w) * 2;
- if (da2->bitblt.x >= da2->bitblt.size_x - 1) {
- DA2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2);
- if (da2->bitblt.y >= da2->bitblt.size_y - 1) {
- da2->bitblt.exec = DA2_BLT_CDONE;
+ case DA2_BLT_CFILLTILE:
+ {
+ int32_t tileaddr = da2->bitblt.srcaddr + (da2->bitblt.y % da2->bitblt.tile_w) * 2;
+ if (da2->bitblt.x >= da2->bitblt.size_x - 1) {
+ da2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2);
+ if (da2->bitblt.y >= da2->bitblt.size_y - 1) {
+ da2->bitblt.exec = DA2_BLT_CDONE;
+ }
+ da2->bitblt.x = 0;
+ da2->bitblt.y++;
+ da2->bitblt.destaddr += da2->bitblt.destpitch + 2;
+ } else if (da2->bitblt.x == 0) {
+ da2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2);
+ da2->bitblt.x++;
+ } else {
+ da2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, 0xffff, da2);
+ da2->bitblt.x++;
}
- da2->bitblt.x = 0;
- da2->bitblt.y++;
- da2->bitblt.destaddr += da2->bitblt.destpitch + 2;
- } else if (da2->bitblt.x == 0) {
- DA2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2);
- da2->bitblt.x++;
- } else {
- DA2_CopyPlaneDataWithBitmask(tileaddr, da2->bitblt.destaddr, 0xffff, da2);
- da2->bitblt.x++;
+ da2->bitblt.destaddr += 2;
+ break;
}
- da2->bitblt.destaddr += 2;
- break;
- } case DA2_BLT_CCOPYF:
+ case DA2_BLT_CCOPYF:
if (da2->bitblt.x >= da2->bitblt.size_x - 1) {
- DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2);
+ da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2);
if (da2->bitblt.y >= da2->bitblt.size_y - 1) {
da2->bitblt.exec = DA2_BLT_CDONE;
}
@@ -1007,10 +1107,10 @@ da2_bitblt_exec(void *p)
da2->bitblt.destaddr += da2->bitblt.destpitch + 2;
da2->bitblt.srcaddr += da2->bitblt.srcpitch + 2;
} else if (da2->bitblt.x == 0) {
- DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2);
+ da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2);
da2->bitblt.x++;
} else {
- DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2);
+ da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2);
da2->bitblt.x++;
}
da2->bitblt.destaddr += 2;
@@ -1018,7 +1118,7 @@ da2_bitblt_exec(void *p)
break;
case DA2_BLT_CCOPYR:
if (da2->bitblt.x >= da2->bitblt.size_x - 1) {
- DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2);
+ da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2);
if (da2->bitblt.y >= da2->bitblt.size_y - 1) {
da2->bitblt.exec = DA2_BLT_CDONE;
}
@@ -1029,64 +1129,37 @@ da2_bitblt_exec(void *p)
da2->bitblt.destaddr -= 2;
da2->bitblt.srcaddr -= 2;
} else if (da2->bitblt.x == 0) {
- DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2);
+ da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2);
da2->bitblt.x++;
} else {
- DA2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2);
+ da2_CopyPlaneDataWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2);
da2->bitblt.x++;
}
da2->bitblt.destaddr -= 2;
da2->bitblt.srcaddr -= 2;
break;
case DA2_BLT_CPUTCHAR: /* used in OS/2 J1.3 wo ROM patch. TODO: still not work */
- // da2->bitblt.y += 2;
- da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.x * 2 + da2->bitblt.y * 130 + 0 + 260;
- // pclog("scr %x dest %x :", da2->bitblt.srcaddr, da2->bitblt.destaddr);
- // da2->bitblt.srcaddr += 2;
- if (da2->bitblt.reg[0x12] < 0x100)
- da2->bitblt.srcaddr = DA2_FONTROM_BASESBCS + da2->bitblt.reg[0x12] * 64 + (da2->bitblt.x * 2) + (da2->bitblt.y * 2) - 2;
- else
- da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2) + (da2->bitblt.y * 3) - 2;
- // print_bytetobin(da2->mmio.font[da2->bitblt.srcaddr + 2]);
- // print_bytetobin(da2->mmio.font[da2->bitblt.srcaddr + 3]);
- // pclog("\n");
- if (da2->bitblt.x >= da2->bitblt.size_x - 1) {
- // if (1) {
- DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskr, da2);
- if (da2->bitblt.y >= da2->bitblt.size_y - 3) {
- da2->bitblt.exec = DA2_BLT_CDONE;
- }
- da2->bitblt.x = 0;
- da2->bitblt.y++;
- da2->bitblt.destaddr += 130;
- // da2->bitblt.destaddr += da2->bitblt.destpitch + 2;
- // da2->bitblt.srcaddr += -1;
- } else if (da2->bitblt.x == 0) {
- DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.maskl, da2);
- da2->bitblt.x++;
- // da2->bitblt.x++;
+ // pclog("scr %x dest %x x %x y %x\n", da2->bitblt.srcaddr, da2->bitblt.destaddr, da2->bitblt.x, da2->bitblt.y);
+ if (da2->bitblt.y >= da2->bitblt.size_y) {
+ da2->bitblt.exec = DA2_BLT_CDONE;
} else {
- DA2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.destaddr, 0xffff, da2);
- da2->bitblt.x++;
- // da2->bitblt.x++;
+ da2_PutcharWithBitmask(da2->bitblt.srcaddr, da2->bitblt.size_x, da2->bitblt.fcolor, da2->bitblt.y, da2->bitblt.destaddr, da2->bitblt.maskl, da2->bitblt.maskr, da2);
}
- // da2->bitblt.destaddr = da2->bitblt.reg[0x29] + da2->bitblt.x + da2->bitblt.y * 130 + 2;
- ////da2->bitblt.srcaddr += 2;
- // da2->bitblt.srcaddr = da2->bitblt.reg[0x12] * 72 + (da2->bitblt.x * 2 ) + (da2->bitblt.y * 3) + 2;
+ da2->bitblt.y++;
+ da2->bitblt.destaddr += da2->bitblt.size_x * 2 + da2->bitblt.destpitch + 2;
break;
case DA2_BLT_CDONE:
- if (!(da2->bitblt.reg[0x20] & 0x20)) {
- /* initialize regs and set magic value for debug dump */
- for (int i = 0; i < DA2_BLT_REGSIZE; i++) {
- if (da2->bitblt.reg[i] != DA2_DEBUG_BLT_NEVERUSED)
- da2->bitblt.reg[i] = DA2_DEBUG_BLT_USEDRESET;
- }
- } else /* without init regs */
- da2->bitblt.reg[0x20] = 0; /* need to stop execution */
- if (da2->bitblt.indata)
- da2->bitblt.exec = DA2_BLT_CLOAD;
- else
- da2->bitblt.exec = DA2_BLT_CIDLE;
+ // if (!(da2->bitblt.reg[0x20] & 0x20)) {
+ // /* initialize regs and set magic value for debug dump */
+ // for (int i = 0; i < DA2_BLT_REGSIZE; i++) {
+ // if (da2->bitblt.reg[i] != DA2_DEBUG_BLT_NEVERUSED)
+ // da2->bitblt.reg[i] = DA2_DEBUG_BLT_USEDRESET;
+ // }
+ // } else /* without init regs */
+ // if (da2->bitblt.indata)
+ // da2->bitblt.exec = DA2_BLT_CLOAD;
+ // else
+ da2->bitblt.exec = DA2_BLT_CIDLE;
break;
}
}
@@ -1099,13 +1172,54 @@ da2_bitblt_dopayload(void *priv)
if (da2->bitblt.exec != DA2_BLT_CIDLE) {
while (da2->bitblt.exec != DA2_BLT_CIDLE) /* this disables async operation */
da2_bitblt_exec(da2);
- } else if (da2->bitblt.indata && !(da2->ioctl[LS_MMIO] & 0x10) && (da2->bitblt.exec == DA2_BLT_CIDLE)) {
+ } else if ((da2->bitblt.reg[0x20] & 0x01) && (da2->bitblt.exec == DA2_BLT_CIDLE)) {
da2->bitblt.exec = DA2_BLT_CLOAD;
da2_bitblt_exec(da2);
} else {
// timer_disable(&da2->bitblt.timer);
}
}
+static void
+da2_bitblt_addpayload(uint8_t val, void *p)
+{
+ da2_t *da2 = (da2_t *) p;
+ da2->bitblt.indata = 1;
+ if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE)
+ da2_log("da2_mmio_write payload overflow! addr %x, val %x\n", da2->bitblt.payload_addr, val);
+ else {
+ if (da2->bitblt.payload_addr == 0) {
+ da2->bitblt.payload[da2->bitblt.payload_addr] = val;
+ da2->bitblt.payload_addr++;
+ switch (val) {
+ case 0x88:
+ case 0x89:
+ case 0x95:
+ da2->bitblt.payload_opsize = 3;
+ break;
+ case 0x91:
+ da2->bitblt.payload_opsize = 5;
+ break;
+ case 0x99:
+ da2->bitblt.payload_opsize = 7;
+ break;
+ case 0xa1:
+ da2->bitblt.payload_opsize = 9;
+ break;
+ default:
+ da2_log("addpayload: Unknown PreOP! %x\n", val);
+ da2->bitblt.payload_addr = 0; /* ignore input */
+ break;
+ }
+ } else if (da2->bitblt.payload_addr < da2->bitblt.payload_opsize) {
+ da2->bitblt.payload[da2->bitblt.payload_addr] = val;
+ da2->bitblt.payload_addr++;
+ } else if (da2->bitblt.payload_addr == da2->bitblt.payload_opsize) {
+ da2->bitblt.payload[da2->bitblt.payload_addr] = val;
+ da2->bitblt.payload_opsize = 0; /* reset */
+ da2_bitblt_parse(da2);
+ }
+ }
+}
static void
da2_out(uint16_t addr, uint16_t val, void *p)
@@ -1192,6 +1306,10 @@ da2_out(uint16_t addr, uint16_t val, void *p)
da2->fctl[da2->fctladdr] = val;
if (da2->fctladdr == 0 && oldval != val) {
da2_iolog("DA2 Out FCTL addr %03X idx %02X val %02X %04X:%04X\n", addr, da2->fctladdr, val, cs >> 4, cpu_state.pc);
+ } else if ((da2->fctladdr == LF_PD_RESET) && ((val & 0x7) == 7)) {
+ /* Reset Bitblt busy */
+ da2->bitblt.indata = 0;
+ da2->bitblt.exec = DA2_BLT_CIDLE;
}
break;
case LC_INDEX:
@@ -1212,12 +1330,6 @@ da2_out(uint16_t addr, uint16_t val, void *p)
if (!(da2->ioctl[LS_MODE] & 0x01)) /* 16 or 256 color graphics mode */
val = 0;
break;
- case LC_START_ADDRESS_HIGH:
- case LC_START_ADDRESS_LOW:
- /* The DOS J4.0 MODE 4 command and OS/2 driver write 0xFF00.
- OS/2 DOS MODE 1 setup reads this to set the base line, but it causes the screen glitch. */
- val = 0;
- break;
case LC_VERTICAL_TOTALJ: /* Vertical Total */
case LC_VERTICAL_SYNC_START: /* Vertical Retrace Start Register */
case LC_V_DISPLAY_ENABLE_END: /* Vertical Display End Register */
@@ -1226,24 +1338,43 @@ da2_out(uint16_t addr, uint16_t val, void *p)
val = 0x400; /* for debugging bitblt in Win 3.x */
#endif
break;
- case LC_VIEWPORT_SELECT: /* ViewPort Select? */
- // return;
- break;
- case LC_VIEWPORT_NUMBER: /* Compatibility? */
- break;
}
da2->crtc[da2->crtcaddr] = val;
+ switch (da2->crtcaddr) {
+ // case LC_START_ADDRESS_HIGH:
+ // case LC_START_ADDRESS_LOW:
+ /* The DOS J4.0 MODE 4 command and OS/2 driver write 0xFF00.
+ OS/2 DOS MODE 1 setup reads this to set the base line, but it causes the screen glitch. */
+ // outb(0x680, da2->crtc[LC_START_ADDRESS_LOW]);
+ // outb(0x680, da2->crtc[LC_START_ADDRESS_HIGH]);
+ // break;
+ case LC_VIEWPORT_SELECT:
+ /* backup some current crtc regs */
+ for (int i = LC_START_ADDRESS_HIGH; i <= LC_START_ADDRESS_LOW; i++) {
+ da2->crtc_vpreg[(da2->crtc_vpsel * 0x20) + i] = da2->crtc[i];
+ }
+ da2->crtc_vpsel = (val >> 6) & 3;
+ /* restore crtc regs */
+ for (int i = LC_START_ADDRESS_HIGH; i <= LC_START_ADDRESS_LOW; i++) {
+ da2->crtc[i] = da2->crtc_vpreg[(da2->crtc_vpsel * 0x20) + i];
+ }
+ break;
+ default:
+ break;
+ }
switch (da2->crtcaddr) {
case LC_H_DISPLAY_ENABLE_END:
case LC_VERTICAL_TOTALJ:
case LC_MAXIMUM_SCAN_LINE:
- // case LC_START_ADDRESS_HIGH:
- // case LC_START_ADDRESS_LOW:
+ case LC_START_ADDRESS_HIGH:
+ case LC_START_ADDRESS_LOW:
case LC_VERTICAL_SYNC_START:
case LC_V_DISPLAY_ENABLE_END:
case LC_START_VERTICAL_BLANK:
+ case LC_LINE_COMPAREJ:
case LC_START_H_DISPLAY_ENAB:
case LC_START_V_DISPLAY_ENAB:
+ case LC_VIEWPORT_SELECT:
case LC_VIEWPORT_PRIORITY:
da2->fullchange = changeframecount;
da2_recalctimings(da2);
@@ -1255,7 +1386,6 @@ da2_out(uint16_t addr, uint16_t val, void *p)
case LV_PORT:
// da2_iolog("DA2 Out addr %03X val %02X ff %d %04X:%04X\n", addr, val, da2->attrff,cs >> 4, cpu_state.pc);
if (!da2->attrff) {
- // da2->attraddr = val & 31;
da2->attraddr = val & 0x3f;
if ((val & 0x20) != (da2->attr_palette_enable & 0x20)) {
da2->fullchange = 3;
@@ -1423,15 +1553,9 @@ da2_in(uint16_t addr, void *p)
// if (da2->bitblt.indata) /* for OS/2 J1.3 command prompt scrolling */
// da2_bitblt_dopayload(da2);
if (da2->bitblt.exec != DA2_BLT_CIDLE) {
- // da2_iolog("exec:%x\n", da2->bitblt.exec);
- temp |= 0x01; /* wait (bit 3 + bit 0) ? need verify */
- // if (!da2->bitblt.timer.enabled)
- //{
- // da2_iolog("bitblt timer restarted!! %04X:%04X\n", cs >> 4, cpu_state.pc);
- // timer_advance_u64(&da2->bitblt.timer, da2->bitblt.timerspeed);
- // }
+ temp |= 0x09; /* wait (bit 3 + bit 0) ? need verify */
}
- if (da2->bitblt.indata) temp |= 0x08;
+ // if (da2->bitblt.indata) temp |= 0x08;
#ifdef ENABLE_DA2_DEBUGMONWAIT
da2_iolog("DA2 In %04X(%02X) %04X %04X:%04X\n", addr, da2->ioctladdr, temp, cs >> 4, cpu_state.pc);
#endif
@@ -1463,6 +1587,10 @@ da2_in(uint16_t addr, void *p)
da2->cgastat &= ~0x30;
else
da2->cgastat ^= 0x30; /* toggle */
+ if (da2->cgastat & 0x08)
+ da2->cgastat &= ~0x08;
+ else
+ da2->cgastat ^= 0x08; /* toggle */
temp = da2->cgastat;
} else
temp = da2->attrc[da2->attraddr];
@@ -1495,7 +1623,7 @@ static void
da2_outb(uint16_t addr, uint8_t val, void *p)
{
da2_t *da2 = (da2_t *) p;
- // da2_iolog("DA2 Outb addr %03X val %02X %04X:%04X es:di=%x:%x ds:si=%x:%x\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI);
+ da2_iolog("DA2 Outb addr %03X val %02X %04X:%04X es:di=%x:%x ds:si=%x:%x\n", addr, val, cs >> 4, cpu_state.pc, ES, DI, DS, SI);
da2->inflipflop = 0;
switch (addr) {
case LS_DATA:
@@ -1546,9 +1674,6 @@ da2_outw(uint16_t addr, uint16_t val, void *p)
break;
case 0x3EC:
// da2_iolog("DA2 Outw addr %03X val %04X %04X:%04X\n", addr, val, cs >> 4, cpu_state.pc);
- da2_iolog(" ");
- // val = rightRotate(val, 8);
- // da2_out(LG_DATA, val, da2);
da2_out(LG_DATA, val >> 8, da2);
/* reset masks for compatibility with Win 3.1 solitaire */
if (da2->gdcaddr == LG_MODE) {
@@ -1976,9 +2101,9 @@ da2_render_textm3(da2_t *da2)
int chr_wide = 0;
// da2_log("\nda2ma: %x, da2sc: %x\n", da2->ma, da2->sc);
for (x = 0; x < da2->hdisp; x += 13) {
- chr = DA2_vram_r(DA2_VM03_BASECHR + da2->ma, da2);
- attr = DA2_vram_r(DA2_VM03_BASECHR + da2->ma + 1, da2);
- extattr = DA2_vram_r(DA2_VM03_BASEEXATTR + da2->ma + 1, da2);
+ chr = da2_vram_r(DA2_VM03_BASECHR + da2->ma, da2);
+ attr = da2_vram_r(DA2_VM03_BASECHR + da2->ma + 1, da2);
+ extattr = da2_vram_r(DA2_VM03_BASEEXATTR + da2->ma + 1, da2);
// if(chr!=0x20) da2_log("addr: %x, chr: %x, attr: %x ", (DA2_VM03_BASECHR + da2->ma << 1) & da2->vram_mask, chr, attr);
bg = attr >> 4;
// if (da2->blink) bg &= ~0x8;
@@ -1996,7 +2121,7 @@ da2_render_textm3(da2_t *da2)
/* Stay drawing if the char code is DBCS and not at last column. */
if (chr_wide) {
/* Get high DBCS code from the next video address */
- chr_dbcs = DA2_vram_r(DA2_VM03_BASECHR + da2->ma + 2, da2);
+ chr_dbcs = da2_vram_r(DA2_VM03_BASECHR + da2->ma + 2, da2);
chr_dbcs <<= 8;
chr_dbcs |= chr;
/* Get the font pattern */
@@ -2194,17 +2319,11 @@ da2_recalctimings(da2_t *da2)
double crtcconst;
double _dispontime, _dispofftime, disptime;
- /* if output disabled or VGA passthrough */
- if (da2->ioctl[LS_MODE] & 0x02 || !(da2->attrc[LV_COMPATIBILITY] & 0x08)) {
- da2->render = da2_render_blank;
- return;
- }
-
da2->vtotal = da2->crtc[LC_VERTICAL_TOTALJ] & 0xfff;
da2->dispend = da2->crtc[LC_V_DISPLAY_ENABLE_END] & 0xfff;
da2->vsyncstart = da2->crtc[LC_VERTICAL_SYNC_START] & 0xfff;
da2->split = da2->crtc[LC_LINE_COMPAREJ] & 0xfff;
- da2->split = 0xfff;
+ da2->split -= 1;
da2->vblankstart = da2->crtc[LC_START_VERTICAL_BLANK] & 0xfff;
da2->hdisp = da2->crtc[LC_H_DISPLAY_ENABLE_END];
@@ -2220,21 +2339,29 @@ da2_recalctimings(da2_t *da2)
da2->clock = da2->da2const;
- // da2->lowres = da2->attrc[LV_MODE_CONTROL] & 0x40;
+ if (da2->vtotal == 0)
+ da2->vtotal = da2->vsyncstart = da2->vblankstart = 256;
+ if (da2->htotal == 0)
+ da2->htotal = da2->dispend = da2->hdisp = 64;
+ if (da2->rowoffset == 0)
+ da2->rowoffset = 64 * 2; /* To avoid causing a DBZ error */
+ if (da2->split == 0) /* To avoid a glitch in MODE 1 of OS/2 J1.3 DOSBox. */
+ da2->ma_latch = 0;
+ else
+ da2->ma_latch = ((da2->crtc[LC_START_ADDRESS_HIGH] & 0x3ff) << 8) | da2->crtc[LC_START_ADDRESS_LOW];
- // da2->interlace = 0;
-
- // da2->ma_latch = ((da2->crtc[LC_START_ADDRESS_HIGH] & 0x3ff) << 8) | da2->crtc[LC_START_ADDRESS_LOW];//w + b
da2->ca_adj = 0;
-
da2->rowcount = da2->crtc[LC_MAXIMUM_SCAN_LINE];
-
da2->hdisp_time = da2->hdisp;
da2->render = da2_render_blank;
/* determine display mode */
// if (da2->attr_palette_enable && (da2->attrc[0x1f] & 0x08))
+ /* if output disabled or VGA passthrough */
+ if (da2->ioctl[LS_MODE] & 0x02 || !(da2->attrc[LV_COMPATIBILITY] & 0x08)) {
+ da2->render = da2_render_blank;
+ // return;
/* 16 color graphics mode */
- if (!(da2->ioctl[LS_MODE] & 0x01)) {
+ } else if (!(da2->ioctl[LS_MODE] & 0x01)) {
da2->hdisp *= 16;
da2->char_width = 13;
if (da2->crtc[LC_VIEWPORT_PRIORITY] & 0x80) {
@@ -2260,15 +2387,6 @@ da2_recalctimings(da2_t *da2)
da2->hdisp *= 13;
da2->char_width = 13;
}
- // if (!da2->scrblank && da2->attr_palette_enable)
- //{
- // da2->render = da2_draw_text;
- //}
-
- // da2_log("da2_render %08X : %08X %08X %08X %08X %08X %i %i %02X %i %i\n", da2_render, da2_render_text_40, da2_render_text_80, da2_render_8bpp_lowres, da2_render_8bpp_highres, da2_render_blank, scrblank,gdcreg[6]&1,gdcreg[5]&0x60,bpp,seqregs[1]&8);
-
- // if (da2->recalctimings_ex)
- // da2->recalctimings_ex(da2);
if (da2->vblankstart < da2->dispend)
da2->dispend = da2->vblankstart;
@@ -2279,7 +2397,7 @@ da2_recalctimings(da2_t *da2)
_dispontime = da2->hdisp_time;
da2_log("Disptime %f dispontime %f hdisp %i\n", disptime, _dispontime, da2->hdisp);
- // if (da2->seqregs[1] & 8) { disptime *= 2; _dispontime *= 2; }
+
_dispofftime = disptime - _dispontime;
_dispontime *= crtcconst;
_dispofftime *= crtcconst;
@@ -2293,7 +2411,7 @@ da2_recalctimings(da2_t *da2)
da2_log("da2 horiz total %i display end %i vidclock %f\n", da2->crtc[0], da2->crtc[1], da2->clock);
da2_log("da2 vert total %i display end %i max row %i vsync %i\n",da2->vtotal,da2->dispend,(da2->crtc[9]&31)+1,da2->vsyncstart);
da2_log("da2 dispon %lu dispoff %lu on(us) %f off(us) %f\n",da2->dispontime, da2->dispofftime, (double)da2->dispontime / (double)cpuclock / (double) (1ULL << 32) * 1000000.0, (double)da2->dispofftime / (double)cpuclock / (double) (1ULL << 32) * 1000000.0);
- // da2_log("da2->render %08X\n", da2->render);
+ da2_log("da2 linecompare %d\n", da2->split);
}
static void
@@ -2374,19 +2492,19 @@ da2_gdcropB(uint32_t addr,uint8_t bitmask, da2_t *da2)
case 0: /*Set*/
// da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) | (da2->gdcsrc[i] & ~bitmask);
// da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) | (da2->vram[addr | i] & ~bitmask);
- DA2_vram_w(addr | i, (da2->gdcinput[i] & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
+ da2_vram_w(addr | i, (da2->gdcinput[i] & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
break;
case 1: /*AND*/
// da2->vram[addr | i] = (da2->gdcinput[i] | ~bitmask) & da2->gdcsrc[i];
- DA2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
+ da2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
break;
case 2: /*OR*/
// da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) | da2->gdcsrc[i];
- DA2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
+ da2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
break;
case 3: /*XOR*/
// da2->vram[addr | i] = (da2->gdcinput[i] & bitmask) ^ da2->gdcsrc[i];
- DA2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
+ da2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask) | (da2->vram[addr | i] & ~bitmask), da2);
break;
}
}
@@ -2396,8 +2514,8 @@ da2_gdcropB(uint32_t addr,uint8_t bitmask, da2_t *da2)
static void
da2_gdcropW(uint32_t addr, uint16_t bitmask, da2_t *da2)
{
- if((addr & 8) && !(da2->gdcreg[LG_COMMAND] & 0x08)) bitmask = rightRotate(bitmask, 8);
- // if((addr & 8)) bitmask = rightRotate(bitmask, 8);
+ if((addr & 8) && !(da2->gdcreg[LG_COMMAND] & 0x08)) bitmask = da2_rightrotate(bitmask, 8);
+ // if((addr & 8)) bitmask = da2_rightrotate(bitmask, 8);
uint8_t bitmask_l = bitmask & 0xff;
uint8_t bitmask_h = bitmask >> 8;
for (int i = 0; i < 8; i++) {
@@ -2407,29 +2525,29 @@ da2_gdcropW(uint32_t addr, uint16_t bitmask, da2_t *da2)
case 0: /*Set*/
// da2->vram[addr | i] = (da2->gdcinput[i] & bitmask_l) | (da2->gdcsrc[i] & ~bitmask_l);
// da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) & bitmask_h) | ((da2->gdcsrc[i] >> 8) & ~bitmask_h);
- DA2_vram_w(addr | i, (da2->gdcinput[i] & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
- DA2_vram_w((addr + 8) | i, ((da2->gdcinput[i] >> 8) & bitmask_h)
+ da2_vram_w(addr | i, (da2->gdcinput[i] & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
+ da2_vram_w((addr + 8) | i, ((da2->gdcinput[i] >> 8) & bitmask_h)
| (da2->vram[(addr + 8) | i] & ~bitmask_h), da2);
break;
case 1: /*AND*/
// da2->vram[addr | i] = (da2->gdcinput[i] | ~bitmask_l) & da2->gdcsrc[i];
// da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) | ~bitmask_h) & (da2->gdcsrc[i] >> 8);
- DA2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
- DA2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) & (da2->gdcsrc[i] >> 8)) & bitmask_h)
+ da2_vram_w(addr | i, ((da2->gdcinput[i] & da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
+ da2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) & (da2->gdcsrc[i] >> 8)) & bitmask_h)
| (da2->vram[(addr + 8) | i] & ~bitmask_h), da2);
break;
case 2: /*OR*/
// da2->vram[addr | i] = (da2->gdcinput[i] & bitmask_l) | da2->gdcsrc[i];
// da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) & bitmask_h) | (da2->gdcsrc[i] >> 8);
- DA2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
- DA2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) | (da2->gdcsrc[i] >> 8)) & bitmask_h)
+ da2_vram_w(addr | i, ((da2->gdcinput[i] | da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
+ da2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) | (da2->gdcsrc[i] >> 8)) & bitmask_h)
| (da2->vram[(addr + 8) | i] & ~bitmask_h), da2);
break;
case 3: /*XOR*/
// da2->vram[addr | i] = (da2->gdcinput[i] & bitmask_l) ^ da2->gdcsrc[i];
// da2->vram[(addr + 8) | i] = ((da2->gdcinput[i] >> 8) & bitmask_h) ^ (da2->gdcsrc[i] >> 8);
- DA2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
- DA2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) ^ (da2->gdcsrc[i] >> 8)) & bitmask_h)
+ da2_vram_w(addr | i, ((da2->gdcinput[i] ^ da2->gdcsrc[i]) & bitmask_l) | (da2->vram[addr | i] & ~bitmask_l), da2);
+ da2_vram_w((addr + 8) | i, (((da2->gdcinput[i] >> 8) ^ (da2->gdcsrc[i] >> 8)) & bitmask_h)
| (da2->vram[(addr + 8) | i] & ~bitmask_h), da2);
break;
}
@@ -2441,6 +2559,7 @@ static uint8_t
da2_mmio_read(uint32_t addr, void *p)
{
da2_t *da2 = (da2_t *) p;
+ uint32_t index = 0;
addr &= DA2_MASK_MMIO;
if (da2->ioctl[LS_MMIO] & 0x10) {
if (da2->fctl[LF_MMIO_SEL] == 0x80)
@@ -2448,14 +2567,14 @@ da2_mmio_read(uint32_t addr, void *p)
addr |= ((uint32_t) da2->fctl[LF_MMIO_ADDR] << 17);
else {
/* 64k bank switch access */
- uint32_t index = da2->fctl[LF_MMIO_MODE] & 0x0f;
+ index = da2->fctl[LF_MMIO_MODE] & 0x0f;
index <<= 8;
index |= da2->fctl[LF_MMIO_ADDR];
- addr += index * 0x40;
}
// da2_log("PS55_MemHnd: Read from mem %x, bank %x, addr %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr);
switch (da2->fctl[LF_MMIO_MODE] & 0xf0) {
case 0xb0: /* Gaiji RAM */
+ addr += index * 0x80;
addr &= DA2_MASK_GAIJIRAM; /* safety access */
// da2_log("PS55_MemHnd_G: Read from mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 128, addr, da2->mmio.font[addr]);
return da2->mmio.ram[addr];
@@ -2473,7 +2592,13 @@ da2_mmio_read(uint32_t addr, void *p)
// da2_log("PS55_MemHnd: Read from mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 72, addr, da2->mmio.font[addr]);
return da2->mmio.font[addr];
break;
+ case 0x00: /* SBCS in Gaiji RAM (used in the downward writing mode of DOS/V Extension) */
+ addr += DA2_GAIJIRAM_SBCS + index * 0x40;
+ addr &= DA2_MASK_GAIJIRAM;
+ return da2->mmio.ram[addr];
+ break;
default:
+ da2_log("PS55_MemHnd: Invalid read mem %x, bank %x, chr %x (%x), val %x\n", da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr / 72, addr, da2->mmio.font[addr]);
return DA2_INVALIDACCESS8; /* invalid memory access */
break;
}
@@ -2548,52 +2673,46 @@ da2_mmio_readw(uint32_t addr, void *p)
return (uint16_t) da2_mmio_read(addr, da2) | (uint16_t) (da2_mmio_read(addr + 1, da2) << 8);
}
}
-
static void
da2_mmio_write(uint32_t addr, uint8_t val, void *p)
{
da2_t *da2 = (da2_t *) p;
+ uint32_t index = 0;
// da2_log("da2_mmio_write %x %x\n", addr, val);
// if ((addr & ~DA2_MASK_MMIO) != 0xA0000)
// return;
addr &= DA2_MASK_MMIO;
- if (da2->ioctl[LS_MMIO] & 0x10) {
+ if (da2->ioctl[LS_MMIO] == 0x1f) {/* write bitblt fifo data */
+ da2_bitblt_addpayload(val, da2);
+ }
+ else if (da2->ioctl[LS_MMIO] & 0x10) { /* access to gaiji ram */
// if(da2->ioctl[LS_MMIO] == 0x1f) da2_log("mw mem %x, addr %x, val %x, ESDI %x:%x DSSI %x:%x\n", da2->fctl[LF_MMIO_MODE], addr, val, ES, DI, DS, SI);
/* Gaiji RAM */
if (da2->fctl[LF_MMIO_SEL] == 0x80)
addr |= ((uint32_t) da2->fctl[LF_MMIO_ADDR] << 17); /* xxxy yyyy yyyy yyyy yyyy */
- else {
- uint32_t index = da2->fctl[LF_MMIO_MODE] & 0x0f;
+ else {
+ index = da2->fctl[LF_MMIO_MODE] & 0x0f;
index <<= 8;
index |= da2->fctl[LF_MMIO_ADDR];
- addr += index * 0x40;
+ // da2_log("da2_mmio_w io %x, sl %x, 09 %x, ad %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO],da2->fctl[LF_MMIO_SEL],
+ // da2->fctl[LF_MMIO_09],da2->fctl[LF_MMIO_ADDR], da2->fctl[LF_MMIO_MODE], addr, val);
}
- switch (da2->fctl[LF_MMIO_MODE]) {
- case 0xb0: /* Gaiji RAM 1011 0000 */
+ switch (da2->fctl[LF_MMIO_MODE] & 0xf0) {
+ case 0xb0: /* Gaiji RAM 1011 0000 */
+ addr += index * 0x80;
da2->mmio.ram[addr & DA2_MASK_GAIJIRAM] = val;
break;
case 0x10: /* Font ROM 0001 0000 */
/* Read-Only */
break;
- case 0x00:
+ case 0x00: /* SBCS in Gaiji RAM (used by DOS/V Extension DSPXDA2 driver) */
+ addr += index * 0x40;
+ da2->mmio.ram[(DA2_GAIJIRAM_SBCS + addr) & DA2_MASK_GAIJIRAM] = val;
// da2_log("da2_mmio_write %x %x %04X:%04X\n", addr, val, CS, cpu_state.pc);
- // addr &= 0x7f;/* OS/2 write addr 1cf80-1cfc3, val xx */
- // if (addr >= DA2_BLT_MEMSIZE)
- //{
- // da2_log("da2_mmio_write failed mem %x, addr %x, val %x\n", da2->fctl[LF_MMIO_MODE], addr, val);
- // return;
- // }
- da2->bitblt.indata = 1;
- if (da2->bitblt.payload_addr >= DA2_BLT_MEMSIZE)
- da2_log("da2_mmio_write payload overflow! mem %x, addr %x, val %x\n", da2->fctl[LF_MMIO_MODE], addr, val);
- else {
- da2->bitblt.payload[da2->bitblt.payload_addr] = val;
- da2->bitblt.payload_addr++;
- }
break;
default:
- da2_log("da2_mmio_write failed mem %x, addr %x, val %x\n", da2->fctl[LF_MMIO_MODE], addr, val);
+ da2_log("da2_mmio_write failed io %x, mm %x, addr %x, val %x\n", da2->ioctl[LS_MMIO] ,da2->fctl[LF_MMIO_MODE], addr, val);
break;
}
} else if (!(da2->ioctl[LS_MODE] & 1)) { /* 16 color or 256 color mode */
@@ -2654,7 +2773,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
case 2: /* equiv to vga write mode 1 */
for (int i = 0; i < 8; i++)
if (da2->planemask & (1 << i))
- DA2_vram_w(addr | i, da2->gdcsrc[i], da2);
+ da2_vram_w(addr | i, da2->gdcsrc[i], da2);
break;
case 0:/* equiv to vga write mode 0 */
if (da2->gdcreg[LG_DATA_ROTATION] & 7)
@@ -2662,7 +2781,7 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
if (bitmask == 0xff && !(da2->gdcreg[LG_COMMAND] & 0x03) && (!da2->gdcreg[LG_ENABLE_SRJ])) {
for (int i = 0; i < 8; i++)
if (da2->planemask & (1 << i))
- DA2_vram_w(addr | i, val, da2);
+ da2_vram_w(addr | i, val, da2);
} else {
for (int i = 0; i < 8; i++)
if (da2->gdcreg[LG_ENABLE_SRJ] & (1 << i))
@@ -2689,12 +2808,12 @@ da2_mmio_write(uint32_t addr, uint8_t val, void *p)
}
} else { /* mode 3h text */
cycles -= video_timing_write_b;
- DA2_vram_w(addr, val, da2);
+ da2_vram_w(addr, val, da2);
da2->fullchange = 2;
}
}
static uint16_t
-rightRotate(uint16_t data, uint8_t count)
+da2_rightrotate(uint16_t data, uint8_t count)
{
return (data >> count) | (data << (sizeof(data) * 8 - count));
}
@@ -2752,18 +2871,18 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
case 2:
for (int i = 0; i < 8; i++)
if (da2->planemask & (1 << i)) {
- DA2_vram_w(addr | i, da2->gdcsrc[i] & 0xff, da2);
- DA2_vram_w((addr + 8) | i, da2->gdcsrc[i] >> 8, da2);
+ da2_vram_w(addr | i, da2->gdcsrc[i] & 0xff, da2);
+ da2_vram_w((addr + 8) | i, da2->gdcsrc[i] >> 8, da2);
}
break;
case 0:
if (da2->gdcreg[LG_DATA_ROTATION] & 15)
- val = rightRotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15);
+ val = da2_rightrotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15);
if (bitmask == 0xffff && !(da2->gdcreg[LG_COMMAND] & 0x03) && (!da2->gdcreg[LG_ENABLE_SRJ])) {
for (int i = 0; i < 8; i++)
if (da2->planemask & (1 << i)) {
- DA2_vram_w(addr | i, val & 0xff, da2);
- DA2_vram_w((addr + 8) | i, val >> 8, da2);
+ da2_vram_w(addr | i, val & 0xff, da2);
+ da2_vram_w((addr + 8) | i, val >> 8, da2);
}
} else {
for (int i = 0; i < 8; i++)
@@ -2782,7 +2901,7 @@ da2_mmio_gc_writeW(uint32_t addr, uint16_t val, void *p)
break;
case 3:
if (da2->gdcreg[LG_DATA_ROTATION] & 15)
- val = rightRotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15);
+ val = da2_rightrotate(val, da2->gdcreg[LG_DATA_ROTATION] & 15);
bitmask &= val;
for (int i = 0; i < 8; i++)
@@ -2801,15 +2920,21 @@ da2_mmio_writew(uint32_t addr, uint16_t val, void *p)
// return;
// if ((addr & ~0x1ffff) != 0xA0000) return;
if (da2->ioctl[LS_MMIO] & 0x10) {
- // da2_log("da2_mmio_writeW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val);
+#ifdef ENABLE_DA2_DEBUGVRAM
+ da2_log("da2_mmio_writeW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val);
+#endif
da2_mmio_write(addr, val & 0xff, da2);
da2_mmio_write(addr + 1, val >> 8, da2);
} else if (!(da2->ioctl[LS_MODE] & 1)) { /* 16 color or 256 color mode */
- // da2_log("da2_mmio_writeGW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val);
+#ifdef ENABLE_DA2_DEBUGVRAM
+ da2_log("da2_mmio_writeGW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val);
+#endif
da2_mmio_gc_writeW(addr, val, da2);
} else { /* mode 3h text */
+#ifdef ENABLE_DA2_DEBUGVRAM
// if (addr & 0xff00 == 0) da2_log("da2_mmio_write %x %x %04X:%04X\n", addr, val, CS, cpu_state.pc);
- // da2_log("da2_mmio_writeGW %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val);
+ da2_log("da2_mmio_write3W %x %x %x %x %x %x\n", da2->ioctl[LS_MMIO], da2->fctl[LF_MMIO_SEL], da2->fctl[LF_MMIO_MODE], da2->fctl[LF_MMIO_ADDR], addr, val);
+#endif
da2_mmio_write(addr, val & 0xff, da2);
da2_mmio_write(addr + 1, val >> 8, da2);
}
@@ -2835,7 +2960,7 @@ da2_code_writeb(uint32_t addr, uint8_t val, void *p)
static void
da2_code_writew(uint32_t addr, uint16_t val, void *p)
{
- // da2_log("DA2_code_writew: Write to %x, val %x\n", addr, val);
+ // da2_log("DA2_code_writ ew: Write to %x, val %x\n", addr, val);
da2_t *da2 = (da2_t *) p;
cycles -= video_timing_write_w;
da2_code_write(addr, val & 0xff, da2);
@@ -2915,8 +3040,6 @@ da2_poll(void *priv)
// da2_log("%03i %06X %06X\n", da2->displine, da2->ma,da2->vram_display_mask);
da2->displine++;
- // if (da2->interlace)
- // da2->displine++;
if ((da2->cgastat & 8) && ((da2->displine & 0xf) == (da2->crtc[LC_VERTICAL_SYNC_END] & 0xf)) && da2->vslines) {
// da2_log("Vsync off at line %i\n",displine);
da2->cgastat &= ~8;
@@ -2930,7 +3053,6 @@ da2_poll(void *priv)
// da2_log("VC %i ma %05X\n", da2->vc, da2->ma);
timer_advance_u64(&da2->timer, da2->dispontime);
- // if (output) printf("Display on %f\n",vidtime);
if (da2->dispon)
da2->cgastat &= ~1;
da2->hdisp_on = 0;
@@ -2944,8 +3066,6 @@ da2_poll(void *priv)
da2->sc = 0;
da2->maback += (da2->rowoffset << 1); /* color = 0x50(80), mono = 0x40(64) */
- if (da2->interlace)
- da2->maback += (da2->rowoffset << 1);
da2->maback &= da2->vram_display_mask;
da2->ma = da2->maback;
} else {
@@ -2958,6 +3078,13 @@ da2_poll(void *priv)
da2->vc++;
da2->vc &= 2047;
+ if (da2->vc == da2->split) {
+ // da2->ma = da2->maback = da2->hblank_sub;
+ da2->ma = da2->maback = 0;
+ da2->sc = 0;
+ // da2->displine = 0;
+ }
+
if (da2->vc == da2->dispend) {
da2->dispon = 0;
// if (da2->crtc[10] & 0x20) da2->cursoron = 0;
@@ -3001,13 +3128,11 @@ da2_poll(void *priv)
da2->firstline_draw = 2000;
da2->lastline_draw = 0;
- da2->oddeven ^= 1;
-
- changeframecount = da2->interlace ? 3 : 2;
+ changeframecount = 2;
da2->vslines = 0;
da2->ma
- = da2->maback = da2->ma_latch;
+ = da2->maback = da2->ma_latch << 1;
da2->ca = ((da2->crtc[LC_CURSOR_LOC_HIGH] << 8) | da2->crtc[LC_CURSOR_LOC_LOWJ]) + da2->ca_adj;
da2->ca <<= 1;
@@ -3019,7 +3144,7 @@ da2_poll(void *priv)
da2->vc = 0;
da2->sc = da2->crtc[LC_PRESET_ROW_SCANJ] & 0x1f;
da2->dispon = 1;
- da2->displine = (da2->interlace && da2->oddeven) ? 1 : 0;
+ da2->displine = 0;
da2->scrollcache = da2->attrc[LV_PANNING] & 7;
}
if (da2->sc == (da2->crtc[LC_CURSOR_ROW_START] & 31))
@@ -3110,7 +3235,6 @@ da2_reset(void *priv)
da2->crtc[LC_HORIZONTAL_TOTAL] = 63; /* Horizontal Total */
da2->crtc[LC_VERTICAL_TOTALJ] = 255; /* Vertical Total (These two must be set before the timer starts.) */
da2->ma_latch = 0;
- da2->interlace = 0;
da2->attrc[LV_CURSOR_CONTROL] = 0x13; /* cursor options */
da2->attr_palette_enable = 0; /* disable attribute generator */
@@ -3242,8 +3366,18 @@ da2_close(void *p)
fprintf(f, "3eb(gcr) %02X: %4X\n", i, da2->gdcreg[i]);
for (int i = 0; i < 0x10; i++)
fprintf(f, "3ee(?) %02X: %4X\n", i, da2->reg3ee[i]);
+ for (int i = 0; i < 0x20; i++) {
+ fprintf(f, "vp %02X: %4X %4X %4X %4X\n", i,
+ da2->crtc_vpreg[0 + i], da2->crtc_vpreg[0x20 + i], da2->crtc_vpreg[0x40 + i], da2->crtc_vpreg[0x60 + i]);
+ }
fclose(f);
}
+ f = fopen("ram_low.dmp", "wb");
+ if (f != NULL) {
+ fwrite(&ram[0x0], 0x100000, 1, f);
+ fclose(f);
+ }
+ pclog("closed %04X:%04X DS %04X\n", cs >> 4, cpu_state.pc, DS);
#endif
#ifdef ENABLE_DA2_DEBUGBLT
f = fopen("da2_bltdump.csv", "w");
@@ -3261,8 +3395,16 @@ da2_close(void *p)
;
else if (da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y] == DA2_DEBUG_BLT_USEDRESET)
fprintf(f, "\"\"\t");
- else
+ else {
fprintf(f, "\"%X\"\t", da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + y]);
+ if (y == 0x12) {
+ int chr = da2->bitblt.debug_reg[x * DA2_DEBUG_BLTLOG_SIZE + 0x12];
+ if ((chr >= 0x20) && (chr < 0x7f))
+ fprintf(f, "\"%c\"\t", chr);
+ else
+ fprintf(f, "\"\"\t");
+ }
+ }
}
fprintf(f, "\n");
}
diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c
index a44838d68..d0189e0f7 100644
--- a/src/video/vid_svga.c
+++ b/src/video/vid_svga.c
@@ -904,7 +904,7 @@ svga_recalctimings(svga_t *svga)
svga->recalctimings_ex(svga);
if (ibm8514_active && (svga->dev8514 != NULL)) {
- if ((dev->local & 0xff) == 0x00)
+ if (IBM_8514A || ATI_8514A_ULTRA)
ibm8514_recalctimings(svga);
}
@@ -1031,8 +1031,8 @@ svga_recalctimings(svga_t *svga)
if (ibm8514_active && (svga->dev8514 != NULL)) {
if (dev->on) {
disptime8514 = dev->h_total;
- _dispontime8514 = (dev->hdisped + 1) * 8;
- svga_log("HDISPED 8514=%d, htotal=%02x.\n", (dev->hdisped + 1) << 3, dev->h_total);
+ _dispontime8514 = dev->h_disp;
+ svga_log("HTOTAL=%d, HDISP=%d.\n", dev->h_total, dev->h_disp);
}
}
@@ -1176,10 +1176,7 @@ svga_do_render(svga_t *svga)
}
if (!svga->override) {
- if (svga->render_override)
- svga->render_override(svga->priv_parent);
- else
- svga->render(svga);
+ svga->render(svga);
svga->x_add = (svga->monitor->mon_overscan_x >> 1);
svga_render_overscan_left(svga);
diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c
index c05d308fa..d47697a7e 100644
--- a/src/video/vid_svga_render.c
+++ b/src/video/vid_svga_render.c
@@ -85,18 +85,9 @@ svga_render_blank(svga_t *svga)
break;
}
-#if 0
- pclog("svga->displine = %i, svga->y_add = %i, svga->x_add = %i\n", svga->displine, svga->y_add, svga->x_add);
-#endif
uint32_t *line_ptr = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add];
-#if 0
- pclog("svga->hdisp = %i, svga->scrollcache = %i, char_width = %i, sizeof(uint32_t) = %i\n", svga->hdisp, svga->scrollcache, char_width, sizeof(uint32_t));
-#endif
uint32_t line_width = (uint32_t) (svga->hdisp + svga->scrollcache) * char_width * sizeof(uint32_t);
-#if 0
- pclog("line_width = %i\n", line_width);
-#endif
if ((svga->hdisp + svga->scrollcache) > 0)
memset(line_ptr, 0, line_width);
}
@@ -147,6 +138,11 @@ svga_render_text_40(svga_t *svga)
int bg;
uint32_t addr = 0;
+ if (svga->render_override) {
+ svga->render_override(svga->priv_parent);
+ return;
+ }
+
if ((svga->displine + svga->y_add) < 0)
return;
@@ -225,6 +221,11 @@ svga_render_text_80(svga_t *svga)
int bg;
uint32_t addr = 0;
+ if (svga->render_override) {
+ svga->render_override(svga->priv_parent);
+ return;
+ }
+
if ((svga->displine + svga->y_add) < 0)
return;
diff --git a/src/video/vid_table.c b/src/video/vid_table.c
index b90d7c3e4..36573e9f9 100644
--- a/src/video/vid_table.c
+++ b/src/video/vid_table.c
@@ -195,6 +195,7 @@ video_cards[] = {
{ .device = &tgui9680_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_banshee_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &creative_voodoo_banshee_device, .flags = VIDEO_FLAG_TYPE_NONE },
+ { .device = &quantum3d_raven_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_3_1000_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_3_2000_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_3_3000_device, .flags = VIDEO_FLAG_TYPE_NONE },
diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c
index 3727ccf8e..1381a95f7 100644
--- a/src/video/vid_voodoo_banshee.c
+++ b/src/video/vid_voodoo_banshee.c
@@ -52,6 +52,7 @@
#define ROM_BANSHEE "roms/video/voodoo/Pci_sg.rom"
#define ROM_CREATIVE_BANSHEE "roms/video/voodoo/BlasterPCI.rom"
+#define ROM_QUANTUM3D_RAVEN "roms/video/voodoo/RVPD0224.rom"
#define ROM_VOODOO3_1000 "roms/video/voodoo/1k11sg.rom"
#define ROM_VOODOO3_2000 "roms/video/voodoo/2k11sd.rom"
#define ROM_VOODOO3_3000 "roms/video/voodoo/3k12sd.rom"
@@ -78,6 +79,7 @@ static uint8_t vb_filter_bx_g[256][256];
enum {
TYPE_BANSHEE = 0,
+ TYPE_QUANTUM3D_RAVEN,
TYPE_V3_1000,
TYPE_V3_2000,
TYPE_V3_3000,
@@ -3374,6 +3376,16 @@ banshee_init_common(const device_t *info, char *fn, int has_sgram, int type, int
}
break;
+ case TYPE_QUANTUM3D_RAVEN:
+ /* This case basically exists only to set the subsystem ID correctly for SF: Rush, a vendor-locked game. */
+ /* We set the type back to TYPE_BANSHEE so the card behaves as a regular Banshee (no 3D glasses emulation). */
+ banshee->pci_regs[0x2c] = 0x9c;
+ banshee->pci_regs[0x2d] = 0x13;
+ banshee->pci_regs[0x2e] = banshee->agp ? 0x16 : 0x17;
+ banshee->pci_regs[0x2f] = 0x00;
+ banshee->type = TYPE_BANSHEE;
+ break;
+
case TYPE_V3_1000:
banshee->pci_regs[0x2c] = 0x1a;
banshee->pci_regs[0x2d] = 0x12;
@@ -3451,6 +3463,12 @@ creative_banshee_init(const device_t *info)
return banshee_init_common(info, ROM_CREATIVE_BANSHEE, 0, TYPE_BANSHEE, VOODOO_BANSHEE, 0);
}
+static void *
+quantum3d_raven_init(const device_t *info)
+{
+ return banshee_init_common(info, ROM_QUANTUM3D_RAVEN, 0, TYPE_QUANTUM3D_RAVEN, VOODOO_BANSHEE, 0);
+}
+
static void *
v3_1000_init(const device_t *info)
{
@@ -3547,6 +3565,12 @@ creative_banshee_available(void)
return rom_present(ROM_CREATIVE_BANSHEE);
}
+static int
+quantum3d_raven_available(void)
+{
+ return rom_present(ROM_QUANTUM3D_RAVEN);
+}
+
static int
v3_1000_available(void)
{
@@ -3883,6 +3907,20 @@ const device_t creative_voodoo_banshee_device = {
.config = banshee_sdram_config
};
+const device_t quantum3d_raven_device = {
+ .name = "Quantum3D Raven",
+ .internal_name = "q3d_raven_pci",
+ .flags = DEVICE_PCI,
+ .local = 0,
+ .init = quantum3d_raven_init,
+ .close = banshee_close,
+ .reset = NULL,
+ .available = quantum3d_raven_available,
+ .speed_changed = banshee_speed_changed,
+ .force_redraw = banshee_force_redraw,
+ .config = banshee_sdram_config
+};
+
const device_t voodoo_3_1000_device = {
.name = "3dfx Voodoo3 1000",
.internal_name = "voodoo3_1k_pci",